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.
Files changed (127) hide show
  1. {utim_cli-2.1.3 → utim_cli-2.2.0}/CHANGELOG.md +2 -2
  2. {utim_cli-2.1.3/utim_cli.egg-info → utim_cli-2.2.0}/PKG-INFO +1 -1
  3. {utim_cli-2.1.3 → utim_cli-2.2.0}/pyproject.toml +1 -1
  4. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/__init__.py +1 -1
  5. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_version.py +1 -1
  6. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/brain.py +43 -53
  7. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/orchestrator.py +511 -246
  8. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/reflection.py +112 -256
  9. utim_cli-2.2.0/utim_cli/server/local_llm.py +380 -0
  10. utim_cli-2.2.0/utim_cli/server/micro_batcher.py +280 -0
  11. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/router.py +2 -9
  12. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/completion_routes.py +20 -19
  13. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/situational_scoring.py +27 -17
  14. utim_cli-2.2.0/utim_cli/subagent_manager.py +366 -0
  15. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tools.py +107 -10
  16. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/feedback_dialog.py +25 -25
  17. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/history_dialog.py +10 -10
  18. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/marketplace_dialog.py +2 -2
  19. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/mcp_dialog.py +6 -6
  20. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/miniagents_dialog.py +3 -3
  21. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/model_dialog.py +98 -10
  22. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/quota_dialog.py +36 -36
  23. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/quota_share_dialog.py +1 -1
  24. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/resume_dialog.py +147 -147
  25. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/skills_dialog.py +4 -4
  26. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/subagents_dialog.py +3 -3
  27. utim_cli-2.2.0/utim_cli/tui/thinking_display.py +137 -0
  28. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/tools_dialog.py +29 -29
  29. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/update_dialog.py +1 -1
  30. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/utim.py +128 -38
  31. {utim_cli-2.1.3 → utim_cli-2.2.0/utim_cli.egg-info}/PKG-INFO +1 -1
  32. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/SOURCES.txt +2 -0
  33. utim_cli-2.1.3/utim_cli/server/local_llm.py +0 -236
  34. utim_cli-2.1.3/utim_cli/server/micro_batcher.py +0 -95
  35. {utim_cli-2.1.3 → utim_cli-2.2.0}/LICENSE +0 -0
  36. {utim_cli-2.1.3 → utim_cli-2.2.0}/MANIFEST.in +0 -0
  37. {utim_cli-2.1.3 → utim_cli-2.2.0}/README.md +0 -0
  38. {utim_cli-2.1.3 → utim_cli-2.2.0}/setup.cfg +0 -0
  39. {utim_cli-2.1.3 → utim_cli-2.2.0}/setup.py +0 -0
  40. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_check_obj.py +0 -0
  41. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_find_mcp.py +0 -0
  42. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_find_plan.py +0 -0
  43. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_find_tool.py +0 -0
  44. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_patch_multimodal.py +0 -0
  45. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/_test_regex.py +0 -0
  46. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/agent.py +0 -0
  47. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/auth.py +0 -0
  48. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/backup.py +0 -0
  49. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/billing.py +0 -0
  50. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/blender_agent.py +0 -0
  51. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/bootstrap.py +0 -0
  52. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/client_utils.py +0 -0
  53. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/config.py +0 -0
  54. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/constants.py +0 -0
  55. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/context_pruner.py +0 -0
  56. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/doctor.py +0 -0
  57. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/harbor.py +0 -0
  58. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/knowledge_graph.py +0 -0
  59. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/local_db.py +0 -0
  60. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/logger.py +0 -0
  61. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/mcp_clean_wrapper.py +0 -0
  62. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/mcp_client.py +0 -0
  63. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/mcp_registry.json +0 -0
  64. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/report.py +0 -0
  65. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/scrapy_search.py +0 -0
  66. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/__init__.py +0 -0
  67. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/attribution.py +0 -0
  68. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/audit_log.py +0 -0
  69. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/auth.py +0 -0
  70. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/batch_processor.py +0 -0
  71. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/captcha.py +0 -0
  72. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/cli_auth.py +0 -0
  73. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/db.py +0 -0
  74. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
  75. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/about.md +0 -0
  76. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/changelog.md +0 -0
  77. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/docs.md +0 -0
  78. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/features.md +0 -0
  79. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/license.md +0 -0
  80. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/pricing.md +0 -0
  81. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/privacy.md +0 -0
  82. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/refund.md +0 -0
  83. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/support.md +0 -0
  84. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/docs_md/terms.md +0 -0
  85. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/email_utils.py +0 -0
  86. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/exchange_rate.py +0 -0
  87. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/firebase.py +0 -0
  88. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/fix_duplicate_users.py +0 -0
  89. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/history.py +0 -0
  90. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/logging_config.py +0 -0
  91. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/model_agent.py +0 -0
  92. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/models.py +0 -0
  93. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/pricing_updater.py +0 -0
  94. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/provision_build.py +0 -0
  95. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/rate_limit.py +0 -0
  96. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/rewards_engine.py +0 -0
  97. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/__init__.py +0 -0
  98. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/auth_routes.py +0 -0
  99. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/credit_routes.py +0 -0
  100. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/feedback_routes.py +0 -0
  101. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/marketplace_routes.py +0 -0
  102. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/quota_routes.py +0 -0
  103. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/quota_share_routes.py +0 -0
  104. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/referral_routes.py +0 -0
  105. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/rewards_routes.py +0 -0
  106. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/security_routes.py +0 -0
  107. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/session_routes.py +0 -0
  108. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/routes/share_routes.py +0 -0
  109. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/server.py +0 -0
  110. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/server/storage_nodes.py +0 -0
  111. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/share.py +0 -0
  112. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/share_tui.py +0 -0
  113. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/state.py +0 -0
  114. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/__init__.py +0 -0
  115. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/marketplace_app_state.py +0 -0
  116. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/marketplace_layout_engine.py +0 -0
  117. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/publish_dialog.py +0 -0
  118. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/quota_redeem_dialog.py +0 -0
  119. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/tui/rewards_tui.py +0 -0
  120. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/utilities.py +0 -0
  121. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/vector_memory.py +0 -0
  122. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/wheel.py +0 -0
  123. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli/workspace.py +0 -0
  124. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/dependency_links.txt +0 -0
  125. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/entry_points.txt +0 -0
  126. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/requires.txt +0 -0
  127. {utim_cli-2.1.3 → utim_cli-2.2.0}/utim_cli.egg-info/top_level.txt +0 -0
