| Age | Commit message (Collapse) | Author |
|
Consume [email protected] / [email protected] metrics: usage.stepId,
step-complete (ttft/decode/genTotal), done.durationMs/usage, and the
durable GET /conversations/:id/metrics endpoint.
- core/metrics: pure live-fold + durable-merge reducer; decode-rate TPS;
head-aligned, stable placement; progressive per-step rows (each shown as
its step ends) with the turn-total row gated on the done event.
- features/chat: store folds metric events + hydrates durable TurnMetrics;
ChatView renders inline step bubbles + a turn-total bubble.
- app: MetricsSync HTTP effect (tolerates 404) injected into chat stores.
- scripts/live-probe: drives the metrics path; live-verified 17/17 vs bin/up.
- docs: regenerate .dispatch wire/transport mirrors to 0.4.0; glossary terms
(turn/step metrics, TTFT, decode time, TPS, metrics bubble); trim handoff.
|
|
- add tailwindcss@4 + @tailwindcss/vite + daisyui@5; vite tailwind plugin
- src/app.css: @import tailwindcss + @plugin daisyui { themes: dracula --default }
(theme BUNDLED, not just named); imported in main.ts
- index.html: <html data-theme="dracula">
- biome.json: enable css tailwindDirectives so @plugin parses
- GLOSSARY: define FE term 'tab' (workspace slot referencing a conversation;
holds conversationId + model + title; close = local forget)
Verified: dracula tokens bundled in CSS, svelte-check 0/0, vitest 222, biome
clean, build ok.
|
|
Pure-core feature libraries assembled at the composition root:
- core/protocol: pure reducer over surface catalog/spec/error messages
- features/surface-host: generic field-kind interpreter (toggle/progress/
selector/stat/button) + pure plan logic; no surface-id special-casing
- adapters/ws: injected WebSocket client (effects at the edge)
- app: composition root store (Svelte 5 runes over the pure reducer),
host-relative surface WS URL resolution (resolveWsUrl), root App.svelte
Verified green: svelte-check 0/0, vitest 84 passed, biome clean, vite build ok.
|