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.
- {utim_cli-2.3.0 → utim_cli-2.3.2}/CHANGELOG.md +10 -0
- {utim_cli-2.3.0/utim_cli.egg-info → utim_cli-2.3.2}/PKG-INFO +1 -1
- {utim_cli-2.3.0 → utim_cli-2.3.2}/pyproject.toml +3 -2
- utim_cli-2.3.2/utim/__init__.py +76 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/__init__.py +1 -1
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/_version.py +1 -1
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/orchestrator.py +84 -36
- utim_cli-2.3.2/utim_cli/plugins/__init__.py +10 -0
- utim_cli-2.3.2/utim_cli/plugins/manager.py +465 -0
- utim_cli-2.3.2/utim_cli/plugins/registry.py +120 -0
- utim_cli-2.3.2/utim_cli/plugins/schema.py +230 -0
- utim_cli-2.3.2/utim_cli/sdk/__init__.py +52 -0
- utim_cli-2.3.2/utim_cli/sdk/config.py +41 -0
- utim_cli-2.3.2/utim_cli/sdk/context.py +67 -0
- utim_cli-2.3.2/utim_cli/sdk/events.py +166 -0
- utim_cli-2.3.2/utim_cli/sdk/handlers.py +60 -0
- utim_cli-2.3.2/utim_cli/sdk/session.py +333 -0
- utim_cli-2.3.2/utim_cli/sdk/sidecar.py +164 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/auth.py +11 -1
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/docs.md +1 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/features.md +1 -0
- utim_cli-2.3.2/utim_cli/server/local_llm.py +39 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/rate_limit.py +9 -5
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/router.py +71 -37
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/__init__.py +3 -1
- utim_cli-2.3.2/utim_cli/server/routes/admin_db_routes.py +507 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/completion_routes.py +22 -4
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/quota_routes.py +76 -12
- utim_cli-2.3.2/utim_cli/server/server.py +94 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/task_dispatcher.py +61 -18
- utim_cli-2.3.2/utim_cli/tui/plugins_dialog.py +351 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/utim.py +17 -12
- {utim_cli-2.3.0 → utim_cli-2.3.2/utim_cli.egg-info}/PKG-INFO +1 -1
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/SOURCES.txt +14 -6
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/top_level.txt +1 -0
- utim_cli-2.3.0/utim_cli/_check_obj.py +0 -9
- utim_cli-2.3.0/utim_cli/_find_mcp.py +0 -9
- utim_cli-2.3.0/utim_cli/_find_plan.py +0 -12
- utim_cli-2.3.0/utim_cli/_find_tool.py +0 -10
- utim_cli-2.3.0/utim_cli/_patch_multimodal.py +0 -125
- utim_cli-2.3.0/utim_cli/_test_regex.py +0 -22
- utim_cli-2.3.0/utim_cli/server/local_llm.py +0 -380
- utim_cli-2.3.0/utim_cli/server/server.py +0 -60
- {utim_cli-2.3.0 → utim_cli-2.3.2}/LICENSE +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/MANIFEST.in +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/README.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/setup.cfg +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/setup.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/agent.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/ask_helper.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/auth.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/backup.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/billing.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/blender_agent.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/bootstrap.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/brain.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/client_utils.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/config.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/constants.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/context_pruner.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/doctor.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/harbor.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/knowledge_graph.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/local_db.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/logger.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/mcp_clean_wrapper.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/mcp_client.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/mcp_registry.json +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/models.txt +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/reflection.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/report.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/scrapy_search.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/__init__.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/admin_auth.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/attribution.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/audit_log.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/batch_processor.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/captcha.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/cli_auth.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/db.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/SECRET_PROVISIONING.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/about.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/changelog.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/license.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/pricing.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/privacy.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/refund.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/support.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/docs_md/terms.md +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/email_utils.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/exchange_rate.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/firebase.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/fix_duplicate_users.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/history.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/logging_config.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/micro_batcher.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/model_agent.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/models.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/pricing_updater.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/provision_build.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/rewards_engine.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/auth_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/billing_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/credit_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/feedback_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/marketplace_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/quota_share_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/referral_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/rewards_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/security_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/session_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/routes/share_routes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/server/storage_nodes.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/share.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/share_tui.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/situational_scoring.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/state.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/subagent_manager.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tools.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/__init__.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/feedback_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/history_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/marketplace_app_state.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/marketplace_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/marketplace_layout_engine.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/mcp_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/miniagents_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/model_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/publish_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/quota_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/quota_redeem_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/quota_share_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/resume_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/rewards_tui.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/skills_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/subagents_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/thinking_display.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/tools_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/tui/update_dialog.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/utilities.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/utimmodel.txt +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/vector_memory.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/wheel.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli/workspace.py +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/dependency_links.txt +0 -0
- {utim_cli-2.3.0 → utim_cli-2.3.2}/utim_cli.egg-info/entry_points.txt +0 -0
- {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.
|
|
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.
|
|
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
|
+
]
|
|
@@ -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
|
-
###
|
|
190
|
-
1. **
|
|
191
|
-
2. **
|
|
192
|
-
3. **Architectural &
|
|
193
|
-
4. **
|
|
194
|
-
5. **
|
|
195
|
-
6. **
|
|
196
|
-
7. **
|
|
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
|
-
###
|
|
269
|
-
1. **
|
|
270
|
-
2. **
|
|
271
|
-
3. **
|
|
272
|
-
4. **
|
|
273
|
-
5. **
|
|
274
|
-
6. **
|
|
275
|
-
7. **
|
|
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
|
|
821
|
-
# version is only injected on iteration 0 (first turn).
|
|
822
|
+
# Short, token-efficient directives for consecutive intermediate turns.
|
|
822
823
|
directives = [
|
|
823
|
-
"###
|
|
824
|
-
"1. **
|
|
825
|
-
"2. **
|
|
826
|
-
"3. **Planning**: Invoke `plan_project` for
|
|
827
|
-
"4. **
|
|
828
|
-
"5. **
|
|
829
|
-
"6. **
|
|
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
|
-
"###
|
|
834
|
-
"1. **
|
|
835
|
-
"2. **Scoped
|
|
836
|
-
"3. **
|
|
837
|
-
"4. **
|
|
838
|
-
"5. **Think-Create-Verify**: Execute tools directly without conversational preambles or
|
|
839
|
-
"6. **Background Tasks, Timers & Reactive Awakening**: When starting long-running commands, tests, or servers
|
|
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
|
|
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
|
-
#
|
|
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
|
-
|
|
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"]
|