5 Commits

Author SHA1 Message Date
gx 6081e33e5a controller: PipelineMonitor — auto-restore overlay state после pipeline restart
Pipeline filter state (overlays, layout, cell_map, audio) живёт в RAM
ffmpeg process. При recreate container (compose up, OOM, NVENC crash,
config change) state lost — controller'у нужно re-push.

Раньше user'у приходилось вручную:
  curl POST /layout/.../set
  docker restart cuda-grid-controller  # для browser/dynamic re-register

Теперь автоматизировано:
  PipelineMonitor polls ZMQ каждые 3 sec (no-op set_layout).
  On timeout/error → mark instance lost.
  First success after lost → trigger restore:
    1. set_layout к state.active_layout
    2. set_audio_output_enabled к state.audio_output_enabled
    3. re-push все overlays из state.overlays
    4. browser/dynamic/frigate hooks: mark_all_unregistered() —
       их loops автоматически re-add на next iteration

Verified test: docker restart cuda-grid-pipeline → 10 sec downtime →
monitor logs lost+restored+restore_done с count=6 overlays.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 07:35:27 +01:00
gx e773066867 controller: browser_overlays + cookies field (Playwright session auth)
Use case: Grafana с session cookie (login flow вместо Bearer token),
admin UIs без API token endpoint.

Config:
  dashboards:
    - id: my_widget
      cookies:
        - name: session_id
          value: abc123
          url: https://example.com/

Каждый element passed к page.context.add_cookies. Playwright spec format:
{name, value, url} OR {name, value, domain, path, ...}.

Multi-dashboard verified рабочий (caвая dashboard = own Page в shared browser).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 09:33:50 +01:00
gx c287caf7c1 controller: browser_overlays — resize screenshot к target w_px×h_px
Без resize element screenshot возвращался в native dims (e.g. Grafana panel
790×258), не fitting configured overlay slot (1280×180 = info strip). Result
— overflow + gap.

С resize (LANCZOS) PNG exactly w_px×h_px, fills slot полностью. Trade-off:
если aspect не совпадает (panel 3:1 → strip 7:1), будет растяжение
horizontal. User responsibility tune w_px/h_px к нужным пропорциям.

Verified: GPU/VRAM panel 790×258 → 1280×180 readable, lines + labels OK.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-22 05:38:45 +01:00
gx bd9dcd2441 controller: browser_overlays + extra_http_headers — auth для protected dashboards
Use case: Grafana service account token, basic auth, custom UA. Headers
устанавливаются через page.set_extra_http_headers перед первым goto.

Пример:
  dashboards:
    - id: grafana_gpu
      url: https://chat2.goldix.org/grafana/d/UID/dash
      extra_http_headers:
        Authorization: "Bearer glsa_xxxxxxxxxxxx"

Без этого Grafana с auth gate показывает empty login page (см. test
2026-05-22 ночью: page.screenshot вернул только footer "Documentation/
Support/Community" — content area empty потому что unauthorized).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 23:22:24 +01:00
gx 19ddaf2dde controller: browser-rendered overlays — Grafana/chat/любой HTML
MVP Phase 8 feature: headless Chromium snapshot URL → PNG → existing icon
overlay infrastructure. Use case — Grafana dashboard, web chat, любой
HTML widget с transparent background поверх video composite.

Архитектура:
  BrowserRenderer launches один shared Chromium instance, per-dashboard
  page. Loop:
    page.reload (для свежих данных — Grafana auto-refresh не triggers
                 в headless mode без user interaction)
    page.add_style_tag (re-inject transparent CSS — reload teryает styles)
    page.wait_for_selector (если selector задан)
    page.screenshot(omit_background=True) или locator(selector).screenshot
    save PNG к icon_dir
    dispatcher._reload_icon → filter re-reads atlas

Config (dynamic_overlays.dashboards в controller.yaml):
  id, target_instance, cell, url, x, y, w_px, h_px,
  refresh_sec (default 2.0s, min 0.5s — frequent reload bad см. stutter memory),
  inject_css (default — transparent background + zero margins),
  selector (optional CSS selector — экспортить только конкретный element),
  viewport_w/h (override page viewport, default = w_px/h_px;
                полезно при selector чтобы page layout не collapsed),
  wait_until, page_timeout_ms, opacity, z_order.

Dockerfile:
  + pip install playwright
  + playwright install --with-deps chromium (~170MB Chromium + ~150MB system libs)

Если dashboards не нужны — можно убрать оба install'а (playwright
import lazy, BrowserRenderer.start() graceful no-op без playwright).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-21 23:09:50 +01:00