Skip to content

cotel Page Specs ​

Layout sketches and annotated field lists for each of the 6 dashboard pages.
All component names reference components.md. All tokens reference tokens.md.

Status: v1 — covers Overview, Sessions, Session Detail, Costs, Tools, Models.
Min supported viewport: 1280px wide.

Design lens: Shneiderman "Overview first, zoom and filter, details on demand" throughout.


Global shell ​

All pages share this shell. The shell renders before any page data loads.

┌──────────────────────────────────────────────────────────────────────────┐
│  cotel  (sidebar brand)                                                  │
├──────────────────────────────────────────────────────────────────────────┤
│ SIDE │                                                                   │
│  BAR │   [Page content — see each page spec below]                      │
│      │                                                                   │
│  nav │                                                                   │
│items │                                                                   │
│      │                                                                   │
└──────┴───────────────────────────────────────────────────────────────────┘

Shell layout ​

ElementSpec
LayoutCSS grid: 160px auto columns
Sidebar<SidebarNav> — fixed height 100vh, sticky
Main areapadding: --space-8, overflow-y: auto, min-width: 0
BreakpointAt ≤768px: sidebar collapses to 48px (icon-only mode)
Min viewport1280px wide (dashboard context; no mobile table layout needed)

Global controls ​

The date range picker (<DateRangePicker>) and refresh indicator (<RefreshIndicator>) live at the top-right of the main area, not in the sidebar. They appear on every page in the same position.

Main area top-right:
  [  30d  ▾  ]   [●]

These are rendered by a shared <PageHeader> component that wraps every page's title and controls:

┌─────────────────────────────────────────────────────────────┐
│  Overview                         [  30d  ▾  ]  [●]        │
└─────────────────────────────────────────────────────────────┘

1. Overview (/) ​

Purpose: Landing page. Single-screen summary of the period. Entry point to every other page.

┌──────┬──────────────────────────────────────────────────────────────┐
│      │  Overview                              [  30d  ▾  ]  [●]     │
│      ├──────────────────────────────────────────────────────────────┤
│ nav  │                                                              │
│      │  ┌─────────┐  ┌─────────┐  ┌─────────┐  ┌─────────┐       │
│      │  │Sessions │  │  Cost   │  │  Input  │  │ Output  │       │
│      │  │  142    │  │ $47.23  │  │  2.1M   │  │  890K   │       │
│      │  │↑12 (9%) │  │↑8% prev │  │         │  │         │       │
│      │  └─────────┘  └─────────┘  └─────────┘  └─────────┘       │
│      │                                                              │
│      │  Daily cost ─────────────────────────────────────────────   │
│      │  ┌────────────────────────────────────────────────────────┐ │
│      │  │  $4.00 ┤                        ▐▌                    │ │
│      │  │  $2.00 ┤  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  │ │
│      │  │  $0.00 └───────────────────────────────────────────── │ │
│      │  └────────────────────────────────────────────────────────┘ │
│      │                                                              │
│      │  Recent sessions                                            │
│      │  ┌──────────────────────────────────────────────────────┐  │
│      │  │ Session ID  Started     Duration  Model       Cost   │  │
│      │  │ sess_abc…   2h ago      5m 12s    sonnet-4-6  $0.024 │  │
│      │  │ sess_def…   4h ago      12m 47s   opus-4-7    $0.187 │  │
│      │  │ sess_ghi…   Yesterday   2m 03s    haiku-4-5   $0.003 │  │
│      │  │ sess_jkl…   Yesterday   8m 31s    sonnet-4-6  $0.051 │  │
│      │  │ sess_mno…   2 days ago  15m 22s   sonnet-4-6  $0.094 │  │
│      │  └──────────────────────────────────────────────────────┘  │
│      │                              → View all sessions            │
└──────┴──────────────────────────────────────────────────────────────┘

Annotated fields ​

