utim-cli 2.1.0__tar.gz → 2.1.1__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-2.1.0 → utim_cli-2.1.1}/CHANGELOG.md +5 -0
- {utim_cli-2.1.0/utim_cli.egg-info → utim_cli-2.1.1}/PKG-INFO +1 -1
- {utim_cli-2.1.0 → utim_cli-2.1.1}/pyproject.toml +1 -1
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/__init__.py +1 -1
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_version.py +1 -1
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/orchestrator.py +31 -27
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/auth.py +485 -483
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/db.py +25 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/email_utils.py +32 -84
- utim_cli-2.1.1/utim_cli/server/fix_duplicate_users.py +91 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/router.py +27 -35
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/auth_routes.py +6 -3
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/quota_routes.py +1604 -1595
- utim_cli-2.1.1/utim_cli/server/routes/share_routes.py +263 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/storage_nodes.py +4 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/share.py +245 -92
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/share_tui.py +1115 -792
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tools.py +305 -123
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/mcp_dialog.py +44 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/utim.py +57 -4
- {utim_cli-2.1.0 → utim_cli-2.1.1/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/SOURCES.txt +1 -0
- utim_cli-2.1.0/utim_cli/server/routes/share_routes.py +0 -216
- {utim_cli-2.1.0 → utim_cli-2.1.1}/LICENSE +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/MANIFEST.in +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/README.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/setup.cfg +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/setup.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_check_obj.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_find_mcp.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_find_plan.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_find_tool.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_patch_multimodal.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_test_regex.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/agent.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/auth.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/backup.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/billing.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/blender_agent.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/bootstrap.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/client_utils.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/config.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/constants.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/context_pruner.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/doctor.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/harbor.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/local_db.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/logger.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/mcp_client.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/reflection.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/report.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/__init__.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/attribution.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/audit_log.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/captcha.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/cli_auth.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/about.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/changelog.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/docs.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/features.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/license.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/pricing.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/privacy.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/refund.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/support.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/terms.md +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/exchange_rate.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/firebase.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/history.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/models.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/pricing_updater.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/provision_build.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/completion_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/feedback_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/marketplace_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/quota_share_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/referral_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/security_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/server.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/state.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/feedback_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/history_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/marketplace_app_state.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/marketplace_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/marketplace_layout_engine.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/miniagents_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/model_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/publish_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/quota_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/quota_redeem_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/quota_share_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/resume_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/skills_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/subagents_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/tools_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/update_dialog.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/utilities.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/vector_memory.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/workspace.py +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/requires.txt +0 -0
- {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.1.1] - 2026-08-06
|
|
4
|
+
|
|
5
|
+
### 🛠️ Fixes
|
|
6
|
+
- **Enhanced `grep_search` reliability**: Fixed broken auto-regex promotion, ripgrep flag bugs (`-max-count` → `--max-count`), single-file `--with-filename` handling, Windows drive-letter colon parsing, and fallback file-list mode counting. Added dual-engine architecture (cached ripgrep fast-path + multithreaded Python fallback), binary-file sniffing, symlink-cycle protection, expanded noise filtering, and multi-encoding support.
|
|
7
|
+
|
|
3
8
|
## [2.1.0] - 2026-08-05
|
|
4
9
|
|
|
5
10
|
### ⚡ Performance
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "utim-cli"
|
|
7
|
-
version = "2.1.
|
|
7
|
+
version = "2.1.1"
|
|
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"
|
|
@@ -171,22 +171,10 @@ def _get_compression_threshold(model_id: str, context_window: int) -> int:
|
|
|
171
171
|
return int(context_window * 0.90)
|
|
172
172
|
|
|
173
173
|
|
|
174
|
-
def _get_compression_interval(context_window: int) -> int:
|
|
175
|
-
"""Return the iteration gap for context compression
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
- 500k – 1M context: every 30th iteration
|
|
179
|
-
- 1M+ context: every 45th iteration
|
|
180
|
-
"""
|
|
181
|
-
cw = context_window or 128_000
|
|
182
|
-
if cw < 200_000:
|
|
183
|
-
return 10
|
|
184
|
-
elif cw < 500_000:
|
|
185
|
-
return 20
|
|
186
|
-
elif cw < 1_000_000:
|
|
187
|
-
return 30
|
|
188
|
-
else:
|
|
189
|
-
return 45
|
|
174
|
+
def _get_compression_interval(context_window: int = 0) -> int:
|
|
175
|
+
"""Return the iteration gap for model context compression (every 25 iterations)."""
|
|
176
|
+
return 25
|
|
177
|
+
|
|
190
178
|
|
|
191
179
|
from utim_cli.config import get_utim_dir
|
|
192
180
|
_utim_dir_posix = get_utim_dir().as_posix()
|
|
@@ -2508,10 +2496,32 @@ class Orchestrator:
|
|
|
2508
2496
|
header.append(f"{display_name} Failed", style="bold red")
|
|
2509
2497
|
if display_arg:
|
|
2510
2498
|
header.append(f" {display_arg}", style="white")
|
|
2499
|
+
|
|
2500
|
+
# Build the error body — add a hint for token/permission errors from MCP tools
|
|
2501
|
+
error_body = Text(result, style="red")
|
|
2502
|
+
result_lower = result.lower()
|
|
2503
|
+
is_permission_error = any(kw in result_lower for kw in [
|
|
2504
|
+
"permission denied", "not accessible by personal access token",
|
|
2505
|
+
"resource not accessible", "403", "unauthorized", "401",
|
|
2506
|
+
"insufficient scope", "bad credentials", "bad_credentials",
|
|
2507
|
+
"requires authentication", "token", "forbidden"
|
|
2508
|
+
])
|
|
2509
|
+
# Only show hints for MCP tool errors (func_name contains __)
|
|
2510
|
+
if is_permission_error and "__" in func_name:
|
|
2511
|
+
server_name_hint = func_name.split("__")[0]
|
|
2512
|
+
error_body.append("\n\n💡 Hint: ", style="bold yellow")
|
|
2513
|
+
error_body.append(
|
|
2514
|
+
f"Your token for '{server_name_hint}' lacks the required permissions.\n"
|
|
2515
|
+
f" • Go to /mcp → select '{server_name_hint}' → 🔑 Update Token / Env Vars\n"
|
|
2516
|
+
f" • For GitHub: ensure your PAT has the 'repo' scope (classic token)\n"
|
|
2517
|
+
f" or the correct fine-grained repository permissions enabled.\n"
|
|
2518
|
+
f" • Generate a new token at: https://github.com/settings/tokens",
|
|
2519
|
+
style="yellow"
|
|
2520
|
+
)
|
|
2511
2521
|
|
|
2512
2522
|
with self.console.capture() as capture:
|
|
2513
2523
|
self.console.print(Panel(
|
|
2514
|
-
|
|
2524
|
+
error_body,
|
|
2515
2525
|
title=header,
|
|
2516
2526
|
title_align="left",
|
|
2517
2527
|
border_style="red",
|
|
@@ -3759,15 +3769,9 @@ class Orchestrator:
|
|
|
3759
3769
|
return 65_000
|
|
3760
3770
|
|
|
3761
3771
|
def _get_dynamic_interval(self) -> int:
|
|
3762
|
-
"""Get
|
|
3763
|
-
|
|
3764
|
-
|
|
3765
|
-
model_entry = get_model(self.model_id)
|
|
3766
|
-
if model_entry and model_entry.context_window:
|
|
3767
|
-
return _get_compression_interval(model_entry.context_window)
|
|
3768
|
-
except Exception:
|
|
3769
|
-
pass
|
|
3770
|
-
return 10
|
|
3772
|
+
"""Get iteration context compression interval (every 25 iterations)."""
|
|
3773
|
+
return 25
|
|
3774
|
+
|
|
3771
3775
|
|
|
3772
3776
|
def _get_iteration_budget(self) -> int:
|
|
3773
3777
|
"""Return the max iteration budget for the current model, scaled by context window.
|
|
@@ -5639,7 +5643,7 @@ class Orchestrator:
|
|
|
5639
5643
|
if hasattr(self, "_tool_name_failure_counts"):
|
|
5640
5644
|
self._tool_name_failure_counts.pop(func_name, None)
|
|
5641
5645
|
|
|
5642
|
-
# Periodic iteration context compression (every
|
|
5646
|
+
# Periodic iteration context compression (every 25 iterations)
|
|
5643
5647
|
interval = getattr(self, "_compression_interval", None) or self._get_dynamic_interval()
|
|
5644
5648
|
if turn_iteration > 0 and turn_iteration % interval == 0:
|
|
5645
5649
|
try:
|