utim-cli 2.4.1__tar.gz → 2.4.2__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 (200) hide show
  1. {utim_cli-2.4.1 → utim_cli-2.4.2}/CHANGELOG.md +14 -0
  2. {utim_cli-2.4.1/utim_cli.egg-info → utim_cli-2.4.2}/PKG-INFO +2 -1
  3. {utim_cli-2.4.1 → utim_cli-2.4.2}/pyproject.toml +2 -1
  4. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim/__init__.py +1 -1
  5. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/__init__.py +1 -1
  6. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/_version.py +1 -1
  7. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/agent.py +44 -0
  8. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/architecture_indexer.py +269 -251
  9. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/ask_helper.py +5 -4
  10. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/bootstrap.py +7 -0
  11. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/brain.py +179 -202
  12. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/client_utils.py +185 -48
  13. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/config.py +6 -1
  14. utim_cli-2.4.2/utim_cli/constants.py +118 -0
  15. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/context_pruner.py +45 -46
  16. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/crawler/engine.py +187 -14
  17. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/harbor.py +212 -201
  18. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/mcp_client.py +359 -359
  19. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/orchestrator.py +204 -109
  20. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/orchestrator_helpers.py +163 -193
  21. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/orchestrator_llm_transport.py +134 -49
  22. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/orchestrator_tool_exec.py +35 -9
  23. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/orchestrator_turn_history.py +165 -34
  24. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/schema.py +257 -257
  25. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/reflection.py +43 -4
  26. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/sdk/session.py +340 -340
  27. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/admin_auth.py +6 -0
  28. utim_cli-2.4.2/utim_cli/server/api_models_db.py +1287 -0
  29. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/auth.py +142 -22
  30. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/captcha.py +74 -7
  31. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/concurrency.py +40 -0
  32. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/db.py +325 -18
  33. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/docs.md +1 -1
  34. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/pricing.md +24 -24
  35. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/email_utils.py +80 -1
  36. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/key_rotator.py +127 -2
  37. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/logging_config.py +1 -1
  38. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/micro_batcher.py +343 -343
  39. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/models.py +535 -228
  40. utim_cli-2.4.2/utim_cli/server/platform_billing.py +217 -0
  41. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/pricing_updater.py +211 -198
  42. utim_cli-2.4.2/utim_cli/server/provider_balance.py +472 -0
  43. utim_cli-2.4.2/utim_cli/server/provider_discovery.py +546 -0
  44. utim_cli-2.4.2/utim_cli/server/provider_router.py +847 -0
  45. utim_cli-2.4.2/utim_cli/server/rate_limit.py +112 -0
  46. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/router.py +393 -149
  47. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/__init__.py +8 -0
  48. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/admin_db_routes.py +95 -0
  49. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/admin_providers_routes.py +68 -0
  50. utim_cli-2.4.2/utim_cli/server/routes/api_gateway_extensions_routes.py +544 -0
  51. utim_cli-2.4.2/utim_cli/server/routes/api_key_routes.py +117 -0
  52. utim_cli-2.4.2/utim_cli/server/routes/api_models_admin_routes.py +967 -0
  53. utim_cli-2.4.2/utim_cli/server/routes/api_models_public_routes.py +2879 -0
  54. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/auth_routes.py +100 -17
  55. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/billing_routes.py +276 -276
  56. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/completion_routes.py +261 -109
  57. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/credit_routes.py +2 -2
  58. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/feedback_routes.py +106 -88
  59. utim_cli-2.4.2/utim_cli/server/routes/provider_compat_routes.py +575 -0
  60. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/quota_routes.py +131 -102
  61. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/quota_share_routes.py +768 -768
  62. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/rewards_routes.py +95 -62
  63. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/session_routes.py +201 -201
  64. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/share_routes.py +369 -369
  65. utim_cli-2.4.2/utim_cli/server/routes/wallet_routes.py +193 -0
  66. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/webhook_routes.py +58 -7
  67. utim_cli-2.4.2/utim_cli/server/signup_guard.py +237 -0
  68. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/utils.py +354 -3
  69. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/state.py +1 -0
  70. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/subagent_manager.py +1621 -1548
  71. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tools.py +1056 -82
  72. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/model_dialog.py +345 -73
  73. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/resume_dialog.py +1 -1
  74. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/tools_dialog.py +9 -1
  75. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/utim.py +330 -60
  76. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/voice.py +23 -6
  77. utim_cli-2.4.2/utim_cli/voice_coding.py +288 -0
  78. utim_cli-2.4.2/utim_cli/voice_events.py +409 -0
  79. utim_cli-2.4.2/utim_cli/voice_handler.py +695 -0
  80. utim_cli-2.4.2/utim_cli/voice_instant.py +233 -0
  81. utim_cli-2.4.2/utim_cli/voice_orchestrator.py +392 -0
  82. utim_cli-2.4.2/utim_cli/voice_session.py +964 -0
  83. utim_cli-2.4.2/utim_cli/voice_stt.py +502 -0
  84. utim_cli-2.4.2/utim_cli/voice_tts.py +955 -0
  85. {utim_cli-2.4.1 → utim_cli-2.4.2/utim_cli.egg-info}/PKG-INFO +2 -1
  86. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli.egg-info/SOURCES.txt +19 -0
  87. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli.egg-info/requires.txt +1 -0
  88. utim_cli-2.4.1/utim_cli/constants.py +0 -50
  89. utim_cli-2.4.1/utim_cli/server/rate_limit.py +0 -38
  90. utim_cli-2.4.1/utim_cli/voice_handler.py +0 -0
  91. {utim_cli-2.4.1 → utim_cli-2.4.2}/LICENSE +0 -0
  92. {utim_cli-2.4.1 → utim_cli-2.4.2}/MANIFEST.in +0 -0
  93. {utim_cli-2.4.1 → utim_cli-2.4.2}/README.md +0 -0
  94. {utim_cli-2.4.1 → utim_cli-2.4.2}/setup.cfg +0 -0
  95. {utim_cli-2.4.1 → utim_cli-2.4.2}/setup.py +0 -0
  96. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/_chip_test.py +0 -0
  97. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/_verify_repro.py +0 -0
  98. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/_verify_syntax.py +0 -0
  99. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/_wizard_smoke_test.py +0 -0
  100. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/auth.py +0 -0
  101. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/backup.py +0 -0
  102. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/billing.py +0 -0
  103. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/blender_agent.py +0 -0
  104. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/builtin/skills/utim-guide/SKILL.md +0 -0
  105. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/context_inspector.py +0 -0
  106. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/crawler/__init__.py +0 -0
  107. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/crawler/markdown_distiller.py +0 -0
  108. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/dependency_manager.py +0 -0
  109. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/doctor.py +0 -0
  110. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/evidence_registry.py +0 -0
  111. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/knowledge_graph.py +0 -0
  112. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/local_db.py +0 -0
  113. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/logger.py +0 -0
  114. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/mcp_clean_wrapper.py +0 -0
  115. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/mcp_registry.json +0 -0
  116. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/models.txt +0 -0
  117. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/personalities.py +0 -0
  118. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/platform_installer.py +0 -0
  119. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/__init__.py +0 -0
  120. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/hooks.py +0 -0
  121. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/loader.py +0 -0
  122. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/manager.py +0 -0
  123. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/registry.py +0 -0
  124. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/runtime.py +0 -0
  125. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/plugins/tool_loader.py +0 -0
  126. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/report.py +0 -0
  127. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/scrapy_search.py +0 -0
  128. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/sdk/__init__.py +0 -0
  129. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/sdk/config.py +0 -0
  130. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/sdk/context.py +0 -0
  131. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/sdk/events.py +0 -0
  132. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/sdk/handlers.py +0 -0
  133. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/sdk/sidecar.py +0 -0
  134. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/__init__.py +0 -0
  135. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/attribution.py +0 -0
  136. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/audit_log.py +0 -0
  137. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/batch_processor.py +0 -0
  138. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/cli_auth.py +0 -0
  139. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
  140. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/about.md +0 -0
  141. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/changelog.md +0 -0
  142. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/features.md +0 -0
  143. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/license.md +0 -0
  144. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/privacy.md +0 -0
  145. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/refund.md +0 -0
  146. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/support.md +0 -0
  147. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/docs_md/terms.md +0 -0
  148. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/exchange_rate.py +0 -0
  149. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/firebase.py +0 -0
  150. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/fix_duplicate_users.py +0 -0
  151. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/history.py +0 -0
  152. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/local_llm.py +0 -0
  153. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/model_agent.py +0 -0
  154. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/plan_integrity.py +0 -0
  155. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/provision_build.py +0 -0
  156. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/rewards_engine.py +0 -0
  157. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/admin_bonus_routes.py +0 -0
  158. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/marketplace_routes.py +0 -0
  159. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/referral_routes.py +0 -0
  160. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/routes/security_routes.py +0 -0
  161. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/security_alerts.py +0 -0
  162. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/server.py +0 -0
  163. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/server/storage_nodes.py +0 -0
  164. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/share.py +0 -0
  165. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/share_tui.py +0 -0
  166. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/situational_scoring.py +0 -0
  167. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/syntax_fix.py +0 -0
  168. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/task_dispatcher.py +0 -0
  169. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/task_logger.py +0 -0
  170. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tools_grep.py +0 -0
  171. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/__init__.py +0 -0
  172. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/compression_dialog.py +0 -0
  173. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/feedback_dialog.py +0 -0
  174. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/history_dialog.py +0 -0
  175. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/marketplace_app_state.py +0 -0
  176. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/marketplace_dialog.py +0 -0
  177. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/marketplace_layout_engine.py +0 -0
  178. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/mcp_dialog.py +0 -0
  179. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/miniagents_dialog.py +0 -0
  180. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/personality_dialog.py +0 -0
  181. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/plugins_dialog.py +0 -0
  182. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/publish_dialog.py +0 -0
  183. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/quota_dialog.py +0 -0
  184. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/quota_redeem_dialog.py +0 -0
  185. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/quota_share_dialog.py +0 -0
  186. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/rewards_tui.py +0 -0
  187. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/skills_dialog.py +0 -0
  188. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/subagents_dialog.py +0 -0
  189. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/tasks_dialog.py +0 -0
  190. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/thinking_display.py +0 -0
  191. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/tui/update_dialog.py +0 -0
  192. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/update_checker.py +0 -0
  193. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/utilities.py +0 -0
  194. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/utimmodel.txt +0 -0
  195. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/vector_memory.py +0 -0
  196. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/wheel.py +0 -0
  197. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli/workspace.py +0 -0
  198. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli.egg-info/dependency_links.txt +0 -0
  199. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli.egg-info/entry_points.txt +0 -0
  200. {utim_cli-2.4.1 → utim_cli-2.4.2}/utim_cli.egg-info/top_level.txt +0 -0
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.4.2] - 2026-10-13
4
+
5
+ ### 🤖 Sub-Agent Swarm Model Configuration & Hardcoded Lock
6
+ - **Swarm Model Settings in `/model`**: Added a dedicated configuration section in the `/model` dialog allowing users to choose the model used across all swarm subagents.
7
+ - **Strict User Lock**: When a specific model is selected, it is hardcoded—the main agent cannot override or change it, even if custom `model_id` parameters are passed to `invoke_subagents`.
8
+ - **Dynamic Auto Mode**: Added a "Let the agent decide (Auto)" option allowing the main agent to dynamically assign models per task or fall back to its active model.
9
+
10
+ ### ⚡ Non-Interactive Command Execution (`--hard-skip-perms`)
11
+ - **Hard Skip Permissions**: Added the `--hard-skip-perms` CLI flag, `UTIM_HARD_SKIP_PERMS=1` environment variable, and `/hard-skip-perms` slash command.
12
+ - **Unrestricted Command Execution**: Automatically approves terminal commands without prompting for user confirmation, even for unsafe or destructive commands.
13
+
14
+ ### 🐛 Bug Fixes
15
+ - **Premature Halting Fix**: Fixed an issue where the model abruptly stopped if it completed inspection tools and emitted an action promise without executing further mutation tools, now triggering an automatic continuation nudge.
16
+
3
17
  ## [2.4.1] - 2026-09-18
