utim-cli 1.46.8__tar.gz → 1.46.10__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.8/utim_cli.egg-info → utim_cli-1.46.10}/PKG-INFO +1 -3
- {utim_cli-1.46.8 → utim_cli-1.46.10}/pyproject.toml +1 -3
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/auth.py +40 -9
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/utim.py +17 -4
- {utim_cli-1.46.8 → utim_cli-1.46.10/utim_cli.egg-info}/PKG-INFO +1 -3
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli.egg-info/requires.txt +0 -2
- {utim_cli-1.46.8 → utim_cli-1.46.10}/CHANGELOG.md +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/LICENSE +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/MANIFEST.in +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/README.md +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/setup.cfg +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/setup.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/__init__.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/agent.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/backup.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/blender_agent.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/bootstrap.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/client_utils.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/config.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/constants.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/context_pruner.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/doctor.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/local_db.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/logger.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/mcp_client.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/orchestrator.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/reflection.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/report.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/__init__.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/auth.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/db.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/email_utils.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/firebase.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/history.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/models.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/router.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/routes/auth_routes.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/routes/completion_routes.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/routes/quota_routes.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/server/server.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/share.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/share_tui.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/state.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tools.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tui/history_dialog.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tui/mcp_dialog.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tui/model_dialog.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tui/resume_dialog.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tui/tools_dialog.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/tui/update_dialog.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/vector_memory.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli/workspace.py +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli.egg-info/SOURCES.txt +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-1.46.8 → utim_cli-1.46.10}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: utim-cli
|
|
3
|
-
Version: 1.46.
|
|
3
|
+
Version: 1.46.10
|
|
4
4
|
Summary: UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal.
|
|
5
5
|
License: MIT
|
|
6
6
|
Project-URL: Homepage, https://utim.dev
|
|
@@ -32,8 +32,6 @@ Requires-Dist: rich>=13.0.0
|
|
|
32
32
|
Requires-Dist: prompt_toolkit>=3.0.0
|
|
33
33
|
Requires-Dist: mcp>=0.1.0
|
|
34
34
|
Requires-Dist: nest-asyncio>=1.5.0
|
|
35
|
-
Requires-Dist: python-multipart>=0.0.7
|
|
36
|
-
Requires-Dist: slowapi>=0.1.9
|
|
37
35
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
38
36
|
Provides-Extra: search
|
|
39
37
|
Requires-Dist: scrapy>=2.11.0; extra == "search"
|
|
@@ -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.10"
|
|
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"
|
|
@@ -34,8 +34,6 @@ dependencies = [
|
|
|
34
34
|
"prompt_toolkit>=3.0.0",
|
|
35
35
|
"mcp>=0.1.0",
|
|
36
36
|
"nest-asyncio>=1.5.0",
|
|
37
|
-
"python-multipart>=0.0.7",
|
|
38
|
-
"slowapi>=0.1.9",
|
|
39
37
|
"sqlalchemy>=2.0.0",
|
|
40
38
|
]
|
|
41
39
|
|
|
@@ -141,15 +141,46 @@ def login() -> None:
|
|
|
141
141
|
poll_interval = data.get("poll_interval", 3)
|
|
142
142
|
|
|
143
143
|
# Step 2 — show the user what to do
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
144
|
+
import os as _os
|
|
145
|
+
import subprocess as _sub
|
|
146
|
+
_is_termux = (
|
|
147
|
+
(_os.environ.get("PREFIX", "").find("com.termux") != -1) or
|
|
148
|
+
_os.path.exists("/data/data/com.termux")
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
if _is_termux:
|
|
152
|
+
# On Termux: opening a browser programmatically doesn't work.
|
|
153
|
+
# Instead, copy the link to clipboard and ask user to open it manually.
|
|
154
|
+
try:
|
|
155
|
+
_sub.run(
|
|
156
|
+
["termux-clipboard-set", verify_url],
|
|
157
|
+
timeout=3, check=False,
|
|
158
|
+
stdout=_sub.DEVNULL, stderr=_sub.DEVNULL,
|
|
159
|
+
)
|
|
160
|
+
clipboard_notice = f" {GREEN}✓ Sign-in link copied to clipboard!{RESET}"
|
|
161
|
+
except Exception:
|
|
162
|
+
clipboard_notice = f" {YELLOW}(Could not copy automatically — copy the link above manually){RESET}"
|
|
163
|
+
|
|
164
|
+
print(f"\n {BOLD}{'─' * 48}{RESET}")
|
|
165
|
+
print(f"\n {BOLD}UTIM Sign-In — Android / Termux{RESET}\n")
|
|
166
|
+
print(f" 1. Open your browser and paste this link:\n")
|
|
167
|
+
print(f" {BLUE}{verify_url}{RESET}\n")
|
|
168
|
+
print(f" 2. Or go to {BLUE}{WEB_URL}/activate{RESET}")
|
|
169
|
+
print(f" and enter this code:\n")
|
|
170
|
+
print(f" {YELLOW}{BOLD} {user_code} {RESET}\n")
|
|
171
|
+
print(clipboard_notice)
|
|
172
|
+
print(f"\n {DIM}Waiting for you to authorize… (expires in {expires_in // 60} min){RESET}\n")
|
|
173
|
+
print(f" {BOLD}{'─' * 48}{RESET}\n")
|
|
174
|
+
sys.stdout.flush()
|
|
175
|
+
else:
|
|
176
|
+
print(f"\n {BOLD}To sign in, visit:{RESET}")
|
|
177
|
+
print(f"\n {BLUE}{verify_url}{RESET}\n")
|
|
178
|
+
print(f" Or visit {BLUE}{WEB_URL}/activate{RESET} and enter code:")
|
|
179
|
+
print(f"\n {YELLOW}{BOLD}{user_code}{RESET}\n")
|
|
180
|
+
print(f" {DIM}Waiting for you to authorize in the browser… (expires in {expires_in // 60} minutes){RESET}\n")
|
|
181
|
+
sys.stdout.flush()
|
|
182
|
+
# Try to open the browser in background (desktop only)
|
|
183
|
+
threading.Thread(target=webbrowser.open, args=(verify_url,), daemon=True).start()
|
|
153
184
|
|
|
154
185
|
# Step 3 — poll in background thread, signal main thread via Event
|
|
155
186
|
result: dict = {}
|
|
@@ -596,7 +596,7 @@ def _print_animated_banner(animated: bool = True):
|
|
|
596
596
|
else:
|
|
597
597
|
console.print(f"[bold {color}]{BANNER_BIG}[/bold {color}]")
|
|
598
598
|
|
|
599
|
-
console.print(f" [bold white]U Think I Make[/bold white] [dim]v1.46.
|
|
599
|
+
console.print(f" [bold white]U Think I Make[/bold white] [dim]v1.46.10[/dim]")
|
|
600
600
|
user_email = config.email
|
|
601
601
|
user_type = "UTIM Community"
|
|
602
602
|
api_key = config.get("api_key")
|
|
@@ -1334,12 +1334,25 @@ def _handle_command(cmd: str, orchestrator: Orchestrator, app_ref) -> None:
|
|
|
1334
1334
|
console.print(f"\n[yellow]⚠ You are already logged in as [bold]{config.email}[/bold].[/yellow]")
|
|
1335
1335
|
console.print("[dim]Run [white]/logout[/white] first if you want to switch accounts.[/dim]\n")
|
|
1336
1336
|
else:
|
|
1337
|
+
import os as _os
|
|
1338
|
+
_is_termux = (
|
|
1339
|
+
(_os.environ.get("PREFIX", "").find("com.termux") != -1) or
|
|
1340
|
+
_os.path.exists("/data/data/com.termux")
|
|
1341
|
+
)
|
|
1342
|
+
|
|
1337
1343
|
def _do_login():
|
|
1338
1344
|
try:
|
|
1339
1345
|
auth.login()
|
|
1340
1346
|
except Exception as exc:
|
|
1341
1347
|
console.print(f"\n [bold red]✗ Login failed: {exc}[/bold red]\n")
|
|
1342
|
-
|
|
1348
|
+
|
|
1349
|
+
if _is_termux:
|
|
1350
|
+
# On Termux, run directly — run_in_terminal suspends prompt_toolkit's
|
|
1351
|
+
# input handler for the entire polling duration (up to 10 min), making
|
|
1352
|
+
# the input area vanish and the CLI appear frozen.
|
|
1353
|
+
_do_login()
|
|
1354
|
+
else:
|
|
1355
|
+
run_in_terminal(_do_login)
|
|
1343
1356
|
orchestrator.email = config.email
|
|
1344
1357
|
orchestrator.token = config.token
|
|
1345
1358
|
|
|
@@ -2740,7 +2753,7 @@ def check_and_update_background():
|
|
|
2740
2753
|
return
|
|
2741
2754
|
|
|
2742
2755
|
latest_ver = resp.json().get("version", "")
|
|
2743
|
-
current_ver = "1.46.
|
|
2756
|
+
current_ver = "1.46.10"
|
|
2744
2757
|
|
|
2745
2758
|
def parse_ver(v):
|
|
2746
2759
|
return [int(x) for x in v.split(".") if x.isdigit()]
|
|
@@ -2939,7 +2952,7 @@ app = typer.Typer()
|
|
|
2939
2952
|
def version_callback(value: bool):
|
|
2940
2953
|
if value:
|
|
2941
2954
|
import typer
|
|
2942
|
-
print("U Think I Make v1.46.
|
|
2955
|
+
print("U Think I Make v1.46.10")
|
|
2943
2956
|
raise typer.Exit()
|
|
2944
2957
|
|
|
2945
2958
|
@app.callback(invoke_without_command=True)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: utim-cli
|
|
3
|
-
Version: 1.46.
|
|
3
|
+
Version: 1.46.10
|
|
4
4
|
Summary: UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal.
|
|
5
5
|
License: MIT
|
|
6
6
|
Project-URL: Homepage, https://utim.dev
|
|
@@ -32,8 +32,6 @@ Requires-Dist: rich>=13.0.0
|
|
|
32
32
|
Requires-Dist: prompt_toolkit>=3.0.0
|
|
33
33
|
Requires-Dist: mcp>=0.1.0
|
|
34
34
|
Requires-Dist: nest-asyncio>=1.5.0
|
|
35
|
-
Requires-Dist: python-multipart>=0.0.7
|
|
36
|
-
Requires-Dist: slowapi>=0.1.9
|
|
37
35
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
38
36
|
Provides-Extra: search
|
|
39
37
|
Requires-Dist: scrapy>=2.11.0; extra == "search"
|
|
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
|