utim-cli 2.5.0__tar.gz → 2.5.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 (204) hide show
  1. {utim_cli-2.5.0 → utim_cli-2.5.1}/CHANGELOG.md +7 -0
  2. {utim_cli-2.5.0/utim_cli.egg-info → utim_cli-2.5.1}/PKG-INFO +1 -1
  3. {utim_cli-2.5.0 → utim_cli-2.5.1}/pyproject.toml +1 -1
  4. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim/__init__.py +1 -1
  5. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/__init__.py +1 -1
  6. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/_version.py +1 -1
  7. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/context_pruner.py +47 -18
  8. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/cli_auth.py +19 -2
  9. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/firewall.py +4 -0
  10. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/router.py +16 -4
  11. {utim_cli-2.5.0 → utim_cli-2.5.1/utim_cli.egg-info}/PKG-INFO +1 -1
  12. {utim_cli-2.5.0 → utim_cli-2.5.1}/LICENSE +0 -0
  13. {utim_cli-2.5.0 → utim_cli-2.5.1}/MANIFEST.in +0 -0
  14. {utim_cli-2.5.0 → utim_cli-2.5.1}/README.md +0 -0
  15. {utim_cli-2.5.0 → utim_cli-2.5.1}/setup.cfg +0 -0
  16. {utim_cli-2.5.0 → utim_cli-2.5.1}/setup.py +0 -0
  17. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/_chip_test.py +0 -0
  18. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/_verify_repro.py +0 -0
  19. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/_verify_syntax.py +0 -0
  20. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/_wizard_smoke_test.py +0 -0
  21. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/agent.py +0 -0
  22. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/architecture_indexer.py +0 -0
  23. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/ask_helper.py +0 -0
  24. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/auth.py +0 -0
  25. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/backup.py +0 -0
  26. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/billing.py +0 -0
  27. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/blender_agent.py +0 -0
  28. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/bootstrap.py +0 -0
  29. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/brain.py +0 -0
  30. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/builtin/skills/utim-guide/SKILL.md +0 -0
  31. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/client_utils.py +0 -0
  32. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/config.py +0 -0
  33. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/constants.py +0 -0
  34. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/context_inspector.py +0 -0
  35. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/crawler/__init__.py +0 -0
  36. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/crawler/engine.py +0 -0
  37. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/crawler/markdown_distiller.py +0 -0
  38. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/dependency_manager.py +0 -0
  39. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/doctor.py +0 -0
  40. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/evidence_registry.py +0 -0
  41. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/harbor.py +0 -0
  42. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/knowledge_graph.py +0 -0
  43. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/local_db.py +0 -0
  44. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/logger.py +0 -0
  45. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/mcp_clean_wrapper.py +0 -0
  46. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/mcp_client.py +0 -0
  47. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/mcp_registry.json +0 -0
  48. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/models.txt +0 -0
  49. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/orchestrator.py +0 -0
  50. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/orchestrator_helpers.py +0 -0
  51. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/orchestrator_llm_transport.py +0 -0
  52. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/orchestrator_tool_exec.py +0 -0
  53. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/orchestrator_turn_history.py +0 -0
  54. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/personalities.py +0 -0
  55. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/platform_installer.py +0 -0
  56. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/__init__.py +0 -0
  57. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/hooks.py +0 -0
  58. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/loader.py +0 -0
  59. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/manager.py +0 -0
  60. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/registry.py +0 -0
  61. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/runtime.py +0 -0
  62. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/schema.py +0 -0
  63. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/plugins/tool_loader.py +0 -0
  64. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/reflection.py +0 -0
  65. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/report.py +0 -0
  66. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/scrapy_search.py +0 -0
  67. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/sdk/__init__.py +0 -0
  68. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/sdk/config.py +0 -0
  69. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/sdk/context.py +0 -0
  70. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/sdk/events.py +0 -0
  71. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/sdk/handlers.py +0 -0
  72. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/sdk/session.py +0 -0
  73. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/sdk/sidecar.py +0 -0
  74. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/__init__.py +0 -0
  75. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/admin_auth.py +0 -0
  76. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/api_batcher.py +0 -0
  77. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/api_models_db.py +0 -0
  78. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/attribution.py +0 -0
  79. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/audit_log.py +0 -0
  80. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/auth.py +0 -0
  81. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/batch_processor.py +0 -0
  82. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/captcha.py +0 -0
  83. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/concurrency.py +0 -0
  84. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/db.py +0 -0
  85. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
  86. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/about.md +0 -0
  87. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/changelog.md +0 -0
  88. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/docs.md +0 -0
  89. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/features.md +0 -0
  90. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/license.md +0 -0
  91. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/pricing.md +0 -0
  92. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/privacy.md +0 -0
  93. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/refund.md +0 -0
  94. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/support.md +0 -0
  95. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/docs_md/terms.md +0 -0
  96. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/email_utils.py +0 -0
  97. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/exchange_rate.py +0 -0
  98. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/firebase.py +0 -0
  99. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/fix_duplicate_users.py +0 -0
  100. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/history.py +0 -0
  101. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/hobby_throttler.py +0 -0
  102. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/key_rotator.py +0 -0
  103. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/local_llm.py +0 -0
  104. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/logging_config.py +0 -0
  105. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/maintenance.py +0 -0
  106. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/micro_batcher.py +0 -0
  107. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/model_agent.py +0 -0
  108. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/models.py +0 -0
  109. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/plan_integrity.py +0 -0
  110. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/platform_billing.py +0 -0
  111. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/pricing_updater.py +0 -0
  112. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/provider_balance.py +0 -0
  113. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/provider_discovery.py +0 -0
  114. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/provider_router.py +0 -0
  115. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/provision_build.py +0 -0
  116. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/rate_limit.py +0 -0
  117. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/request_batcher.py +0 -0
  118. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/request_queue.py +0 -0
  119. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/rewards_engine.py +0 -0
  120. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/__init__.py +0 -0
  121. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/admin_bonus_routes.py +0 -0
  122. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/admin_db_routes.py +0 -0
  123. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/admin_providers_routes.py +0 -0
  124. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/admin_separated_models_routes.py +0 -0
  125. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/api_gateway_extensions_routes.py +0 -0
  126. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/api_key_routes.py +0 -0
  127. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/api_models_admin_routes.py +0 -0
  128. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/api_models_public_routes.py +0 -0
  129. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/auth_routes.py +0 -0
  130. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/billing_routes.py +0 -0
  131. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/completion_routes.py +0 -0
  132. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/credit_routes.py +0 -0
  133. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/feedback_routes.py +0 -0
  134. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/marketplace_routes.py +0 -0
  135. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/provider_compat_routes.py +0 -0
  136. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/quota_routes.py +0 -0
  137. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/quota_share_routes.py +0 -0
  138. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/referral_routes.py +0 -0
  139. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/rewards_routes.py +0 -0
  140. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/security_routes.py +0 -0
  141. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/session_routes.py +0 -0
  142. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/share_routes.py +0 -0
  143. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/wallet_routes.py +0 -0
  144. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/routes/webhook_routes.py +0 -0
  145. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/security_alerts.py +0 -0
  146. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/server.py +0 -0
  147. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/signup_guard.py +0 -0
  148. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/storage_nodes.py +0 -0
  149. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/server/utils.py +0 -0
  150. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/share.py +0 -0
  151. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/share_tui.py +0 -0
  152. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/situational_scoring.py +0 -0
  153. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/state.py +0 -0
  154. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/subagent_manager.py +0 -0
  155. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/syntax_fix.py +0 -0
  156. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/task_dispatcher.py +0 -0
  157. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/task_logger.py +0 -0
  158. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tools.py +0 -0
  159. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tools_grep.py +0 -0
  160. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/__init__.py +0 -0
  161. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/compression_dialog.py +0 -0
  162. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/feedback_dialog.py +0 -0
  163. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/history_dialog.py +0 -0
  164. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/marketplace_app_state.py +0 -0
  165. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/marketplace_dialog.py +0 -0
  166. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/marketplace_layout_engine.py +0 -0
  167. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/mcp_dialog.py +0 -0
  168. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/miniagents_dialog.py +0 -0
  169. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/model_dialog.py +0 -0
  170. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/personality_dialog.py +0 -0
  171. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/plugins_dialog.py +0 -0
  172. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/publish_dialog.py +0 -0
  173. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/quota_dialog.py +0 -0
  174. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/quota_redeem_dialog.py +0 -0
  175. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/quota_share_dialog.py +0 -0
  176. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/resume_dialog.py +0 -0
  177. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/rewards_tui.py +0 -0
  178. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/skills_dialog.py +0 -0
  179. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/subagents_dialog.py +0 -0
  180. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/tasks_dialog.py +0 -0
  181. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/thinking_display.py +0 -0
  182. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/tools_dialog.py +0 -0
  183. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/tui/update_dialog.py +0 -0
  184. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/update_checker.py +0 -0
  185. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/utilities.py +0 -0
  186. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/utim.py +0 -0
  187. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/utimmodel.txt +0 -0
  188. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/vector_memory.py +0 -0
  189. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice.py +0 -0
  190. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_coding.py +0 -0
  191. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_events.py +0 -0
  192. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_handler.py +0 -0
  193. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_instant.py +0 -0
  194. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_orchestrator.py +0 -0
  195. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_session.py +0 -0
  196. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_stt.py +0 -0
  197. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/voice_tts.py +0 -0
  198. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/wheel.py +0 -0
  199. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli/workspace.py +0 -0
  200. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli.egg-info/SOURCES.txt +0 -0
  201. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli.egg-info/dependency_links.txt +0 -0
  202. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli.egg-info/entry_points.txt +0 -0
  203. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli.egg-info/requires.txt +0 -0
  204. {utim_cli-2.5.0 → utim_cli-2.5.1}/utim_cli.egg-info/top_level.txt +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.5.1] - 2026-10-18