RegionComponentFieldSourceFormat
KPI row<KpiCard>SessionsGET /overview → total_sessionsInteger
KPI row<KpiCard>Active UsersGET /overview → users_countInteger — principals with usage in the range, not the registered-user total the Users page lists
KPI row<KpiCard>Total CostGET /overview → total_cost_usd$0.00
KPI row<KpiCard>Input TokensGET /overview → total_input_tokens1.2M, 890K, 12.4K
KPI row<KpiCard>Output TokensGET /overview → total_output_tokensSame
KPI row (delta)<KpiCard>Delta vs prevCompare ?since=N vs ?since=2N&until=N+8%, --
Daily cost<ChartWrapper> + Chart.js barDay labelsGET /costs/timeseriesx: MMM D, y: $0.00
Daily cost—Y-axis maxDerived: max(day_cost) × 1.2Rounded to nearest $1
Recent sessions<DataTable>Session IDGET /sessions?limit=5&sort=started_at:descMonospace, truncated to 16 chars + …
Recent sessions<DataTable>Startedstarted_atRelative time (2h ago, Yesterday) via date-fns.formatDistanceToNow
Recent sessions<DataTable>Durationduration_msXm Ys — minutes + seconds
Recent sessions<DataTable>Modelmodel<StatBadge variant="neutral">
Recent sessions<DataTable>Costtotal_cost_usd$0.000 (3dp)
"View all" linkPlain <a>—Navigates to /sessionsRight-aligned below table

Layout notes ​

  • KPI row: display: flex, gap: --space-3, flex-wrap: wrap, margin-bottom: --space-6.
  • Daily cost chart: height 200px, fills available width.
  • Recent sessions table: non-sortable (fixed: most recent first), non-paginated, no filter bar.
  • "View all sessions" link: right-aligned, --text-sm, --color-accent.

Shipped section order ​

The page stacks six <StatSection> blocks, each a summary of one resource with a "View all" link to its full page, in this order:

  1. Span activity — a grid of cells, one span-count bucket each, GitHub contribution-graph style. First, because it is the page's pulse; everything under it is the itemised answer. The range picks the grid and the granularity it fetches: 53 × 7 days on Year and All, 31 × 6 four-hour cells on Month, 24 × 7 hourly cells on Week, 24 × 6 ten-minute cells on Day. Cells outside the queried window — the leading edge, and the rest of today — are drawn as an outline, never as an empty cell (ADR-0016).
  2. Users — top 5 by spend in the range. Hidden while the page is scoped to a single user via ?user_id=, where a top-5-users table would be the one panel on the page not answering for that user.
  3. Activity & Cost — spans as a filled area against the left axis and cost as a line against the right, from one /history call. hour granularity on the Day range, day otherwise; links to both full pages (ADR-0015).
  4. Tools — top 5 by call count.
  5. Models — all models by span count.
  6. Sessions — 5 most recent. Last, because it is the only block that cannot honour a long range (see covered_since in the API reference).

The header carries one <SegmentedControl> bound to RANGE_OPTIONS and persisted in the cotel_overview_range cookie — its own key, so changing the range here does not move the Users or Tools page. KPI labels take their suffix from RANGE_SUFFIX (All renders none) (ADR-0014).


2. Sessions (/sessions) ​

Purpose: Full session list with filter and sort. Entry point to session drill-down.

┌──────┬──────────────────────────────────────────────────────────────┐
│      │  Sessions                              [  30d  ▾  ]  [●]     │
│      ├──────────────────────────────────────────────────────────────┤
│ nav  │                                                              │
│      │  [Model: All ▾]  [Search session ID…    🔍]                 │
│      │                                                              │
│      │  ┌────────────────────────────────────────────────────────┐ │
│      │  │ Session ID↕  Started↕  Duration↕  Model  Cost↕  Spans │ │
│      │  │ sess_abc…    May9 14:32  5m 12s   s-4-6  $0.024   47  │ │
│      │  │ sess_def…    May9 12:15  12m 47s  o-4-7  $0.187   182 │ │
│      │  │ sess_ghi…    May8 09:01  2m 03s   h-4-5  $0.003   12  │ │
│      │  │ …                                                      │ │
│      │  └────────────────────────────────────────────────────────┘ │
│      │                                                              │
│      │  [← Prev]  1  [2]  3  4  [Next →]   Page 2 of 14           │
└──────┴──────────────────────────────────────────────────────────────┘

Annotated fields ​

