siada-cli 0.0.1__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 (215) hide show
  1. agent_config.yaml +34 -0
  2. siada/__init__.py +13 -0
  3. siada/agent_hub/__init__.py +10 -0
  4. siada/agent_hub/coder/bug_fix_agent.py +398 -0
  5. siada/agent_hub/coder/code_gen_agent.py +235 -0
  6. siada/agent_hub/coder/fe_gen_agent.py +37 -0
  7. siada/agent_hub/coder/issue_review_agent.py +68 -0
  8. siada/agent_hub/coder/prompt/__init__.py +0 -0
  9. siada/agent_hub/coder/prompt/base/__init__.py +0 -0
  10. siada/agent_hub/coder/prompt/base/capabilities.py +18 -0
  11. siada/agent_hub/coder/prompt/base/non_interactive.py +14 -0
  12. siada/agent_hub/coder/prompt/base/prompt_builder.py +33 -0
  13. siada/agent_hub/coder/prompt/base/rules.py +40 -0
  14. siada/agent_hub/coder/prompt/base/tool_use.py +14 -0
  15. siada/agent_hub/coder/prompt/bug_prompt/bug_fix_prompt.py +51 -0
  16. siada/agent_hub/coder/prompt/bug_prompt/rules.py +53 -0
  17. siada/agent_hub/coder/prompt/code_gen_prompt.py +45 -0
  18. siada/agent_hub/coder/prompt/fe_gen_prompt.py +45 -0
  19. siada/agent_hub/coder/prompt/issue_review_prompt.py +121 -0
  20. siada/agent_hub/coder/tracing/__init__.py +22 -0
  21. siada/agent_hub/coder/tracing/logger_tracing_processor.py +458 -0
  22. siada/agent_hub/hooks/__init__.py +0 -0
  23. siada/agent_hub/hooks/io_hooks.py +30 -0
  24. siada/agent_hub/siada_agent.py +214 -0
  25. siada/config/__init__.py +0 -0
  26. siada/config/config_loader.py +67 -0
  27. siada/entrypoint/__init__.py +3 -0
  28. siada/entrypoint/args_parser/__init__.py +0 -0
  29. siada/entrypoint/args_parser/args.py +195 -0
  30. siada/entrypoint/interaction/__init__.py +0 -0
  31. siada/entrypoint/interaction/base_turn.py +107 -0
  32. siada/entrypoint/interaction/config.py +30 -0
  33. siada/entrypoint/interaction/controller.py +122 -0
  34. siada/entrypoint/interaction/nointeractive_controller.py +27 -0
  35. siada/entrypoint/interaction/turn/interface.py +116 -0
  36. siada/entrypoint/interaction/turn/models.py +34 -0
  37. siada/entrypoint/interaction/turn/run_turn.py +641 -0
  38. siada/entrypoint/interaction/turn_factory.py +35 -0
  39. siada/entrypoint/interaction/turn_models.py +28 -0
  40. siada/entrypoint/siadahub.py +413 -0
  41. siada/foundation/__init__.py +0 -0
  42. siada/foundation/code_agent_context.py +48 -0
  43. siada/foundation/config.py +59 -0
  44. siada/foundation/constants.py +2 -0
  45. siada/foundation/context.py +76 -0
  46. siada/foundation/logging.py +341 -0
  47. siada/foundation/tools/__init__.py +0 -0
  48. siada/foundation/tools/get_git_diff.py +105 -0
  49. siada/io/__init__.py +0 -0
  50. siada/io/banner.py +148 -0
  51. siada/io/color_settings.py +207 -0
  52. siada/io/color_utils.py +16 -0
  53. siada/io/components/__init__.py +0 -0
  54. siada/io/components/mdstream.py +204 -0
  55. siada/io/console_printer.py +68 -0
  56. siada/io/io.py +661 -0
  57. siada/io/key_bindings.py +129 -0
  58. siada/io/notification_command.py +40 -0
  59. siada/io/test_banner.py +64 -0
  60. siada/models/__init__.py +0 -0
  61. siada/models/agent.py +47 -0
  62. siada/models/coder/__init__.py +0 -0
  63. siada/models/converter.py +27 -0
  64. siada/models/model_base_config.py +121 -0
  65. siada/models/model_run_config.py +153 -0
  66. siada/provider/__init__.py +0 -0
  67. siada/provider/client_factory.py +112 -0
  68. siada/provider/llm_client.py +11 -0
  69. siada/provider/openrouter/__init__.py +0 -0
  70. siada/provider/openrouter/coverter.py +17 -0
  71. siada/provider/openrouter/openroute_provider.py +33 -0
  72. siada/provider/provider_factory.py +53 -0
  73. siada/queries/tree-sitter-language-pack/README.md +7 -0
  74. siada/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
  75. siada/queries/tree-sitter-language-pack/c-tags.scm +9 -0
  76. siada/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
  77. siada/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
  78. siada/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
  79. siada/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
  80. siada/queries/tree-sitter-language-pack/d-tags.scm +26 -0
  81. siada/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
  82. siada/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
  83. siada/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
  84. siada/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
  85. siada/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
  86. siada/queries/tree-sitter-language-pack/go-tags.scm +42 -0
  87. siada/queries/tree-sitter-language-pack/java-tags.scm +20 -0
  88. siada/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
  89. siada/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
  90. siada/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
  91. siada/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
  92. siada/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
  93. siada/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
  94. siada/queries/tree-sitter-language-pack/python-tags.scm +14 -0
  95. siada/queries/tree-sitter-language-pack/r-tags.scm +21 -0
  96. siada/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
  97. siada/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
  98. siada/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
  99. siada/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
  100. siada/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
  101. siada/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
  102. siada/queries/tree-sitter-languages/README.md +23 -0
  103. siada/queries/tree-sitter-languages/c-tags.scm +9 -0
  104. siada/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
  105. siada/queries/tree-sitter-languages/cpp-tags.scm +15 -0
  106. siada/queries/tree-sitter-languages/dart-tags.scm +91 -0
  107. siada/queries/tree-sitter-languages/elisp-tags.scm +8 -0
  108. siada/queries/tree-sitter-languages/elixir-tags.scm +54 -0
  109. siada/queries/tree-sitter-languages/elm-tags.scm +19 -0
  110. siada/queries/tree-sitter-languages/go-tags.scm +30 -0
  111. siada/queries/tree-sitter-languages/hcl-tags.scm +77 -0
  112. siada/queries/tree-sitter-languages/java-tags.scm +20 -0
  113. siada/queries/tree-sitter-languages/javascript-tags.scm +88 -0
  114. siada/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
  115. siada/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
  116. siada/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
  117. siada/queries/tree-sitter-languages/php-tags.scm +26 -0
  118. siada/queries/tree-sitter-languages/python-tags.scm +12 -0
  119. siada/queries/tree-sitter-languages/ql-tags.scm +26 -0
  120. siada/queries/tree-sitter-languages/ruby-tags.scm +64 -0
  121. siada/queries/tree-sitter-languages/rust-tags.scm +60 -0
  122. siada/queries/tree-sitter-languages/scala-tags.scm +65 -0
  123. siada/queries/tree-sitter-languages/typescript-tags.scm +41 -0
  124. siada/services/__init__.py +30 -0
  125. siada/services/at_file_recommendation_design_document.md +1213 -0
  126. siada/services/code_context_manager.py +136 -0
  127. siada/services/enhanced_fix_result_check.py +546 -0
  128. siada/services/execution_trace_collector.py +207 -0
  129. siada/services/file_recommendation/__init__.py +136 -0
  130. siada/services/file_recommendation/core/__init__.py +17 -0
  131. siada/services/file_recommendation/core/completion_engine.py +351 -0
  132. siada/services/file_recommendation/core/config.py +62 -0
  133. siada/services/file_recommendation/core/file_discovery.py +353 -0
  134. siada/services/file_recommendation/core/suggestion.py +110 -0
  135. siada/services/file_recommendation/utils/__init__.py +22 -0
  136. siada/services/file_recommendation/utils/path_utils.py +138 -0
  137. siada/services/file_recommendation/utils/text_utils.py +253 -0
  138. siada/services/fix_result_check.py +377 -0
  139. siada/services/handle_at_command/README.md +247 -0
  140. siada/services/handle_at_command/__init__.py +115 -0
  141. siada/services/handle_at_command/exceptions.py +46 -0
  142. siada/services/handle_at_command/models.py +92 -0
  143. siada/services/handle_at_command/parser.py +189 -0
  144. siada/services/handle_at_command/processor.py +321 -0
  145. siada/services/handle_at_command/resolver.py +318 -0
  146. siada/services/handle_at_command/utils.py +345 -0
  147. siada/services/model_info_service.py +103 -0
  148. siada/services/siada_runner.py +170 -0
  149. siada/session/__init__.py +29 -0
  150. siada/session/session_manager.py +66 -0
  151. siada/session/session_models.py +43 -0
  152. siada/support/__init__.py +0 -0
  153. siada/support/completer.py +204 -0
  154. siada/support/editor.py +146 -0
  155. siada/support/envprocessor.py +54 -0
  156. siada/support/repo.py +51 -0
  157. siada/support/slash_commands.py +410 -0
  158. siada/support/spinner.py +320 -0
  159. siada/tools/__init__.py +0 -0
  160. siada/tools/ast/README.md +345 -0
  161. siada/tools/ast/ast_tool.py +341 -0
  162. siada/tools/ast/models.py +11 -0
  163. siada/tools/coder/__init__.py +0 -0
  164. siada/tools/coder/ask_followup_question.py +70 -0
  165. siada/tools/coder/cmd_runner.py +132 -0
  166. siada/tools/coder/file_operator.py +284 -0
  167. siada/tools/coder/file_search/README.md +223 -0
  168. siada/tools/coder/file_search/__init__.py +10 -0
  169. siada/tools/coder/file_search/bin/rg-linux-arm64 +0 -0
  170. siada/tools/coder/file_search/bin/rg-linux-x64 +0 -0
  171. siada/tools/coder/file_search/bin/rg-macos-arm64 +0 -0
  172. siada/tools/coder/file_search/bin/rg-macos-x64 +0 -0
  173. siada/tools/coder/file_search/bin/rg.exe +0 -0
  174. siada/tools/coder/file_search/search.py +437 -0
  175. siada/tools/coder/file_search/setup_package.py +150 -0
  176. siada/tools/coder/file_search/test_search.py +142 -0
  177. siada/tools/coder/files.py +147 -0
  178. siada/tools/coder/fix_attempt_completion.py +58 -0
  179. siada/tools/coder/issue_review_completion.py +29 -0
  180. siada/tools/coder/observation/__init__.py +0 -0
  181. siada/tools/coder/observation/error.py +22 -0
  182. siada/tools/coder/observation/file_observation.py +216 -0
  183. siada/tools/coder/observation/observation.py +71 -0
  184. siada/tools/coder/repo_map/__init__.py +157 -0
  185. siada/tools/coder/repo_map/dump.py +29 -0
  186. siada/tools/coder/repo_map/io.py +226 -0
  187. siada/tools/coder/repo_map/repo_map.py +881 -0
  188. siada/tools/coder/repo_map/special.py +203 -0
  189. siada/tools/coder/repo_map/token_counter.py +154 -0
  190. siada/tools/coder/repo_map/waiting.py +221 -0
  191. siada/tools/coder/reproduce_completion.py +39 -0
  192. siada/tools/coder/run_cmd.py +60 -0
  193. siada/tools/coder/test_completion.py +25 -0
  194. siada/tools/coder/tool_docs.py +44 -0
  195. siada/tools/compression_tool.py +200 -0
  196. siada/tools/read_many_files/README.md +220 -0
  197. siada/tools/read_many_files/__init__.py +25 -0
  198. siada/tools/read_many_files/file_processor.py +486 -0
  199. siada/tools/read_many_files/filters.py +326 -0
  200. siada/tools/read_many_files/formatters.py +204 -0
  201. siada/tools/read_many_files/models.py +189 -0
  202. siada/tools/read_many_files_tool.py +233 -0
  203. siada/tools/tool_call_format/__init__.py +55 -0
  204. siada/tools/tool_call_format/file_to_language.py +231 -0
  205. siada/tools/tool_call_format/formatter_factory.py +80 -0
  206. siada/tools/tool_call_format/formatters.py +282 -0
  207. siada/tools/tool_call_format/tool_call_formatter.py +54 -0
  208. siada/tools/web/__init__.py +0 -0
  209. siada/tools/web/web_crawl.py +208 -0
  210. siada/utils.py +194 -0
  211. siada_cli-0.0.1.dist-info/LICENSE +201 -0
  212. siada_cli-0.0.1.dist-info/METADATA +457 -0
  213. siada_cli-0.0.1.dist-info/RECORD +215 -0
  214. siada_cli-0.0.1.dist-info/WHEEL +4 -0
  215. siada_cli-0.0.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,122 @@
