utim-cli 2.3.0__tar.gz → 2.3.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 (147) hide show
  1. {utim_cli-2.3.0 → utim_cli-2.3.2}/CHANGELOG.md +10 -0
  2. {utim_cli-2.3.0/utim_cli.egg-info → utim_cli-2.3.2}/PKG-INFO +1 -1
  3. {utim_cli-2.3.0 → utim_cli-2.3.2}/pyproject.toml +3 -2
  4. utim_cli-2.3.2/utim/__init__.py +76 -0
  5. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/__init__.py +1 -1
  6. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/_version.py +1 -1
  7. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/orchestrator.py +84 -36
  8. utim_cli-2.3.2/utim_cli/plugins/__init__.py +10 -0
  9. utim_cli-2.3.2/utim_cli/plugins/manager.py +465 -0
  10. utim_cli-2.3.2/utim_cli/plugins/registry.py +120 -0
  11. utim_cli-2.3.2/utim_cli/plugins/schema.py +230 -0
  12. utim_cli-2.3.2/utim_cli/sdk/__init__.py +52 -0
  13. utim_cli-2.3.2/utim_cli/sdk/config.py +41 -0
  14. utim_cli-2.3.2/utim_cli/sdk/context.py +67 -0
  15. utim_cli-2.3.2/utim_cli/sdk/events.py +166 -0
  16. utim_cli-2.3.2/utim_cli/sdk/handlers.py +60 -0
  17. utim_cli-2.3.2/utim_cli/sdk/session.py +333 -0
  18. utim_cli-2.3.2/utim_cli/sdk/sidecar.py +164 -0
  19. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/auth.py +11 -1
  20. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/docs.md +1 -0
  21. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/features.md +1 -0
  22. utim_cli-2.3.2/utim_cli/server/local_llm.py +39 -0
  23. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/rate_limit.py +9 -5
  24. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/router.py +71 -37
  25. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/__init__.py +3 -1
  26. utim_cli-2.3.2/utim_cli/server/routes/admin_db_routes.py +507 -0
  27. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/completion_routes.py +22 -4
  28. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/quota_routes.py +76 -12
  29. utim_cli-2.3.2/utim_cli/server/server.py +94 -0
  30. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/task_dispatcher.py +61 -18
  31. utim_cli-2.3.2/utim_cli/tui/plugins_dialog.py +351 -0
  32. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/utim.py +17 -12
  33. {utim_cli-2.3.0 → utim_cli-2.3.2/utim_cli.egg-info}/PKG-INFO +1 -1
  34. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/SOURCES.txt +14 -6
  35. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/top_level.txt +1 -0
  36. utim_cli-2.3.0/utim_cli/_check_obj.py +0 -9
  37. utim_cli-2.3.0/utim_cli/_find_mcp.py +0 -9
  38. utim_cli-2.3.0/utim_cli/_find_plan.py +0 -12
  39. utim_cli-2.3.0/utim_cli/_find_tool.py +0 -10
  40. utim_cli-2.3.0/utim_cli/_patch_multimodal.py +0 -125
  41. utim_cli-2.3.0/utim_cli/_test_regex.py +0 -22
  42. utim_cli-2.3.0/utim_cli/server/local_llm.py +0 -380
  43. utim_cli-2.3.0/utim_cli/server/server.py +0 -60
  44. {utim_cli-2.3.0 → utim_cli-2.3.2}/LICENSE +0 -0
  45. {utim_cli-2.3.0 → utim_cli-2.3.2}/MANIFEST.in +0 -0
  46. {utim_cli-2.3.0 → utim_cli-2.3.2}/README.md +0 -0
  47. {utim_cli-2.3.0 → utim_cli-2.3.2}/setup.cfg +0 -0
  48. {utim_cli-2.3.0 → utim_cli-2.3.2}/setup.py +0 -0
  49. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/agent.py +0 -0
  50. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/ask_helper.py +0 -0
  51. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/auth.py +0 -0
  52. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/backup.py +0 -0
  53. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/billing.py +0 -0
  54. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/blender_agent.py +0 -0
  55. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/bootstrap.py +0 -0
  56. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/brain.py +0 -0
  57. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/client_utils.py +0 -0
  58. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/config.py +0 -0
  59. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/constants.py +0 -0
  60. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/context_pruner.py +0 -0
  61. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/doctor.py +0 -0
  62. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/harbor.py +0 -0
  63. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/knowledge_graph.py +0 -0
  64. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/local_db.py +0 -0
  65. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/logger.py +0 -0
  66. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/mcp_clean_wrapper.py +0 -0
  67. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/mcp_client.py +0 -0
  68. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/mcp_registry.json +0 -0
  69. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/models.txt +0 -0
  70. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/reflection.py +0 -0
  71. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/report.py +0 -0
  72. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/scrapy_search.py +0 -0
  73. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/__init__.py +0 -0
  74. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/admin_auth.py +0 -0
  75. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/attribution.py +0 -0
  76. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/audit_log.py +0 -0
  77. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/batch_processor.py +0 -0
  78. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/captcha.py +0 -0
  79. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/cli_auth.py +0 -0
  80. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/db.py +0 -0
  81. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
  82. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/about.md +0 -0
  83. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/changelog.md +0 -0
  84. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/license.md +0 -0
  85. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/pricing.md +0 -0
  86. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/privacy.md +0 -0
  87. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/refund.md +0 -0
  88. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/support.md +0 -0
  89. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/terms.md +0 -0
  90. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/email_utils.py +0 -0
  91. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/exchange_rate.py +0 -0
  92. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/firebase.py +0 -0
  93. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/fix_duplicate_users.py +0 -0
  94. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/history.py +0 -0
  95. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/logging_config.py +0 -0
  96. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/micro_batcher.py +0 -0
  97. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/model_agent.py +0 -0
  98. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/models.py +0 -0
  99. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/pricing_updater.py +0 -0
  100. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/provision_build.py +0 -0
  101. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/rewards_engine.py +0 -0
  102. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/auth_routes.py +0 -0
  103. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/billing_routes.py +0 -0
  104. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/credit_routes.py +0 -0
  105. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/feedback_routes.py +0 -0
  106. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/marketplace_routes.py +0 -0
  107. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/quota_share_routes.py +0 -0
  108. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/referral_routes.py +0 -0
  109. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/rewards_routes.py +0 -0
  110. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/security_routes.py +0 -0
  111. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/session_routes.py +0 -0
  112. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/share_routes.py +0 -0
  113. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/storage_nodes.py +0 -0
  114. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/share.py +0 -0
  115. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/share_tui.py +0 -0
  116. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/situational_scoring.py +0 -0
  117. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/state.py +0 -0
  118. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/subagent_manager.py +0 -0
  119. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tools.py +0 -0
  120. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/__init__.py +0 -0
  121. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/feedback_dialog.py +0 -0
  122. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/history_dialog.py +0 -0
  123. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/marketplace_app_state.py +0 -0
  124. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/marketplace_dialog.py +0 -0
  125. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/marketplace_layout_engine.py +0 -0
  126. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/mcp_dialog.py +0 -0
  127. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/miniagents_dialog.py +0 -0
  128. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/model_dialog.py +0 -0
  129. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/publish_dialog.py +0 -0
  130. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/quota_dialog.py +0 -0
  131. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/quota_redeem_dialog.py +0 -0
  132. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/quota_share_dialog.py +0 -0
  133. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/resume_dialog.py +0 -0
  134. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/rewards_tui.py +0 -0
  135. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/skills_dialog.py +0 -0
  136. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/subagents_dialog.py +0 -0
  137. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/thinking_display.py +0 -0
  138. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/tools_dialog.py +0 -0
  139. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/update_dialog.py +0 -0
  140. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/utilities.py +0 -0
  141. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/utimmodel.txt +0 -0
  142. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/vector_memory.py +0 -0
  143. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/wheel.py +0 -0
  144. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/workspace.py +0 -0
  145. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/dependency_links.txt +0 -0
  146. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/entry_points.txt +0 -0
  147. {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/requires.txt +0 -0
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.3.2] - 2026-08-20
4
+
5
+ ### 🚀 Performance & Fixes
6
+ - Token usage optimization and bug fixes
7
+
8
+ ## [2.3.1] - 2026-08-19
9
+
10
+ ### 🛠️ Fixes & Enhancements
11
+ - Major bug fixes in agent loop and enhancements
12
+
3
13
  ## [2.3.0] - 2026-08-18
4
14
 
5
15
  ### 🚀 Features & Enhancements
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utim-cli
3
- Version: 2.3.0
3
+ Version: 2.3.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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "utim-cli"
7
- version = "2.3.0"
7
+ version = "2.3.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"
@@ -93,7 +93,7 @@ utimlite = "utim_cli.utim:main_cli_entry"
93
93
 
94
94
 
95
95
  [tool.setuptools.packages.find]
96
- include = ["utim_cli*"]
96
+ include = ["utim*", "utim_cli*"]
97
97
  exclude = ["tests*", "landing*", "scripts*"]
98
98
 
99
99
  [tool.setuptools.package-data]
@@ -101,6 +101,7 @@ utim_cli = ["mcp_registry.json", "_version.py", "utimmodel.txt", "models.txt", "
101
101
 
102
102
 
103
103
  [tool.pytest.ini_options]
104
+ addopts = "-m 'not benchmark and not slow and not integration' --ignore=tests/test_benchmark.py --ignore=tests/bench_agent.py"
104
105
  markers = [
105
106
  "smoke: fast install validation tests (no live credentials required)",
106
107
  "slow: tests that make network calls or take more than 10 seconds",
@@ -0,0 +1,76 @@
1
+ """
2
+ UTIM Developer SDK
3
+ ------------------
4
+ Unified autonomous coding agent SDK.
5
+
6
+ Quickstart:
7
+ import utim
8
+
9
+ session = utim.Session()
10
+ async for event in session.send_message("Explain this codebase"):
11
+ if event.type == utim.EventType.TOKEN:
12
+ print(event.text, end="", flush=True)
13
+ """
14
+ try:
15
+ from utim_cli._version import VERSION as __version__
16
+ except ImportError:
17
+ __version__ = "2.3.0"
18
+
19
+ # Developer-friendly core classes (similar to `import genai` / `import openai`)
20
+ from utim_cli.sdk.session import UtimSession as Session
21
+ from utim_cli.sdk.config import UtimConfig as Config
22
+ from utim_cli.sdk.context import IDEContext, Diagnostic
23
+ from utim_cli.sdk.events import (
24
+ AgentEvent,
25
+ UtimEventType as EventType,
26
+ TokenStreamEvent,
27
+ ThoughtStreamEvent,
28
+ ToolCallStartEvent,
29
+ ToolCallEndEvent,
30
+ FileEditEvent,
31
+ CommandExecEvent,
32
+ ConfirmationRequestEvent,
33
+ PlanUpdateEvent,
34
+ SubagentEvent,
35
+ TurnEndEvent,
36
+ )
37
+ from utim_cli.sdk.handlers import (
38
+ ConfirmationHandler,
39
+ AutoApprovalHandler,
40
+ CallbackApprovalHandler,
41
+ )
42
+ from utim_cli.sdk.sidecar import UtimSidecarServer as SidecarServer
43
+
44
+ # Backwards compatible alias names
45
+ UtimSession = Session
46
+ UtimConfig = Config
47
+ UtimEventType = EventType
48
+ UtimSidecarServer = SidecarServer
49
+
50
+ __all__ = [
51
+ "__version__",
52
+ "Session",
53
+ "Config",
54
+ "IDEContext",
55
+ "Diagnostic",
56
+ "EventType",
57
+ "AgentEvent",
58
+ "TokenStreamEvent",
59
+ "ThoughtStreamEvent",
60
+ "ToolCallStartEvent",
61
+ "ToolCallEndEvent",
62
+ "FileEditEvent",
63
+ "CommandExecEvent",
64
+ "ConfirmationRequestEvent",
65
+ "PlanUpdateEvent",
66
+ "SubagentEvent",
67
+ "TurnEndEvent",
68
+ "ConfirmationHandler",
69
+ "AutoApprovalHandler",
70
+ "CallbackApprovalHandler",
71
+ "SidecarServer",
72
+ "UtimSession",
73
+ "UtimConfig",
74
+ "UtimEventType",
75
+ "UtimSidecarServer",
76
+ ]
@@ -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.3.0"
8
+ __version__ = "2.3.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.3.0"
14
+ VERSION = "2.3.2"
15
15
 
16
16
 
@@ -186,14 +186,15 @@ _utim_dir_posix = get_utim_dir().as_posix()
186
186
  # System Prompt
187
187
  SYSTEM_PROMPT = f"""You are UTIM AI, a high-agency senior software engineer operating autonomously inside a CLI. You focus purely on the technical project or task at hand.
188
188
 
189
- ### CORE DIRECTIVES:
190
- 1. **Explore & Route**: A project architecture snapshot is injected below — use it immediately instead of calling list_directory. For localized tasks (single-file edits, styling): go straight to the file. For system-wide tasks: use the snapshot to plan without extra listings.
191
- 2. **Execute Immediately & Autonomous Agency**: Do not wait for permissions or ask conversational filler questions (e.g. 'Would you like me to explain my approach before I proceed?'). Invoke tools or provide direct analysis immediately. No preamble, no placeholder stubs.
192
- 3. **Architectural & Project Planning**: Proactively invoke `plan_project` (with `plan_part` set to 'design', 'architecture', 'security', 'database', 'testing', 'deployment', or 'features') for non-trivial tasks, new features, or architectural builds to establish expert specifications before implementing. Verify code changes with `run_command` (build/test).
193
- 4. **Manifesto Reference**: Safety and coding standards are in {_utim_dir_posix}/UTIM.md. Read only when specific guidance is needed.
194
- 5. **Output**: Concise, professional, warm. Summarize changes + test results at the end. Propose improvements only don't fix unsolicited issues.
195
- 6. **Tool Calling**: Use native function-calling only. No raw JSON, no <think> tags, no tool markup in text.
196
- 7. **Premium Web Design**: Style UIs per `{_utim_dir_posix}/DESIGN.md` (HSL colors, glassmorphism, animations).
189
+ ### SYSTEM DIRECTIVES:
190
+ 1. **Direct High-Leverage Execution**: Take the cleanest, fastest, and most cost-effective path to solve the task with high precision and quality. Avoid unnecessary exploratory loops.
191
+ 2. **Targeted Search & Scoped Reading**: Use `grep_search` for exact symbols/errors and `read_file` with `start_line`/`end_line` or `symbol_name`. Never read entire un-sliced large files or perform redundant directory listings when paths are known.
192
+ 3. **Architectural & Feature Planning**: Proactively invoke `plan_project` (with `plan_part` set to 'design', 'architecture', 'features', 'database', 'security', or 'testing') for new features, system designs, and complex multi-file refactors to establish clear specifications before implementing. For localized/simple edits or direct bug fixes, execute code changes directly.
193
+ 4. **Think-Create-Verify**: Execute tools directly without conversational preambles or boilerplate. Verify your changes with `run_command` (tests, build, execution check) to guarantee quality.
194
+ 5. **Manifesto Reference**: Safety and coding standards are in {_utim_dir_posix}/UTIM.md. Read only when specific guidance is needed.
195
+ 6. **Output**: Concise, professional, direct. Summarize changes + test results clearly without repeating whole files in text.
196
+ 7. **Tool Calling**: Use native function-calling only. No raw JSON, no <think> tags, no tool markup in text.
197
+ 8. **Premium Web Design**: Style UIs per `{_utim_dir_posix}/DESIGN.md` (HSL colors, glassmorphism, animations).
197
198
 
198
199
  """
199
200
 
@@ -265,14 +266,15 @@ SYSTEM_PROMPT = SYSTEM_PROMPT + _detect_environment()
265
266
 
266
267
  COMPRESSED_SYSTEM_PROMPT = f"""You are UTIM AI, a high-agency senior CLI software engineer.
267
268
 
268
- ### CORE DIRECTIVES:
269
- 1. **Explore & Route**: Project snapshot is injected use it immediately. No redundant list_directory calls.
270
- 2. **Execute Immediately**: Invoke tool calls directly. No preamble, no announcing steps.
271
- 3. **Think-Create-Verify**: Call tools directly. Verify with run_command, not by re-reading files.
272
- 4. **Manifesto**: Safety and coding standards are in {_utim_dir_posix}/UTIM.md.
273
- 5. **Output**: Concise, professional, warm.
274
- 6. **Tool Calling**: Use native function-calling. No raw JSON, `<think>` tags, or raw tool markup.
275
- 7. **Premium Web Design**: Style UIs per `{_utim_dir_posix}/DESIGN.md` (HSL colors, glassmorphism, animations).
269
+ ### SYSTEM DIRECTIVES (COMPRESSED):
270
+ 1. **Direct Execution (High-Leverage)**: Take the shortest, most cost-effective path to completion without reducing quality. Inspect target code directly -> apply precision edits -> verify.
271
+ 2. **Targeted Search & Scoped Reading**: Use `grep_search` and `read_file` with line ranges/symbols. Do not read entire large files or re-scan directories when the file path is known.
272
+ 3. **Strategic Planning**: Invoke `plan_project` for new features, complex refactors, and architectural designs before implementing. For localized/simple edits, modify code directly.
273
+ 4. **Think-Create-Verify**: Call tools directly. Verify with run_command, not by re-reading files.
274
+ 5. **Manifesto**: Safety and coding standards are in {_utim_dir_posix}/UTIM.md.
275
+ 6. **Output**: Concise, professional, warm.
276
+ 7. **Tool Calling**: Use native function-calling. No raw JSON, `<think>` tags, or raw tool markup.
277
+ 8. **Premium Web Design**: Style UIs per `{_utim_dir_posix}/DESIGN.md` (HSL colors, glassmorphism, animations).
276
278
  """
277
279
 
278
280
  def _detect_environment_compressed() -> str:
@@ -817,28 +819,28 @@ def _get_dynamic_directives(is_compressed: bool, messages: Optional[List[Dict]]
817
819
  return "### TOOL STATUS: ALL TOOLS DISABLED\nAll tools are disabled. You may only respond in text."
818
820
 
819
821
  if is_compressed:
820
- # Short, token-efficient directives for steady-state turns. The full
821
- # version is only injected on iteration 0 (first turn).
822
+ # Short, token-efficient directives for consecutive intermediate turns.
822
823
  directives = [
823
- "### CORE DIRECTIVES:",
824
- "1. **Targeted Search**: Use `grep_search` for symbols/errors; `read_file` with symbol_name or line ranges no un-sliced large reads.",
825
- "2. **Images**: If the prompt includes an image path (.png/.jpg/.jpeg), `read_file` it immediately on Turn 1 with that exact path.",
826
- "3. **Planning**: Invoke `plan_project` for non-trivial tasks/new features/refactors before implementing.",
827
- "4. **Think-Create-Verify**: Execute tools directly. Verify edits with `run_command` (build/test/verify). Prefer Standard Library in standalone scripts for zero-dependency portability.",
828
- "5. **Background Tasks & Reactive Awakening**: You can run multiple background commands concurrently (`run_command` with `is_background=True`) or set timers with `schedule`. After launching, conclude your turn; no need to check or loop bg task u will be notified on completion.",
829
- "6. **Output**: Native function-calling only no raw JSON, <think> tags, or tool markup in text. Finish with a concise summary.",
824
+ "### SYSTEM DIRECTIVES (COMPRESSED):",
825
+ "1. **Direct High-Leverage Execution**: Take the shortest, cleanest, and most cost-effective path to completion without reducing quality. Inspect target code directly -> apply precision edits -> verify.",
826
+ "2. **Targeted Search & Scoped Reading**: Use `grep_search` and `read_file` with line ranges/symbols. Do not read entire large files or re-scan directories when the file path is known.",
827
+ "3. **Strategic Planning**: Invoke `plan_project` for new features, complex refactors, and architectural designs before implementing. For localized/simple edits, modify code directly.",
828
+ "4. **Images**: If prompt includes an image path, `read_file` it immediately on Turn 1 with that exact path.",
829
+ "5. **Think-Create-Verify**: Execute tools directly. Verify edits with `run_command` (build/test/verify). Prefer Standard Library in standalone scripts for zero-dependency portability.",
830
+ "6. **Background Tasks**: Run long background commands with `is_background=True` or `schedule` timer and conclude your turn. Multiple background tasks run concurrently.",
831
+ "7. **Output**: Native function-calling only — no raw JSON or <think> tags. Finish with a concise, direct summary.",
830
832
  ]
831
833
  else:
832
834
  directives = [
833
- "### CORE DIRECTIVES:",
834
- "1. **Targeted Search**: Use `grep_search` to locate exact symbol definitions, imports, or error text across codebase files.",
835
- "2. **Scoped File Reading**: Use `read_file` with `symbol_name` or line ranges (`start_line`/`end_line`) to inspect target function/class definitions. Avoid reading un-sliced large files.",
836
- "3. **Images & Screenshots**: If the prompt includes an image or screenshot path (.png, .jpg, .jpeg, etc.), execute `read_file` immediately on Turn 1 with that exact path. Absolute file paths anywhere on the system are valid do not question file locations.",
837
- "4. **Project & Feature Planning**: Proactively invoke `plan_project` (with `plan_part` set to 'design', 'architecture', 'security', 'database', 'testing', 'deployment', or 'features') for non-trivial tasks, new features, system refactors, or new application builds before implementing.",
838
- "5. **Think-Create-Verify**: Execute tools directly without conversational preambles or text planning. Never conclude a coding task without verifying your changes: run build, execute tests, or check outputs with `run_command`. In standalone verification scripts, prefer Python standard library modules or handle third-party imports gracefully.",
839
- "6. **Background Tasks, Timers & Reactive Awakening**: When starting long-running commands, tests, or servers (`run_command` with `is_background=True`), or setting timers with `schedule`, conclude your turn. No need to check or loop bg task u will be notified on completion. Multiple concurrent background tasks can run simultaneously.",
840
- "7. **Execution**: Invoke native function-calling schemas directly. Never output raw JSON, <think> tags, or conversational text before tool calls.",
841
- "8. **Output & Autonomous Agency**: Be concise, professional, and clear. Do not ask conversational filler questions like 'Would you like me to explain my approach before I proceed?'. Analyze the request, execute necessary actions, and summarize results directly.",
835
+ "### SYSTEM DIRECTIVES:",
836
+ "1. **Direct High-Leverage Execution**: Take the fastest, cleanest, and most cost-effective path to solve the task with high precision and quality. Avoid unnecessary multi-step exploration, speculative refactors, or excessive tool looping. Inspect target -> apply surgical edits -> verify.",
837
+ "2. **Targeted Search & Scoped Reading**: Use `grep_search` for exact symbols/errors and `read_file` with `start_line`/`end_line` or `symbol_name`. Avoid reading un-sliced large files or calling redundant directory listings.",
838
+ "3. **Architectural & Feature Planning**: Proactively invoke `plan_project` (with `plan_part` set to 'design', 'architecture', 'features', 'database', 'security', or 'testing') for new features, system designs, and complex multi-file refactors to establish clear specifications before implementing. For localized/simple edits or direct bug fixes, execute code changes directly.",
839
+ "4. **Images & Screenshots**: If the prompt includes an image or screenshot path (.png, .jpg, .jpeg, etc.), execute `read_file` immediately on Turn 1 with that exact path. Absolute file paths anywhere on the system are valid.",
840
+ "5. **Think-Create-Verify**: Execute tools directly without conversational preambles or boilerplate. Verify your changes with `run_command` (build, tests, linter, or execution checks). In verification scripts, prefer Python standard library modules.",
841
+ "6. **Background Tasks, Timers & Reactive Awakening**: When starting long-running commands, tests, or servers, run with `is_background=True` or set timers with `schedule`, and conclude your turn. You will be automatically awakened when complete.",
842
+ "7. **Execution & Tool Calling**: Invoke native function-calling schemas directly. Never output raw JSON, <think> tags, or conversational text before tool calls.",
843
+ "8. **Output & Autonomous Agency**: Be concise, professional, and clear. Do not ask conversational filler questions. Deliver high quality with minimum token waste.",
842
844
  ]
843
845
 
844
846
 
@@ -2168,6 +2170,12 @@ class Orchestrator:
2168
2170
  pass
2169
2171
  continue
2170
2172
  elif t == "content_delta":
2173
+ try:
2174
+ from utim_cli.state import STATE
2175
+ if STATE.get("thinking_topic"):
2176
+ STATE["thinking_topic"] = ""
2177
+ except Exception:
2178
+ pass
2171
2179
  # If we were in a thinking block, close it now
2172
2180
  if native_reasoning:
2173
2181
  native_reasoning = False
@@ -2302,6 +2310,12 @@ class Orchestrator:
2302
2310
 
2303
2311
  if chunk_text is not None and chunk_text != "":
2304
2312
  last_content_time = time.time() # real data arrived
2313
+ try:
2314
+ from utim_cli.state import STATE
2315
+ if STATE.get("thinking_topic") and not in_think:
2316
+ STATE["thinking_topic"] = ""
2317
+ except Exception:
2318
+ pass
2305
2319
  if native_reasoning:
2306
2320
  native_reasoning = False
2307
2321
  in_think = False
@@ -3272,8 +3286,21 @@ class Orchestrator:
3272
3286
  term_width = self.console.width if (self.console and self.console.width) else shutil.get_terminal_size((80, 24)).columns
3273
3287
  max_wrap_w = max(30, term_width - 8)
3274
3288
 
3289
+ def _is_internal_info_line(l_text: str) -> bool:
3290
+ s = l_text.strip()
3291
+ return (
3292
+ s.startswith("ℹ")
3293
+ or s.startswith("🛈")
3294
+ or "The agent can now safely conclude" in s
3295
+ or "You will automatically receive a [Notification]" in s
3296
+ or "Subagent communication tool" in s
3297
+ or "The agent can now safely conclude its turn" in s
3298
+ )
3299
+
3275
3300
  wrapped_body_lines = []
3276
3301
  for bl in body_lines:
3302
+ if _is_internal_info_line(bl.plain):
3303
+ continue
3277
3304
  plain = bl.plain
3278
3305
  is_tree = plain.startswith(TREE)
3279
3306
  is_pipe = plain.startswith(PIPE)
@@ -4004,10 +4031,11 @@ class Orchestrator:
4004
4031
  result = f"Error executing tool {func_name}: {e}\n{traceback.format_exc()}"
4005
4032
 
4006
4033
 
4007
- # Restore the indicator to evaluating logic
4034
+ # Clear thinking topic so prompt_toolkit doesn't show a stuck indicator while rendering
4008
4035
  try:
4009
4036
  if getattr(self, "_subagent_depth", 0) == 0:
4010
- STATE["thinking_topic"] = "Evaluating tool results..."
4037
+ from utim_cli.state import STATE
4038
+ STATE["thinking_topic"] = ""
4011
4039
  except Exception:
4012
4040
  pass
4013
4041
  except Exception as exc:
@@ -5540,6 +5568,20 @@ class Orchestrator:
5540
5568
  self._persist_messages()
5541
5569
  break
5542
5570
 
5571
+ # ── Inject any pending background task / system notifications directly into model context ──
5572
+ try:
5573
+ from utim_cli.state import STATE
5574
+ pending_events = STATE.pop("pending_system_events", None)
5575
+ if pending_events:
5576
+ combined_events = "\n\n".join(str(ev) for ev in pending_events if ev)
5577
+ if combined_events:
5578
+ self.messages.append({
5579
+ "role": "user",
5580
+ "content": combined_events
5581
+ })
5582
+ except Exception:
5583
+ pass
5584
+
5543
5585
  # ── Resilient LLM call with per-iteration retry ────────────────────
5544
5586
  # We allow up to 3 transient-error retries per iteration before
5545
5587
  # giving up for real. This prevents a single network blip from
@@ -6764,3 +6806,9 @@ class Orchestrator:
6764
6806
  # Clear the @subagent tag override so the next turn uses the default system prompt
6765
6807
  self.active_tag = None
6766
6808
  self.active_tag_system_prompt = None
6809
+
6810
+ try:
6811
+ from utim_cli.state import STATE
6812
+ STATE["thinking_topic"] = ""
6813
+ except Exception:
6814
+ pass
@@ -0,0 +1,10 @@
1
+ """UTIM CLI Plugin System.
2
+
3
+ A modular extension framework for packaging, installing, and managing
4
+ skills, MCP servers, custom tools, rules, and lifecycle hooks.
5
+ """
6
+
7
+ from utim_cli.plugins.schema import Plugin, PluginManifest
8
+ from utim_cli.plugins.manager import PluginManager, get_plugin_manager
9
+
10
+ __all__ = ["Plugin", "PluginManifest", "PluginManager", "get_plugin_manager"]