feat(nakui-ui): persistencia con event log + replay al startup

Cierra "sin persistencia entre runs" del commit anterior. Cada
SeedEntity se appendea al nakui_core::event_log::EventLog con WAL
semantics (log antes que store) y al re-abrir el binario el replay
reconstruye el MemoryStore desde cero. Cerrar y volver a abrir ya
no borra el data.

Cambios:
- MetaUi.event_log: Option<Arc<Mutex<EventLog>>> nuevo. Compartido
  bajo Mutex para que commit_seed pueda mutar.
- Apertura + replay al startup: path por env NAKUI_EVENT_LOG, default
  ./nakui-ui-state.jsonl. EventLog::open + replay_into reconstruyen
  el store. Toast: "log nuevo" o "log X cargado: N evento(s)
  replayed".
- WAL en commit_seed: log.append(LogEntry::Seed { ..., schema_hash:
  None }) antes de store.seed. Si append falla, cancela operacion.
- schema_hash: None es el path "legacy / pre-versioning" documentado
  para seeds que no pasan por Manifest+Executor. Correcto para alta
  via metainterfaz hasta que Action::Morphism wire el Manifest.
- Degradacion gracil: si abrir log falla -> toast error + sigue
  in-memory.

Tests: 1 nuevo E2E event_log_replay_restores_memory_store que escribe
2 seeds via EventLog::append, re-abre + replay_into store fresh,
verifica records con values correctos. 7 tests verdes en nakui-ui.

Activacion con persistencia:
  NAKUI_EVENT_LOG=~/.nakui/state.jsonl \\
  NAKUI_MODULES_DIR=examples/nakui-modules \\
  cargo run -p nakui-ui

Pendientes:
- Action::Morphism (cargar Manifest junto a Module).
- Snapshot/compaction para logs grandes.
- UI para editar/borrar records existentes (hoy solo alta).
- Widget input simple sin selection/IME/clipboard.
This commit is contained in:
Sergio
2026-05-09 20:20:48 +00:00
parent 5d584ff815
commit d60ee5eab2
2 changed files with 210 additions and 4 deletions
+53
View File
@@ -6,6 +6,59 @@ ratio/diff ver `git show <sha>`.
## 2026-05-09
### feat(nakui-ui): persistencia con event log + replay al startup
Cierra "sin persistencia entre runs" del commit anterior. Cada
`SeedEntity` se appendea al `nakui_core::event_log::EventLog` con
WAL semantics (log antes que store) y al re-abrir el binario el
replay reconstruye el `MemoryStore` desde cero. Cerrar y volver a
abrir ya no borra el data.
Cambios:
- **`MetaUi.event_log: Option<Arc<Mutex<EventLog>>>`** nuevo.
Compartido bajo `Mutex` para que el commit_seed pueda mutar.
- **Apertura + replay al startup** (`MetaUi::new`): path por env
`NAKUI_EVENT_LOG`, default `./nakui-ui-state.jsonl`.
`EventLog::open` + `replay_into` reconstruyen el store.
Toast informativo: "log nuevo" o "log X cargado: N evento(s)
replayed".
- **WAL en `commit_seed`**: si `event_log.is_some()`, primero
`log.append(LogEntry::Seed { ..., schema_hash: None })`, después
`store.seed`. Si el append falla, cancela toda la operación
(el user reintenta sin haber dejado state inconsistente).
- **`schema_hash: None`**: documentado como path "legacy /
pre-versioning" para seeds que no pasan por un Manifest+Executor.
Es el path correcto para alta administrativa vía la metainterfaz
hasta que `Action::Morphism` wireé el Manifest loader.
- **Degradación grácil**: si abrir log falla (permisos, disco),
toast con error pero el runtime sigue en modo in-memory.
Tests: 1 nuevo E2E `event_log_replay_restores_memory_store` que
escribe 2 seeds via `EventLog::append`, re-abre y `replay_into` un
store fresh, verifica que ambos records están con sus values
correctos. Reproduce el flujo del startup de `MetaUi::new` sin
necesitar GPUI. 7 tests verdes en nakui-ui.
Activación con persistencia explícita:
```sh
NAKUI_EVENT_LOG=~/.nakui/state.jsonl \\
NAKUI_MODULES_DIR=examples/nakui-modules \\
cargo run -p nakui-ui
# Crear varios records vía el form, cerrar el binario, abrir de
# nuevo: los records están.
```
Limitaciones que **siguen** (próximos iters):
- **`Action::Morphism`** sigue como TODO: requiere cargar el
`Manifest` de nakui-core junto al `Module` UI para conocer los
inputs/params declarados y poder llamar `execute_and_log`.
- **No hay snapshot/compaction**: el log crece append-only para
siempre. Para repos grandes habría que integrar `Snapshot` de
nakui_core (existe, no se usa todavía).
- **No hay UI para borrar/editar** records existentes — sólo alta
vía form. Edit + delete en futuras iteraciones.
- **Widget input simple** (sin selection/IME/clipboard) — heredado
de la limitación documentada de `yahweh-widget-text-input`.
### feat(nakui-ui): inputs reales con yahweh-widget-text-input + click handlers funcionales
Cierra dos limitaciones documentadas en el commit anterior de la
metainterfaz: los formularios ahora aceptan teclado real, y los