Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.6 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0095 | Frontend C++ ImGui para `dag_engine` | pendiente | feature |
|
multi-app | alta | 2026-05-17 | 2026-05-17 |
0095 — Frontend C++ ImGui para dag_engine
Status: pendiente
Created: 2026-05-15
Type: app
Blocks: 0096 (data_factory) — necesita frontend C++ unificado para scheduler
Related: apps/dag_engine (Go + Vite/React actual), projects/fn_monitoring/apps/registry_dashboard (referencia pubsub)
Problema
dag_engine (alternativa propia a Dagu, ya existente) hoy sirve dos modos:
- CLI (
run/list/status/validate/server). - Web (Vite + React + Mantine en
apps/dag_engine/frontend/).
El resto del ecosistema de monitorizacion del registry esta en C++ ImGui (registry_dashboard, call_monitor, futuro data_factory). Forzar al usuario a saltar al navegador para gestionar/observar DAGs rompe el flujo. Ademas la app data_factory (issue 0096) necesita embeber vista de scheduler para mostrar que DAG dispara cada extractor — si esa vista es web, no encaja en su UI ImGui.
Objetivo
Anadir app C++ ImGui dag_engine_ui que cubre el caso "ver/lanzar/inspeccionar DAGs" con el mismo backend (dag_engine server HTTP+WS) y reusa el patron pubsub de registry_dashboard (HTTP REST + WebSocket live updates).
NO sustituye el frontend web — convive. El web sigue util para acceso remoto al VPS; el C++ es para uso local en escritorio.
Piezas
Backend (apps/dag_engine, cambios minimos)
- WS hub
DagRunHubenapps/dag_engine/events.gosiguiendo el patron deCallMonitorHub(sqlite_api/events.go):- Hub global con N subscribers WS.
- Ticker arranca solo con >=1 subscriber.
- Polling watermark a tabla
dag_runs+dag_step_resultscada 500ms. - Snapshot inicial al conectar (lista DAGs + ultimos runs).
- Broadcast de eventos:
run_started,step_completed,run_finished,schedule_updated.
- Endpoint
GET /api/ws/dagruns(upgrade WebSocket). - Endpoint
POST /api/dags/:name/run(Run Now) — ya existe; verificar que devuelverun_idinmediato y el hub broadcastea el progreso. - CORS ya abierto en
middleware.go.
App C++ ImGui (apps/dag_engine_ui/)
Scaffolding via fn run init_cpp_app dag_engine_ui --desc "Frontend ImGui para dag_engine".
- Capa HTTP:
data_http.{cpp,h}clona patron deregistry_dashboard/data_http.{cpp,h}(cpp-httplib + nlohmann/json). Endpoints:GET /api/dags-> lista DAGs.GET /api/dags/:name-> detalle.GET /api/dags/:name/runs-> historial.GET /api/runs/:id-> timeline pasos.POST /api/dags/:name/run-> dispara.POST /api/dags/:name/validate-> valida YAML.
- Capa WS:
ws_client.{cpp,h}reusado tal cual deregistry_dashboard. Conecta aws://127.0.0.1:8090/api/ws/dagruns. - Tabs (panels via
cfg.panels):- DAG List — tabla: name, schedule (cron), last_status, last_run_at, next_run_at, tags. Reusa
table_view_cpp_viz. Click fila -> DAG Detail. - DAG Detail — header + metadata + boton "Run Now" + historial ultimos N runs (
table_view_cpp_viz). Reusapage_header_cpp_core,button_cpp_core,badge_cpp_core. - Run Detail — timeline de steps con stdout/stderr expandible. Reusa
tree_view_cpp_corey un componente nuevotimeline_cpp_vizsi no existe (delegar a fn-constructor). - Schedule — vista cron: para cada DAG con
schedule:lo siguiente que va a disparar (next_cron_time_go_core). Mini-calendario opcional. - Health — kpis: runs_24h, success_rate, p95_duration, failed_runs. Reusa
kpi_card_cpp_viz.
- DAG List — tabla: name, schedule (cron), last_status, last_run_at, next_run_at, tags. Reusa
- Live updates: WS recibe eventos -> push a ringbuffer en memoria -> tabs leen del ringbuffer en cada
render. Run en curso se anima (spinner en columna status). - Config:
--api-url http://127.0.0.1:8090(default localhost). Persistencia enapp_settings.ini(gestionado porapp_settings_cpp_core).
Frontmatter app.md
---
name: dag_engine_ui
lang: cpp
domain: tui
description: "Frontend ImGui para dag_engine. Lista, lanza e inspecciona DAGs con live updates via WS. Equivalente local al frontend web."
tags: [imgui, dashboard, dag, scheduler, http, websocket]
uses_functions:
- kpi_card_cpp_viz
- bar_chart_cpp_viz
- table_view_cpp_viz
- dashboard_panel_cpp_core
- dashboard_grid_cpp_core
- page_header_cpp_core
- badge_cpp_core
- button_cpp_core
- icon_button_cpp_core
- toolbar_cpp_core
- text_input_cpp_core
- select_cpp_core
- tree_view_cpp_core
- empty_state_cpp_core
- modal_dialog_cpp_core
- toast_cpp_core
uses_types: []
framework: "imgui"
entry_point: "main.cpp"
dir_path: "apps/dag_engine_ui"
repo_url: "https://gitea-dgg044oo04woo4ggcsws4gk0.organic-machine.com/dataforge/dag_engine_ui"
---
Tag de grupo: anadir scheduler (grupo nuevo si >=3 funciones lo respaldan; revisar antes — si no, dejar plano).
Funciones nuevas a delegar (estimacion)
timeline_cpp_viz— componente ImGui que pinta pasos de un run con duracion + status + expand stdout/stderr. Reusable pordata_factoryv2.cron_explain_go_core(puro) — dado"0 */15 * * *"devuelve string humano "every 15 min". Usado en DAG List.http_poll_json_cpp_core(impuro) — wrapper sobre cpp-httplib que hace GET periodico con backoff y publica deltas via callback. Reusable.
Si patrones se repiten en registry_dashboard (cabecera HTTP+WS hibrido) -> proposal de extraer un mini-cliente comun cpp/functions/core/http_ws_client.{cpp,h}. NO crear inline.
Aceptacion
fn run init_cpp_app dag_engine_uiejecutado, scaffolding limpio.dag_engine serverexpone/api/ws/dagruns(hub con register/unregister/snapshot/delta).- App C++ compila en Linux y Windows (
build_cpp_windows_bash_infra dag_engine_ui). - Smoke: con
dag_engine servercorriendo y un DAG ejemplo, abrir app -> ve DAG en lista, click "Run Now" -> timeline aparece en vivo sin refresh. e2e_checksenapp.md:build_cmake—cmake --build cpp/build -j --target dag_engine_ui.self_test—./dag_engine_ui --self-testarranca, valida conexion HTTP adag_engine, sale 0/1.pytestopcional — script que arrancadag_engine servercon DAG dummy, lanza UI headless (xvfb), spera evento WS, sale 0/1.
fn doctor cpp-appsno reporta drift sobredag_engine_ui.uses_functionsdeclarado enapp.mdy los.cppdel registry listados enCMakeLists.txtcoinciden (fn doctor uses-functions).
No-objetivos
- Editar YAML de DAGs desde la UI (v2 — por ahora solo lectura + Run Now + Validate).
- Generar nuevos DAGs visualmente tipo drag&drop (v2).
- Sustituir el frontend web — convive.
- Soporte multi-engine (varios
dag_engineremotos). Asume 1 backend local.
Riesgos
| Riesgo | Mitigacion |
|---|---|
WS hub anade peso al binario dag_engine |
Mismo patron que sqlite_api (~150 LOC); negligible. |
cpp-httplib no soporta WS upgrade limpio |
registry_dashboard/ws_client.cpp ya implementa RFC 6455 manual sobre TCP. Reusar tal cual. |
| Doble UI (web + C++) -> deriva | Un solo backend, mismos endpoints. Si web cambia, C++ se entera por contrato HTTP. |
Cron parser duplica logica si se anade cron_explain |
Funcion pura nueva, atomica, justificada (UX). |
Dependencias
apps/dag_enginecorriendo y aceptando conexiones.cpp/functions/viz/*ycpp/functions/core/*ya existentes (veruses_functions).cpp-httplibynlohmann/jsonvendored (igual queregistry_dashboard).
Plan de ejecucion (sub-tareas)
- Backend: anadir
events.goconDagRunHub+ handler WS endag_engine. Commit. - Scaffolding:
fn run init_cpp_app dag_engine_ui. Commit. - Capa HTTP: copiar y adaptar
data_http.{cpp,h}desderegistry_dashboard. Endpoints DAG. Commit. - Capa WS: copiar
ws_client.{cpp,h}tal cual. Conectar a/api/ws/dagruns. Commit. - Tabs DAG List + Detail + Run Detail. Commit por tab.
- Schedule + Health tabs. Commit.
- Funciones nuevas (
timeline_cpp_viz,cron_explain_go_core,http_poll_json_cpp_core) — delegar a fn-constructor en paralelo en mismo turno. Commit por funcion. - e2e_checks + redeploy_cpp_app_windows. Commit final.
Cada paso: rama TBD propia (issue/0095-<slug>), merge --no-ff a master.
Telemetria objetivo
Tras este issue:
dag_engine_uiaparece enfunction_statsconcalls > 0(lanzamientos viais_cpp_app_running_windows_bash_infra).cron_explain_go_coreconconsumer_apps_count >= 1.timeline_cpp_vizcon consumidor declarado enuses_functionsdedag_engine_ui+ candidato a reuso endata_factory(issue 0096).