4
18
 
5
19
  ### Bug Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.4.1
3
+ Version: 2.4.2
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
@@ -22,6 +22,7 @@ Description-Content-Type: text/markdown
22
22
  License-File: LICENSE
23
23
  Requires-Dist: requests==2.31.0
24
24
  Requires-Dist: aiohttp>=3.9.5
25
+ Requires-Dist: httpx>=0.25.0
25
26
  Requires-Dist: python-dotenv==1.0.1
26
27
  Requires-Dist: urllib3==1.26.18
27
28
  Requires-Dist: charset-normalizer==3.3.2
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "utim-cli"
7
- version = "2.4.1"
7
+ version = "2.4.2"
8
8
 
9
9
  description = "UTIM – Universal Terminal Intelligence Manager. A powerful agentic AI coding assistant for your terminal."
10
10
  readme = "README.md"
@@ -25,6 +25,7 @@ classifiers = [
25
25
  dependencies = [
26
26
  "requests==2.31.0",
27
27
  "aiohttp>=3.9.5",
28
+ "httpx>=0.25.0",
28
29
  "python-dotenv==1.0.1",
29
30
  "urllib3==1.26.18",
30
31
  "charset-normalizer==3.3.2",
@@ -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.4.1"
17
+ __version__ = "2.4.2"
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.4.1"
8
+ __version__ = "2.4.2"
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.4.1"
14
+ VERSION = "2.4.2"
15
15
 
16
16
 
@@ -454,6 +454,15 @@ class ReActAgent:
454
454
  "tool_calls": tool_calls,
455
455
  })
