mitre-attack / models /chat_state.py
nyasukun's picture
feat: initial project setup and core functionality
5b76d85
from typing import List, Optional, Union, Dict, Any
from langgraph.graph.message import MessagesState
from langchain_core.messages import AIMessage, HumanMessage
from pydantic import BaseModel
class AttackState(MessagesState, total=False):
"""State for the ATT&CK Navigator workflow"""
attack_json: Optional[Dict[str, Any]] = None
scenario: Optional[str] = None
is_valid_context: Optional[bool] = None
extracted_user_scenario: Optional[str] = None
extracted_user_layer_operation: Optional[str] = None
def get_initial_state() -> AttackState:
"""Get the initial state for the workflow"""
return AttackState(
messages=[],
attack_json=None,
scenario=None,
is_valid_context=None,
extracted_user_scenario=None,
extracted_user_layer_operation=None
)
def add_user_message(state: AttackState, content: str) -> AttackState:
"""Add a user message to the state"""
state['messages'].append(HumanMessage(content=content))
return state
def add_ai_message(state: AttackState, content: str) -> AttackState:
"""Add an AI message to the state"""
state['messages'].append(AIMessage(content=content))
return state
def set_attack_json(state: AttackState, attack_json: Dict[str, Any]) -> AttackState:
"""Set the ATT&CK JSON in the state"""
state['attack_json'] = attack_json
return state
def set_scenario(state: AttackState, scenario: str) -> AttackState:
"""Set the scenario text in the state"""
state['scenario'] = scenario
return state
def set_valid_context(state: AttackState, is_valid: bool) -> AttackState:
"""Set the context validity in the state"""
state['is_valid_context'] = is_valid
return state