RegionComponentFieldSourceFormat
Filter bar<select>Model filterGET /sessions/models (distinct values)Dropdown: "All", then model names
Filter bar<input>Session ID searchClient-side prefix match or ?q=Free text
Table<DataTable>Session IDsession_idMonospace, 16ch + …, click → /sessions/:id
Table<DataTable>Startedstarted_atMMM D, HH:mm (absolute on this page)
Table<DataTable>Durationduration_msXm Ys
Table<DataTable>Modelmodel<StatBadge variant="neutral">
Table<DataTable>Costtotal_cost_usd$0.000, right-aligned
Table<DataTable>Spansspan_countInteger, right-aligned
Rows<DataTable>Error indicatorhas_error: trueRow background: --color-danger-bg
Pagination<Pagination>Page / totalGET /sessions response metadatapage, total_pages

Sort defaults ​

  • Initial sort: started_at DESC (most recent first).
  • Sortable columns: Session ID, Started, Duration, Cost.
  • Model and Spans are not sortable in v1.

Filter behavior ​

  • Model filter: URL param ?model=sonnet-4-6. "All" clears the param.
  • Search: ?q=<prefix>. Applied server-side; minimum 3 characters before triggering.
  • Both filters combine with AND semantics.
  • Filters + sort state persist in URL.

Row click ​

Click any row → navigate to /sessions/:session_id.


3. Session Detail (/sessions/:session_id) ​

Purpose: Full breakdown of a single session: header metadata, span timeline, cost summary, raw attributes.

┌──────┬──────────────────────────────────────────────────────────────┐
│      │  Sessions / sess_abc123defg456h                              │
│      │  ← Breadcrumb                                                │
│      ├──────────────────────────────────────────────────────────────┤
│ nav  │  Session  sess_abc123defg456h…                               │
│      │                                                              │
│      │  ┌─────────────────────────────────────────────────────┐    │
│      │  │ Started       Duration    Model        Cost         │    │
│      │  │ May 9, 14:32  5m 12s      sonnet-4-6   $0.024       │    │
│      │  └─────────────────────────────────────────────────────┘    │
│      │                                                              │
│      │  COST + TOKENS ─────────────────────────────────────────    │
│      │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐   │
│      │  │ Total    │  │ Input    │  │ Output   │  │ Spans    │   │
│      │  │ $0.024   │  │ 12,480   │  │ 4,230    │  │ 47       │   │
│      │  └──────────┘  └──────────┘  └──────────┘  └──────────┘   │
│      │                                                              │
│      │  SPANS ──────────────────────────────────────────────────   │
│      │  ┌──────────────────────────────────────────────────────┐   │
│      │  │ Name↕     Type    Duration↕  Tokens  Cost   Status   │   │
│      │  │ session   root    5m 12s      —       —      ✓        │   │
│      │  │ turn-1    llm     2.1s       8,240   $0.018  ✓        │   │
│      │  │ bash-1    tool    0.8s        —       —      ✓        │   │
│      │  │ turn-2    llm     1.4s       8,470   $0.006  ✓        │   │
│      │  │ bash-2    tool    0.2s        —       —      ✗ error  │   │
│      │  └──────────────────────────────────────────────────────┘   │
│      │                                                              │
│      │  ▸ RAW ATTRIBUTES (collapsible)                             │
└──────┴──────────────────────────────────────────────────────────────┘

Annotated fields ​

RegionComponentFieldSourceFormat
Breadcrumb<Breadcrumb>"Sessions" link—Links to /sessions
Breadcrumb<Breadcrumb>Current sessionsession_idTruncated: 24ch max
Session header<InfoGrid>Startedstarted_atMMM D, YYYY, HH:mm:ss
Session header<InfoGrid>Durationduration_msXm Ys
Session header<InfoGrid>Modelmodel<StatBadge variant="neutral">
Session header<InfoGrid>Costtotal_cost_usd$0.000
KPI row<KpiCard>Total CostAggregated from spans$0.000
KPI row<KpiCard>Input TokensSUM(input_tokens)Integer with , separators
KPI row<KpiCard>Output TokensSUM(output_tokens)Integer with , separators
KPI row<KpiCard>SpansCOUNT(spans)Integer
Span table<DataTable>Namespan.nameMonospace, truncated
Span table<DataTable>Typespan.kind or derived<StatBadge>: llm accent, tool neutral, root neutral
Span table<DataTable>Durationend_time - start_timeX.Xs for <60s, Xm Ys for ≥60s
Span table<DataTable>Tokensinput_tokens + output_tokensInteger or — for tool spans
Span table<DataTable>Costcost_usd$0.000 or — for tool spans
Span table<DataTable>Statusstatus_code✓ in --color-success, ✗ error in --color-danger
Error rows<DataTable>Error rowsstatus_code == ERRORRow background --color-danger-bg
Raw attributes<details>/<summary>JSON blobspan.attributesCollapsible; monospace, --text-mono-sm, --color-text-2