456
456
 
457
+ # Clear any stale vision images and videos from a previous iteration
458
+ try:
459
+ import utim_cli.tools as _tools_module
460
+ _tools_module._pending_vision_images.clear()
461
+ _tools_module._pending_vision_videos.clear()
462
+ _tools_module._active_model_id = self.model_id
463
+ except Exception:
464
+ pass
465
+
457
466
  # Execute each tool call
458
467
  for i, tc in enumerate(tool_calls):
459
468
  result = self._execute_tool_call(tc)
@@ -465,6 +474,41 @@ class ReActAgent:
465
474
  "tool_call_id": tc_id,
466
475
  "content": result,
467
476
  })
477
+
478
+ # Drain and inject vision images & native videos into conversation
479
+ try:
480
+ import utim_cli.tools as _tools_module
481
+ _vision_queue = getattr(_tools_module, "_pending_vision_images", [])
482
+ for _vimg in list(_vision_queue or []):
483
+ self.messages.append({
484
+ "role": "user",
485
+ "content": [
486
+ {"type": "text", "text": _vimg.get("group_header") or f"[{_vimg.get('meta', 'Image')}]"},
487
+ {
488
+ "type": "image_url",
489
+ "image_url": {"url": f"data:{_vimg['mime']};base64,{_vimg['b64']}"},
490
+ },
491
+ ],
492
+ })
493
+ if _vision_queue:
494
+ _vision_queue.clear()
495
+
496
+ _video_queue = getattr(_tools_module, "_pending_vision_videos", [])
497
+ for _vent in list(_video_queue or []):
498
+ self.messages.append({
499
+ "role": "user",
500
+ "content": [
501
+ {"type": "text", "text": _vent.get("header") or f"[Video: {_vent.get('filepath', '')}]"},
502
+ {
503
+ "type": "video_url",
504
+ "video_url": {"url": f"data:{_vent['mime']};base64,{_vent['b64']}"},
505
+ },
506
+ ],
507
+ })
508
+ if _video_queue:
509
+ _video_queue.clear()
510
+ except Exception:
511
+ pass
468
512
  else:
469
513
  self.console.print(f"\n[bold yellow]Agent paused after reaching maximum iterations ({max_iterations}).[/bold yellow]")
470
514
  self.console.print("[dim]You can type 'continue' to resume the task.[/dim]\n")