A crowd you can find, and a phone 65px too narrow
Two reports against 1.6.0 and 1.7.0, both correct. The crowd worked end to end and was, in practice, not there: the picker was behind the ⋯ menu of a chat that already existed, and the switch was a card on the Agents page, which made it read as an agent-chat feature. The picker is now a button in the composer toolbar on both screens that include it, and on the new-chat screen the choice rides along with the first message, so a chat can start as a crowd instead of having to be converted into one. The instance switch has its own page. The width bug was the suggestion cards, exactly as reported. `.suggestions` rendered 455px inside a 366px column, and the tree's standing rule applied on its own made it worse -- 428px to 455px. A grid item carries `min-width: auto`, which is a min-content floor, and a floor beats `width: 100%`; the floor is measured while the percentage is indefinite, so `min(100%, …)` alone sends the track to a card's max-content. Both halves now go on all four auto-fit grids, and a test refuses either alone. It survived four releases of narrow-width checking because the harness never rendered that screen: `TestClient(app)` runs no lifespan outside a `with` block, so the startup-seeded cards were missing from every shot ever taken of it. And its overflow check skipped anything inside a scroller -- right for a table in its own scroller, blind to the scroller itself, which `overflow-y: auto` makes scroll sideways too. Both fixed; it now names the box and the child to blame. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
"""The crowd: several models answering one turn, in any chat.
|
||||
|
||||
Its own module because it is its own page, and it is its own page because as a card
|
||||
on `/admin/agents` it read as an agent-chat feature. It is not one: a crowd works in
|
||||
an ordinary conversation, and the owner reasonably concluded otherwise from where
|
||||
the switch was sitting.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Form, Request, Response, status
|
||||
from fastapi.responses import RedirectResponse
|
||||
|
||||
from lembas.api.deps import AdminUser, Db
|
||||
from lembas.services import settings_store
|
||||
from lembas.web.templating import render
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
router = APIRouter(prefix="/admin/crowd", tags=["admin-crowd"])
|
||||
|
||||
|
||||
@router.get("")
|
||||
async def crowd_page(request: Request, db: Db, user: AdminUser, saved: str = ""):
|
||||
"""Its own page, for the reason its template records: as a card on the Agents
|
||||
screen it read as an agent-chat feature, which it is not."""
|
||||
return render(
|
||||
request,
|
||||
"admin/crowd.html",
|
||||
{"crowd": settings_store.crowd(db), "saved": saved},
|
||||
)
|
||||
|
||||
|
||||
@router.post("")
|
||||
async def save_crowd(
|
||||
db: Db,
|
||||
user: AdminUser,
|
||||
enabled: bool = Form(False),
|
||||
max_models: int = Form(4),
|
||||
max_rounds: int = Form(2),
|
||||
wall_seconds: int = Form(900),
|
||||
collapse_agreement: bool = Form(False),
|
||||
) -> Response:
|
||||
"""One group, one form, one route.
|
||||
|
||||
The bounds are clamped here as well as in `settings_store.crowd`, which is the
|
||||
same belt-and-braces `save_subagents` in `admin_agents.py` uses: a value posted
|
||||
past this route -- by an older page, or by hand -- still reads back sane.
|
||||
"""
|
||||
settings_store.update(
|
||||
db,
|
||||
{
|
||||
"enabled": enabled,
|
||||
# Every floor is one: a zero would be the feature switched off
|
||||
# wearing the switch's clothes.
|
||||
"max_models": min(max(max_models, 1), 8),
|
||||
"max_rounds": min(max(max_rounds, 1), 5),
|
||||
"wall_seconds": min(max(wall_seconds, 60), 7200),
|
||||
"collapse_agreement": collapse_agreement,
|
||||
},
|
||||
key=settings_store.CROWD,
|
||||
)
|
||||
log.info("crowd %s by %s", "enabled" if enabled else "disabled", user.email)
|
||||
return RedirectResponse("/admin/crowd?saved=1", status_code=status.HTTP_303_SEE_OTHER)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user