Первый запуск сценария и data_projections
В этой заметке разбираем, как сценарии запускаются впервые и как
data_projections связывает концептуальное состояние с физическим
хранилищем (Yjs, KV, SQL) внутри AdaOS.
Это дополняет:
docs/scenarios.md— манифесты сценариев и desktop‑UI.src/adaos/services/scenario/projection_registry.py— загрузка и разрешение projection’ов.
1. Манифест сценария и первый запуск
Манифест сценария лежит по пути:
Пример простого процедурного сценария greet_on_boot:
id: greet_on_boot
version: 0.1.0
title: Greet on boot
description: >
Greets the user on first boot, collects basic profile info and shows quickstart tips.
steps:
- name: ask_name
call: io.console.print
args:
text: "Hi! What's your name?"
- name: get_name
call: io.voice.stt.listen
save_as: user_name
- name: greet
call: io.voice.tts.speak
args:
text: "Nice to meet you, ${user_name}!"
Такие сценарии выполняет процедурный ScenarioRuntime
(см. src/adaos/sdk/scenarios/runtime.py) и они не определяют UI —
их можно запускать из CLI или кода Python.
Desktop‑сценарии (например, web_desktop и prompt_engineer_scenario)
дополнительно имеют scenario.json, который описывает seed UI и workflow
для Yjs, но идентичность и data_projections остаются в scenario.yaml.
2. data_projections: связывание слотов с хранилищем
Секция data_projections в scenario.yaml описывает, как логические пары
(scope, slot) сопоставляются с конкретными backend’ами хранения.
На рантайме это загружается ProjectionRegistry и используется
SDK‑хелперами (например, ctx.*) для маршрутизации чтений и записей.
Пример из web_desktop:
id: web_desktop
version: 0.0.1
title: Web Desktop
description: Desktop shell scenario that defines the main UI layout, registry and base catalog.
type: desktop
depends:
- web_desktop_skill
updated_at: "2025-11-14T18:14:36+00:00"
data_projections:
- scope: current_user
slot: profile.settings
targets:
- backend: kv
- backend: yjs
path: data/skills/profile/{user_id}/settings
- scope: subnet
slot: weather.snapshot
targets:
- backend: yjs
path: data/weather
На уровне реализации ProjectionRegistry строит таблицу соответствий
между (scope, slot) и backend’ами + путями. SDK‑слой (контекст ctx)
инкуapsулирует детали, так что LLM‑программисту достаточно думать о слотах,
а не о конкретных Yjs‑путях или ключах в KV.
3. Конвейер desktop‑сценария
Для desktop‑кейсов важно понимать полный конвейер от описаний до web‑клиента:
digraph desktop_pipeline {
rankdir=LR;
node [shape=box, style=rounded];
scenario_yaml [label="scenario.yaml\n(id, type, data_projections, depends)"];
scenario_json [label="scenario.json\n(UI + workflow seed)"];
runtime [label="WebspaceScenarioRuntime\n+ ProjectionRegistry"];
ydoc [label="YDoc / Yjs store"];
web_client [label="Web client\n(AdaOS Web UI)"];
scenario_yaml -> runtime;
scenario_json -> runtime;
runtime -> ydoc;
ydoc -> web_client;
}
Коротко:
scenario.yamlзадаёт идентичность сценария, тип, зависимости иdata_projections.scenario.jsonописывает изначальную модель UI (widgets, модалки, каталоги).WebspaceScenarioRuntimeиProjectionRegistryобъединяют это в структуру Yjs (YDoc).- Web‑клиент подписывается на YDoc и рендерит интерфейс.
4. Диаграмма для data_projections
Ещё один взгляд на слой проекций:
digraph data_projections {
rankdir=LR;
node [shape=box, style=rounded];
scenario_yaml [label="scenario.yaml\n(data_projections)"];
registry [label="ProjectionRegistry"];
backends [label="Backends\n(Yjs / KV / SQL)"];
scenario_yaml -> registry -> backends;
}
Идея: сценарий описывает «что и где хранить», ProjectionRegistry
переводит это в структуру данных, а конкретные backend’ы отвечают
за физическое состояние.