Commit Graph

146 Commits

Author SHA1 Message Date
Emrah Baysal
340821d19d feat(catalyst): redesign review step + fix topology/component wizard bugs
- StepReview: add cloud provider logos to Infrastructure and Credentials rows,
  replace boring "X selected" with M/R/O color-coded tier breakdown chips,
  rename button to "Launch OpenOva ecosystem", update step title/description
- componentGroups.ts: extract shared GROUPS data (Tier/ComponentDef/GroupDef)
  so StepComponents and StepReview both import from a single source of truth
- StepComponents: import GROUPS from componentGroups.ts, fix Zustand stale
  state bug (use getState() after toggleGroupComponent to read live state,
  eliminating Livekit→Stunner mis-selection and similar Fabric group issues)
- StepTopology: fix selected item text turning white on light background
  (isSelected color: '#fff' → 'var(--wiz-text-hi)' which is #0f172a in light)
- WizardLayout: remove A/B/C light mode picker, lock in Option B (Midnight
  Split dark sidebar) permanently as LIGHT_SIDEBAR_BG constant

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 08:57:16 +01:00
Emrah Baysal
9c8258b5c8 fix(catalyst): replace opacity-based wiz-ch text tokens with WCAG AA semantic tokens
All `rgba(var(--wiz-ch),X)` patterns replaced with named semantic tokens
across all 7 wizard step components + WizardLayout:

- --wiz-text-hi / md / lo / sub / hint — text tiers with WCAG AA light values
- --wiz-border / --wiz-border-sub — border tiers
- --wiz-bg-card / input / sub / xs — background tiers
- --wiz-card-shadow — eliminates the 0 32px 80px rgba(0,0,0,0.5) blotch in light mode

Light mode values: #0f172a (21:1) → #64748b (4.7:1 AA). Dark mode behaviour
unchanged — tokens resolve to same rgba(255,255,255,X) values as before.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 22:27:11 +01:00
Emrah Baysal
c80a3a6cc8 feat(catalyst): add A/B/C light mode option picker for UAT
Floating A·B·C toggle appears top-right in light mode only.
A = Slate Pro (cool gradient), B = Midnight Split (dark sidebar),
C = Cloud Paper (white sidebar + slate bg). Persisted in localStorage.
Option B properly restores dark sidebar with white channel text.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 21:56:17 +01:00
Emrah Baysal
32325e23d9 fix(catalyst): light mode — replace all hardcoded rgba(255,255,255,X) with CSS channel variables
Introduce --wiz-ch CSS channel variable (255,255,255 dark / 0,0,0 light) and
matching --wiz-page-bg, --wiz-panel-bg, --wiz-deep-bg overrides in
[data-theme="light"]. Replace every hardcoded rgba(255,255,255,X) inline style
across WizardLayout, all 7 step components, and _shared with
rgba(var(--wiz-ch),X) so text, borders, and surface tints automatically invert
when the theme toggles. Fix SVG diagram helpers (BOX/REGION) to use style={{}}
attributes instead of presentation attributes so CSS custom properties resolve
correctly. Replace hardcoded dark panel backgrounds (#131320, #0f1117) with
var(--wiz-panel-bg) / var(--wiz-deep-bg).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 21:21:27 +01:00
Emrah Baysal
2611152792 fix(catalyst): remove unused fg param in Badge to satisfy noUnusedParameters 2026-03-20 20:58:42 +01:00
Emrah Baysal
7ea01bd2de feat(catalyst): add official brand logos for all 50+ platform components
Each component now shows its official brand color + recognisable inline SVG
mark (18×18) in the component selection list. Logos dim when deselected and
reach full opacity when selected, giving clear visual feedback.

Covers all 9 blocks: PILOT, SPINE, SURGE, SILO, GUARDIAN, INSIGHTS,
FABRIC, CORTEX, RELAY — all 52 components.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 20:57:19 +01:00
Emrah Baysal
39181d7565 feat(catalyst): provider step — custom dropdown with logos, always auto-select region
Custom dropdown component with provider logos, chevron animation, dark
panel with check indicator. Region auto-selected on provider change
(HQ-suggested or first available). Fallback to first provider+region
when no HQ hint matches.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 20:50:09 +01:00
Emrah Baysal
30fa2cfb68 feat(catalyst): provider step — dropdown UX, compact cards side by side 2026-03-20 20:38:45 +01:00
Emrah Baysal
294bf3ffe1 feat(catalyst): provider step — always-open cards, HQ-based defaults, radio UX
- All region cards always fully expanded side-by-side (no accordion)
- Grid layout: 1/2/3 columns matching topology region count
- Radio button semantics: dot indicator for provider + cloud region selection
- HQ-based pre-selection: parses orgHeadquarters to suggest nearest provider
  and stagger cloud regions across topology regions for built-in redundancy
  (e.g. Frankfurt → Hetzner FSN1/NBG1/HEL1 across 3 regions)
- '★ nearest' badge on recommended provider when not yet configured
- HQ hint banner at top shows which location drove the suggestions
- Credentials summary shown once all regions are fully configured

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 20:21:48 +01:00
Emrah Baysal
35ce0c9cba fix(catalyst): stalwart tier mandatory→recommended — deselectable in optional RELAY block 2026-03-20 19:08:56 +01:00
Emrah Baysal
18d9498b64 feat(catalyst): profile-based component recommendations + card header redesign
- Recommended items now pre-selected by default in all blocks; optional items off
- Profile-based defaults: industry/compliance/size adjusts which optional blocks
  (FABRIC, CORTEX) are pre-enabled and which recommended components are selected
  e.g. Financial Services → FABRIC(cnpg/valkey/strimzi/debezium) + openmeter + strongSwan
  e.g. Tech/Large orgs → CORTEX(kserve/knative/axon) enabled
- Re-applies automatically when org profile fields change
- Card header: PRODUCT NAME — Subtitle on line 1, 1-line description on line 2
- Added componentsAppliedForProfile to store to avoid overwriting user customizations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 18:39:20 +01:00
Emrah Baysal
bbd256ca23 feat(catalyst): rework component card header — tier chips, grey locked, equal heights
- Remove Required/Optional tag badge from card header
- Subtitle now occupies that space (conceptual name, truncated 1 line = equal heights)
- Tier chips (Xm/Yr/Zo) replace selection count text, color-coded:
  M = always grey/muted (user cannot change mandatory), R = blue, O = indigo
  Chips light up only when items are actually selected
- Locked mandatory items: grey checked checkbox (opacity 0.6) instead of green
  so user clearly understands these cannot be toggled
- Lock icon changed from green to muted white
- Remove SelectionDot (replaced by tier chips as selection indicator)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 18:29:58 +01:00
Emrah Baysal
5a15902a23 feat(catalyst): auto-select component dependencies on toggle
When a user enables a component, all transitive hard dependencies are
automatically selected across blocks. Example: selecting KServe also
selects Knative; selecting LibreChat enables FerretDB + CNPG in FABRIC;
selecting OpenMeter pulls in Strimzi + ClickHouse.

Dependency map covers 14 components with cross-block and intra-block
deps. Transitive resolution via BFS ensures chains like
librechat→ferretdb→cnpg are fully satisfied.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 18:18:20 +01:00
Emrah Baysal
855bebac78 feat(catalyst): component step visual improvements — equal heights, green mandatory, tier sort
- Equal card heights: GroupCard outer div is flex-column with height:100%
- Color semantics: mandatory locked = green (#4ADE80), recommended = blue (#38BDF8), optional = indigo (#818CF8)
- Sort components by tier: mandatory → recommended → optional within each block
- SelectionDot uses green for required blocks, blue for optional blocks
- Locked mandatory rows get green background tint (rgba(74,222,128,0.06))
- TierBadge colors updated to match new semantic scheme

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 18:10:10 +01:00
Emrah Baysal
cb9390dbcc feat(catalyst): correct building block mapping from pitch-deck.html
Blocks: PILOT · SPINE · SURGE · SILO · GUARDIAN · INSIGHTS · FABRIC · CORTEX · RELAY

Mapping fixed:
  Sigstore → GUARDIAN (user confirmed)
  Coraza/Envoy/k8gb/frpc/NetBird/strongSwan → SPINE
  KEDA/Reloader/VPA/Continuum → SURGE
  MinIO/Velero/Harbor → SILO
  CNPG/Valkey/Strimzi/Debezium etc → FABRIC
  Gitea/OpenTofu → PILOT
  All INSIGHTS components added (Alloy/Loki/Mimir/Tempo/OpenSearch/OpenMeter/Specter)
  New components: Knative/Neo4j/Axon/Ntfy/Iceberg/Superset

Per-component tier (M/R/O) badge + locking (only M in required blocks locked).
Row-boundary expand: all row-mates shift below expanded card.
store.ts: migrate old group IDs to new schema on rehydration.
model.ts: DEFAULT_COMPONENT_GROUPS updated with correct pre-selections.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 17:38:59 +01:00
Emrah Baysal
b666126ac5 feat(catalyst): merge duplicate blocks + row-boundary expand layout
Groups: 10 → 8 unique product blocks matching pitch deck page 5.
- Merged security + identity + core data → GUARDIAN (12 components, all required)
- Moved MinIO → SILO, ClickHouse → FABRIC
- Added per-component required? field so individual locks work inside a group
- Groups: GUARDIAN, SURGE, SPINE, INSIGHTS, SILO, CORTEX, FABRIC, RELAY

Expand layout: use row-boundary split so ALL row-mates (left AND right)
shift below the expanded card. Only complete rows above stay above.
  rowStart = Math.floor(openIdx / colCount) * colCount
  before   = GROUPS.slice(0, rowStart)
  after    = [...GROUPS.slice(rowStart, openIdx), ...GROUPS.slice(openIdx+1)]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 16:20:03 +01:00
Emrah Baysal
e2b10d14e7 feat(catalyst): correct product block names + fix expand-below layout
Product names now match pitch deck page 5:
  security/identity/data → GUARDIAN
  networking → SURGE
  gitops → SPINE
  observability → INSIGHTS
  resilience → SILO
  ai → CORTEX
  events → FABRIC
  comms → RELAY

Expand layout: move CardGrid to module level (not inside render fn)
so React never remounts the grid on state change. Split into
before/expanded/after segments guarantees all cards after the
expanded one sit below it — left and right neighbours included.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 16:05:52 +01:00
Emrah Baysal
d9e0fc0d70 feat(catalyst): clean product names, 3-col grid, proper expand-below layout
- Strip 'OpenOva' prefix + rename 'Platform X' → short portfolio names
  (Security, Identity, Network, Catalyst, Specter, Fabric, Resilience, Cortex, Relay)
- Default 3-col grid (desktop), 2-col tablet, 1-col mobile
- Split rendering into before/expanded/after slices so all cards after
  the expanded one always appear below it, never beside it

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 15:51:13 +01:00
Emrah Baysal
7f1ceb1127 feat(catalyst): show expanded group components in multi-column grid
3 cols on desktop, 2 on tablet, 1 on mobile.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 15:29:44 +01:00
Emrah Baysal
5cdbe3fede fix(catalyst): sanitize stale persisted topology on store rehydration
Persisted localStorage topology='delta' (removed topology) caused
runtime crash: TOPOLOGY_REGION_LABELS['delta'] → undefined → undefined.length.

- store.ts merge(): reset topology+regionProviders+regionCloudRegions
  when persisted topology is not in the valid set
- StepProvider.tsx / StepReview.tsx: defensive ?? fallbacks in case
  an unknown topology value slips through

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 15:19:58 +01:00
Emrah Baysal
5704ff2796 fix(catalyst): update StepReview for new topology set and cloud regions
- Remove 'delta' from TOPOLOGY_NAMES, add 'zoned' with correct counts
- Show provider + cloud region label/location per topology slot

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 14:44:55 +01:00
Emrah Baysal
b1abcc0f19 feat(catalyst): topology redesign, cloud regions, full-width components, product names
Topology (StepTopology + model):
- 5 topologies: TRIANGLE (3-region, CP at top / 2 DP at bottom = real triangle),
  DUAL (2×3 clusters), ZONED (2×2: DMZ isolated + MGMT·RTZ merged), COMPACT
  (2×1: geo-redundant solo), SOLO (unchanged)
- Removed DELTA; TRIANGLE is now the Tier-1 Bank topology
- SVG diagrams redrawn — TRIANGLE uses triangle layout (CP apex, DP base corners)

Provider (StepProvider):
- Added cloud region selection per topology region (5 regions per provider)
- Provider list is now vertical (1 per line, full width) — no card grid
- allConfigured requires both provider AND cloud region per slot
- Auto-advance after cloud region selected

Org (StepOrg):
- HQ moved to row 2 alongside Email (was in row 1 with Name/Domain)

Components (StepComponents):
- Expanded group spans full width (gridColumn: 1 / -1)
- Product portfolio names as primary: OpenOva Cortex, Specter, Fabric, Relay,
  Catalyst, Platform Security/Identity/Network/Resilience
- Concept name shown as secondary subtitle

Store + model:
- Added regionCloudRegions to WizardState
- Added setRegionCloudRegion action
- setTopology also resets regionCloudRegions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 14:41:07 +01:00
Emrah Baysal
2623aec74f feat(catalyst): responsive wizard — mobile/tablet/desktop layouts
WizardLayout: 3-state sidebar
- Mobile (<768px): 56px top bar — logo + step name + progress dots
- Tablet (768–1080px): 52px icon-only sidebar — numbered circles + vertical bar
- Desktop (≥1080px): full 260px sidebar — labels, descriptions, progress

StepOrg: desktop=3col, tablet=2col, mobile=1col grids
StepTopology: 2-pane on desktop, stacked on tablet/mobile
StepProvider: responsive region grid + provider picker grid

These files were written but never committed in the previous session.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 13:53:14 +01:00
Emrah Baysal
5c053e4133 feat(catalyst): add useBreakpoint hook for responsive wizard layout
Missing file that was created locally but never committed.
Provides mobile/tablet/desktop breakpoint detection used across all wizard steps.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 12:51:53 +01:00
Emrah Baysal
2e4d18cba5 feat(catalyst): make StepComponents, StepCredentials, StepReview responsive
All three remaining wizard steps now use useBreakpoint() to adapt layout:
- StepComponents: 2-col group grid collapses to 1-col on mobile
- StepCredentials: multi-provider 2-col grid collapses to 1-col on mobile
- StepReview: 2-col left/right layout stacks to 1-col on mobile

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 12:49:52 +01:00
Emrah Baysal
50578eb2a2 feat(catalyst): Atlas layout — wide 2-pane wizard with full business logic
WizardLayout: Atlas 2-pane — 260px glass left rail (logo + vertical step
list + progress bar) + flex right content area (max 960px)

StepOrg: 3-col grid (Name/Domain/HQ), full-width Email, 2-col dropdowns
StepTopology: 2-pane — compact radio list left (40%), diagram+bullets
  detail panel right (60%); selected card expands inline in right panel
StepProvider: all 5 cloud providers enabled (was Hetzner-only); provider
  picker uses 3-col card grid; region rows go 2-col when 3+ regions
StepCredentials: 2-col grid when 2+ providers, full-width for single
StepComponents: group cards in 2-col grid; hamburger expand preserved
StepReview: 2-col layout — left: Org+Infrastructure, right: Credentials+Components

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 12:19:54 +01:00
Emrah Baysal
cdf3d1bb3a fix(catalyst): remove unused completedSteps from WizardLayout — TS6133
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 11:45:21 +01:00
Emrah Baysal
b6e7975b5a feat(catalyst): add Atlas & Helm wide layouts, fix step rail and sticky footer
- WizardLayout: step rail now marks done = step.id < currentStep (not
  completedSteps) — fixes all steps appearing complete from localStorage
- _shared.tsx: remove sticky/floating footer nav — nav sits inline below
  content, no negative margin, no gradient overlay
- DesignShowcase: add D11 Atlas (Cosmos palette, vertical left step rail,
  2-col wide form) and D12 Helm (3-pane: context left, form centre, live
  summary right) — both use horizontal space effectively with grid cards
  side by side; DESIGNS array and Prev/Next nav updated to handle 12 designs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 08:57:20 +01:00
Hatice Yildiz
4afaa3f114 fix(catalyst): 12 UX issues from Playwright audit (#19–#30)
Scroll & layout:
- Scroll to top on every step transition (wizard-body id + useEffect) [#19]
- Sticky nav footer in StepShell — always visible even on tall steps [#20]

Defaults & pre-selection:
- Pre-select TRIANGLE topology so Continue is immediately available [#21]
- Org size default changed to 2,000–10,000 (realistic financial demo) [#30]
- Compliance frameworks start empty — selection must be explicit [#25]

Provider accordion:
- Auto-collapse after selecting a provider; auto-open next unassigned region [#22]
- Lift open/onToggle state to StepProvider for coordinated control

Credentials:
- Hide Hetzner how-to card once all providers are validated [#23]
- Fix → arrow rendered as ellipsis: use Unicode escapes \u2192 \u2014 [#24]
- Shorten region subtitle to "Regions 1, 2, 3" — no verbose labels [#28]

Components:
- SelectionDot enlarged to 18px, glow on full, amber on partial [#27]

Review:
- Replace 🚀 emoji with Lucide Zap icon on Provision button [#29]

Step 1 labels:
- Fix "Domainoptional" / "Headquartersoptional" run-together text [#26]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 08:27:37 +01:00
Hatice Yildiz
0475e899bd feat(catalyst): per-region providers, DELTA topology, hamburger cards, credentials-per-provider
- Rename TITAN → DELTA (Δ symbol — triangle in Greek) in model, store, and all step components
- Per-region cloud provider selection: regionProviders: Record<number, CloudProvider>
  stores one provider per region index; setTopology resets regionProviders to avoid stale data
- Accordion RegionRow in StepProvider: collapsed shows label + selected provider,
  expanded shows inline provider radio buttons; Apply-to-all shortcut when first region set
- Credentials per unique provider: one TokenSection per deduplicated provider set;
  providerTokens + providerValidated state per provider; RHF removed from StepCredentials
  (replaced with clean useState + manual validation to fix RHF disconnect bug)
- StepTopology hamburger collapse: unselected cards = compact 48px row only;
  selected = expands with large SVG diagram (viewBox 0 0 280 130) + bullet points
- SmartField.onFocus calls e.target.select() for instant replacement UX
- StepReview GROUP_NAMES lookup + per-region provider display + per-provider cred status
- Fix unused TOPOLOGY_REGION_COUNT import in store.ts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 07:54:41 +01:00
Hatice Yildiz
a50176cd0e feat(catalyst): full wizard rebuild — Cosmos design, 6 new steps
- WizardLayout: fixed position shell, logo+step-rail pinned at top,
  only content area scrolls — no more vertical jumping
- StepOrg: extended org profile (industry, size, HQ, compliance tags),
  smart defaults with 'default' badge, restore-on-empty logic
- StepTopology: 5 visual topology templates (TITAN/TRIANGLE/DUAL/
  COMPACT/SOLO) with SVG cluster diagrams, bullet details on select
- StepProvider: provider cards with topology region context panel
- StepCredentials: Cosmos-themed, demo bypass preserved
- StepComponents: Linux-style package group selector — full/partial/
  empty indicators, expand to drill into individual components
- StepReview: structured review with provision CTA
- model.ts: TopologyTemplate type, ORG_DEFAULTS, DEFAULT_COMPONENT_GROUPS
- store.ts: topology, org profile, and group component actions
- shared/ui/OOLogo.tsx: extracted reusable logo component

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 06:58:24 +01:00
Hatice Yildiz
aa869bf6cb feat(catalyst/designs): Cosmos — lift logo above card + numbered step circles
- Move OOLogo outside glass card so it stays fixed across all steps
- Replace thin progress bars with Journey-style numbered circles
- Completed steps show checkmark, current glows with sky-blue ring
- Connector lines fill with gradient as steps complete

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:39:53 +01:00
Hatice Yildiz
ee0326af04 fix(catalyst): remove unused imports/vars in DesignShowcase — TS build fix
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:24:57 +01:00
Hatice Yildiz
d19efb866a feat(catalyst): fix logo crop + add all 6 steps to all 10 designs
- Fix OOLogo viewBox to 0 0 700 400 with strokeWidth 100 (correct aspect ratio)
- Render logo at width = height × 1.75 to prevent cropping
- Add all 6 wizard steps with real content to every design alternative
- Shared StepBody component with design-specific theming

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 22:14:39 +01:00
Hatice Yildiz
25b65fb6ad feat(catalyst): add 10 distinct wizard design concepts at /designs 2026-03-19 21:41:55 +01:00
Hatice Yildiz
ea7396974d feat(catalyst): world-class UX redesign — rich left panel, centered form
Left panel (always-dark brand panel):
- Gradient bg with ambient brand glow orbs (sky-blue + indigo)
- Large OO logo with radial glow aura behind it
- "OpenOva / Catalyst / Bootstrap Wizard" three-line branding
- Steps: numbered circles (gradient-fill completed, outlined-glow current)
  with connecting lines and current step description visible
- Trust signals at bottom with icons: runs in your cloud, no data stored,
  fully open source

Right panel (themed):
- 2px gradient progress bar (sky→indigo) across the very top, fills per step
- "STEP X OF 6" brand-colored label + hairline rule
- Big responsive heading (clamp 1.5–2rem, weight 700, tight tracking)
- Content max-width 520px, horizontally centered, properly padded
- Theme toggle + exit float top-right as clean icon buttons
- Form nav: back as ghost bordered button, continue as gradient primary
  with brand glow shadow

Input redesign:
- Height 42px (was 36px)
- 1.5px borders with smooth focus transition (brand glow ring)
- Focus/blur handled via onFocus/onBlur (not Tailwind classes)
- Hint text consistent 12px muted

Credentials step:
- Validate button inline with token field, height-matched (42px)
- Demo skip link prominently sky-blue: "No token yet? Skip →"
- How-to card: numbered circle badges instead of plain numbers

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 21:30:28 +01:00
Hatice Yildiz
1bdc87bdba feat(catalyst): align UI with OpenOva design system, add light/dark toggle
- Redesign tokens: Catalyst sky-blue brand (#38BDF8), near-black surfaces
  matching openova.io (#09090B/#111113/#18181B), zinc text palette
- Add semantic CSS vars (--color-text-primary/secondary/muted/disabled)
  replacing hardcoded oklch() values across all components — required
  for proper light/dark mode support
- Add light mode with [data-theme="light"] CSS variable overrides
- Add useTheme hook with localStorage persistence (key: oo-theme)
- Add inline theme init script in index.html to prevent flash on load
- Replace OctagonAlert placeholder with OpenOva double-loop SVG logo
- Rebrand sidebar: "OpenOva" label + "Catalyst" in sky-blue
- Add Sun/Moon theme toggle in the top bar header
- Promote credentials skip link to brand-colored underlined text
  (was invisible muted grey — "Skip — explore in demo mode")
- Update button/input/StepShell/StepIndicator to use CSS vars

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 19:27:10 +01:00
Hatice Yildiz
cc45918740 feat(catalyst): add demo mode skip on credentials step 2026-03-19 18:56:27 +01:00
Hatice Yildiz
200e0038b3 feat(catalyst): add Go API backend, Containerfiles, and nginx SPA config
- Add catalyst-api: Chi router, SSE provisioning logs, Hetzner token
  validation, deployment lifecycle simulation (hexagonal-lite layout)
- Add catalyst-ui Containerfile: multi-stage Node→nginx build with
  VITE_APP_MODE baked in at build time
- Add nginx.conf: SPA routing, /api/ proxy to catalyst-api, SSE support,
  /healthz endpoint, K3s DNS resolver
- Wire wizard to real API: StepCredentials validates token via POST
  /api/v1/credentials/validate; StepReview POSTs to /api/v1/deployments
  and stores deploymentId in Zustand; ProvisionPage streams SSE logs
- Add deploymentId to wizard state; fix currentStep initial value (1→1)
- Add region code/countryCode fields; fix cluster context naming convention

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 18:35:11 +01:00
Eren Baysal
5ff6c17e50 fix(catalyst): wizard step navigation, naming convention in cluster context
- Fix currentStep initial value (0→1) so wizard advances correctly on first Continue
- Add `code` + `countryCode` to HETZNER_REGIONS; drop deprecated `role: primary|dr` from Region model
- Use region code in cluster context names: hz-fsn-rtz-prod (not hz-fsn1-rtz-prod)
- Derive success page URLs and kubeconfig from wizard store (orgDomain, region)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 13:59:46 +01:00
Emrah Baysal
09fd7ecad0 chore(ci): add Dependabot for npm and GitHub Actions dependency updates
- Catalyst UI deps assigned to alierenbaysal (weekly Monday)
- Axon deps assigned to nehirbysl (weekly Monday)
- GitHub Actions deps auto-updated weekly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 13:42:02 +01:00
Emrah Baysal
3e3f9428ff feat(catalyst): Bootstrap UI — full wizard, auth, dashboard, provision, success
Complete React 18 + TypeScript + Tailwind v4 UI for OpenOva Catalyst Bootstrap.

Architecture:
- Feature-Sliced Design (FSD): app/, pages/, widgets/, features/, entities/, shared/
- TanStack Router (type-safe), TanStack Query, Zustand wizard store
- React Hook Form + Zod validation on every form
- Framer Motion animated step transitions and micro-interactions
- Dark-first design system with Tailwind v4 CSS custom properties

Pages:
- Auth: Login, Signup, Forgot Password (SaaS mode)
- Dashboard: deployment list with status badges and stats
- Wizard: 6-step animated wizard (Org → Provider → Credentials →
  Infrastructure → Components → Review)
- Provision: real-time SSE log stream with phase tracker and progress bar
- Success: kubeconfig download, service URLs, next-steps guide

Shared UI:
- Button, Input, Badge, Card, Separator, Tooltip, Checkbox, Switch,
  Progress, Dialog, DropdownMenu, Select, Avatar (all owned, Radix primitives)

Widgets:
- StepIndicator with animated connectors and completion state
- CloudProviderCard with coming-soon state and tooltip

Features:
- Two runtime modes: saas (full auth) and selfhosted (direct to wizard)
- Live credential validation UX with feedback states
- Component dependency enforcement with tooltip explanations
- Cost estimate per region derived from Hetzner node size selection
- Cluster context names auto-derived from naming convention (NAMING-CONVENTION.md)

Builds clean: tsc -b + vite build, 34KB CSS, 723KB JS (pre-split)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 12:34:03 +01:00
e3mrah
2df03b7ea3 feat(axon): add V1 query() alongside V2 session pool with profile routing
- Add thinking, effort, profile fields to ChatCompletionRequest
- Add chatV1() and chatV1Stream() using query() with persistSession=false
- Route to V1 when thinking/effort params present or profile='deep'
- V2 session pool unchanged; V1 runs stateless with native systemPrompt

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 12:26:34 +01:00
Emrah Baysal
54b1b4bd3d docs: add unified naming convention and align existing docs
- Add docs/NAMING-CONVENTION.md — canonical naming standard for all
  cloud resources, K8s objects, DNS, and tags across all providers.
  Covers dimension taxonomy (provider/region/building-block/environment),
  the Don't-Repeat-the-Parent principle, 4-char DNS location codes with
  full lookup table, multi-tenant scoping via namespace, and migration rules.

- Fix SRE.md: remove primary/DR region labels; clusters are named by
  building block (rtz/dmz/mgt), not failover role. Both regions run
  symmetric rtz clusters; k8gb owns traffic distribution.

- Fix PLATFORM-TECH-STACK.md: update both Mermaid diagrams and region
  table to use Region A / Region B (rtz cluster) language.

- Fix core/README.md: Platform CRD example now references cluster context
  names (hz-fsn-rtz-prod / hz-hel-rtz-prod) instead of primary/standby roles.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 12:22:52 +01:00
e3mrah
5b04c6bd02 fix: increase axon-valkey probe initialDelaySeconds to survive slow RDB load 2026-03-18 16:10:21 +01:00
e3mrah
cf4c37b2df fix: use tcpSocket probes for axon-valkey — exec probes fail on k3s OCI runtime 2026-03-18 14:02:09 +01:00
e3mrah
baf2d8445d fix(axon): persistent Valkey reconnect — never give up retryStrategy
Previous retryStrategy(times > 5) returned null, permanently destroying the
ioredis client after 5 failed reconnects. After idle, the TCP connection drops,
all 5 retries fail, and every subsequent command throws 'Connection is closed'.

Changes:
- retryStrategy now retries indefinitely (max 30s interval) — connection
  is always restored when Valkey comes back
- 'end' event handler restarts the client if ioredis somehow stops retrying
- getValkey() returns null when client.status is 'end'/'close' so callers
  skip persistence gracefully instead of throwing
- maxRetriesPerRequest: 3 kept — commands fail fast, background reconnect
  handles recovery

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 06:09:07 +01:00
e3mrah
63a86772f7 fix(axon): evict idle sessions older than 5 min before handing to caller
Sessions whose Claude CLI subprocess has exited (idle > MAX_IDLE_MS) are
recycled in acquire() rather than returned. This prevents all-stale-pool
scenarios that caused WriteRecsActivity/ExtractIntentActivity to fail with
'Connection is closed' after Axon sits idle overnight.

- Added lastUsed: number to PoolEntry, set on warmup and release
- acquire() skips idle entries older than 5 min, recycles each one
- release() stamps lastUsed so the TTL resets on every successful use

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 06:05:05 +01:00
e3mrah
5f0421e967 fix(axon): restore word-level streaming in chatStream
Re-add 2-3 word chunk splitting with 25-60ms delays that was lost during
the includePartialMessages refactor. Fixes the "10s wait then dump" UX.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 16:09:18 +01:00
e3mrah
bc069483af fix(axon): restore working assistant message handler, revert broken includePartialMessages 2026-03-12 15:54:23 +01:00