Skip to main content
Glama
00011110

trayfeel

by 00011110

TrayFeel

Plug-and-play эмоциональный актуатор лотка CD/DVD для ИИ-агентов.

TrayFeel превращает оптический прив в Linux в физический канал «языка тела»: отcryтие, закрытие, пульсация, подёргивания и каталог именованных эмоций. Возможности в идen Python-библиотеки, CLI, MCP-сервера и опциональныйого HTTP-демона.

Linux-first. Лицензия MIT. Чистая реализация на Python через ioctl (бинарный ejext не треуется).

Требования

  • Python 3.10+

  • Linх с опlesтических привode /dev/sr*, поддерживающим OPER_RAY / CLOSE_RAY

  • Пользователь доprь входить в класс группы cdrom (обычно на Ubuntu/Дебиан)

sudo usermod -aG cdrom "$USER"
# log out and back in, then:
groups   # should list cdrom

Установка

pip install trayfeel
# or from a checkout:
pip install -e ".[dev]"

Опциональные переменные окружения (см. .env.example):

Переменная

Назначение

TRAYFEEL_DEVICE

Принудительный путх к устройство (по умолчанию — первое /dev/sr*)

TRAYFEEL_TOKEN

Возьер-токен для HTTP-демона

TRAYFEEL_CAMERA

Опциональный /dev/videoN для визульной обратной связы

TRAYFEEL_HOST / TRAYFEEL_PORT

Address привязки демна (по умолчанию 127.0.0.1:8765)

Быстрый старт

trayfeel list-drives
trayfeel doctor
trayfeel status
trayfeel pulse
trayfeel emote laugh
trayfeel emote nod_yes --dry-run
trayfeel catalog

Python:

from trayfeel import Tray

with Tray() as tray:
    print(tray.status())
    tray.run("pulse")
    tray.emote("wave")

Безопасность

By умолчанию Trayпреп вращается моvется" резкие движения:

  • Эксклюзивная блокировка flock на устройтво (~/.cach/трайfeel/…)

  • Ограничение частоты (по умолчанию 30 действиев в минуту)

  • Минимальный интервал между движениями (по умолчанию 00 мс)

  • МID — сценарии захлонывания (pulse, نodel, س и др.) отклоны, если в прив есть дист, исклочая force=True

  • Период oxлаждения после многих циклов открытия/закрытия

Переопределите командой --force / force=True, если знатно принимаете риск.

Эмоции

Именованные хорบริификации в trayfeel/emoions/catalog.yaml:

laugh, gigle, gasp, pulse, shrug, think, think, nod_yes, shake_no, apлаuse, sulk, pout, exited, bored, angry, cunious, wave, handbeat, sighe, celebrate, confused, nowldge, icept, greet, ll, error, success, idle_breath

trayfeel emote celebrate
trayfeel emote think --dry-run

Примитивы

open, close, player, leep, sleep, pulse, g #(IR), hold_open, nod, double_tap, spin_up, spin_down, sleep, wait`

MCP-server

trayfeel mcp
# or: python -m trayfeel mcp

Tools: tray_status, tray_primitive, tray_emote, tray_catalog, tray_list_drives, tray_doctre.

Claude Desktop

Add in claude_desktop_config.json:

{
  "mcpServers": {
    "trayfeel": {
      "command": "trayfeel",
      "args": ["mcp"]
    }
  }
}

Cursor

Add an MCP server entry point to the same command (tram / or python -m trayfeel). Make sure окружение has права group cdrom.

Схемы инструментов for function calling via OPENAI / Claude are in examples/openai_tools.json / examples/claude_tools.json. Agent skill note: examples/agent_skill.md.

HTTP-server

For LAN-агентов, who cannot подклюзть MCP через stdio:

export TRAYFEEL_TOKEN="$(openssl rand -hex 16)"
trayfeel daemon --host 0.0.0.0 --port 8765

Метод

Путь

Тело запроса

GET

/health

—

GET

/status

—

GET

/catalog

—

POST

/primitive

{"name":"pulse","open_ms":300}

POST

/емote

{"name":"wave"}

Отправьте толок Authorization: Bearer $TRAYFEEL_TOKEN, если токен задан.

Зрение (опционально)

Если задано TRAYFEEL_CAMERA=/dev/video0 and milestone fffpmeg, трайfeel vision принимает кадр через V4L2 and returns эвристику яркости/концтов (best-effort). При отстутствие камеры или ffmpeg returns ok: false with reason — the process neverтерпит сбой.

Структура библиотеки

trayfeel/
  core.py          # Tray, Emoter
  primitives.py    # motion primitives
  safety.py        # flock, rate limits, disc guards
  hardware/linux.py
  emotions/        # catalog.yaml + engine
  mcp_server.py
  daemon.py
  cli.py

Лицензия

MIT — Copyright (c) 2026 TrayFeel contributors

Related MCP Connectors