openova/products
hatiyildiz a02f33cec0 feat(wizard): dynamic DAG + SSE wiring on provision page
Drop the 1100-line static-mock provision.html in favour of a runtime-
generated DAG keyed off the wizard's persisted localStorage state and the
build-time blueprint catalog. Bubbles, edges, sub-progress, log routing
and final CTA are all computed from real backend data.

What is now dynamic:
- Hardcoded NODES/TOPO/EDGES/LOGS arrays gone — DAG is built from
  window.CATALYST_CATALOG (components + bootstrap-kit) and the wizard
  selection at page load.
- One Hetzner-infra supernode and one Flux-bootstrap supernode anchor the
  graph; bootstrap-kit Blueprints render in numeric install order; user
  selection from selectedComponents (with transitive HARD deps expanded
  via blueprint.depends) makes up the rest.
- EventSource wired to <BASE>api/v1/deployments/<id>/logs. Phase events
  drive bubble state transitions (tofu-init|tofu-plan run Hetzner-infra
  through 0→.30 progress; raw `tofu` lines parse hcloud_network/
  hcloud_firewall/hcloud_server/hcloud_load_balancer markers to advance
  the supernode's sub-progress; tofu-output finishes it; flux-bootstrap
  opens the second supernode).
- Raw stdout/stderr lines stream into the live-log panel and the active
  bubble's expandable detail (per-node accumulation, click any bubble to
  read its slice).
- On `event: done` with status=ready, surface "Open Console →" CTA
  pointing at result.consoleURL from the snapshot.
- Empty-state path renders a clean "no active deployment" view when the
  page is hit without a wizard session or deploymentId in localStorage.

Build-catalog change:
- scripts/build-catalog.mjs now also emits public/catalog.js setting
  window.CATALYST_CATALOG = { components, bootstrapKit }. bootstrapKit is
  read from clusters/_template/bootstrap-kit/ (numbered prefix → install
  order). Same scan as the typed catalog.generated.ts so both surfaces
  stay in lock-step.

Per-component states beyond flux-bootstrap are not yet emitted by
catalyst-api; nodeForPhase() already routes phase=bp-<slug> events onto
the matching bubble so wiring the Flux Kustomization watcher on the
backend lights up the rest with no further page work.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 10:30:14 +02:00
..
axon feat(axon): make qwen3-coder thinking mode toggleable via request parameter 2026-04-26 09:20:33 +02:00
catalyst feat(wizard): dynamic DAG + SSE wiring on provision page 2026-04-29 10:30:14 +02:00
cortex docs(pass-52): bundled date-sweep + cross-component namespace clean; knative clean 2026-04-28 00:37:21 +02:00
fabric docs(seaweedfs+guacamole): replace MinIO with SeaweedFS as unified S3 encapsulation; add Guacamole to bp-relay 2026-04-28 10:23:46 +02:00
fingate docs(pass-52): bundled date-sweep + cross-component namespace clean; knative clean 2026-04-28 00:37:21 +02:00
relay docs(seaweedfs+guacamole): replace MinIO with SeaweedFS as unified S3 encapsulation; add Guacamole to bp-relay 2026-04-28 10:23:46 +02:00