alita-sdk 0.3.257__py3-none-any.whl → 0.3.562__py3-none-any.whl

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 (278) hide show
  1. alita_sdk/cli/__init__.py +10 -0
  2. alita_sdk/cli/__main__.py +17 -0
  3. alita_sdk/cli/agent/__init__.py +5 -0
  4. alita_sdk/cli/agent/default.py +258 -0
  5. alita_sdk/cli/agent_executor.py +155 -0
  6. alita_sdk/cli/agent_loader.py +215 -0
  7. alita_sdk/cli/agent_ui.py +228 -0
  8. alita_sdk/cli/agents.py +3601 -0
  9. alita_sdk/cli/callbacks.py +647 -0
  10. alita_sdk/cli/cli.py +168 -0
  11. alita_sdk/cli/config.py +306 -0
  12. alita_sdk/cli/context/__init__.py +30 -0
  13. alita_sdk/cli/context/cleanup.py +198 -0
  14. alita_sdk/cli/context/manager.py +731 -0
  15. alita_sdk/cli/context/message.py +285 -0
  16. alita_sdk/cli/context/strategies.py +289 -0
  17. alita_sdk/cli/context/token_estimation.py +127 -0
  18. alita_sdk/cli/formatting.py +182 -0
  19. alita_sdk/cli/input_handler.py +419 -0
  20. alita_sdk/cli/inventory.py +1073 -0
  21. alita_sdk/cli/mcp_loader.py +315 -0
  22. alita_sdk/cli/toolkit.py +327 -0
  23. alita_sdk/cli/toolkit_loader.py +85 -0
  24. alita_sdk/cli/tools/__init__.py +43 -0
  25. alita_sdk/cli/tools/approval.py +224 -0
  26. alita_sdk/cli/tools/filesystem.py +1751 -0
  27. alita_sdk/cli/tools/planning.py +389 -0
  28. alita_sdk/cli/tools/terminal.py +414 -0
  29. alita_sdk/community/__init__.py +72 -12
  30. alita_sdk/community/inventory/__init__.py +236 -0
  31. alita_sdk/community/inventory/config.py +257 -0
  32. alita_sdk/community/inventory/enrichment.py +2137 -0
  33. alita_sdk/community/inventory/extractors.py +1469 -0
  34. alita_sdk/community/inventory/ingestion.py +3172 -0
  35. alita_sdk/community/inventory/knowledge_graph.py +1457 -0
  36. alita_sdk/community/inventory/parsers/__init__.py +218 -0
  37. alita_sdk/community/inventory/parsers/base.py +295 -0
  38. alita_sdk/community/inventory/parsers/csharp_parser.py +907 -0
  39. alita_sdk/community/inventory/parsers/go_parser.py +851 -0
  40. alita_sdk/community/inventory/parsers/html_parser.py +389 -0
  41. alita_sdk/community/inventory/parsers/java_parser.py +593 -0
  42. alita_sdk/community/inventory/parsers/javascript_parser.py +629 -0
  43. alita_sdk/community/inventory/parsers/kotlin_parser.py +768 -0
  44. alita_sdk/community/inventory/parsers/markdown_parser.py +362 -0
  45. alita_sdk/community/inventory/parsers/python_parser.py +604 -0
  46. alita_sdk/community/inventory/parsers/rust_parser.py +858 -0
  47. alita_sdk/community/inventory/parsers/swift_parser.py +832 -0
  48. alita_sdk/community/inventory/parsers/text_parser.py +322 -0
  49. alita_sdk/community/inventory/parsers/yaml_parser.py +370 -0
  50. alita_sdk/community/inventory/patterns/__init__.py +61 -0
  51. alita_sdk/community/inventory/patterns/ast_adapter.py +380 -0
  52. alita_sdk/community/inventory/patterns/loader.py +348 -0
  53. alita_sdk/community/inventory/patterns/registry.py +198 -0
  54. alita_sdk/community/inventory/presets.py +535 -0
  55. alita_sdk/community/inventory/retrieval.py +1403 -0
  56. alita_sdk/community/inventory/toolkit.py +173 -0
  57. alita_sdk/community/inventory/toolkit_utils.py +176 -0
  58. alita_sdk/community/inventory/visualize.py +1370 -0
  59. alita_sdk/configurations/__init__.py +11 -0
  60. alita_sdk/configurations/ado.py +148 -2
  61. alita_sdk/configurations/azure_search.py +1 -1
  62. alita_sdk/configurations/bigquery.py +1 -1
  63. alita_sdk/configurations/bitbucket.py +94 -2
  64. alita_sdk/configurations/browser.py +18 -0
  65. alita_sdk/configurations/carrier.py +19 -0
  66. alita_sdk/configurations/confluence.py +130 -1
  67. alita_sdk/configurations/delta_lake.py +1 -1
  68. alita_sdk/configurations/figma.py +76 -5
  69. alita_sdk/configurations/github.py +65 -1
  70. alita_sdk/configurations/gitlab.py +81 -0
  71. alita_sdk/configurations/google_places.py +17 -0
  72. alita_sdk/configurations/jira.py +103 -0
  73. alita_sdk/configurations/openapi.py +111 -0
  74. alita_sdk/configurations/postman.py +1 -1
  75. alita_sdk/configurations/qtest.py +72 -3
  76. alita_sdk/configurations/report_portal.py +115 -0
  77. alita_sdk/configurations/salesforce.py +19 -0
  78. alita_sdk/configurations/service_now.py +1 -12
  79. alita_sdk/configurations/sharepoint.py +167 -0
  80. alita_sdk/configurations/sonar.py +18 -0
  81. alita_sdk/configurations/sql.py +20 -0
  82. alita_sdk/configurations/testio.py +101 -0
  83. alita_sdk/configurations/testrail.py +88 -0
  84. alita_sdk/configurations/xray.py +94 -1
  85. alita_sdk/configurations/zephyr_enterprise.py +94 -1
  86. alita_sdk/configurations/zephyr_essential.py +95 -0
  87. alita_sdk/runtime/clients/artifact.py +21 -4
  88. alita_sdk/runtime/clients/client.py +458 -67
  89. alita_sdk/runtime/clients/mcp_discovery.py +342 -0
  90. alita_sdk/runtime/clients/mcp_manager.py +262 -0
  91. alita_sdk/runtime/clients/sandbox_client.py +352 -0
  92. alita_sdk/runtime/langchain/_constants_bkup.py +1318 -0
  93. alita_sdk/runtime/langchain/assistant.py +183 -43
  94. alita_sdk/runtime/langchain/constants.py +647 -1
  95. alita_sdk/runtime/langchain/document_loaders/AlitaDocxMammothLoader.py +315 -3
  96. alita_sdk/runtime/langchain/document_loaders/AlitaExcelLoader.py +209 -31
  97. alita_sdk/runtime/langchain/document_loaders/AlitaImageLoader.py +1 -1
  98. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLinesLoader.py +77 -0
  99. alita_sdk/runtime/langchain/document_loaders/AlitaJSONLoader.py +10 -3
  100. alita_sdk/runtime/langchain/document_loaders/AlitaMarkdownLoader.py +66 -0
  101. alita_sdk/runtime/langchain/document_loaders/AlitaPDFLoader.py +79 -10
  102. alita_sdk/runtime/langchain/document_loaders/AlitaPowerPointLoader.py +52 -15
  103. alita_sdk/runtime/langchain/document_loaders/AlitaPythonLoader.py +9 -0
  104. alita_sdk/runtime/langchain/document_loaders/AlitaTableLoader.py +1 -4
  105. alita_sdk/runtime/langchain/document_loaders/AlitaTextLoader.py +15 -2
  106. alita_sdk/runtime/langchain/document_loaders/ImageParser.py +30 -0
  107. alita_sdk/runtime/langchain/document_loaders/constants.py +189 -41
  108. alita_sdk/runtime/langchain/interfaces/llm_processor.py +4 -2
  109. alita_sdk/runtime/langchain/langraph_agent.py +407 -92
  110. alita_sdk/runtime/langchain/utils.py +102 -8
  111. alita_sdk/runtime/llms/preloaded.py +2 -6
  112. alita_sdk/runtime/models/mcp_models.py +61 -0
  113. alita_sdk/runtime/skills/__init__.py +91 -0
  114. alita_sdk/runtime/skills/callbacks.py +498 -0
  115. alita_sdk/runtime/skills/discovery.py +540 -0
  116. alita_sdk/runtime/skills/executor.py +610 -0
  117. alita_sdk/runtime/skills/input_builder.py +371 -0
  118. alita_sdk/runtime/skills/models.py +330 -0
  119. alita_sdk/runtime/skills/registry.py +355 -0
  120. alita_sdk/runtime/skills/skill_runner.py +330 -0
  121. alita_sdk/runtime/toolkits/__init__.py +28 -0
  122. alita_sdk/runtime/toolkits/application.py +14 -4
  123. alita_sdk/runtime/toolkits/artifact.py +24 -9
  124. alita_sdk/runtime/toolkits/datasource.py +13 -6
  125. alita_sdk/runtime/toolkits/mcp.py +780 -0
  126. alita_sdk/runtime/toolkits/planning.py +178 -0
  127. alita_sdk/runtime/toolkits/skill_router.py +238 -0
  128. alita_sdk/runtime/toolkits/subgraph.py +11 -6
  129. alita_sdk/runtime/toolkits/tools.py +314 -70
  130. alita_sdk/runtime/toolkits/vectorstore.py +11 -5
  131. alita_sdk/runtime/tools/__init__.py +24 -0
  132. alita_sdk/runtime/tools/application.py +16 -4
  133. alita_sdk/runtime/tools/artifact.py +367 -33
  134. alita_sdk/runtime/tools/data_analysis.py +183 -0
  135. alita_sdk/runtime/tools/function.py +100 -4
  136. alita_sdk/runtime/tools/graph.py +81 -0
  137. alita_sdk/runtime/tools/image_generation.py +218 -0
  138. alita_sdk/runtime/tools/llm.py +1013 -177
  139. alita_sdk/runtime/tools/loop.py +3 -1
  140. alita_sdk/runtime/tools/loop_output.py +3 -1
  141. alita_sdk/runtime/tools/mcp_inspect_tool.py +284 -0
  142. alita_sdk/runtime/tools/mcp_remote_tool.py +181 -0
  143. alita_sdk/runtime/tools/mcp_server_tool.py +3 -1
  144. alita_sdk/runtime/tools/planning/__init__.py +36 -0
  145. alita_sdk/runtime/tools/planning/models.py +246 -0
  146. alita_sdk/runtime/tools/planning/wrapper.py +607 -0
  147. alita_sdk/runtime/tools/router.py +2 -1
  148. alita_sdk/runtime/tools/sandbox.py +375 -0
  149. alita_sdk/runtime/tools/skill_router.py +776 -0
  150. alita_sdk/runtime/tools/tool.py +3 -1
  151. alita_sdk/runtime/tools/vectorstore.py +69 -65
  152. alita_sdk/runtime/tools/vectorstore_base.py +163 -90
  153. alita_sdk/runtime/utils/AlitaCallback.py +137 -21
  154. alita_sdk/runtime/utils/mcp_client.py +492 -0
  155. alita_sdk/runtime/utils/mcp_oauth.py +361 -0
  156. alita_sdk/runtime/utils/mcp_sse_client.py +434 -0
  157. alita_sdk/runtime/utils/mcp_tools_discovery.py +124 -0
  158. alita_sdk/runtime/utils/streamlit.py +41 -14
  159. alita_sdk/runtime/utils/toolkit_utils.py +28 -9
  160. alita_sdk/runtime/utils/utils.py +48 -0
  161. alita_sdk/tools/__init__.py +135 -37
  162. alita_sdk/tools/ado/__init__.py +2 -2
  163. alita_sdk/tools/ado/repos/__init__.py +15 -19
  164. alita_sdk/tools/ado/repos/repos_wrapper.py +12 -20
  165. alita_sdk/tools/ado/test_plan/__init__.py +26 -8
  166. alita_sdk/tools/ado/test_plan/test_plan_wrapper.py +56 -28
  167. alita_sdk/tools/ado/wiki/__init__.py +27 -12
  168. alita_sdk/tools/ado/wiki/ado_wrapper.py +114 -40
  169. alita_sdk/tools/ado/work_item/__init__.py +27 -12
  170. alita_sdk/tools/ado/work_item/ado_wrapper.py +95 -11
  171. alita_sdk/tools/advanced_jira_mining/__init__.py +12 -8
  172. alita_sdk/tools/aws/delta_lake/__init__.py +14 -11
  173. alita_sdk/tools/aws/delta_lake/tool.py +5 -1
  174. alita_sdk/tools/azure_ai/search/__init__.py +13 -8
  175. alita_sdk/tools/base/tool.py +5 -1
  176. alita_sdk/tools/base_indexer_toolkit.py +454 -110
  177. alita_sdk/tools/bitbucket/__init__.py +27 -19
  178. alita_sdk/tools/bitbucket/api_wrapper.py +285 -27
  179. alita_sdk/tools/bitbucket/cloud_api_wrapper.py +5 -5
  180. alita_sdk/tools/browser/__init__.py +41 -16
  181. alita_sdk/tools/browser/crawler.py +3 -1
  182. alita_sdk/tools/browser/utils.py +15 -6
  183. alita_sdk/tools/carrier/__init__.py +18 -17
  184. alita_sdk/tools/carrier/backend_reports_tool.py +8 -4
  185. alita_sdk/tools/carrier/excel_reporter.py +8 -4
  186. alita_sdk/tools/chunkers/__init__.py +3 -1
  187. alita_sdk/tools/chunkers/code/codeparser.py +1 -1
  188. alita_sdk/tools/chunkers/sematic/json_chunker.py +2 -1
  189. alita_sdk/tools/chunkers/sematic/markdown_chunker.py +97 -6
  190. alita_sdk/tools/chunkers/sematic/proposal_chunker.py +1 -1
  191. alita_sdk/tools/chunkers/universal_chunker.py +270 -0
  192. alita_sdk/tools/cloud/aws/__init__.py +11 -7
  193. alita_sdk/tools/cloud/azure/__init__.py +11 -7
  194. alita_sdk/tools/cloud/gcp/__init__.py +11 -7
  195. alita_sdk/tools/cloud/k8s/__init__.py +11 -7
  196. alita_sdk/tools/code/linter/__init__.py +9 -8
  197. alita_sdk/tools/code/loaders/codesearcher.py +3 -2
  198. alita_sdk/tools/code/sonar/__init__.py +20 -13
  199. alita_sdk/tools/code_indexer_toolkit.py +199 -0
  200. alita_sdk/tools/confluence/__init__.py +21 -14
  201. alita_sdk/tools/confluence/api_wrapper.py +197 -58
  202. alita_sdk/tools/confluence/loader.py +14 -2
  203. alita_sdk/tools/custom_open_api/__init__.py +11 -5
  204. alita_sdk/tools/elastic/__init__.py +10 -8
  205. alita_sdk/tools/elitea_base.py +546 -64
  206. alita_sdk/tools/figma/__init__.py +11 -8
  207. alita_sdk/tools/figma/api_wrapper.py +352 -153
  208. alita_sdk/tools/github/__init__.py +17 -17
  209. alita_sdk/tools/github/api_wrapper.py +9 -26
  210. alita_sdk/tools/github/github_client.py +81 -12
  211. alita_sdk/tools/github/schemas.py +2 -1
  212. alita_sdk/tools/github/tool.py +5 -1
  213. alita_sdk/tools/gitlab/__init__.py +18 -13
  214. alita_sdk/tools/gitlab/api_wrapper.py +224 -80
  215. alita_sdk/tools/gitlab_org/__init__.py +13 -10
  216. alita_sdk/tools/google/bigquery/__init__.py +13 -13
  217. alita_sdk/tools/google/bigquery/tool.py +5 -1
  218. alita_sdk/tools/google_places/__init__.py +20 -11
  219. alita_sdk/tools/jira/__init__.py +21 -11
  220. alita_sdk/tools/jira/api_wrapper.py +315 -168
  221. alita_sdk/tools/keycloak/__init__.py +10 -8
  222. alita_sdk/tools/localgit/__init__.py +8 -3
  223. alita_sdk/tools/localgit/local_git.py +62 -54
  224. alita_sdk/tools/localgit/tool.py +5 -1
  225. alita_sdk/tools/memory/__init__.py +38 -14
  226. alita_sdk/tools/non_code_indexer_toolkit.py +7 -2
  227. alita_sdk/tools/ocr/__init__.py +10 -8
  228. alita_sdk/tools/openapi/__init__.py +281 -108
  229. alita_sdk/tools/openapi/api_wrapper.py +883 -0
  230. alita_sdk/tools/openapi/tool.py +20 -0
  231. alita_sdk/tools/pandas/__init__.py +18 -11
  232. alita_sdk/tools/pandas/api_wrapper.py +40 -45
  233. alita_sdk/tools/pandas/dataframe/generator/base.py +3 -1
  234. alita_sdk/tools/postman/__init__.py +10 -11
  235. alita_sdk/tools/postman/api_wrapper.py +19 -8
  236. alita_sdk/tools/postman/postman_analysis.py +8 -1
  237. alita_sdk/tools/pptx/__init__.py +10 -10
  238. alita_sdk/tools/qtest/__init__.py +21 -14
  239. alita_sdk/tools/qtest/api_wrapper.py +1784 -88
  240. alita_sdk/tools/rally/__init__.py +12 -10
  241. alita_sdk/tools/report_portal/__init__.py +22 -16
  242. alita_sdk/tools/salesforce/__init__.py +21 -16
  243. alita_sdk/tools/servicenow/__init__.py +20 -16
  244. alita_sdk/tools/servicenow/api_wrapper.py +1 -1
  245. alita_sdk/tools/sharepoint/__init__.py +16 -14
  246. alita_sdk/tools/sharepoint/api_wrapper.py +179 -39
  247. alita_sdk/tools/sharepoint/authorization_helper.py +191 -1
  248. alita_sdk/tools/sharepoint/utils.py +8 -2
  249. alita_sdk/tools/slack/__init__.py +11 -7
  250. alita_sdk/tools/sql/__init__.py +21 -19
  251. alita_sdk/tools/sql/api_wrapper.py +71 -23
  252. alita_sdk/tools/testio/__init__.py +20 -13
  253. alita_sdk/tools/testrail/__init__.py +12 -11
  254. alita_sdk/tools/testrail/api_wrapper.py +214 -46
  255. alita_sdk/tools/utils/__init__.py +28 -4
  256. alita_sdk/tools/utils/content_parser.py +182 -62
  257. alita_sdk/tools/utils/text_operations.py +254 -0
  258. alita_sdk/tools/vector_adapters/VectorStoreAdapter.py +83 -27
  259. alita_sdk/tools/xray/__init__.py +17 -14
  260. alita_sdk/tools/xray/api_wrapper.py +58 -113
  261. alita_sdk/tools/yagmail/__init__.py +8 -3
  262. alita_sdk/tools/zephyr/__init__.py +11 -7
  263. alita_sdk/tools/zephyr_enterprise/__init__.py +15 -9
  264. alita_sdk/tools/zephyr_enterprise/api_wrapper.py +30 -15
  265. alita_sdk/tools/zephyr_essential/__init__.py +15 -10
  266. alita_sdk/tools/zephyr_essential/api_wrapper.py +297 -54
  267. alita_sdk/tools/zephyr_essential/client.py +6 -4
  268. alita_sdk/tools/zephyr_scale/__init__.py +12 -8
  269. alita_sdk/tools/zephyr_scale/api_wrapper.py +39 -31
  270. alita_sdk/tools/zephyr_squad/__init__.py +11 -7
  271. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/METADATA +184 -37
  272. alita_sdk-0.3.562.dist-info/RECORD +450 -0
  273. alita_sdk-0.3.562.dist-info/entry_points.txt +2 -0
  274. alita_sdk/tools/bitbucket/tools.py +0 -304
  275. alita_sdk-0.3.257.dist-info/RECORD +0 -343
  276. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/WHEEL +0 -0
  277. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/licenses/LICENSE +0 -0
  278. {alita_sdk-0.3.257.dist-info → alita_sdk-0.3.562.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,228 @@
1
+ """
2
+ Agent UI and display utilities.
3
+
4
+ Rich console formatting for agent interactions.
5
+ """
6
+
7
+ from rich.console import Console, Group
8
+ from rich.panel import Panel
9
+ from rich.table import Table
10
+ from rich.markdown import Markdown
11
+ from rich import box
12
+ from rich.text import Text
13
+ from rich.align import Align
14
+ from rich.columns import Columns
15
+ from rich.rule import Rule
16
+
17
+ console = Console()
18
+
19
+ # ALITA ASCII Art Logo - block letters
20
+ ALITA_LOGO = [
21
+ " █████╗ ██╗ ██╗████████╗ █████╗ ",
22
+ "██╔══██╗██║ ██║╚══██╔══╝██╔══██╗",
23
+ "███████║██║ ██║ ██║ ███████║",
24
+ "██╔══██║██║ ██║ ██║ ██╔══██║",
25
+ "██║ ██║███████╗██║ ██║ ██║ ██║",
26
+ "╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝",
27
+ ]
28
+
29
+
30
+ def get_version():
31
+ """Get CLI version from package."""
32
+ try:
33
+ from importlib.metadata import version
34
+ return version('alita_sdk')
35
+ except Exception:
36
+ return "0.3.x"
37
+
38
+
39
+ def print_banner(agent_name: str, agent_type: str = "Local Agent"):
40
+ """Print a cool banner for the chat session with ASCII art."""
41
+
42
+ version = get_version()
43
+
44
+ # Create the main banner content
45
+ banner_text = Text()
46
+
47
+ # Add logo lines with cyan styling
48
+ for line in ALITA_LOGO:
49
+ banner_text.append(" " + line + "\n", style="bold cyan")
50
+
51
+ banner_text.append("\n")
52
+ banner_text.append(" CLI ", style="dim")
53
+ banner_text.append(f"v{version}\n\n", style="bold white")
54
+
55
+ # Agent info
56
+ banner_text.append(" ● ", style="bold green")
57
+ banner_text.append("Agent: ", style="bold white")
58
+ banner_text.append(f"{agent_name}\n", style="bold cyan")
59
+ banner_text.append(" ● ", style="bold green")
60
+ banner_text.append("Type: ", style="bold white")
61
+ banner_text.append(f"{agent_type}\n", style="cyan")
62
+
63
+ console.print()
64
+ console.print(Panel(
65
+ banner_text,
66
+ box=box.DOUBLE,
67
+ border_style="cyan",
68
+ padding=(0, 2),
69
+ ))
70
+
71
+
72
+ def print_help():
73
+ """Print help message with commands using rich table."""
74
+ table = Table(
75
+ show_header=True,
76
+ header_style="bold cyan",
77
+ border_style="dim",
78
+ box=box.SIMPLE,
79
+ padding=(0, 1),
80
+ )
81
+
82
+ table.add_column("Command", style="bold yellow", no_wrap=True, width=16)
83
+ table.add_column("Description", style="white")
84
+
85
+ table.add_row("/clear", "Clear conversation history")
86
+ table.add_row("/history", "Show conversation history")
87
+ table.add_row("/save", "Save conversation to file")
88
+ table.add_row("/agent", "Switch to a different agent or direct chat")
89
+ table.add_row("/model", "Switch to a different model (preserves history)")
90
+ table.add_row("/reload", "Reload agent from file (hot reload)")
91
+ table.add_row("/mode", "Set approval mode: always, auto, yolo")
92
+ table.add_row("/dir [add|rm] <path>", "Add/remove/list allowed directories")
93
+ table.add_row("/inventory <path>", "Load inventory/knowledge graph from JSON file")
94
+ table.add_row("/session", "List or resume previous sessions with plans")
95
+ table.add_row("/add_mcp", "Add an MCP server (preserves history)")
96
+ table.add_row("/add_toolkit", "Add a toolkit (preserves history)")
97
+ table.add_row("/rm_mcp", "Remove an MCP server")
98
+ table.add_row("/rm_toolkit", "Remove a toolkit")
99
+ table.add_row("/help", "Show this help")
100
+ table.add_row("exit", "End conversation")
101
+
102
+ console.print(table)
103
+ console.print()
104
+
105
+
106
+ def print_welcome(agent_name: str, model: str = "gpt-4o", temperature: float = 0.1, mode: str = "always"):
107
+ """Print combined welcome banner with logo, agent info, and help in two columns."""
108
+
109
+ version = get_version()
110
+
111
+ # Mode display with color
112
+ mode_colors = {'always': 'yellow', 'auto': 'green', 'yolo': 'red'}
113
+ mode_color = mode_colors.get(mode, 'white')
114
+
115
+ # Left column: Logo + version + agent info
116
+ left_content = Text()
117
+ for line in ALITA_LOGO:
118
+ left_content.append(line + "\n", style="bold cyan")
119
+ left_content.append(" CLI ", style="dim")
120
+ left_content.append(f"v{version}\n\n", style="bold white")
121
+ left_content.append("● ", style="bold green")
122
+ left_content.append("Agent: ", style="bold white")
123
+ left_content.append(f"{agent_name}\n", style="bold cyan")
124
+ left_content.append("● ", style="bold green")
125
+ left_content.append("Model: ", style="bold white")
126
+ left_content.append(f"{model}", style="cyan")
127
+ left_content.append(" | ", style="dim")
128
+ left_content.append("Temp: ", style="bold white")
129
+ left_content.append(f"{temperature}\n", style="cyan")
130
+ left_content.append("● ", style="bold green")
131
+ left_content.append("Mode: ", style="bold white")
132
+ left_content.append(f"{mode}\n", style=f"bold {mode_color}")
133
+
134
+ # Right column: Commands
135
+ right_content = Text()
136
+ right_content.append("\n") # Align with logo
137
+ right_content.append("/help", style="bold yellow")
138
+ right_content.append(" Show all commands\n", style="dim")
139
+ right_content.append("/agent", style="bold yellow")
140
+ right_content.append(" Switch agent\n", style="dim")
141
+ right_content.append("/model", style="bold yellow")
142
+ right_content.append(" Switch model\n", style="dim")
143
+ right_content.append("/reload", style="bold yellow")
144
+ right_content.append(" Reload agent file\n", style="dim")
145
+ right_content.append("/mode", style="bold yellow")
146
+ right_content.append(" Set approval mode\n", style="dim")
147
+ right_content.append("/dir", style="bold yellow")
148
+ right_content.append(" Add/list directories\n", style="dim")
149
+ right_content.append("/session", style="bold yellow")
150
+ right_content.append(" List/resume sessions\n", style="dim")
151
+ right_content.append("/inventory", style="bold yellow")
152
+ right_content.append(" Load knowledge graph\n", style="dim")
153
+ right_content.append("/add_mcp", style="bold yellow")
154
+ right_content.append(" Add MCP server\n", style="dim")
155
+ right_content.append("/add_toolkit", style="bold yellow")
156
+ right_content.append(" Add toolkit\n", style="dim")
157
+ right_content.append("exit", style="bold yellow")
158
+ right_content.append(" End conversation\n", style="dim")
159
+
160
+ # Create two-column layout
161
+ columns = Columns([left_content, right_content], padding=(0, 4), expand=False)
162
+
163
+ console.print()
164
+ console.print(Panel(
165
+ columns,
166
+ box=box.DOUBLE,
167
+ border_style="cyan",
168
+ padding=(1, 2),
169
+ ))
170
+ console.print()
171
+
172
+
173
+ def render_plan(plan_state) -> None:
174
+ """Render a plan with checkboxes."""
175
+ if not plan_state or not plan_state.steps:
176
+ return
177
+
178
+ console.print(plan_state.render())
179
+ console.print()
180
+
181
+
182
+ def render_approval_prompt(tool_name: str, tool_args: dict, truncate: int = 60) -> str:
183
+ """
184
+ Render an approval prompt for a tool call.
185
+
186
+ Returns the formatted string for display in the input box.
187
+ """
188
+ # Format args as a compact string
189
+ args_str = ", ".join(f"{k}={repr(v)[:truncate]}" for k, v in tool_args.items())
190
+ if len(args_str) > 80:
191
+ args_str = args_str[:77] + "..."
192
+
193
+ return f"🔧 {tool_name}: {args_str}"
194
+
195
+
196
+ def display_output(agent_name: str, message: str, output: str):
197
+ """Display agent output with markdown rendering if applicable."""
198
+ console.print(f"\n[bold cyan]🤖 Agent: {agent_name}[/bold cyan]\n")
199
+ console.print(f"[bold]Message:[/bold] {message}\n")
200
+ console.print("[bold]Response:[/bold]")
201
+
202
+ # Ensure output is a string
203
+ if not isinstance(output, str):
204
+ output = str(output)
205
+
206
+ if any(marker in output for marker in ['```', '**', '##', '- ', '* ']):
207
+ console.print(Markdown(output))
208
+ else:
209
+ console.print(output)
210
+ console.print()
211
+
212
+
213
+ def extract_output_from_result(result) -> str:
214
+ """Extract output string from agent result (handles multiple formats)."""
215
+ if isinstance(result, dict):
216
+ # Try different keys that might contain the response
217
+ output = result.get('output')
218
+ if output is None and 'messages' in result:
219
+ # LangGraph format - get last message
220
+ messages = result['messages']
221
+ if messages and len(messages) > 0:
222
+ last_msg = messages[-1]
223
+ output = last_msg.content if hasattr(last_msg, 'content') else str(last_msg)
224
+ if output is None:
225
+ output = str(result)
226
+ else:
227
+ output = str(result)
228
+ return output