Span table sort ​

  • Initial sort: start_time ASC (chronological timeline).
  • Sortable: Name, Duration, Tokens, Cost.

Raw attributes section ​

▸ Raw attributes   ← <summary>, click to expand
  {
    "session_id": "sess_abc123…",
    "tool_name": "bash",
    "exit_code": 1,
    …
  }
  • Rendered with white-space: pre, --font-mono, --text-mono-sm.
  • Background: --color-surface-2, padding --space-3, border-radius --radius-base.
  • Each span has its own collapsible attributes block, shown inline in the row as an expandable sub-row, or as a separate section below the table. v1: single combined JSON block for the whole session.

4. Costs (/costs) ​

Purpose: Financial breakdown — daily trend, model split, top sessions by spend.

┌──────┬──────────────────────────────────────────────────────────────┐
│      │  Costs                                 [  30d  ▾  ]  [●]     │
│      ├──────────────────────────────────────────────────────────────┤
│ nav  │                                                              │
│      │  ┌─────────────────────────────────────────────────────┐    │
│      │  │  Total cost: $47.23   (+8% vs prev 30d)             │    │  ← headline card, full-width
│      │  └─────────────────────────────────────────────────────┘    │
│      │                                                              │
│      │  Daily cost ──────────────────────────────────────────────  │
│      │  ┌────────────────────────────────────────────────────────┐ │
│      │  │  $4.00 ┤                        ▐▌                    │ │
│      │  │  $2.00 ┤  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  ▐▌  │ │
│      │  │  $0.00 └───────────────────────────────────────────── │ │
│      │  └────────────────────────────────────────────────────────┘ │
│      │                                                              │
│      │  By model ──────────────────  Top sessions ────────────     │
│      │  ┌───────────────────────────┐  ┌────────────────────────┐  │
│      │  │ Model      Sessions  Cost │  │ Session ID     Cost    │  │
│      │  │ sonnet-4-6  98       $31  │  │ sess_def…      $0.187  │  │
│      │  │ opus-4-7    12       $14  │  │ sess_xyz…      $0.154  │  │
│      │  │ haiku-4-5   32       $2   │  │ sess_abc…      $0.024  │  │
│      │  └───────────────────────────┘  └────────────────────────┘  │
└──────┴──────────────────────────────────────────────────────────────┘

Annotated fields ​

RegionComponentFieldSourceFormat
HeadlineFull-width <KpiCard>Total costGET /overview → total_cost_usd$0.00 (2dp)
Headline<KpiCard>DeltaCompare prev period+8% vs prev 30d
Daily cost<ChartWrapper> + Chart.js barDay / costGET /costs/timeseriesx: MMM D, y: $0.00
Daily cost—Hover tooltipChart.js tooltipMay 9: $3.47
By model<DataTable>ModelGET /costs/by-model → model<StatBadge variant="neutral">
By model<DataTable>Sessionssession_countInteger
By model<DataTable>Costtotal_cost_usd$0.00, right-aligned, sorted desc
By model<DataTable>% of totalDerived30% in --color-text-2, right-aligned
Top sessions<DataTable>Session IDGET /costs/by-session?limit=10Monospace, links to /sessions/:id
Top sessions<DataTable>Costtotal_cost_usd$0.000, right-aligned

Layout ​

Two-column grid for "By model" and "Top sessions":
display: grid; grid-template-columns: 1fr 1fr; gap: --space-6;
At <900px: stack to single column.


5. Tools (/tools) ​

Purpose: Tool usage analytics — call volume, duration, failure rate, trend.

┌──────┬──────────────────────────────────────────────────────────────┐
│      │  Tools                                 [  30d  ▾  ]  [●]     │
│      ├──────────────────────────────────────────────────────────────┤
│ nav  │                                                              │
│      │  ┌──────────┐  ┌──────────┐  ┌──────────┐                  │
│      │  │  Calls   │  │ Avg Dur  │  │  Fail %  │                  │
│      │  │  1,842   │  │  0.8s    │  │  2.3%    │                  │
│      │  └──────────┘  └──────────┘  └──────────┘                  │
│      │                                                              │
│      │  Tool calls by day ──────────────────────────────────────── │
│      │  ┌────────────────────────────────────────────────────────┐ │
│      │  │  (multi-series bar: top 3 tools, stacked or grouped)   │ │
│      │  └────────────────────────────────────────────────────────┘ │
│      │                                                              │
│      │  Tool breakdown ───────────────────────────────────────────  │
│      │  ┌────────────────────────────────────────────────────────┐ │
│      │  │ Tool name↕   Calls↕  Avg dur↕  Fail %↕  Usage bar     │ │
│      │  │ Bash         942     0.9s       1.2%     ████████████  │ │
│      │  │ Read          441     0.1s       0.0%     █████         │ │
│      │  │ Edit          220     0.2s       0.5%     ██▌           │ │
│      │  │ Grep          180     0.3s       0.0%     ██            │ │
│      │  │ Write          59     0.1s       0.0%     ▌             │ │
│      │  └────────────────────────────────────────────────────────┘ │
└──────┴──────────────────────────────────────────────────────────────┘

Annotated fields ​

RegionComponentFieldSourceFormat
KPI row<KpiCard>Total callsGET /tools/stats → total_callsInteger with ,
KPI row<KpiCard>Avg durationGET /tools/stats → avg_duration_ms0.8s, 1.2m
KPI row<KpiCard>Fail %failed_calls / total_calls2.3%
Trend chart<ChartWrapper> + Chart.js barDay / tool / countGET /tools/timeseriesMulti-series, top 3 tools; others grouped as "Other"
Breakdown<DataTable>Tool nametool_nameMonospace
Breakdown<DataTable>Callscall_countInteger, right-aligned, sorted desc by default
Breakdown<DataTable>Avg durationavg_duration_ms0.9s
Breakdown<DataTable>Fail %fail_rate1.2%, colored --color-danger if >5%
Breakdown<DataTable>Usage barcall_count / max_call_countCSS bar: --color-accent fill, proportional width, max 100px wide

Fail % threshold coloring ​

  • < 1%: --color-text-1 (default)
  • 1–5%: --color-warning
  • 5%: --color-danger

This uses preattentive attributes (color) to surface anomalies per Tufte / Von Restorff.

Trend chart — multi-series config ​

ts
// Chart.js dataset config (example)
datasets: tools.slice(0, 3).map((tool, i) => ({
  label: tool.name,
  data: tool.dailyCounts,
  backgroundColor: `var(--color-chart-${i + 1})`,
}))

Show legend for multi-series tool chart (override Chart.js default). Position: top.


6. Models (/models) ​

Purpose: Model-level analytics — cost, token usage, session count, and model comparison.

This page is net-new (not in the prior IA doc). Add Models as the 5th nav item in <SidebarNav> after Tools.

┌──────┬──────────────────────────────────────────────────────────────┐
│      │  Models                                [  30d  ▾  ]  [●]     │
│      ├──────────────────────────────────────────────────────────────┤
│ nav  │                                                              │
│      │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐   │
│      │  │ Sessions │  │ Cost     │  │ In Tokens│  │Out Tokens│   │
│      │  │  142     │  │ $47.23   │  │  2.1M    │  │  890K    │   │
│      │  └──────────┘  └──────────┘  └──────────┘  └──────────┘   │
│      │                                                              │
│      │  Cost by model ─────────────────────────────────────────── │
│      │  ┌────────────────────────────────────────────────────────┐ │
│      │  │  (horizontal bar chart: model → cost, sorted by cost)  │ │
│      │  └────────────────────────────────────────────────────────┘ │
│      │                                                              │
│      │  Model breakdown ──────────────────────────────────────────  │
│      │  ┌────────────────────────────────────────────────────────┐ │
│      │  │ Model↕     Sessions↕  Cost↕   Input↕   Output↕  $/tok │ │
│      │  │ sonnet-4-6  98        $31.20  1.4M      620K    $0.022 │ │
│      │  │ opus-4-7    12        $14.10  480K      200K    $0.029 │ │
│      │  │ haiku-4-5   32        $1.93   220K       70K    $0.009 │ │
│      │  └────────────────────────────────────────────────────────┘ │
└──────┴──────────────────────────────────────────────────────────────┘

