utim-cli 1.44.1__tar.gz → 1.44.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.44.1 → utim_cli-1.44.2}/CHANGELOG.md +37 -29
- {utim_cli-1.44.1/utim_cli.egg-info → utim_cli-1.44.2}/PKG-INFO +1 -1
- {utim_cli-1.44.1 → utim_cli-1.44.2}/pyproject.toml +1 -1
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/mcp_client.py +2 -1
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/mcp_registry.json +1 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/tools.py +5 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/utim.py +19 -16
- {utim_cli-1.44.1 → utim_cli-1.44.2/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-1.44.1 → utim_cli-1.44.2}/LICENSE +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/MANIFEST.in +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/README.md +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/setup.cfg +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/setup.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/__init__.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/agent.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/auth.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/backup.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/billing.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/blender_agent.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/bootstrap.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/client_utils.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/config.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/context_pruner.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/doctor.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/logger.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/orchestrator.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/reflection.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/report.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/share.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/share_tui.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/state.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/vector_memory.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli/workspace.py +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli.egg-info/SOURCES.txt +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli.egg-info/requires.txt +0 -0
- {utim_cli-1.44.1 → utim_cli-1.44.2}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to the UTIM CLI Agent will be documented in this file.
|
|
4
|
-
|
|
5
|
-
## [1.
|
|
6
|
-
|
|
7
|
-
###
|
|
8
|
-
- **
|
|
9
|
-
- **
|
|
10
|
-
- **
|
|
11
|
-
- **
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
- **
|
|
19
|
-
- **
|
|
20
|
-
- **
|
|
21
|
-
- **
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to the UTIM CLI Agent will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [1.44.2] - 2026-07-02
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **MCP Server Hang:** Fixed an issue where installing MCP servers (like Figma) without the `--stdio` flag would hang the CLI indefinitely. Added a 60-second initialization timeout and updated the preset registry to include required flags automatically.
|
|
9
|
+
- **Model Selection Crash:** Fixed an issue where the CLI would crash instantly when trying to open the `/model` selector on a production npm install due to an excluded server module.
|
|
10
|
+
- **Image Subagent Config:** Separated the Image Generation model and the Prompt Expander LLM in the subagent configuration UI, allowing users to configure both independently.
|
|
11
|
+
- **Minor:** Minor Bug Fixes
|
|
12
|
+
|
|
13
|
+
## [1.43.20] - 2026-07-01
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
- **Local-Global Experience Vector DB Sync**: UTIM now carries the ChromaDB experience database across project folders automatically. On startup, the previous project's `experiences.json`, `vector_db`, and vector metadata files are copied to the current folder — deleted from the old folder only after a successful paste. Last active folder is persisted server-side so the sync survives PC restarts.
|
|
17
|
+
- **BYOK Provider Disconnection (key `x`)**: Press `x` in the model selector to view a list of connected custom providers and disconnect them. All associated models are removed from the model list instantly.
|
|
18
|
+
- **Bring Your Own Key (BYOK) for Free Users**: Free-tier users can now connect any OpenAI-compatible provider using their own API key. BYOK models bypass UTIM quota limits and plan gating entirely.
|
|
19
|
+
- **Dynamic Changelog & Version API**: `/api/changelog` parses `CHANGELOG.md` at request time and returns structured JSON. `/health` version field is also derived from `CHANGELOG.md` dynamically — deploying a new changelog auto-updates both the website changelog page and version badge.
|
|
20
|
+
- **Changelog Tab on Website**: The terminal website now includes a `↻ Changelog` tab that fetches live release notes from the Railway server on load.
|
|
21
|
+
- **Features Page Redesign**: The Features tab now displays a 9-card animated grid with per-feature glow icons, numbered labels, colored tags, and spring entrance animations — matching the full terminal aesthetic of the site.
|
|
22
|
+
- **Last Project Folder Persistence**: Server stores each user's last active project directory in the database. Survives PC restarts and is used to drive the cross-folder experience DB sync.
|
|
23
|
+
- **`GET /api/auth/last-folder` and `POST /api/auth/last-folder` Endpoints**: New authenticated REST endpoints to read/write a user's last active project folder path.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
- **Plan Upgrade Credit Transition**: Free plan credit allowance ($1.00) is zeroed out instead of rolling over to the new paid plan's quota bank on upgrade.
|
|
27
|
+
- **Hobby Plan Model Access**: Hobby plan `allowed_models` corrected to `"all"` so users can access the full model registry (not just free-tier models).
|
|
28
|
+
- **BYOK Model Gating Bypass**: Orchestrator pre-flight checks now skip plan gating and UTIM credit checks for custom BYOK models since they use user-owned keys.
|
|
29
|
+
- **Pricing Page Claims Cleaned**: Removed unsubstantiated marketing claims (`Dedicated elite endpoints`, `Autonomous team agents access`, `High-speed dedicated endpoints`, `All premium models (GPT-4o, Claude)`, `Synthetic Eye & VSIX tools`, `Claude Sonnet 4.6 (1 RPM)`, `10-session history storage`) from all pricing tier feature lists.
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- **BYOK Flow Display Bug**: Rewrote Add/Delete/BYOK-import dialogs to run on `sys.__stdout__` with `prompt_toolkit.prompt()` so they are never swallowed by the alt-screen buffer.
|
|
33
|
+
- **Double-Exit Crash (TUI)**: Wrapped all keyboard exit callbacks (`ENTER`/`ESC`/`q`/`CTRL+C`) in `try...except` blocks to prevent double-fire tracebacks.
|
|
34
|
+
- **`/changelog` Route No Longer Shows Legacy Page**: All website routes (including `/changelog`) now correctly map to the `<PowershellUI />` terminal component. Legacy standalone page removed.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "utim-cli"
|
|
7
|
-
version = "1.44.
|
|
7
|
+
version = "1.44.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"
|
|
@@ -114,9 +114,10 @@ class MCPManager:
|
|
|
114
114
|
stack = AsyncExitStack()
|
|
115
115
|
self._exit_stacks[name] = stack
|
|
116
116
|
|
|
117
|
+
import asyncio
|
|
117
118
|
read, write = await stack.enter_async_context(stdio_client(server_params))
|
|
118
119
|
session = await stack.enter_async_context(ClientSession(read, write))
|
|
119
|
-
await session.initialize()
|
|
120
|
+
await asyncio.wait_for(session.initialize(), timeout=60.0)
|
|
120
121
|
|
|
121
122
|
self.sessions[name] = session
|
|
122
123
|
|
|
@@ -2223,6 +2223,11 @@ def generate_image(
|
|
|
2223
2223
|
"black-forest-labs/flux.2-klein-4b",
|
|
2224
2224
|
"black-forest-labs/flux.1-dev"
|
|
2225
2225
|
]
|
|
2226
|
+
|
|
2227
|
+
from utim_cli.config import config
|
|
2228
|
+
img_model = config.get("subagent_model_image_gen")
|
|
2229
|
+
if img_model:
|
|
2230
|
+
models_to_try = [img_model] + [m for m in models_to_try if m != img_model]
|
|
2226
2231
|
|
|
2227
2232
|
headers = {
|
|
2228
2233
|
"Authorization": f"Bearer {nvidia_key}",
|
|
@@ -584,7 +584,7 @@ def _print_animated_banner():
|
|
|
584
584
|
# Speed up for spaces to make it feel more like typing
|
|
585
585
|
time.sleep(0.002 if char == " " else 0.005)
|
|
586
586
|
|
|
587
|
-
console.print(f"\n [bold white]U Think I Make[/bold white] [dim]v1.44.
|
|
587
|
+
console.print(f"\n [bold white]U Think I Make[/bold white] [dim]v1.44.2[/dim]")
|
|
588
588
|
user_email = config.email
|
|
589
589
|
user_type = "UTIM Community"
|
|
590
590
|
api_key = config.get("api_key")
|
|
@@ -1030,7 +1030,7 @@ def _handle_command(cmd: str, orchestrator: Orchestrator, app_ref) -> None:
|
|
|
1030
1030
|
con.print(Panel(
|
|
1031
1031
|
Text.from_markup(
|
|
1032
1032
|
"[bold white]U Think I Make (UTIM)[/bold white]\n"
|
|
1033
|
-
"[dim]Version 1.44.
|
|
1033
|
+
"[dim]Version 1.44.2[/dim]\n\n"
|
|
1034
1034
|
"The next-generation CLI agent for autonomous software engineering.\n"
|
|
1035
1035
|
"Built with [bold #42bcf5]UTIM AI[/bold #42bcf5].\n\n"
|
|
1036
1036
|
"[dim]Website:[/dim] https://utim.dev\n"
|
|
@@ -1428,8 +1428,10 @@ def _dialog_subagents_menu(orchestrator):
|
|
|
1428
1428
|
"desc": f"Currently: {config.get('subagent_model_web_search', 'Default (Low / Qwen-Coder)')}"},
|
|
1429
1429
|
{"key": "plan_project", "label": "📋 Planner Agent (plan_project)",
|
|
1430
1430
|
"desc": f"Currently: {config.get('subagent_model_plan_project', 'Default (Low / Qwen-Coder)')}"},
|
|
1431
|
-
{"key": "generate_image", "label": "🎨
|
|
1431
|
+
{"key": "generate_image", "label": "🎨 Prompt Expander Model (generate_image)",
|
|
1432
1432
|
"desc": f"Currently: {config.get('subagent_model_generate_image', 'Default (Low / Qwen-Coder)')}"},
|
|
1433
|
+
{"key": "image_gen", "label": "🖼️ Image Generator Model (image_gen)",
|
|
1434
|
+
"desc": f"Currently: {config.get('subagent_model_image_gen', 'Default (Flux Schnell)')}"},
|
|
1433
1435
|
{"key": "back", "label": "Back to Main Model Settings", "desc": "Return to the previous screen"}
|
|
1434
1436
|
]
|
|
1435
1437
|
|
|
@@ -1461,7 +1463,6 @@ def _dialog_subagents_menu(orchestrator):
|
|
|
1461
1463
|
def _dialog_model_main(orchestrator, target="main"):
|
|
1462
1464
|
"""Main model picker — dynamically fetches and filters OpenRouter models, keeping custom models."""
|
|
1463
1465
|
from .config import config # local import avoids circular issues at module load
|
|
1464
|
-
from utim_cli.server.models import MODEL_REGISTRY
|
|
1465
1466
|
|
|
1466
1467
|
# ── Define allowed primary and helper models based on target ──────────────
|
|
1467
1468
|
plan_name = config.get("user_plan", "free").lower()
|
|
@@ -1496,7 +1497,7 @@ def _dialog_model_main(orchestrator, target="main"):
|
|
|
1496
1497
|
"x-ai/grok-4.3",
|
|
1497
1498
|
"google/gemini-3.5-flash",
|
|
1498
1499
|
"qwen/qwen3.7-max",
|
|
1499
|
-
"stepfun/step-3.7-flash"
|
|
1500
|
+
"stepfun/step-3.7-flash",
|
|
1500
1501
|
|
|
1501
1502
|
"anthropic/claude-sonnet-4.5",
|
|
1502
1503
|
"anthropic/claude-sonnet-4.6",
|
|
@@ -1518,7 +1519,7 @@ def _dialog_model_main(orchestrator, target="main"):
|
|
|
1518
1519
|
"x-ai/grok-build-0.1",
|
|
1519
1520
|
"moonshotai/kimi-k2.5",
|
|
1520
1521
|
})
|
|
1521
|
-
elif target.startswith("subagent_") and target != "
|
|
1522
|
+
elif target.startswith("subagent_") and target != "subagent_image_gen":
|
|
1522
1523
|
approved_set = {
|
|
1523
1524
|
"qwen/qwen3-coder:free"
|
|
1524
1525
|
}
|
|
@@ -1548,7 +1549,7 @@ def _dialog_model_main(orchestrator, target="main"):
|
|
|
1548
1549
|
"x-ai/grok-4.3",
|
|
1549
1550
|
"google/gemini-3.5-flash",
|
|
1550
1551
|
"qwen/qwen3.7-max",
|
|
1551
|
-
"stepfun/step-3.7-flash"
|
|
1552
|
+
"stepfun/step-3.7-flash",
|
|
1552
1553
|
|
|
1553
1554
|
"anthropic/claude-sonnet-4.5",
|
|
1554
1555
|
"anthropic/claude-sonnet-4.6",
|
|
@@ -1571,7 +1572,7 @@ def _dialog_model_main(orchestrator, target="main"):
|
|
|
1571
1572
|
"moonshotai/kimi-k2.5",
|
|
1572
1573
|
})
|
|
1573
1574
|
else:
|
|
1574
|
-
#
|
|
1575
|
+
# subagent_image_gen
|
|
1575
1576
|
approved_set = {
|
|
1576
1577
|
"qwen/qwen3-coder:free",
|
|
1577
1578
|
"nvidia/nemotron-nano-12b-v2-vl:free",
|
|
@@ -2381,14 +2382,14 @@ def _dialog_disconnect_provider(orchestrator):
|
|
|
2381
2382
|
active_still_exists = any(m["model_id"] == active_model for m in config.custom_models)
|
|
2382
2383
|
if not active_still_exists and active_model not in ["cohere/north-mini-code:free", "anthropic/claude-sonnet-4.6", "qwen/qwen3-coder:free"]:
|
|
2383
2384
|
is_custom_removed = True
|
|
2384
|
-
|
|
2385
|
-
|
|
2385
|
+
# Hardcoded check since we cannot import utim_cli.server in production CLI builds
|
|
2386
|
+
# (as the server module is excluded from the package in pyproject.toml)
|
|
2387
|
+
if active_model.startswith("openai/") or active_model.startswith("anthropic/") or active_model.startswith("google/") or active_model.startswith("cohere/"):
|
|
2386
2388
|
is_custom_removed = False
|
|
2387
2389
|
|
|
2388
2390
|
if is_custom_removed:
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
disc_console.print(f"[dim]Active model removed. Switched back to {DEFAULT_MODEL}[/dim]\n")
|
|
2391
|
+
orchestrator.model_id = "cohere/north-mini-code:free"
|
|
2392
|
+
disc_console.print(f"[dim]Active model removed. Switched back to cohere/north-mini-code:free[/dim]\n")
|
|
2392
2393
|
else:
|
|
2393
2394
|
disc_console.print("\n[dim]Cancelled.[/dim]\n")
|
|
2394
2395
|
|
|
@@ -2801,6 +2802,8 @@ def _dialog_mcp_install(orchestrator):
|
|
|
2801
2802
|
preset_info = presets_config[key]
|
|
2802
2803
|
server_name = key
|
|
2803
2804
|
args.append(preset_info["pkg"])
|
|
2805
|
+
if "args" in preset_info:
|
|
2806
|
+
args.extend(preset_info["args"])
|
|
2804
2807
|
|
|
2805
2808
|
for field in preset_info["fields"]:
|
|
2806
2809
|
prompt_str = field["prompt"]
|
|
@@ -4557,7 +4560,7 @@ def check_and_update_background():
|
|
|
4557
4560
|
return
|
|
4558
4561
|
|
|
4559
4562
|
latest_ver = resp.json().get("version", "")
|
|
4560
|
-
current_ver = "1.44.
|
|
4563
|
+
current_ver = "1.44.2"
|
|
4561
4564
|
|
|
4562
4565
|
def parse_ver(v):
|
|
4563
4566
|
return [int(x) for x in v.split(".") if x.isdigit()]
|
|
@@ -4671,7 +4674,7 @@ def _dialog_auto_update():
|
|
|
4671
4674
|
_result[0] = ("network_error", False)
|
|
4672
4675
|
return
|
|
4673
4676
|
latest = resp.json().get("version", "")
|
|
4674
|
-
current = "1.44.
|
|
4677
|
+
current = "1.44.2"
|
|
4675
4678
|
|
|
4676
4679
|
def pv(v):
|
|
4677
4680
|
return [int(x) for x in v.split(".") if x.isdigit()]
|
|
@@ -4894,7 +4897,7 @@ app = typer.Typer()
|
|
|
4894
4897
|
def version_callback(value: bool):
|
|
4895
4898
|
if value:
|
|
4896
4899
|
import typer
|
|
4897
|
-
print("U Think I Make v1.44.
|
|
4900
|
+
print("U Think I Make v1.44.2")
|
|
4898
4901
|
raise typer.Exit()
|
|
4899
4902
|
|
|
4900
4903
|
@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
|