Fork Horse repository, listed by its owner. Publisher snapshot.
packages/forkhorse-dashboard/test/usage-fixtures.ts
Snapshot at 34e3175
1import type { StateResponse, UsageSources } from "../src/contracts.ts";
2import { reviewFixtureState, reviewFixtureDetail } from "./review-fixtures.ts";
3
4export const usageScenarios = [
5 "usage-race",
6 "usage-no-review",
7 "usage-over",
8 "usage-unchecked",
9 "usage-both",
10 "usage-legacy",
11 "usage-unbudgeted",
12 "usage-reordered",
13];
14export function usageFixtureState(id = "usage-race", now = Date.now()): StateResponse {
15 const state = reviewFixtureState("review-approved");
16 state.project.id = id;
17 state.ledger = [];
18 const at = (minutes: number) => new Date(now - minutes * 60000).toISOString();
19 const usage = (total: number): UsageSources => ({
20 reported: {
21 inputTokens: total - 20000,
22 outputTokens: 20000,
23 model: "fixture-model",
24 source: "reported",
25 at: at(2),
26 },
27 metered: null,
28 });
29 const baseReview = structuredClone(state.reviews[0]);
30 state.agents = ["fixture-agent", "fixture-peer", "fixture-third"].map((name, i) => ({
31 name,
32 createdAt: at(60 - i),
33 }));
34 state.reviews = state.agents.map((a, i) => ({
35 ...structuredClone(baseReview),
36 agent: a.name,
37 id: `usage-review-${i}`,
38 repoName: `fixture-fork-${i}`,
39 sha: String(i + 1).repeat(40),
40 createdAt: at(10 - i),
41 approvedAt: at(5 - i),
42 usageAtReview: usage([420000, 820000, 1100000][i]),
43 }));
44 state.forks = state.reviews.map((r) => ({
45 agent: r.agent,
46 repoName: r.repoName,
47 head: r.sha,
48 remote: "https://fixture.idiot.tax/repo.git",
49 createdAt: at(50),
50 }));
51 for (const [i, r] of state.reviews.entries()) {
52 if (r.receipt) {
53 r.receipt.startedAt = at(10 - i);
54 r.receipt.finishedAt = at(8 - i);
55 }
56 }
57 for (const r of state.reviews) r.approval = { sha: r.sha, receiptDigest: r.receiptDigest };
58 state.packets[0].mode = "race";
59 state.packets[0].tokenBudget = 1000000;
60 state.races = [
61 {
62 packet: state.packets[0].id,
63 status: "open",
64 finishedAt: null,
65 winner: null,
66 ledgerEntryId: null,
67 tokenBudget: 1000000,
68 entrants: state.reviews.map((r, i) => ({
69 agent: r.agent,
70 repoName: r.repoName,
71 claimedAt: at(30 - i),
72 firstPushAt: at(20 - i),
73 reviewRequestedAt: r.createdAt,
74 receiptPassedAt: at(8 - i),
75 approvedAt: r.approvedAt!,
76 promotedAt: null,
77 place: null,
78 closedAt: null,
79 closedBy: null,
80 usage: structuredClone(r.usageAtReview),
81 budget: (["within", "near", "over"] as const)[i],
82 })),
83 },
84 ];
85 state.claims = state.races[0].entrants.map((e) => ({
86 packet: state.packets[0].id,
87 agent: e.agent,
88 repoName: e.repoName,
89 paths: state.packets[0].paths,
90 createdAt: e.claimedAt,
91 usage: e.usage,
92 }));
93 state.activity = state.races[0].entrants.map((e, i) => ({
94 sequence: i + 1,
95 namespace: "fixture",
96 agent: e.agent,
97 repoName: e.repoName,
98 ref: "refs/heads/main",
99 before: baseReview.base,
100 after: state.reviews[i].sha,
101 changedPaths: ["src/example.ts"],
102 recordedAt: e.firstPushAt!,
103 eventTimestamp: e.firstPushAt!,
104 }));
105 if (id === "usage-no-review") {
106 state.reviews = state.reviews.slice(0, 2);
107 const entrant = state.races[0].entrants[2];
108 entrant.reviewRequestedAt = null;
109 entrant.receiptPassedAt = null;
110 entrant.approvedAt = null;
111 }
112 if (id === "usage-over") {
113 state.reviews = [state.reviews[2]];
114 }
115 if (id === "usage-unchecked") {
116 state.races[0].entrants[0].usage = { reported: null, metered: null };
117 state.races[0].entrants[0].budget = "unchecked";
118 state.claims[0].usage = state.races[0].entrants[0].usage;
119 state.reviews[0].usageAtReview = state.races[0].entrants[0].usage;
120 }
121 if (id === "usage-both") {
122 for (const e of state.races[0].entrants)
123 e.usage!.metered = { inputTokens: 240000, outputTokens: 10000, source: "metered", at: at(1) };
124 for (const r of state.reviews)
125 r.usageAtReview = structuredClone(
126 state.races[0].entrants.find((e) => e.agent === r.agent)!.usage,
127 );
128 for (const e of state.races[0].entrants) e.budget = "within";
129 }
130 if (id === "usage-unbudgeted") {
131 state.races[0].tokenBudget = null;
132 state.packets[0].tokenBudget = null;
133 for (const entrant of state.races[0].entrants) {
134 entrant.usage = { reported: null, metered: null };
135 entrant.budget = "unchecked";
136 }
137 for (const claim of state.claims) claim.usage = { reported: null, metered: null };
138 for (const review of state.reviews) review.usageAtReview = { reported: null, metered: null };
139 }
140 if (id === "usage-reordered") state.races[0].entrants.reverse();
141 if (id === "usage-legacy") {
142 for (const r of state.reviews) delete r.usageAtReview;
143 for (const c of state.claims) delete c.usage;
144 for (const e of state.races[0].entrants) {
145 delete e.usage;
146 delete e.budget;
147 }
148 delete state.races[0].tokenBudget;
149 delete state.packets[0].tokenBudget;
150 }
151 return state;
152}
153export function usageFixtureDetail(state: StateResponse, id: string) {
154 const review = state.reviews.find((r) => r.id === id)!;
155 const detail = reviewFixtureDetail({ ...state, reviews: [review] });
156 detail.changes.fileCount = detail.changes.files.length;
157 return detail;
158}
159