@percepta/kaizen 0.5.1 → 0.7.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.
Files changed (140) hide show
  1. package/README.md +54 -126
  2. package/agent/claude-command.md +23 -0
  3. package/agent/evals.md +41 -0
  4. package/agent/overview.md +53 -0
  5. package/agent/variant-builder.md +22 -0
  6. package/agent/views.md +51 -0
  7. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/BUILD_ID +1 -1
  8. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/build-manifest.json +22 -22
  9. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/prerender-manifest.json +3 -3
  10. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/routes-manifest.json +42 -10
  11. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/chunks/27.js +1 -0
  12. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/chunks/516.js +8 -0
  13. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/chunks/913.js +1 -0
  14. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/middleware-build-manifest.js +1 -1
  15. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/404.html +1 -1
  16. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/500.html +1 -1
  17. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/benchmarks.html +1 -1
  18. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/benchmarks.js.nft.json +1 -1
  19. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/data/[[...path]].html +1 -0
  20. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/data/[[...path]].js.nft.json +1 -0
  21. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/eval.html +1 -1
  22. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/eval.js.nft.json +1 -1
  23. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/experiments/[[...path]].html +1 -0
  24. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/experiments/[[...path]].js.nft.json +1 -0
  25. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/ideas.html +1 -1
  26. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/ideas.js.nft.json +1 -1
  27. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-action.js +1 -0
  28. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-action.js.nft.json +1 -0
  29. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-dataset-item.js +1 -1
  30. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-dataset-item.js.nft.json +1 -1
  31. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-dataset-mutation.js +1 -0
  32. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-dataset-mutation.js.nft.json +1 -0
  33. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-dataset.js +1 -1
  34. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-dataset.js.nft.json +1 -1
  35. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-datasets.js +1 -1
  36. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-datasets.js.nft.json +1 -1
  37. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-trace.js +1 -1
  38. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-trace.js.nft.json +1 -1
  39. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-traces.js +1 -0
  40. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/langfuse-traces.js.nft.json +1 -0
  41. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/linear-ideas.js +2 -2
  42. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/linear-ideas.js.nft.json +1 -1
  43. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/run-events.js +1 -1
  44. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/run-events.js.nft.json +1 -1
  45. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/run-failures.js +1 -1
  46. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/run-failures.js.nft.json +1 -1
  47. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/run-traces.js +1 -0
  48. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/run-traces.js.nft.json +1 -0
  49. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/runs.js +2 -2
  50. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/runs.js.nft.json +1 -1
  51. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/systems.js +2 -2
  52. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/systems.js.nft.json +1 -1
  53. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/trace-renderer.js +1 -0
  54. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/api/trace-renderer.js.nft.json +1 -0
  55. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/index.html +1 -1
  56. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/index.js.nft.json +1 -1
  57. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages-manifest.json +7 -2
  58. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/SCF0o7YxElB9rzWaOohsA/_buildManifest.js +1 -0
  59. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/253-85c76c34f33c9604.js +8 -0
  60. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/{benchmarks-ea3ad9fe4e28dd88.js → benchmarks-30a17b7659010b8c.js} +1 -1
  61. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/data/[[...path]]-e5f4083fe9ffe429.js +1 -0
  62. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/eval-160237a604b47416.js +1 -0
  63. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/experiments/[[...path]]-91e47a4893093600.js +1 -0
  64. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/ideas-96e58e4624952e26.js +1 -0
  65. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/index-d3306bb6f5d7d235.js +1 -0
  66. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/css/cd3873236eb77caa.css +1 -0
  67. package/dashboard/.next/standalone/packages/kaizen/package.json +6 -3
  68. package/dashboard/.next/standalone/packages/kaizen/shared/workspace-paths.js +84 -0
  69. package/dist/commands/create-view.js +58 -0
  70. package/dist/commands/create-view.js.map +1 -0
  71. package/dist/commands/guide.js +66 -0
  72. package/dist/commands/guide.js.map +1 -0
  73. package/dist/commands/ideas.js +4 -8
  74. package/dist/commands/ideas.js.map +1 -1
  75. package/dist/commands/init-system.js +22 -20
  76. package/dist/commands/init-system.js.map +1 -1
  77. package/dist/commands/init.js +28 -64
  78. package/dist/commands/init.js.map +1 -1
  79. package/dist/commands/log.js +5 -11
  80. package/dist/commands/log.js.map +1 -1
  81. package/dist/commands/rebuild.js +7 -9
  82. package/dist/commands/rebuild.js.map +1 -1
  83. package/dist/commands/run.js +5 -9
  84. package/dist/commands/run.js.map +1 -1
  85. package/dist/commands/studio.js +3 -3
  86. package/dist/commands/studio.js.map +1 -1
  87. package/dist/index.js +17 -21
  88. package/dist/index.js.map +1 -1
  89. package/dist/lib/cli.js +20 -0
  90. package/dist/lib/cli.js.map +1 -0
  91. package/dist/lib/events.js.map +1 -1
  92. package/dist/lib/fs-utils.js +3 -27
  93. package/dist/lib/fs-utils.js.map +1 -1
  94. package/dist/lib/leaderboard.js +1 -1
  95. package/dist/lib/leaderboard.js.map +1 -1
  96. package/dist/lib/paths.js +3 -3
  97. package/dist/lib/paths.js.map +1 -1
  98. package/dist/lib/promotion.js.map +1 -1
  99. package/dist/lib/run-dir.js +1 -1
  100. package/dist/lib/run-dir.js.map +1 -1
  101. package/dist/lib/runner.js +6 -5
  102. package/dist/lib/runner.js.map +1 -1
  103. package/dist/lib/system.js +4 -2
  104. package/dist/lib/system.js.map +1 -1
  105. package/dist/package.js +6 -3
  106. package/dist/shared/view-types.d.ts +67 -0
  107. package/dist/shared/view-types.d.ts.map +1 -0
  108. package/dist/shared/workspace-paths.js +84 -0
  109. package/dist/shared/workspace-paths.js.map +1 -0
  110. package/dist/types.d.ts +3 -10
  111. package/dist/types.d.ts.map +1 -1
  112. package/package.json +6 -3
  113. package/shared/view-types.d.ts +69 -0
  114. package/shared/view-types.js +1 -0
  115. package/shared/workspace-paths.d.ts +19 -0
  116. package/shared/workspace-paths.js +84 -0
  117. package/templates/system/eval.py +13 -6
  118. package/templates/system/eval.ts +11 -5
  119. package/templates/system/rubric.md +1 -1
  120. package/templates/system/system.md +6 -5
  121. package/templates/view/dataset-item.tsx +63 -0
  122. package/templates/view/trace.tsx +10 -0
  123. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/chunks/424.js +0 -3
  124. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/data.html +0 -1
  125. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/data.js.nft.json +0 -1
  126. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/experiments.html +0 -1
  127. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/server/pages/[system]/experiments.js.nft.json +0 -1
  128. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/374-421036d63d323cc9.js +0 -3
  129. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/data-57686b9546f2794a.js +0 -1
  130. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/eval-d9b5f1b8db0f0f90.js +0 -1
  131. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/experiments-4d2122d6ada9a04a.js +0 -1
  132. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/[system]/ideas-6c1ff7f9e0da750b.js +0 -1
  133. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/chunks/pages/index-1556edd8356dd19f.js +0 -1
  134. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/css/e75cf1946c214544.css +0 -1
  135. package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/q7hDbHI4NR8DdLDV3kWYh/_buildManifest.js +0 -1
  136. package/dist/lib/env.js +0 -2
  137. package/dist/shared/env.js +0 -4
  138. package/templates/workspace/.claude/agents/variant-builder.md +0 -51
  139. package/templates/workspace/.claude/commands/kaizen.md +0 -65
  140. /package/dashboard/.next/standalone/packages/kaizen/dashboard/.next/static/{q7hDbHI4NR8DdLDV3kWYh → SCF0o7YxElB9rzWaOohsA}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@percepta/kaizen",
3
- "version": "0.5.1",
3
+ "version": "0.7.0",
4
4
  "description": "Automated AI researcher that improves AI systems",
5
5
  "keywords": [
6
6
  "ai",
@@ -14,6 +14,7 @@
14
14
  "kaizen": "./bin/kaizen.js"
15
15
  },
16
16
  "files": [
17
+ "agent",
17
18
  "bin",
18
19
  "dashboard/.next/standalone",
19
20
  "dist",
@@ -37,6 +38,7 @@
37
38
  "access": "public"
38
39
  },
39
40
  "dependencies": {
41
+ "esbuild": "^0.25.0",
40
42
  "tsx": "^4.21.0",
41
43
  "yaml": "^2.8.2"
42
44
  },
@@ -70,8 +72,9 @@
70
72
  "typecheck:dashboard": "tsc -p dashboard --noEmit",
71
73
  "test": "vitest run",
72
74
  "dev": "tsx src/index.ts",
73
- "dev:studio": "KAIZEN_WORKSPACE=examples/legacy-workspace next dev dashboard --webpack --port 6789",
74
- "dev:next": "KAIZEN_WORKSPACE=examples/legacy-workspace next dev dashboard --webpack --port 6789",
75
+ "dev:studio": "KAIZEN_DEMO_MODE=1 KAIZEN_WORKSPACE=$PWD/examples/demo-workspace next dev dashboard --webpack --port 6789",
76
+ "dev:next": "KAIZEN_DEMO_MODE=1 KAIZEN_WORKSPACE=$PWD/examples/demo-workspace next dev dashboard --webpack --port 6789",
77
+ "seed:demo-data": "node scripts/seed-demo-traces.mjs --workspace $PWD/examples/demo-workspace",
75
78
  "kaizen": "tsx src/index.ts"
76
79
  }
77
80
  }
@@ -0,0 +1,69 @@
1
+ /** Data shape passed to custom trace renderers. */
2
+ export interface TraceData {
3
+ id?: string;
4
+ name?: string;
5
+ tags?: string[];
6
+ timestamp?: string;
7
+ metadata?: unknown;
8
+ input?: unknown;
9
+ output?: unknown;
10
+ [key: string]: unknown;
11
+ }
12
+
13
+ /** Props contract for custom trace renderer components. */
14
+ export interface TraceRendererProps {
15
+ trace: TraceData;
16
+ context: TraceRendererContext;
17
+ actions: TraceRendererActions;
18
+ }
19
+
20
+ export interface DatasetItemRendererProps {
21
+ datasetItem: DatasetItemData;
22
+ trace?: TraceData | null;
23
+ context: TraceRendererContext;
24
+ actions: DatasetItemRendererActions;
25
+ }
26
+
27
+ export interface DatasetItemData {
28
+ id: string;
29
+ input?: unknown;
30
+ expectedOutput?: unknown;
31
+ metadata?: Record<string, unknown> | null;
32
+ [key: string]: unknown;
33
+ }
34
+
35
+ export interface TraceRendererContext {
36
+ systemId: string;
37
+ surface: "trace" | "dataset-item" | "run-trace";
38
+ datasetName?: string | null;
39
+ runId?: string | null;
40
+ }
41
+
42
+ export interface TraceRendererActions {
43
+ createScore(input: {
44
+ traceId?: string;
45
+ name: string;
46
+ value: number | string | boolean;
47
+ comment?: string;
48
+ metadata?: Record<string, unknown>;
49
+ }): Promise<unknown>;
50
+ }
51
+
52
+ export interface DatasetItemRendererActions extends TraceRendererActions {
53
+ updateDatasetItem(input: {
54
+ datasetName?: string;
55
+ itemId?: string;
56
+ expectedOutput?: unknown;
57
+ metadata?: Record<string, unknown> | null;
58
+ input?: unknown;
59
+ sourceTraceId?: string | null;
60
+ status?: string | null;
61
+ }): Promise<unknown>;
62
+ createDatasetRunItem(input: {
63
+ datasetItemId?: string;
64
+ traceId?: string;
65
+ runName: string;
66
+ runDescription?: string;
67
+ metadata?: Record<string, unknown>;
68
+ }): Promise<unknown>;
69
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ export declare const KAIZEN_DIR = "kaizen";
2
+ export declare const KAIZEN_CONFIG = "config.ts";
3
+ export declare const KAIZEN_STATE_DIR = ".kaizen";
4
+ export declare const KAIZEN_SYSTEMS_DIR = "systems";
5
+
6
+ export declare function kaizenDir(workspaceRoot: string): string;
7
+ export declare function kaizenConfigPath(workspaceRoot: string): string;
8
+ export declare function kaizenSystemsDir(workspaceRoot: string): string;
9
+ export declare function kaizenSystemDir(
10
+ workspaceRoot: string,
11
+ systemId: string,
12
+ ): string;
13
+ export declare function kaizenSystemPath(
14
+ workspaceRoot: string,
15
+ systemId: string,
16
+ ): string;
17
+ export declare function defaultKaizenStateDir(workspaceRoot: string): string;
18
+ export declare function resolveKaizenStateDir(workspaceRoot: string): string;
19
+ export declare function primaryWorktreeRoot(workspaceRoot: string): string;
@@ -0,0 +1,84 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { realpathSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+
5
+ export const KAIZEN_DIR = "kaizen";
6
+ export const KAIZEN_CONFIG = "config.ts";
7
+ export const KAIZEN_STATE_DIR = ".kaizen";
8
+ export const KAIZEN_SYSTEMS_DIR = "systems";
9
+
10
+ export function kaizenDir(workspaceRoot) {
11
+ return join(workspaceRoot, KAIZEN_DIR);
12
+ }
13
+
14
+ export function kaizenConfigPath(workspaceRoot) {
15
+ return join(kaizenDir(workspaceRoot), KAIZEN_CONFIG);
16
+ }
17
+
18
+ export function kaizenSystemsDir(workspaceRoot) {
19
+ return join(kaizenDir(workspaceRoot), KAIZEN_SYSTEMS_DIR);
20
+ }
21
+
22
+ export function kaizenSystemDir(workspaceRoot, systemId) {
23
+ return join(kaizenSystemsDir(workspaceRoot), systemId);
24
+ }
25
+
26
+ export function kaizenSystemPath(workspaceRoot, systemId) {
27
+ return join(kaizenSystemDir(workspaceRoot, systemId), "system.md");
28
+ }
29
+
30
+ export function defaultKaizenStateDir(workspaceRoot) {
31
+ return join(primaryWorktreeRoot(workspaceRoot), KAIZEN_DIR, KAIZEN_STATE_DIR);
32
+ }
33
+
34
+ export function resolveKaizenStateDir(workspaceRoot) {
35
+ const raw = process.env.KAIZEN_STATE_DIR;
36
+ return raw
37
+ ? resolve(workspaceRoot, raw)
38
+ : defaultKaizenStateDir(workspaceRoot);
39
+ }
40
+
41
+ export function primaryWorktreeRoot(workspaceRoot) {
42
+ const normalizedWorkspace = canonicalPath(workspaceRoot);
43
+ const gitRoot = gitTopLevel(normalizedWorkspace);
44
+ if (!gitRoot || canonicalPath(gitRoot) !== normalizedWorkspace) {
45
+ return normalizedWorkspace;
46
+ }
47
+
48
+ try {
49
+ const out = execFileSync(
50
+ "git",
51
+ ["-C", normalizedWorkspace, "worktree", "list", "--porcelain"],
52
+ { encoding: "utf-8", stdio: ["ignore", "pipe", "ignore"] },
53
+ );
54
+ const first = out.split("\n").find((line) => line.startsWith("worktree "));
55
+ return first
56
+ ? canonicalPath(first.slice("worktree ".length))
57
+ : normalizedWorkspace;
58
+ } catch {
59
+ return normalizedWorkspace;
60
+ }
61
+ }
62
+
63
+ function gitTopLevel(workspaceRoot) {
64
+ try {
65
+ return execFileSync(
66
+ "git",
67
+ ["-C", workspaceRoot, "rev-parse", "--show-toplevel"],
68
+ {
69
+ encoding: "utf-8",
70
+ stdio: ["ignore", "pipe", "ignore"],
71
+ },
72
+ ).trim();
73
+ } catch {
74
+ return null;
75
+ }
76
+ }
77
+
78
+ function canonicalPath(path) {
79
+ try {
80
+ return realpathSync(path);
81
+ } catch {
82
+ return resolve(path);
83
+ }
84
+ }
@@ -7,7 +7,7 @@ well-formed event stream:
7
7
  {"type": "start", "n": <int>, "eval_version": <int>, "dataset_version": "<str>"}
8
8
  {"type": "item", "id": "<str>", "score": <float in [0,1]>, "breakdown": {...}, "trace_id": "<str|null>"}
9
9
  ... one item event per dataset item ...
10
- {"type": "complete", "score": <float>, "breakdown": {...}, "worst_traces": [...]}
10
+ {"type": "complete", "score": <float>, "n": <int>, "breakdown": {...}, "worst_traces": [...]}
11
11
 
12
12
  If something goes wrong, emit `{"type": "error", "message": "<str>"}` and exit non-zero.
13
13
  The supervisor will record the run as `crashed` if no `complete` event is seen.
@@ -19,8 +19,9 @@ For production evals backed by Langfuse, keep the NDJSON stream as the required
19
19
  Kaizen contract and also persist results back to Langfuse as a best-effort side
20
20
  effect: load the versioned dataset, run the system to create a fresh trace for
21
21
  each item, link that trace to the dataset item in a dataset run, and write the
22
- primary metric as a score on the trace. Include that fresh trace id in the
23
- Kaizen item event so failure analysis can jump directly to Langfuse.
22
+ primary metric as a score on the trace. Treat --dataset as the Langfuse dataset
23
+ name unless system.md says otherwise. Include that fresh trace id in the Kaizen
24
+ item event so failure analysis can jump directly to Langfuse.
24
25
  """
25
26
  from __future__ import annotations
26
27
 
@@ -41,8 +42,14 @@ def emit(out, event: dict[str, Any]) -> None:
41
42
  out.flush()
42
43
 
43
44
 
44
- def iter_items(dataset_version: str, max_items: int | None) -> Iterator[dict[str, Any]]:
45
- """Yield dataset items. Replace with your real loader."""
45
+ def load_items(dataset_name: str, max_items: int | None) -> Iterator[dict[str, Any]]:
46
+ """Yield dataset items.
47
+
48
+ Replace this with your real dataset loader. For Langfuse-backed evals, list
49
+ items from dataset_name and yield stable ids, inputs, expected outputs, and
50
+ any metadata your scorer needs.
51
+ """
52
+ del dataset_name
46
53
  items = [
47
54
  {"id": "demo-1", "input": "hello", "expected": "hi"},
48
55
  {"id": "demo-2", "input": "world", "expected": "world"},
@@ -87,7 +94,7 @@ def main() -> int:
87
94
  else:
88
95
  out = sys.stdout
89
96
 
90
- items = list(iter_items(args.dataset, args.max_items))
97
+ items = list(load_items(args.dataset, args.max_items))
91
98
  emit(out, {
92
99
  "type": "start",
93
100
  "n": len(items),
@@ -8,14 +8,16 @@
8
8
  * {"type":"start","n":<int>,"eval_version":<int>,"dataset_version":"<str>"}
9
9
  * {"type":"item","id":"<str>","score":<float in [0,1]>,"breakdown":{},"trace_id":"<str|null>"}
10
10
  * ... one item event per dataset item ...
11
- * {"type":"complete","score":<float>,"breakdown":{},"worst_traces":[]}
11
+ * {"type":"complete","score":<float>,"n":<int>,"breakdown":{},"worst_traces":[]}
12
12
  *
13
13
  * For Langfuse-backed production evals, keep the NDJSON stream as the required
14
14
  * Kaizen contract and also persist results back to Langfuse as a best-effort
15
15
  * side effect: load the versioned dataset, run the system to create a fresh
16
16
  * trace for each item, link that trace to the dataset item in a dataset run,
17
- * and write the primary metric as a score on the trace. Include that fresh
18
- * trace id in the Kaizen item event so failure analysis can jump to Langfuse.
17
+ * and write the primary metric as a score on the trace. Treat --dataset as the
18
+ * Langfuse dataset name unless your system.md says otherwise. Include each
19
+ * fresh trace id in the Kaizen item event so failure analysis can jump to
20
+ * Langfuse.
19
21
  */
20
22
  import { closeSync, writeSync } from "node:fs";
21
23
 
@@ -82,7 +84,11 @@ function parseArgs(argv: string[]): EvalArgs {
82
84
  return args;
83
85
  }
84
86
 
85
- function iterItems(maxItems: number | null): DemoItem[] {
87
+ function loadItems(datasetName: string, maxItems: number | null): DemoItem[] {
88
+ void datasetName;
89
+ // Replace this with your real dataset loader. For Langfuse-backed evals,
90
+ // list dataset items from --dataset and return objects with stable ids,
91
+ // inputs, expected outputs, and any metadata your scorer needs.
86
92
  const items = [
87
93
  { id: "demo-1", input: "hello", expected: "hi" },
88
94
  { id: "demo-2", input: "world", expected: "world" },
@@ -111,7 +117,7 @@ function average(values: number[]): number {
111
117
 
112
118
  async function main(): Promise<void> {
113
119
  const args = parseArgs(process.argv.slice(2));
114
- const items = iterItems(args.maxItems);
120
+ const items = loadItems(args.dataset, args.maxItems);
115
121
 
116
122
  emit(args.outFd, {
117
123
  type: "start",
@@ -25,4 +25,4 @@ The judge is itself an LLM system. Calibrate it against human labels until they
25
25
 
26
26
  ## Calibration
27
27
 
28
- Run the judge on 30 items that also have human labels. Iterate the rubric/prompt until agreement ≥ 95%. Track in `.kaizen/runs/<system>/<judge_run_id>/`.
28
+ Run the judge on 30 items that also have human labels. Iterate the rubric/prompt until agreement ≥ 95%. Track in `kaizen/.kaizen/runs/<system>/<judge_run_id>/`.
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: {{name}}
3
3
  description: {{description}}
4
- run_eval: eval/{{name}}.{{eval_ext}}
4
+ run_eval: kaizen/systems/{{name}}/{{eval_file}}
5
5
  eval_version: 1
6
6
  dataset_version: v1
7
7
  eval_style: {{eval_style}}
8
8
  primary_metric: {{primary_metric}}
9
9
  target: {{target}}
10
- execution_mode: in_process
10
+ {{rubric_frontmatter}}
11
11
  # Optional: stable Linear project URL or ID for Kaizen Ideas.
12
12
  # linear_project: https://linear.app/<workspace>/project/<project-slug>
13
13
  created_at: {{iso_now}}
@@ -21,7 +21,7 @@ created_at: {{iso_now}}
21
21
 
22
22
  ## Key files
23
23
 
24
- <!-- Paths in this repo that a variant-builder agent needs to read to understand the system. -->
24
+ <!-- Paths in this repo that a coding agent needs to read to understand the system. -->
25
25
 
26
26
  - `path/to/main_workflow.py` — orchestrator
27
27
  - `path/to/prompts.py` — prompt templates
@@ -29,7 +29,7 @@ created_at: {{iso_now}}
29
29
 
30
30
  ## Setup
31
31
 
32
- <!-- What does the runner or variant-builder agent need before invoking the eval? E.g.:
32
+ <!-- What does the runner or coding agent need before invoking the eval? E.g.:
33
33
  - start servers
34
34
  - install deps
35
35
  - set env vars
@@ -39,6 +39,7 @@ created_at: {{iso_now}}
39
39
 
40
40
  <!-- For Langfuse-backed production evals:
41
41
  - Load dataset items from the `dataset_version` named in frontmatter.
42
+ - Treat `dataset_version` as the Langfuse dataset name unless this section says otherwise.
42
43
  - For each item, run the candidate system and capture the fresh Langfuse trace id.
43
44
  - Link the dataset item to that trace in a Langfuse dataset run named for the Kaizen run.
44
45
  - Write the primary metric as a Langfuse score on the fresh trace, with secondary metrics in metadata.
@@ -63,6 +64,6 @@ graph TD
63
64
 
64
65
  ## Variant candidates
65
66
 
66
- <!-- A scratchpad of ideas to try. The /kaizen skill reads this to seed variant generation. -->
67
+ <!-- A scratchpad of ideas to try. Coding agents read this to seed variant generation. -->
67
68
 
68
69
  - _none yet_
@@ -0,0 +1,63 @@
1
+ import { useState } from "react";
2
+ import type { DatasetItemRendererProps } from "@percepta/kaizen";
3
+
4
+ export default function DatasetItemView({
5
+ datasetItem,
6
+ trace,
7
+ actions,
8
+ }: DatasetItemRendererProps) {
9
+ const [expectedOutput, setExpectedOutput] = useState(() =>
10
+ JSON.stringify(datasetItem.expectedOutput ?? null, null, 2),
11
+ );
12
+ const [status, setStatus] = useState<"idle" | "saving" | "saved" | "error">(
13
+ "idle",
14
+ );
15
+
16
+ async function saveExpectedOutput() {
17
+ setStatus("saving");
18
+ try {
19
+ await actions.updateDatasetItem({
20
+ expectedOutput: JSON.parse(expectedOutput),
21
+ });
22
+ setStatus("saved");
23
+ } catch {
24
+ setStatus("error");
25
+ }
26
+ }
27
+
28
+ return (
29
+ <main>
30
+ <h2>{datasetItem.id}</h2>
31
+ <section>
32
+ <h3>Expected output</h3>
33
+ <textarea
34
+ value={expectedOutput}
35
+ onChange={(event) => {
36
+ setExpectedOutput(event.target.value);
37
+ setStatus("idle");
38
+ }}
39
+ rows={10}
40
+ style={{ width: "100%" }}
41
+ />
42
+ <button type="button" onClick={saveExpectedOutput}>
43
+ Save label
44
+ </button>
45
+ {status !== "idle" ? <span>{status}</span> : null}
46
+ </section>
47
+ <section>
48
+ <h3>Input</h3>
49
+ <pre>{JSON.stringify(datasetItem.input, null, 2)}</pre>
50
+ </section>
51
+ <section>
52
+ <h3>Metadata</h3>
53
+ <pre>{JSON.stringify(datasetItem.metadata, null, 2)}</pre>
54
+ </section>
55
+ {trace ? (
56
+ <section>
57
+ <h3>Source trace</h3>
58
+ <pre>{JSON.stringify(trace, null, 2)}</pre>
59
+ </section>
60
+ ) : null}
61
+ </main>
62
+ );
63
+ }
@@ -0,0 +1,10 @@
1
+ import type { TraceRendererProps } from "@percepta/kaizen";
2
+
3
+ export default function TraceView({ trace }: TraceRendererProps) {
4
+ return (
5
+ <main>
6
+ <h2>{trace.name ?? trace.id ?? "Trace"}</h2>
7
+ <pre>{JSON.stringify(trace, null, 2)}</pre>
8
+ </main>
9
+ );
10
+ }
@@ -1,3 +0,0 @@
1
- exports.id=424,exports.ids=[424],exports.modules={1039:(a,b,c)=>{"use strict";c.d(b,{G:()=>k,V:()=>j});var d=c(8732),e=c(4739),f=c.n(e),g=c(2015);let h=g.useEffect,i=(0,g.createContext)({systems:[],activeSystemId:null,setActiveSystemId:()=>{}});function j(){return(0,g.useContext)(i)}function k({children:a}){let b=function(){let[a,b]=(0,g.useState)([]);return a}(),[c,e]=(0,g.useState)(null),j=(0,g.useCallback)(a=>{e(a);let b=a?`/${a}/experiments`:"/";f().push(b)},[]);h(()=>{let a=()=>{let a;e((a=window.location.pathname.match(/^\/([^/?#]+)/))?a[1]:null)};return a(),window.addEventListener("popstate",a),f().events.on("routeChangeComplete",a),()=>{window.removeEventListener("popstate",a),f().events.off("routeChangeComplete",a)}},[]);let k=(0,g.useMemo)(()=>({systems:b,activeSystemId:c,setActiveSystemId:j}),[b,c,j]);return(0,d.jsx)(i.Provider,{value:k,children:a})}},2377:a=>{a.exports={layout:"Runs_layout__Ih4Cn",heroLogo:"Runs_heroLogo__BAUu8",headerLogo:"Runs_headerLogo__TgYiK",container:"Runs_container__0aqIq",headerRow:"Runs_headerRow__abEUi",title:"Runs_title__oroey",connectedBadge:"Runs_connectedBadge__d1Ss1",disconnectedBadge:"Runs_disconnectedBadge__v3kiS",systemTabs:"Runs_systemTabs__Gtuvz",systemTab:"Runs_systemTab__XYpgy",systemTabActive:"Runs_systemTabActive__10lyk",systemTabName:"Runs_systemTabName__pER4w",systemTabStatus:"Runs_systemTabStatus__YbTNa",systemStatus_in_progress:"Runs_systemStatus_in_progress__i_6lJ",systemStatus_completed:"Runs_systemStatus_completed__pjTng",systemStatus_not_started:"Runs_systemStatus_not_started__FqOI6",subtitle:"Runs_subtitle__ZfT5k",targetBadge:"Runs_targetBadge__XoNhG",grid:"Runs_grid__7DXl9",card:"Runs_card__AxGEL",cardFlash:"Runs_cardFlash__pXo7_",cardGlow:"Runs_cardGlow__mf3t7",badgeFlash:"Runs_badgeFlash__Q0C8G",badgePop:"Runs_badgePop__PdKoP",textFlash:"Runs_textFlash__O_0mj",textHighlight:"Runs_textHighlight__9znCz",rowSlideIn:"Runs_rowSlideIn__rGZ9I",slideInFade:"Runs_slideInFade__SsIak",diagramFlash:"Runs_diagramFlash__4ZTFP",diagramPulse:"Runs_diagramPulse__yN0dx",cardHeader:"Runs_cardHeader__7EpGx",cardTitle:"Runs_cardTitle__l82f2",bestAccuracyInline:"Runs_bestAccuracyInline__0XYna",linearIssueLink:"Runs_linearIssueLink__aVa6L",statusBadge:"Runs_statusBadge__T4ifS",detailTitleStack:"Runs_detailTitleStack__a_E4h",runProgressBlock:"Runs_runProgressBlock__Hg4fw",runProgressHeader:"Runs_runProgressHeader__e69Sy",runProgressTrack:"Runs_runProgressTrack__c_Wjv",runProgressFill:"Runs_runProgressFill__JOLgM",runMetaGrid:"Runs_runMetaGrid__kiPS9",runMetaCell:"Runs_runMetaCell__lEV1l",runMetaLabel:"Runs_runMetaLabel__DxMGL",runMetaValue:"Runs_runMetaValue__gJoib",detailEmpty:"Runs_detailEmpty__wy74V",metricsTable:"Runs_metricsTable__C_A_z",iterRowClickable:"Runs_iterRowClickable__g1tjc",iterRowExpanded:"Runs_iterRowExpanded__Nbl8_",bestRow:"Runs_bestRow__A_kku",iterDetailRow:"Runs_iterDetailRow__y10KK",cardFooter:"Runs_cardFooter__o_f_i",footerUpdated:"Runs_footerUpdated__21L7o",chartContainer:"Runs_chartContainer__bTh0u",chartTitle:"Runs_chartTitle__OkYqw",chart:"Runs_chart__XhGIf",chartRow:"Runs_chartRow__DbGz_",chartLabel:"Runs_chartLabel__3FlRl",chartBarContainer:"Runs_chartBarContainer__zzYv4",chartBarTrack:"Runs_chartBarTrack__5ogbA",chartBar:"Runs_chartBar__64D55",chartRowClickable:"Runs_chartRowClickable__RxDfH",chartValue:"Runs_chartValue__lmV61",metricsTableHeader:"Runs_metricsTableHeader__8d74Z",metricsTableRow:"Runs_metricsTableRow__FEGrk",metricsTableLabel:"Runs_metricsTableLabel__K8De_",metricsTableValue:"Runs_metricsTableValue__kaegJ",metricsTableBarCell:"Runs_metricsTableBarCell__8h1wf",metricsTableBarTrack:"Runs_metricsTableBarTrack__b_CnH",metricsTableBar:"Runs_metricsTableBar__HScEe",chartItems:"Runs_chartItems__Quwyx",noData:"Runs_noData__fi5_n",runSection:"Runs_runSection__Ggi_B",runLabel:"Runs_runLabel__uGajV",treeForest:"Runs_treeForest__6GBAM",treeSvg:"Runs_treeSvg___AATo",treeNodeCard:"Runs_treeNodeCard__Y5XEX",treeNodeSelected:"Runs_treeNodeSelected__QaPg2",treeNodeBest:"Runs_treeNodeBest__U8FaL",treeNodeHighlight:"Runs_treeNodeHighlight__A7a9x",nodeHighlight:"Runs_nodeHighlight__Zuhi5",treeNodeName:"Runs_treeNodeName__XtYDH",treeNodeBadgeRow:"Runs_treeNodeBadgeRow__ZwAvw",treeNodeBadge:"Runs_treeNodeBadge__jLVIw",treeNodeElapsed:"Runs_treeNodeElapsed__vsyq2",treeNodeScoreRow:"Runs_treeNodeScoreRow__BN81e",treeNodeIssueRow:"Runs_treeNodeIssueRow__7fXg_",treeNodeAccuracy:"Runs_treeNodeAccuracy__ehSVZ",treeNodeItems:"Runs_treeNodeItems__4SRsq",treeNodeLoading:"Runs_treeNodeLoading__P7_CS",treeNodePulse:"Runs_treeNodePulse__nC6rt",pulse:"Runs_pulse__LMgDF",treeNodeLoadingText:"Runs_treeNodeLoadingText__C1_bJ",detailPanelBackdrop:"Runs_detailPanelBackdrop__UMPlF",fadeIn:"Runs_fadeIn__1nqka",detailPanel:"Runs_detailPanel__BII9F",slideInFromRight:"Runs_slideInFromRight__uHSvO",detailPanelClose:"Runs_detailPanelClose__vgQbo",detailPanelHeader:"Runs_detailPanelHeader__XMEDA",detailPanelTitle:"Runs_detailPanelTitle__vAuOY"}},3031:a=>{a.exports={wrapper:"SystemSelector_wrapper__ERtiP",label:"SystemSelector_label__4i0LZ",select:"SystemSelector_select__NXXNb"}},3062:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>h});var d=c(8732);c(9990);var e=c(4130),f=c.n(e),g=c(1039);function h({Component:a,pageProps:b}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f(),{children:(0,d.jsx)("title",{children:"Kaizen"})}),(0,d.jsx)(g.G,{children:(0,d.jsx)("div",{style:{height:"100vh",overflow:"auto"},children:(0,d.jsx)(a,{...b})})})]})}},7048:a=>{a.exports={tableWrapper:"Leaderboard_tableWrapper__6uunR",table:"Leaderboard_table__8gTqK",noData:"Leaderboard_noData__aKd3L",thRank:"Leaderboard_thRank__e16FK",thName:"Leaderboard_thName__i_zQZ",thStatus:"Leaderboard_thStatus__F4ZyW",thMetric:"Leaderboard_thMetric__ZMVo_",thPrimary:"Leaderboard_thPrimary__SzN76",thSorted:"Leaderboard_thSorted__13fmP",thLabel:"Leaderboard_thLabel__2cqYD",sortArrow:"Leaderboard_sortArrow__3IJre",thItems:"Leaderboard_thItems__3MS6a",thStarted:"Leaderboard_thStarted__9zNIp",row:"Leaderboard_row__A9H8t",rowBest:"Leaderboard_rowBest__JCqYu",rowSelected:"Leaderboard_rowSelected__GFyz5",tdRank:"Leaderboard_tdRank__kZKT_",tdName:"Leaderboard_tdName__2ymmx",expName:"Leaderboard_expName__6rkrZ",bestBadge:"Leaderboard_bestBadge__33jMs",tdStatus:"Leaderboard_tdStatus__zRhgm",statusDot:"Leaderboard_statusDot__hEPYp",tdMetric:"Leaderboard_tdMetric__Ll0O_",tdPrimary:"Leaderboard_tdPrimary__SZr_5",metricValue:"Leaderboard_metricValue__IhFZf",metricEmpty:"Leaderboard_metricEmpty__l1hwN",tdItems:"Leaderboard_tdItems__4_5Q6",tdStarted:"Leaderboard_tdStarted__p97S3"}},7729:a=>{a.exports={page:"Studio_page__X6enu",topBar:"Studio_topBar__OlLt6",logoLink:"Studio_logoLink__Hv20q",topLogo:"Studio_topLogo__YEKp4",systemSlot:"Studio_systemSlot__5m3MM",surfaceNav:"Studio_surfaceNav__RKZjS",surfaceLink:"Studio_surfaceLink__ivMXp",surfaceLinkActive:"Studio_surfaceLinkActive__Der5b",surfaceLinkDisabled:"Studio_surfaceLinkDisabled__gfVYR",statusPill:"Studio_statusPill__m2ERk",content:"Studio_content__LELHT",surface:"Studio_surface__lxZ_I",surfaceBanner:"Studio_surfaceBanner__UNvfB",surfaceBannerText:"Studio_surfaceBannerText__6jNss",surfaceBannerTitle:"Studio_surfaceBannerTitle__vXJox",surfaceBannerCopy:"Studio_surfaceBannerCopy__Abpvv",sourceChip:"Studio_sourceChip___xMTP",sourceChip_code:"Studio_sourceChip_code__DPzDj",sourceChip_langfuse:"Studio_sourceChip_langfuse__h6LSy",sourceChip_linear:"Studio_sourceChip_linear__9NNQ5",sourceChip_local:"Studio_sourceChip_local__3Ws2K",sourceLogo:"Studio_sourceLogo__iWmOz",sourceSvgIcon:"Studio_sourceSvgIcon__dpcyH",provenanceLine:"Studio_provenanceLine__a5uDd",inlineSourceValue:"Studio_inlineSourceValue__WMOb9",syncStatus:"Studio_syncStatus__exlkz",syncStatusLabel:"Studio_syncStatusLabel__C5cmS",iconButton:"Studio_iconButton__aVxFx",dataLayout:"Studio_dataLayout__RTqFZ",experimentsLayout:"Studio_experimentsLayout__dJ9_W",dataNav:"Studio_dataNav__Hhqcz",experimentNav:"Studio_experimentNav__pUm9S",sidebarResizeHandle:"Studio_sidebarResizeHandle__Bfcoi",experimentsMain:"Studio_experimentsMain__8IYj4",dataNavItem:"Studio_dataNavItem__rzaJQ",dataNavGroupItem:"Studio_dataNavGroupItem__0bfKJ",dataNavItemText:"Studio_dataNavItemText__nSadp",dataNavItemMeta:"Studio_dataNavItemMeta__PEhqv",experimentNavItem:"Studio_experimentNavItem__VrdaI",dataNavEmpty:"Studio_dataNavEmpty__sffpq",dataNavItemActive:"Studio_dataNavItemActive__TANbd",dataMain:"Studio_dataMain__rSYxU",surfaceToolbar:"Studio_surfaceToolbar__ayM6U",surfaceTitle:"Studio_surfaceTitle__7SjZP",surfaceSubtitle:"Studio_surfaceSubtitle__i6YB6",inlineSelector:"Studio_inlineSelector__er_h_",inlineSelectorLabel:"Studio_inlineSelectorLabel__T4g6q",filterBar:"Studio_filterBar__I6G_F",select:"Studio_select__rbQ0i",primaryButton:"Studio_primaryButton__t0Otf",secondaryButton:"Studio_secondaryButton__gEhyV",dangerButton:"Studio_dangerButton__9Bclj",splitSurface:"Studio_splitSurface__v2lGr",listPanel:"Studio_listPanel__KQbqx",listPanelEmpty:"Studio_listPanelEmpty__Ofh2D",detailPanel:"Studio_detailPanel__upjwv",errorPanel:"Studio_errorPanel__OFovk",loadingPanel:"Studio_loadingPanel__VwGMY",emptyPanel:"Studio_emptyPanel__nqsJ1",listRow:"Studio_listRow__NObDS",listRowSelected:"Studio_listRowSelected__v7gF6",listRowTitle:"Studio_listRowTitle__Dg_xF",listRowMeta:"Studio_listRowMeta__fmtZx",detailHeader:"Studio_detailHeader__an_N2",detailTitle:"Studio_detailTitle__H8HXN",detailMeta:"Studio_detailMeta__F__Kq",mutedText:"Studio_mutedText__gxlbZ",detailLink:"Studio_detailLink__QdlV6",detailGrid:"Studio_detailGrid__eKjPQ",jsonBlock:"Studio_jsonBlock__V4yWY",jsonTitle:"Studio_jsonTitle__4rJZO",sectionTitle:"Studio_sectionTitle__AgJZy",jsonPre:"Studio_jsonPre__NT0BZ",traceSection:"Studio_traceSection__7pMTX",traceHeader:"Studio_traceHeader__Ulrn7",traceName:"Studio_traceName__YsChW",tagRow:"Studio_tagRow__Prgun",tagPill:"Studio_tagPill__TRnnW",successPanel:"Studio_successPanel__03cvQ",evalDefinitionGrid:"Studio_evalDefinitionGrid__YMID0",evalDefinitionCell:"Studio_evalDefinitionCell__wS4ZE",evalDefinitionCode:"Studio_evalDefinitionCode___J0aO",evalHistorySection:"Studio_evalHistorySection__e_91j",evalSectionHeader:"Studio_evalSectionHeader___IiLV",evalSummaryTable:"Studio_evalSummaryTable__gZ5vh",evalSummaryHeader:"Studio_evalSummaryHeader__ku_ov",evalSummaryRow:"Studio_evalSummaryRow__KtPSR",evalSummaryPrimary:"Studio_evalSummaryPrimary__VAArE",evalSummaryMeta:"Studio_evalSummaryMeta__RgcSF",setupBanner:"Studio_setupBanner__rn3R6",setupTitle:"Studio_setupTitle__rrPH_",setupCopy:"Studio_setupCopy__InFUm",setupHeader:"Studio_setupHeader__0z51Y",setupState:"Studio_setupState__u13N3",setupGrid:"Studio_setupGrid__43Ac0",setupBlock:"Studio_setupBlock__pXdLU",setupBlockTitle:"Studio_setupBlockTitle__HS_1S",setupCode:"Studio_setupCode__3AADb",setupLookup:"Studio_setupLookup__S7xvC",setupDetail:"Studio_setupDetail__BYnnc",setupLookupLabel:"Studio_setupLookupLabel__OOHGt",ideaMetaGrid:"Studio_ideaMetaGrid__QA5ZP",metaCell:"Studio_metaCell__lTOia",metaLabel:"Studio_metaLabel__orMyw",metaValue:"Studio_metaValue__wPOIw",descriptionBlock:"Studio_descriptionBlock__RgZHz",formRow:"Studio_formRow__CkHSQ",formLabel:"Studio_formLabel__pObCQ",textInput:"Studio_textInput__9WjCF",textArea:"Studio_textArea__yi_Lm",textAreaLarge:"Studio_textAreaLarge__20NQc",actionRow:"Studio_actionRow__0pQf0",actionFooter:"Studio_actionFooter__wFiYP",emptyState:"Studio_emptyState__dwICN",emptyLogo:"Studio_emptyLogo__ehso4",emptyTitle:"Studio_emptyTitle__ByiEP",emptyCopy:"Studio_emptyCopy__NP7hT",emptyMeta:"Studio_emptyMeta__Bsrtp",emptyPanelCopy:"Studio_emptyPanelCopy__EExQw",emptyPanelTitle:"Studio_emptyPanelTitle__g31eb"}},7934:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(8732),e=c(7215);function f(){return(0,d.jsxs)(e.Html,{lang:"en",children:[(0,d.jsxs)(e.Head,{children:[(0,d.jsx)("link",{rel:"icon",type:"image/png",sizes:"32x32",href:"/favicon-32.png"}),(0,d.jsx)("link",{rel:"icon",type:"image/png",sizes:"64x64",href:"/favicon-64.png"}),(0,d.jsx)("link",{rel:"apple-touch-icon",href:"/apple-touch-icon.png"})]}),(0,d.jsxs)("body",{children:[(0,d.jsx)(e.Main,{}),(0,d.jsx)(e.NextScript,{})]})]})}},9258:(a,b,c)=>{"use strict";c.d(b,{W:()=>aP});var d=c(8732),e=c(2015),f=c(1039),g=c(1836),h=c.n(g),i=c(7729),j=c.n(i);let k={code:"Owned by system source code. Agent changes edit the customer repo.",langfuse:"Owned by Langfuse. Agent changes use the Langfuse API.",linear:"Owned by Linear. Agent changes use the Linear API.",local:"Owned by local Kaizen state on this machine."};function l({source:a}){return(0,d.jsx)("span",{className:`${j().sourceChip} ${j()[`sourceChip_${a}`]}`,title:k[a],"aria-label":k[a],children:(0,d.jsx)(m,{source:a})})}function m({source:a}){return"langfuse"===a?(0,d.jsx)("img",{src:"/source-icons/langfuse.svg",alt:"",className:j().sourceLogo}):"linear"===a?(0,d.jsx)("img",{src:"/source-icons/linear.svg",alt:"",className:j().sourceLogo}):"local"===a?(0,d.jsx)(o,{}):(0,d.jsx)(n,{})}function n(){return(0,d.jsxs)("svg",{className:j().sourceSvgIcon,viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[(0,d.jsx)("path",{d:"M8.5 7L3.5 12L8.5 17",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"square",strokeLinejoin:"miter"}),(0,d.jsx)("path",{d:"M15.5 7L20.5 12L15.5 17",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"square",strokeLinejoin:"miter"})]})}function o(){return(0,d.jsxs)("svg",{className:j().sourceSvgIcon,viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[(0,d.jsx)("path",{d:"M5 4H17L20 7V20H5V4Z",stroke:"currentColor",strokeWidth:"2",strokeLinejoin:"miter"}),(0,d.jsx)("path",{d:"M8 4V10H16V4",stroke:"currentColor",strokeWidth:"2"}),(0,d.jsx)("path",{d:"M8 16H16",stroke:"currentColor",strokeWidth:"2"})]})}var p=c(3031),q=c.n(p);function r(){let{systems:a,activeSystemId:b,setActiveSystemId:c}=(0,f.V)(),e=a.find(a=>a.id===b);return(0,d.jsxs)("label",{className:q().wrapper,children:[(0,d.jsx)("span",{className:q().label,children:"System"}),(0,d.jsxs)("select",{className:q().select,value:b??"",onChange:a=>c(a.target.value||null),children:[!b&&(0,d.jsx)("option",{value:"",disabled:!0,children:"Choose"}),b&&!e&&(0,d.jsx)("option",{value:b,children:"Loading system..."}),a.map(a=>(0,d.jsx)("option",{value:a.id,children:a.name},a.id))]}),b&&(0,d.jsx)(l,{source:"code"})]})}let s=[{id:"data",label:"Data"},{id:"benchmarks",label:"Benchmarks"},{id:"ideas",label:"Ideas"},{id:"experiments",label:"Experiments"}];function t({activeSystem:a,activeSurface:b,children:c}){return(0,d.jsxs)("div",{className:j().page,children:[(0,d.jsxs)("header",{className:j().topBar,children:[(0,d.jsx)(h(),{href:"/",className:j().logoLink,"aria-label":"Kaizen home",children:(0,d.jsx)("img",{src:"/logo-cream.svg",alt:"",className:j().topLogo})}),(0,d.jsx)("div",{className:j().systemSlot,children:(0,d.jsx)(r,{})}),(0,d.jsx)("nav",{className:j().surfaceNav,"aria-label":"Kaizen surfaces",children:s.map(c=>a?(0,d.jsx)(h(),{href:`/${a.id}/${c.id}`,className:`${j().surfaceLink} ${b===c.id?j().surfaceLinkActive:""}`,children:c.label},c.id):(0,d.jsx)("span",{className:`${j().surfaceLink} ${j().surfaceLinkDisabled}`,children:c.label},c.id))}),(0,d.jsx)("div",{})]}),(0,d.jsx)("main",{className:j().content,children:c})]})}function u(a){let[b,c]=(0,e.useState)([]),[d,f]=(0,e.useState)(!1);return{runs:b,connected:d}}function v(a){if(!a)return"";let b=new Date(a);return Number.isNaN(b.getTime())?a:new Intl.DateTimeFormat(void 0,{year:"numeric",month:"short",day:"numeric",hour:"numeric",minute:"2-digit"}).format(b)}var w=c(9857);w.Ik({runId:w.Yj(),runName:w.Yj(),status:w.k5(["running","complete","crashed","aborted"]),worktreeBranch:w.Yj(),parentId:w.Yj().nullable(),system:w.Yj(),progress:w.Ik({completed:w.ai(),total:w.ai(),lastHeartbeat:w.Yj()}).optional(),metrics:w.g1(w.Yj(),w.ai()),totalItems:w.ai().nullable(),langfuseRunId:w.Yj().optional(),linearIssue:w.Ik({id:w.Yj(),url:w.Yj()}).optional(),evalConfig:w.Ik({dataset:w.Yj(),evalVersion:w.ai().optional(),datasetItemCount:w.ai(),judge:w.Ik({rubric:w.Yj(),rubricHash:w.Yj(),model:w.Yj(),temperature:w.ai()}).optional()}).optional(),startedAt:w.Yj(),updatedAt:w.Yj()});let x={actionAccuracy:{label:"Action Accuracy",format:"percent"},parameterExtraction:{label:"Param Extraction",format:"percent"},clarificationAppropriateness:{label:"Clarification",format:"percent"},multiActionDetection:{label:"Multi-Action",format:"percent"},f1:{label:"F1",format:"percent"},f2:{label:"F2",format:"percent"},precision:{label:"Precision",format:"percent"},recall:{label:"Recall",format:"percent"},cost_per_item:{label:"Cost / Item",format:"raw"},avg_latency_s:{label:"Avg Latency (s)",format:"raw"},true_positives:{label:"TP",format:"integer"},false_positives:{label:"FP",format:"integer"},false_negatives:{label:"FN",format:"integer"},total_clis_scored:{label:"CLIs Scored",format:"integer"},items_with_metrics:{label:"Items w/ Metrics",format:"integer"},timeouts:{label:"Timeouts",format:"integer"},judge_quality:{label:"Judge Quality",format:"percent"},judge_quality_chartNotes:{label:"Quality: Chart Notes",format:"percent"},judge_quality_followUp:{label:"Quality: Follow-Up",format:"percent"}};function y(a){return x[a]?.label??a.replace(/[_-]+/g," ").replace(/([A-Z])/g," $1").replace(/^./,a=>a.toUpperCase()).trim()}function z(a,b){let c=x[a];return c?.format==="integer"?Math.round(b).toLocaleString():c?.format==="raw"?b.toFixed(2):c?.format==="percent"?(100*b).toFixed(1)+"%":b>1?Math.round(b).toLocaleString():(100*b).toFixed(1)+"%"}function A(a,b){if(!b)return null;if(b in a.metrics)return a.metrics[b];if("f2"===b&&"precision"in a.metrics&&"recall"in a.metrics){var c,d;return(c=a.metrics.precision)+(d=a.metrics.recall)===0?0:5*c*d/(4*c+d)}return null}function B(a,b){var c,d;let e=a.evalConfig?.dataset??"unknown dataset",f="number"==typeof a.evalConfig?.evalVersion?String(a.evalConfig.evalVersion):"unknown",g=(c=a,d=b,c.evalConfig?.judge?.rubric??d??"unknown eval"),h=`Eval v${f} \xb7 ${y(g)}`;return{key:`${e}::${f}::${g}`,dataset:e,datasetLabel:C(e),evalVersion:f,evalMetric:g,evalLabel:h}}function C(a){return a.replace(/--/g," ").replace(/[-_]+/g," ").replace(/\bgt\b/gi,"Ground Truth").replace(/\bv(\d+)\b/gi,"v$1").replace(/\b\w/g,a=>a.toUpperCase()).trim()}function D({title:a,children:b,source:c,syncLabel:e,onRefresh:f,refreshing:g}){return(0,d.jsxs)("section",{className:j().surfaceBanner,children:[(0,d.jsxs)("div",{className:j().surfaceBannerText,children:[(0,d.jsxs)("div",{className:j().surfaceBannerTitle,children:[(0,d.jsx)("span",{children:a}),c&&(0,d.jsx)(l,{source:c})]}),(0,d.jsx)("div",{className:j().surfaceBannerCopy,children:b})]}),(null!=e||null!=f)&&(0,d.jsx)(E,{label:e,onRefresh:f,refreshing:g})]})}function E({label:a,onRefresh:b,refreshing:c}){return(0,d.jsxs)("div",{className:j().syncStatus,children:[null!=a&&(0,d.jsx)("span",{className:j().syncStatusLabel,children:a}),b&&(0,d.jsx)("button",{className:j().iconButton,onClick:b,title:"Refresh","aria-label":"Refresh","aria-busy":c?"true":"false",children:(0,d.jsx)("span",{"aria-hidden":"true",children:"↻"})})]})}function F({system:a}){var b;let{runs:c}=u(a.id),f=a.primaryMetric??null,g=(0,e.useMemo)(()=>(function(a,b){let c=new Map;for(let h of a){var d,e,f,g;let a=B(h,b),i=c.get(a.key);i?(i.count++,d=i.itemCount,e=h.totalItems,i.itemCount=null===d?e:null===e?d:Math.max(d,e),f=i.latestAt,g=h.updatedAt,i.latestAt=f?Date.parse(g)>Date.parse(f)?g:f:g):c.set(a.key,{...a,count:1,itemCount:h.totalItems,latestAt:h.updatedAt})}return[...c.values()].sort((a,b)=>(b.latestAt??"").localeCompare(a.latestAt??""))})(c,f),[f,c]);return(0,d.jsxs)("div",{className:j().surface,children:[(0,d.jsx)(D,{title:"Benchmarks",source:"code",syncLabel:"Live updates",children:"A benchmark is the fixed dataset plus scoring setup for this system. The current benchmark comes from the system file, and the rows below show which benchmarks have actually been used by local experiments."}),(0,d.jsxs)("section",{className:j().detailPanel,children:[(0,d.jsxs)("div",{className:j().detailHeader,children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:j().detailTitle,children:"Current benchmark"}),(0,d.jsx)("div",{className:j().detailMeta,children:"This is what the next Kaizen run will use unless a coding agent changes the system file."})]}),(0,d.jsx)(l,{source:"code"})]}),(0,d.jsxs)("div",{className:j().evalDefinitionGrid,children:[(0,d.jsx)(G,{label:"Dataset",value:a.evalDataset?C(a.evalDataset):"Not configured",detail:a.evalDataset}),(0,d.jsx)(G,{label:"Eval version",value:null===a.evalVersion?"Not configured":`v${a.evalVersion}`}),(0,d.jsx)(G,{label:"Primary metric",value:a.primaryMetric?y(a.primaryMetric):"Not configured",detail:a.primaryMetric}),(0,d.jsx)(G,{label:"Style",value:"ground_truth"===(b=a.evalType)?"Ground truth":"llm_judge"===b?"LLM judge":"human"===b?"Human review":"policy"===b?"Policy":"Not configured"})]})]}),(0,d.jsxs)("section",{className:j().evalHistorySection,children:[(0,d.jsxs)("div",{className:j().evalSectionHeader,children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:j().detailTitle,children:"Benchmarks used in experiments"}),(0,d.jsx)("div",{className:j().detailMeta,children:"Each row is a separate comparison group."})]}),(0,d.jsx)(l,{source:"local"})]}),0===g.length?(0,d.jsx)("div",{className:j().emptyPanel,children:"No benchmarks yet. Run an experiment to create one."}):(0,d.jsxs)("div",{className:j().evalSummaryTable,children:[(0,d.jsxs)("div",{className:j().evalSummaryHeader,children:[(0,d.jsx)("span",{children:"Dataset"}),(0,d.jsx)("span",{children:"Scoring"}),(0,d.jsx)("span",{children:"Runs"}),(0,d.jsx)("span",{children:"Items"}),(0,d.jsx)("span",{children:"Latest"})]}),g.map(a=>(0,d.jsxs)("div",{className:j().evalSummaryRow,children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:j().evalSummaryPrimary,children:a.datasetLabel}),(0,d.jsx)("span",{className:j().evalSummaryMeta,children:a.dataset})]}),(0,d.jsxs)("div",{children:[(0,d.jsx)("span",{className:j().evalSummaryPrimary,children:a.evalLabel}),(0,d.jsx)("span",{className:j().evalSummaryMeta,children:y(a.evalMetric)})]}),(0,d.jsx)("span",{children:a.count}),(0,d.jsx)("span",{children:a.itemCount??"?"}),(0,d.jsx)("span",{children:a.latestAt?v(a.latestAt):"-"})]},a.key))]})]})]})}function G({label:a,value:b,detail:c}){return(0,d.jsxs)("div",{className:j().evalDefinitionCell,children:[(0,d.jsx)("span",{className:j().metaLabel,children:a}),(0,d.jsx)("span",{className:j().metaValue,children:b}),c&&(0,d.jsx)("code",{className:j().evalDefinitionCode,children:c})]})}function H({status:a,currentValues:b}){let c=[a.requiredEnvVars?.length?{title:"Required",values:a.requiredEnvVars}:null,a.missingEnvVars?.length?{title:"Missing",values:a.missingEnvVars}:null,a.optionalEnvVars?.length?{title:"Optional",values:a.optionalEnvVars}:null,a.expectedEnvFile?{title:"Put values here",values:[a.expectedEnvFile]}:null,b?.length?{title:"Current query",values:b}:null].filter(J);return(0,d.jsxs)("div",{className:j().setupBanner,children:[(0,d.jsxs)("div",{className:j().setupHeader,children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:j().setupTitle,children:a.message}),(0,d.jsx)("div",{className:j().setupCopy,children:a.remediation})]}),(0,d.jsx)("span",{className:j().setupState,children:a.state})]}),c.length>0&&(0,d.jsx)("div",{className:j().setupGrid,children:c.map(a=>(0,d.jsx)(I,{title:a.title,values:a.values},`${a.title}:${a.values.join(",")}`))}),a.lookup&&a.lookup.length>0&&(0,d.jsxs)("div",{className:j().setupLookup,children:[(0,d.jsx)("span",{className:j().setupLookupLabel,children:"Kaizen checks"}),a.lookup.join(" -> ")]}),a.detail&&(0,d.jsx)("div",{className:j().setupDetail,children:a.detail})]})}function I({title:a,values:b}){return(0,d.jsxs)("div",{className:j().setupBlock,children:[(0,d.jsx)("span",{className:j().setupBlockTitle,children:a}),b.map(a=>(0,d.jsx)("code",{className:j().setupCode,children:a},a))]})}function J(a){return null!==a}function K(a=new Date){return new Intl.DateTimeFormat(void 0,{hour:"numeric",minute:"2-digit"}).format(a)}function L(a,b){var c;let d=(c=b)%6e4==0?`${c/6e4}m`:c%1e3==0?`${c/1e3}s`:`${c}ms`;return a?`Updated ${a} \xb7 Every ${d}`:`Every ${d}`}function M({system:a}){let[b,c]=(0,e.useState)("datasets"),[f,g]=(0,e.useState)([]),[h,i]=(0,e.useState)({name:null,systemId:null}),[k,l]=(0,e.useState)([]),[m,n]=(0,e.useState)(null),[o,p]=(0,e.useState)(null),[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)(null),[u,v]=(0,e.useState)(!1),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(!1),[A,B]=(0,e.useState)(null),[C,E]=(0,e.useState)(null),[F,G]=(0,e.useState)(null),[I,J]=(0,e.useState)(null),[M,Q]=(0,e.useState)(!1),[R,S]=(0,e.useState)(null),T=a.evalDataset,U=(0,e.useRef)(!1),X=(0,e.useRef)(a.id),_=(0,e.useRef)(T),aa=(0,e.useRef)(async()=>{}),ac=(0,e.useRef)(h);X.current=a.id,_.current=T,ac.current=h;let ae=h.name;h.systemId;let ag=(0,e.useCallback)(()=>{c("datasets")},[]),ah=(0,e.useCallback)(()=>{c("traces")},[]),ai=(0,e.useCallback)(()=>{c("add")},[]),aj=(0,e.useCallback)(()=>{aa.current()},[]),ak=(0,e.useCallback)(a=>{i({name:a,systemId:a?X.current:null}),l([]),n(null),p(null),G(null),J(null)},[]),al=(0,e.useCallback)(async()=>{let b=a.id;r(!0);try{var c,d,e,f;let a=await fetch(`/api/langfuse-datasets?systemId=${encodeURIComponent(b)}`),h=(c=await a.json(),ab(c)?{data:Array.isArray(c.data)?c.data.map(Z).filter(ad):void 0,connection:Y(c.connection),error:af(c.error)}:{});if(X.current===b&&E(h.connection??null),!a.ok)throw Error(h.error??`HTTP ${a.status}`);if(X.current!==b)return null;let j=h.data??[],k=ac.current,m=(d=k.systemId===b?k.name:null,e=j,f=_.current,d&&e.some(a=>a.name===d)?d:f&&e.some(a=>a.name===f)?f:e[0]?.name??null);return g(j),t(null),S(K()),i({name:m,systemId:m?b:null}),0===j.length&&(l([]),n(null),p(null)),m}catch(a){if(X.current!==b)return null;return U.current||(g([]),i({name:null,systemId:null}),l([]),n(null),p(null)),t(a instanceof Error?a.message:String(a)),null}finally{X.current===b&&(U.current=!0,x(!0),r(!1))}},[a.id]),am=(0,e.useCallback)(async(b=ae)=>{if(!b)return null;let c=a.id;v(!0);try{var d;let a=await fetch(`/api/langfuse-dataset?dataset=${encodeURIComponent(b)}&systemId=${encodeURIComponent(c)}`),e=(d=await a.json(),ab(d)?{data:Array.isArray(d.data)?d.data.map($).filter(ad):void 0,connection:Y(d.connection),error:af(d.error)}:{});if(X.current===c&&E(e.connection??null),!a.ok)throw Error(e.error??`HTTP ${a.status}`);if(X.current!==c)return null;let f=e.data??[],g=f.filter(W);l(f),B(null),n(a=>a&&g.some(b=>b.id===a)?a:g[0]?.id??null);let h=g.map(V).find(Boolean);return p(a=>a&&g.some(b=>V(b)===a)?a:h??null),S(K()),f}catch(a){if(X.current!==c)return null;return B(a instanceof Error?a.message:String(a)),null}finally{X.current===c&&(z(!0),v(!1))}},[a.id,ae]),an=(0,e.useCallback)(async(a,b,c)=>{let d=ac.current.name;if(!d)return G("Choose a dataset first."),!1;Q(!0),G(null),J(null);try{var e;let f=await fetch("/api/langfuse-dataset-item",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...a,datasetName:d,systemId:X.current})}),g=(e=await f.json(),ab(e)?{data:$(e.data)??void 0,error:af(e.error)}:{});if(!f.ok)throw Error(g.error??`HTTP ${f.status}`);let h=await am(d),i=g.data?.id??null;return c&&i&&h?.some(a=>a.id===i&&W(a))&&n(i),J(b),!0}catch(a){return G(a instanceof Error?a.message:String(a)),!1}finally{Q(!1)}},[am]),ao=(0,e.useCallback)(async a=>{await an({action:"add-from-trace",source:a.source,expectedOutput:a.expectedOutput,notes:a.notes},"Dataset item added.",!0)&&c("datasets")},[an]),ap=(0,e.useCallback)(async a=>{await an({action:"update",itemId:a.itemId,expectedOutput:a.expectedOutput,notes:a.notes},"Dataset item saved.",!0)},[an]),aq=(0,e.useCallback)(async a=>{await an({action:"archive",itemId:a},"Dataset item archived.",!1)},[an]),ar=(0,e.useMemo)(()=>k.filter(W),[k]),as=(0,e.useMemo)(()=>ar.find(a=>a.id===m)??ar[0]??null,[ar,m]),at=(0,e.useMemo)(()=>{let a=new Map;for(let b of ar){let c=V(b);c&&!a.has(c)&&a.set(c,b)}return[...a.entries()].map(([a,b])=>({traceId:a,item:b}))},[ar]),au=o??at[0]?.traceId??V(as);return aa.current=(0,e.useCallback)(async()=>{let b=await al();b&&X.current===a.id&&await am(b)},[al,am,a.id]),(0,d.jsxs)("div",{className:j().dataLayout,children:[(0,d.jsxs)("aside",{className:j().dataNav,children:[(0,d.jsx)("button",{className:`${j().dataNavItem} ${"datasets"===b?j().dataNavItemActive:""}`,onClick:ag,children:"Datasets"}),(0,d.jsx)("button",{className:`${j().dataNavItem} ${"traces"===b?j().dataNavItemActive:""}`,onClick:ah,children:"Traces"}),(0,d.jsx)("button",{className:`${j().dataNavItem} ${"add"===b?j().dataNavItemActive:""}`,onClick:ai,children:"Add item"})]}),(0,d.jsxs)("section",{className:j().dataMain,children:[(0,d.jsx)(D,{title:"Langfuse data",source:"langfuse",syncLabel:L(R,15e3),onRefresh:aj,refreshing:u||q,children:"This is the evaluation data for the selected system. Use Datasets to inspect golden examples, Traces to review the source calls behind those examples, and Add item to prepare new examples. The view updates automatically while open; Refresh pulls the latest now."}),C&&"connected"!==C.state&&(0,d.jsx)(H,{status:C}),"datasets"===b?(0,d.jsx)(N,{system:a,datasets:f,selectedDatasetName:ae,configuredDatasetName:T,items:ar,selectedItem:as,loading:q&&!w||u&&!y,datasetsError:s,error:A,mutationError:F,mutationMessage:I,mutating:M,onSelectDataset:ak,onSelect:n,onUpdateItem:ap,onArchiveItem:aq}):"traces"===b?(0,d.jsx)(O,{systemId:a.id,linkedTraces:at,selectedTraceId:au,onSelectTrace:p,error:s??A}):(0,d.jsx)(P,{system:a,datasetName:ae,error:F,message:I,mutating:M,onAddItem:ao})]})]})}function N({system:a,datasets:b,selectedDatasetName:c,configuredDatasetName:f,items:g,selectedItem:h,loading:i,datasetsError:k,error:m,mutationError:n,mutationMessage:o,mutating:p,onSelectDataset:q,onSelect:r,onUpdateItem:s,onArchiveItem:t}){let u=(0,e.useCallback)(a=>{q(a.target.value?a.target.value:null)},[q]);return(0,d.jsxs)("div",{className:j().surface,children:[(0,d.jsx)("div",{className:j().surfaceToolbar,children:(0,d.jsxs)("div",{children:[(0,d.jsxs)("label",{className:j().inlineSelector,children:[(0,d.jsx)("span",{className:j().inlineSelectorLabel,children:"Dataset"}),(0,d.jsxs)("select",{className:j().select,value:c??"",onChange:u,disabled:0===b.length,children:[(0,d.jsx)("option",{value:"",disabled:!0,children:0===b.length?"No datasets available":"Select dataset"}),b.map(a=>(0,d.jsx)("option",{value:a.name,children:a.name},a.name))]})]}),f&&(0,d.jsxs)("div",{className:j().provenanceLine,children:[(0,d.jsx)("span",{children:"Default dataset"}),(0,d.jsx)("code",{children:f}),(0,d.jsx)(l,{source:"code"})]})]})}),k&&(0,d.jsx)("div",{className:j().errorPanel,children:k}),n&&(0,d.jsx)("div",{className:j().errorPanel,children:n}),o&&(0,d.jsx)("div",{className:j().successPanel,children:o}),i?(0,d.jsx)("div",{className:j().loadingPanel,children:"Loading Langfuse data..."}):c?m?(0,d.jsx)("div",{className:j().errorPanel,children:m}):(0,d.jsxs)("div",{className:j().splitSurface,children:[(0,d.jsx)(Q,{items:g,selectedId:h?.id??null,onSelect:r}),(0,d.jsx)(S,{item:h,systemId:a.id,datasetName:c,mutating:p,onUpdate:s,onArchive:t})]}):(0,d.jsxs)("div",{className:j().emptyPanel,children:[(0,d.jsx)("div",{className:j().emptyPanelTitle,children:0===b.length?"No Langfuse datasets found":"No Langfuse dataset selected"}),(0,d.jsx)("div",{className:j().emptyPanelCopy,children:0===b.length?"Kaizen did not find any datasets for this system.":"Choose a dataset to inspect its examples."})]})]})}function O({systemId:a,linkedTraces:b,selectedTraceId:c,onSelectTrace:e,error:f}){return(0,d.jsxs)("div",{className:j().surface,children:[(0,d.jsx)("div",{className:j().surfaceToolbar,children:(0,d.jsxs)("div",{children:[(0,d.jsx)("div",{className:j().surfaceTitle,children:"Traces"}),(0,d.jsxs)("div",{className:j().surfaceSubtitle,children:[b.length," linked source trace",1===b.length?"":"s"]})]})}),f?(0,d.jsx)("div",{className:j().errorPanel,children:f}):(0,d.jsxs)("div",{className:j().splitSurface,children:[(0,d.jsx)(R,{traces:b,selectedTraceId:c,onSelect:e}),(0,d.jsx)(T,{traceId:c,systemId:a})]})]})}function P({system:a,datasetName:b,error:c,message:f,mutating:g,onAddItem:h}){let[i,k]=(0,e.useState)(""),[l,m]=(0,e.useState)(""),[n,o]=(0,e.useState)(""),p=(0,e.useCallback)(a=>{k(a.target.value)},[]),q=(0,e.useCallback)(a=>{m(a.target.value)},[]),r=(0,e.useCallback)(a=>{o(a.target.value)},[]),s=(0,e.useCallback)(a=>{a.preventDefault(),h({source:i,expectedOutput:X(l),notes:n})},[l,n,h,i]),t=!!(b&&i.trim()&&!g);return(0,d.jsxs)("form",{className:j().detailPanel,onSubmit:s,children:[(0,d.jsxs)("div",{className:j().detailHeader,children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:j().detailTitle,children:"Add dataset item"}),(0,d.jsx)("div",{className:j().detailMeta,children:b??a.evalDataset??"No dataset selected"})]}),(0,d.jsx)("span",{className:j().statusPill,children:"Langfuse"})]}),c&&(0,d.jsx)("div",{className:j().errorPanel,children:c}),f&&(0,d.jsx)("div",{className:j().successPanel,children:f}),(0,d.jsxs)("div",{className:j().formRow,children:[(0,d.jsx)("label",{className:j().formLabel,htmlFor:"dataset-source",children:"Source trace"}),(0,d.jsx)("input",{id:"dataset-source",className:j().textInput,disabled:!b||g,placeholder:"Langfuse trace URL or trace ID",value:i,onChange:p}),(0,d.jsx)("div",{className:j().detailMeta,children:"Orbit URL lookup will be wired in a follow-up. For now, paste the Langfuse trace URL or trace ID for the call you want in the golden dataset."})]}),(0,d.jsxs)("div",{className:j().formRow,children:[(0,d.jsx)("label",{className:j().formLabel,htmlFor:"dataset-expected-output",children:"Expected output"}),(0,d.jsx)("textarea",{id:"dataset-expected-output",className:j().textArea,disabled:!b||g,placeholder:"Leave blank to use the trace output, or paste text/JSON ground truth.",value:l,onChange:q})]}),(0,d.jsxs)("div",{className:j().formRow,children:[(0,d.jsx)("label",{className:j().formLabel,htmlFor:"dataset-notes",children:"Notes"}),(0,d.jsx)("textarea",{id:"dataset-notes",className:j().textArea,disabled:!b||g,placeholder:"Why this belongs in the golden dataset.",value:n,onChange:r})]}),(0,d.jsx)("button",{className:j().secondaryButton,disabled:!t,children:g?"Adding...":"Add item"})]})}function Q({items:a,selectedId:b,onSelect:c}){let f=(0,e.useCallback)(a=>{let b=aa(a.target,"itemId");b&&c(b)},[c]);return 0===a.length?(0,d.jsx)("div",{className:j().listPanelEmpty,children:"No dataset items"}):(0,d.jsx)("aside",{className:j().listPanel,onClick:f,children:a.map((a,c)=>{let e=V(a);return(0,d.jsxs)("button",{"data-item-id":a.id,className:`${j().listRow} ${b===a.id?j().listRowSelected:""}`,children:[(0,d.jsx)("span",{className:j().listRowTitle,children:_(a,c)}),(0,d.jsx)("span",{className:j().listRowMeta,children:e?`trace ${e.slice(0,8)}`:a.status??"item"})]},a.id)})})}function R({traces:a,selectedTraceId:b,onSelect:c}){let f=(0,e.useCallback)(a=>{let b=aa(a.target,"traceId");b&&c(b)},[c]);return 0===a.length?(0,d.jsx)("div",{className:j().listPanelEmpty,children:"No linked traces"}):(0,d.jsx)("aside",{className:j().listPanel,onClick:f,children:a.map(({traceId:a,item:c},e)=>(0,d.jsxs)("button",{"data-trace-id":a,className:`${j().listRow} ${b===a?j().listRowSelected:""}`,children:[(0,d.jsx)("span",{className:j().listRowTitle,children:_(c,e)}),(0,d.jsx)("span",{className:j().listRowMeta,children:a})]},a))})}function S({item:a,systemId:b,datasetName:c,mutating:f,onUpdate:g,onArchive:h}){let i=a?V(a):null;a?.id;let[k,l]=(0,e.useState)(""),[m,n]=(0,e.useState)(""),o=(0,e.useCallback)(a=>{l(a.target.value)},[]),p=(0,e.useCallback)(a=>{n(a.target.value)},[]),q=(0,e.useCallback)(()=>{a&&g({itemId:a.id,expectedOutput:X(k),notes:m})},[k,a,m,g]),r=(0,e.useCallback)(()=>{a&&h(a.id)},[a,h]);if(!a)return(0,d.jsx)("section",{className:j().detailPanel,children:"No item selected"});let s=!f,t=!!(c&&!f);return(0,d.jsxs)("section",{className:j().detailPanel,children:[(0,d.jsxs)("div",{className:j().detailHeader,children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:j().detailTitle,children:_(a,0)}),(0,d.jsx)("div",{className:j().detailMeta,children:a.id})]}),a.status&&(0,d.jsx)("span",{className:j().statusPill,children:a.status})]}),(0,d.jsxs)("div",{className:j().formRow,children:[(0,d.jsx)("label",{className:j().formLabel,htmlFor:"dataset-item-notes",children:"Notes"}),(0,d.jsx)("textarea",{id:"dataset-item-notes",className:j().textArea,disabled:f,placeholder:"Add context for future experiments.",value:m,onChange:p})]}),(0,d.jsxs)("div",{className:j().formRow,children:[(0,d.jsx)("label",{className:j().formLabel,htmlFor:"dataset-item-expected",children:"Expected output"}),(0,d.jsx)("textarea",{id:"dataset-item-expected",className:j().textAreaLarge,disabled:f,value:k,onChange:o})]}),(0,d.jsxs)("div",{className:j().actionFooter,children:[(0,d.jsx)("div",{className:j().detailMeta,children:"Archived examples are hidden from the active dataset view but remain in Langfuse history."}),(0,d.jsxs)("div",{className:j().actionRow,children:[(0,d.jsx)("button",{className:j().dangerButton,disabled:!s,onClick:r,type:"button",children:"Archive item"}),(0,d.jsx)("button",{className:j().primaryButton,disabled:!t,onClick:q,type:"button",children:f?"Saving...":"Save changes"})]})]}),(0,d.jsxs)("div",{className:j().detailGrid,children:[(0,d.jsx)(U,{title:"Input",value:a.input}),(0,d.jsx)(U,{title:"Current expected output",value:a.expectedOutput})]}),(0,d.jsx)(U,{title:"Metadata",value:a.metadata}),(0,d.jsxs)("div",{className:j().traceSection,children:[(0,d.jsx)("div",{className:j().sectionTitle,children:"Source Trace"}),(0,d.jsx)(T,{traceId:i,systemId:b,compact:!0})]})]})}function T({traceId:a,systemId:b,compact:c}){let[f,g]=(0,e.useState)(null),[h,i]=(0,e.useState)(null),k=a?h?(0,d.jsx)("div",{className:j().errorPanel,children:h}):f?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:j().traceHeader,children:[(0,d.jsx)("span",{className:j().traceName,children:f.name??f.id}),f.timestamp&&(0,d.jsx)("span",{className:j().detailMeta,children:f.timestamp})]}),f.tags&&f.tags.length>0&&(0,d.jsx)("div",{className:j().tagRow,children:f.tags.map(a=>(0,d.jsx)("span",{className:j().tagPill,children:a},a))}),(0,d.jsx)(U,{title:"Trace metadata",value:f.metadata}),(0,d.jsxs)("div",{className:j().detailGrid,children:[(0,d.jsx)(U,{title:"Trace input",value:f.input}),(0,d.jsx)(U,{title:"Trace output",value:f.output})]})]}):(0,d.jsx)("div",{className:j().loadingPanel,children:"Loading trace..."}):(0,d.jsx)("div",{className:j().mutedText,children:"No source trace linked."});return c?k:(0,d.jsx)("section",{className:j().detailPanel,children:k})}function U({title:a,value:b}){var c;return(0,d.jsxs)("div",{className:j().jsonBlock,children:[(0,d.jsx)("div",{className:j().jsonTitle,children:a}),(0,d.jsx)("pre",{className:j().jsonPre,children:null==(c=b)?"(empty)":"string"==typeof c?c:JSON.stringify(c,null,2)})]})}function V(a){if(!a)return null;if("string"==typeof a.sourceTraceId&&a.sourceTraceId)return a.sourceTraceId;let b=a.metadata,c=b?.sourceTraceId??b?.traceId;return"string"==typeof c&&c?c:null}function W(a){return a.status?.toUpperCase()!=="ARCHIVED"}function X(a){let b=a.trim();if(b&&"(empty)"!==b)try{return JSON.parse(b)}catch{return b}}function Y(a){if(ab(a)&&"string"==typeof a.state&&"string"==typeof a.message&&"string"==typeof a.remediation)return{state:a.state,message:a.message,remediation:a.remediation,requiredEnvVars:ae(a.requiredEnvVars),optionalEnvVars:ae(a.optionalEnvVars),expectedEnvFile:af(a.expectedEnvFile),missingEnvVars:ae(a.missingEnvVars),lookup:ae(a.lookup),detail:af(a.detail)}}function Z(a){return ab(a)&&"string"==typeof a.name?{id:af(a.id),name:a.name,description:"string"==typeof a.description||null===a.description?a.description:void 0,metadata:ab(a.metadata)||null===a.metadata?a.metadata:void 0,createdAt:af(a.createdAt),updatedAt:af(a.updatedAt)}:null}function $(a){return ab(a)&&"string"==typeof a.id?{id:a.id,status:af(a.status),sourceTraceId:"string"==typeof a.sourceTraceId||null===a.sourceTraceId?a.sourceTraceId:void 0,input:a.input,expectedOutput:a.expectedOutput,metadata:ab(a.metadata)||null===a.metadata?a.metadata:void 0,createdAt:af(a.createdAt),updatedAt:af(a.updatedAt)}:null}function _(a,b){let c=a.metadata;for(let b of[c?.callSummary,c?.summary,c?.name,c?.analysisId,a.id])if("string"==typeof b&&b.trim())return b;return`Item ${b+1}`}function aa(a,b){if(!(a instanceof Element))return null;let c=a.closest("button");return c instanceof HTMLButtonElement?c.dataset[b]??null:null}function ab(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function ac(a){return"string"==typeof a}function ad(a){return null!==a}function ae(a){return Array.isArray(a)?a.filter(ac):[]}function af(a){return"string"==typeof a?a:void 0}function ag(a){var b,c,d,e,f;return ai(a)&&"string"==typeof a.id&&"string"==typeof a.identifier&&"string"==typeof a.title&&"string"==typeof a.url&&"string"==typeof a.createdAt&&"string"==typeof a.updatedAt?{id:a.id,identifier:a.identifier,title:a.title,description:"string"==typeof a.description||null===a.description?a.description:null,url:a.url,priority:"number"==typeof a.priority?a.priority:0,createdAt:a.createdAt,updatedAt:a.updatedAt,state:ai(b=a.state)&&"string"==typeof b.name&&"string"==typeof b.type?{name:b.name,type:b.type}:null,assignee:ai(c=a.assignee)&&"string"==typeof c.name?{name:c.name}:null,project:ai(d=a.project)&&"string"==typeof d.id&&"string"==typeof d.name?{id:d.id,name:d.name,url:"string"==typeof d.url?d.url:null}:null,team:ai(e=a.team)&&"string"==typeof e.key&&"string"==typeof e.name?{key:e.key,name:e.name}:null,labels:ai(f=a.labels)&&Array.isArray(f.nodes)?{nodes:f.nodes.map(a=>ai(a)&&"string"==typeof a.name?{name:a.name}:null).filter(ak)}:{nodes:[]}}:null}function ah(a){return Array.isArray(a)?a.filter(aj):[]}function ai(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function aj(a){return"string"==typeof a}function ak(a){return null!==a}function al(a){return"string"==typeof a?a:void 0}function am(a){return"string"==typeof a?a:null}Object.keys(x);var an=c(2377),ao=c.n(an);function ap({issue:a,issueTitle:b,showTitle:c=!1}){if(!a)return null;let e=b?`${a.id} \xb7 ${b}`:a.id;return(0,d.jsxs)("a",{className:ao().linearIssueLink,href:a.url,target:"_blank",rel:"noreferrer",title:b?`${a.id}: ${b}`:`Open ${a.id} in Linear`,onClick:aq,children:[(0,d.jsx)("img",{src:"/source-icons/linear.svg",alt:""}),(0,d.jsx)("span",{children:c?e:a.id})]})}function aq(a){a.stopPropagation()}let ar={running:{color:"#f5a623",bg:"rgba(245,166,35,0.1)",border:"rgba(245,166,35,0.3)"},complete:{color:"#00d4aa",bg:"rgba(0,212,170,0.1)",border:"rgba(0,212,170,0.3)"},crashed:{color:"#e8553d",bg:"rgba(232,85,61,0.1)",border:"rgba(232,85,61,0.3)"},aborted:{color:"rgba(250,250,250,0.4)",bg:"rgba(255,255,255,0.04)",border:"rgba(255,255,255,0.08)"}},as=ar.running;function at({metrics:a}){let b=Object.entries(a);return 0===b.length?null:(0,d.jsxs)("table",{className:ao().metricsTable,children:[(0,d.jsx)("thead",{children:(0,d.jsxs)("tr",{children:[(0,d.jsx)("th",{className:ao().metricsTableHeader,children:"Metric"}),(0,d.jsx)("th",{className:ao().metricsTableHeader,style:{textAlign:"right"},children:"Value"}),(0,d.jsx)("th",{className:ao().metricsTableHeader,style:{width:"40%"}})]})}),(0,d.jsx)("tbody",{children:b.map(([a,b])=>(0,d.jsxs)("tr",{className:ao().metricsTableRow,children:[(0,d.jsx)("td",{className:ao().metricsTableLabel,children:y(a)}),(0,d.jsx)("td",{className:ao().metricsTableValue,children:z(a,b)}),(0,d.jsx)("td",{className:ao().metricsTableBarCell,children:b>=0&&b<=1&&(0,d.jsx)("div",{className:ao().metricsTableBarTrack,children:(0,d.jsx)("div",{className:ao().metricsTableBar,style:{width:`${100*b}%`}})})})]},a))})]})}function au({run:a,primaryMetric:b,linearIssueTitle:c}){let e=ar[a.status]??as,f=A(a,b),g=function(a){let b=a.progress?.total||a.totalItems||a.evalConfig?.datasetItemCount||null;if(!b||b<=0)return null;let c="complete"===a.status?b:"number"==typeof a.progress?.completed?Math.min(a.progress.completed,b):null;return null===c?null:{completed:c,total:b,percent:Math.min(100,Math.max(0,c/b*100))}}(a);return(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:ao().detailPanelHeader,children:[(0,d.jsxs)("div",{className:ao().detailTitleStack,children:[(0,d.jsx)("h2",{className:ao().detailPanelTitle,children:a.runName}),a.linearIssue&&(0,d.jsx)(ap,{issue:a.linearIssue,issueTitle:c,showTitle:!0})]}),null!=f&&(0,d.jsx)("span",{className:ao().bestAccuracyInline,children:z(b??"score",f)}),(0,d.jsx)("span",{className:ao().statusBadge,style:{color:e.color,backgroundColor:e.bg,border:`1px solid ${e.border}`},children:a.status})]}),g&&(0,d.jsxs)("div",{className:ao().runProgressBlock,children:[(0,d.jsxs)("div",{className:ao().runProgressHeader,children:[(0,d.jsx)("span",{children:"Dataset items"}),(0,d.jsxs)("span",{children:[g.completed,"/",g.total]})]}),(0,d.jsx)("div",{className:ao().runProgressTrack,children:(0,d.jsx)("div",{className:ao().runProgressFill,style:{width:`${g.percent}%`}})})]}),(0,d.jsxs)("div",{className:ao().runMetaGrid,children:[(0,d.jsx)(av,{label:"Dataset",value:a.evalConfig?.dataset}),(0,d.jsx)(av,{label:"Eval version",value:"number"==typeof a.evalConfig?.evalVersion?`v${a.evalConfig.evalVersion}`:null}),(0,d.jsx)(av,{label:"Started",value:v(a.startedAt)}),(0,d.jsx)(av,{label:"Updated",value:v(a.updatedAt)}),a.worktreeBranch&&(0,d.jsx)(av,{label:"Branch",value:a.worktreeBranch}),a.parentId&&(0,d.jsx)(av,{label:"Parent",value:a.parentId})]}),(0,d.jsxs)("div",{className:ao().runSection,children:[(0,d.jsx)("span",{className:ao().runLabel,children:"Metrics"}),(0,d.jsx)(at,{metrics:a.metrics}),0===Object.keys(a.metrics).length&&(0,d.jsx)("div",{className:ao().detailEmpty,children:"No metrics yet."})]})]})}function av({label:a,value:b}){return b?(0,d.jsxs)("div",{className:ao().runMetaCell,children:[(0,d.jsx)("span",{className:ao().runMetaLabel,children:a}),(0,d.jsx)("span",{className:ao().runMetaValue,children:b})]}):null}function aw({run:a,primaryMetric:b,linearIssueTitle:c,onClose:e}){return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("div",{className:ao().detailPanelBackdrop,onClick:e}),(0,d.jsxs)("div",{className:ao().detailPanel,children:[(0,d.jsx)("button",{className:ao().detailPanelClose,onClick:e,children:"\xd7"}),(0,d.jsx)(au,{run:a,primaryMetric:b,linearIssueTitle:c})]})]})}var ax=c(3604),ay=c(7504),az=c(452);function aA(a){return a<60?`${a}s`:a<3600?`${Math.floor(a/60)}m`:`${Math.floor(a/3600)}h ${Math.floor(a%3600/60)}m`}function aB({node:a,isSelected:b,isBestGlobal:c,isHighlighted:f,primaryMetric:g,linearIssueTitles:h,onClick:i}){let j=a.data.status,k=ar[j.status]??as,l=A(j,g),m=null!=l?`${(100*l).toFixed(1)}%`:null,n="running"===j.status,o=function(a,b){let[c,d]=(0,e.useState)(Date.now());if(!a)return null;let f=new Date(a).getTime();return isNaN(f)?null:aA(Math.max(0,Math.floor((c-f)/1e3)))}(j.startedAt,0),p=n?null:function(a,b){if(!a||!b)return null;let c=new Date(a).getTime(),d=new Date(b).getTime();if(isNaN(c)||isNaN(d))return null;let e=Math.max(0,Math.floor((d-c)/1e3));return 0===e?null:aA(e)}(j.startedAt,j.updatedAt),q=j.linearIssue?h?.[j.linearIssue.id]??null:null;return(0,d.jsx)("foreignObject",{x:a.x-100,y:a.y-63,width:200,height:126,children:(0,d.jsxs)("button",{"data-run-id":j.runId,className:[ao().treeNodeCard,b?ao().treeNodeSelected:"",c?ao().treeNodeBest:"",f?ao().treeNodeHighlight:""].filter(Boolean).join(" "),onClick:i,title:q?`${j.runName}
2
- ${q}`:j.runName,children:[(0,d.jsx)("div",{className:ao().treeNodeName,children:j.runName}),(0,d.jsxs)("div",{className:ao().treeNodeBadgeRow,children:[(0,d.jsx)("span",{className:ao().treeNodeBadge,style:{color:k.color,backgroundColor:k.bg,border:`1px solid ${k.border}`},children:j.status}),n&&o&&(0,d.jsx)("span",{className:ao().treeNodeElapsed,children:o}),p&&(0,d.jsx)("span",{className:ao().treeNodeElapsed,children:p})]}),(0,d.jsx)("div",{className:ao().treeNodeScoreRow,children:m?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:ao().treeNodeAccuracy,children:m}),null!=j.totalItems&&(0,d.jsxs)("span",{className:ao().treeNodeItems,children:["n=",j.totalItems]})]}):"aborted"===j.status||"crashed"===j.status?(0,d.jsx)("span",{className:ao().treeNodeItems,children:"—"}):(0,d.jsxs)("span",{className:ao().treeNodeLoading,children:[(0,d.jsx)("span",{className:ao().treeNodePulse}),(0,d.jsx)("span",{className:ao().treeNodeLoadingText,children:"running"===j.status&&j.progress?`${j.progress.completed}/${j.progress.total}`:"running"===j.status?"Running eval...":"Pending"})]})}),j.linearIssue&&(0,d.jsx)("div",{className:ao().treeNodeIssueRow,children:(0,d.jsx)(ap,{issue:j.linearIssue,issueTitle:q,showTitle:!0})})]})})}function aC({link:a}){return(0,d.jsx)(az.LinkVertical,{data:a,stroke:"rgba(255, 255, 255, 0.25)",strokeWidth:1.5,fill:"none"})}function aD(a){return{status:a.status,children:a.children.map(aD)}}function aE(a){return a.depth>0&&null!==a.data.status}function aF({roots:a,selectedId:b,bestGlobalId:c,highlightId:f,primaryMetric:g,linearIssueTitles:h,onSelect:i}){let j=(0,e.useMemo)(()=>({status:null,children:a.map(aD)}),[a]),k=(0,e.useMemo)(()=>(0,ay.Sk)(j,a=>a.children.length>0?a.children:null),[j]);return 0===a.length?null:(0,d.jsx)("div",{className:ao().treeForest,children:(0,d.jsx)(ay.PH,{root:k,nodeSize:[216,158],separation:(a,b)=>a.parent===b.parent?1:1.1,children:a=>{let e=a.descendants(),j=a.links(),k=e.filter(aE),l=j.filter(a=>a.source.depth>0);if(0===k.length)return null;let m=1/0,n=-1/0,o=1/0,p=-1/0;for(let a of k)m=Math.min(m,a.x),n=Math.max(n,a.x),o=Math.min(o,a.y),p=Math.max(p,a.y);let q=n-m+200+80,r=p-o+126+80,s=-m+100+40,t=-o+63+40;return(0,d.jsx)("svg",{width:q,height:r,className:ao().treeSvg,children:(0,d.jsxs)(ax.Group,{top:t,left:s,children:[l.map((a,b)=>(0,d.jsx)(aC,{link:a},`link-${b}`)),k.map(a=>(0,d.jsx)(aB,{node:a,isSelected:b===a.data.status.runId,isBestGlobal:c===a.data.status.runId,isHighlighted:f===a.data.status.runId,primaryMetric:g,linearIssueTitles:h,onClick:()=>i(a.data.status.runId)},a.data.status.runId))]})})}})})}var aG=c(7048),aH=c.n(aG);function aI({runs:a,primaryMetric:b,bestGlobalId:c,selectedId:f,linearIssueTitles:g,onSelect:h}){let[i,j]=(0,e.useState)(b??""),[k,l]=(0,e.useState)(!0),m=(0,e.useRef)(new Map),n=(0,e.useRef)(new Map),o=(0,e.useMemo)(()=>{let c=new Set;for(let b of a)for(let a of Object.keys(b.metrics))c.add(a);return[...c].sort((a,c)=>a===b?-1:c===b?1:a.localeCompare(c))},[a,b]),p=(0,e.useMemo)(()=>{let b=[...a];return b.sort((a,b)=>{let c=i?a.metrics[i]??-1/0:0,d=i?b.metrics[i]??-1/0:0,e=k?d-c:c-d;return 0!==e?e:(b.totalItems??0)-(a.totalItems??0)}),b},[a,i,k]),q=(0,e.useCallback)(a=>{for(let[a,b]of m.current)n.current.set(a,b.getBoundingClientRect().top);a===i?l(a=>!a):(j(a),l(!0))},[i]);return 0===a.length?(0,d.jsx)("p",{className:aH().noData,children:"No experiments yet."}):(0,d.jsx)("div",{className:aH().tableWrapper,children:(0,d.jsxs)("table",{className:aH().table,children:[(0,d.jsx)("thead",{children:(0,d.jsxs)("tr",{children:[(0,d.jsx)("th",{className:aH().thRank,children:"#"}),(0,d.jsx)("th",{className:aH().thName,children:"Run"}),(0,d.jsx)("th",{className:aH().thStatus,children:"Status"}),o.map(a=>(0,d.jsxs)("th",{className:`${aH().thMetric} ${a===b?aH().thPrimary:""} ${a===i?aH().thSorted:""}`,onClick:()=>q(a),children:[(0,d.jsx)("span",{className:aH().thLabel,children:y(a)}),a===i&&(0,d.jsx)("span",{className:aH().sortArrow,children:k?"▼":"▲"})]},a)),(0,d.jsx)("th",{className:aH().thItems,children:"n"}),(0,d.jsx)("th",{className:aH().thStarted,children:"Started"})]})}),(0,d.jsx)("tbody",{children:p.map((a,e)=>{let i=ar[a.status]??as,j=a.runId===c,k=a.runId===f;return(0,d.jsxs)("tr",{ref:b=>{b?m.current.set(a.runId,b):m.current.delete(a.runId)},className:`${aH().row} ${j?aH().rowBest:""} ${k?aH().rowSelected:""}`,onClick:()=>h(a.runId),children:[(0,d.jsx)("td",{className:aH().tdRank,children:e+1}),(0,d.jsxs)("td",{className:aH().tdName,children:[(0,d.jsx)("span",{className:aH().expName,children:a.runName}),(0,d.jsx)(ap,{issue:a.linearIssue,issueTitle:a.linearIssue?g?.[a.linearIssue.id]:null}),j&&(0,d.jsx)("span",{className:aH().bestBadge,children:"BEST"})]}),(0,d.jsx)("td",{className:aH().tdStatus,children:(0,d.jsx)("span",{className:aH().statusDot,style:{backgroundColor:i.color},title:a.status})}),o.map(c=>{let e=a.metrics[c],f=c===b;return(0,d.jsx)("td",{className:`${aH().tdMetric} ${f?aH().tdPrimary:""}`,children:null!=e?(0,d.jsx)("span",{className:aH().metricValue,children:z(c,e)}):(0,d.jsx)("span",{className:aH().metricEmpty,children:"—"})},c)}),(0,d.jsx)("td",{className:aH().tdItems,children:a.totalItems??"?"}),(0,d.jsx)("td",{className:aH().tdStarted,children:v(a.startedAt)})]},a.runId)})})]})})}function aJ({runs:a,primaryMetric:b,bestRunId:c,selectedRunId:e,linearIssueTitles:f,onSelectRun:g}){return(0,d.jsx)(aI,{runs:a,primaryMetric:b,bestGlobalId:c,selectedId:e,linearIssueTitles:f,onSelect:g})}function aK({system:a}){let{runs:b}=u(a.id),[c,f]=(0,e.useState)(null),[g]=(0,e.useState)(null),[h,i]=(0,e.useState)(null),[k,l]=(0,e.useState)(280),[m,n]=(0,e.useState)({}),o=(0,e.useCallback)(()=>{f(null)},[]),p=(0,e.useCallback)(a=>{let b=function(a){if(!(a instanceof Element))return null;let b=a.closest("button");return b instanceof HTMLButtonElement?b.dataset.groupKey??null:null}(a.target);b&&i(b)},[]),q=(0,e.useCallback)(a=>{a.preventDefault();let b=a.clientX,c=a=>{l(Math.min(560,Math.max(220,k+a.clientX-b)))};document.body.style.cursor="col-resize",document.body.style.userSelect="none",document.addEventListener("pointermove",c),document.addEventListener("pointerup",()=>{document.removeEventListener("pointermove",c),document.body.style.cursor="",document.body.style.userSelect=""},{once:!0})},[k]),r=a.primaryMetric??null,s=(0,e.useMemo)(()=>{let a=new Map;for(let c of b){let b=B(c,r),d=a.get(b.key);d?d.count++:a.set(b.key,{...b,count:1})}return[...a.values()].sort((a,b)=>{let c=a.dataset.localeCompare(b.dataset);return 0===c?a.evalLabel.localeCompare(b.evalLabel):c})},[r,b]),t=h&&s.some(a=>a.key===h)?h:s[0]?.key??null,v=(0,e.useMemo)(()=>t?b.filter(a=>B(a,r).key===t):b,[b,t,r]),w=(0,e.useMemo)(()=>(function(a,b){let c=new Map;for(let b of a)c.set(b.runId,{status:b,children:[]});let d=[];for(let a of c.values()){let b=a.status.parentId;b&&c.has(b)?c.get(b).children.push(a):d.push(a)}let e=a=>{for(let c of(a.sort((a,c)=>(A(c.status,b)??-1)-(A(a.status,b)??-1)),a))e(c.children)};return e(d),d})(v,r),[v,r]),x=(0,e.useMemo)(()=>{let a=null,b=-1;for(let c of v){let d=A(c,r);null!=d&&d>b&&(b=d,a=c.runId)}return a},[v,r]),y=c?v.find(a=>a.runId===c):null;return(0,d.jsxs)("div",{className:j().experimentsLayout,children:[(0,d.jsx)("aside",{className:`${j().dataNav} ${j().experimentNav}`,style:{width:k},onClick:p,children:0===s.length?(0,d.jsx)("div",{className:j().dataNavEmpty,children:"No experiments yet"}):s.map(a=>(0,d.jsxs)("button",{"data-group-key":a.key,title:`${a.datasetLabel}
3
- ${a.evalLabel} \xb7 ${a.count} experiments`,className:`${j().dataNavItem} ${j().dataNavGroupItem} ${j().experimentNavItem} ${t===a.key?j().dataNavItemActive:""}`,children:[(0,d.jsx)("span",{className:j().dataNavItemText,children:a.datasetLabel}),(0,d.jsxs)("span",{className:j().dataNavItemMeta,children:[a.evalLabel," \xb7 ",a.count]})]},a.key))}),(0,d.jsx)("div",{className:j().sidebarResizeHandle,role:"separator","aria-label":"Resize benchmarks","aria-orientation":"vertical",onPointerDown:q}),(0,d.jsxs)("section",{className:`${j().dataMain} ${j().experimentsMain}`,children:[(0,d.jsx)(D,{title:"Local experiments",source:"local",syncLabel:"Live updates",children:"Choose a benchmark on the left. Kaizen only compares experiments inside the selected benchmark, because scores from different datasets or scoring setups are not scientifically comparable."}),(0,d.jsx)(aF,{roots:w,selectedId:c,bestGlobalId:x,highlightId:g,primaryMetric:r,linearIssueTitles:m,onSelect:f}),y&&(0,d.jsx)(aw,{run:y,primaryMetric:r,linearIssueTitle:y.linearIssue?m[y.linearIssue.id]:null,onClose:o}),(0,d.jsx)(aJ,{runs:v,primaryMetric:r,bestRunId:x,selectedRunId:c,linearIssueTitles:m,onSelectRun:f})]})]})}function aL({system:a}){let[b,c]=(0,e.useState)([]),[f,g]=(0,e.useState)(null),[h,i]=(0,e.useState)(void 0),[k,m]=(0,e.useState)(null),[n,o]=(0,e.useState)(null),[p,q]=(0,e.useState)(!1),[r,s]=(0,e.useState)(!1),[t,u]=(0,e.useState)(null),v=(0,e.useRef)(a.id);v.current=a.id;let w=(0,e.useCallback)(async()=>{let b=a.id;q(!0);try{var d;let a=await fetch(`/api/linear-ideas?systemId=${encodeURIComponent(b)}`),e=(d=await a.json(),ai(d)?{ideas:Array.isArray(d.ideas)?d.ideas.map(ag).filter(ak):void 0,config:function(a){if(ai(a))return{teamKey:am(a.teamKey),projectName:am(a.projectName),projectId:am(a.projectId),projectUrl:am(a.projectUrl),projectRef:am(a.projectRef),projectRefKind:am(a.projectRefKind),label:al(a.label)??"Kaizen"}}(d.config),connection:function(a){if(ai(a)&&function(a){switch(a){case"connected":case"missing_project":case"missing_api_key":case"project_not_found":case"auth_failed":case"query_failed":case"network_error":return!0;default:return!1}}(a.state)&&"string"==typeof a.message&&"string"==typeof a.remediation)return{state:a.state,message:a.message,remediation:a.remediation,requiredEnvVars:ah(a.requiredEnvVars),optionalEnvVars:ah(a.optionalEnvVars),expectedEnvFile:al(a.expectedEnvFile),missingEnvVars:ah(a.missingEnvVars),lookup:ah(a.lookup),detail:al(a.detail)}}(d.connection),error:al(d.error)}:{});if(!a.ok)throw Error(e.error??`HTTP ${a.status}`);if(v.current!==b)return;c(e.ideas??[]),i(e.config),m(e.connection??null),g(a=>a&&(e.ideas??[]).some(b=>b.id===a)?a:e.ideas?.[0]?.id??null),o(e.error??null),u(K())}catch(a){if(v.current!==b)return;m(null),o(a instanceof Error?a.message:String(a))}finally{v.current===b&&(s(!0),q(!1))}},[a.id]),x=(0,e.useCallback)(()=>{w()},[w]),y=(0,e.useMemo)(()=>b.find(a=>a.id===f)??b[0]??null,[b,f]),z=h?.teamKey??null,A=h?.projectRef??null,B=h?.label??"Kaizen",C=(0,e.useMemo)(()=>{var a;return[(a={teamKey:z,projectRef:A,label:B}).teamKey?`LINEAR_TEAM_KEY=${a.teamKey}`:"any team",a.projectRef?`linear_project=${a.projectRef}`:"linear_project not set",`label=${a.label}`]},[B,A,z]);return(0,d.jsxs)("div",{className:j().surface,children:[(0,d.jsxs)(D,{title:"Linear ideas",source:"linear",syncLabel:L(t,2e4),onRefresh:x,refreshing:p,children:["This shows Linear issues that Kaizen can try as experiments. For this system, Kaizen looks",h?.projectName||h?.projectRef?(0,d.jsxs)(d.Fragment,{children:[" in project ",(0,d.jsxs)("span",{className:j().inlineSourceValue,children:[(0,d.jsx)("code",{children:h.projectName??h.projectRef}),(0,d.jsx)(l,{source:"code"})]})]}):" in the Linear project configured in this system's code"," ","for issues labeled ",(0,d.jsx)("code",{children:"Kaizen"}),". Label a Linear issue"," ",(0,d.jsx)("code",{children:"Kaizen"})," when you want Kaizen to try it as an experiment."]}),k&&"connected"!==k.state&&(0,d.jsx)(H,{status:k,currentValues:C}),n&&(0,d.jsx)("div",{className:j().errorPanel,children:n}),p&&!r?(0,d.jsx)("div",{className:j().loadingPanel,children:"Loading Linear ideas..."}):(0,d.jsxs)("div",{className:j().splitSurface,children:[(0,d.jsx)(aM,{ideas:b,selectedId:y?.id??null,onSelect:g}),(0,d.jsx)(aN,{idea:y})]})]})}function aM({ideas:a,selectedId:b,onSelect:c}){let f=(0,e.useCallback)(a=>{let b=function(a){if(!(a instanceof Element))return null;let b=a.closest("button");return b instanceof HTMLButtonElement?b.dataset.ideaId??null:null}(a.target);b&&c(b)},[c]);return 0===a.length?(0,d.jsx)("div",{className:j().listPanelEmpty,children:"No Linear ideas"}):(0,d.jsx)("aside",{className:j().listPanel,onClick:f,children:a.map(a=>(0,d.jsxs)("button",{"data-idea-id":a.id,className:`${j().listRow} ${b===a.id?j().listRowSelected:""}`,children:[(0,d.jsx)("span",{className:j().listRowTitle,children:a.title}),(0,d.jsxs)("span",{className:j().listRowMeta,children:[a.identifier," \xb7 ",a.state?.name??"No status"]})]},a.id))})}function aN({idea:a}){var b;let c;return a?(0,d.jsxs)("section",{className:j().detailPanel,children:[(0,d.jsxs)("div",{className:j().detailHeader,children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:j().detailTitle,children:a.title}),(0,d.jsx)("a",{className:j().detailLink,href:a.url,target:"_blank",rel:"noreferrer",children:a.identifier})]}),a.state&&(0,d.jsx)("span",{className:j().statusPill,children:a.state.name})]}),(0,d.jsxs)("div",{className:j().ideaMetaGrid,children:[(0,d.jsx)(aO,{label:"Team",value:a.team?.key??a.team?.name}),(0,d.jsx)(aO,{label:"Project",value:a.project?.name}),(0,d.jsx)(aO,{label:"Assignee",value:a.assignee?.name}),(0,d.jsx)(aO,{label:"Updated",value:Number.isNaN((c=new Date(b=a.updatedAt)).getTime())?b:c.toLocaleString()})]}),a.labels.nodes.length>0&&(0,d.jsx)("div",{className:j().tagRow,children:a.labels.nodes.map(a=>(0,d.jsx)("span",{className:j().tagPill,children:a.name},a.name))}),(0,d.jsx)("div",{className:j().descriptionBlock,children:a.description||"No description."})]}):(0,d.jsx)("section",{className:j().detailPanel,children:"No idea selected"})}function aO({label:a,value:b}){return(0,d.jsxs)("div",{className:j().metaCell,children:[(0,d.jsx)("span",{className:j().metaLabel,children:a}),(0,d.jsx)("span",{className:j().metaValue,children:b??"Unassigned"})]})}function aP({surface:a}){let{systems:b,activeSystemId:c}=(0,f.V)(),g=(0,e.useMemo)(()=>b.find(a=>a.id===c)??null,[c,b]);return(0,d.jsx)(t,{activeSystem:g,activeSurface:a,children:g?"data"===a?(0,d.jsx)(M,{system:g}):"benchmarks"===a?(0,d.jsx)(F,{system:g}):"ideas"===a?(0,d.jsx)(aL,{system:g}):(0,d.jsx)(aK,{system:g}):(0,d.jsx)(aQ,{systemCount:b.length})})}function aQ({systemCount:a}){return(0,d.jsxs)("div",{className:j().emptyState,children:[(0,d.jsx)("img",{src:"/logo-cream.svg",alt:"Kaizen",className:j().emptyLogo}),(0,d.jsx)("h1",{className:j().emptyTitle,children:"Kaizen"}),(0,d.jsx)("p",{className:j().emptyCopy,children:"Select a system to inspect its data, benchmarks, ideas, and experiments."}),(0,d.jsxs)("span",{className:j().emptyMeta,children:[a," system",1===a?"":"s"]})]})}},9990:()=>{}};
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Kaizen</title><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="64x64" href="/favicon-64.png"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="preload" href="/_next/static/css/1224a99c5dfac9b3.css" as="style"/><link rel="preload" href="/_next/static/css/e75cf1946c214544.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1224a99c5dfac9b3.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/css/e75cf1946c214544.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8c7966d82a2912f0.js" defer=""></script><script src="/_next/static/chunks/framework-7089c270fe56b51f.js" defer=""></script><script src="/_next/static/chunks/main-7ac7f96d288497aa.js" defer=""></script><script src="/_next/static/chunks/pages/_app-40b8f71fde4e6347.js" defer=""></script><script src="/_next/static/chunks/431-43358ce3c29e5e1b.js" defer=""></script><script src="/_next/static/chunks/374-421036d63d323cc9.js" defer=""></script><script src="/_next/static/chunks/pages/%5Bsystem%5D/data-57686b9546f2794a.js" defer=""></script><script src="/_next/static/q7hDbHI4NR8DdLDV3kWYh/_buildManifest.js" defer=""></script><script src="/_next/static/q7hDbHI4NR8DdLDV3kWYh/_ssgManifest.js" defer=""></script></head><body><link rel="preload" as="image" href="/logo-cream.svg"/><div id="__next"><div style="height:100vh;overflow:auto"><div class="Studio_page__X6enu"><header class="Studio_topBar__OlLt6"><a class="Studio_logoLink__Hv20q" aria-label="Kaizen home" href="/"><img src="/logo-cream.svg" alt="" class="Studio_topLogo__YEKp4"/></a><div class="Studio_systemSlot__5m3MM"><label class="SystemSelector_wrapper__ERtiP"><span class="SystemSelector_label__4i0LZ">System</span><select class="SystemSelector_select__NXXNb"><option value="" disabled="" selected="">Choose</option></select></label></div><nav class="Studio_surfaceNav__RKZjS" aria-label="Kaizen surfaces"><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Data</span><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Benchmarks</span><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Ideas</span><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Experiments</span></nav><div></div></header><main class="Studio_content__LELHT"><div class="Studio_emptyState__dwICN"><img src="/logo-cream.svg" alt="Kaizen" class="Studio_emptyLogo__ehso4"/><h1 class="Studio_emptyTitle__ByiEP">Kaizen</h1><p class="Studio_emptyCopy__NP7hT">Select a system to inspect its data, benchmarks, ideas, and experiments.</p><span class="Studio_emptyMeta__Bsrtp">0<!-- --> system<!-- -->s</span></div></main></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/[system]/data","query":{},"buildId":"q7hDbHI4NR8DdLDV3kWYh","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>
@@ -1 +0,0 @@
1
- {"version":1,"files":["../../webpack-runtime.js","../../chunks/825.js","../../chunks/916.js","../../chunks/215.js","../../chunks/785.js","../../chunks/946.js","../../chunks/424.js","../../../../../shared/linear-ideas.js","../../../../../package.json","../../../../../../../package.json"]}
@@ -1 +0,0 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8" data-next-head=""/><meta name="viewport" content="width=device-width" data-next-head=""/><title data-next-head="">Kaizen</title><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png"/><link rel="icon" type="image/png" sizes="64x64" href="/favicon-64.png"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><link rel="preload" href="/_next/static/css/1224a99c5dfac9b3.css" as="style"/><link rel="preload" href="/_next/static/css/e75cf1946c214544.css" as="style"/><link rel="stylesheet" href="/_next/static/css/1224a99c5dfac9b3.css" data-n-g=""/><link rel="stylesheet" href="/_next/static/css/e75cf1946c214544.css" data-n-p=""/><noscript data-n-css=""></noscript><script defer="" noModule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-8c7966d82a2912f0.js" defer=""></script><script src="/_next/static/chunks/framework-7089c270fe56b51f.js" defer=""></script><script src="/_next/static/chunks/main-7ac7f96d288497aa.js" defer=""></script><script src="/_next/static/chunks/pages/_app-40b8f71fde4e6347.js" defer=""></script><script src="/_next/static/chunks/431-43358ce3c29e5e1b.js" defer=""></script><script src="/_next/static/chunks/374-421036d63d323cc9.js" defer=""></script><script src="/_next/static/chunks/pages/%5Bsystem%5D/experiments-4d2122d6ada9a04a.js" defer=""></script><script src="/_next/static/q7hDbHI4NR8DdLDV3kWYh/_buildManifest.js" defer=""></script><script src="/_next/static/q7hDbHI4NR8DdLDV3kWYh/_ssgManifest.js" defer=""></script></head><body><link rel="preload" as="image" href="/logo-cream.svg"/><div id="__next"><div style="height:100vh;overflow:auto"><div class="Studio_page__X6enu"><header class="Studio_topBar__OlLt6"><a class="Studio_logoLink__Hv20q" aria-label="Kaizen home" href="/"><img src="/logo-cream.svg" alt="" class="Studio_topLogo__YEKp4"/></a><div class="Studio_systemSlot__5m3MM"><label class="SystemSelector_wrapper__ERtiP"><span class="SystemSelector_label__4i0LZ">System</span><select class="SystemSelector_select__NXXNb"><option value="" disabled="" selected="">Choose</option></select></label></div><nav class="Studio_surfaceNav__RKZjS" aria-label="Kaizen surfaces"><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Data</span><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Benchmarks</span><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Ideas</span><span class="Studio_surfaceLink__ivMXp Studio_surfaceLinkDisabled__gfVYR">Experiments</span></nav><div></div></header><main class="Studio_content__LELHT"><div class="Studio_emptyState__dwICN"><img src="/logo-cream.svg" alt="Kaizen" class="Studio_emptyLogo__ehso4"/><h1 class="Studio_emptyTitle__ByiEP">Kaizen</h1><p class="Studio_emptyCopy__NP7hT">Select a system to inspect its data, benchmarks, ideas, and experiments.</p><span class="Studio_emptyMeta__Bsrtp">0<!-- --> system<!-- -->s</span></div></main></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{}},"page":"/[system]/experiments","query":{},"buildId":"q7hDbHI4NR8DdLDV3kWYh","nextExport":true,"autoExport":true,"isFallback":false,"scriptLoader":[]}</script></body></html>