@@ -1,9 +1,9 @@
1
1
  # Changelog
2
2
 
3
- ## [2.1.3] - 2026-08-12
3
+ ## [2.2.0] - 2026-08-13
4
4
 
5
5
  ### 🛠️ Fixes
6
- - Minor modifications and Bug fixes
6
+ - Modified interface
7
7
 
8
8
  ## [2.1.2] - 2026-08-10
9
9
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.1.3
3
+ Version: 2.2.0
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "utim-cli"
7
- version = "2.1.3"
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"
@@ -5,7 +5,7 @@ try:
5
5
  from utim_cli._version import VERSION as __version__
6
6
  except ImportError:
7
7
  # Fallback during first-install / editable-install edge cases
8
- __version__ = "2.1.3"
8
+ __version__ = "2.2.0"
9
9
 
10
10
  import builtins, os, pathlib, urllib.parse, re
11
11
 
@@ -11,4 +11,4 @@
11
11
  # from here so every surface stays in sync automatically.
12
12
  # ─────────────────────────────────────────────────────────────────────────────
13
13
 
14
- VERSION = "2.1.3"
14
+ VERSION = "2.2.0"
@@ -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 Qwen3-0.6B via the UTIM server or OpenRouter for fast brain reasoning.
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
- from utim_cli.auth import SERVER_URL
186
- import requests as _req
187
-
188
- api_key = config.get("api_key")
189
- llm_key = os.getenv("OPENROUTER_API_KEY") or os.getenv("UTIM_API_KEY") or api_key
190
-
191
- messages = []
192
- if system:
193
- messages.append({"role": "system", "content": system})
194
- messages.append({"role": "user", "content": prompt})
195
-
196
- if api_key:
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
- json={"model": QWEN_BRAIN_MODEL, "messages": messages, "max_tokens": max_tokens},
231
- headers={"Authorization": f"Bearer {llm_key}"},
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 == 200:
235
- return _strip_think_tags(
236
- resp.json()["choices"][0]["message"]["content"]
237
- )
238
- except Exception:
239
- pass
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: