utim-cli 1.46.32__tar.gz → 1.46.34__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-1.46.32 → utim_cli-1.46.34}/CHANGELOG.md +22 -4
- {utim_cli-1.46.32/utim_cli.egg-info → utim_cli-1.46.34}/PKG-INFO +1 -1
- {utim_cli-1.46.32 → utim_cli-1.46.34}/pyproject.toml +1 -1
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/__init__.py +1 -1
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/_version.py +1 -1
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/config.py +34 -46
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/orchestrator.py +159 -340
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/model_dialog.py +20 -5
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/utim.py +33 -13
- {utim_cli-1.46.32 → utim_cli-1.46.34/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-1.46.32 → utim_cli-1.46.34}/LICENSE +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/MANIFEST.in +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/README.md +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/setup.cfg +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/setup.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/agent.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/auth.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/backup.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/blender_agent.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/bootstrap.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/client_utils.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/constants.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/context_pruner.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/doctor.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/local_db.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/logger.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/mcp_client.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/reflection.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/report.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/__init__.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/auth.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/db.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/email_utils.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/exchange_rate.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/firebase.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/history.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/models.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/pricing_updater.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/router.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/auth_routes.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/completion_routes.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/feedback_routes.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/quota_routes.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/server/server.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/share.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/share_tui.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/state.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tools.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/feedback_dialog.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/history_dialog.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/mcp_dialog.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/resume_dialog.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/tools_dialog.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/tui/update_dialog.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/utilities.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/vector_memory.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli/workspace.py +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli.egg-info/SOURCES.txt +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli.egg-info/requires.txt +0 -0
- {utim_cli-1.46.32 → utim_cli-1.46.34}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -2,7 +2,28 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the UTIM CLI Agent will be documented in this file.
|
|
4
4
|
|
|
5
|
-
## [1.46.
|
|
5
|
+
## [1.46.34] - 2026-07-11
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Expanded Rotating Tips System**: Expanded the CLI helper system with 18 pre-written tips covering shortcut keybinds, proxy configuration, model switching, and chat management. Updated rotation logic to advance the tip every 3 requests rather than on every turn to prevent rapid text cycling.
|
|
9
|
+
- **Strict Disabled Tools Directives**: Rewrote system prompt directives to inject a hard "zero tools available" warning when all tools are turned off, prompting the agent to correctly answer "I currently don't have any tools".
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- **Silent Tool Call Blocking**: Fixed tool execution dispatch to silently deny disabled tools to the user (instead of displaying console warning panels) while quietly returning a reject instruction to the model.
|
|
13
|
+
- **Zero-Bypass MCP Execution Guard**: Extended the orchestrator's disabled tools validator to cover MCP sessions and custom tool routes before any early return execution paths can be taken.
|
|
14
|
+
|
|
15
|
+
## [1.46.33] - 2026-07-11
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
- **Global User-Agent Shielding**: Upgraded request session patches to inject browser-like User-Agents (`Chrome/120.0.0.0`) on all outbound HTTP calls, bypassing proxy and WAF rate-limiting.
|
|
19
|
+
- **Added /sslverify command**: Integrated a local slash command `/sslverify` to toggle SSL verification directly from the CLI input prompt without needing to edit config files manually.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **BYOK & Custom Model Wizard Input Lag**: Fixed a bug where prompt inputs (e.g. entering provider number or API key) were buffered/hidden during the wizard flows. Decoupled input prompt streams in `_safe_prompt` by writing directly to `sys.__stdout__` and reading from `sys.__stdin__` to bypass `prompt_toolkit` interceptors.
|
|
23
|
+
- **Improved API Auth Error Feedback**: Added specialized HTTPError handlers in the BYOK model discovery flow to catch 401 (Unauthorized) and 403 (Forbidden) response codes and print clear, actionable explanations instead of generic request tracebacks.
|
|
24
|
+
- **Website GitHub Link Removal**: Removed GitHub project URLs, core repository connection cards, and community links from the landing pages and pricing documents.
|
|
25
|
+
|
|
26
|
+
## [1.46.31] - 2026-07-11
|
|
6
27
|
|
|
7
28
|
### Added
|
|
8
29
|
- **Dynamic Console Glyph Fallbacks**: Detected legacy Windows terminals (where `WT_SESSION` is not set) and automatically fell back to standard ASCII symbols (`>` and `->`) instead of unicode characters (`❯`, `▶`, and `➔`) to prevent `⍰` or empty box rendering issues.
|
|
@@ -13,9 +34,6 @@ All notable changes to the UTIM CLI Agent will be documented in this file.
|
|
|
13
34
|
- **Global Config Null-Safety Improvements**: Fixed multiple potential crashes across the tools dialog, share manager, and usage dashboard when keys like `disabled_tools`, `mcpServers`, `role`, or `user_plan` are missing or set to `null` in config files.
|
|
14
35
|
- **Server Upload Limit & Connection Resets**: Increased the `/shares/upload` workspace file sharing size limit from 4MB to 25MB on the server. Added stream consumption middleware handlers to prevent connection termination resets and `SSLEOFError` crashes on the client during larger uploads.
|
|
15
36
|
- **Modern prompt_toolkit Style Crash**: Fixed a crash (`ValueError: Wrong color format 'dim'`) on lists with scrolling indicators (like the model dialog or history dialog) when run on newer versions of `prompt_toolkit` (3.0.40+) by correcting the shorthand styling `'dim fg:#f9e2af'` to `'class:dim fg:#f9e2af'`.
|
|
16
|
-
- **User-Agent Shielding & HTTP 429 Proxy Blocks**: Patched the global requests Session initializer to spoof a standard browser User-Agent, preventing corporate firewalls/proxies from blocking or rate-limiting requests. Added HTML-stripping parser helpers to the orchestrator to extract and display readable error details directly inside the offline connection panels if a proxy returns an HTTP 429.
|
|
17
|
-
- **Added /sslverify command**: Integrated a local slash command `/sslverify` to toggle SSL verification directly from the CLI input prompt without needing to edit config files manually.
|
|
18
|
-
- **Automated SSL Verification Fallback**: Implemented an automated, silent self-healing retry mechanism inside the requests wrapper. If UTIM encounters an SSL validation failure (commonly caused by decrypting proxies/firewalls in corporate or local networks), it automatically suppresses warnings, updates the config file to persist `"verify_ssl": false`, and retries the connection silently in the background with SSL verification disabled, preventing any service interruption without displaying warning messages to the user.
|
|
19
37
|
|
|
20
38
|
## [1.46.29] - 2026-07-11
|
|
21
39
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "utim-cli"
|
|
7
|
-
version = "1.46.
|
|
7
|
+
version = "1.46.34"
|
|
8
8
|
description = "UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -22,62 +22,50 @@ class Config:
|
|
|
22
22
|
self._global_data: Dict[str, Any] = {}
|
|
23
23
|
self._local_data: Dict[str, Any] = {}
|
|
24
24
|
self._load()
|
|
25
|
-
# Always inject a browser User-Agent to prevent firewalls/proxies blocking default python-requests
|
|
25
|
+
# Always inject a browser User-Agent to prevent firewalls/proxies blocking default python-requests.
|
|
26
|
+
# We patch Session.request (not __init__) so it applies to ALL sessions regardless of when
|
|
27
|
+
# they were created, and even when callers pass their own headers dict (the UA is merged in
|
|
28
|
+
# without overwriting any caller-supplied headers that may already have a User-Agent set).
|
|
26
29
|
try:
|
|
27
|
-
import requests
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
import requests as _req_mod
|
|
31
|
+
_BROWSER_UA = (
|
|
32
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
|
|
33
|
+
"AppleWebKit/537.36 (KHTML, like Gecko) "
|
|
34
|
+
"Chrome/120.0.0.0 Safari/537.36"
|
|
35
|
+
)
|
|
36
|
+
_original_request = _req_mod.Session.request
|
|
37
|
+
|
|
38
|
+
def _ua_patched_request(self, method, url, *args, **kwargs):
|
|
39
|
+
# Merge headers so we never overwrite a caller-supplied User-Agent
|
|
40
|
+
hdrs = kwargs.pop("headers", None) or {}
|
|
41
|
+
if isinstance(hdrs, dict):
|
|
42
|
+
hdrs = dict(hdrs)
|
|
43
|
+
else:
|
|
44
|
+
hdrs = dict(hdrs)
|
|
45
|
+
hdrs.setdefault("User-Agent", _BROWSER_UA)
|
|
46
|
+
kwargs["headers"] = hdrs
|
|
47
|
+
return _original_request(self, method, url, *args, **kwargs)
|
|
48
|
+
|
|
49
|
+
_req_mod.Session.request = _ua_patched_request
|
|
35
50
|
except Exception:
|
|
36
51
|
pass
|
|
37
52
|
|
|
38
|
-
#
|
|
39
|
-
try:
|
|
40
|
-
import requests
|
|
41
|
-
original_request = requests.Session.request
|
|
42
|
-
def new_request(self_session, method, url, *args, **kwargs):
|
|
43
|
-
# If verify_ssl is explicitly False, always disable verification
|
|
44
|
-
if not self.verify_ssl:
|
|
45
|
-
kwargs['verify'] = False
|
|
46
|
-
return original_request(self_session, method, url, *args, **kwargs)
|
|
47
|
-
|
|
48
|
-
try:
|
|
49
|
-
return original_request(self_session, method, url, *args, **kwargs)
|
|
50
|
-
except Exception as exc:
|
|
51
|
-
is_ssl_err = False
|
|
52
|
-
err_str = str(exc).lower()
|
|
53
|
-
if "ssl" in err_str and ("cert" in err_str or "verify" in err_str or "untrusted" in err_str or "authority" in err_str):
|
|
54
|
-
is_ssl_err = True
|
|
55
|
-
|
|
56
|
-
if is_ssl_err:
|
|
57
|
-
try:
|
|
58
|
-
import urllib3
|
|
59
|
-
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
60
|
-
except Exception:
|
|
61
|
-
pass
|
|
62
|
-
try:
|
|
63
|
-
self.set("verify_ssl", False)
|
|
64
|
-
except Exception:
|
|
65
|
-
pass
|
|
66
|
-
kwargs['verify'] = False
|
|
67
|
-
return original_request(self_session, method, url, *args, **kwargs)
|
|
68
|
-
raise exc
|
|
69
|
-
|
|
70
|
-
requests.Session.request = new_request
|
|
71
|
-
except Exception:
|
|
72
|
-
pass
|
|
73
|
-
|
|
74
|
-
# Suppress warnings if SSL verification is disabled
|
|
53
|
+
# Suppress warnings and patch requests if SSL verification is disabled
|
|
75
54
|
if not self.verify_ssl:
|
|
76
55
|
try:
|
|
77
56
|
import urllib3
|
|
78
57
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
79
58
|
except Exception:
|
|
80
59
|
pass
|
|
60
|
+
try:
|
|
61
|
+
import requests as _req_mod2
|
|
62
|
+
_original_request2 = _req_mod2.Session.request
|
|
63
|
+
def _ssl_patched_request(self, method, url, *args, **kwargs):
|
|
64
|
+
kwargs.setdefault('verify', False)
|
|
65
|
+
return _original_request2(self, method, url, *args, **kwargs)
|
|
66
|
+
_req_mod2.Session.request = _ssl_patched_request
|
|
67
|
+
except Exception:
|
|
68
|
+
pass
|
|
81
69
|
|
|
82
70
|
def _load(self):
|
|
83
71
|
# Load global config
|