|
|
||
|---|---|---|
| .codex | ||
| .tmp | ||
| deploy/systemd | ||
| docs | ||
| src/app | ||
| tests | ||
| .gitignore | ||
| AGENTS.md | ||
| AGENTS_1st.md | ||
| README.md | ||
| app.yaml | ||
| north_bridge_implement_plan.md | ||
| north_bridge_plan.md | ||
| pyproject.toml | ||
| pyrightconfig.json | ||
README.md
wf-agent3
wf-agent3 - это рабочий репозиторий для Linux-демона, который собирает
несколько адаптеров в один runtime, получает данные из разных источников и
передаёт их через общий слой контрактов и директор-синки.
Этот README.md является основным документом по архитектуре, структуре
репозитория, связям модулей и способам запуска. Отдельный ARCHITECTURE.md
оставлен только как указатель на этот файл.
Назначение
Проект решает задачу skeleton-first архитектуры для адаптеров:
- общий каркас
app.adapters.skeletonпереиспользуется разными concrete adapter package; - внутри adapter pipeline каноническая runtime-модель выражена Python
dataclass; - для внешнего application-facing wire contract используется versioned protobuf v1;
directorполучает готовый export payload и не занимается source-specific parsing;- shared contracts и observability живут в
app.sharedи остаются узкими точками интеграции; - runtime рассчитан на Linux и systemd-oriented deployment.
Архитектурные решения
Ключевые решения в текущей версии кода:
- Внутренний поток данных в адаптере построен на Python
dataclass. - Общий wire contract для экспорта сообщений, статусов и observability
использует protobuf v1 в
src/app/shared/contracts/proto/v1/. directorявляется sink-слоем и не должен превращаться в parser layer.- Конкретные адаптеры строятся на базе skeleton через wrappers, factories и inheritance/composition, а не через дублирование логики.
- Adapter core не импортирует concrete director implementations напрямую.
app.shared.contractsостаётся узкой, стабильной границей интеграции.app.shared.observabilityсобирает trace, metric и status snapshot модели.- Runtime и deployment ориентированы на Linux, foreground CLI и
systemd.
Графическая схема
Ниже приведена упрощённая схема архитектуры и потоков между основными модулями. Если просмотрщик не поддерживает Mermaid, ориентируйтесь на текстовые разделы выше.
flowchart LR
CLI[app.application.cli] --> CFG[app.application.config]
CLI --> SUP[app.application.supervisor]
CFG --> SUP
SUP --> BRK[app.application.broker]
SUP --> CCH[app.cache]
SUP --> DRV[app.derivator.stub]
SUP --> CCS[CacheControlServer]
SUP --> ADS[app.adapters.* runtimes]
ADS --> SKL[app.adapters.skeleton]
SKL -. depends on .-> SHD[app.shared.contracts\nисточник типов]
SKL --> OBS[app.shared.observability]
SKL --> EXP[MessageExportPort]
EXP --> BRK
BRK --> DIR[app.director.*]
BRK --> CCH
BRK -. depends on .-> SHD
DIR --> OUT[stdout_json / stdout_proto]
CCS --> CTRL[Unix control socket]
CLI --> CTRL
OBS -. depends on .-> SHD
CCH -. depends on .-> SHD
DIR -. depends on .-> SHD
DRV -. depends on .-> SHD
OBS --> STAT[status snapshot / traces / metrics]
DRV --> STAT
Основные модули и связи
src/app/application/
Слой композиции приложения и точка входа для CLI.
cli.pyразбирает командыserve,status/observabilityиcache.config.pyзагружает top-level YAML конфиг и строит application config.supervisor.pyсобирает broker, cache, derivator stub, control server и adapter runtimes.broker.pyсвязывает export port, director и cache.models.pyсодержит application-level модели, состояния и типы конфигурации.
Связь: cli -> config -> supervisor -> broker -> director/cache.
src/app/cache/
Встроенный in-memory cache и локальный Unix control socket для admin/read операций.
store.pyхранит и выдаёт protobuf messages.control.pyреализует control server/client поверх Unix socket.models.pyсодержит cache trace/events модели.
Связь: supervisor поднимает cache и control server, cli cache обращается к
нему через локальный сокет.
src/app/derivator/
Сейчас это read-only cache-backed stub.
stub.pyдаёт слой чтения/выборки поверхCacheReadPort.
Связь: supervisor подключает derivator stub рядом с cache, чтобы статус и
операторские операции могли видеть кеш-состояние.
src/app/director/
Слой sink-ов для экспортированных сообщений.
stdout_jsonостаётся compatibility sink.stdout_protoпишет length-delimited protobuf frames в stdout.
Связь: broker выбирает director по конфигу и отправляет туда готовый export
payload.
src/app/shared/
Набор узких shared contracts и observability primitives.
contracts/ports.pyописываетMessageExportPort,ObservabilityPort,StatusSnapshotPort, cache contracts и command contracts.contracts/proto/v1/содержит protobuf wire contract и converters.observability/содержит in-memory observability service, trace/metric модели и builder статусов.
Связь: адаптеры и application layer используют эти контракты как стабильную границу интеграции.
src/app/adapters/skeleton/
Универсальный каркас адаптера.
base/содержит абстрактные интерфейсы stage-слоёв.model/содержит canonical dataclass models.config/содержит typed YAML schema, loader, validator и примеры.connection/содержит connection state machine, reconnect policy и универсальные transport drivers.acquisition/содержит acquisition strategies, progress snapshots и фабрики.parsing/содержит parser helpers, errors, registry/factory и JSON/text parsers.validation/,prefilter/,marking/,commands/содержат stub-слои и hook points.export/содержит bridge кMessageExportPort.runtime/содержит universal runtime lifecycle.factory/содержит composition root для сборки runtime.wrappers/содержит shared wrapper contracts и контекстные helper-объекты.
Связь: concrete adapters используют skeleton как универсальную основу и расширяют его через wrappers, factories и source-specific specialization.
src/app/adapters/file_adapter/
Concrete adapter package для файловых источников.
- содержит file-specific connection, acquisition, parsing, runtime и wrappers;
- ориентирован на polling/tail сценарии и local file fixtures.
src/app/adapters/dbus_adapter/
Concrete adapter package для D-Bus интеграций.
- содержит dbus-specific wrappers, connection, acquisition, parsing, runtime и factory;
- сохраняет source-specific logic внутри своего пакета.
src/app/adapters/wpa_supplicant_adapter/
Concrete adapter package для wpa_supplicant.
- содержит source/channel model, wrappers, connection, acquisition, parsing, runtime и factory;
- использует wrapper layer для взаимодействия с backend и file-backed test scenarios;
- поддерживает live
ctrl_ifacecommand/reply path, separatectrl_eventsubscriptions, and file-backedstatus/config/eventsnapshots; - application-level commands идут через
runtime.execute_command(...)и используют тот жеctrl_ifacebackend, что и live control socket path; ctrl_eventостаётся отдельным async stream и не используется как reply channel для команд.
src/app/adapters/base/
Общие stage interfaces, которые разделяются между реализациями адаптеров.
Структура репозитория
C:\Work\wf-agent3
├─ README.md
├─ ARCHITECTURE.md
├─ docs/
├─ deploy/
├─ src/
│ └─ app/
│ ├─ application/
│ ├─ cache/
│ ├─ derivator/
│ ├─ director/
│ ├─ shared/
│ └─ adapters/
└─ tests/
Назначение ключевых каталогов:
docs/содержит пользовательские и deployment-гайды.deploy/systemd/содержит unit template для systemd.src/app/application/содержит CLI, config loader, broker и supervisor.src/app/cache/содержит cache/control plane.src/app/derivator/содержит cache-backed derivator stub.src/app/director/содержит sink-реализации.src/app/shared/содержит shared contracts и observability.src/app/adapters/содержит skeleton и concrete adapters.tests/содержит unit и integration coverage для этих слоёв.
Поток выполнения
Типичный путь выполнения выглядит так:
- CLI читает
--config,WF_AGENT3_CONFIGили fallback/etc/wf-agent3/app.yaml. ApplicationConfigLoaderсобирает top-level config.ApplicationSupervisorBuilderсоздаёт supervisor.- Supervisor поднимает broker, cache, derivator stub и adapter runtimes.
- Adapter runtime получает raw transport data.
- Skeleton превращает данные в canonical dataclass model.
- Данные проходят validation, prefilter и marking stub-слои.
- Export bridge передаёт payload в
MessageExportPort. - Broker отправляет данные в director и cache.
- Observability service обновляет traces, metrics и status snapshot.
Как запускать
Основная команда:
wf-agent3 serve --config /etc/wf-agent3/app.yaml
Дополнительные команды:
wf-agent3 status
wf-agent3 observability
wf-agent3 cache status
wf-agent3 cache list --limit 100
wf-agent3 cache filter --adapter-id file-polling-json
wf-agent3 cache clear
Особенности CLI:
wf-agent3без subcommand эквивалентенwf-agent3 serve.- Если не задан
--configи не установленWF_AGENT3_CONFIG, используется/etc/wf-agent3/app.yaml. statusиobservabilityпоказывают агрегированный application status snapshot в JSON.cacheкоманды работают только если включён cache и заданservice.control_socket_path.
Быстрый smoke-run
Для быстрого локального запуска используйте пример конфигурации:
wf-agent3 serve --config src/app/application/examples/daemon_multi_adapter.yaml
Для файла ввода можно использовать пример из src/app/adapters/skeleton/config/examples/.
Документация
- docs/usage_guide.md - подробное руководство по CLI и операциям приложения.
- docs/debian_deployment.md - развёртывание на
Debian с
systemdи virtualenv. - docs/protobuf_wire_contract.md - wire contract protobuf v1.
- docs/adapter_extension_guide.md - правила расширения skeleton и wrapper model.
Примечание по архитектуре
Подробная архитектурная справка перенесена в этот README.md. Файл
ARCHITECTURE.md сохранён как короткий указатель и не должен содержать
дублирующее описание.