| 149 | // ── Query: Raw Events ──────────────────────────────────────────────── |
| 150 | |
| 151 | export function getEvents(opts?: { |
| 152 | limit?: number |
| 153 | offset?: number |
| 154 | since?: number // unix ms timestamp |
| 155 | mode?: 'standard' | 'ultraplinian' |
| 156 | }): { events: MetadataEvent[]; total: number } { |
| 157 | let filtered = events |
| 158 | |
| 159 | if (opts?.since) { |
| 160 | filtered = filtered.filter(e => e.timestamp >= opts.since!) |
| 161 | } |
| 162 | if (opts?.mode) { |
| 163 | filtered = filtered.filter(e => e.mode === opts.mode) |
| 164 | } |
| 165 | |
| 166 | const total = filtered.length |
| 167 | const offset = opts?.offset ?? 0 |
| 168 | const limit = opts?.limit ?? 100 |
| 169 | |
| 170 | return { |
| 171 | events: filtered.slice(offset, offset + limit), |
| 172 | total, |
| 173 | } |
| 174 | } |
| 175 | |
| 176 | // ── Query: Aggregated Stats ────────────────────────────────────────── |
| 177 | |