feat: add pinned allocator lesson view

This commit is contained in:
user
2026-07-17 17:07:08 +02:00
parent e89f3f11ce
commit 759fdacd14
3 changed files with 516 additions and 19 deletions
+29 -1
View File
@@ -27,9 +27,15 @@ dlatego nie należy wystawiać go bezpośrednio poza zaufany host.
Hierarchia nawigacji jest stała:
```text
task → block → phase → step → snapshot
card → task → block → phase → step → snapshot
```
Ruch kursora przez `move` lub `PUT current` nie uruchamia symulatora.
Jawna aktywacja odbywa się przez `Enter` w WWW albo `F2` w WWW/Neovimie,
które wywołują `POST /api/navigation/sync`. Dla poziomu BLOCK backend wybiera
pierwszy STEP tego bloku. CARD i TASK są odrzucane, ponieważ nie wskazują
konkretnego checkpointu diagramu.
| Metoda i endpoint | Znaczenie |
| --- | --- |
| `GET /api/keyboard` | Skróty i obsługiwane poziomy nawigacji. |
@@ -37,6 +43,7 @@ task → block → phase → step → snapshot
| `GET /api/navigation/current` | Bieżąca pozycja oraz status checkpointu. |
| `PUT /api/navigation/current` | Ustawia dokładną pozycję i poziom fokusu. |
| `POST /api/navigation/move` | Przesuwa kursor o `delta` na wybranym poziomie. |
| `POST /api/navigation/sync` | Odtwarza checkpoint przypisany do bieżącej, zapisanej pozycji. |
Przykład ustawienia kroku — identyfikatory są danymi konkretnej karty:
@@ -81,6 +88,13 @@ Wywołanie orkiestratora przypina zarówno kontener, jak i rewizję karty:
}
```
Backend przechowuje bieżącą nawigację i stan viewera w SQLite. Domyślna baza
to `.stem/card-state.sqlite3`; ścieżkę można zmienić przez
`CARD_STATE_DATABASE`. Ta sama aplikacja wystawia HTTP również przez lokalny
socket `.stem/card-api.sock` (`CARD_API_SOCKET`). Repozytorium jest montowane w
kontenerze jako `/workspace`, dlatego Neovim wywołuje API przez
`/workspace/.stem/card-api.sock` bez otwierania dodatkowego portu sieciowego.
Replay kończy się powodzeniem wyłącznie ze statusem `ready`. Zmiana kontenera,
socketu MCP albo źródłowego JSON-a podczas operacji powoduje odrzucenie
wyniku; pozycja strony i `SYNC ON` nie są wtedy publikowane.
@@ -93,6 +107,8 @@ wyniku; pozycja strony i `SYNC ON` nie są wtedy publikowane.
| `GET /api/nvim/state` | Bieżący bufor, okno, kursor i tryb Neovima. |
| `PUT /api/nvim/cursor` | Ustawia `row`, `column` i opcjonalnie `window`. |
| `POST /api/nvim/input` | Przekazuje do 256 znaków przez `nvim_input`. |
| `POST /api/nvim/reset` | Resetuje cel i odświeża debugger (`F1`). |
| `POST /api/nvim/redraw` | Dopasowuje host pane i grid UI, a następnie wykonuje pełny redraw (`Ctrl+\``). |
| `WS /api/nvim-ui` | Strumień zewnętrznego UI Neovima do panelu WWW. |
Pole `viewer.scroll` zapisuje położenie dokumentu (`x`, `y`), numer strony
@@ -104,6 +120,10 @@ Wyłączenie `viewer.nvim.sync` automatycznie wyłącza również
`viewer.nvim.control`. Samo ponowne włączenie synchronizacji nie uzbraja
sterowania klawiaturą bez jawnego `control: true`.
`viewer.allocator.visible` przechowuje stan przypiętego modelu alokatora.
Model jest przełączany przez `Alt+6` i pokazuje fazę/krok, `allocp`, zajętość
areny oraz wartości związane z bieżącym checkpointem.
### Podział odpowiedzialności widoków
Interaktywny diagram UML pokazuje przepływ i służy do wyboru kroku. Nie
@@ -119,6 +139,14 @@ diagramem.
| `GET /api/progress` | Katalog, statusy i podsumowanie wykonania. |
| `PUT /api/progress/:itemId` | Ustawia `pending` albo `approved`, notatkę i aktora. |
| `GET /api/report/teams.md` | Generuje bieżący raport Markdown do Teams. |
| `GET/POST /api/events` | Odczytuje lub dopisuje chronologiczne zdarzenia z timestampem backendu. |
| `POST /api/evidence` | Zapisuje PNG/JPEG i przypina go do zdarzenia. |
| `GET /api/evidence/:name` | Udostępnia zapisany dowód. |
| `GET /api/report/lesson.html` | Renderuje chronologiczny raport HTML z dowodami. |
Zdarzenia są dopisywane do SQLite i obejmują nawigację, aktywacje
checkpointów, reset/redraw Neovima, zmiany viewera oraz postęp. Dzięki temu
raport pokazuje rzeczywistą kolejność pracy, a nie wyłącznie końcowy stan.
## Planowane strategie i adnotacje