4
+
5
+ ### 🐛 Fixes
6
+ - **Compression Empty-Response Spam**: `_call_compression_model_with_fallback` now always sets `last_error` on empty/stripped content and logs `model=… routing=… empty_hits=…` diagnostics — eliminates the endless `[COMPRESSION FALLBACK FAILURE] Last error: None` loop and surfaces the real reason (429 / empty content / bad shape).
7
+ - **Admin Portal CORS**: `router.py` now always allows `Origin: null` (downloaded `file://` HTML) and `allow_headers=["*"]` + `max_age=600` so `X-UTIM-Master-Key` / `Authorization` preflights for `/api/admin/*` and `/models` no longer fail with `No 'Access-Control-Allow-Origin'`.
8
+ - **Admin Firewall Bypass**: `firewall.py: _FIREWALL_SKIP_PREFIXES` and `cli_auth.py: PUBLIC_PREFIXES` now include `/admin`, `/admin.html`, `/admin_models.html`, `/static` so the browser-served admin panel bypasses proxy-abuse / burst throttling and CLI HMAC `401` (API auth via master-key session is still enforced).
9
+
3
10
  ## [2.5.0] - 2026-10-18
4
11
 
5
12
  ### ✨ Credit System → Unlimited UX + Internal Throttling
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.5.0
3
+ Version: 2.5.1
4
4
  Summary: UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal.
