utim-cli 1.46.34__tar.gz → 1.46.35__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.34 → utim_cli-1.46.35}/CHANGELOG.md +8 -0
- {utim_cli-1.46.34/utim_cli.egg-info → utim_cli-1.46.35}/PKG-INFO +1 -1
- {utim_cli-1.46.34 → utim_cli-1.46.35}/pyproject.toml +1 -1
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/__init__.py +1 -1
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/_version.py +1 -1
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/agent.py +3 -3
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/config.py +63 -16
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/utim.py +20 -14
- {utim_cli-1.46.34 → utim_cli-1.46.35/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-1.46.34 → utim_cli-1.46.35}/LICENSE +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/MANIFEST.in +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/README.md +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/setup.cfg +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/setup.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/auth.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/backup.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/blender_agent.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/bootstrap.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/client_utils.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/constants.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/context_pruner.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/doctor.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/local_db.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/logger.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/mcp_client.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/orchestrator.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/reflection.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/report.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/__init__.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/auth.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/db.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/email_utils.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/exchange_rate.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/firebase.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/history.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/models.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/pricing_updater.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/router.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/auth_routes.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/completion_routes.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/feedback_routes.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/quota_routes.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/server/server.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/share.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/share_tui.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/state.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tools.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/feedback_dialog.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/history_dialog.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/mcp_dialog.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/model_dialog.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/resume_dialog.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/tools_dialog.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/tui/update_dialog.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/utilities.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/vector_memory.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli/workspace.py +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli.egg-info/SOURCES.txt +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli.egg-info/requires.txt +0 -0
- {utim_cli-1.46.34 → utim_cli-1.46.35}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the UTIM CLI Agent will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.46.35] - 2026-07-11
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Instant SSL Verification Toggle**: Upgraded the `/sslverify` session patcher to dynamically apply and remove the `verify=False` wrapper live on the running `requests.Session` class, eliminating the need to restart the CLI when toggling proxy security.
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
- **CLI Tips Correctness**: Refined all CLI and ReAct Agent usage tips to only feature verified, public commands and actual hotkeys, removing any references to internal or hidden commands.
|
|
12
|
+
|
|
5
13
|
## [1.46.34] - 2026-07-11
|
|
6
14
|
|
|
7
15
|
### Added
|
|
@@ -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.35"
|
|
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"
|
|
@@ -31,11 +31,11 @@ TOOL_META = {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
TIPS = [
|
|
34
|
-
"Tip:
|
|
34
|
+
"Tip: Use /help to see all available commands and the help panel",
|
|
35
35
|
"Tip: Save your current conversation with /resume save <tag>",
|
|
36
36
|
"Tip: Clear conversation history with /clear",
|
|
37
|
-
"Tip: Check your credit
|
|
38
|
-
"Tip:
|
|
37
|
+
"Tip: Check your quota limits and credit usage with /usage",
|
|
38
|
+
"Tip: Enable or disable individual tools with /tools",
|
|
39
39
|
"Tip: Switch models with /model",
|
|
40
40
|
]
|
|
41
41
|
|
|
@@ -7,6 +7,48 @@ from typing import Any, Dict, Optional
|
|
|
7
7
|
|
|
8
8
|
logger = logging.getLogger("utim.config")
|
|
9
9
|
|
|
10
|
+
# ── SSL session patch ─────────────────────────────────────────────────────────
|
|
11
|
+
# Keeps a reference to the true original so toggling works correctly in both
|
|
12
|
+
# directions without chaining patches on top of each other.
|
|
13
|
+
_ORIGINAL_SESSION_REQUEST = None
|
|
14
|
+
_SSL_PATCH_ACTIVE = False
|
|
15
|
+
|
|
16
|
+
def _apply_ssl_session_patch(disable: bool) -> None:
|
|
17
|
+
"""Apply or remove the verify=False monkey-patch on requests.Session.request.
|
|
18
|
+
|
|
19
|
+
Safe to call multiple times. Does nothing when the requested state already
|
|
20
|
+
matches the current state.
|
|
21
|
+
"""
|
|
22
|
+
global _ORIGINAL_SESSION_REQUEST, _SSL_PATCH_ACTIVE
|
|
23
|
+
try:
|
|
24
|
+
import requests as _req_mod
|
|
25
|
+
import urllib3
|
|
26
|
+
|
|
27
|
+
# Capture the true original exactly once.
|
|
28
|
+
if _ORIGINAL_SESSION_REQUEST is None:
|
|
29
|
+
_ORIGINAL_SESSION_REQUEST = _req_mod.Session.request
|
|
30
|
+
|
|
31
|
+
if disable and not _SSL_PATCH_ACTIVE:
|
|
32
|
+
# Suppress noisy InsecureRequestWarning lines.
|
|
33
|
+
try:
|
|
34
|
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
35
|
+
except Exception:
|
|
36
|
+
pass
|
|
37
|
+
_orig = _ORIGINAL_SESSION_REQUEST
|
|
38
|
+
def _ssl_off(self, method, url, *args, **kwargs):
|
|
39
|
+
kwargs.setdefault('verify', False)
|
|
40
|
+
return _orig(self, method, url, *args, **kwargs)
|
|
41
|
+
_req_mod.Session.request = _ssl_off
|
|
42
|
+
_SSL_PATCH_ACTIVE = True
|
|
43
|
+
|
|
44
|
+
elif not disable and _SSL_PATCH_ACTIVE:
|
|
45
|
+
# Restore the true original so verify defaults to True again.
|
|
46
|
+
_req_mod.Session.request = _ORIGINAL_SESSION_REQUEST
|
|
47
|
+
_SSL_PATCH_ACTIVE = False
|
|
48
|
+
|
|
49
|
+
except Exception:
|
|
50
|
+
pass
|
|
51
|
+
|
|
10
52
|
class Config:
|
|
11
53
|
def __init__(self):
|
|
12
54
|
import sys
|
|
@@ -44,28 +86,33 @@ class Config:
|
|
|
44
86
|
hdrs = dict(hdrs)
|
|
45
87
|
hdrs.setdefault("User-Agent", _BROWSER_UA)
|
|
46
88
|
kwargs["headers"] = hdrs
|
|
89
|
+
|
|
90
|
+
primary_host = "api.utim.dev"
|
|
91
|
+
fallback_host = "utim-cli-production.up.railway.app"
|
|
92
|
+
|
|
93
|
+
if primary_host in url:
|
|
94
|
+
try:
|
|
95
|
+
return _original_request(self, method, url, *args, **kwargs)
|
|
96
|
+
except _req_mod.exceptions.RequestException as e:
|
|
97
|
+
fallback_url = url.replace(primary_host, fallback_host)
|
|
98
|
+
logger.warning(f"Connection to {primary_host} failed, trying fallback {fallback_host}: {e}")
|
|
99
|
+
return _original_request(self, method, fallback_url, *args, **kwargs)
|
|
100
|
+
elif fallback_host in url:
|
|
101
|
+
try:
|
|
102
|
+
return _original_request(self, method, url, *args, **kwargs)
|
|
103
|
+
except _req_mod.exceptions.RequestException as e:
|
|
104
|
+
fallback_url = url.replace(fallback_host, primary_host)
|
|
105
|
+
logger.warning(f"Connection to {fallback_host} failed, trying fallback {primary_host}: {e}")
|
|
106
|
+
return _original_request(self, method, fallback_url, *args, **kwargs)
|
|
107
|
+
|
|
47
108
|
return _original_request(self, method, url, *args, **kwargs)
|
|
48
109
|
|
|
49
110
|
_req_mod.Session.request = _ua_patched_request
|
|
50
111
|
except Exception:
|
|
51
112
|
pass
|
|
52
113
|
|
|
53
|
-
#
|
|
54
|
-
|
|
55
|
-
try:
|
|
56
|
-
import urllib3
|
|
57
|
-
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
58
|
-
except Exception:
|
|
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
|
|
114
|
+
# Apply SSL patch immediately if already disabled in config.
|
|
115
|
+
_apply_ssl_session_patch(disable=not self.verify_ssl)
|
|
69
116
|
|
|
70
117
|
def _load(self):
|
|
71
118
|
# Load global config
|
|
@@ -632,24 +632,27 @@ from utim_cli.state import STATE
|
|
|
632
632
|
_tip_idx = 0
|
|
633
633
|
_tip_request_count = 0 # increments every request; tip advances every 3
|
|
634
634
|
_TIPS = [
|
|
635
|
-
"Tip:
|
|
636
|
-
"Tip:
|
|
635
|
+
"Tip: Use /help to see all available commands and the help panel",
|
|
636
|
+
"Tip: Press Ctrl+O to open a full-screen scrollable viewer of the last executed tool's inputs and outputs",
|
|
637
637
|
"Tip: Save your chat anytime with /resume save <tag> — restore it later with /resume load <tag>",
|
|
638
|
-
"Tip: Use /clear to wipe the conversation and start fresh without restarting",
|
|
639
|
-
"Tip: Enable or disable individual tools with /tools —
|
|
638
|
+
"Tip: Use /clear to wipe the conversation and start fresh without restarting the CLI",
|
|
639
|
+
"Tip: Enable or disable individual tools with /tools — customize the model's access",
|
|
640
640
|
"Tip: Press Ctrl+P to toggle between Planning Mode and Autonomous Mode",
|
|
641
641
|
"Tip: Press Shift+Tab to switch between auto-accept and manual review for file edits",
|
|
642
|
-
"Tip: Use /model to switch models mid-conversation — press 'a' to add a BYOK model",
|
|
643
|
-
"Tip: Check your
|
|
644
|
-
"Tip: Press Esc to cancel a running response mid-stream",
|
|
645
|
-
"Tip: Use /rewind to undo the last file change made by the model",
|
|
646
|
-
"Tip: Share your workspace
|
|
642
|
+
"Tip: Use /model to switch models mid-conversation — press 'a' to add a custom BYOK model",
|
|
643
|
+
"Tip: Check your quota limits and credit usage with /usage",
|
|
644
|
+
"Tip: Press Esc to cancel a running response or queue mid-stream",
|
|
645
|
+
"Tip: Use /rewind to undo the last file change made by the model and restore your code",
|
|
646
|
+
"Tip: Share your chat and a zip package of your workspace with a link using /share",
|
|
647
647
|
"Tip: Run /doctor to diagnose server connectivity and MCP issues",
|
|
648
648
|
"Tip: Paste multi-line code directly — UTIM handles large pastes automatically",
|
|
649
649
|
"Tip: Use /hint to inject a private instruction the model sees but you don't have to repeat",
|
|
650
650
|
"Tip: Connect external tools via MCP servers with /mcp",
|
|
651
|
-
"Tip:
|
|
651
|
+
"Tip: Rate the last response and submit feedback with /rate",
|
|
652
652
|
"Tip: Toggle SSL verification if behind a corporate proxy with /sslverify",
|
|
653
|
+
"Tip: Start a new conversation and clear the active screen with /new",
|
|
654
|
+
"Tip: Generate a redacted diagnostic support package for debugging with /report",
|
|
655
|
+
"Tip: Toggle automatic chat session state restoration on startup with /chatrestore",
|
|
653
656
|
]
|
|
654
657
|
|
|
655
658
|
def _next_tip():
|
|
@@ -880,7 +883,7 @@ def _print_animated_banner(animated: bool = True):
|
|
|
880
883
|
else:
|
|
881
884
|
console.print(f"[bold {color}]{BANNER_BIG}[/bold {color}]")
|
|
882
885
|
|
|
883
|
-
console.print(f" [bold white]U Think I Make[/bold white] [dim]v1.46.
|
|
886
|
+
console.print(f" [bold white]U Think I Make[/bold white] [dim]v1.46.35[/dim]")
|
|
884
887
|
user_email = config.email
|
|
885
888
|
user_type = "UTIM Community"
|
|
886
889
|
api_key = config.get("api_key")
|
|
@@ -1662,8 +1665,11 @@ def _handle_command(cmd: str, orchestrator: Orchestrator, app_ref) -> None:
|
|
|
1662
1665
|
current = config.get("verify_ssl", True)
|
|
1663
1666
|
new_val = not current
|
|
1664
1667
|
config.set("verify_ssl", new_val)
|
|
1665
|
-
|
|
1666
|
-
|
|
1668
|
+
# Apply the patch live — no restart needed.
|
|
1669
|
+
from utim_cli.config import _apply_ssl_session_patch
|
|
1670
|
+
_apply_ssl_session_patch(disable=not new_val)
|
|
1671
|
+
console.print(f"\n[bold green]✓ SSL certificate verification has been {'enabled' if new_val else 'disabled'}.[/bold green]")
|
|
1672
|
+
console.print("[dim]Change is effective immediately — no restart needed.[/dim]\n")
|
|
1667
1673
|
|
|
1668
1674
|
elif c == "rate":
|
|
1669
1675
|
from utim_cli.tui.feedback_dialog import _dialog_submit_feedback
|
|
@@ -3137,7 +3143,7 @@ def check_and_update_background():
|
|
|
3137
3143
|
return
|
|
3138
3144
|
|
|
3139
3145
|
latest_ver = resp.json().get("version", "")
|
|
3140
|
-
current_ver = "1.46.
|
|
3146
|
+
current_ver = "1.46.35"
|
|
3141
3147
|
|
|
3142
3148
|
def parse_ver(v):
|
|
3143
3149
|
return [int(x) for x in v.split(".") if x.isdigit()]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|