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.
Files changed (115) hide show
  1. {utim_cli-2.1.0 → utim_cli-2.1.1}/CHANGELOG.md +5 -0
  2. {utim_cli-2.1.0/utim_cli.egg-info → utim_cli-2.1.1}/PKG-INFO +1 -1
  3. {utim_cli-2.1.0 → utim_cli-2.1.1}/pyproject.toml +1 -1
  4. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/__init__.py +1 -1
  5. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_version.py +1 -1
  6. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/orchestrator.py +31 -27
  7. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/auth.py +485 -483
  8. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/db.py +25 -0
  9. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/email_utils.py +32 -84
  10. utim_cli-2.1.1/utim_cli/server/fix_duplicate_users.py +91 -0
  11. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/router.py +27 -35
  12. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/auth_routes.py +6 -3
  13. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/quota_routes.py +1604 -1595
  14. utim_cli-2.1.1/utim_cli/server/routes/share_routes.py +263 -0
  15. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/storage_nodes.py +4 -0
  16. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/share.py +245 -92
  17. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/share_tui.py +1115 -792
  18. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tools.py +305 -123
  19. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/mcp_dialog.py +44 -0
  20. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/utim.py +57 -4
  21. {utim_cli-2.1.0 → utim_cli-2.1.1/utim_cli.egg-info}/PKG-INFO +1 -1
  22. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/SOURCES.txt +1 -0
  23. utim_cli-2.1.0/utim_cli/server/routes/share_routes.py +0 -216
  24. {utim_cli-2.1.0 → utim_cli-2.1.1}/LICENSE +0 -0
  25. {utim_cli-2.1.0 → utim_cli-2.1.1}/MANIFEST.in +0 -0
  26. {utim_cli-2.1.0 → utim_cli-2.1.1}/README.md +0 -0
  27. {utim_cli-2.1.0 → utim_cli-2.1.1}/setup.cfg +0 -0
  28. {utim_cli-2.1.0 → utim_cli-2.1.1}/setup.py +0 -0
  29. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_check_obj.py +0 -0
  30. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_find_mcp.py +0 -0
  31. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_find_plan.py +0 -0
  32. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_find_tool.py +0 -0
  33. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_patch_multimodal.py +0 -0
  34. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/_test_regex.py +0 -0
  35. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/agent.py +0 -0
  36. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/auth.py +0 -0
  37. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/backup.py +0 -0
  38. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/billing.py +0 -0
  39. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/blender_agent.py +0 -0
  40. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/bootstrap.py +0 -0
  41. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/client_utils.py +0 -0
  42. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/config.py +0 -0
  43. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/constants.py +0 -0
  44. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/context_pruner.py +0 -0
  45. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/doctor.py +0 -0
  46. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/harbor.py +0 -0
  47. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/knowledge_graph.py +0 -0
  48. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/local_db.py +0 -0
  49. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/logger.py +0 -0
  50. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/mcp_clean_wrapper.py +0 -0
  51. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/mcp_client.py +0 -0
  52. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/mcp_registry.json +0 -0
  53. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/reflection.py +0 -0
  54. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/report.py +0 -0
  55. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/scrapy_search.py +0 -0
  56. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/__init__.py +0 -0
  57. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/attribution.py +0 -0
  58. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/audit_log.py +0 -0
  59. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/captcha.py +0 -0
  60. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/cli_auth.py +0 -0
  61. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
  62. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/about.md +0 -0
  63. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/changelog.md +0 -0
  64. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/docs.md +0 -0
  65. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/features.md +0 -0
  66. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/license.md +0 -0
  67. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/pricing.md +0 -0
  68. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/privacy.md +0 -0
  69. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/refund.md +0 -0
  70. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/support.md +0 -0
  71. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/docs_md/terms.md +0 -0
  72. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/exchange_rate.py +0 -0
  73. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/firebase.py +0 -0
  74. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/history.py +0 -0
  75. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/logging_config.py +0 -0
  76. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/models.py +0 -0
  77. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/pricing_updater.py +0 -0
  78. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/provision_build.py +0 -0
  79. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/rate_limit.py +0 -0
  80. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/__init__.py +0 -0
  81. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/completion_routes.py +0 -0
  82. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/credit_routes.py +0 -0
  83. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/feedback_routes.py +0 -0
  84. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/marketplace_routes.py +0 -0
  85. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/quota_share_routes.py +0 -0
  86. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/referral_routes.py +0 -0
  87. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/security_routes.py +0 -0
  88. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/routes/session_routes.py +0 -0
  89. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/server/server.py +0 -0
  90. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/situational_scoring.py +0 -0
  91. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/state.py +0 -0
  92. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/__init__.py +0 -0
  93. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/feedback_dialog.py +0 -0
  94. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/history_dialog.py +0 -0
  95. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/marketplace_app_state.py +0 -0
  96. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/marketplace_dialog.py +0 -0
  97. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/marketplace_layout_engine.py +0 -0
  98. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/miniagents_dialog.py +0 -0
  99. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/model_dialog.py +0 -0
  100. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/publish_dialog.py +0 -0
  101. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/quota_dialog.py +0 -0
  102. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/quota_redeem_dialog.py +0 -0
  103. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/quota_share_dialog.py +0 -0
  104. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/resume_dialog.py +0 -0
  105. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/skills_dialog.py +0 -0
  106. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/subagents_dialog.py +0 -0
  107. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/tools_dialog.py +0 -0
  108. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/tui/update_dialog.py +0 -0
  109. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/utilities.py +0 -0
  110. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/vector_memory.py +0 -0
  111. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli/workspace.py +0 -0
  112. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/dependency_links.txt +0 -0
  113. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/entry_points.txt +0 -0
  114. {utim_cli-2.1.0 → utim_cli-2.1.1}/utim_cli.egg-info/requires.txt +0 -0
  115. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.1.0
3
+ Version: 2.1.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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "utim-cli"
7
- version = "2.1.0"
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"
@@ -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.0"
8
+ __version__ = "2.1.1"
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.0"
14
+ VERSION = "2.1.1"
@@ -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 based on model context window:
176
- - < 200k context: every 10th iteration
177
- - 200k – 500k context: every 20th iteration
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
- Text(result, style="red"),
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 dynamic iteration compression interval based on current model's context window."""
3763
- try:
3764
- from .server.models import get_model
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 10, 20, 30, or 45 iterations depending on context window)
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: