@percepta/kaizen 0.9.0 → 0.10.0
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/dashboard/pages/api/langfuse-action.js +9 -2
- package/dist/dashboard/pages/api/langfuse-action.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-dataset-item.js +5 -2
- package/dist/dashboard/pages/api/langfuse-dataset-item.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-dataset-mutation.js +1 -1
- package/dist/dashboard/pages/api/langfuse-dataset-mutation.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-dataset.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-datasets.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-trace-memberships.js +1 -1
- package/dist/dashboard/pages/api/langfuse-trace-memberships.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-trace.js.map +1 -1
- package/dist/dashboard/pages/api/langfuse-traces.js.map +1 -1
- package/dist/dashboard/pages/api/linear-ideas.js.map +1 -1
- package/dist/dashboard/pages/api/run-events.js.map +1 -1
- package/dist/dashboard/pages/api/run-failures.js.map +1 -1
- package/dist/dashboard/pages/api/run-traces.js.map +1 -1
- package/dist/dashboard/pages/api/runs.js.map +1 -1
- package/dist/dashboard/pages/api/systems.js +1 -1
- package/dist/dashboard/pages/api/systems.js.map +1 -1
- package/dist/dashboard/pages/api/trace-renderer-version.js +10 -3
- package/dist/dashboard/pages/api/trace-renderer-version.js.map +1 -1
- package/dist/dashboard/pages/api/trace-renderer.js +12 -26
- package/dist/dashboard/pages/api/trace-renderer.js.map +1 -1
- package/dist/dashboard/src/lib/bundle-custom-renderer.js +167 -0
- package/dist/dashboard/src/lib/bundle-custom-renderer.js.map +1 -0
- package/dist/dashboard/src/lib/custom-renderer-files.js.map +1 -1
- package/dist/dashboard/src/lib/custom-renderer-metadata.js.map +1 -1
- package/dist/dashboard/src/lib/custom-view-paths.js.map +1 -1
- package/dist/dashboard/src/lib/dataset-item-labeling.js +20 -0
- package/dist/dashboard/src/lib/dataset-item-labeling.js.map +1 -0
- package/dist/dashboard/src/lib/env.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-cache.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-creds.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-demo.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-errors.js.map +1 -1
- package/dist/dashboard/src/lib/langfuse-helpers.js.map +1 -1
- package/dist/dashboard/src/lib/run-api.js.map +1 -1
- package/dist/dashboard/src/lib/run-store.js.map +1 -1
- package/dist/dashboard/src/lib/types.js.map +1 -1
- package/dist/dashboard/src/lib/workspace-env.js.map +1 -1
- package/dist/dashboard/src/lib/workspace.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/langfuse.d.ts.map +1 -1
- package/dist/langfuse.js.map +1 -1
- package/dist/package.js +2 -2
- package/dist/shared/env-file.js.map +1 -1
- package/dist/shared/linear-ideas.js.map +1 -1
- package/dist/shared/linear-issue.js.map +1 -1
- package/dist/shared/view-types.d.ts.map +1 -1
- package/dist/shared/workspace-paths.js.map +1 -1
- package/dist/src/commands/create-view.js.map +1 -1
- package/dist/src/commands/guide.js.map +1 -1
- package/dist/src/commands/ideas.js.map +1 -1
- package/dist/src/commands/init-system.js.map +1 -1
- package/dist/src/commands/init.js.map +1 -1
- package/dist/src/commands/log.js.map +1 -1
- package/dist/src/commands/rebuild.js.map +1 -1
- package/dist/src/commands/run.js.map +1 -1
- package/dist/src/commands/studio.js.map +1 -1
- package/dist/src/lib/bootstrap.js.map +1 -1
- package/dist/src/lib/cli.js.map +1 -1
- package/dist/src/lib/events.js +2 -0
- package/dist/src/lib/events.js.map +1 -1
- package/dist/src/lib/fs-utils.js.map +1 -1
- package/dist/src/lib/leaderboard.js.map +1 -1
- package/dist/src/lib/parse-args.js.map +1 -1
- package/dist/src/lib/paths.js.map +1 -1
- package/dist/src/lib/promotion.js.map +1 -1
- package/dist/src/lib/prompt.js.map +1 -1
- package/dist/src/lib/run-dir.js.map +1 -1
- package/dist/src/lib/runner.js.map +1 -1
- package/dist/src/lib/system.js.map +1 -1
- package/dist/studio/client/assets/index-Dc4zGLjQ.css +1 -0
- package/dist/studio/client/assets/index-ElL5OoiH.js +9 -0
- package/dist/studio/client/index.html +2 -2
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/studio/client/assets/index-Bwj0gucs.css +0 -1
- package/dist/studio/client/assets/index-DKAiSaYs.js +0 -9
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png" />
|
|
8
8
|
<link rel="icon" type="image/png" sizes="64x64" href="/favicon-64.png" />
|
|
9
9
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
10
|
-
<script type="module" crossorigin src="/assets/index-
|
|
11
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
10
|
+
<script type="module" crossorigin src="/assets/index-ElL5OoiH.js"></script>
|
|
11
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Dc4zGLjQ.css">
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<div id="root"></div>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","names":[],"sources":["../../dashboard/src/studio/server/server.ts"],"mappings":";UAuCiB,mBAAA;EACf,IAAA;EACA,QAAA;EACA,aAAA;EACA,QAAA;AAAA;AAAA,iBAsBoB,iBAAA,CACpB,OAAA,GAAS,mBAAA,GACR,
|
|
1
|
+
{"version":3,"file":"server.d.ts","names":[],"sources":["../../dashboard/src/studio/server/server.ts"],"mappings":";UAuCiB,mBAAA;EACf,IAAA;EACA,QAAA;EACA,aAAA;EACA,QAAA;AAAA;AAAA,iBAsBoB,iBAAA,CACpB,OAAA,GAAS,mBAAA,GACR,OAAO;AAAA,iBAwOM,kBAAA,CAAmB,QAAgB;AAAA,iBAKnC,WAAA,CAAY,QAAgB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":["langfuseAction","langfuseDataset","langfuseDatasetItem","langfuseDatasetMutation","langfuseDatasets","langfuseTrace","langfuseTraceMemberships","langfuseTraces","linearIdeas","runEvents","runFailures","runTraces","runs","systems","traceRenderer","traceRendererVersion"],"sources":["../../dashboard/src/studio/server/server.ts"],"sourcesContent":["import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolveKaizenStateDir } from \"../../../../shared/workspace-paths.js\";\nimport langfuseAction from \"../../../pages/api/langfuse-action\";\nimport langfuseDataset from \"../../../pages/api/langfuse-dataset\";\nimport langfuseDatasetItem from \"../../../pages/api/langfuse-dataset-item\";\nimport langfuseDatasetMutation from \"../../../pages/api/langfuse-dataset-mutation\";\nimport langfuseDatasets from \"../../../pages/api/langfuse-datasets\";\nimport langfuseTrace from \"../../../pages/api/langfuse-trace\";\nimport langfuseTraceMemberships from \"../../../pages/api/langfuse-trace-memberships\";\nimport langfuseTraces from \"../../../pages/api/langfuse-traces\";\nimport linearIdeas from \"../../../pages/api/linear-ideas\";\nimport runEvents from \"../../../pages/api/run-events\";\nimport runFailures from \"../../../pages/api/run-failures\";\nimport runTraces from \"../../../pages/api/run-traces\";\nimport runs from \"../../../pages/api/runs\";\nimport systems from \"../../../pages/api/systems\";\nimport traceRenderer from \"../../../pages/api/trace-renderer\";\nimport traceRendererVersion from \"../../../pages/api/trace-renderer-version\";\nimport type { StudioRequest, StudioResponse } from \"./compat\";\n\ntype ApiHandler = (\n req: StudioRequest,\n res: StudioResponse,\n) => void | Promise<void>;\n\nexport interface StudioServerOptions {\n port?: number | string;\n hostname?: string;\n workspaceRoot?: string;\n stateDir?: string;\n}\n\nconst API_ROUTES: Record<string, ApiHandler> = {\n \"/api/langfuse-action\": langfuseAction,\n \"/api/langfuse-dataset\": langfuseDataset,\n \"/api/langfuse-dataset-item\": langfuseDatasetItem,\n \"/api/langfuse-dataset-mutation\": langfuseDatasetMutation,\n \"/api/langfuse-datasets\": langfuseDatasets,\n \"/api/langfuse-trace\": langfuseTrace,\n \"/api/langfuse-trace-memberships\": langfuseTraceMemberships,\n \"/api/langfuse-traces\": langfuseTraces,\n \"/api/linear-ideas\": linearIdeas,\n \"/api/run-events\": runEvents,\n \"/api/run-failures\": runFailures,\n \"/api/run-traces\": runTraces,\n \"/api/runs\": runs,\n \"/api/systems\": systems,\n \"/api/trace-renderer\": traceRenderer,\n \"/api/trace-renderer-version\": traceRendererVersion,\n};\n\nexport async function startStudioServer(\n options: StudioServerOptions = {},\n): Promise<number> {\n const base = resolve(process.cwd());\n const workspace = resolve(\n base,\n options.workspaceRoot ?? process.env.KAIZEN_WORKSPACE ?? \".\",\n );\n const workspaceRelativePath = relative(base, workspace);\n if (\n workspaceRelativePath.startsWith(\"..\") ||\n isAbsolute(workspaceRelativePath)\n ) {\n throw new Error(\"Invalid workspace root path\");\n }\n\n const stateDir =\n options.stateDir ??\n process.env.KAIZEN_STATE_DIR ??\n resolveKaizenStateDir(workspace);\n const port = Number(options.port ?? process.env.PORT ?? 6789);\n const hostname = options.hostname ?? \"127.0.0.1\";\n\n process.env.KAIZEN_WORKSPACE = workspace;\n process.env.KAIZEN_STATE_DIR = stateDir;\n\n const server = createServer((req, res) => {\n void handleRequest(req, res).catch((err) => {\n sendServerError(res, err);\n });\n });\n\n let shuttingDown = false;\n const shutdown = () => {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n server.closeAllConnections();\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return await new Promise<number>((resolveExit) => {\n server.listen(port, hostname, () => {\n process.stdout.write(`kaizen studio: ${workspace}\\n`);\n process.stdout.write(`state: ${stateDir}\\n`);\n process.stdout.write(`url: http://localhost:${port}\\n`);\n });\n server.on(\"close\", () => resolveExit(0));\n server.on(\"error\", (err) => {\n process.stderr.write(`kaizen studio server error: ${err.message}\\n`);\n resolveExit(1);\n });\n });\n}\n\nasync function handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (hasPathTraversal(rawPathname(req.url ?? \"/\"))) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://kaizen.local\");\n const handler = API_ROUTES[url.pathname];\n if (handler !== undefined) {\n await handleApi(handler, req, res, url);\n return;\n }\n\n if (url.pathname.startsWith(\"/api/\")) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"API route not found\" }));\n return;\n }\n\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n return;\n }\n\n if (isSystemIndexRoute(url.pathname) && !hasStaticFile(url.pathname)) {\n res.writeHead(302, {\n Location: `${url.pathname.replace(/\\/+$/, \"\")}/experiments`,\n });\n res.end();\n return;\n }\n\n serveStatic(req, res, url.pathname);\n}\n\nasync function handleApi(\n handler: ApiHandler,\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n): Promise<void> {\n const apiReq = req as StudioRequest;\n apiReq.query = queryObject(url.searchParams);\n const apiRes = decorateResponse(res);\n try {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n apiReq.body = await readJsonBody(req);\n }\n await handler(apiReq, apiRes);\n } catch (err) {\n sendServerError(res, err);\n }\n}\n\nfunction decorateResponse(res: ServerResponse): StudioResponse {\n const apiRes = res as StudioResponse;\n apiRes.status = (code: number) => {\n res.statusCode = code;\n return apiRes;\n };\n apiRes.json = (value: unknown) => {\n if (!res.headersSent) {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n res.end(JSON.stringify(value));\n };\n apiRes.send = (value: unknown) => {\n if (\n typeof value === \"string\" ||\n Buffer.isBuffer(value) ||\n value instanceof Uint8Array\n ) {\n res.end(value);\n return;\n }\n apiRes.json(value);\n };\n return apiRes;\n}\n\nfunction serveStatic(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n): void {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n const targetRelativePath = relative(root, target);\n if (targetRelativePath.startsWith(\"..\") || isAbsolute(targetRelativePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const indexPath = resolve(root, \"index.html\");\n const indexRelativePath = relative(root, indexPath);\n const filePath =\n existsSync(target) && statSync(target).isFile()\n ? target\n : isAssetPath(`/${requestedPath}`)\n ? null\n : indexRelativePath.startsWith(\"..\") || isAbsolute(indexRelativePath)\n ? null\n : indexPath;\n\n if (!filePath || !existsSync(filePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const validatedPath = resolve(filePath);\n const fileRelativePath = relative(root, validatedPath);\n if (fileRelativePath.startsWith(\"..\") || isAbsolute(fileRelativePath)) {\n res.writeHead(403, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const mimeType = mimeTypeFor(validatedPath);\n res.writeHead(200, {\n \"Content-Type\": mimeType,\n \"Cache-Control\":\n validatedPath.endsWith(\"index.html\") || mimeType.startsWith(\"text/html\")\n ? \"no-store\"\n : \"public, max-age=31536000, immutable\",\n });\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n const stream = createReadStream(validatedPath);\n stream.on(\"error\", (err) => {\n sendServerError(res, err);\n });\n stream.pipe(res);\n}\n\nfunction queryObject(\n params: URLSearchParams,\n): Record<string, string | string[]> {\n const out: Record<string, string | string[]> = {};\n for (const [key, value] of params) {\n const existing = out[key];\n if (existing === undefined) {\n out[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[key] = [existing, value];\n }\n }\n return out;\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (chunks.length === 0) return undefined;\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n if (!text.trim()) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function isSystemIndexRoute(pathname: string): boolean {\n const parts = pathname.split(\"/\").filter(Boolean);\n return parts.length === 1 && parts[0] !== \"api\";\n}\n\nexport function isAssetPath(pathname: string): boolean {\n return (\n pathname.startsWith(\"/assets/\") || pathname.startsWith(\"/source-icons/\")\n );\n}\n\nfunction hasStaticFile(pathname: string): boolean {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n return (\n isInside(root, target) && existsSync(target) && statSync(target).isFile()\n );\n}\n\nfunction sendServerError(res: ServerResponse, err: unknown): void {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json; charset=utf-8\" });\n res.end(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n return;\n }\n res.destroy(err instanceof Error ? err : undefined);\n}\n\nfunction trustedClientRoot(): string {\n return resolve(findPackageRoot(), \"dist\", \"studio\", \"client\");\n}\n\nfunction rawPathname(requestUrl: string): string {\n return requestUrl.split(/[?#]/, 1)[0] || \"/\";\n}\n\nfunction hasPathTraversal(pathname: string): boolean {\n let decodedPath = pathname;\n for (let i = 0; i < 3; i += 1) {\n const next = safeDecodePath(decodedPath);\n if (next === decodedPath) break;\n decodedPath = next;\n }\n return decodedPath.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction safeDecodePath(pathname: string): string {\n try {\n return decodeURIComponent(pathname);\n } catch {\n return pathname;\n }\n}\n\nfunction isInside(root: string, target: string): boolean {\n const relativePath = relative(root, target);\n return (\n relativePath === \"\" ||\n (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath))\n );\n}\n\nfunction findPackageRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return process.cwd();\n}\n\nfunction mimeTypeFor(filePath: string): string {\n switch (extname(filePath).toLowerCase()) {\n case \".html\":\n return \"text/html; charset=utf-8\";\n case \".js\":\n return \"text/javascript; charset=utf-8\";\n case \".css\":\n return \"text/css; charset=utf-8\";\n case \".json\":\n return \"application/json; charset=utf-8\";\n case \".png\":\n return \"image/png\";\n case \".svg\":\n return \"image/svg+xml\";\n case \".ico\":\n return \"image/x-icon\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\n void startStudioServer().then((code) => process.exit(code));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":["langfuseAction","langfuseDataset","langfuseDatasetItem","langfuseDatasetMutation","langfuseDatasets","langfuseTrace","langfuseTraceMemberships","langfuseTraces","linearIdeas","runEvents","runFailures","runTraces","runs","systems","traceRenderer","traceRendererVersion"],"sources":["../../dashboard/src/studio/server/server.ts"],"sourcesContent":["import { createReadStream, existsSync, statSync } from \"node:fs\";\nimport {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport {\n dirname,\n extname,\n isAbsolute,\n join,\n relative,\n resolve,\n} from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { resolveKaizenStateDir } from \"../../../../shared/workspace-paths.js\";\nimport langfuseAction from \"../../../pages/api/langfuse-action\";\nimport langfuseDataset from \"../../../pages/api/langfuse-dataset\";\nimport langfuseDatasetItem from \"../../../pages/api/langfuse-dataset-item\";\nimport langfuseDatasetMutation from \"../../../pages/api/langfuse-dataset-mutation\";\nimport langfuseDatasets from \"../../../pages/api/langfuse-datasets\";\nimport langfuseTrace from \"../../../pages/api/langfuse-trace\";\nimport langfuseTraceMemberships from \"../../../pages/api/langfuse-trace-memberships\";\nimport langfuseTraces from \"../../../pages/api/langfuse-traces\";\nimport linearIdeas from \"../../../pages/api/linear-ideas\";\nimport runEvents from \"../../../pages/api/run-events\";\nimport runFailures from \"../../../pages/api/run-failures\";\nimport runTraces from \"../../../pages/api/run-traces\";\nimport runs from \"../../../pages/api/runs\";\nimport systems from \"../../../pages/api/systems\";\nimport traceRenderer from \"../../../pages/api/trace-renderer\";\nimport traceRendererVersion from \"../../../pages/api/trace-renderer-version\";\nimport type { StudioRequest, StudioResponse } from \"./compat\";\n\ntype ApiHandler = (\n req: StudioRequest,\n res: StudioResponse,\n) => void | Promise<void>;\n\nexport interface StudioServerOptions {\n port?: number | string;\n hostname?: string;\n workspaceRoot?: string;\n stateDir?: string;\n}\n\nconst API_ROUTES: Record<string, ApiHandler> = {\n \"/api/langfuse-action\": langfuseAction,\n \"/api/langfuse-dataset\": langfuseDataset,\n \"/api/langfuse-dataset-item\": langfuseDatasetItem,\n \"/api/langfuse-dataset-mutation\": langfuseDatasetMutation,\n \"/api/langfuse-datasets\": langfuseDatasets,\n \"/api/langfuse-trace\": langfuseTrace,\n \"/api/langfuse-trace-memberships\": langfuseTraceMemberships,\n \"/api/langfuse-traces\": langfuseTraces,\n \"/api/linear-ideas\": linearIdeas,\n \"/api/run-events\": runEvents,\n \"/api/run-failures\": runFailures,\n \"/api/run-traces\": runTraces,\n \"/api/runs\": runs,\n \"/api/systems\": systems,\n \"/api/trace-renderer\": traceRenderer,\n \"/api/trace-renderer-version\": traceRendererVersion,\n};\n\nexport async function startStudioServer(\n options: StudioServerOptions = {},\n): Promise<number> {\n const base = resolve(process.cwd());\n const workspace = resolve(\n base,\n options.workspaceRoot ?? process.env.KAIZEN_WORKSPACE ?? \".\",\n );\n const workspaceRelativePath = relative(base, workspace);\n if (\n workspaceRelativePath.startsWith(\"..\") ||\n isAbsolute(workspaceRelativePath)\n ) {\n throw new Error(\"Invalid workspace root path\");\n }\n\n const stateDir =\n options.stateDir ??\n process.env.KAIZEN_STATE_DIR ??\n resolveKaizenStateDir(workspace);\n const port = Number(options.port ?? process.env.PORT ?? 6789);\n const hostname = options.hostname ?? \"127.0.0.1\";\n\n process.env.KAIZEN_WORKSPACE = workspace;\n process.env.KAIZEN_STATE_DIR = stateDir;\n\n const server = createServer((req, res) => {\n void handleRequest(req, res).catch((err) => {\n sendServerError(res, err);\n });\n });\n\n let shuttingDown = false;\n const shutdown = () => {\n if (shuttingDown) return;\n shuttingDown = true;\n server.close();\n server.closeAllConnections();\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n\n return await new Promise<number>((resolveExit) => {\n server.listen(port, hostname, () => {\n process.stdout.write(`kaizen studio: ${workspace}\\n`);\n process.stdout.write(`state: ${stateDir}\\n`);\n process.stdout.write(`url: http://localhost:${port}\\n`);\n });\n server.on(\"close\", () => resolveExit(0));\n server.on(\"error\", (err) => {\n process.stderr.write(`kaizen studio server error: ${err.message}\\n`);\n resolveExit(1);\n });\n });\n}\n\nasync function handleRequest(\n req: IncomingMessage,\n res: ServerResponse,\n): Promise<void> {\n if (hasPathTraversal(rawPathname(req.url ?? \"/\"))) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const url = new URL(req.url ?? \"/\", \"http://kaizen.local\");\n const handler = API_ROUTES[url.pathname];\n if (handler !== undefined) {\n await handleApi(handler, req, res, url);\n return;\n }\n\n if (url.pathname.startsWith(\"/api/\")) {\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"API route not found\" }));\n return;\n }\n\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n res.writeHead(405, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n return;\n }\n\n if (isSystemIndexRoute(url.pathname) && !hasStaticFile(url.pathname)) {\n res.writeHead(302, {\n Location: `${url.pathname.replace(/\\/+$/, \"\")}/experiments`,\n });\n res.end();\n return;\n }\n\n serveStatic(req, res, url.pathname);\n}\n\nasync function handleApi(\n handler: ApiHandler,\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n): Promise<void> {\n const apiReq = req as StudioRequest;\n apiReq.query = queryObject(url.searchParams);\n const apiRes = decorateResponse(res);\n try {\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\n apiReq.body = await readJsonBody(req);\n }\n await handler(apiReq, apiRes);\n } catch (err) {\n sendServerError(res, err);\n }\n}\n\nfunction decorateResponse(res: ServerResponse): StudioResponse {\n const apiRes = res as StudioResponse;\n apiRes.status = (code: number) => {\n res.statusCode = code;\n return apiRes;\n };\n apiRes.json = (value: unknown) => {\n if (!res.headersSent) {\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n res.end(JSON.stringify(value));\n };\n apiRes.send = (value: unknown) => {\n if (\n typeof value === \"string\" ||\n Buffer.isBuffer(value) ||\n value instanceof Uint8Array\n ) {\n res.end(value);\n return;\n }\n apiRes.json(value);\n };\n return apiRes;\n}\n\nfunction serveStatic(\n req: IncomingMessage,\n res: ServerResponse,\n pathname: string,\n): void {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n const targetRelativePath = relative(root, target);\n if (targetRelativePath.startsWith(\"..\") || isAbsolute(targetRelativePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const indexPath = resolve(root, \"index.html\");\n const indexRelativePath = relative(root, indexPath);\n const filePath =\n existsSync(target) && statSync(target).isFile()\n ? target\n : isAssetPath(`/${requestedPath}`)\n ? null\n : indexRelativePath.startsWith(\"..\") || isAbsolute(indexRelativePath)\n ? null\n : indexPath;\n\n if (!filePath || !existsSync(filePath)) {\n res.writeHead(404, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Not found\");\n return;\n }\n\n const validatedPath = resolve(filePath);\n const fileRelativePath = relative(root, validatedPath);\n if (fileRelativePath.startsWith(\"..\") || isAbsolute(fileRelativePath)) {\n res.writeHead(403, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Forbidden\");\n return;\n }\n\n const mimeType = mimeTypeFor(validatedPath);\n res.writeHead(200, {\n \"Content-Type\": mimeType,\n \"Cache-Control\":\n validatedPath.endsWith(\"index.html\") || mimeType.startsWith(\"text/html\")\n ? \"no-store\"\n : \"public, max-age=31536000, immutable\",\n });\n if (req.method === \"HEAD\") {\n res.end();\n return;\n }\n const stream = createReadStream(validatedPath);\n stream.on(\"error\", (err) => {\n sendServerError(res, err);\n });\n stream.pipe(res);\n}\n\nfunction queryObject(\n params: URLSearchParams,\n): Record<string, string | string[]> {\n const out: Record<string, string | string[]> = {};\n for (const [key, value] of params) {\n const existing = out[key];\n if (existing === undefined) {\n out[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[key] = [existing, value];\n }\n }\n return out;\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n if (chunks.length === 0) return undefined;\n const text = Buffer.concat(chunks).toString(\"utf-8\");\n if (!text.trim()) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport function isSystemIndexRoute(pathname: string): boolean {\n const parts = pathname.split(\"/\").filter(Boolean);\n return parts.length === 1 && parts[0] !== \"api\";\n}\n\nexport function isAssetPath(pathname: string): boolean {\n return (\n pathname.startsWith(\"/assets/\") || pathname.startsWith(\"/source-icons/\")\n );\n}\n\nfunction hasStaticFile(pathname: string): boolean {\n const root = trustedClientRoot();\n const decodedPath = safeDecodePath(pathname);\n const requestedPath =\n decodedPath === \"/\" ? \"index.html\" : decodedPath.replace(/^\\/+/, \"\");\n const target = resolve(root, requestedPath);\n return (\n isInside(root, target) && existsSync(target) && statSync(target).isFile()\n );\n}\n\nfunction sendServerError(res: ServerResponse, err: unknown): void {\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json; charset=utf-8\" });\n res.end(\n JSON.stringify({\n error: err instanceof Error ? err.message : String(err),\n }),\n );\n return;\n }\n res.destroy(err instanceof Error ? err : undefined);\n}\n\nfunction trustedClientRoot(): string {\n return resolve(findPackageRoot(), \"dist\", \"studio\", \"client\");\n}\n\nfunction rawPathname(requestUrl: string): string {\n return requestUrl.split(/[?#]/, 1)[0] || \"/\";\n}\n\nfunction hasPathTraversal(pathname: string): boolean {\n let decodedPath = pathname;\n for (let i = 0; i < 3; i += 1) {\n const next = safeDecodePath(decodedPath);\n if (next === decodedPath) break;\n decodedPath = next;\n }\n return decodedPath.split(/[\\\\/]+/).includes(\"..\");\n}\n\nfunction safeDecodePath(pathname: string): string {\n try {\n return decodeURIComponent(pathname);\n } catch {\n return pathname;\n }\n}\n\nfunction isInside(root: string, target: string): boolean {\n const relativePath = relative(root, target);\n return (\n relativePath === \"\" ||\n (!relativePath.startsWith(\"..\") && !isAbsolute(relativePath))\n );\n}\n\nfunction findPackageRoot(): string {\n let dir = dirname(fileURLToPath(import.meta.url));\n while (dir !== dirname(dir)) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n dir = dirname(dir);\n }\n return process.cwd();\n}\n\nfunction mimeTypeFor(filePath: string): string {\n switch (extname(filePath).toLowerCase()) {\n case \".html\":\n return \"text/html; charset=utf-8\";\n case \".js\":\n return \"text/javascript; charset=utf-8\";\n case \".css\":\n return \"text/css; charset=utf-8\";\n case \".json\":\n return \"application/json; charset=utf-8\";\n case \".png\":\n return \"image/png\";\n case \".svg\":\n return \"image/svg+xml\";\n case \".ico\":\n return \"image/x-icon\";\n default:\n return \"application/octet-stream\";\n }\n}\n\nif (process.argv[1] === fileURLToPath(import.meta.url)) {\n void startStudioServer().then((code) => process.exit(code));\n}\n"],"mappings":"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"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;UAAiB,YAAA;EACf,QAAA;IACE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"mappings":";;;UAAiB,YAAA;EACf,QAAA;IACE,IAAI;EAAA;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@percepta/kaizen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Automated AI researcher that improves AI systems",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"yaml": "^2.8.4"
|
|
43
43
|
},
|
|
44
44
|
"devDependencies": {
|
|
45
|
+
"@percepta/build": "^1.2.1",
|
|
45
46
|
"@types/d3-hierarchy": "^3.1.7",
|
|
46
47
|
"@types/node": "^25.6.2",
|
|
47
48
|
"@types/react": "^19.2.14",
|
|
@@ -55,8 +56,7 @@
|
|
|
55
56
|
"rimraf": "^6.1.3",
|
|
56
57
|
"typescript": "^6.0.3",
|
|
57
58
|
"vite": "^8.0.11",
|
|
58
|
-
"vitest": "^4.1.5"
|
|
59
|
-
"@percepta/build": "1.1.0"
|
|
59
|
+
"vitest": "^4.1.5"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
62
|
"@types/react": "^19.0.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._page_33mp6_1{color:#fafafa;background:#0a0a0a;min-height:100%;font-family:Geist,ui-sans-serif,system-ui,-apple-system,sans-serif}._topBar_33mp6_13{grid-template-columns:max-content max-content max-content minmax(0,1fr);align-items:center;gap:.9rem;padding:1rem 1.5rem;display:grid}._logoLink_33mp6_21{justify-content:center;align-items:center;width:26px;height:26px;text-decoration:none;display:inline-flex}._topLogo_33mp6_30{object-fit:contain;width:22px;height:22px;display:block}._systemSlot_33mp6_37{min-width:0}._surfaceNav_33mp6_41{align-items:center;gap:.25rem;min-width:0;display:flex}._surfaceLink_33mp6_48{height:32px;color:var(--text-tertiary);white-space:nowrap;border-radius:0;justify-content:center;align-items:center;padding:0 .8rem;font-size:.85rem;font-weight:500;text-decoration:none;transition:background .15s,color .15s;display:inline-flex}._surfaceLink_33mp6_48:hover{color:var(--text-secondary);background:#ffffff0d}._surfaceLinkActive_33mp6_70{color:#fafafa;background:#ffffff14}._surfaceLinkDisabled_33mp6_75{opacity:.45;pointer-events:none}._statusPill_33mp6_80{min-height:22px;color:var(--text-secondary);white-space:nowrap;background:#ffffff0f;border:1px solid #ffffff14;border-radius:0;align-items:center;padding:0 .45rem;font-size:.68rem;font-weight:600;display:inline-flex}._content_33mp6_94{padding:0 1.5rem 2rem}._surface_33mp6_41{min-width:0}._surfaceBanner_33mp6_102{box-sizing:border-box;background:#ffffff09;border:1px solid #ffffff14;border-radius:0;justify-content:space-between;align-items:flex-start;gap:1rem;width:100%;margin-bottom:1rem;padding:.8rem .9rem;display:flex}._surfaceBannerText_33mp6_116{min-width:0}._surfaceBannerTitle_33mp6_120{color:#fafafa;align-items:center;gap:.45rem;font-size:.9rem;font-weight:650;display:flex}._surfaceBannerCopy_33mp6_129{color:var(--text-secondary);margin-top:.2rem;font-size:.78rem;line-height:1.45}._surfaceBannerCopy_33mp6_129 code{color:#fafafa;background:#0000003d;border-radius:0;padding:.05rem .25rem}._sourceChip_33mp6_143{color:#fafafa;vertical-align:middle;background:#ffffff0a;border:1px solid #ffffff1a;border-radius:0;justify-content:center;align-items:center;width:22px;height:22px;padding:0;line-height:1;display:inline-flex}._sourceChip_code_33mp6_158{color:#fafafa}._sourceChip_langfuse_33mp6_162,._sourceChip_linear_33mp6_166{background:#ffffff0f}._sourceChip_local_33mp6_170{color:#fafafa}._sourceLogo_33mp6_174{object-fit:contain;width:15px;height:15px;display:block}._sourceSvgIcon_33mp6_181{width:15px;height:15px;display:block}._provenanceLine_33mp6_187{color:var(--text-tertiary);flex-wrap:wrap;align-items:center;gap:.4rem;margin-top:.45rem;font-size:.74rem;display:flex}._provenanceLine_33mp6_187 code{color:#fafafa;background:#0000003d;border-radius:0;padding:.08rem .28rem}._inlineSourceValue_33mp6_204{vertical-align:middle;white-space:nowrap;align-items:center;gap:.35rem;display:inline-flex}._syncStatus_33mp6_212{flex-shrink:0;justify-content:flex-end;align-items:center;gap:.4rem;display:flex}._syncStatusLabel_33mp6_220{color:var(--text-tertiary);white-space:nowrap;font-size:.74rem;font-weight:500}._iconButton_33mp6_227{color:#fafafa;cursor:pointer;white-space:nowrap;background:#ffffff0a;border:1px solid #ffffff17;border-radius:0;justify-content:center;align-items:center;width:32px;height:32px;padding:0;font-family:inherit;font-size:1rem;line-height:1;display:inline-flex}._iconButton_33mp6_227:hover:not(:disabled){background:#ffffff12;border-color:#ffffff26}._iconButton_33mp6_227:disabled{color:var(--text-tertiary);cursor:default}._dataLayout_33mp6_255{grid-template-columns:9.5rem minmax(0,1fr);align-items:start;gap:0;display:grid}._experimentsLayout_33mp6_262{align-items:flex-start;min-width:0;display:flex}._dataNav_33mp6_268{box-sizing:border-box;border-right:1px solid #ffffff14;flex-direction:column;align-self:stretch;gap:.25rem;min-height:calc(100vh - 8rem);padding:0 1rem 0 0;display:flex}._experimentNav_33mp6_279{border-right:none;flex:none;min-width:220px;max-width:min(520px,45vw);padding:0;overflow:auto}._experimentNavItem_33mp6_288{box-sizing:border-box;width:100%;display:flex}._sidebarResizeHandle_33mp6_294{cursor:col-resize;flex:0 0 16px;align-self:stretch;min-height:calc(100vh - 8rem);position:relative}._sidebarResizeHandle_33mp6_294:before{content:"";background:#ffffff14;width:1px;transition:background .12s;position:absolute;top:0;bottom:0;left:7px}._sidebarResizeHandle_33mp6_294:hover:before{background:#ffffff38}._dataNavItem_33mp6_317{width:fit-content;min-height:32px;color:var(--text-tertiary);cursor:pointer;text-align:left;background:0 0;border:0;border-radius:0;justify-content:flex-start;align-items:center;padding:0 .8rem;font-family:inherit;font-size:.85rem;font-weight:500;text-decoration:none;transition:background .15s,color .15s;display:inline-flex}._dataNavGroupItem_33mp6_339{flex-direction:column;align-items:flex-start;gap:.12rem;width:100%;min-height:48px;padding:.4rem .65rem}._dataNavItemText_33mp6_348,._dataNavItemMeta_33mp6_349{text-overflow:ellipsis;white-space:nowrap;width:100%;min-width:0;display:block;overflow:hidden}._experimentNavItem_33mp6_288 ._dataNavItemText_33mp6_348,._experimentNavItem_33mp6_288 ._dataNavItemMeta_33mp6_349{text-overflow:clip;white-space:normal;overflow:visible}._dataNavItemText_33mp6_348{color:inherit;line-height:1.2}._dataNavItemMeta_33mp6_349{color:var(--text-tertiary);font-size:.7rem;line-height:1.2}._dataNavEmpty_33mp6_376{color:var(--text-tertiary);padding:.5rem .65rem;font-size:.78rem}._experimentNavEmpty_33mp6_382{box-sizing:border-box;flex-direction:column;gap:.25rem;width:100%;padding:.5rem .65rem;display:flex}._dataNavEmptyTitle_33mp6_391{color:var(--text-secondary);font-size:.82rem;font-weight:500;line-height:1.25}._dataNavEmptyCopy_33mp6_398{color:var(--text-tertiary);font-size:.74rem;line-height:1.4}._dataNavItem_33mp6_317:hover{color:var(--text-secondary);background:#ffffff0d}._dataNavItem_33mp6_317:focus{outline:none}._dataNavItemActive_33mp6_413{color:#fafafa;background:#ffffff14}._dataLayout_33mp6_255>._dataNav_33mp6_268{width:100%;padding:0}._dataLayout_33mp6_255>._dataNav_33mp6_268 ._dataNavItem_33mp6_317{box-sizing:border-box;width:100%;display:flex}._dataMain_33mp6_429{flex:auto;min-width:0;padding:0 1.5rem 1.5rem}._surfaceToolbar_33mp6_435{justify-content:space-between;align-items:center;gap:1rem;margin-bottom:1rem;display:flex}._tracesToolbarSearch_33mp6_443{flex:auto;align-items:center;gap:.45rem;min-width:0;display:flex}._textInput_33mp6_451._traceSearchInput_33mp6_451{width:min(390px,44vw);height:28px;min-height:28px;padding:0 .6rem;font-size:.8rem;font-weight:500;line-height:1}._textInput_33mp6_451._traceSearchInput_33mp6_451::placeholder{color:#ffffff6b;font-weight:450}._secondaryButton_33mp6_466._traceSearchButton_33mp6_466{flex:0 0 28px;justify-content:center;align-items:center;width:28px;height:28px;padding:0;display:inline-flex}._traceDateRangeLabel_33mp6_476{color:#fff9;white-space:nowrap;font-size:.75rem;font-weight:500}._textInput_33mp6_451._traceDateInput_33mp6_483{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;height:28px;min-height:28px;padding:0 .5rem;font-size:.75rem;font-weight:500;line-height:1}._searchIcon_33mp6_493{background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23fafafa' stroke-width='2.25' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='6.5'/%3E%3Cpath d='m16 16 4.5 4.5'/%3E%3C/svg%3E") 50%/14px 14px no-repeat;width:14px;height:14px;display:block}._tracesToolbarRight_33mp6_501{justify-content:flex-end;align-items:center;gap:.65rem;min-width:max-content;margin-left:auto;display:flex}._surfaceTitle_33mp6_510{color:#fafafa;font-size:.95rem;font-weight:600}._surfaceSubtitle_33mp6_516{color:var(--text-tertiary);margin-top:.15rem;font-size:.75rem}._inlineSelector_33mp6_522{align-items:center;gap:.45rem;width:max-content;min-width:0;display:inline-flex}._inlineSelectorLabel_33mp6_530{color:var(--text-tertiary);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;font-size:.72rem;font-weight:600}._filterBar_33mp6_539{justify-content:flex-end;margin-bottom:1rem;display:flex}._select_33mp6_545,._primaryButton_33mp6_546,._secondaryButton_33mp6_466,._dangerButton_33mp6_548{color:#fafafa;background:#ffffff0a;border:1px solid #ffffff17;border-radius:0;height:32px;font-family:inherit;font-size:.8rem}._select_33mp6_545{appearance:none;background:linear-gradient(45deg,#0000 50%,#ffffff94 50%) calc(100% - 14px) 13px/5px 5px no-repeat,linear-gradient(135deg,#ffffff94 50%,#0000 50%) calc(100% - 9px) 13px/5px 5px no-repeat,#ffffff0a;max-width:340px;padding:0 1.8rem 0 .5rem}._select_33mp6_545:focus{background-color:#ffffff0f;border-color:#ffffff38;outline:none}._select_33mp6_545 option{color:#fafafa;background:#111}._checkboxInput_33mp6_582{appearance:none;cursor:pointer;vertical-align:middle;background:#ffffff0a;border:1px solid #ffffff3d;place-content:center;width:14px;height:14px;margin:0;display:inline-grid}._checkboxInput_33mp6_582:before{content:"";opacity:0;border-bottom:1.8px solid #0a0a0a;border-left:1.8px solid #0a0a0a;width:7px;height:4px;transform:translateY(-1px)rotate(-45deg)}._checkboxInput_33mp6_582:checked{background:#fafafa;border-color:#fafafa}._checkboxInput_33mp6_582:checked:before{opacity:1}._checkboxInput_33mp6_582:indeterminate{background:#fafafa;border-color:#fafafa}._checkboxInput_33mp6_582:indeterminate:before{opacity:1;border-bottom:1.8px solid #0a0a0a;border-left:0;width:8px;height:0;transform:none}._checkboxInput_33mp6_582:focus{border-color:#ffffff80;outline:none}._dropdown_33mp6_633{width:100%;max-width:340px;position:relative}._dropdownButton_33mp6_639{color:#fafafa;cursor:pointer;text-align:left;background:#ffffff0a;border:1px solid #ffffff17;justify-content:space-between;align-items:center;gap:.65rem;width:100%;height:32px;padding:0 .6rem;font-family:inherit;font-size:.8rem;display:inline-flex}._dropdownButton_33mp6_639:hover:not(:disabled),._dropdownButton_33mp6_639[aria-expanded=true]{background:#ffffff0f;border-color:#ffffff2e}._dropdownButton_33mp6_639:focus{border-color:#ffffff38;outline:none}._dropdownButton_33mp6_639:disabled{color:var(--text-tertiary);cursor:default}._dropdownValue_33mp6_672{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._dropdownChevron_33mp6_679{border-bottom:1px solid #ffffff9e;border-right:1px solid #ffffff9e;flex:0 0 7px;width:7px;height:7px;transform:translateY(-2px)rotate(45deg)}._dropdownMenu_33mp6_688{z-index:1100;background:#111;border:1px solid #ffffff1f;max-height:220px;position:absolute;top:calc(100% + .25rem);left:0;right:0;overflow:auto;box-shadow:0 10px 24px #00000085}._dropdownOption_33mp6_701{width:100%;min-height:32px;color:var(--text-secondary);cursor:pointer;text-align:left;background:0 0;border:0;border-bottom:1px solid #ffffff0f;padding:.45rem .6rem;font-family:inherit;font-size:.8rem;display:block}._dropdownOption_33mp6_701:last-child{border-bottom:0}._dropdownOption_33mp6_701:hover,._dropdownOptionSelected_33mp6_721{color:#fafafa;background:#ffffff14}._dropdownOption_33mp6_701:focus{color:#fafafa;background:#ffffff14;outline:none}._primaryButton_33mp6_546{cursor:pointer;color:#0a0a0a;background:#fafafa;border-color:#fafafa;padding:0 .85rem;font-weight:600}._secondaryButton_33mp6_466{cursor:pointer;padding:0 .75rem}._dangerButton_33mp6_548{cursor:pointer;color:#ffb3a6;background:#e8553d14;border-color:#e8553d38;padding:0 .75rem}._primaryButton_33mp6_546:hover:not(:disabled){background:var(--text-secondary);border-color:var(--text-secondary)}._secondaryButton_33mp6_466:hover:not(:disabled){background:#ffffff12;border-color:#ffffff26}._dangerButton_33mp6_548:hover:not(:disabled){background:#e8553d21;border-color:#e8553d57}._primaryButton_33mp6_546:disabled,._secondaryButton_33mp6_466:disabled,._dangerButton_33mp6_548:disabled{color:var(--text-tertiary);cursor:default}._primaryButton_33mp6_546:disabled{background:#ffffff14;border-color:#ffffff17}._splitSurface_33mp6_781{grid-template-columns:minmax(240px,340px) minmax(0,1fr);gap:1rem;min-height:560px;display:grid}._listPanel_33mp6_788,._listPanelEmpty_33mp6_789,._detailPanel_33mp6_790,._errorPanel_33mp6_791,._loadingPanel_33mp6_792,._emptyPanel_33mp6_793{background:#ffffff08;border:1px solid #ffffff14;border-radius:0}._listPanel_33mp6_788{max-height:calc(100vh - 280px);overflow:auto}._listPanelEmpty_33mp6_789,._loadingPanel_33mp6_792,._emptyPanel_33mp6_793{min-height:260px;color:var(--text-tertiary);text-align:center;justify-content:center;align-items:center;padding:2rem;font-size:.86rem;display:flex}._listRow_33mp6_817{width:100%;color:inherit;text-align:left;white-space:normal;cursor:pointer;background:0 0;border:0;border-bottom:1px solid #ffffff0d;flex-direction:column;align-items:stretch;gap:.2rem;padding:.75rem;font-family:inherit;display:flex}._listRow_33mp6_817:hover{background:#ffffff0a}._listRowSelected_33mp6_838{background:#5b8def1a;box-shadow:inset 2px 0 #5b8def}._listRowTitle_33mp6_843{color:#fafafa;overflow-wrap:anywhere;text-overflow:clip;white-space:normal;min-width:0;font-size:.82rem;font-weight:500;line-height:1.28;display:block;overflow:visible}._listRowMeta_33mp6_856{min-width:0;color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:.72rem;overflow:hidden}._listRowLinked_33mp6_865{color:#9ebcffdb;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:.7rem;overflow:hidden}._detailPanel_33mp6_790{min-width:0;max-height:calc(100vh - 280px);padding:1rem;overflow:auto}._detailHeader_33mp6_881{justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:1rem;display:flex}._detailHeaderAction_33mp6_889{align-self:flex-start}._detailTitle_33mp6_893{color:#fafafa;overflow-wrap:anywhere;margin:0;font-size:1rem;font-weight:600;line-height:1.35}._detailMeta_33mp6_902,._mutedText_33mp6_903{color:var(--text-tertiary);overflow-wrap:anywhere;margin-top:.2rem;font-size:.74rem}._detailLink_33mp6_910{color:#5b8def;font-size:.78rem;text-decoration:none}._detailLink_33mp6_910:hover{text-decoration:underline}._detailGrid_33mp6_920{grid-template-columns:repeat(2,minmax(0,1fr));gap:.75rem;display:grid}._jsonBlock_33mp6_926{min-width:0;margin-bottom:.75rem}._jsonTitle_33mp6_931,._sectionTitle_33mp6_932{color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em;margin-bottom:.35rem;font-size:.72rem;font-weight:600}._jsonPre_33mp6_941{max-height:320px;color:var(--text-secondary);white-space:pre-wrap;overflow-wrap:anywhere;background:#00000047;border-radius:0;margin:0;padding:.75rem;font-size:.75rem;line-height:1.45;overflow:auto}._traceSection_33mp6_955{margin-top:1rem}._traceHeader_33mp6_959{align-items:baseline;gap:.75rem;margin-bottom:.6rem;display:flex}._traceName_33mp6_966{color:#fafafa;overflow-wrap:anywhere;font-size:.9rem;font-weight:600}._tagRow_33mp6_973{flex-wrap:wrap;gap:.35rem;margin:.75rem 0;display:flex}._tagPill_33mp6_980{color:#9ebcff;background:#5b8def1f;border:1px solid #5b8def38;border-radius:0;align-items:center;min-height:22px;padding:0 .45rem;font-size:.7rem;font-weight:500;display:inline-flex}._errorPanel_33mp6_791{color:#ffb3a6;background:#e8553d1a;border-color:#e8553d4d;margin-bottom:1rem;padding:.75rem;font-size:.82rem}._successPanel_33mp6_1002{color:#b8f5df;background:#00d4aa14;border:1px solid #00d4aa38;border-radius:0;margin-bottom:1rem;padding:.75rem;font-size:.82rem}._evalDefinitionGrid_33mp6_1012{grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem;display:grid}._evalDefinitionCell_33mp6_1018{min-width:0}._evalDefinitionCode_33mp6_1022{width:fit-content;max-width:100%;color:var(--text-tertiary);overflow-wrap:anywhere;background:#0000003d;margin-top:.2rem;padding:.1rem .28rem;font-size:.72rem;display:block}._evalHistorySection_33mp6_1034{margin-top:1rem}._evalSectionHeader_33mp6_1038{justify-content:space-between;align-items:flex-start;gap:1rem;margin-bottom:.75rem;display:flex}._evalSummaryTable_33mp6_1046{background:#ffffff08;border:1px solid #ffffff14}._evalSummaryHeader_33mp6_1051,._evalSummaryRow_33mp6_1052{grid-template-columns:minmax(180px,1.35fr) minmax(180px,1.35fr) 80px 80px 160px;align-items:center;gap:.75rem;display:grid}._evalSummaryHeader_33mp6_1051{color:var(--text-tertiary);letter-spacing:.04em;text-transform:uppercase;border-bottom:1px solid #ffffff14;padding:.55rem .75rem;font-size:.7rem;font-weight:600}._evalSummaryRow_33mp6_1052{color:var(--text-secondary);border-bottom:1px solid #ffffff0d;padding:.65rem .75rem;font-size:.78rem}._evalSummaryRow_33mp6_1052:last-child{border-bottom:0}._evalSummaryPrimary_33mp6_1082,._evalSummaryMeta_33mp6_1083{text-overflow:ellipsis;white-space:nowrap;min-width:0;display:block;overflow:hidden}._evalSummaryPrimary_33mp6_1082{color:#fafafa;font-weight:500}._evalSummaryMeta_33mp6_1083{color:var(--text-tertiary);margin-top:.12rem;font-size:.7rem}._setupBanner_33mp6_1102{background:#f5a62314;border:1px solid #f5a62357;border-radius:0;margin-bottom:1rem;padding:.85rem}._setupTitle_33mp6_1110{color:#fafafa;font-size:.88rem;font-weight:600}._setupCopy_33mp6_1116{color:var(--text-secondary);margin-top:.2rem;font-size:.8rem;line-height:1.5}._setupHeader_33mp6_1123{justify-content:space-between;align-items:flex-start;gap:1rem;display:flex}._setupState_33mp6_1130{color:#f5c77b;white-space:nowrap;background:#f5a6231a;border:1px solid #f5a6234d;border-radius:0;align-items:center;min-height:22px;padding:0 .45rem;font-size:.68rem;font-weight:600;display:inline-flex}._setupGrid_33mp6_1144{grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem;margin-top:.8rem;display:grid}._setupBlock_33mp6_1151{min-width:0}._setupBlockTitle_33mp6_1155{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;margin-bottom:.35rem;font-size:.68rem;font-weight:600;display:block}._setupCode_33mp6_1165{color:#fafafa;overflow-wrap:anywhere;background:#00000042;border-radius:0;width:fit-content;max-width:100%;margin-top:.25rem;padding:.18rem .38rem;font-size:.72rem;display:block}._setupLookup_33mp6_1178,._setupDetail_33mp6_1179{color:var(--text-tertiary);overflow-wrap:anywhere;margin-top:.75rem;font-size:.75rem;line-height:1.5}._setupLookupLabel_33mp6_1187{color:var(--text-secondary);margin-right:.35rem;font-weight:600}._ideaMetaGrid_33mp6_1193{grid-template-columns:repeat(4,minmax(0,1fr));gap:.75rem;margin-bottom:.75rem;display:grid}._metaCell_33mp6_1200{min-width:0}._metaLabel_33mp6_1204{color:var(--text-tertiary);font-size:.7rem;display:block}._metaValue_33mp6_1210{color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;margin-top:.1rem;font-size:.78rem;display:block;overflow:hidden}._descriptionBlock_33mp6_1220{white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text-secondary);font-size:.84rem;line-height:1.55}._linkedExperimentsSection_33mp6_1228{margin-bottom:1rem}._linkedExperimentsList_33mp6_1232{gap:.5rem;display:grid}._linkedExperimentsEmpty_33mp6_1237{color:var(--text-tertiary);background:#ffffff06;border:1px solid #ffffff14;padding:.65rem .75rem;font-size:.78rem}._linkedExperimentRow_33mp6_1245{background:#ffffff06;border:1px solid #ffffff14;grid-template-columns:minmax(0,1fr) max-content;align-items:center;gap:.75rem;padding:.65rem .75rem;display:grid}._linkedExperimentMain_33mp6_1255,._linkedExperimentStats_33mp6_1256{min-width:0}._linkedExperimentTitle_33mp6_1260{color:#fafafa;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:.8rem;font-weight:600;display:block;overflow:hidden}._linkedExperimentStats_33mp6_1256{justify-content:flex-end;align-items:center;gap:.45rem;display:inline-flex}._linkedExperimentScore_33mp6_1278{color:#fafafa;white-space:nowrap;font-size:.8rem;font-weight:600}._linkedExperimentMeta_33mp6_1285{min-width:0;color:var(--text-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:.7rem;display:block;overflow:hidden}._formRow_33mp6_1295{flex-direction:column;gap:.35rem;margin-bottom:.75rem;display:flex}._formLabel_33mp6_1302{color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em;font-size:.72rem;font-weight:600}._textInput_33mp6_451{color:#fafafa;background:#00000042;border:1px solid #ffffff1a;border-radius:0;min-height:34px;padding:0 .65rem;font-family:inherit;font-size:.84rem}._textArea_33mp6_1321,._textAreaLarge_33mp6_1322{resize:vertical;color:#fafafa;background:#00000042;border:1px solid #ffffff1a;border-radius:0;min-height:96px;padding:.6rem .65rem;font-family:inherit;font-size:.84rem;line-height:1.45}._textAreaLarge_33mp6_1322{min-height:180px;font-family:Geist Mono,ui-monospace,monospace;font-size:.78rem}._textInput_33mp6_451::placeholder,._textArea_33mp6_1321::placeholder,._textAreaLarge_33mp6_1322::placeholder{color:var(--text-tertiary)}._actionRow_33mp6_1347{flex-wrap:wrap;justify-content:flex-end;gap:.5rem;display:flex}._actionFooter_33mp6_1354{border-top:1px solid #ffffff14;justify-content:space-between;align-items:center;gap:1rem;margin:1rem 0;padding-top:.75rem;display:flex}._emptyState_33mp6_1364{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:.9rem;min-height:560px;display:flex}._emptyLogo_33mp6_1374{opacity:.85;width:220px;height:auto}._emptyTitle_33mp6_1380{color:#fafafa;margin:0;font-size:1.45rem;font-weight:600}._emptyCopy_33mp6_1387,._emptyMeta_33mp6_1388,._emptyPanelCopy_33mp6_1389{color:var(--text-tertiary);font-size:.86rem;line-height:1.5}._emptyPanel_33mp6_793{flex-direction:column;gap:.35rem}._experimentEmptyPanel_33mp6_1400{min-height:360px}._experimentEmptyPanel_33mp6_1400 ._emptyPanelCopy_33mp6_1389{max-width:420px}._experimentDetailSurface_33mp6_1408{flex-direction:column;min-width:0;display:flex}._experimentDetailSummary_33mp6_1414{background:#ffffff06;border:1px solid #ffffff14;margin-bottom:.8rem;padding:.85rem 1rem}._experimentDetailTitleRow_33mp6_1421{justify-content:space-between;align-items:center;gap:1rem;display:flex}._experimentDetailTitleGroup_33mp6_1428{flex-wrap:nowrap;flex:auto;align-items:center;gap:.45rem;min-width:0;display:flex}._experimentDetailTitle_33mp6_1421{color:#fafafa;text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:1rem;font-weight:600;line-height:1.25;overflow:hidden}._experimentDetailTimeRow_33mp6_1448{color:var(--text-tertiary);white-space:nowrap;justify-content:flex-end;gap:.45rem;font-size:.68rem;line-height:1.35;display:flex}._experimentDetailTimeSeparator_33mp6_1458{color:#ffffff38}._experimentMetricStrip_33mp6_1462{border-top:1px solid #ffffff0f;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:0;margin-top:.75rem;padding-top:.75rem;display:grid}._experimentMetricItem_33mp6_1471{border-right:1px solid #ffffff0f;grid-template-columns:minmax(0,auto) auto;align-items:baseline;gap:.15rem .45rem;min-width:0;padding-right:.75rem;display:grid}._experimentMetricItem_33mp6_1471:last-child{border-right:0}._experimentMetricItemPrimary_33mp6_1486 ._experimentMetricValue_33mp6_1486{color:#00d4aa}._experimentMetricLabel_33mp6_1490{color:var(--text-tertiary);font-size:.72rem;font-weight:500}._experimentMetricValue_33mp6_1486{color:#fafafa;font-variant-numeric:tabular-nums;font-size:.95rem;font-weight:600}._emptyPanelTitle_33mp6_1503{color:#fafafa;font-size:.95rem;font-weight:600}._runTracesPanel_33mp6_1511{background:0 0;border:0;flex-direction:column;width:100%;min-width:0;display:flex;overflow:visible}._runTracesPanelHeader_33mp6_1521{justify-content:space-between;align-items:flex-start;padding:0 0 .75rem;display:flex}._runTracesPanelTitle_33mp6_1528{color:#fff;margin:0;font-size:1.1rem;font-weight:500}._runTracesDetail_33mp6_1535{flex:1;padding:1rem 1.5rem;overflow-y:auto}._runTracesTableWrap_33mp6_1541{background:#ffffff06;border:1px solid #ffffff14;flex:1;padding:0 0 1rem;overflow-y:auto}._datasetsTableWrap_33mp6_1549{padding-bottom:1.25rem;overflow:visible}._runTracesTable_33mp6_1541{border-collapse:collapse;width:100%;font-family:Geist,ui-sans-serif,system-ui,sans-serif;font-size:.8rem}._runTracesTable_33mp6_1541 th{z-index:1;text-align:left;letter-spacing:0;color:#ffffff7a;-webkit-user-select:none;user-select:none;background:#101010;border-bottom:1px solid #ffffff14;padding:.6rem .75rem;font-size:.72rem;font-weight:600;position:sticky;top:0}._runTracesSortButton_33mp6_1576{max-width:100%;color:inherit;cursor:pointer;font:inherit;text-align:left;background:0 0;border:0;align-items:center;gap:.35rem;padding:0;transition:color .15s;display:inline-flex}._runTracesSortButton_33mp6_1576:hover{color:var(--text-secondary)}._runTracesSortButtonActive_33mp6_1595{color:#ffffffe6}._runTracesSortIcon_33mp6_1599{color:inherit;opacity:.76;font-size:.62rem;line-height:1}._runTracesTable_33mp6_1541 td{color:#ffffffc7;border-bottom:1px solid #ffffff0a;padding:.55rem .75rem}._runTracesTableRowClickable_33mp6_1612{cursor:pointer;transition:background-color .15s}._runTracesTableRowClickable_33mp6_1612:hover{background:#ffffff0a}._datasetRowMenuOpen_33mp6_1621{z-index:20;position:relative}._runTracesTableId_33mp6_1626{text-overflow:ellipsis;white-space:nowrap;max-width:200px;font-family:Geist Mono,ui-monospace,monospace;font-size:.75rem;overflow:hidden}._datasetActionsCell_33mp6_1635{width:40px;position:relative;overflow:visible}._datasetActionsCellOpen_33mp6_1641{z-index:30}._datasetMenuAnchor_33mp6_1645{z-index:1;justify-content:flex-end;width:100%;display:inline-flex;position:relative}._datasetActionsCellOpen_33mp6_1641 ._datasetMenuAnchor_33mp6_1645{z-index:40}._backButton_33mp6_1657{color:var(--text-tertiary);cursor:pointer;background:0 0;border:0;border-radius:0;align-self:flex-start;align-items:center;gap:.25rem;margin-bottom:.65rem;padding:0;font-family:inherit;font-size:.72rem;font-weight:500;line-height:1.2;transition:color .15s;display:inline-flex}._backButton_33mp6_1657:hover{color:var(--text-secondary)}._tagPillRemove_33mp6_1680{color:#ffffff80;cursor:pointer;background:0 0;border:none;margin-left:.35rem;padding:0;font-size:.75rem;line-height:1}._tagPillRemove_33mp6_1680:hover{color:#fff}._dataFieldLabel_33mp6_1695{color:#ffffff80;margin-bottom:.35rem;font-size:.8rem}._membershipPanel_33mp6_1701{background:#ffffff06;border:1px solid #ffffff14;grid-template-columns:minmax(170px,max-content) minmax(0,1fr);align-items:center;gap:.75rem;margin:0 0 .65rem;padding:.65rem .75rem;display:grid}._membershipPanelWithAction_33mp6_1712{grid-template-columns:minmax(170px,max-content) minmax(0,1fr) max-content}._traceDatasetControls_33mp6_1716{gap:.5rem;margin:0 0 .65rem;display:grid}._traceDatasetControls_33mp6_1716 ._membershipPanel_33mp6_1701{margin-bottom:0}._membershipHeader_33mp6_1726{justify-content:space-between;align-items:center;gap:.75rem;min-width:0;display:flex}._membershipTitle_33mp6_1734{color:#fafafa;font-size:.82rem;font-weight:600}._membershipMeta_33mp6_1740{color:var(--text-tertiary);margin-top:.12rem;font-size:.7rem}._membershipContent_33mp6_1746{min-width:0}._membershipList_33mp6_1750{flex-wrap:wrap;gap:.4rem;display:flex}._membershipAction_33mp6_1756{justify-content:flex-end;display:flex}._membershipActions_33mp6_1761{flex-wrap:wrap;justify-content:flex-end;gap:.5rem;display:flex}._membershipAction_33mp6_1756 ._primaryButton_33mp6_546,._membershipAction_33mp6_1756 ._secondaryButton_33mp6_466{align-items:center;height:28px;padding:0 .65rem;font-size:.74rem;text-decoration:none;display:inline-flex}._membershipPill_33mp6_1778{min-width:0;max-width:100%;min-height:24px;color:var(--text-secondary);background:#ffffff0a;border:1px solid #ffffff1a;align-items:center;gap:.3rem;padding:0 .35rem;font-size:.72rem;font-weight:600;transition:background .15s,border-color .15s,color .15s;display:inline-flex}._membershipPill_33mp6_1778:hover,._membershipPill_33mp6_1778:focus-within{color:#fafafa;background:#ffffff12;border-color:#ffffff29}._membershipPillText_33mp6_1804{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._membershipPillLink_33mp6_1811{min-width:0;color:inherit;text-overflow:ellipsis;white-space:nowrap;align-items:center;text-decoration:none;display:inline-flex;overflow:hidden}._membershipPillLink_33mp6_1811:hover{color:inherit;text-decoration:none}._membershipPillLink_33mp6_1811:focus{outline:none}._membershipRemoveButton_33mp6_1831{color:#ffffff8f;cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;width:16px;height:16px;padding:0;font-family:inherit;font-size:.9rem;line-height:1;display:inline-flex}._membershipRemoveButton_33mp6_1831:hover:not(:disabled){color:#fafafa;background:#ffffff0f}._membershipRemoveButton_33mp6_1831:disabled{cursor:default;opacity:.45}._membershipEmpty_33mp6_1857{color:var(--text-tertiary);white-space:nowrap;font-size:.76rem}@media (width<=760px){._membershipPanel_33mp6_1701,._membershipPanelWithAction_33mp6_1712{grid-template-columns:1fr}._membershipAction_33mp6_1756{justify-content:flex-start}._membershipEmpty_33mp6_1857{white-space:normal}}._modalOverlay_33mp6_1878{z-index:1000;background:#0009;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}._modalContent_33mp6_1888{background:#1a1a1a;border:1px solid #ffffff1f;border-radius:0;min-width:360px;max-width:480px;padding:1.5rem;box-shadow:0 8px 32px #0009}._modalTitle_33mp6_1898{margin:0 0 1rem;font-size:1rem;font-weight:600}._modalMessage_33mp6_1904{color:#fff9;margin:0 0 1rem;font-size:.85rem;line-height:1.4}._modalActions_33mp6_1911{justify-content:flex-end;gap:.5rem;margin-top:1rem;display:flex}._contextMenu_33mp6_1918{z-index:1000;pointer-events:auto;background:#1a1a1a;border:1px solid #ffffff1f;border-radius:0;min-width:120px;padding:.25rem 0;position:absolute;top:100%;right:0;box-shadow:0 4px 12px #0006}._contextMenuAbove_33mp6_1932{top:auto;bottom:calc(100% + .25rem)}._contextMenuItem_33mp6_1937{text-align:left;color:#ffffffd9;cursor:pointer;background:0 0;border:none;width:100%;padding:.5rem .75rem;font-size:.8rem;display:block}._contextMenuItem_33mp6_1937:hover{background:#ffffff0f}._contextMenuItemDanger_33mp6_1953{color:#ef4444}._paginationBar_33mp6_1957{justify-content:center;align-items:center;gap:.35rem;padding:.5rem;display:flex}._paginationBarToolbar_33mp6_1965{justify-content:flex-end;padding:0}._paginationIconButton_33mp6_1970{flex:0 0 28px;width:28px;height:28px;font-size:.78rem}._paginationLabel_33mp6_1977{color:#fff9;white-space:nowrap;padding:.25rem .45rem;font-size:.74rem}@media (width<=900px){._topBar_33mp6_13{grid-template-columns:minmax(0,1fr);align-items:stretch}._surfaceNav_33mp6_41{overflow-x:auto}._dataNav_33mp6_268{border-bottom:1px solid #ffffff14;border-right:0;flex-direction:row;align-self:auto;width:100%;min-height:0;padding:0 0 .75rem;overflow-x:auto}._dataLayout_33mp6_255>._dataNav_33mp6_268 ._dataNavItem_33mp6_317{flex:none;width:auto}._dataMain_33mp6_429{padding:0}._experimentNav_33mp6_279{min-width:0;max-width:none;width:100%!important}._experimentsLayout_33mp6_262{flex-direction:column}._experimentsMain_33mp6_2024{width:100%;margin-left:0}._sidebarResizeHandle_33mp6_294{display:none}._surfaceToolbar_33mp6_435,._surfaceBanner_33mp6_102,._detailHeader_33mp6_881,._traceHeader_33mp6_959,._setupHeader_33mp6_1123,._actionFooter_33mp6_1354{flex-direction:column;align-items:stretch}._tracesToolbarSearch_33mp6_443,._tracesToolbarRight_33mp6_501{flex-wrap:wrap;justify-content:flex-start;min-width:0;margin-left:0}._textInput_33mp6_451._traceSearchInput_33mp6_451{width:min(100%,240px)}._syncStatus_33mp6_212{justify-content:flex-start}._splitSurface_33mp6_781,._dataLayout_33mp6_255,._linkedExperimentRow_33mp6_1245,._detailGrid_33mp6_920,._evalDefinitionGrid_33mp6_1012,._evalSummaryHeader_33mp6_1051,._evalSummaryRow_33mp6_1052,._ideaMetaGrid_33mp6_1193,._setupGrid_33mp6_1144{grid-template-columns:1fr}._listPanel_33mp6_788,._detailPanel_33mp6_790{max-height:none}._runTracesTableWrap_33mp6_1541,._datasetsTableWrap_33mp6_1549{overflow-x:auto}}._wrapper_18moo_1{align-items:center;gap:.45rem;width:max-content;min-width:0;display:inline-flex}._label_18moo_9{color:var(--text-tertiary,#666);letter-spacing:.04em;text-transform:uppercase;white-space:nowrap;font-size:.72rem;font-weight:600}._dropdown_18moo_18{width:clamp(144px,18vw,280px)}._layout_12m7d_3{background:#0a0a0a;flex:1;min-height:100%;display:flex}._heroLogo_12m7d_10{opacity:.85;width:240px;height:auto}._headerLogo_12m7d_18{object-fit:contain;border-radius:0;flex-shrink:0;width:18px;height:18px}._container_12m7d_26{color:#fafafa;box-sizing:border-box;background:#0a0a0a;flex:1;min-width:0;min-height:100%;margin:0;padding:2rem;font-family:Geist,ui-sans-serif,system-ui,-apple-system,sans-serif;overflow-x:hidden}._headerRow_12m7d_44{border-bottom:1px solid #ffffff0f;justify-content:space-between;align-items:center;gap:.75rem;margin-bottom:.5rem;padding:.6rem 0;display:flex}._title_12m7d_54{color:#fff;white-space:nowrap;flex-shrink:0;margin:0;font-size:1rem;font-weight:500}._connectedBadge_12m7d_65{text-transform:uppercase;letter-spacing:1px;color:#00d4aa;background:#00d4aa1a;border:1px solid #00d4aa66;padding:.2rem .6rem;font-size:.65rem;font-weight:500}._disconnectedBadge_12m7d_76{text-transform:uppercase;letter-spacing:1px;color:#f5a623;background:#f5a6231a;border:1px solid #f5a62366;padding:.2rem .6rem;font-size:.65rem;font-weight:500}._systemTabs_12m7d_89{border-bottom:1px solid #ffffff0f;gap:.25rem;margin-bottom:.5rem;padding-bottom:0;display:flex;overflow-x:auto}._systemTab_12m7d_89{color:var(--text-tertiary);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;align-items:center;gap:.5rem;padding:.6rem 1rem;font-family:inherit;font-size:.85rem;font-weight:400;transition:color .15s,border-color .15s;display:flex}._systemTab_12m7d_89:hover{color:var(--text-secondary)}._systemTabActive_12m7d_121{color:#fff;border-bottom-color:#00d4aa}._systemTabName_12m7d_126{font-weight:400}._systemTabStatus_12m7d_130{text-transform:uppercase;letter-spacing:.5px;padding:.1rem .4rem;font-size:.6rem;font-weight:500}._systemStatus_in_progress_12m7d_138{color:#00d4aa;background:#00d4aa1a;border:1px solid #00d4aa4d}._systemStatus_completed_12m7d_144{color:#5b8def;background:#5b8def1a;border:1px solid #5b8def4d}._systemStatus_not_started_12m7d_150{color:var(--text-tertiary);background:#ffffff0a;border:1px solid #ffffff14}._subtitle_12m7d_156{color:var(--text-tertiary);margin-top:.15rem;font-size:.75rem;font-weight:400;line-height:1.4}._targetBadge_12m7d_164{color:var(--text-tertiary);white-space:nowrap;background:#ffffff0d;border:1px solid #ffffff14;border-radius:0;flex-shrink:0;padding:.1rem .4rem;font-size:.65rem}._grid_12m7d_177{grid-template-columns:repeat(3,1fr);gap:1.25rem;margin-bottom:3rem;display:grid}._card_12m7d_184{background:#ffffff08;border:1px solid #ffffff14;min-width:0;padding:1.5rem;transition:border-color .4s,box-shadow .4s;overflow:hidden}._card_12m7d_184:hover{border-color:#ffffff26}@keyframes _cardGlow_12m7d_1{0%{border-color:#00d4aacc;box-shadow:0 0 20px #00d4aa26,inset 0 0 20px #00d4aa08}to{box-shadow:none;border-color:#ffffff14}}@keyframes _badgePop_12m7d_1{0%{filter:brightness(1.8);transform:scale(1.3)}40%{transform:scale(.95)}to{filter:brightness();transform:scale(1)}}@keyframes _textHighlight_12m7d_1{0%{color:#00d4aa}to{color:var(--text-secondary)}}@keyframes _slideInFade_12m7d_1{0%{opacity:0;background:#00d4aa1f;transform:translateY(-8px)}40%{opacity:1;transform:translateY(0)}to{background:0 0}}@keyframes _diagramPulse_12m7d_1{0%{background:#00d4aa0f;border-color:#00d4aa80}to{background:#ffffff0a;border-color:#ffffff0f}}._cardFlash_12m7d_263{animation:1.2s ease-out forwards _cardGlow_12m7d_1}._badgeFlash_12m7d_267{animation:.5s cubic-bezier(.34,1.56,.64,1) forwards _badgePop_12m7d_1}._textFlash_12m7d_271{animation:1.2s ease-out forwards _textHighlight_12m7d_1}._rowSlideIn_12m7d_275{animation:.8s ease-out forwards _slideInFade_12m7d_1}._diagramFlash_12m7d_279{animation:1.2s ease-out forwards _diagramPulse_12m7d_1}._cardHeader_12m7d_283{align-items:center;gap:.5rem;margin-bottom:.5rem;display:flex}._cardTitle_12m7d_290{letter-spacing:-.2px;color:#fff;margin:0;font-size:1.1rem;font-weight:300}._bestAccuracyInline_12m7d_298{font-variant-numeric:tabular-nums;color:#00d4aa;margin-left:auto;font-size:.9rem;font-weight:500}._linearIssueLink_12m7d_306{max-width:100%;min-height:24px;color:var(--text-secondary);white-space:nowrap;background:#ffffff0a;border:1px solid #ffffff1a;align-items:center;gap:.3rem;padding:0 .35rem;font-size:.72rem;font-weight:600;text-decoration:none;display:inline-flex}._linearIssueLink_12m7d_306 span{text-overflow:ellipsis;min-width:0;overflow:hidden}._linearIssueLink_12m7d_306:hover{color:#fafafa;background:#ffffff12;border-color:#ffffff29}._linearIssueLink_12m7d_306 img{object-fit:contain;width:14px;height:14px;display:block}._statusBadge_12m7d_341{text-transform:uppercase;letter-spacing:1px;flex-shrink:0;padding:.2rem .6rem;font-size:.6rem;font-weight:500;display:inline-block}._detailTitleStack_12m7d_351{flex-direction:column;gap:.35rem;min-width:0;display:flex}._runProgressBlock_12m7d_358{background:#ffffff08;border:1px solid #ffffff14;margin-bottom:1rem;padding:.75rem}._runProgressHeader_12m7d_365{color:var(--text-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;align-items:center;gap:1rem;margin-bottom:.45rem;font-size:.76rem;display:flex}._runProgressTrack_12m7d_376{background:#ffffff14;height:8px;overflow:hidden}._runProgressFill_12m7d_382{background:#00d4aa;height:100%}._runMetaGrid_12m7d_387{grid-template-columns:repeat(2,minmax(0,1fr));gap:.65rem;margin-bottom:1rem;display:grid}._runMetaCell_12m7d_394{background:#ffffff06;border:1px solid #ffffff12;min-width:0;padding:.6rem .65rem}._runMetaLabel_12m7d_401{color:var(--text-tertiary);letter-spacing:.04em;text-transform:uppercase;font-size:.65rem;font-weight:600;display:block}._runMetaValue_12m7d_410{min-width:0;color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;margin-top:.18rem;font-size:.78rem;display:block;overflow:hidden}._detailEmpty_12m7d_421{color:var(--text-tertiary);background:#ffffff06;border:1px solid #ffffff12;padding:.75rem;font-size:.8rem}._metricsTable_12m7d_431{border-collapse:collapse;table-layout:fixed;width:100%;margin-bottom:1rem;font-size:.8rem}._metricsTable_12m7d_431 th,._metricsTable_12m7d_431 td{text-align:center;border-bottom:1px solid #ffffff0f;padding:.5rem}._metricsTable_12m7d_431 th{text-transform:uppercase;letter-spacing:.5px;color:var(--text-tertiary);cursor:help;text-underline-offset:3px;background:0 0;font-size:.7rem;font-weight:500;-webkit-text-decoration:underline dotted #fafafa33;text-decoration:underline dotted #fafafa33}._metricsTable_12m7d_431 td{color:var(--text-primary);font-variant-numeric:tabular-nums}._iterRowClickable_12m7d_463{cursor:pointer;transition:background .15s}._iterRowClickable_12m7d_463:hover{background:#ffffff0a}._iterRowExpanded_12m7d_472{background:#ffffff08}._iterRowExpanded_12m7d_472 td{border-bottom-color:#0000}._bestRow_12m7d_480{background:#00d4aa0f}._bestRow_12m7d_480._iterRowClickable_12m7d_463:hover{background:#00d4aa1a}._bestRow_12m7d_480 td{color:#00d4aa;font-weight:500}._iterDetailRow_12m7d_493 td{border-bottom:1px solid #ffffff0f;padding:0}._cardFooter_12m7d_498{color:var(--text-tertiary);letter-spacing:.2px;flex-wrap:wrap;justify-content:space-between;gap:.5rem .9rem;padding-top:.35rem;font-size:.7rem;display:flex}._footerUpdated_12m7d_509{margin-left:auto}._chartContainer_12m7d_515{background:#ffffff08;border:1px solid #ffffff14;padding:1.5rem}._chartTitle_12m7d_521{letter-spacing:-.3px;color:#fff;margin:0 0 1.25rem;font-size:1.25rem;font-weight:300}._chart_12m7d_515{flex-direction:column;gap:.35rem;display:flex}._chartRow_12m7d_535{align-items:center;gap:1rem;height:32px;display:flex}._chartLabel_12m7d_542{text-align:right;width:180px;color:var(--text-secondary);text-overflow:ellipsis;white-space:nowrap;flex-shrink:0;font-size:.75rem;font-weight:400;overflow:hidden}._chartBarContainer_12m7d_554{flex:1;align-items:center;gap:.5rem;display:flex}._chartBarTrack_12m7d_561{background:0 0;flex:1;height:24px;position:relative}._chartBar_12m7d_554{background:#00d4aa;height:100%;transition:width .3s}._chartRowClickable_12m7d_574{cursor:pointer;transition:background .15s}._chartRowClickable_12m7d_574:hover{background:#ffffff0a}._chartValue_12m7d_583{white-space:nowrap;color:var(--text-primary);font-variant-numeric:tabular-nums;text-align:right;flex-shrink:0;width:52px;font-size:.85rem;font-weight:500}._metricsTable_12m7d_431{border-collapse:collapse;width:100%;font-size:.85rem}._metricsTableHeader_12m7d_600{text-transform:uppercase;letter-spacing:.05em;color:var(--text-tertiary);text-align:left;border-bottom:1px solid #ffffff14;padding:.4rem .75rem;font-size:.7rem;font-weight:500}._metricsTableRow_12m7d_611{border-bottom:1px solid #ffffff0a}._metricsTableRow_12m7d_611:hover{background:#ffffff08}._metricsTableLabel_12m7d_619{color:var(--text-secondary);white-space:nowrap;padding:.5rem .75rem;font-weight:400}._metricsTableValue_12m7d_626{text-align:right;font-variant-numeric:tabular-nums;color:var(--text-primary);white-space:nowrap;padding:.5rem .75rem;font-weight:600}._metricsTableBarCell_12m7d_635{padding:.5rem .75rem}._metricsTableBarTrack_12m7d_639{background:#ffffff0f;border-radius:0;height:6px;overflow:hidden}._metricsTableBar_12m7d_635{background:#00d4aa;border-radius:0;height:100%;transition:width .3s}._chartItems_12m7d_653{color:var(--text-tertiary);text-align:right;font-variant-numeric:tabular-nums;flex-shrink:0;width:32px;font-size:.65rem}._noData_12m7d_662{color:var(--text-tertiary);text-align:center;padding:3rem;font-size:.9rem}._runSection_12m7d_669{margin-bottom:.75rem}._runSection_12m7d_669:last-child{margin-bottom:0}._runLabel_12m7d_677{text-transform:uppercase;letter-spacing:.5px;color:var(--text-tertiary);margin-bottom:.3rem;font-size:.65rem;font-weight:500;display:block}._treeForest_12m7d_689{margin-bottom:3rem;padding-bottom:2rem;overflow:auto hidden}._treeSvg_12m7d_696{flex-shrink:0;display:block}._treeNodeCard_12m7d_703{box-sizing:border-box;cursor:pointer;text-align:left;color:#fafafa;background:#0d0d0d;border:1px solid #ffffff14;flex-direction:column;width:100%;height:100%;padding:.5rem .6rem;font-family:Geist,ui-sans-serif,system-ui,-apple-system,sans-serif;transition:border-color .2s,box-shadow .2s,background .2s;display:flex;overflow:hidden}._treeNodeCard_12m7d_703:hover{background:#131313;border-color:#fff3}._treeNodeSelected_12m7d_733{background:#0b1210;border-color:#00d4aa80;box-shadow:0 0 12px #00d4aa1a}._treeNodeBest_12m7d_739{box-shadow:0 0 0 1px #00d4aa4d,0 0 16px #00d4aa14}@keyframes _nodeHighlight_12m7d_1{0%{border-color:#5b8def;box-shadow:0 0 24px #5b8def66,inset 0 0 12px #5b8def0d}70%{border-color:#5b8def99;box-shadow:0 0 16px #5b8def33}to{box-shadow:none;border-color:#ffffff14}}._treeNodeHighlight_12m7d_762{animation:5s ease-out forwards _nodeHighlight_12m7d_1}._treeNodeName_12m7d_766{color:#fff;-webkit-line-clamp:2;-webkit-box-orient:vertical;margin-bottom:.15rem;font-size:.65rem;font-weight:400;line-height:1.3;display:-webkit-box;overflow:hidden}._treeNodeBadgeRow_12m7d_778{align-items:center;gap:.3rem;margin-bottom:.15rem;display:flex}._treeNodeBadge_12m7d_778{text-transform:uppercase;letter-spacing:.5px;flex-shrink:0;padding:.1rem .3rem;font-size:.5rem;font-weight:500;display:inline-block}._treeNodeElapsed_12m7d_795{color:var(--text-tertiary);font-variant-numeric:tabular-nums;font-size:.5rem}._treeNodeScoreRow_12m7d_801{align-items:center;min-height:1.2rem;margin-bottom:.25rem;display:flex}._treeNodeIssueRow_12m7d_808{min-width:0;margin-top:auto}._treeNodeIssueRow_12m7d_808 ._linearIssueLink_12m7d_306{width:100%;min-height:22px;padding:0 .28rem;font-size:.58rem}._treeNodeIssueRow_12m7d_808 ._linearIssueLink_12m7d_306 img{width:12px;height:12px}._treeNodeAccuracy_12m7d_825{font-variant-numeric:tabular-nums;color:#00d4aa;letter-spacing:-.3px;font-size:1rem;font-weight:600}._treeNodeItems_12m7d_833{color:var(--text-tertiary);font-variant-numeric:tabular-nums;margin-left:.3rem;font-size:.6rem}._treeNodeLoading_12m7d_840{align-items:center;gap:.4rem;display:flex}@keyframes _pulse_12m7d_1{0%,to{opacity:.3}50%{opacity:1}}._treeNodePulse_12m7d_856{background:#f5a623;border-radius:0;width:6px;height:6px;animation:1.5s ease-in-out infinite _pulse_12m7d_1}._treeNodeLoadingText_12m7d_864{color:var(--text-tertiary);font-size:.7rem;font-weight:400}._detailPanelHeader_12m7d_872{align-items:center;gap:.5rem;margin-bottom:1.25rem;display:flex}._detailPanelTitle_12m7d_879{letter-spacing:-.3px;color:#fff;margin:0;font-size:1.3rem;font-weight:300}._tableWrapper_ftfpm_3{background:#ffffff06;border:1px solid #ffffff14;border-radius:0;margin:1rem 0 0;overflow-x:auto}._table_ftfpm_3{border-collapse:collapse;width:100%;font-family:Geist,ui-sans-serif,system-ui,sans-serif;font-size:.8rem}._noData_ftfpm_18{color:#ffffff4d;text-align:center;padding:2rem 0;font-style:italic}._table_ftfpm_3 thead{z-index:1;background:#101010;border-bottom:1px solid #ffffff1a;position:sticky;top:0}._table_ftfpm_3 th{text-align:right;color:#ffffff7a;letter-spacing:0;white-space:nowrap;-webkit-user-select:none;user-select:none;padding:.6rem .75rem;font-size:.72rem;font-weight:600}._thRank_ftfpm_46{width:2rem;text-align:center!important}._thName_ftfpm_51{min-width:180px;text-align:left!important}._thStatus_ftfpm_56{width:2.5rem;text-align:center!important}._thMetric_ftfpm_61{cursor:pointer;min-width:5rem;transition:color .15s}._thMetric_ftfpm_61:hover{color:#fffc}._thPrimary_ftfpm_71{color:#ffffff9e}._thPrimary_ftfpm_71:hover{color:#ffffffdb}._thSorted_ftfpm_79{color:#ffffffe6!important}._thPrimary_ftfpm_71._thSorted_ftfpm_79{color:#ffffffeb!important}._thLabel_ftfpm_87{margin-right:.3rem}._sortArrow_ftfpm_91{vertical-align:middle;opacity:.76;font-size:.62rem}._thItems_ftfpm_97{text-align:right;width:3rem}._thStarted_ftfpm_102{width:11rem;text-align:left!important}._row_ftfpm_109{cursor:pointer;will-change:transform;border-bottom:1px solid #ffffff0a;transition:background-color .15s}._row_ftfpm_109:hover{background:#ffffff0a}._rowBest_ftfpm_120{background:#ffffff0b}._rowBest_ftfpm_120:hover{background:#ffffff13}._rowSelected_ftfpm_128{box-shadow:inset 2px 0 #ffffff6b;background:#ffffff13!important}._table_ftfpm_3 td{text-align:right;color:#ffffffc7;font-variant-numeric:tabular-nums;padding:.55rem .75rem}._tdRank_ftfpm_142{color:#ffffff4d;font-size:.72rem;text-align:center!important}._tdName_ftfpm_148{align-items:center;gap:.5rem;display:flex;text-align:left!important}._expName_ftfpm_155{color:#ffffffe6;font-weight:450}._bestBadge_ftfpm_160{text-transform:uppercase;letter-spacing:.5px;color:#ffffffe0;background:#ffffff14;border:1px solid #ffffff29;border-radius:0;flex-shrink:0;padding:.1rem .35rem;font-size:.55rem;font-weight:600}._tdStatus_ftfpm_173{text-align:center!important}._statusDot_ftfpm_177{border-radius:0;width:7px;height:7px;display:inline-block}._tdMetric_ftfpm_184{font-family:Geist Mono,ui-monospace,monospace;font-size:.8rem}._tdPrimary_ftfpm_189{color:#ffffffeb;font-weight:500}._metricEmpty_ftfpm_198{color:#ffffff26}._tdItems_ftfpm_202{color:#ffffff4d;font-size:.72rem}._tdStarted_ftfpm_207{color:#ffffff73;white-space:nowrap;font-size:.72rem;text-align:left!important}:root{--bg-primary:#fff;--bg-chat:#fff;--bubble-user:#007aff;--bubble-user-text:#fff;--bubble-assistant:#e5e5ea;--bubble-assistant-text:#000;--header-bg:#f7f7f7eb;--header-border:#c8c8cc;--input-bg:#fff;--input-border:#c8c8cc;--text-secondary:#8e8e93;--font-family:-apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "Helvetica Neue", Helvetica, Arial, sans-serif}@media (prefers-color-scheme:dark){:root{--bg-primary:#000;--bg-chat:#000;--bubble-user:#0b84fe;--bubble-user-text:#fff;--bubble-assistant:#26252a;--bubble-assistant-text:#fff;--header-bg:#1c1c1eeb;--header-border:#38383a;--input-bg:#1c1c1e;--input-border:#38383a;--text-secondary:#8e8e93}}:root{--bg-primary:#000;--bg-chat:#000;--text-primary:#fafafa;--text-secondary:#fafafab3;--text-tertiary:#fafafa80}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;font-size:18px;font-family:var(--font-family);background:var(--bg-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#root{height:100%}
|