utim-cli 2.1.3__tar.gz → 2.2.0__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.0}/CHANGELOG.md +2 -2
- {utim_cli-2.1.3/utim_cli.egg-info → utim_cli-2.2.0}/PKG-INFO +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.0}/pyproject.toml +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/__init__.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_version.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/brain.py +43 -53
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/orchestrator.py +511 -246
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/reflection.py +112 -256
- utim_cli-2.2.0/utim_cli/server/local_llm.py +380 -0
- utim_cli-2.2.0/utim_cli/server/micro_batcher.py +280 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/router.py +2 -9
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/completion_routes.py +20 -19
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/situational_scoring.py +27 -17
- utim_cli-2.2.0/utim_cli/subagent_manager.py +366 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tools.py +107 -10
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/feedback_dialog.py +25 -25
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/history_dialog.py +10 -10
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/marketplace_dialog.py +2 -2
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/mcp_dialog.py +6 -6
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/miniagents_dialog.py +3 -3
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/model_dialog.py +98 -10
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/quota_dialog.py +36 -36
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/quota_share_dialog.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/resume_dialog.py +147 -147
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/skills_dialog.py +4 -4
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/subagents_dialog.py +3 -3
- utim_cli-2.2.0/utim_cli/tui/thinking_display.py +137 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/tools_dialog.py +29 -29
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/update_dialog.py +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/utim.py +128 -38
- {utim_cli-2.1.3 → utim_cli-2.2.0/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/SOURCES.txt +2 -0
- 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.0}/LICENSE +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/MANIFEST.in +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/README.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/setup.cfg +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/setup.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_check_obj.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_find_mcp.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_find_plan.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_find_tool.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_patch_multimodal.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_test_regex.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/agent.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/auth.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/backup.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/billing.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/blender_agent.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/bootstrap.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/client_utils.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/config.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/constants.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/context_pruner.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/doctor.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/harbor.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/local_db.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/logger.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/mcp_client.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/report.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/__init__.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/attribution.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/audit_log.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/auth.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/batch_processor.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/captcha.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/cli_auth.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/db.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/about.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/changelog.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/docs.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/features.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/license.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/pricing.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/privacy.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/refund.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/support.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/terms.md +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/email_utils.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/exchange_rate.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/firebase.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/fix_duplicate_users.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/history.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/model_agent.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/models.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/pricing_updater.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/provision_build.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/rate_limit.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/rewards_engine.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/__init__.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/auth_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/feedback_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/marketplace_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/quota_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/quota_share_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/referral_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/rewards_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/security_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/server.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/storage_nodes.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/share.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/share_tui.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/state.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/marketplace_app_state.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/marketplace_layout_engine.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/publish_dialog.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/quota_redeem_dialog.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/rewards_tui.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/utilities.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/vector_memory.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/wheel.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/workspace.py +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/entry_points.txt +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/requires.txt +0 -0
- {utim_cli-2.1.3 → utim_cli-2.2.0}/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 = "2.
|
|
7
|
+
version = "2.2.0"
|
|
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"
|
|
@@ -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 = [QWEN_BRAIN_MODEL, "openrouter/free"]
|
|
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:
|