Usages:
  conventions: .goga/usages/conventions.md

Annotations: |
  Использовать `conventions` для правил написания кода и тестов.

  Базовый интерфейс endpoints.
  `RESTResource` определяет контракт REST-ресурса с методами get/post/put/delete.
  `MCPTool` определяет контракт MCP инструмента.
  Мутируются конкретными реализациями в sententia/api и sententia/mcp.

---

"RESTResource()":
  location: rest.py
  annotations: |
    Базовый тип REST-ресурса. Определяет контракт HTTP-обработчика.
    Мутируется конкретными ресурсами.

    Требования:
    - Все методы по умолчанию выбрасывают NotImplementedError("Method Not Allowed")
    - Свойство url_rule — абстрактное, мутированный ресурс обязан его определить
    - Мутированный ресурс переопределяет только нужные HTTP-методы с конкретными параметрами
  properties:
    url_rule -> str: |
      Абстрактное свойство. Шаблон URL маршрута.
      Мутированный ресурс обязан определить это свойство конкретным значением.
  methods:
    "get() -> response:Any": |
      Обработка GET-запроса. Заглушка — выбрасывает NotImplementedError("Method Not Allowed").
      Мутированный ресурс переопределяет с конкретными параметрами и типом возврата.
      Сигнатура аргументов определяется мутированным типом.
    "post() -> response:Any": |
      Обработка POST-запроса. Заглушка — выбрасывает NotImplementedError("Method Not Allowed").
      Мутированный ресурс переопределяет с конкретными параметрами и типом возврата.
      Сигнатура аргументов определяется мутированным типом.
    "put() -> response:Any": |
      Обработка PUT-запроса. Заглушка — выбрасывает NotImplementedError("Method Not Allowed").
      Мутированный ресурс переопределяет с конкретными параметрами и типом возврата.
      Сигнатура аргументов определяется мутированным типом.
    "delete() -> response:Any": |
      Обработка DELETE-запроса. Заглушка — выбрасывает NotImplementedError("Method Not Allowed").
      Мутированный ресурс переопределяет с конкретными параметрами и типом возврата.
      Сигнатура аргументов определяется мутированным типом.

"MCPTool()":
  location: mcp.py
  annotations: |
    Базовый тип MCP инструмента. Определяет контракт для внешних MCP-клиентов.
    Мутируется конкретными инструментами.

    Требования:
    - Свойства name и description — абстрактные, мутированный инструмент обязан их определить
    - Метод execute — абстрактный, мутированный инструмент обязан его переопределить с конкретными параметрами
  properties:
    name -> str: |
      Абстрактное свойство. Имя инструмента для регистрации в MCP-сервере.
      Мутированный инструмент обязан определить это свойство конкретным значением.
    description -> str: |
      Абстрактное свойство. Человекочитаемое описание инструмента для MCP-клиентов.
      Мутированный инструмент обязан определить это свойство конкретным значением.
  methods:
    "execute() -> result:Any": |
      Выполнение инструмента. Заглушка — выбрасывает NotImplementedError.
      Мутированный инструмент переопределяет с конкретными параметрами и типом возврата.
      Сигнатура аргументов и тип возвращаемого значения определяются мутированным типом.

---

Author: Goga
CreatedAt: 16/05/26
Description: |
  Базовый интерфейс endpoints: RESTResource для HTTP-обработчиков, MCPTool для MCP инструментов.