5
5
  License: Emend AI Proprietary EULA
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.5.0"
7
+ version = "2.5.1"
8
8
 
9
9
  description = "UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal."
10
10
  readme = "README.md"
@@ -14,7 +14,7 @@ Quickstart:
14
14
  try:
15
15
  from utim_cli._version import VERSION as __version__
16
16
  except ImportError:
17
- __version__ = "2.5.0"
17
+ __version__ = "2.5.1"
18
18
 
19
19
  # Developer-friendly core classes (similar to `import genai` / `import openai`)
20
20
  from utim_cli.sdk.session import UtimSession as Session
@@ -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.5.0"
8
+ __version__ = "2.5.1"
9
9
 
10
10
 
11
11
  import builtins, os, pathlib, urllib.parse, re
@@ -11,6 +11,6 @@
11
11
  # from here so every surface stays in sync automatically.
12
12
  # ─────────────────────────────────────────────────────────────────────────────
13
13
 
14
- VERSION = "2.5.0"
14
+ VERSION = "2.5.1"
15
15
 
16
16
 
@@ -2229,6 +2229,7 @@ def _call_compression_model_with_fallback(messages: List[Dict], llm_key: str, ma
2229
2229
  _routing = _resolve_compression_routing(primary_model)
2230
2230
 
2231
2231
  last_error = None
2232
+ empty_hits = 0
2232
2233
  for i, model in enumerate(models_to_try):
2233
2234
  model_retries = 1 if model == primary_model else 2
2234
2235
  for attempt in range(model_retries + 1):
@@ -2251,56 +2252,84 @@ def _call_compression_model_with_fallback(messages: List[Dict], llm_key: str, ma
2251
2252
  is_reflection=False
2252
2253
  )
2253
2254
  if resp.status_code == 429:
2254
- # On 429 rate limit, immediately try fallback without blocking
2255
+ last_error = f"Model {model} rate limited (429)"
2255
2256
  break
2256
2257
  resp.raise_for_status()
2257
-
2258
+
2258
2259
  if resp.status_code == 200:
2259
- result = resp.json()["choices"][0]["message"]["content"]
2260
- if not result or not result.strip():
2260
+ try:
2261
+ body = resp.json()
2262
+ except Exception as je:
2263
+ last_error = f"Model {model} returned non-JSON 200: {je}"
2264
+ break
2265
+ try:
2266
+ result = body["choices"][0]["message"]["content"]
2267
+ except Exception as ke:
2268
+ last_error = f"Model {model} bad 200 shape {list(body.keys()) if isinstance(body, dict) else type(body).__name__}: {ke} body={str(body)[:600]}"
2269
+ break
2270
+ if not result or not str(result).strip():
2271
+ empty_hits += 1
2272
+ last_error = f"Model {model} returned empty content (hit {empty_hits}/2)"
2273
+ if empty_hits >= 2:
2274
+ break
2261
2275
  continue
2262
2276
  # Strip thinking tags
2263
- result = re.sub(r"<think(?:ing)?>.*?</think(?:ing)?>", "", result, flags=re.DOTALL)
2277
+ result = re.sub(r"<think(?:ing)?>.*?</think(?:ing)?>", "", str(result), flags=re.DOTALL)
2264
2278
  result = result.strip()
2265
2279
  if not result:
2280
+ empty_hits += 1
2281
+ last_error = f"Model {model} content empty after stripping thinking tags (hit {empty_hits}/2)"
2282
+ if empty_hits >= 2:
2283
+ break
2266
2284
  continue
2267
-
2285
+
2268
2286
  # FIX #1: Hallucination detection - reject summaries with suspicious patterns
2287
+ hallucinated = False
2269
2288
  hallucination_patterns = [
2270
2289
  r"\[.*added.*\]", # Made-up additions like "[feature added]"
2271
2290
  r"\[.*created.*\]", # Made-up creations
2272
2291
  r"I have (?:created|modified|deleted|implemented)", # False claims of action
2273
2292
  r"Successfully (?:added|removed|integrated)", # False success claims
2274
2293
  ]
2275
-
2276
- # Check if summary makes claims not in source
2277
2294
  for pattern in hallucination_patterns:
2278
2295
  if re.search(pattern, result, re.I) and content_hint:
2279
- # Check if the claim is actually in the original content
2280
2296
  if not re.search(pattern.replace(r"\[", r"[^[]*").replace(r"\]", r"[^]]*"), content_hint, re.I):
2281
2297
  print(f"[HALLUCINATION PREVENTED] Pattern '{pattern}' detected in summary but not in source", file=__import__('sys'))
2282
- # Try next model instead of returning bad summary
2283
- continue
2284
-
2298
+ last_error = f"Model {model} hallucination rejected pattern={pattern}"
2299
+ hallucinated = True
2300
+ break
2301
+ if hallucinated:
2302
+ continue
2303
+
2285
2304
  return result
2286
-
2287
- last_error = f"Model {model} returned status {resp.status_code}"
2305
+
2306
+ last_error = f"Model {model} returned status {resp.status_code}: {str(getattr(resp, 'content_str', '') or '')[:600]}"
2288
2307
  break # Not 200 and not 429, break attempt loop and try next model
2289
2308
 
2290
2309
  except requests.exceptions.HTTPError as e:
2291
2310
  code = e.response.status_code if e.response is not None else 0
2311
+ body_snip = ""
2312
+ try:
2313
+ body_snip = (e.response.text[:600] if getattr(e, "response", None) is not None and hasattr(e.response, "text") else str(e)[:600])
2314
+ except Exception:
2315
+ body_snip = str(e)[:600]
2316
+ last_error = f"HTTPError {code} model={model}: {body_snip}"
2292
2317
  if code == 429 and attempt < model_retries:
2293
2318
  import time
2294
2319
  time.sleep(5 * (attempt + 1))
2295
2320
  continue
2296
- last_error = e
2297
2321
  break
2298
2322
  except Exception as e:
2299
- last_error = e
2323
+ last_error = f"{type(e).__name__} model={model}: {e}"
2300
2324
  break
2301
-
2302
- # Log the failure for debugging
2325
+
2326
+ # Log the failure for debugging — include model/routing so "Last error: None" never happens
2303
2327
  import sys
2328
+ diag = f"model={primary_model} routing={_routing} empty_hits={empty_hits}"
2329
+ if last_error is None:
2330
+ last_error = f"No attempt produced a result ({diag})"
2331
+ else:
2332
+ last_error = f"{last_error} ({diag})"
2304
2333
  print(f"[COMPRESSION FALLBACK FAILURE] All models failed. Last error: {last_error}", file=sys.stderr)
2305
2334
  return None
2306
2335
 
@@ -91,6 +91,13 @@ PUBLIC_PREFIXES = (
91
91
  "/auth/firebase-login",
92
92
  "/auth/register",
93
93
  "/auth/reset",
94
+ # Admin HTML portal — browser-served, authenticated via admin_auth (master key
95
+ # / session cookie), never via CLI HMAC. Must stay public for signature
96
+ # purposes or browsers get 401 when UTIM_REQUIRE_CLI_SIGNATURE=1.
97
+ "/admin",
98
+ "/admin.html",
99
+ "/admin_models.html",
100
+ "/static",
94
101
  )
95
102
 
96
103
 
@@ -363,8 +370,18 @@ async def cli_signature_middleware(request, call_next):
363
370
  if is_public_path(path) or request.method == "OPTIONS":
364
371
  return await call_next(request)
365
372
 
366
- # Bypass CLI signature requirement for Admin Agent endpoints and Master Key authenticated calls
367
- if request.headers.get("x-utim-master-key") or request.headers.get("X-UTIM-Master-Key") or path.startswith("/api/admin/"):
373
+ # Bypass CLI signature requirement for Admin Agent endpoints, Master Key
374
+ # authenticated calls, and any /admin / static HTML (admin portal in browser).
375
+ if (
376
+ request.headers.get("x-utim-master-key")
377
+ or request.headers.get("X-UTIM-Master-Key")
378
+ or path.startswith("/api/admin/")
379
+ or path == "/admin"
380
+ or path == "/admin.html"
381
+ or path == "/admin_models.html"
382
+ or path.startswith("/admin/")
383
+ or path.startswith("/static/")
384
+ ):
368
385
  return await call_next(request)
369
386
 
370
387
  sig = request.headers.get("x-utim-cli-signature")
@@ -370,6 +370,10 @@ _FIREWALL_SKIP_PREFIXES = (
370
370
  "/openapi.json",
371
371
  "/models",
372
372
  "/api/releases",
373
+ "/admin",
374
+ "/admin.html",
375
+ "/admin_models.html",
376
+ "/static",
373
377
  )
374
378
 
375
379
  # Expensive paths that MUST NOT be reachable via open proxies
@@ -408,18 +408,30 @@ else:
408
408
  "http://127.0.0.1:8080",
409
409
  ]
