utim-cli 2.1.3__tar.gz → 2.2.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.3 → utim_cli-2.2.1}/CHANGELOG.md +11 -2
- {utim_cli-2.1.3/utim_cli.egg-info → utim_cli-2.2.1}/PKG-INFO +1 -2
- {utim_cli-2.1.3 → utim_cli-2.2.1}/pyproject.toml +1 -2
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/__init__.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/_version.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/brain.py +43 -53
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/orchestrator.py +511 -246
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/reflection.py +113 -257
- utim_cli-2.2.1/utim_cli/server/local_llm.py +380 -0
- utim_cli-2.2.1/utim_cli/server/micro_batcher.py +280 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/router.py +2 -9
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/completion_routes.py +20 -19
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/situational_scoring.py +27 -17
- utim_cli-2.2.1/utim_cli/subagent_manager.py +366 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tools.py +107 -10
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/feedback_dialog.py +25 -25
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/history_dialog.py +10 -10
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/marketplace_dialog.py +2 -2
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/mcp_dialog.py +6 -6
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/miniagents_dialog.py +3 -3
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/model_dialog.py +98 -10
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/quota_dialog.py +36 -36
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/quota_share_dialog.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/resume_dialog.py +147 -147
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/skills_dialog.py +4 -4
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/subagents_dialog.py +3 -3
- utim_cli-2.2.1/utim_cli/tui/thinking_display.py +137 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/tools_dialog.py +29 -29
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/update_dialog.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/utim.py +128 -38
- {utim_cli-2.1.3 → utim_cli-2.2.1/utim_cli.egg-info}/PKG-INFO +1 -2
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli.egg-info/SOURCES.txt +2 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli.egg-info/requires.txt +0 -1
- utim_cli-2.1.3/utim_cli/server/local_llm.py +0 -236
- utim_cli-2.1.3/utim_cli/server/micro_batcher.py +0 -95
- {utim_cli-2.1.3 → utim_cli-2.2.1}/LICENSE +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/MANIFEST.in +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/README.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/setup.cfg +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/setup.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/_check_obj.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/_find_mcp.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/_find_plan.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/_find_tool.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/_patch_multimodal.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/_test_regex.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/agent.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/auth.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/backup.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/billing.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/blender_agent.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/bootstrap.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/client_utils.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/config.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/constants.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/context_pruner.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/doctor.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/harbor.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/local_db.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/logger.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/mcp_client.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/report.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/__init__.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/attribution.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/audit_log.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/auth.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/batch_processor.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/captcha.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/cli_auth.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/db.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/about.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/changelog.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/docs.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/features.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/license.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/pricing.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/privacy.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/refund.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/support.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/docs_md/terms.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/email_utils.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/exchange_rate.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/firebase.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/fix_duplicate_users.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/history.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/model_agent.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/models.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/pricing_updater.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/provision_build.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/rewards_engine.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/auth_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/feedback_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/marketplace_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/quota_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/quota_share_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/referral_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/rewards_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/security_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/server.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/server/storage_nodes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/share.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/share_tui.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/state.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/marketplace_app_state.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/marketplace_layout_engine.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/publish_dialog.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/quota_redeem_dialog.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/tui/rewards_tui.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/utilities.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/vector_memory.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/wheel.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli/workspace.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.1}/utim_cli.egg-info/top_level.txt +0 -0
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## [2.1
|
|
3
|
+
## [2.2.1] - 2026-08-13
|
|
4
|
+
|
|
5
|
+
### 🛠️ Fixes & Minor Polish
|
|
6
|
+
- **TUI Input Divider Line**: Updated input area horizontal divider line to extend full width across the terminal screen (`shutil.get_terminal_size().columns`) with line-wrap protection.
|
|
7
|
+
- **Subagent Swarm Visualizer Mobile Responsiveness**: Added mobile responsive breakpoint styles (`.st-swarm-canvas`), card container bounds, text truncation, and flex badge anchors (`DISPATCHER`, `DONE`, etc.) to prevent layout overflow on mobile screens.
|
|
8
|
+
- **OS-Specific Requirements Architecture**: Added dedicated lightweight requirement files (`requirements_android.txt`, `requirements_windows.txt`, `requirements_desktop.txt`, `requirements_full.txt`) and updated installer scripts (`install.sh`, `setup_utim1.py`) to select pure-Python requirements for Android/Termux without PyPI binary wheel dependencies.
|
|
9
|
+
- **Reflection Pipeline Primary Model**: Updated reflection and experience extraction model fallback chain to use `openrouter/free` as the primary model (`REFLECTION_PRIMARY_MODEL`).
|
|
10
|
+
- **Correction Fast-Path Engine**: Removed keyword-matching gate on correction detection, delegating judgment directly to the reflection LLM for zero false negatives.
|
|
11
|
+
|
|
12
|
+
## [2.2.0] - 2026-08-13
|
|
4
13
|
|
|
5
14
|
### 🛠️ Fixes
|
|
6
|
-
-
|
|
15
|
+
- Modified interface
|
|
7
16
|
|
|
8
17
|
## [2.1.2] - 2026-08-10
|
|
9
18
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: utim-cli
|
|
3
|
-
Version: 2.1
|
|
3
|
+
Version: 2.2.1
|
|
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
|
|
@@ -31,7 +31,6 @@ Requires-Dist: rich>=13.0.0
|
|
|
31
31
|
Requires-Dist: prompt_toolkit>=3.0.0
|
|
32
32
|
Requires-Dist: nest-asyncio>=1.5.0
|
|
33
33
|
Requires-Dist: sqlalchemy>=2.0.0
|
|
34
|
-
Requires-Dist: ripgrep>=0.13.0
|
|
35
34
|
Provides-Extra: search
|
|
36
35
|
Requires-Dist: scrapy>=2.11.0; extra == "search"
|
|
37
36
|
Requires-Dist: scrapy-playwright>=0.0.34; extra == "search"
|
|
@@ -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.2.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"
|
|
@@ -33,7 +33,6 @@ dependencies = [
|
|
|
33
33
|
"prompt_toolkit>=3.0.0",
|
|
34
34
|
"nest-asyncio>=1.5.0",
|
|
35
35
|
"sqlalchemy>=2.0.0",
|
|
36
|
-
"ripgrep>=0.13.0",
|
|
37
36
|
]
|
|
38
37
|
|
|
39
38
|
[project.urls]
|
|
@@ -83,6 +83,12 @@ BRAIN_FINAL_LIMIT = 6 # max memories injected into system prompt
|
|
|
83
83
|
BRAIN_RELEVANCE_FLOOR = 0.30 # cosine similarity floor for injection
|
|
84
84
|
QWEN_BRAIN_MODEL = "qwen/qwen2.5-1.5b-instruct" # fast reasoning model on server
|
|
85
85
|
|
|
86
|
+
# Reuse the reflection model list so brain calls use the same fallback chain
|
|
87
|
+
try:
|
|
88
|
+
from utim_cli.reflection import REFLECTION_MODELS
|
|
89
|
+
except Exception:
|
|
90
|
+
REFLECTION_MODELS = ["openrouter/free", QWEN_BRAIN_MODEL]
|
|
91
|
+
|
|
86
92
|
# ── Paths ──────────────────────────────────────────────────────────────────────
|
|
87
93
|
|
|
88
94
|
def _brain_root() -> Path:
|
|
@@ -177,66 +183,50 @@ def _cosine(v1: List[float], v2: List[float]) -> float:
|
|
|
177
183
|
|
|
178
184
|
def _call_qwen_brain(prompt: str, system: str = "", max_tokens: int = 400) -> str:
|
|
179
185
|
"""
|
|
180
|
-
Call
|
|
186
|
+
Call a lightweight free model on OpenRouter for internal reasoning tasks.
|
|
181
187
|
Returns the raw text response, or "" on failure.
|
|
182
188
|
"""
|
|
189
|
+
import re as _re
|
|
183
190
|
try:
|
|
184
|
-
from utim_cli.config import config
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
payload = {
|
|
198
|
-
"messages": messages,
|
|
199
|
-
"model_id": QWEN_BRAIN_MODEL,
|
|
200
|
-
"max_tokens": max_tokens,
|
|
201
|
-
"tools": None,
|
|
202
|
-
"session_id": None,
|
|
203
|
-
"is_reflection": True,
|
|
204
|
-
}
|
|
205
|
-
resp = _req.post(
|
|
206
|
-
f"{SERVER_URL}/completions",
|
|
207
|
-
json=payload,
|
|
208
|
-
headers={"X-API-Key": api_key, "Content-Type": "application/json"},
|
|
209
|
-
timeout=20,
|
|
210
|
-
)
|
|
211
|
-
if resp.status_code == 200:
|
|
212
|
-
final = ""
|
|
213
|
-
for line in resp.iter_lines():
|
|
214
|
-
if not line:
|
|
215
|
-
continue
|
|
216
|
-
try:
|
|
217
|
-
ev = json.loads(line.decode("utf-8"))
|
|
218
|
-
if ev.get("type") == "content_delta":
|
|
219
|
-
final += ev.get("text") or ""
|
|
220
|
-
elif ev.get("type") == "done" and not final:
|
|
221
|
-
final = ev.get("content") or ""
|
|
222
|
-
except Exception:
|
|
223
|
-
pass
|
|
224
|
-
return _strip_think_tags(final)
|
|
225
|
-
|
|
226
|
-
# Fallback: direct OpenRouter
|
|
227
|
-
if llm_key:
|
|
191
|
+
from utim_cli.config import config as _cfg
|
|
192
|
+
_key = _cfg.get("api_key") or os.getenv("OPENROUTER_API_KEY") or os.getenv("UTIM_API_KEY") or ""
|
|
193
|
+
except Exception:
|
|
194
|
+
_key = os.getenv("OPENROUTER_API_KEY") or os.getenv("UTIM_API_KEY") or ""
|
|
195
|
+
|
|
196
|
+
if not _key:
|
|
197
|
+
return ""
|
|
198
|
+
|
|
199
|
+
import requests as _req
|
|
200
|
+
_system = system or "You are a precise AI assistant. Be concise and accurate."
|
|
201
|
+
|
|
202
|
+
for model in REFLECTION_MODELS:
|
|
203
|
+
try:
|
|
228
204
|
resp = _req.post(
|
|
229
205
|
"https://openrouter.ai/api/v1/chat/completions",
|
|
230
|
-
|
|
231
|
-
|
|
206
|
+
headers={
|
|
207
|
+
"Authorization": f"Bearer {_key}",
|
|
208
|
+
"Content-Type": "application/json",
|
|
209
|
+
"HTTP-Referer": "https://utim.dev",
|
|
210
|
+
"X-Title": "UTIM Brain",
|
|
211
|
+
},
|
|
212
|
+
json={
|
|
213
|
+
"model": model,
|
|
214
|
+
"messages": [
|
|
215
|
+
{"role": "system", "content": _system},
|
|
216
|
+
{"role": "user", "content": prompt},
|
|
217
|
+
],
|
|
218
|
+
"max_tokens": max_tokens,
|
|
219
|
+
"temperature": 0.1,
|
|
220
|
+
},
|
|
232
221
|
timeout=20,
|
|
233
222
|
)
|
|
234
|
-
if resp.status_code
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
223
|
+
if resp.status_code != 200:
|
|
224
|
+
continue
|
|
225
|
+
raw = resp.json().get("choices", [{}])[0].get("message", {}).get("content", "")
|
|
226
|
+
raw = _re.sub(r"<think(?:ing)?>.*?</think(?:ing)?>", "", raw, flags=_re.DOTALL).strip()
|
|
227
|
+
return raw
|
|
228
|
+
except Exception:
|
|
229
|
+
continue
|
|
240
230
|
return ""
|
|
241
231
|
|
|
242
232
|
def _strip_think_tags(text: str) -> str:
|