1
+ """
2
+ Interaction Controller Module
3
+
4
+ Manages the AI coding interaction lifecycle and controls the main interaction flow.
5
+ Separates core interaction logic from main entry point for better code organization.
6
+ """
7
+
8
+ from dataclasses import dataclass
9
+
10
+ import siada.support.completer
11
+ from siada import __version__
12
+ from siada.entrypoint.interaction.config import RunningConfig
13
+ from siada.entrypoint.interaction.turn.run_turn import TurnFactory, TurnInput
14
+ from siada.io.io import InputOutput
15
+ from siada.models.model_run_config import ModelRunConfig
16
+ from siada.session.session_manager import RunningSessionManager
17
+ from siada.support.slash_commands import SlashCommands, SwitchEvent
18
+ from rich.console import Console
19
+
20
+ import time
21
+ import sys
22
+
23
+
24
+ class Controller:
25
+ """Controls user-AI coding interactions and manages coder lifecycle"""
26
+
27
+ def __init__(self, config: RunningConfig, slash_commands: SlashCommands, shell_mode: bool = False):
28
+ self.config = config
29
+ self.slash_commands = slash_commands
30
+ self.shell_mode = shell_mode
31
+ self.last_keyboard_interrupt = None
32
+
33
+ def run(self) -> int:
34
+ session = RunningSessionManager.create_session(
35
+ siada_config=self.config,
36
+ )
37
+ display_rule = True
38
+ while True:
39
+ try:
40
+ user_input = self.config.io.get_input(
41
+ completer=self.config.completer if not self.shell_mode else None,
42
+ display_rule=display_rule,
43
+ color=(
44
+ self.config.running_color_settings.user_input_color
45
+ if not self.shell_mode
46
+ else self.config.running_color_settings.shell_model_color
47
+ ),
48
+ )
49
+
50
+ display_rule = True
51
+ if user_input.strip() == "":
52
+ display_rule = False
53
+ continue
54
+
55
+ if self.shell_mode and user_input.strip() in ["exit", "quit"]:
56
+ # exit the shell mode
57
+ self.shell_mode = False
58
+ self.config.io.print_info("Switching to agent mode...")
59
+ continue
60
+
61
+ if self.shell_mode:
62
+ user_input = f"!{user_input}"
63
+
64
+ turn = TurnFactory.create_turn(
65
+ self.config, session, self.slash_commands, user_input
66
+ )
67
+ turn_output = turn.execute(TurnInput(use_input=user_input))
68
+
69
+ if isinstance(turn_output.output, SwitchEvent):
70
+ if turn_output.output.kwargs.get("agent"):
71
+
72
+ self.config.agent_name = turn_output.output.kwargs.get("agent")
73
+ # clear the session to avoid the previous agent's messages
74
+ session.state.openai_session.clear_session()
75
+
76
+ elif turn_output.output.kwargs.get("model"):
77
+ self.config.model = turn_output.output.kwargs.get("model")
78
+ # show the announcements in every switch event
79
+ if turn_output.output.kwargs.get("shell"):
80
+ self.shell_mode = True
81
+ self.show_announcements()
82
+ except KeyboardInterrupt as e:
83
+ self.keyboard_interrupt()
84
+ break
85
+ except Exception as e:
86
+ self.config.io.print_error(e)
87
+ break
88
+
89
+ def get_announcements(self):
90
+ lines = []
91
+ lines.append(f"Siada CLI v{__version__}")
92
+
93
+ output = f"Agent: {self.config.agent_name}, Provider: {self.config.llm_config.provider}, Model: {self.config.llm_config.model_name}"
94
+
95
+ # Check for thinking token budget
96
+ thinking_tokens = self.config.llm_config.get_thinking_tokens()
97
+ if thinking_tokens:
98
+ output += f", {thinking_tokens} think tokens"
99
+
100
+ # Check for reasoning effort
101
+ reasoning_effort = self.config.llm_config.get_reasoning_effort()
102
+ if reasoning_effort:
103
+ output += f", reasoning {reasoning_effort}"
104
+
105
+ if self.shell_mode:
106
+ output += ", shell mode"
107
+ else:
108
+ output += ", agent mode"
109
+
110
+ lines.append(output)
111
+ return lines
112
+
113
+ def show_announcements(self):
114
+ for line in self.get_announcements():
115
+ self.config.io.print_info(line)
116
+
117
+ def keyboard_interrupt(self):
118
+ # Ensure cursor is visible on exit
119
+ Console().show_cursor(True)
120
+
121
+ self.config.io.print_warning("\n\n^C KeyboardInterrupt")
122
+ sys.exit()
@@ -0,0 +1,27 @@
1
+ import asyncio
2
+ from unittest import result
3
+ from siada.entrypoint.interaction.config import RunningConfig
4
+ from siada.services.siada_runner import SiadaRunner
5
+ from siada.session.session_manager import RunningSessionManager
6
+
7
+
8
+ class NoInteractiveController:
9
+ """Controls user-AI coding interactions and manages coder lifecycle"""
10
+
11
+ def __init__(self, config: RunningConfig):
12
+ self.config = config
13
+
14
+ def run(self, user_input: str) -> int:
15
+ session = RunningSessionManager.create_session(
16
+ siada_config=self.config,
17
+ )
18
+ result = asyncio.run(
19
+ SiadaRunner.run_agent(
20
+ agent_name=self.config.agent_name,
21
+ user_input=user_input,
22
+ workspace=self.config.workspace,
23
+ session=session,
24
+ )
25
+ )
26
+ self.config.io.print(result)
27
+ return 0
@@ -0,0 +1,116 @@
1
+ """
2
+ Turn Interface Module
3
+
4
+ Contains abstract base classes and interfaces for interaction turns.
5
+ """
6
+
7
+ from typing import Optional, Any
8
+ from abc import ABC, abstractmethod
9
+
10
+ from agents import TResponseInputItem
11
+
12
+ # Import existing config and models
13
+ from ..config import RunningConfig
14
+ from .models import TurnType, TurnInput, TurnOutput
15
+
16
+
17
+ class RunTurn(ABC):
18
+ """Abstract base class for interaction turns"""
19
+
20
+ def __init__(self, config: RunningConfig, session: Any, slash_commands: Any):
21
+ """Initialize turn with configuration and session
22
+
23
+ Args:
24
+ config: InteractionConfig with execution parameters
25
+ session: Current session instance
26
+ """
27
+ self.config = config
28
+ self.session = session
29
+ self.slash_commands = slash_commands
30
+
31
+ # Data tracking
32
+ self.input_data: Optional[TurnInput] = None
33
+ self.output_data: Optional[TurnOutput] = None
34
+ self.start_time: Optional[float] = None
35
+ self.end_time: Optional[float] = None
36
+ self.error: Optional[Exception] = None
37
+
38
+ @abstractmethod
39
+ def execute(self, turn_input: TurnInput) -> TurnOutput:
40
+ """Execute the turn with given input
41
+
42
+ Args:
43
+ turn_input: Input data for this turn
44
+
45
+ Returns:
46
+ TurnOutput: Result of turn execution
47
+ """
48
+ pass
49
+
50
+ def can_handle(self, user_input: str) -> bool:
51
+ """Check if this turn type can handle the given input
52
+
53
+ Args:
54
+ user_input: Raw user input string
55
+
56
+ Returns:
57
+ bool: True if this turn can handle the input
58
+ """
59
+ return True
60
+
61
+ def prepare_input(self, raw_input: str) -> TurnInput:
62
+ """Prepare turn input from raw user input
63
+
64
+ Args:
65
+ raw_input: Raw user input string
66
+
67
+ Returns:
68
+ TurnInput: Prepared input for turn execution
69
+ """
70
+ return TurnInput(use_input=raw_input)
71
+
72
+ def get_turn_type(self) -> TurnType:
73
+ """Get the type of this turn
74
+
75
+ Returns:
76
+ TurnType: Type of this turn
77
+ """
78
+ return TurnType.CONVERSATION
79
+
80
+ def validate_input(self, turn_input: TurnInput) -> bool:
81
+ """Validate turn input
82
+
83
+ Args:
84
+ turn_input: Input to validate
85
+
86
+ Returns:
87
+ bool: True if input is valid
88
+ """
89
+ return bool(turn_input.use_input and turn_input.use_input.strip())
90
+
91
+ def handle_error(self, error: Exception) -> TurnOutput:
92
+ """Handle execution error
93
+
94
+ Args:
95
+ error: Exception that occurred
96
+
97
+ Returns:
98
+ TurnOutput: Error response
99
+ """
100
+ self.error = error
101
+
102
+ # Print full error traceback for debugging
103
+ import traceback
104
+ full_traceback = traceback.format_exc()
105
+ self.config.io.print_error(f"Error occurred: {str(error)}\n\nFull traceback:\n{full_traceback}")
106
+ return TurnOutput(
107
+ output=f"Error: {str(error)}",
108
+ metadata={"error_type": type(error).__name__},
109
+ next_action=None,
110
+ )
111
+
112
+ def _get_timestamp(self) -> float:
113
+ """Get current timestamp"""
114
+ import time
115
+
116
+ return time.time()
@@ -0,0 +1,34 @@
1
+ """
2
+ Turn Models Module
3
+
4
+ Contains data models and type definitions for interaction turns.
5
+ """
6
+
7
+ from typing import Optional, Dict, Any
8
+ from dataclasses import dataclass
9
+ from enum import Enum
10
+
11
+ from siada.support.slash_commands import SwitchEvent
12
+
13
+
14
+ class TurnType(Enum):
15
+ """Types of interaction turns"""
16
+
17
+ COMMAND = "command" # Slash commands (/help, /edit, etc.)
18
+ CONVERSATION = "conversation" # Regular AI conversation
19
+
20
+
21
+ @dataclass
22
+ class TurnInput:
23
+ """Input data for a turn"""
24
+
25
+ use_input: str # Raw user input
26
+
27
+
28
+ @dataclass
29
+ class TurnOutput:
30
+ """Output data from a turn"""
31
+
32
+ output: str | SwitchEvent # Response content
33
+ metadata: Dict[str, Any] # Response metadata
34
+ next_action: Optional[str] # Suggested next action