Commit Graph

4 Commits

Author SHA1 Message Date
egutierrez 688b399fd3 docs(flows): DoD obligatorio con user-facing surface + abrir issues 0100-0103 (taxonomia, frontmatter migration, dev_console, work dashboard)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 00:07:04 +02:00
egutierrez 35ac7d9a24 absorb jobs_actions into main Jobs table via Button renderer (Fase 2, issue 0081-J)
- Remove ##jobs_actions_tbl BeginTable (the separate actions mini-table).
- Add 2 virtual columns to main data_table: cancel (col 5) + delete (col 6).
  cancel = "Cancel" only for queued/running jobs; delete = "Delete" only for done/error/cancelled.
- ColumnSpec: CellRenderer::Button, button_action cancel_job/delete_job, amber/red colors.
- Maintain s_frow_ids parallel vector (job id per filtered row) for O(1) ButtonClick dispatch.
- Dispatch loop after render: ButtonClick -> jobs_cancel/jobs_delete + cache invalidation.
- te_rows (##te_rows) NOT migrated: table has Selectable AllowOverlap + right-click context
  menus + Promote/Demote SmallButton with AllowOverlap — requires RowContextMenu renderer hook
  not yet in data_table v1.2.0. Deferred to Phase 3 (TextInput + context-menu hook).

Build: Linux + Windows clean. pytest 125/125 passed.
2026-05-15 17:10:50 +02:00
egutierrez 6f05e4bf60 migrate Jobs table to data_table::render with Progress/Duration/Badge renderers (issue 0081-J)
- Replace inline ImGui::BeginTable (6 cols) with data_table::render for 5 data
  columns: status (Badge), enricher (Text), target (Text), progress (Progress
  0..1), time_ms (Duration warn=1000ms error=10000ms).
- Add AppState::jobs_dt_state (data_table::State) for persistent filter/sort state.
- Keep Cancel/Delete action buttons via separate small ImGui::BeginTable (option a
  from 0081-J spec); data_table::State does not expose selected_row_idx yet.
  TODO(Phase 2): migrate actions to selected-row toolbar when State exposes it.
- Pre-filter cells by g_jobs_cache.filter_idx before passing to data_table so the
  combo filter and the declarative table filter are both respected.
- Linux build: OK. Tests: 125/125 pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-15 16:45:39 +02:00
egutierrez 6df04652d8 feat(jobs): sistema de jobs asincronos + panel UI (issue 0026)
Infra para correr enrichers en background mientras la app sigue interactiva.

C++:
- jobs.{h,cpp}: tabla jobs en graph_explorer.db, JobRunner con N=2 std::thread
  workers, fork+exec POSIX con pipes, parser de PROGRESS:<float> <stage> en
  stderr, captura de stdout JSON, persistencia + dirty_counter.
- enrichers.{h,cpp}: scanner de enrichers/<id>/manifest.yaml, parser YAML
  minimo (id/name/description/applies_to), filtro por tipo de nodo.
- views_jobs.cpp: panel "Jobs" dockeable con tabla (status/enricher/target/
  progress/time), filtro all/active/done/errors, cancelar/borrar inline.

Wiring:
- main.cpp: resolve_registry_root() (FN_REGISTRY_ROOT env o subir desde cwd
  buscando registry.db), jobs_init/enrichers_load antes de fn::run_app,
  jobs_shutdown al cerrar, dirty_counter -> want_reload, jobs_set_ops_db al
  cambiar de proyecto.
- main.cpp:render_context_menu: menu "Run enricher" sustituye placeholder
  con submenu filtrado por type_ref via enrichers_for_type. Submit abre
  panel Jobs auto.
- views.h: AppState::panel_jobs flag + decl views_jobs().
- CMakeLists.txt: anade jobs.cpp + enrichers.cpp + views_jobs.cpp y enlaza
  Threads::Threads.

Wire protocol enricher (subprocess Python):
- stdin:  JSON con node_id, metadata, ops_db_path, app_dir, cache_dir,
          registry_root, params.
- stderr: PROGRESS:<float> <stage> + LOG lineas libres.
- stdout: JSON resumen al final.
- exit 0 = ok, !=0 = error con stderr capturado en panel Jobs.

El run.py escribe directamente al operations.db (sqlite3 stdlib) — C++ solo
orquesta, no parsea entities/relations.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 18:24:37 +02:00