Annotated fields ​

RegionComponentFieldSourceFormat
KPI row<KpiCard>SessionsRollup across all modelsInteger
KPI row<KpiCard>CostRollup$0.00
KPI row<KpiCard>Input TokensRollup1.2M
KPI row<KpiCard>Output TokensRollup890K
Cost chart<ChartWrapper> + Chart.js horizontal barModel / costGET /costs/by-modely: model name, x: cost $0.00; sorted desc by cost
Breakdown<DataTable>Modelmodel<StatBadge variant="neutral">
Breakdown<DataTable>Sessionssession_countInteger
Breakdown<DataTable>Costtotal_cost_usd$0.00, right-aligned
Breakdown<DataTable>Input Tokenstotal_input_tokens1.4M
Breakdown<DataTable>Output Tokenstotal_output_tokens620K
Breakdown<DataTable>$/1K tokenstotal_cost_usd / (total_tokens / 1000)$0.000

Default sort ​

Cost descending. Identifies the most expensive model at a glance (Goal-Gradient / Serial Position).

Cost chart — horizontal bar ​

Use Chart.js indexAxis: 'y' for horizontal bars. This lets model names read cleanly on the y-axis without rotation.
Color: --color-chart-1 through --color-chart-5 in order of cost rank.

API requirement ​

GET /costs/by-model must return input_tokens, output_tokens, session_count per model — flag for CTO if not present in current backend.


Interaction notes ​

Auto-refresh ​

  • Default: no auto-refresh. Data loads on page load and filter change.
  • Manual refresh: clicking the <RefreshIndicator> dot triggers a refetch of all data on the current page.
  • Stale threshold: if lastFetchedAt is > 5 minutes ago, the dot switches to stale state.
  • v1 scope: no polling, no WebSocket/SSE. This matches the Pi-friendly constraint (no background timers draining resources).
  • Future (v2): optional auto-refresh interval (e.g. every 60s) configured in settings.

Sort and filter pattern ​

  • All filter and sort state lives in the URL query string.
  • No client-side hidden state for filters. Pasting the URL recreates the exact view (deep linkable).
  • Filter changes trigger a new GET request; results replace current data (no merge).
  • Loading state: <LoadingSkeleton> replaces data region while refetching.
  • Debounce: search input waits 400ms (Doherty Threshold) before triggering fetch.

Tooltip trigger ​

  • Charts: hover on data point. Chart.js handles this natively.
  • Truncated table cells: hover triggers a CSS tooltip after 200ms delay. No click-to-reveal.
  • No touch tooltip fallback in v1. Min viewport is 1280px (desktop context).

Breakpoint ​

  • Min supported viewport: 1280px wide.
  • Sidebar collapse breakpoint: 768px (icon-only sidebar).
  • Two-column → single-column breakpoint: 900px (Costs page breakdown tables).
  • No mobile-first design required for v1; cotel is a developer dashboard, used on desktop.
  • Future: responsive table patterns (horizontal scroll wrapper with sticky first column) if mobile access is needed.

Number formatting ​

Value typeFormatExample
Currency$0.000 (3dp for costs < $1), $0.00 (2dp for > $1)$0.024, $47.23
Large integersCompact: K, M (1 decimal)1.4M, 890K, 12K
Duration < 60sX.Xs0.8s, 2.4s
Duration ≥ 60sXm Ys5m 12s, 12m 47s
Percentages0.0% (1dp)1.2%, 2.3%
Relative timedate-fns.formatDistanceToNow2h ago, Yesterday, 3 days ago

API endpoints required ​

Summary of endpoints needed for all 6 pages. Flag gaps to CTO before FLO-34 starts.

EndpointPagesStatus
GET /overviewOverview, ModelsExists (refine: add token rollups)
GET /sessions?page=&limit=&model=&q=&sort=&since=Sessions, OverviewNew
GET /sessions/:idSession DetailNew
GET /sessions/modelsSessions filterNew (distinct model list)
GET /costs/timeseries?since=Overview, CostsNew
GET /costs/by-model?since=Costs, ModelsNew
GET /costs/by-session?since=&limit=CostsNew
GET /tools/stats?since=ToolsNew
GET /tools/timeseries?since=Tools trend chartNew

Released under the MIT License.