@castlemilk/omega 0.6.12 → 0.6.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +241 -1228
- package/dist/server/dist/app.d.ts.map +1 -1
- package/dist/server/dist/app.js +2 -0
- package/dist/server/dist/app.js.map +1 -1
- package/dist/server/dist/lib/run-task.js +2 -2
- package/dist/server/dist/lib/run-task.js.map +1 -1
- package/dist/server/dist/routes/metrics.d.ts.map +1 -1
- package/dist/server/dist/routes/metrics.js +2 -76
- package/dist/server/dist/routes/metrics.js.map +1 -1
- package/dist/server/dist/routes/reports.d.ts +3 -0
- package/dist/server/dist/routes/reports.d.ts.map +1 -0
- package/dist/server/dist/routes/reports.js +44 -0
- package/dist/server/dist/routes/reports.js.map +1 -0
- package/dist/server/dist/routes/tasks.js.map +1 -1
- package/dist/server/node_modules/.package-lock.json +3 -3
- package/dist/server/node_modules/@grpc/proto-loader/build/bin/proto-loader-gen-types.js +0 -0
- package/dist/server/node_modules/@omega/agent/dist/executor.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/executor.js +5 -40
- package/dist/server/node_modules/@omega/agent/dist/executor.js.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/index.d.ts +1 -1
- package/dist/server/node_modules/@omega/agent/dist/index.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/index.js +1 -1
- package/dist/server/node_modules/@omega/agent/dist/index.js.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/planner.d.ts +0 -5
- package/dist/server/node_modules/@omega/agent/dist/planner.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/planner.js +3 -21
- package/dist/server/node_modules/@omega/agent/dist/planner.js.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/prompt-versioning.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/prompt-versioning.js +2 -2
- package/dist/server/node_modules/@omega/agent/dist/prompt-versioning.js.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/prompts.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/agent/dist/prompts.js +31 -6
- package/dist/server/node_modules/@omega/agent/dist/prompts.js.map +1 -1
- package/dist/server/node_modules/@omega/agent/package.json +0 -4
- package/dist/server/node_modules/@omega/core/dist/provider.d.ts +2 -12
- package/dist/server/node_modules/@omega/core/dist/provider.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/db/generated/client/edge.js +3 -6
- package/dist/server/node_modules/@omega/db/generated/client/index-browser.js +0 -3
- package/dist/server/node_modules/@omega/db/generated/client/index.d.ts +0 -223
- package/dist/server/node_modules/@omega/db/generated/client/index.js +3 -6
- package/dist/server/node_modules/@omega/db/generated/client/libquery_engine-darwin-arm64.dylib.node +0 -0
- package/dist/server/node_modules/@omega/db/generated/client/package.json +1 -1
- package/dist/server/node_modules/@omega/db/generated/client/schema.prisma +0 -3
- package/dist/server/node_modules/@omega/db/generated/client/wasm.js +3 -6
- package/dist/server/node_modules/@omega/providers/dist/anthropic.d.ts +2 -2
- package/dist/server/node_modules/@omega/providers/dist/anthropic.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/anthropic.js +1 -16
- package/dist/server/node_modules/@omega/providers/dist/anthropic.js.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/gemini.d.ts +2 -2
- package/dist/server/node_modules/@omega/providers/dist/gemini.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/gemini.js +1 -14
- package/dist/server/node_modules/@omega/providers/dist/gemini.js.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/kimi.d.ts +3 -3
- package/dist/server/node_modules/@omega/providers/dist/kimi.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/ollama.d.ts +2 -2
- package/dist/server/node_modules/@omega/providers/dist/ollama.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/ollama.js +1 -13
- package/dist/server/node_modules/@omega/providers/dist/ollama.js.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/openai.d.ts +3 -3
- package/dist/server/node_modules/@omega/providers/dist/openai.d.ts.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/openai.js +3 -24
- package/dist/server/node_modules/@omega/providers/dist/openai.js.map +1 -1
- package/dist/server/node_modules/@omega/providers/dist/providers.test.js +9 -13
- package/dist/server/node_modules/@omega/providers/dist/providers.test.js.map +1 -1
- package/dist/server/node_modules/mime/cli.js +0 -0
- package/dist/server/node_modules/mime/src/build.js +0 -0
- package/dist/server/node_modules/protobufjs/dist/light/protobuf.js +2 -2
- package/dist/server/node_modules/protobufjs/dist/light/protobuf.min.js +2 -2
- package/dist/server/node_modules/protobufjs/dist/minimal/protobuf.js +2 -2
- package/dist/server/node_modules/protobufjs/dist/minimal/protobuf.min.js +2 -2
- package/dist/server/node_modules/protobufjs/dist/protobuf.js +5 -2
- package/dist/server/node_modules/protobufjs/dist/protobuf.js.map +1 -1
- package/dist/server/node_modules/protobufjs/dist/protobuf.min.js +3 -3
- package/dist/server/node_modules/protobufjs/dist/protobuf.min.js.map +1 -1
- package/dist/server/node_modules/protobufjs/package.json +1 -1
- package/dist/server/node_modules/protobufjs/src/parse.js +3 -0
- package/dist/server/node_modules/wrap-ansi/index.js +0 -0
- package/dist/server/pglite-data/base/5/1247 +0 -0
- package/dist/server/pglite-data/base/5/1249 +0 -0
- package/dist/server/pglite-data/base/5/1249_fsm +0 -0
- package/dist/server/pglite-data/base/5/1259 +0 -0
- package/dist/server/pglite-data/base/5/1259_fsm +0 -0
- package/dist/server/pglite-data/base/5/16384 +0 -0
- package/dist/server/pglite-data/base/5/16392 +0 -0
- package/dist/server/pglite-data/base/5/16394 +0 -0
- package/dist/server/pglite-data/base/5/16404 +0 -0
- package/dist/server/pglite-data/base/5/16406 +0 -0
- package/dist/server/pglite-data/base/5/16421 +0 -0
- package/dist/server/pglite-data/base/5/16423 +0 -0
- package/dist/server/pglite-data/base/5/16437 +0 -0
- package/dist/server/pglite-data/base/5/16439 +0 -0
- package/dist/server/pglite-data/base/5/16449 +0 -0
- package/dist/server/pglite-data/base/5/16451 +0 -0
- package/dist/server/pglite-data/base/5/16462 +0 -0
- package/dist/server/pglite-data/base/5/16464 +0 -0
- package/dist/server/pglite-data/base/5/16478 +0 -0
- package/dist/server/pglite-data/base/5/16480 +0 -0
- package/dist/server/pglite-data/base/5/16494 +0 -0
- package/dist/server/pglite-data/base/5/16510 +0 -0
- package/dist/server/pglite-data/base/5/16511 +0 -0
- package/dist/server/pglite-data/base/5/16512 +0 -0
- package/dist/server/pglite-data/base/5/16513 +0 -0
- package/dist/server/pglite-data/base/5/16514 +0 -0
- package/dist/server/pglite-data/base/5/16515 +0 -0
- package/dist/server/pglite-data/base/5/{24588 → 16554} +0 -0
- package/dist/server/pglite-data/base/5/{32780 → 16555} +0 -0
- package/dist/server/pglite-data/base/5/{32781 → 16557} +0 -0
- package/dist/server/pglite-data/base/5/{32783 → 16558} +0 -0
- package/dist/server/pglite-data/base/5/16575 +0 -0
- package/dist/server/pglite-data/base/5/16576 +0 -0
- package/dist/server/pglite-data/base/5/16577 +0 -0
- package/dist/server/pglite-data/base/5/16579 +0 -0
- package/dist/server/pglite-data/base/5/2579 +0 -0
- package/dist/server/pglite-data/base/5/2604 +0 -0
- package/dist/server/pglite-data/base/5/2606 +0 -0
- package/dist/server/pglite-data/base/5/2608 +0 -0
- package/dist/server/pglite-data/base/5/2608_fsm +0 -0
- package/dist/server/pglite-data/base/5/2610 +0 -0
- package/dist/server/pglite-data/base/5/2620 +0 -0
- package/dist/server/pglite-data/base/5/2656 +0 -0
- package/dist/server/pglite-data/base/5/2657 +0 -0
- package/dist/server/pglite-data/base/5/2658 +0 -0
- package/dist/server/pglite-data/base/5/2659 +0 -0
- package/dist/server/pglite-data/base/5/2662 +0 -0
- package/dist/server/pglite-data/base/5/2663 +0 -0
- package/dist/server/pglite-data/base/5/2664 +0 -0
- package/dist/server/pglite-data/base/5/2665 +0 -0
- package/dist/server/pglite-data/base/5/2666 +0 -0
- package/dist/server/pglite-data/base/5/2667 +0 -0
- package/dist/server/pglite-data/base/5/2673 +0 -0
- package/dist/server/pglite-data/base/5/2674 +0 -0
- package/dist/server/pglite-data/base/5/2678 +0 -0
- package/dist/server/pglite-data/base/5/2679 +0 -0
- package/dist/server/pglite-data/base/5/2699 +0 -0
- package/dist/server/pglite-data/base/5/2701 +0 -0
- package/dist/server/pglite-data/base/5/2702 +0 -0
- package/dist/server/pglite-data/base/5/2703 +0 -0
- package/dist/server/pglite-data/base/5/2704 +0 -0
- package/dist/server/pglite-data/base/5/3455 +0 -0
- package/dist/server/pglite-data/base/5/pg_internal.init +0 -0
- package/dist/server/pglite-data/global/pg_control +0 -0
- package/dist/server/pglite-data/global/pg_internal.init +0 -0
- package/dist/server/pglite-data/pg_wal/000000010000000000000001 +0 -0
- package/dist/server/pglite-data/pg_xact/0000 +0 -0
- package/dist/server/pglite-data/postmaster.pid +2 -2
- package/dist/server/src/app.ts +2 -0
- package/dist/server/src/lib/run-task.ts +2 -2
- package/dist/server/src/routes/metrics.ts +2 -81
- package/dist/server/src/routes/reports.ts +54 -0
- package/dist/server/src/routes/tasks.ts +2 -2
- package/dist/web/dist/assets/index-Ce9D9lg5.css +1 -0
- package/dist/web/dist/assets/index-D-wO1mM7.js +40 -0
- package/dist/web/dist/index.html +2 -2
- package/package.json +13 -14
- package/dist/server/pglite-data/base/5/16406_fsm +0 -0
- package/dist/server/pglite-data/base/5/16439_fsm +0 -0
- package/dist/server/pglite-data/base/5/24576 +0 -0
- package/dist/server/pglite-data/base/5/24576_fsm +0 -0
- package/dist/server/pglite-data/base/5/24589 +0 -0
- package/dist/server/pglite-data/base/5/24591 +0 -0
- package/dist/server/pglite-data/base/5/24592 +0 -0
- /package/dist/server/pglite-data/base/5/{24587 → 16542} +0 -0
- /package/dist/server/pglite-data/base/5/{32768 → 16553} +0 -0
- /package/dist/server/pglite-data/base/5/{32779 → 16564} +0 -0
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/server/src/app.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { providerRoutes } from './routes/providers.js';
|
|
|
7
7
|
import { routerRoutes } from './routes/router.js';
|
|
8
8
|
import { metricsRoutes } from './routes/metrics.js';
|
|
9
9
|
import { promptVersionRoutes } from './routes/prompt-versions.js';
|
|
10
|
+
import { reportRoutes } from './routes/reports.js';
|
|
10
11
|
|
|
11
12
|
export const app: express.Express = express();
|
|
12
13
|
|
|
@@ -19,6 +20,7 @@ app.use('/providers', providerRoutes(prisma));
|
|
|
19
20
|
app.use('/router', routerRoutes(prisma));
|
|
20
21
|
app.use('/metrics', metricsRoutes(prisma));
|
|
21
22
|
app.use('/prompt-versions', promptVersionRoutes(prisma));
|
|
23
|
+
app.use('/reports', reportRoutes());
|
|
22
24
|
|
|
23
25
|
app.use((err: unknown, _req: express.Request, res: express.Response, _next: express.NextFunction) => {
|
|
24
26
|
console.error(err);
|
|
@@ -80,12 +80,12 @@ export async function runTask(prisma: PrismaClient, taskId: string) {
|
|
|
80
80
|
const prompt = [task.title, task.description].filter(Boolean).join('\n\n');
|
|
81
81
|
|
|
82
82
|
try {
|
|
83
|
-
const
|
|
83
|
+
const result = await provider.send(prompt, { model: modelName });
|
|
84
84
|
const updated = await prisma.task.update({
|
|
85
85
|
where: { id: taskId },
|
|
86
86
|
data: {
|
|
87
87
|
status: 'done',
|
|
88
|
-
result
|
|
88
|
+
result,
|
|
89
89
|
provider: providerName,
|
|
90
90
|
model: modelName,
|
|
91
91
|
error: null,
|
|
@@ -9,27 +9,6 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
9
9
|
const root = path.resolve(__filename, '..', '..', '..', '..');
|
|
10
10
|
const reportsDir = path.join(root, '.omega', 'reports');
|
|
11
11
|
|
|
12
|
-
async function listReports(pattern: RegExp): Promise<{ file: string; modifiedAt: string }[]> {
|
|
13
|
-
try {
|
|
14
|
-
const files = await fs.readdir(reportsDir);
|
|
15
|
-
const matches = files.filter((f) => pattern.test(f)).sort().reverse();
|
|
16
|
-
const results: { file: string; modifiedAt: string }[] = [];
|
|
17
|
-
for (const file of matches) {
|
|
18
|
-
const stat = await fs.stat(path.join(reportsDir, file));
|
|
19
|
-
results.push({ file, modifiedAt: stat.mtime.toISOString() });
|
|
20
|
-
}
|
|
21
|
-
return results;
|
|
22
|
-
} catch {
|
|
23
|
-
return [];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
async function readReport(file: string): Promise<unknown> {
|
|
28
|
-
const raw = await fs.readFile(path.join(reportsDir, file), 'utf-8');
|
|
29
|
-
if (file.endsWith('.json')) return JSON.parse(raw) as unknown;
|
|
30
|
-
return raw;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
12
|
async function latestReport(pattern: RegExp): Promise<{ file: string; data: unknown } | undefined> {
|
|
34
13
|
try {
|
|
35
14
|
const files = await fs.readdir(reportsDir);
|
|
@@ -39,7 +18,8 @@ async function latestReport(pattern: RegExp): Promise<{ file: string; data: unkn
|
|
|
39
18
|
.reverse();
|
|
40
19
|
const latest = matches[0];
|
|
41
20
|
if (!latest) return undefined;
|
|
42
|
-
const
|
|
21
|
+
const raw = await fs.readFile(path.join(reportsDir, latest), 'utf-8');
|
|
22
|
+
const data = latest.endsWith('.json') ? (JSON.parse(raw) as unknown) : raw;
|
|
43
23
|
return { file: latest, data };
|
|
44
24
|
} catch {
|
|
45
25
|
return undefined;
|
|
@@ -98,8 +78,6 @@ export function metricsRoutes(prisma: PrismaClient): Router {
|
|
|
98
78
|
)
|
|
99
79
|
: 0;
|
|
100
80
|
|
|
101
|
-
const totalTokens = agentRuns.reduce((sum, r) => sum + (r.totalTokens ?? 0), 0);
|
|
102
|
-
|
|
103
81
|
const recentRuns = agentRuns.map((r) => ({
|
|
104
82
|
id: r.id,
|
|
105
83
|
taskId: r.taskId,
|
|
@@ -110,15 +88,11 @@ export function metricsRoutes(prisma: PrismaClient): Router {
|
|
|
110
88
|
validationSummary: r.validationSummary,
|
|
111
89
|
publishedVersion: r.publishedVersion,
|
|
112
90
|
durationMs: durationMs(r.createdAt, r.updatedAt),
|
|
113
|
-
promptTokens: r.promptTokens,
|
|
114
|
-
completionTokens: r.completionTokens,
|
|
115
|
-
totalTokens: r.totalTokens,
|
|
116
91
|
createdAt: r.createdAt,
|
|
117
92
|
}));
|
|
118
93
|
|
|
119
94
|
const e2eReport = await latestReport(/^e2e-raw-/);
|
|
120
95
|
const benchmarkReport = await latestReport(/^benchmark-/);
|
|
121
|
-
const abReport = await latestReport(/^ab-/);
|
|
122
96
|
|
|
123
97
|
res.json({
|
|
124
98
|
taskCounts,
|
|
@@ -126,66 +100,13 @@ export function metricsRoutes(prisma: PrismaClient): Router {
|
|
|
126
100
|
providerUsage,
|
|
127
101
|
modelUsage,
|
|
128
102
|
avgDurationMs,
|
|
129
|
-
totalTokens,
|
|
130
103
|
recentRuns,
|
|
131
104
|
latestReports: {
|
|
132
105
|
e2e: e2eReport,
|
|
133
106
|
benchmark: benchmarkReport,
|
|
134
|
-
ab: abReport,
|
|
135
107
|
},
|
|
136
108
|
});
|
|
137
109
|
}));
|
|
138
110
|
|
|
139
|
-
r.get('/reports', asyncHandler(async (_req, res) => {
|
|
140
|
-
const e2e = await listReports(/^e2e-raw-/);
|
|
141
|
-
const benchmark = await listReports(/^benchmark-/);
|
|
142
|
-
res.json({ e2e, benchmark });
|
|
143
|
-
}));
|
|
144
|
-
|
|
145
|
-
r.get('/reports/benchmark', asyncHandler(async (_req, res) => {
|
|
146
|
-
const reports = await listReports(/^benchmark-/);
|
|
147
|
-
res.json(reports);
|
|
148
|
-
}));
|
|
149
|
-
|
|
150
|
-
r.get('/reports/benchmark/:file', asyncHandler(async (req, res) => {
|
|
151
|
-
const file = path.basename(req.params.file);
|
|
152
|
-
if (!file.startsWith('benchmark-')) {
|
|
153
|
-
res.status(400).json({ error: 'Invalid benchmark report filename' });
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
try {
|
|
157
|
-
const data = await readReport(file);
|
|
158
|
-
res.json(data);
|
|
159
|
-
} catch {
|
|
160
|
-
res.status(404).json({ error: 'Report not found' });
|
|
161
|
-
}
|
|
162
|
-
}));
|
|
163
|
-
|
|
164
|
-
r.get('/reports/ab', asyncHandler(async (_req, res) => {
|
|
165
|
-
const reports = await listReports(/^ab-/);
|
|
166
|
-
res.json(reports);
|
|
167
|
-
}));
|
|
168
|
-
|
|
169
|
-
r.get('/reports/ab/:file', asyncHandler(async (req, res) => {
|
|
170
|
-
const file = path.basename(req.params.file);
|
|
171
|
-
if (!file.startsWith('ab-')) {
|
|
172
|
-
res.status(400).json({ error: 'Invalid A/B report filename' });
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
try {
|
|
176
|
-
const data = await readReport(file);
|
|
177
|
-
res.json(data);
|
|
178
|
-
} catch {
|
|
179
|
-
res.status(404).json({ error: 'Report not found' });
|
|
180
|
-
}
|
|
181
|
-
}));
|
|
182
|
-
|
|
183
|
-
r.get('/reports/latest', asyncHandler(async (_req, res) => {
|
|
184
|
-
const e2eReport = await latestReport(/^e2e-raw-/);
|
|
185
|
-
const benchmarkReport = await latestReport(/^benchmark-/);
|
|
186
|
-
const abReport = await latestReport(/^ab-/);
|
|
187
|
-
res.json({ e2e: e2eReport, benchmark: benchmarkReport, ab: abReport });
|
|
188
|
-
}));
|
|
189
|
-
|
|
190
111
|
return r;
|
|
191
112
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Router } from 'express';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { asyncHandler } from '../lib/async-handler.js';
|
|
5
|
+
|
|
6
|
+
const REPORTS_DIR = path.resolve('.omega/reports');
|
|
7
|
+
|
|
8
|
+
interface ReportRef {
|
|
9
|
+
file: string;
|
|
10
|
+
type: 'benchmark' | 'ab';
|
|
11
|
+
createdAt: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function listReports(): Promise<ReportRef[]> {
|
|
15
|
+
const entries = await fs.readdir(REPORTS_DIR).catch(() => []);
|
|
16
|
+
const files = entries.filter((f) => f.endsWith('.json'));
|
|
17
|
+
const refs: ReportRef[] = [];
|
|
18
|
+
for (const file of files) {
|
|
19
|
+
const type = file.startsWith('ab-') ? 'ab' : file.startsWith('benchmark-') ? 'benchmark' : undefined;
|
|
20
|
+
if (!type) continue;
|
|
21
|
+
const stat = await fs.stat(path.join(REPORTS_DIR, file)).catch(() => undefined);
|
|
22
|
+
refs.push({ file, type, createdAt: stat?.mtime.toISOString() ?? new Date().toISOString() });
|
|
23
|
+
}
|
|
24
|
+
return refs.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function reportRoutes(): Router {
|
|
28
|
+
const r = Router();
|
|
29
|
+
|
|
30
|
+
r.get('/', asyncHandler(async (_req, res) => {
|
|
31
|
+
const refs = await listReports();
|
|
32
|
+
res.json({
|
|
33
|
+
benchmark: refs.filter((r) => r.type === 'benchmark'),
|
|
34
|
+
ab: refs.filter((r) => r.type === 'ab'),
|
|
35
|
+
});
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
r.get('/:file', asyncHandler(async (req, res) => {
|
|
39
|
+
const file = path.basename(req.params.file);
|
|
40
|
+
const filePath = path.join(REPORTS_DIR, file);
|
|
41
|
+
if (!filePath.startsWith(REPORTS_DIR)) {
|
|
42
|
+
res.status(400).json({ error: 'Invalid report file' });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const raw = await fs.readFile(filePath, 'utf-8').catch(() => null);
|
|
46
|
+
if (!raw) {
|
|
47
|
+
res.status(404).json({ error: 'Report not found' });
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
res.json(JSON.parse(raw));
|
|
51
|
+
}));
|
|
52
|
+
|
|
53
|
+
return r;
|
|
54
|
+
}
|
|
@@ -135,8 +135,8 @@ export function taskRoutes(prisma: PrismaClient): Router {
|
|
|
135
135
|
const children = byParent[key] ?? [];
|
|
136
136
|
return children.map((s) => ({
|
|
137
137
|
...s,
|
|
138
|
-
attributes: s.attributes ?
|
|
139
|
-
events: s.events ?
|
|
138
|
+
attributes: s.attributes ? JSON.parse(s.attributes) : undefined,
|
|
139
|
+
events: s.events ? JSON.parse(s.events) : undefined,
|
|
140
140
|
children: buildTree(s.spanId),
|
|
141
141
|
}));
|
|
142
142
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.invisible{visibility:hidden}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.flex{display:flex}.grid{display:grid}.h-full{height:100%}.h-screen{height:100vh}.max-h-20{max-height:5rem}.max-h-24{max-height:6rem}.max-h-32{max-height:8rem}.max-h-64{max-height:16rem}.w-32{width:8rem}.w-4{width:1rem}.w-72{width:18rem}.w-80{width:20rem}.w-full{width:100%}.w-screen{width:100vw}.min-w-\[200px\]{min-width:200px}.min-w-\[800px\]{min-width:800px}.max-w-\[180px\]{max-width:180px}.flex-1{flex:1 1 0%}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-red-100{--tw-border-opacity: 1;border-color:rgb(254 226 226 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-orange-50{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-50{--tw-bg-opacity: 1;background-color:rgb(254 252 232 / var(--tw-bg-opacity, 1))}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.tracking-wide{letter-spacing:.025em}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-orange-700{--tw-text-opacity: 1;color:rgb(194 65 12 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}body{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-purple-700:hover{--tw-bg-opacity: 1;background-color:rgb(126 34 206 / var(--tw-bg-opacity, 1))}.hover\:text-red-700:hover{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}
|