410
410
 
411
- # Deduplicate while preserving order
411
+ # Deduplicate while preserving order, then always allow `null` (file://) so
412
+ # downloading admin_models.html and double-clicking it doesn't brick CORS.
413
+ # ALLOWED_ORIGINS env override must not accidentally drop it.
412
414
  _seen = set()
413
415
  allowed_origins = [o for o in allowed_origins if not (o in _seen or _seen.add(o))]
414
-
416
+ if "null" not in allowed_origins:
417
+ allowed_origins.append("null")
418
+
419
+ # Admin portal (admin_models.html) sends X-UTIM-Master-Key / X-Admin-Key /
420
+ # Authorization which MUST be in allow_headers or every preflight fails with
421
+ # "No 'Access-Control-Allow-Origin'" — that's what your screenshot shows.
422
+ # Starlette's CORSMiddleware with allow_headers=["*"] + allow_credentials=True
423
+ # echoes Access-Control-Request-Headers correctly on modern browsers, but we
424
+ # also keep an explicit fallback list for older engines. Using ["*"] covers
425
+ # any future X-UTIM-* headers without another CORS breakage.
415
426
  app.add_middleware(
416
427
  CORSMiddleware,
417
428
  allow_origins=allowed_origins,
418
429
  allow_origin_regex=r"^https://([a-zA-Z0-9_\-]+\.)*(utim\.dev)(:\d+)?$",
419
430
  allow_credentials=True,
420
431
  allow_methods=["GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"],
421
- allow_headers=["Authorization", "Content-Type", "X-Requested-With", "X-CSRF-Token", "Accept"],
422
- expose_headers=["Content-Length", "Content-Type"],
432
+ allow_headers=["*"],
433
+ expose_headers=["Content-Length", "Content-Type", "X-Total-Count"],
434
+ max_age=600,
423
435
  )
424
436
 
425
437
  app.include_router(auth_router)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.5.0
3
+ Version: 2.5.1
4
4
  Summary: UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal.
5
5
  License: Emend AI Proprietary EULA
6
6
  Project-URL: Homepage, https://utim.dev
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes