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.
- agent_config.yaml +34 -0
- siada/__init__.py +13 -0
- siada/agent_hub/__init__.py +10 -0
- siada/agent_hub/coder/bug_fix_agent.py +398 -0
- siada/agent_hub/coder/code_gen_agent.py +235 -0
- siada/agent_hub/coder/fe_gen_agent.py +37 -0
- siada/agent_hub/coder/issue_review_agent.py +68 -0
- siada/agent_hub/coder/prompt/__init__.py +0 -0
- siada/agent_hub/coder/prompt/base/__init__.py +0 -0
- siada/agent_hub/coder/prompt/base/capabilities.py +18 -0
- siada/agent_hub/coder/prompt/base/non_interactive.py +14 -0
- siada/agent_hub/coder/prompt/base/prompt_builder.py +33 -0
- siada/agent_hub/coder/prompt/base/rules.py +40 -0
- siada/agent_hub/coder/prompt/base/tool_use.py +14 -0
- siada/agent_hub/coder/prompt/bug_prompt/bug_fix_prompt.py +51 -0
- siada/agent_hub/coder/prompt/bug_prompt/rules.py +53 -0
- siada/agent_hub/coder/prompt/code_gen_prompt.py +45 -0
- siada/agent_hub/coder/prompt/fe_gen_prompt.py +45 -0
- siada/agent_hub/coder/prompt/issue_review_prompt.py +121 -0
- siada/agent_hub/coder/tracing/__init__.py +22 -0
- siada/agent_hub/coder/tracing/logger_tracing_processor.py +458 -0
- siada/agent_hub/hooks/__init__.py +0 -0
- siada/agent_hub/hooks/io_hooks.py +30 -0
- siada/agent_hub/siada_agent.py +214 -0
- siada/config/__init__.py +0 -0
- siada/config/config_loader.py +67 -0
- siada/entrypoint/__init__.py +3 -0
- siada/entrypoint/args_parser/__init__.py +0 -0
- siada/entrypoint/args_parser/args.py +195 -0
- siada/entrypoint/interaction/__init__.py +0 -0
- siada/entrypoint/interaction/base_turn.py +107 -0
- siada/entrypoint/interaction/config.py +30 -0
- siada/entrypoint/interaction/controller.py +122 -0
- siada/entrypoint/interaction/nointeractive_controller.py +27 -0
- siada/entrypoint/interaction/turn/interface.py +116 -0
- siada/entrypoint/interaction/turn/models.py +34 -0
- siada/entrypoint/interaction/turn/run_turn.py +641 -0
- siada/entrypoint/interaction/turn_factory.py +35 -0
- siada/entrypoint/interaction/turn_models.py +28 -0
- siada/entrypoint/siadahub.py +413 -0
- siada/foundation/__init__.py +0 -0
- siada/foundation/code_agent_context.py +48 -0
- siada/foundation/config.py +59 -0
- siada/foundation/constants.py +2 -0
- siada/foundation/context.py +76 -0
- siada/foundation/logging.py +341 -0
- siada/foundation/tools/__init__.py +0 -0
- siada/foundation/tools/get_git_diff.py +105 -0
- siada/io/__init__.py +0 -0
- siada/io/banner.py +148 -0
- siada/io/color_settings.py +207 -0
- siada/io/color_utils.py +16 -0
- siada/io/components/__init__.py +0 -0
- siada/io/components/mdstream.py +204 -0
- siada/io/console_printer.py +68 -0
- siada/io/io.py +661 -0
- siada/io/key_bindings.py +129 -0
- siada/io/notification_command.py +40 -0
- siada/io/test_banner.py +64 -0
- siada/models/__init__.py +0 -0
- siada/models/agent.py +47 -0
- siada/models/coder/__init__.py +0 -0
- siada/models/converter.py +27 -0
- siada/models/model_base_config.py +121 -0
- siada/models/model_run_config.py +153 -0
- siada/provider/__init__.py +0 -0
- siada/provider/client_factory.py +112 -0
- siada/provider/llm_client.py +11 -0
- siada/provider/openrouter/__init__.py +0 -0
- siada/provider/openrouter/coverter.py +17 -0
- siada/provider/openrouter/openroute_provider.py +33 -0
- siada/provider/provider_factory.py +53 -0
- siada/queries/tree-sitter-language-pack/README.md +7 -0
- siada/queries/tree-sitter-language-pack/arduino-tags.scm +5 -0
- siada/queries/tree-sitter-language-pack/c-tags.scm +9 -0
- siada/queries/tree-sitter-language-pack/chatito-tags.scm +16 -0
- siada/queries/tree-sitter-language-pack/commonlisp-tags.scm +122 -0
- siada/queries/tree-sitter-language-pack/cpp-tags.scm +15 -0
- siada/queries/tree-sitter-language-pack/csharp-tags.scm +26 -0
- siada/queries/tree-sitter-language-pack/d-tags.scm +26 -0
- siada/queries/tree-sitter-language-pack/dart-tags.scm +92 -0
- siada/queries/tree-sitter-language-pack/elisp-tags.scm +5 -0
- siada/queries/tree-sitter-language-pack/elixir-tags.scm +54 -0
- siada/queries/tree-sitter-language-pack/elm-tags.scm +19 -0
- siada/queries/tree-sitter-language-pack/gleam-tags.scm +41 -0
- siada/queries/tree-sitter-language-pack/go-tags.scm +42 -0
- siada/queries/tree-sitter-language-pack/java-tags.scm +20 -0
- siada/queries/tree-sitter-language-pack/javascript-tags.scm +88 -0
- siada/queries/tree-sitter-language-pack/lua-tags.scm +34 -0
- siada/queries/tree-sitter-language-pack/ocaml-tags.scm +115 -0
- siada/queries/tree-sitter-language-pack/ocaml_interface-tags.scm +98 -0
- siada/queries/tree-sitter-language-pack/pony-tags.scm +39 -0
- siada/queries/tree-sitter-language-pack/properties-tags.scm +5 -0
- siada/queries/tree-sitter-language-pack/python-tags.scm +14 -0
- siada/queries/tree-sitter-language-pack/r-tags.scm +21 -0
- siada/queries/tree-sitter-language-pack/racket-tags.scm +12 -0
- siada/queries/tree-sitter-language-pack/ruby-tags.scm +64 -0
- siada/queries/tree-sitter-language-pack/rust-tags.scm +60 -0
- siada/queries/tree-sitter-language-pack/solidity-tags.scm +43 -0
- siada/queries/tree-sitter-language-pack/swift-tags.scm +51 -0
- siada/queries/tree-sitter-language-pack/udev-tags.scm +20 -0
- siada/queries/tree-sitter-languages/README.md +23 -0
- siada/queries/tree-sitter-languages/c-tags.scm +9 -0
- siada/queries/tree-sitter-languages/c_sharp-tags.scm +46 -0
- siada/queries/tree-sitter-languages/cpp-tags.scm +15 -0
- siada/queries/tree-sitter-languages/dart-tags.scm +91 -0
- siada/queries/tree-sitter-languages/elisp-tags.scm +8 -0
- siada/queries/tree-sitter-languages/elixir-tags.scm +54 -0
- siada/queries/tree-sitter-languages/elm-tags.scm +19 -0
- siada/queries/tree-sitter-languages/go-tags.scm +30 -0
- siada/queries/tree-sitter-languages/hcl-tags.scm +77 -0
- siada/queries/tree-sitter-languages/java-tags.scm +20 -0
- siada/queries/tree-sitter-languages/javascript-tags.scm +88 -0
- siada/queries/tree-sitter-languages/kotlin-tags.scm +27 -0
- siada/queries/tree-sitter-languages/ocaml-tags.scm +115 -0
- siada/queries/tree-sitter-languages/ocaml_interface-tags.scm +98 -0
- siada/queries/tree-sitter-languages/php-tags.scm +26 -0
- siada/queries/tree-sitter-languages/python-tags.scm +12 -0
- siada/queries/tree-sitter-languages/ql-tags.scm +26 -0
- siada/queries/tree-sitter-languages/ruby-tags.scm +64 -0
- siada/queries/tree-sitter-languages/rust-tags.scm +60 -0
- siada/queries/tree-sitter-languages/scala-tags.scm +65 -0
- siada/queries/tree-sitter-languages/typescript-tags.scm +41 -0
- siada/services/__init__.py +30 -0
- siada/services/at_file_recommendation_design_document.md +1213 -0
- siada/services/code_context_manager.py +136 -0
- siada/services/enhanced_fix_result_check.py +546 -0
- siada/services/execution_trace_collector.py +207 -0
- siada/services/file_recommendation/__init__.py +136 -0
- siada/services/file_recommendation/core/__init__.py +17 -0
- siada/services/file_recommendation/core/completion_engine.py +351 -0
- siada/services/file_recommendation/core/config.py +62 -0
- siada/services/file_recommendation/core/file_discovery.py +353 -0
- siada/services/file_recommendation/core/suggestion.py +110 -0
- siada/services/file_recommendation/utils/__init__.py +22 -0
- siada/services/file_recommendation/utils/path_utils.py +138 -0
- siada/services/file_recommendation/utils/text_utils.py +253 -0
- siada/services/fix_result_check.py +377 -0
- siada/services/handle_at_command/README.md +247 -0
- siada/services/handle_at_command/__init__.py +115 -0
- siada/services/handle_at_command/exceptions.py +46 -0
- siada/services/handle_at_command/models.py +92 -0
- siada/services/handle_at_command/parser.py +189 -0
- siada/services/handle_at_command/processor.py +321 -0
- siada/services/handle_at_command/resolver.py +318 -0
- siada/services/handle_at_command/utils.py +345 -0
- siada/services/model_info_service.py +103 -0
- siada/services/siada_runner.py +170 -0
- siada/session/__init__.py +29 -0
- siada/session/session_manager.py +66 -0
- siada/session/session_models.py +43 -0
- siada/support/__init__.py +0 -0
- siada/support/completer.py +204 -0
- siada/support/editor.py +146 -0
- siada/support/envprocessor.py +54 -0
- siada/support/repo.py +51 -0
- siada/support/slash_commands.py +410 -0
- siada/support/spinner.py +320 -0
- siada/tools/__init__.py +0 -0
- siada/tools/ast/README.md +345 -0
- siada/tools/ast/ast_tool.py +341 -0
- siada/tools/ast/models.py +11 -0
- siada/tools/coder/__init__.py +0 -0
- siada/tools/coder/ask_followup_question.py +70 -0
- siada/tools/coder/cmd_runner.py +132 -0
- siada/tools/coder/file_operator.py +284 -0
- siada/tools/coder/file_search/README.md +223 -0
- siada/tools/coder/file_search/__init__.py +10 -0
- siada/tools/coder/file_search/bin/rg-linux-arm64 +0 -0
- siada/tools/coder/file_search/bin/rg-linux-x64 +0 -0
- siada/tools/coder/file_search/bin/rg-macos-arm64 +0 -0
- siada/tools/coder/file_search/bin/rg-macos-x64 +0 -0
- siada/tools/coder/file_search/bin/rg.exe +0 -0
- siada/tools/coder/file_search/search.py +437 -0
- siada/tools/coder/file_search/setup_package.py +150 -0
- siada/tools/coder/file_search/test_search.py +142 -0
- siada/tools/coder/files.py +147 -0
- siada/tools/coder/fix_attempt_completion.py +58 -0
- siada/tools/coder/issue_review_completion.py +29 -0
- siada/tools/coder/observation/__init__.py +0 -0
- siada/tools/coder/observation/error.py +22 -0
- siada/tools/coder/observation/file_observation.py +216 -0
- siada/tools/coder/observation/observation.py +71 -0
- siada/tools/coder/repo_map/__init__.py +157 -0
- siada/tools/coder/repo_map/dump.py +29 -0
- siada/tools/coder/repo_map/io.py +226 -0
- siada/tools/coder/repo_map/repo_map.py +881 -0
- siada/tools/coder/repo_map/special.py +203 -0
- siada/tools/coder/repo_map/token_counter.py +154 -0
- siada/tools/coder/repo_map/waiting.py +221 -0
- siada/tools/coder/reproduce_completion.py +39 -0
- siada/tools/coder/run_cmd.py +60 -0
- siada/tools/coder/test_completion.py +25 -0
- siada/tools/coder/tool_docs.py +44 -0
- siada/tools/compression_tool.py +200 -0
- siada/tools/read_many_files/README.md +220 -0
- siada/tools/read_many_files/__init__.py +25 -0
- siada/tools/read_many_files/file_processor.py +486 -0
- siada/tools/read_many_files/filters.py +326 -0
- siada/tools/read_many_files/formatters.py +204 -0
- siada/tools/read_many_files/models.py +189 -0
- siada/tools/read_many_files_tool.py +233 -0
- siada/tools/tool_call_format/__init__.py +55 -0
- siada/tools/tool_call_format/file_to_language.py +231 -0
- siada/tools/tool_call_format/formatter_factory.py +80 -0
- siada/tools/tool_call_format/formatters.py +282 -0
- siada/tools/tool_call_format/tool_call_formatter.py +54 -0
- siada/tools/web/__init__.py +0 -0
- siada/tools/web/web_crawl.py +208 -0
- siada/utils.py +194 -0
- siada_cli-0.0.1.dist-info/LICENSE +201 -0
- siada_cli-0.0.1.dist-info/METADATA +457 -0
- siada_cli-0.0.1.dist-info/RECORD +215 -0
- siada_cli-0.0.1.dist-info/WHEEL +4 -0
- 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
|