docs: update documentation to OKF v0.1 format

This commit is contained in:
OpenVelo Agent
2026-07-22 16:16:20 +00:00
parent 4656a5b082
commit ae159f4f73
4 changed files with 45 additions and 10 deletions
+11 -3
View File
@@ -1,9 +1,9 @@
--- ---
type: api type: api
title: System Endpoints title: System Endpoints
description: Bootstrap payload, public event status, public/authenticated SSE streams, and public event-window timestamps. description: Bootstrap payload, public event status, public/authenticated SSE streams, and public event-window timestamps; the public `event/stream` also forwards `general` topic frames carrying `registrationsEnabled`.
tags: [api, system, bootstrap, event, sse, settings] tags: [api, system, bootstrap, event, sse, settings, registrations]
timestamp: 2026-07-22T13:40:00Z timestamp: 2026-07-22T16:15:00Z
--- ---
# Endpoints # Endpoints
@@ -130,6 +130,14 @@ Public, flattened event stream that emits the legacy payload shape
1-second tick and on hub pushes. Preserved for backward compatibility 1-second tick and on hub pushes. Preserved for backward compatibility
with the original landing page status badge. with the original landing page status badge.
`admin/general` updates are also broadcast on this stream as
`{ topic: 'general', themeKey, registrationsEnabled }` so the public
landing page can refresh its cached bootstrap whenever an admin toggles
the registrations flag (or any other general setting) without forcing
the user to hard-refresh. The frame is interleaved with the legacy
event-status frames. The legacy event-status frames are still emitted
on the 1-second tick so existing consumers are unaffected.
# `GET /api/v1/scoreboard/stream` # `GET /api/v1/scoreboard/stream`
Public SSE stream that pushes a flattened solve payload whenever a new Public SSE stream that pushes a flattened solve payload whenever a new
+5 -3
View File
@@ -1,9 +1,9 @@
--- ---
type: architecture type: architecture
title: Key Files Index title: Key Files Index
description: One-line responsibility for important source and contract-test files, including strict event-window validation. description: One-line responsibility for important source and contract-test files, including strict event-window validation and the public bootstrap SSE listener.
tags: [architecture, key-files, event-window, validation, default-challenge-ip] tags: [architecture, key-files, event-window, validation, default-challenge-ip, sse, bootstrap]
timestamp: 2026-07-22T15:46:18Z timestamp: 2026-07-22T16:15:00Z
--- ---
# Backend # Backend
@@ -42,6 +42,8 @@ timestamp: 2026-07-22T15:46:18Z
| `frontend/src/app/core/services/auth.service.ts` | Signal-backed access token and current-user state; owns the cross-tab invalidation `BroadcastChannel` + `storage`-event fallback. | | `frontend/src/app/core/services/auth.service.ts` | Signal-backed access token and current-user state; owns the cross-tab invalidation `BroadcastChannel` + `storage`-event fallback. |
| `frontend/src/app/core/services/auth-session-events.pure.ts` | Pure cross-tab message encoding/validation and namespaced constants used by the auth broadcast channel. | | `frontend/src/app/core/services/auth-session-events.pure.ts` | Pure cross-tab message encoding/validation and namespaced constants used by the auth broadcast channel. |
| `frontend/src/app/core/services/authenticated-event-source.service.ts` | Fetch-based authenticated SSE transport with frame parsing, abort support, and a separate `'unauthorized'` event for `401`/`403`. | | `frontend/src/app/core/services/authenticated-event-source.service.ts` | Fetch-based authenticated SSE transport with frame parsing, abort support, and a separate `'unauthorized'` event for `401`/`403`. |
| `frontend/src/app/core/services/bootstrap-event.service.ts` | Root-provided public SSE listener that subscribes to `/api/v1/event/stream`, filters `topic === 'general'` frames, and triggers `BootstrapService.refresh()` so the landing modal stays in sync with admin general-settings updates. |
| `frontend/src/app/core/services/bootstrap-event.pure.ts` | Pure helpers for the public bootstrap SSE listener: `isBootstrapGeneralFrame` predicate, SSE line parser, and the `makeBootstrapEventSource` factory (fetch + `ReadableStream` opener with frame buffering and idempotent `close()`). |
| `frontend/src/app/core/services/event-status.store.ts` | Event state signal store, one-second countdown timer, and the optional `onUnauthorized` callback wiring. | | `frontend/src/app/core/services/event-status.store.ts` | Event state signal store, one-second countdown timer, and the optional `onUnauthorized` callback wiring. |
| `frontend/src/app/core/services/event-status.pure.ts` | Event payload types, transport interface (including `'unauthorized'` listener), pure countdown helpers, and the `LED_COLOR_BY_STATE` map used by the shell LED. | | `frontend/src/app/core/services/event-status.pure.ts` | Event payload types, transport interface (including `'unauthorized'` listener), pure countdown helpers, and the `LED_COLOR_BY_STATE` map used by the shell LED. |
| `frontend/src/app/features/home/home.component.ts` | Authenticated shell container; starts user and event state services, subscribes to peer invalidation, and navigates to `/login` when the session is invalidated elsewhere. | | `frontend/src/app/features/home/home.component.ts` | Authenticated shell container; starts user and event state services, subscribes to peer invalidation, and navigates to `/login` when the session is invalidated elsewhere. |
+28 -3
View File
@@ -1,9 +1,9 @@
--- ---
type: guide type: guide
title: Landing Page title: Landing Page
description: How the public landing page renders, how the login + registration modal is opened, and what each form does. description: How the public landing page renders, how the login + registration modal is opened, what each form does, and how the modal stays in sync with admin `registrationsEnabled` changes via SSE.
tags: [guide, landing, login, register, ui] tags: [guide, landing, login, register, ui, sse, bootstrap]
timestamp: 2026-07-21T18:45:54Z timestamp: 2026-07-22T16:15:00Z
--- ---
# What you see # What you see
@@ -90,6 +90,31 @@ The modal is dismissible via the **×** button (`landing-modal-close`),
clicking the overlay backdrop, or pressing `Escape`. Submit-in-flight clicking the overlay backdrop, or pressing `Escape`. Submit-in-flight
dismissal is suppressed. dismissal is suppressed.
# Reacting to admin changes
The Login/Register modal reflects the value of
`bootstrap.payload().registrationsEnabled`, which is loaded once at app
boot by `BootstrapService.load()`. Two paths keep the modal consistent
with the API:
1. `LandingComponent.ngOnInit()` calls `BootstrapService.refresh()` so
the public landing page always fetches the latest bootstrap payload
before rendering the modal. This covers users who reach `/login`
via a hard refresh or fresh tab and have not previously subscribed to
the SSE channel.
2. `BootstrapEventService` (started by `AppComponent.ngOnInit`) opens
the public `GET /api/v1/event/stream` SSE channel and listens for
`{ topic: 'general' }` frames. Whenever the admin saves a setting via
`PUT /api/v1/admin/general/settings`, the backend emits a `general`
hub event with `themeKey` and `registrationsEnabled`; the public SSE
forwards it on `/api/v1/event/stream` and the SPA calls
`BootstrapService.refresh()` to re-apply the new flag (and theme).
The pure helper `landingModalShowsRegister(registrationsEnabled)` in
`frontend/src/app/features/landing/login-modal.service.ts` mirrors the
HTML predicate and is asserted in
`tests/frontend/landing-modal.spec.ts`.
# Server error code → user copy # Server error code → user copy
`buildLoginFailureMessage` (`frontend/src/app/features/landing/login-modal.service.ts`) `buildLoginFailureMessage` (`frontend/src/app/features/landing/login-modal.service.ts`)
+1 -1
View File
@@ -11,7 +11,7 @@ scoreboard, an event window with a public countdown, theming, and admin
controls. controls.
The docs below are organized by purpose so agents can pull just the slice The docs below are organized by purpose so agents can pull just the slice
they need. Last regenerated 2026-07-22T15:46:18Z. they need. Last regenerated 2026-07-22T16:15:00Z.
# Architecture # Architecture