utim-cli 1.45.9__tar.gz → 1.46.2__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.45.9/utim_cli.egg-info → utim_cli-1.46.2}/PKG-INFO +1 -1
- {utim_cli-1.45.9 → utim_cli-1.46.2}/pyproject.toml +1 -1
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/auth.py +32 -15
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/utim.py +3 -3
- {utim_cli-1.45.9 → utim_cli-1.46.2/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-1.45.9 → utim_cli-1.46.2}/CHANGELOG.md +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/LICENSE +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/MANIFEST.in +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/README.md +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/setup.cfg +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/setup.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/__init__.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/agent.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/backup.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/blender_agent.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/bootstrap.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/client_utils.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/config.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/constants.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/context_pruner.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/doctor.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/logger.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/mcp_client.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/orchestrator.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/reflection.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/report.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/__init__.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/auth.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/db.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/email_utils.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/firebase.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/history.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/models.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/router.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/routes/auth_routes.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/routes/completion_routes.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/routes/quota_routes.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/server/server.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/share.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/share_tui.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/state.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tools.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tui/history_dialog.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tui/mcp_dialog.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tui/model_dialog.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tui/resume_dialog.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tui/tools_dialog.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/tui/update_dialog.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/vector_memory.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli/workspace.py +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli.egg-info/SOURCES.txt +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli.egg-info/requires.txt +0 -0
- {utim_cli-1.45.9 → utim_cli-1.46.2}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "utim-cli"
|
|
7
|
-
version = "1.
|
|
7
|
+
version = "1.46.2"
|
|
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"
|
|
@@ -92,11 +92,24 @@ def login() -> None:
|
|
|
92
92
|
"""
|
|
93
93
|
Sign in by prompting the user to copy their UTIM API key from the web dashboard.
|
|
94
94
|
"""
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
95
|
+
# Sleep briefly to ensure prompt_toolkit's terminal-suspension/clearing sequences
|
|
96
|
+
# are fully processed by the terminal emulator before we print.
|
|
97
|
+
import time
|
|
98
|
+
time.sleep(0.3)
|
|
99
|
+
|
|
100
|
+
# ANSI escape codes for formatting
|
|
101
|
+
PURPLE = "\033[1;35m"
|
|
102
|
+
BLUE = "\033[1;34m"
|
|
103
|
+
YELLOW = "\033[1;33m"
|
|
104
|
+
WHITE = "\033[1;37m"
|
|
105
|
+
RESET = "\033[0m"
|
|
106
|
+
DIM = "\033[2m"
|
|
107
|
+
|
|
108
|
+
print(f"\n {PURPLE}UTIM CLI Sign-In{RESET}")
|
|
109
|
+
print(" 1. Visit the UTIM Profile page in your browser:")
|
|
110
|
+
print(f" {BLUE}{WEB_URL}/profile{RESET}")
|
|
111
|
+
print(f" 2. Copy your {WHITE}UTIM API Key{RESET}.")
|
|
112
|
+
print(" 3. Paste the key below to log in.\n")
|
|
100
113
|
|
|
101
114
|
import sys
|
|
102
115
|
sys.stdout.flush()
|
|
@@ -107,14 +120,17 @@ def login() -> None:
|
|
|
107
120
|
try:
|
|
108
121
|
api_key = input(" Enter UTIM API Key (or press Enter to cancel): ").strip()
|
|
109
122
|
except (EOFError, KeyboardInterrupt):
|
|
110
|
-
|
|
123
|
+
print("\n \033[1;33mCancelled.\033[0m\n")
|
|
124
|
+
sys.stdout.flush()
|
|
111
125
|
return
|
|
112
126
|
|
|
113
127
|
if not api_key:
|
|
114
|
-
|
|
128
|
+
print("\n \033[1;33mCancelled.\033[0m\n")
|
|
129
|
+
sys.stdout.flush()
|
|
115
130
|
return
|
|
116
131
|
|
|
117
|
-
|
|
132
|
+
print(f" {DIM}Verifying with UTIM server…{RESET}")
|
|
133
|
+
sys.stdout.flush()
|
|
118
134
|
try:
|
|
119
135
|
resp = requests.get(
|
|
120
136
|
f"{SERVER_URL}/auth/me",
|
|
@@ -122,11 +138,13 @@ def login() -> None:
|
|
|
122
138
|
timeout=15,
|
|
123
139
|
)
|
|
124
140
|
if resp.status_code != 200:
|
|
125
|
-
|
|
141
|
+
print(f" \033[1;31m✗ Invalid API Key or server error (HTTP {resp.status_code}).\033[0m\n")
|
|
142
|
+
sys.stdout.flush()
|
|
126
143
|
return
|
|
127
144
|
payload = resp.json()
|
|
128
145
|
except Exception as exc:
|
|
129
|
-
|
|
146
|
+
print(f" \033[1;31m✗ Verification failed: {exc}\033[0m\n")
|
|
147
|
+
sys.stdout.flush()
|
|
130
148
|
return
|
|
131
149
|
|
|
132
150
|
# Persist credentials
|
|
@@ -136,11 +154,10 @@ def login() -> None:
|
|
|
136
154
|
config.set("name", payload.get("display_name") or payload["email"].split("@")[0])
|
|
137
155
|
config.set("api_key", api_key)
|
|
138
156
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
)
|
|
157
|
+
print(f" {YELLOW}✓ Welcome back!{RESET}\n")
|
|
158
|
+
print(f" Signed in as {BLUE}{payload['email']}{RESET}\n")
|
|
159
|
+
print(f" Credits: {payload['credits']:,.0f} UTIM\n")
|
|
160
|
+
sys.stdout.flush()
|
|
144
161
|
|
|
145
162
|
|
|
146
163
|
# ── HTML templates ────────────────────────────────────────────────────────────
|
|
@@ -585,7 +585,7 @@ def _print_animated_banner():
|
|
|
585
585
|
# Speed up for spaces to make it feel more like typing
|
|
586
586
|
time.sleep(0.002 if char == " " else 0.005)
|
|
587
587
|
|
|
588
|
-
console.print(f"\n [bold white]U Think I Make[/bold white] [dim]v1.
|
|
588
|
+
console.print(f"\n [bold white]U Think I Make[/bold white] [dim]v1.46.2[/dim]")
|
|
589
589
|
user_email = config.email
|
|
590
590
|
user_type = "UTIM Community"
|
|
591
591
|
api_key = config.get("api_key")
|
|
@@ -2691,7 +2691,7 @@ def check_and_update_background():
|
|
|
2691
2691
|
return
|
|
2692
2692
|
|
|
2693
2693
|
latest_ver = resp.json().get("version", "")
|
|
2694
|
-
current_ver = "1.
|
|
2694
|
+
current_ver = "1.46.2"
|
|
2695
2695
|
|
|
2696
2696
|
def parse_ver(v):
|
|
2697
2697
|
return [int(x) for x in v.split(".") if x.isdigit()]
|
|
@@ -2887,7 +2887,7 @@ app = typer.Typer()
|
|
|
2887
2887
|
def version_callback(value: bool):
|
|
2888
2888
|
if value:
|
|
2889
2889
|
import typer
|
|
2890
|
-
print("U Think I Make v1.
|
|
2890
|
+
print("U Think I Make v1.46.2")
|
|
2891
2891
|
raise typer.Exit()
|
|
2892
2892
|
|
|
2893
2893
|
@app.callback(invoke_without_command=True)
|
|
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
|