|
| 1 | +import type { GovernanceItem, GovernancePool } from "$lib/api/types"; |
| 2 | + |
| 3 | +export interface DailyCost { |
| 4 | + day: string; |
| 5 | + spend: number; |
| 6 | + prior: number; |
| 7 | + forecast?: number; |
| 8 | +} |
| 9 | +export interface CostBreakdown { |
| 10 | + id: string; |
| 11 | + label: string; |
| 12 | + spend: number | null; |
| 13 | + share: number; |
| 14 | + rate?: string; |
| 15 | + unpricedTokens?: number; |
| 16 | +} |
| 17 | +export interface AgentCost { |
| 18 | + handle: string; |
| 19 | + host: string; |
| 20 | + spend: number; |
| 21 | + tokens: string; |
| 22 | + mix: { label: string; share: number }[]; |
| 23 | + spark: number[]; |
| 24 | + governance: GovernanceItem; |
| 25 | +} |
| 26 | +export interface CostSession { |
| 27 | + id: string; |
| 28 | + started: string; |
| 29 | + agent: string; |
| 30 | + model: string; |
| 31 | + taskId?: number; |
| 32 | + tokens: string; |
| 33 | + spend: number; |
| 34 | + math: { kind: string; tokens: number; rate: number; dollars: number }[]; |
| 35 | + source: "computed" | "reported" | "mixed"; |
| 36 | +} |
| 37 | +export interface PriceRow { |
| 38 | + model: string; |
| 39 | + input: number; |
| 40 | + output: number; |
| 41 | + write: number | null; |
| 42 | + read: number; |
| 43 | + unpricedTokens?: number; |
| 44 | +} |
| 45 | + |
| 46 | +const expires = (hours: number) => Math.floor(Date.now() / 1000) + hours * 3600; |
| 47 | +export const mockGovernance: GovernanceItem[] = [ |
| 48 | + { |
| 49 | + agent: "carson-2", |
| 50 | + light: "yellow", |
| 51 | + tokens_spent: 640_000, |
| 52 | + granted_tokens: 800_000, |
| 53 | + grant_expires_epoch: expires(22), |
| 54 | + tier: "opus", |
| 55 | + rate_limit_hits: 0, |
| 56 | + }, |
| 57 | + { |
| 58 | + agent: "janet", |
| 59 | + light: "green", |
| 60 | + tokens_spent: 210_000, |
| 61 | + granted_tokens: 400_000, |
| 62 | + grant_expires_epoch: expires(72), |
| 63 | + tier: "opus", |
| 64 | + rate_limit_hits: 0, |
| 65 | + }, |
| 66 | + { |
| 67 | + agent: "point-fable", |
| 68 | + light: "yellow", |
| 69 | + tokens_spent: 285_000, |
| 70 | + granted_tokens: 400_000, |
| 71 | + grant_expires_epoch: expires(41), |
| 72 | + tier: "opus", |
| 73 | + rate_limit_hits: 0, |
| 74 | + }, |
| 75 | + { |
| 76 | + agent: "scout", |
| 77 | + light: "green", |
| 78 | + tokens_spent: 88_000, |
| 79 | + granted_tokens: 200_000, |
| 80 | + grant_expires_epoch: expires(72), |
| 81 | + tier: "sonnet", |
| 82 | + rate_limit_hits: 0, |
| 83 | + }, |
| 84 | + { |
| 85 | + agent: "derek", |
| 86 | + light: "green", |
| 87 | + tokens_spent: 27_000, |
| 88 | + granted_tokens: 200_000, |
| 89 | + grant_expires_epoch: expires(120), |
| 90 | + tier: "haiku", |
| 91 | + rate_limit_hits: 0, |
| 92 | + }, |
| 93 | + { |
| 94 | + agent: "codex", |
| 95 | + light: "yellow", |
| 96 | + tokens_spent: 170_000, |
| 97 | + granted_tokens: 200_000, |
| 98 | + grant_expires_epoch: expires(48), |
| 99 | + tier: "opus", |
| 100 | + rate_limit_hits: 0, |
| 101 | + }, |
| 102 | +]; |
| 103 | +export const mockPool: GovernancePool = { |
| 104 | + pool_tokens: 2_200_000, |
| 105 | + pool_spent: 1_420_000, |
| 106 | + fleet_mode: "parallel", |
| 107 | + cascade_active: false, |
| 108 | +}; |
| 109 | +export const daily: DailyCost[] = [ |
| 110 | + { day: "Mon 6", spend: 5.7, prior: 5.1 }, |
| 111 | + { day: "Tue 7", spend: 9.84, prior: 5.5 }, |
| 112 | + { day: "Wed 8", spend: 7.1, prior: 5.8 }, |
| 113 | + { day: "Thu 9", spend: 6.6, prior: 6.4 }, |
| 114 | + { day: "Fri 10", spend: 7.8, prior: 6.1 }, |
| 115 | + { day: "Sat 11", spend: 4.16, prior: 5.7 }, |
| 116 | + { day: "Sun 12", spend: 0, prior: 5.2, forecast: 5.9 }, |
| 117 | +]; |
| 118 | +export const breakdowns: Record<"agent" | "model" | "project", CostBreakdown[]> = { |
| 119 | + agent: [ |
| 120 | + { id: "carson-2", label: "carson-2", spend: 14.02, share: 34 }, |
| 121 | + { id: "janet", label: "janet", spend: 9.77, share: 24 }, |
| 122 | + { id: "point-fable", label: "point-fable", spend: 8.91, share: 22 }, |
| 123 | + { id: "codex", label: "codex", spend: 4.1, share: 10 }, |
| 124 | + { id: "other", label: "2 more · $4.40", spend: 4.4, share: 10 }, |
| 125 | + ], |
| 126 | + model: [ |
| 127 | + { id: "opus", label: "claude-opus-4-8", spend: 27.3, share: 66, rate: "5.00 · 25.00 /Mtok" }, |
| 128 | + { id: "fable", label: "claude-fable-5", spend: 7.6, share: 18, rate: "10.00 · 50.00 /Mtok" }, |
| 129 | + { id: "gpt", label: "gpt-5.5", spend: 2.6, share: 6, rate: "5.00 · 20.00 /Mtok" }, |
| 130 | + { id: "haiku", label: "claude-haiku-4-5", spend: 2.1, share: 5, rate: "1.00 · 5.00 /Mtok" }, |
| 131 | + { id: "sonnet", label: "claude-sonnet-5", spend: 1.6, share: 4, rate: "2.00 · 10.00 /Mtok" }, |
| 132 | + ], |
| 133 | + project: [ |
| 134 | + { id: "console", label: "Lab Console", spend: 19.8, share: 48 }, |
| 135 | + { id: "library", label: "Library backfill", spend: 12.3, share: 30 }, |
| 136 | + { id: "infra", label: "Neighborhood infra", spend: 6.1, share: 15 }, |
| 137 | + { id: "other", label: "3 more · $3.00", spend: 3, share: 7 }, |
| 138 | + ], |
| 139 | +}; |
| 140 | +export const agents: AgentCost[] = [ |
| 141 | + { |
| 142 | + handle: "carson-2", |
| 143 | + host: ".14 · builder", |
| 144 | + spend: 14.02, |
| 145 | + tokens: "in 0.42M · out 0.24M · cache 6.1M", |
| 146 | + mix: [ |
| 147 | + { label: "opus-4-8", share: 79 }, |
| 148 | + { label: "fable-5", share: 13 }, |
| 149 | + { label: "other", share: 8 }, |
| 150 | + ], |
| 151 | + spark: [4, 13, 6, 5, 8, 4, 4], |
| 152 | + governance: mockGovernance[0]!, |
| 153 | + }, |
| 154 | + { |
| 155 | + handle: "janet", |
| 156 | + host: ".202 · helm", |
| 157 | + spend: 9.77, |
| 158 | + tokens: "in 0.31M · out 0.17M · cache 4.8M", |
| 159 | + mix: [ |
| 160 | + { label: "opus-4-8", share: 88 }, |
| 161 | + { label: "sonnet-5", share: 9 }, |
| 162 | + { label: "other", share: 3 }, |
| 163 | + ], |
| 164 | + spark: [5, 6, 7, 6, 9, 7, 8], |
| 165 | + governance: mockGovernance[1]!, |
| 166 | + }, |
| 167 | + { |
| 168 | + handle: "point-fable", |
| 169 | + host: ".14 · builder", |
| 170 | + spend: 8.91, |
| 171 | + tokens: "in 0.26M · out 0.14M · cache 3.9M", |
| 172 | + mix: [ |
| 173 | + { label: "fable-5", share: 64 }, |
| 174 | + { label: "opus-4-8", share: 29 }, |
| 175 | + { label: "other", share: 7 }, |
| 176 | + ], |
| 177 | + spark: [3, 5, 4, 10, 7, 9, 7], |
| 178 | + governance: mockGovernance[2]!, |
| 179 | + }, |
| 180 | +]; |
| 181 | +export const sessions: CostSession[] = [ |
| 182 | + { |
| 183 | + id: "a1f4c2e8", |
| 184 | + started: "Tue 14:02", |
| 185 | + agent: "carson-2", |
| 186 | + model: "claude-opus-4-8", |
| 187 | + taskId: 512, |
| 188 | + tokens: "in 240k · out 140k · cache 2.8M", |
| 189 | + spend: 7.1, |
| 190 | + source: "computed", |
| 191 | + math: [ |
| 192 | + { kind: "input", tokens: 240000, rate: 5, dollars: 1.2 }, |
| 193 | + { kind: "output", tokens: 140000, rate: 25, dollars: 3.5 }, |
| 194 | + { kind: "cache write", tokens: 160000, rate: 6.25, dollars: 1 }, |
| 195 | + { kind: "cache read", tokens: 2800000, rate: 0.5, dollars: 1.4 }, |
| 196 | + ], |
| 197 | + }, |
| 198 | + { |
| 199 | + id: "b209d", |
| 200 | + started: "Sat 20:14", |
| 201 | + agent: "janet", |
| 202 | + model: "claude-opus-4-8", |
| 203 | + taskId: 718, |
| 204 | + tokens: "in 96k · out 41k · cache 1.2M", |
| 205 | + spend: 3.84, |
| 206 | + source: "mixed", |
| 207 | + math: [], |
| 208 | + }, |
| 209 | + { |
| 210 | + id: "c331e", |
| 211 | + started: "Thu 09:32", |
| 212 | + agent: "point-fable", |
| 213 | + model: "mixed · 3", |
| 214 | + taskId: 701, |
| 215 | + tokens: "in 84k · out 52k · cache 990k", |
| 216 | + spend: 2.92, |
| 217 | + source: "computed", |
| 218 | + math: [], |
| 219 | + }, |
| 220 | + { |
| 221 | + id: "d402f", |
| 222 | + started: "Fri 16:08", |
| 223 | + agent: "codex", |
| 224 | + model: "gpt-5.5", |
| 225 | + tokens: "in 150k · out 55k · cache 1.0M", |
| 226 | + spend: 2.35, |
| 227 | + source: "reported", |
| 228 | + math: [], |
| 229 | + }, |
| 230 | + { |
| 231 | + id: "e592a", |
| 232 | + started: "Fri 11:20", |
| 233 | + agent: "carson-2", |
| 234 | + model: "claude-fable-5", |
| 235 | + taskId: 512, |
| 236 | + tokens: "in 30k · out 18k · cache 550k", |
| 237 | + spend: 1.75, |
| 238 | + source: "computed", |
| 239 | + math: [], |
| 240 | + }, |
| 241 | +]; |
| 242 | +export const prices: PriceRow[] = [ |
| 243 | + { model: "claude-opus-4-8", input: 5, output: 25, write: 6.25, read: 0.5 }, |
| 244 | + { model: "claude-fable-5", input: 10, output: 50, write: 12.5, read: 1 }, |
| 245 | + { model: "claude-sonnet-5", input: 2, output: 10, write: 2.5, read: 0.2 }, |
| 246 | + { model: "claude-haiku-4-5", input: 1, output: 5, write: 1.25, read: 0.1 }, |
| 247 | + { model: "gpt-5.5", input: 5, output: 20, write: null, read: 0.5 }, |
| 248 | +]; |
0 commit comments