fix(webapp): load router selections from /api/routers (#21)

<!-- greptile_comment -->

<h2>Greptile Overview</h2>

<h3>Greptile Summary</h3>

Replaced hardcoded router configuration (`cc-ir1-gw`, `oh-ir1-gw`) with dynamic loading from `/api/routers` endpoint. The store now initializes with empty routers and lazily loads them via `ensureRoutersLoaded()` before fetching netflow data.

**Key changes:**
- Removed hardcoded router names from initial state
- Added `ensureRoutersLoaded()` method with caching logic
- Method called automatically before `loadData()` fetches stats
- Consistent with main page approach in `+page.svelte:67-87`

<h3>Confidence Score: 5/5</h3>

- This PR is safe to merge with minimal risk
- Clean refactoring that removes hardcoded configuration in favor of environment-based setup. The lazy-loading pattern with early-return caching is correct, error handling is proper, and the approach mirrors the existing pattern used in the main page component.
- No files require special attention

<h3>Important Files Changed</h3>




| Filename | Overview |
|----------|----------|
| netflow-webapp/src/lib/stores/netflow.svelte.ts | Replaced hardcoded router configuration with dynamic loading from `/api/routers`, added `ensureRoutersLoaded()` method called before data fetching |

</details>



<h3>Sequence Diagram</h3>

```mermaid
sequenceDiagram
    participant Store as NetflowStore
    participant API as /api/routers
    participant Env as AVAILABLE_ROUTERS
    
    Store->>Store: loadData() called
    Store->>Store: ensureRoutersLoaded()
    alt routers already loaded
        Store->>Store: return early
    else routers empty
        Store->>API: fetch('/api/routers')
        API->>Env: read AVAILABLE_ROUTERS
        Env-->>API: router list (string[])
        API-->>Store: JSON response
        Store->>Store: populate _state.routers
    end
    Store->>Store: continue with data fetch
```

<sub>Last reviewed commit: 747cf8e</sub>

<!-- greptile_other_comments_section -->

<!-- /greptile_comment -->
e5d977ed27oliver committed on 2/13/2026, 7:37:52 AM· committed by GitHubparents80b1f9e747cf8e
1 file changedLine totals unavailable