File size: 1,968 Bytes
b8989d2
ced2940
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# agents/tools/command_parser.py

"""
Извлечение команд из JSON или размеченного текста.
Поддерживает следующие варианты:
- Явно размеченные JSON-блоки (```json ... ```)
- Префиксные команды (например, !shell, !graph)
"""

import json
import re
from typing import List, Optional, Dict, Any


COMMAND_PREFIXES = ["shell", "graph", "diary", "note"]


class ParsedCommand:
    def __init__(self, command_type: str, payload: Any):
        self.command_type = command_type
        self.payload = payload

    def __repr__(self):
        return f"<ParsedCommand {self.command_type}: {repr(self.payload)}>"


def parse_commands(text: str) -> List[ParsedCommand]:
    """Основной интерфейс: принимает текст, возвращает список ParsedCommand."""
    commands = []

    # 1. Поиск JSON-блоков
    for match in re.finditer(r"```json\n(.*?)```", text, re.DOTALL):
        block = match.group(1).strip()
        try:
            data = json.loads(block)
            if isinstance(data, dict) and "type" in data:
                commands.append(ParsedCommand(data["type"], data.get("payload")))
        except json.JSONDecodeError:
            continue

    # 2. Поиск префиксных команд (!shell, !graph и т.д.)
    for line in text.splitlines():
        for prefix in COMMAND_PREFIXES:
            if line.strip().startswith(f"!{prefix}"):
                payload = line.strip()[len(f"!{prefix}"):].strip()
                commands.append(ParsedCommand(prefix, payload))

    return commands


if __name__ == "__main__":
    sample = """
Вот пример команды:
```json
{
  "type": "shell",
  "payload": "ls -la"
}
```
А вот другая: !note Надо не забыть включить свет
"""
    cmds = parse_commands(sample)
    for c in cmds:
        print(c)