feat(agent): add rust agent baseline scaffold
This commit is contained in:
@@ -0,0 +1,196 @@
|
||||
# AWatch-rus Rust Agent Baseline
|
||||
|
||||
Документ описывает промышленный каркас будущего Rust Agent. Это baseline
|
||||
агента, а не реализация мониторинга пользователя.
|
||||
|
||||
## Архитектура
|
||||
|
||||
Crate:
|
||||
|
||||
```text
|
||||
adk-rust/crates/awatch-agent
|
||||
```
|
||||
|
||||
Слои:
|
||||
|
||||
- `config` - загрузка конфигурации из файла и безопасные значения по умолчанию;
|
||||
- `envelope` - единый telemetry envelope и heartbeat contract;
|
||||
- `spool` - локальная очередь `spool/pending` и `spool/dead-letter`;
|
||||
- `transport` - отправка envelope и retry/backoff;
|
||||
- `health` - локальные `GET /healthz` и `GET /metrics`;
|
||||
- `logging` - structured JSON logging;
|
||||
- `metrics` - Prometheus text format.
|
||||
|
||||
Каркас не собирает активность пользователя и не реализует DLP/EDR-функции.
|
||||
|
||||
## Telemetry Envelope
|
||||
|
||||
Единый контракт:
|
||||
|
||||
```json
|
||||
{
|
||||
"agent_id": "00000000-0000-5000-8000-000000000001",
|
||||
"host_id": "00000000-0000-5000-8000-000000000002",
|
||||
"platform": "windows",
|
||||
"timestamp": "2026-06-07T00:00:00Z",
|
||||
"records": []
|
||||
}
|
||||
```
|
||||
|
||||
`records` остается пустым или содержит только служебные записи baseline, пока
|
||||
отдельные collectors не прошли acceptance gates.
|
||||
|
||||
## Heartbeat
|
||||
|
||||
Heartbeat записывается как служебный record:
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "heartbeat",
|
||||
"payload": {
|
||||
"agent_version": "0.1.0",
|
||||
"platform": "windows",
|
||||
"status": "online"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Heartbeat не содержит hostname, список процессов, окна, clipboard, screenshots,
|
||||
пакеты сети или содержимое документов.
|
||||
|
||||
## Local Spool
|
||||
|
||||
Очередь:
|
||||
|
||||
```text
|
||||
spool/
|
||||
├── pending/
|
||||
└── dead-letter/
|
||||
```
|
||||
|
||||
Поведение:
|
||||
|
||||
- `enqueue` пишет envelope атомарно через временный файл и rename;
|
||||
- успешная отправка удаляет запись из `pending`;
|
||||
- временная ошибка увеличивает `retry_count` и сохраняет запись;
|
||||
- превышение `retry_max_attempts` переносит запись в `dead-letter`;
|
||||
- поврежденный JSON переносится в `dead-letter` с reason-файлом.
|
||||
|
||||
## Retry
|
||||
|
||||
Retry использует bounded exponential backoff:
|
||||
|
||||
```text
|
||||
base_backoff_ms * 2^attempt
|
||||
```
|
||||
|
||||
Число попыток ограничено `retry_max_attempts`. Запись не удаляется из spool без
|
||||
успешной отправки.
|
||||
|
||||
## Health
|
||||
|
||||
Локальный endpoint:
|
||||
|
||||
```text
|
||||
GET /healthz
|
||||
```
|
||||
|
||||
Ответ:
|
||||
|
||||
```json
|
||||
{
|
||||
"ok": true,
|
||||
"status": "online",
|
||||
"agent_version": "0.1.0"
|
||||
}
|
||||
```
|
||||
|
||||
Endpoint предназначен для локального service/task health-check и не должен
|
||||
публиковаться наружу без отдельного решения.
|
||||
|
||||
## Metrics
|
||||
|
||||
Prometheus metrics:
|
||||
|
||||
- `awatch_agent_queued_records`;
|
||||
- `awatch_agent_retry_count`;
|
||||
- `awatch_agent_heartbeat_sent`;
|
||||
- `awatch_agent_spool_size`.
|
||||
|
||||
Локальный endpoint:
|
||||
|
||||
```text
|
||||
GET /metrics
|
||||
```
|
||||
|
||||
CLI-проверка:
|
||||
|
||||
```bash
|
||||
awatch-agent --metrics
|
||||
```
|
||||
|
||||
## Structured Logging
|
||||
|
||||
JSON log line содержит:
|
||||
|
||||
- `timestamp`;
|
||||
- `level`;
|
||||
- `agent_id`;
|
||||
- `component`;
|
||||
- `message`.
|
||||
|
||||
Пример:
|
||||
|
||||
```json
|
||||
{
|
||||
"timestamp": "2026-06-07T00:00:00Z",
|
||||
"level": "INFO",
|
||||
"agent_id": "00000000-0000-5000-8000-000000000001",
|
||||
"component": "heartbeat",
|
||||
"message": "heartbeat envelope queued"
|
||||
}
|
||||
```
|
||||
|
||||
## CLI
|
||||
|
||||
Сформировать heartbeat envelope без отправки:
|
||||
|
||||
```bash
|
||||
awatch-agent --print-envelope
|
||||
```
|
||||
|
||||
Поставить heartbeat в локальную очередь:
|
||||
|
||||
```bash
|
||||
awatch-agent --enqueue-heartbeat
|
||||
```
|
||||
|
||||
Выгрузить spool:
|
||||
|
||||
```bash
|
||||
awatch-agent --flush-spool
|
||||
```
|
||||
|
||||
Запустить локальный health endpoint:
|
||||
|
||||
```bash
|
||||
awatch-agent --healthz
|
||||
```
|
||||
|
||||
## Ограничения
|
||||
|
||||
Запрещено и не реализовано:
|
||||
|
||||
- keylogger;
|
||||
- screenshot capture;
|
||||
- clipboard capture;
|
||||
- packet interception;
|
||||
- process injection;
|
||||
- kernel drivers;
|
||||
- EDR functionality;
|
||||
- DLP functionality;
|
||||
- ML;
|
||||
- LLM.
|
||||
|
||||
Platform claims остаются ограниченными: baseline-каркас компилируется как Rust
|
||||
crate, но production-поддержка конкретной ОС требует отдельной валидации.
|
||||
@@ -1,4 +1,4 @@
|
||||
.docs/roadmap/TASK_005_RUST_AGENT_BASELINE.md
|
||||
# TASK 005: Rust Agent Baseline
|
||||
|
||||
Рекомендуемые параметры
|
||||
|
||||
@@ -184,3 +184,26 @@ docs/RUST_AGENT_BASELINE_RU.md
|
||||
7. Результаты проверок.
|
||||
8. Известные ограничения.
|
||||
|
||||
## Выполнение
|
||||
|
||||
Статус: done.
|
||||
|
||||
Файлы:
|
||||
|
||||
- `adk-rust/crates/awatch-agent/` - новый baseline crate без мониторинга
|
||||
пользователя;
|
||||
- `docs/RUST_AGENT_BASELINE_RU.md` - архитектура, envelope, spool, retry,
|
||||
heartbeat, health, logging и metrics;
|
||||
- `README.md` - ссылка на Rust Agent baseline;
|
||||
- `adk-rust/crates/awatch-agent-rs/` - совместимое усиление текущего
|
||||
проверенного runtime: отдельные поля telemetry/worktime backlog и flush;
|
||||
- `docs/roadmap/TASK_005_RUST_AGENT_BASELINE.md` - зафиксирован статус.
|
||||
|
||||
Границы:
|
||||
|
||||
- `awatch-agent` не собирает активность пользователя, процессы, clipboard,
|
||||
screenshots, пакеты сети или документы;
|
||||
- `awatch-agent-rs` остается текущим проверенным Windows worktime/session
|
||||
runtime;
|
||||
- новые collectors, EDR/DLP/ML/LLM и production claims по неподтвержденным ОС
|
||||
не добавлялись.
|
||||
|
||||
Reference in New Issue
Block a user