@sanity/ailf-studio 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1080,16 +1080,280 @@ var reportSchema = defineType4({
1080
1080
  // src/schema/task.ts
1081
1081
  import { defineField as defineField5, defineType as defineType5 } from "sanity";
1082
1082
 
1083
+ // src/components/AssertionInput.tsx
1084
+ import { HelpCircleIcon } from "@sanity/icons";
1085
+ import { Box as Box2, Card, Flex, Stack as Stack2, Text as Text2 } from "@sanity/ui";
1086
+ import { useCallback as useCallback2 } from "react";
1087
+ import { Fragment, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
1088
+ var TYPE_HELP = {
1089
+ "llm-rubric": {
1090
+ description: "Sends the LLM output to a grader model that scores it against a rubric template. Select a template and add task-specific criteria bullets that describe what the grader should check."
1091
+ },
1092
+ contains: {
1093
+ description: "Passes if the output contains this exact substring. Case-sensitive.",
1094
+ valueHint: "The exact text that must appear in the output.",
1095
+ example: "createClient"
1096
+ },
1097
+ "contains-any": {
1098
+ description: "Passes if the output contains at least one of the given substrings. Case-sensitive. Enter each substring on a separate line.",
1099
+ valueHint: "One substring per line \u2014 passes if any match.",
1100
+ example: "createClient\ngetClient"
1101
+ },
1102
+ "contains-all": {
1103
+ description: "Passes if the output contains all of the given substrings. Case-sensitive. Enter each substring on a separate line.",
1104
+ valueHint: "One substring per line \u2014 all must match.",
1105
+ example: "import\ncreateClient\nclient.fetch"
1106
+ },
1107
+ "not-contains": {
1108
+ description: "Passes if the output does NOT contain this substring. Case-sensitive. Useful for checking that deprecated patterns or incorrect APIs are absent.",
1109
+ valueHint: "Text that must NOT appear in the output.",
1110
+ example: "documentStore"
1111
+ },
1112
+ icontains: {
1113
+ description: "Like contains, but case-insensitive. Passes if the output contains this substring regardless of casing.",
1114
+ valueHint: "The text that must appear (case-insensitive).",
1115
+ example: "groq"
1116
+ },
1117
+ "icontains-any": {
1118
+ description: "Like contains-any, but case-insensitive. Passes if the output contains at least one substring, ignoring case. Enter each on a separate line.",
1119
+ valueHint: "One substring per line \u2014 passes if any match (case-insensitive).",
1120
+ example: "GROQ\ngroq\nGroq"
1121
+ },
1122
+ regex: {
1123
+ description: "Passes if the output matches this regular expression pattern. Uses JavaScript regex syntax (without delimiters).",
1124
+ valueHint: "A JavaScript regular expression pattern.",
1125
+ example: "import\\s+\\{.*createClient.*\\}\\s+from"
1126
+ },
1127
+ javascript: {
1128
+ description: "A JavaScript function body that evaluates the output. Receives the variable 'output' (string) and must return true (pass) or false (fail). Can also return a number 0\u20131 for scored assertions, or an object { pass: boolean, score: number, reason: string }.",
1129
+ valueHint: "JavaScript code \u2014 'output' variable is available.",
1130
+ example: "// Check for correct import pattern\nconst hasImport = output.includes('createClient');\nconst noDeprecated = !output.includes('documentStore');\nreturn hasImport && noDeprecated;"
1131
+ },
1132
+ similar: {
1133
+ description: "Passes if the output is semantically similar to the value text, using embedding-based cosine similarity. Set the threshold between 0 (no similarity required) and 1 (exact match).",
1134
+ valueHint: "Reference text to compare against.",
1135
+ thresholdHint: "Similarity score 0\u20131 (e.g. 0.8 for strong match)."
1136
+ },
1137
+ cost: {
1138
+ description: "Passes if the API call cost is below the threshold. Useful for ensuring tasks stay within budget.",
1139
+ thresholdHint: "Maximum cost in dollars (e.g. 0.05)."
1140
+ },
1141
+ latency: {
1142
+ description: "Passes if the API call latency is below the threshold. Useful for performance-sensitive evaluations.",
1143
+ thresholdHint: "Maximum latency in milliseconds (e.g. 5000)."
1144
+ }
1145
+ };
1146
+ var MONOSPACE_TYPES = /* @__PURE__ */ new Set(["javascript", "regex"]);
1147
+ var MONOSPACE_STYLE = `
1148
+ [data-ailf-monospace="true"] textarea {
1149
+ font-family: "SF Mono", "Fira Code", "Fira Mono", Menlo, Consolas, monospace !important;
1150
+ font-size: 13px !important;
1151
+ line-height: 1.5 !important;
1152
+ tab-size: 2;
1153
+ }
1154
+ `;
1155
+ var TEMPLATE_HELP = {
1156
+ "task-completion": {
1157
+ description: "Scores whether the LLM produced a functional implementation that satisfies the task requirements. This is the most heavily weighted dimension.",
1158
+ weight: "50% of composite score",
1159
+ scaleHint: "0 = couldn't attempt \u2192 50 = major gaps \u2192 100 = fully functional"
1160
+ },
1161
+ "code-correctness": {
1162
+ description: "Scores whether the code follows best practices, uses current APIs, and avoids anti-patterns. Checks for idiomatic implementation and correct API usage.",
1163
+ weight: "25% of composite score",
1164
+ scaleHint: "0 = broken/deprecated \u2192 50 = works but not idiomatic \u2192 100 = best practices"
1165
+ },
1166
+ "doc-coverage": {
1167
+ description: "Scores how much of the implementation could be derived from the provided documentation vs. requiring hallucination or guesswork. Measures doc quality.",
1168
+ weight: "25% of composite score",
1169
+ scaleHint: "0 = had to hallucinate \u2192 50 = inferred from partial info \u2192 100 = fully covered"
1170
+ }
1171
+ };
1172
+ function TypeHelpCard({ help }) {
1173
+ return /* @__PURE__ */ jsx2(Card, { padding: 3, radius: 2, tone: "transparent", border: true, children: /* @__PURE__ */ jsxs2(Stack2, { space: 3, children: [
1174
+ /* @__PURE__ */ jsxs2(Flex, { align: "flex-start", gap: 2, children: [
1175
+ /* @__PURE__ */ jsx2(Box2, { style: { flexShrink: 0, marginTop: 1 }, children: /* @__PURE__ */ jsx2(Text2, { size: 1, muted: true, children: /* @__PURE__ */ jsx2(HelpCircleIcon, {}) }) }),
1176
+ /* @__PURE__ */ jsx2(Text2, { size: 1, muted: true, children: help.description })
1177
+ ] }),
1178
+ (help.valueHint || help.thresholdHint || help.example) && /* @__PURE__ */ jsxs2(Stack2, { space: 2, paddingLeft: 4, children: [
1179
+ help.valueHint && /* @__PURE__ */ jsxs2(Text2, { size: 0, muted: true, children: [
1180
+ /* @__PURE__ */ jsx2("strong", { children: "Value:" }),
1181
+ " ",
1182
+ help.valueHint
1183
+ ] }),
1184
+ help.thresholdHint && /* @__PURE__ */ jsxs2(Text2, { size: 0, muted: true, children: [
1185
+ /* @__PURE__ */ jsx2("strong", { children: "Threshold:" }),
1186
+ " ",
1187
+ help.thresholdHint
1188
+ ] }),
1189
+ help.example && /* @__PURE__ */ jsxs2(Box2, { marginTop: 1, children: [
1190
+ /* @__PURE__ */ jsx2(Text2, { size: 0, muted: true, children: /* @__PURE__ */ jsx2("strong", { children: "Example:" }) }),
1191
+ /* @__PURE__ */ jsx2(
1192
+ Box2,
1193
+ {
1194
+ marginTop: 1,
1195
+ style: {
1196
+ background: "var(--card-code-bg-color, #f5f5f5)",
1197
+ borderRadius: 3,
1198
+ padding: "6px 8px",
1199
+ fontFamily: '"SF Mono", "Fira Code", Menlo, Consolas, monospace',
1200
+ fontSize: 12,
1201
+ lineHeight: 1.5,
1202
+ whiteSpace: "pre-wrap",
1203
+ wordBreak: "break-word"
1204
+ },
1205
+ children: help.example
1206
+ }
1207
+ )
1208
+ ] })
1209
+ ] })
1210
+ ] }) });
1211
+ }
1212
+ function TemplateHelpCard({ help }) {
1213
+ return /* @__PURE__ */ jsx2(Card, { padding: 3, radius: 2, tone: "transparent", border: true, children: /* @__PURE__ */ jsxs2(Stack2, { space: 2, children: [
1214
+ /* @__PURE__ */ jsxs2(Flex, { align: "flex-start", gap: 2, children: [
1215
+ /* @__PURE__ */ jsx2(Box2, { style: { flexShrink: 0, marginTop: 1 }, children: /* @__PURE__ */ jsx2(Text2, { size: 1, muted: true, children: /* @__PURE__ */ jsx2(HelpCircleIcon, {}) }) }),
1216
+ /* @__PURE__ */ jsx2(Text2, { size: 1, muted: true, children: help.description })
1217
+ ] }),
1218
+ /* @__PURE__ */ jsxs2(Stack2, { space: 1, paddingLeft: 4, children: [
1219
+ /* @__PURE__ */ jsxs2(Text2, { size: 0, muted: true, children: [
1220
+ /* @__PURE__ */ jsx2("strong", { children: "Weight:" }),
1221
+ " ",
1222
+ help.weight
1223
+ ] }),
1224
+ /* @__PURE__ */ jsxs2(Text2, { size: 0, muted: true, children: [
1225
+ /* @__PURE__ */ jsx2("strong", { children: "Scale:" }),
1226
+ " ",
1227
+ help.scaleHint
1228
+ ] })
1229
+ ] })
1230
+ ] }) });
1231
+ }
1232
+ function AssertionInput(props) {
1233
+ const value = props.value;
1234
+ const selectedType = typeof value?.type === "string" ? value.type : null;
1235
+ const selectedTemplate = typeof value?.template === "string" ? value.template : null;
1236
+ const typeHelp = selectedType ? TYPE_HELP[selectedType] : null;
1237
+ const templateHelp = selectedTemplate ? TEMPLATE_HELP[selectedTemplate] : null;
1238
+ const isMonospace = selectedType ? MONOSPACE_TYPES.has(selectedType) : false;
1239
+ const { renderField: parentRenderField } = props;
1240
+ const renderField = useCallback2(
1241
+ (fieldProps) => {
1242
+ const rendered = parentRenderField(fieldProps);
1243
+ if (fieldProps.name === "type" && typeHelp) {
1244
+ return /* @__PURE__ */ jsxs2(Stack2, { space: 3, children: [
1245
+ rendered,
1246
+ /* @__PURE__ */ jsx2(TypeHelpCard, { help: typeHelp })
1247
+ ] });
1248
+ }
1249
+ if (fieldProps.name === "template" && templateHelp) {
1250
+ return /* @__PURE__ */ jsxs2(Stack2, { space: 3, children: [
1251
+ rendered,
1252
+ /* @__PURE__ */ jsx2(TemplateHelpCard, { help: templateHelp })
1253
+ ] });
1254
+ }
1255
+ return rendered;
1256
+ },
1257
+ [typeHelp, templateHelp, parentRenderField]
1258
+ );
1259
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
1260
+ isMonospace && /* @__PURE__ */ jsx2("style", { children: MONOSPACE_STYLE }),
1261
+ /* @__PURE__ */ jsx2("div", { "data-ailf-monospace": isMonospace ? "true" : void 0, children: props.renderDefault({ ...props, renderField }) })
1262
+ ] });
1263
+ }
1264
+
1265
+ // src/components/CanonicalDocInput.tsx
1266
+ import { HelpCircleIcon as HelpCircleIcon2 } from "@sanity/icons";
1267
+ import { Box as Box3, Card as Card2, Flex as Flex2, Stack as Stack3, Text as Text3 } from "@sanity/ui";
1268
+ import { useCallback as useCallback3 } from "react";
1269
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1270
+ var REF_TYPE_HELP = {
1271
+ slug: {
1272
+ description: "Resolves a single article by its slug field. This is the most common type for referencing published documentation. Note: slugs may not be unique across sections \u2014 prefer path for unambiguous references.",
1273
+ valueHint: "The article's slug (e.g. 'groq-introduction').",
1274
+ example: "groq-introduction"
1275
+ },
1276
+ path: {
1277
+ description: "Resolves a single article by its full URL path after /docs/. This is unique across sections and is the most reliable way to reference a specific article.",
1278
+ valueHint: "Full path after /docs/ (e.g. 'groq/groq-introduction').",
1279
+ example: "groq/groq-introduction"
1280
+ },
1281
+ id: {
1282
+ description: "Resolves a single document by its Sanity _id. Use this for drafts, imports, or documents that don't have a stable slug or path yet.",
1283
+ valueHint: "The Sanity document _id (e.g. 'article-3f8a2b1c').",
1284
+ example: "article-3f8a2b1c"
1285
+ },
1286
+ perspective: {
1287
+ description: "Includes all articles from a content release. Use this when evaluating new feature documentation that only exists in a release \u2014 the pipeline auto-discovers all articles in the release at evaluation time.",
1288
+ valueHint: "The content release ID (bundle name).",
1289
+ example: "bundle-chatbox-launch"
1290
+ }
1291
+ };
1292
+ function RefTypeHelpCard({ help }) {
1293
+ return /* @__PURE__ */ jsx3(Card2, { padding: 3, radius: 2, tone: "transparent", border: true, children: /* @__PURE__ */ jsxs3(Stack3, { space: 3, children: [
1294
+ /* @__PURE__ */ jsxs3(Flex2, { align: "flex-start", gap: 2, children: [
1295
+ /* @__PURE__ */ jsx3(Box3, { style: { flexShrink: 0, marginTop: 1 }, children: /* @__PURE__ */ jsx3(Text3, { size: 1, muted: true, children: /* @__PURE__ */ jsx3(HelpCircleIcon2, {}) }) }),
1296
+ /* @__PURE__ */ jsx3(Text3, { size: 1, muted: true, children: help.description })
1297
+ ] }),
1298
+ /* @__PURE__ */ jsxs3(Stack3, { space: 2, paddingLeft: 4, children: [
1299
+ /* @__PURE__ */ jsxs3(Text3, { size: 0, muted: true, children: [
1300
+ /* @__PURE__ */ jsx3("strong", { children: "Value:" }),
1301
+ " ",
1302
+ help.valueHint
1303
+ ] }),
1304
+ help.example && /* @__PURE__ */ jsxs3(Box3, { marginTop: 1, children: [
1305
+ /* @__PURE__ */ jsx3(Text3, { size: 0, muted: true, children: /* @__PURE__ */ jsx3("strong", { children: "Example:" }) }),
1306
+ /* @__PURE__ */ jsx3(
1307
+ Box3,
1308
+ {
1309
+ marginTop: 1,
1310
+ style: {
1311
+ background: "var(--card-code-bg-color, #f5f5f5)",
1312
+ borderRadius: 3,
1313
+ padding: "6px 8px",
1314
+ fontFamily: '"SF Mono", "Fira Code", Menlo, Consolas, monospace',
1315
+ fontSize: 12,
1316
+ lineHeight: 1.5,
1317
+ whiteSpace: "pre-wrap"
1318
+ },
1319
+ children: help.example
1320
+ }
1321
+ )
1322
+ ] })
1323
+ ] })
1324
+ ] }) });
1325
+ }
1326
+ function CanonicalDocInput(props) {
1327
+ const value = props.value;
1328
+ const selectedType = typeof value?.refType === "string" ? value.refType : null;
1329
+ const help = selectedType ? REF_TYPE_HELP[selectedType] : null;
1330
+ const { renderField: parentRenderField } = props;
1331
+ const renderField = useCallback3(
1332
+ (fieldProps) => {
1333
+ const rendered = parentRenderField(fieldProps);
1334
+ if (fieldProps.name === "refType" && help) {
1335
+ return /* @__PURE__ */ jsxs3(Stack3, { space: 3, children: [
1336
+ rendered,
1337
+ /* @__PURE__ */ jsx3(RefTypeHelpCard, { help })
1338
+ ] });
1339
+ }
1340
+ return rendered;
1341
+ },
1342
+ [help, parentRenderField]
1343
+ );
1344
+ return /* @__PURE__ */ jsx3(Fragment2, { children: props.renderDefault({ ...props, renderField }) });
1345
+ }
1346
+
1083
1347
  // src/components/OriginInput.tsx
1084
- import { Stack as Stack3 } from "@sanity/ui";
1348
+ import { Stack as Stack5 } from "@sanity/ui";
1085
1349
 
1086
1350
  // src/components/MirrorBanner.tsx
1087
1351
  import { LinkIcon } from "@sanity/icons";
1088
- import { Card, Flex, Stack as Stack2, Text as Text3 } from "@sanity/ui";
1352
+ import { Card as Card3, Flex as Flex3, Stack as Stack4, Text as Text5 } from "@sanity/ui";
1089
1353
 
1090
1354
  // src/components/SyncStatusBadge.tsx
1091
- import { Badge, Box as Box2, Text as Text2, Tooltip } from "@sanity/ui";
1092
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
1355
+ import { Badge, Box as Box4, Text as Text4, Tooltip } from "@sanity/ui";
1356
+ import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1093
1357
  var MS_PER_DAY = 24 * 60 * 60 * 1e3;
1094
1358
  var FRESH_THRESHOLD_MS = 3 * MS_PER_DAY;
1095
1359
  var STALE_THRESHOLD_MS = 7 * MS_PER_DAY;
@@ -1113,33 +1377,33 @@ function SyncStatusBadge({
1113
1377
  const label = ageMs < FRESH_THRESHOLD_MS ? "Synced" : ageMs < STALE_THRESHOLD_MS ? "Stale" : "Outdated";
1114
1378
  const ageStr = formatAge(ageMs);
1115
1379
  const shaStr = commitSha ? ` \xB7 ${commitSha.slice(0, 7)}` : "";
1116
- return /* @__PURE__ */ jsx2(
1380
+ return /* @__PURE__ */ jsx4(
1117
1381
  Tooltip,
1118
1382
  {
1119
- content: /* @__PURE__ */ jsx2(Box2, { padding: 2, children: /* @__PURE__ */ jsxs2(Text2, { size: 1, children: [
1383
+ content: /* @__PURE__ */ jsx4(Box4, { padding: 2, children: /* @__PURE__ */ jsxs4(Text4, { size: 1, children: [
1120
1384
  "Last synced ",
1121
1385
  ageStr,
1122
1386
  shaStr
1123
1387
  ] }) }),
1124
1388
  portal: true,
1125
- children: /* @__PURE__ */ jsx2(Badge, { fontSize, tone, children: label })
1389
+ children: /* @__PURE__ */ jsx4(Badge, { fontSize, tone, children: label })
1126
1390
  }
1127
1391
  );
1128
1392
  }
1129
1393
 
1130
1394
  // src/components/MirrorBanner.tsx
1131
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1395
+ import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
1132
1396
  function MirrorBanner({ origin }) {
1133
1397
  const { repo, path, branch, commitSha, lastSyncedAt } = origin;
1134
1398
  const repoUrl = repo && path && branch ? `https://github.com/${repo}/blob/${branch}/${path}` : null;
1135
1399
  const repoDisplay = repo ?? "an external repository";
1136
- return /* @__PURE__ */ jsx3(Card, { padding: 3, radius: 2, tone: "transparent", border: true, children: /* @__PURE__ */ jsxs3(Stack2, { space: 3, children: [
1137
- /* @__PURE__ */ jsxs3(Flex, { align: "center", gap: 2, children: [
1138
- /* @__PURE__ */ jsx3(Text3, { size: 1, children: /* @__PURE__ */ jsx3(LinkIcon, {}) }),
1139
- /* @__PURE__ */ jsxs3(Text3, { size: 1, children: [
1400
+ return /* @__PURE__ */ jsx5(Card3, { padding: 3, radius: 2, tone: "transparent", border: true, children: /* @__PURE__ */ jsxs5(Stack4, { space: 3, children: [
1401
+ /* @__PURE__ */ jsxs5(Flex3, { align: "center", gap: 2, children: [
1402
+ /* @__PURE__ */ jsx5(Text5, { size: 1, children: /* @__PURE__ */ jsx5(LinkIcon, {}) }),
1403
+ /* @__PURE__ */ jsxs5(Text5, { size: 1, children: [
1140
1404
  "This task is managed in",
1141
1405
  " ",
1142
- repoUrl ? /* @__PURE__ */ jsx3(
1406
+ repoUrl ? /* @__PURE__ */ jsx5(
1143
1407
  "a",
1144
1408
  {
1145
1409
  href: repoUrl,
@@ -1148,12 +1412,12 @@ function MirrorBanner({ origin }) {
1148
1412
  style: { fontWeight: 600 },
1149
1413
  children: repoDisplay
1150
1414
  }
1151
- ) : /* @__PURE__ */ jsx3("strong", { children: repoDisplay }),
1415
+ ) : /* @__PURE__ */ jsx5("strong", { children: repoDisplay }),
1152
1416
  ". Edit it there to make changes."
1153
1417
  ] })
1154
1418
  ] }),
1155
- /* @__PURE__ */ jsxs3(Flex, { align: "center", gap: 2, wrap: "wrap", children: [
1156
- lastSyncedAt && /* @__PURE__ */ jsx3(
1419
+ /* @__PURE__ */ jsxs5(Flex3, { align: "center", gap: 2, wrap: "wrap", children: [
1420
+ lastSyncedAt && /* @__PURE__ */ jsx5(
1157
1421
  SyncStatusBadge,
1158
1422
  {
1159
1423
  lastSyncedAt,
@@ -1161,17 +1425,17 @@ function MirrorBanner({ origin }) {
1161
1425
  fontSize: 0
1162
1426
  }
1163
1427
  ),
1164
- branch && /* @__PURE__ */ jsxs3(Text3, { size: 0, muted: true, children: [
1428
+ branch && /* @__PURE__ */ jsxs5(Text5, { size: 0, muted: true, children: [
1165
1429
  branch,
1166
1430
  commitSha ? ` @ ${commitSha.slice(0, 7)}` : ""
1167
1431
  ] }),
1168
- path && /* @__PURE__ */ jsx3(Text3, { size: 0, muted: true, children: path })
1432
+ path && /* @__PURE__ */ jsx5(Text5, { size: 0, muted: true, children: path })
1169
1433
  ] })
1170
1434
  ] }) });
1171
1435
  }
1172
1436
 
1173
1437
  // src/components/OriginInput.tsx
1174
- import { jsx as jsx4, jsxs as jsxs4 } from "react/jsx-runtime";
1438
+ import { jsx as jsx6, jsxs as jsxs6 } from "react/jsx-runtime";
1175
1439
  function OriginInput(props) {
1176
1440
  const value = props.value;
1177
1441
  if (!value) return props.renderDefault(props);
@@ -1184,8 +1448,8 @@ function OriginInput(props) {
1184
1448
  commitSha: typeof value.commitSha === "string" ? value.commitSha : void 0,
1185
1449
  lastSyncedAt: typeof value.lastSyncedAt === "string" ? value.lastSyncedAt : void 0
1186
1450
  };
1187
- return /* @__PURE__ */ jsxs4(Stack3, { space: 3, children: [
1188
- /* @__PURE__ */ jsx4(MirrorBanner, { origin }),
1451
+ return /* @__PURE__ */ jsxs6(Stack5, { space: 3, children: [
1452
+ /* @__PURE__ */ jsx6(MirrorBanner, { origin }),
1189
1453
  props.renderDefault(props)
1190
1454
  ] });
1191
1455
  }
@@ -1205,6 +1469,12 @@ var ASSERTION_TYPES = [
1205
1469
  { title: "Cost Constraint", value: "cost" },
1206
1470
  { title: "Latency Constraint", value: "latency" }
1207
1471
  ];
1472
+ var DOC_REF_TYPES = [
1473
+ { title: "Document (Slug)", value: "slug" },
1474
+ { title: "Document (Path)", value: "path" },
1475
+ { title: "Document (ID)", value: "id" },
1476
+ { title: "Content Release", value: "perspective" }
1477
+ ];
1208
1478
  var RUBRIC_TEMPLATES = [
1209
1479
  { title: "Task Completion", value: "task-completion" },
1210
1480
  { title: "Code Correctness", value: "code-correctness" },
@@ -1256,21 +1526,88 @@ var taskSchema = defineType5({
1256
1526
  // Documentation references
1257
1527
  // -----------------------------------------------------------------------
1258
1528
  defineField5({
1259
- description: "Documentation articles that the LLM should use to complete this task. These become the gold-standard doc context injected in baseline mode. Each entry includes a reference to an article document and an optional reason explaining why the doc is relevant.",
1529
+ description: "Documentation that the LLM should use to complete this task. These become the gold-standard doc context injected in baseline mode. Each entry resolves docs through one of four strategies: slug, path, document ID, or content release (perspective).",
1260
1530
  name: "canonicalDocs",
1261
1531
  of: [
1262
1532
  {
1533
+ components: {
1534
+ input: CanonicalDocInput
1535
+ },
1263
1536
  fields: [
1537
+ // Resolution type selector — drives conditional field visibility.
1538
+ // This IS stored in the document (unlike the assertion type which
1539
+ // is always stored). The Content Lake adapter uses it to determine
1540
+ // which value field to read.
1264
1541
  defineField5({
1265
- description: "Reference to the documentation article",
1542
+ description: "How to find this documentation",
1543
+ name: "refType",
1544
+ options: {
1545
+ layout: "radio",
1546
+ direction: "horizontal",
1547
+ list: [...DOC_REF_TYPES]
1548
+ },
1549
+ title: "Resolution Type",
1550
+ type: "string",
1551
+ initialValue: "slug",
1552
+ validation: (rule) => rule.required()
1553
+ }),
1554
+ // --- Slug resolution (default) ---
1555
+ defineField5({
1556
+ description: "Article slug (e.g. 'groq-introduction')",
1557
+ hidden: ({ parent }) => parent?.refType !== "slug",
1266
1558
  name: "doc",
1267
1559
  title: "Document",
1268
1560
  to: [{ type: "article" }],
1269
- type: "reference",
1270
- validation: (rule) => rule.required()
1561
+ type: "reference"
1271
1562
  }),
1563
+ // --- Path resolution ---
1272
1564
  defineField5({
1273
- description: "Why this document helps with the task",
1565
+ description: "Full path after /docs/ (e.g. 'groq/groq-introduction')",
1566
+ hidden: ({ parent }) => parent?.refType !== "path",
1567
+ name: "path",
1568
+ title: "Document Path",
1569
+ type: "string",
1570
+ validation: (rule) => rule.custom((value, context) => {
1571
+ const parent = context.parent;
1572
+ if (parent?.refType === "path" && !value) {
1573
+ return "Path is required for path resolution";
1574
+ }
1575
+ return true;
1576
+ })
1577
+ }),
1578
+ // --- ID resolution ---
1579
+ defineField5({
1580
+ description: "Sanity document _id",
1581
+ hidden: ({ parent }) => parent?.refType !== "id",
1582
+ name: "docId",
1583
+ title: "Document ID",
1584
+ type: "string",
1585
+ validation: (rule) => rule.custom((value, context) => {
1586
+ const parent = context.parent;
1587
+ if (parent?.refType === "id" && !value) {
1588
+ return "Document ID is required for ID resolution";
1589
+ }
1590
+ return true;
1591
+ })
1592
+ }),
1593
+ // --- Perspective resolution ---
1594
+ defineField5({
1595
+ description: "Content release ID (bundle name)",
1596
+ hidden: ({ parent }) => parent?.refType !== "perspective",
1597
+ name: "perspective",
1598
+ title: "Content Release",
1599
+ type: "string",
1600
+ validation: (rule) => rule.custom((value, context) => {
1601
+ const parent = context.parent;
1602
+ if (parent?.refType === "perspective" && !value) {
1603
+ return "Content release ID is required for perspective resolution";
1604
+ }
1605
+ return true;
1606
+ })
1607
+ }),
1608
+ // --- Reason (always visible) ---
1609
+ defineField5({
1610
+ description: "Why this documentation helps with the task",
1274
1611
  name: "reason",
1275
1612
  title: "Reason",
1276
1613
  type: "string"
@@ -1278,15 +1615,47 @@ var taskSchema = defineType5({
1278
1615
  ],
1279
1616
  name: "canonicalDocRef",
1280
1617
  preview: {
1281
- prepare({ reason, title }) {
1618
+ prepare({
1619
+ docTitle,
1620
+ path,
1621
+ docId,
1622
+ perspective,
1623
+ reason,
1624
+ refType
1625
+ }) {
1626
+ const typeStr = typeof refType === "string" ? refType : "slug";
1627
+ let title = "Document";
1628
+ let icon = "\u{1F4C4}";
1629
+ switch (typeStr) {
1630
+ case "slug":
1631
+ title = typeof docTitle === "string" ? docTitle : "Document";
1632
+ icon = "\u{1F4C4}";
1633
+ break;
1634
+ case "path":
1635
+ title = typeof path === "string" ? path : "Path";
1636
+ icon = "\u{1F517}";
1637
+ break;
1638
+ case "id":
1639
+ title = typeof docId === "string" ? docId : "Document ID";
1640
+ icon = "\u{1F194}";
1641
+ break;
1642
+ case "perspective":
1643
+ title = typeof perspective === "string" ? perspective : "Content Release";
1644
+ icon = "\u{1F4E6}";
1645
+ break;
1646
+ }
1282
1647
  return {
1283
1648
  subtitle: typeof reason === "string" ? reason : "",
1284
- title: typeof title === "string" ? title : "Document"
1649
+ title: `${icon} ${title}`
1285
1650
  };
1286
1651
  },
1287
1652
  select: {
1653
+ docId: "docId",
1654
+ docTitle: "doc.title",
1655
+ path: "path",
1656
+ perspective: "perspective",
1288
1657
  reason: "reason",
1289
- title: "doc.title"
1658
+ refType: "refType"
1290
1659
  }
1291
1660
  },
1292
1661
  title: "Canonical Doc Reference",
@@ -1386,6 +1755,9 @@ var taskSchema = defineType5({
1386
1755
  type: "number"
1387
1756
  })
1388
1757
  ],
1758
+ components: {
1759
+ input: AssertionInput
1760
+ },
1389
1761
  name: "assertion",
1390
1762
  preview: {
1391
1763
  prepare({
@@ -1594,29 +1966,6 @@ var taskSchema = defineType5({
1594
1966
  },
1595
1967
  title: "Threshold",
1596
1968
  type: "object"
1597
- }),
1598
- defineField5({
1599
- description: "Doc source override \u2014 evaluate this task against a different source than the pipeline default (e.g., a branch deploy URL)",
1600
- fields: [
1601
- defineField5({
1602
- name: "url",
1603
- title: "URL",
1604
- type: "url"
1605
- }),
1606
- defineField5({
1607
- description: "Content release perspective ID",
1608
- name: "perspective",
1609
- title: "Perspective",
1610
- type: "string"
1611
- })
1612
- ],
1613
- name: "source",
1614
- options: {
1615
- collapsible: true,
1616
- collapsed: true
1617
- },
1618
- title: "Source Override",
1619
- type: "object"
1620
1969
  })
1621
1970
  ],
1622
1971
  name: "execution",
@@ -1829,15 +2178,15 @@ import { route } from "sanity/router";
1829
2178
  // src/components/Dashboard.tsx
1830
2179
  import {
1831
2180
  Container,
1832
- Flex as Flex20,
2181
+ Flex as Flex22,
1833
2182
  Select as Select3,
1834
- Stack as Stack21,
2183
+ Stack as Stack23,
1835
2184
  Tab,
1836
2185
  TabList,
1837
2186
  TabPanel,
1838
- Text as Text28
2187
+ Text as Text30
1839
2188
  } from "@sanity/ui";
1840
- import { useCallback as useCallback11, useEffect as useEffect8, useState as useState10 } from "react";
2189
+ import { useCallback as useCallback13, useEffect as useEffect8, useState as useState10 } from "react";
1841
2190
  import { useClient as useClient8 } from "sanity";
1842
2191
  import { useRouter } from "sanity/router";
1843
2192
 
@@ -2082,8 +2431,8 @@ function filterSourceClause(param) {
2082
2431
  }
2083
2432
 
2084
2433
  // src/components/ComparisonView.tsx
2085
- import { Badge as Badge2, Box as Box5, Card as Card3, Flex as Flex3, Grid, Select, Stack as Stack5, Text as Text7 } from "@sanity/ui";
2086
- import { useCallback as useCallback2, useEffect, useMemo, useState as useState2 } from "react";
2434
+ import { Badge as Badge2, Box as Box7, Card as Card5, Flex as Flex5, Grid, Select, Stack as Stack7, Text as Text9 } from "@sanity/ui";
2435
+ import { useCallback as useCallback4, useEffect, useMemo, useState as useState2 } from "react";
2087
2436
  import { useClient as useClient2 } from "sanity";
2088
2437
 
2089
2438
  // src/glossary.ts
@@ -2277,16 +2626,16 @@ function formatDuration(ms) {
2277
2626
  }
2278
2627
 
2279
2628
  // src/components/PageBlurb.tsx
2280
- import { Card as Card2, Stack as Stack4, Text as Text4 } from "@sanity/ui";
2281
- import { jsx as jsx5 } from "react/jsx-runtime";
2629
+ import { Card as Card4, Stack as Stack6, Text as Text6 } from "@sanity/ui";
2630
+ import { jsx as jsx7 } from "react/jsx-runtime";
2282
2631
  function PageBlurb({ text }) {
2283
- return /* @__PURE__ */ jsx5(Card2, { padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsx5(Stack4, { space: 2, children: /* @__PURE__ */ jsx5(Text4, { size: 1, children: text }) }) });
2632
+ return /* @__PURE__ */ jsx7(Card4, { padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsx7(Stack6, { space: 2, children: /* @__PURE__ */ jsx7(Text6, { size: 1, children: text }) }) });
2284
2633
  }
2285
2634
 
2286
2635
  // src/components/primitives/ColumnHeader.tsx
2287
- import { HelpCircleIcon } from "@sanity/icons";
2288
- import { Box as Box3, Flex as Flex2, Text as Text5, Tooltip as Tooltip2 } from "@sanity/ui";
2289
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
2636
+ import { HelpCircleIcon as HelpCircleIcon3 } from "@sanity/icons";
2637
+ import { Box as Box5, Flex as Flex4, Text as Text7, Tooltip as Tooltip2 } from "@sanity/ui";
2638
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
2290
2639
  function ColumnHeader({
2291
2640
  label,
2292
2641
  tooltip,
@@ -2296,9 +2645,9 @@ function ColumnHeader({
2296
2645
  borderBottom: "1px solid var(--card-border-color)",
2297
2646
  paddingBottom: 6
2298
2647
  } : void 0;
2299
- return /* @__PURE__ */ jsxs5(Flex2, { align: "center", gap: 1, style, children: [
2300
- /* @__PURE__ */ jsx6(
2301
- Text5,
2648
+ return /* @__PURE__ */ jsxs7(Flex4, { align: "center", gap: 1, style, children: [
2649
+ /* @__PURE__ */ jsx8(
2650
+ Text7,
2302
2651
  {
2303
2652
  muted: true,
2304
2653
  size: 1,
@@ -2307,26 +2656,26 @@ function ColumnHeader({
2307
2656
  children: label
2308
2657
  }
2309
2658
  ),
2310
- tooltip && /* @__PURE__ */ jsx6(
2659
+ tooltip && /* @__PURE__ */ jsx8(
2311
2660
  Tooltip2,
2312
2661
  {
2313
- content: /* @__PURE__ */ jsx6(Box3, { padding: 2, children: /* @__PURE__ */ jsx6(Text5, { size: 1, children: tooltip }) }),
2662
+ content: /* @__PURE__ */ jsx8(Box5, { padding: 2, children: /* @__PURE__ */ jsx8(Text7, { size: 1, children: tooltip }) }),
2314
2663
  portal: true,
2315
- children: /* @__PURE__ */ jsx6(Text5, { muted: true, size: 0, children: /* @__PURE__ */ jsx6(HelpCircleIcon, {}) })
2664
+ children: /* @__PURE__ */ jsx8(Text7, { muted: true, size: 0, children: /* @__PURE__ */ jsx8(HelpCircleIcon3, {}) })
2316
2665
  }
2317
2666
  )
2318
2667
  ] });
2319
2668
  }
2320
2669
 
2321
2670
  // src/components/primitives/LoadingState.tsx
2322
- import { Box as Box4, Text as Text6 } from "@sanity/ui";
2323
- import { jsx as jsx7 } from "react/jsx-runtime";
2671
+ import { Box as Box6, Text as Text8 } from "@sanity/ui";
2672
+ import { jsx as jsx9 } from "react/jsx-runtime";
2324
2673
  function LoadingState({ message = "Loading\u2026" }) {
2325
- return /* @__PURE__ */ jsx7(Box4, { padding: 4, children: /* @__PURE__ */ jsx7(Text6, { muted: true, children: message }) });
2674
+ return /* @__PURE__ */ jsx9(Box6, { padding: 4, children: /* @__PURE__ */ jsx9(Text8, { muted: true, children: message }) });
2326
2675
  }
2327
2676
 
2328
2677
  // src/components/ComparisonView.tsx
2329
- import { Fragment, jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
2678
+ import { Fragment as Fragment3, jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
2330
2679
  function ComparisonView() {
2331
2680
  const client = useClient2({ apiVersion: API_VERSION });
2332
2681
  const [baselineId, setBaselineId] = useState2(null);
@@ -2394,46 +2743,46 @@ function ComparisonView() {
2394
2743
  const e = experimentSummary.overall.avgScore;
2395
2744
  return { baseline: b, delta: e - b, experiment: e };
2396
2745
  }, [baselineSummary, experimentSummary]);
2397
- const onBaseline = useCallback2(
2746
+ const onBaseline = useCallback4(
2398
2747
  (e) => setBaselineId(e.currentTarget.value || null),
2399
2748
  []
2400
2749
  );
2401
- const onExperiment = useCallback2(
2750
+ const onExperiment = useCallback4(
2402
2751
  (e) => setExperimentId(e.currentTarget.value || null),
2403
2752
  []
2404
2753
  );
2405
2754
  const hasBoth = baselineId && experimentId;
2406
2755
  const hasData = baselineSummary && experimentSummary;
2407
- return /* @__PURE__ */ jsxs6(Stack5, { space: 4, children: [
2408
- /* @__PURE__ */ jsx8(PageBlurb, { text: "Select two reports to compare." }),
2409
- /* @__PURE__ */ jsxs6(Flex3, { gap: 3, children: [
2410
- /* @__PURE__ */ jsx8(Box5, { flex: 1, children: /* @__PURE__ */ jsxs6(Stack5, { space: 2, children: [
2411
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: "Baseline (before)" }),
2412
- /* @__PURE__ */ jsxs6(Select, { onChange: onBaseline, value: baselineId ?? "", children: [
2413
- /* @__PURE__ */ jsx8("option", { value: "", children: "Select baseline\u2026" }),
2414
- baselineOptions.map((r) => /* @__PURE__ */ jsx8("option", { value: r.reportId, children: formatOption(r) }, r.reportId))
2756
+ return /* @__PURE__ */ jsxs8(Stack7, { space: 4, children: [
2757
+ /* @__PURE__ */ jsx10(PageBlurb, { text: "Select two reports to compare." }),
2758
+ /* @__PURE__ */ jsxs8(Flex5, { gap: 3, children: [
2759
+ /* @__PURE__ */ jsx10(Box7, { flex: 1, children: /* @__PURE__ */ jsxs8(Stack7, { space: 2, children: [
2760
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: "Baseline (before)" }),
2761
+ /* @__PURE__ */ jsxs8(Select, { onChange: onBaseline, value: baselineId ?? "", children: [
2762
+ /* @__PURE__ */ jsx10("option", { value: "", children: "Select baseline\u2026" }),
2763
+ baselineOptions.map((r) => /* @__PURE__ */ jsx10("option", { value: r.reportId, children: formatOption(r) }, r.reportId))
2415
2764
  ] })
2416
2765
  ] }) }),
2417
- /* @__PURE__ */ jsx8(Box5, { flex: 1, children: /* @__PURE__ */ jsxs6(Stack5, { space: 2, children: [
2418
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: "Experiment (after)" }),
2419
- /* @__PURE__ */ jsxs6(Select, { onChange: onExperiment, value: experimentId ?? "", children: [
2420
- /* @__PURE__ */ jsx8("option", { value: "", children: "Select experiment\u2026" }),
2421
- experimentOptions.map((r) => /* @__PURE__ */ jsx8("option", { value: r.reportId, children: formatOption(r) }, r.reportId))
2766
+ /* @__PURE__ */ jsx10(Box7, { flex: 1, children: /* @__PURE__ */ jsxs8(Stack7, { space: 2, children: [
2767
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: "Experiment (after)" }),
2768
+ /* @__PURE__ */ jsxs8(Select, { onChange: onExperiment, value: experimentId ?? "", children: [
2769
+ /* @__PURE__ */ jsx10("option", { value: "", children: "Select experiment\u2026" }),
2770
+ experimentOptions.map((r) => /* @__PURE__ */ jsx10("option", { value: r.reportId, children: formatOption(r) }, r.reportId))
2422
2771
  ] })
2423
2772
  ] }) })
2424
2773
  ] }),
2425
- hasBoth && loading && /* @__PURE__ */ jsx8(LoadingState, { message: "Loading comparison\u2026" }),
2426
- hasBoth && !loading && !hasData && /* @__PURE__ */ jsx8(Card3, { padding: 4, tone: "caution", children: /* @__PURE__ */ jsx8(Text7, { size: 1, children: "Report not found." }) }),
2427
- hasBoth && !loading && hasData && /* @__PURE__ */ jsxs6(Fragment, { children: [
2428
- /* @__PURE__ */ jsx8(
2774
+ hasBoth && loading && /* @__PURE__ */ jsx10(LoadingState, { message: "Loading comparison\u2026" }),
2775
+ hasBoth && !loading && !hasData && /* @__PURE__ */ jsx10(Card5, { padding: 4, tone: "caution", children: /* @__PURE__ */ jsx10(Text9, { size: 1, children: "Report not found." }) }),
2776
+ hasBoth && !loading && hasData && /* @__PURE__ */ jsxs8(Fragment3, { children: [
2777
+ /* @__PURE__ */ jsx10(
2429
2778
  AreaComparisonTable,
2430
2779
  {
2431
2780
  areaDeltas,
2432
2781
  overallDelta
2433
2782
  }
2434
2783
  ),
2435
- /* @__PURE__ */ jsx8(DimensionDeltasTable, { dimDeltas }),
2436
- hasThreeLayerData && /* @__PURE__ */ jsx8(ThreeLayerDeltasTable, { threeLayerDeltas })
2784
+ /* @__PURE__ */ jsx10(DimensionDeltasTable, { dimDeltas }),
2785
+ hasThreeLayerData && /* @__PURE__ */ jsx10(ThreeLayerDeltasTable, { threeLayerDeltas })
2437
2786
  ] })
2438
2787
  ] });
2439
2788
  }
@@ -2441,23 +2790,23 @@ function AreaComparisonTable({
2441
2790
  areaDeltas,
2442
2791
  overallDelta
2443
2792
  }) {
2444
- return /* @__PURE__ */ jsx8(Card3, { overflow: "auto", padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs6(Stack5, { space: 3, children: [
2445
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: "Per-area comparison" }),
2446
- /* @__PURE__ */ jsxs6(Grid, { columns: 5, gap: 2, children: [
2447
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Area" }),
2448
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Baseline", tooltip: GLOSSARY.baseline }),
2449
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Experiment", tooltip: GLOSSARY.experiment }),
2450
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Delta", tooltip: GLOSSARY.delta }),
2451
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Change", tooltip: GLOSSARY.change })
2793
+ return /* @__PURE__ */ jsx10(Card5, { overflow: "auto", padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs8(Stack7, { space: 3, children: [
2794
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: "Per-area comparison" }),
2795
+ /* @__PURE__ */ jsxs8(Grid, { columns: 5, gap: 2, children: [
2796
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Area" }),
2797
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Baseline", tooltip: GLOSSARY.baseline }),
2798
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Experiment", tooltip: GLOSSARY.experiment }),
2799
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Delta", tooltip: GLOSSARY.delta }),
2800
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Change", tooltip: GLOSSARY.change })
2452
2801
  ] }),
2453
- areaDeltas.map((row) => /* @__PURE__ */ jsxs6(Grid, { columns: 5, gap: 2, children: [
2454
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.area }),
2455
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.baseline.toFixed(1) }),
2456
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.experiment.toFixed(1) }),
2457
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: formatDelta(row.delta) }),
2458
- /* @__PURE__ */ jsx8(Box5, { children: /* @__PURE__ */ jsx8(Badge2, { tone: changeTone(row.change), children: row.change }) })
2802
+ areaDeltas.map((row) => /* @__PURE__ */ jsxs8(Grid, { columns: 5, gap: 2, children: [
2803
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.area }),
2804
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.baseline.toFixed(1) }),
2805
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.experiment.toFixed(1) }),
2806
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: formatDelta(row.delta) }),
2807
+ /* @__PURE__ */ jsx10(Box7, { children: /* @__PURE__ */ jsx10(Badge2, { tone: changeTone(row.change), children: row.change }) })
2459
2808
  ] }, row.area)),
2460
- overallDelta && /* @__PURE__ */ jsxs6(
2809
+ overallDelta && /* @__PURE__ */ jsxs8(
2461
2810
  Grid,
2462
2811
  {
2463
2812
  columns: 5,
@@ -2467,36 +2816,36 @@ function AreaComparisonTable({
2467
2816
  paddingTop: 8
2468
2817
  },
2469
2818
  children: [
2470
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: "Overall" }),
2471
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: overallDelta.baseline.toFixed(1) }),
2472
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: overallDelta.experiment.toFixed(1) }),
2473
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: formatDelta(overallDelta.delta) }),
2474
- /* @__PURE__ */ jsx8(Box5, { children: /* @__PURE__ */ jsx8(Badge2, { tone: changeTone(classify(overallDelta.delta)), children: classify(overallDelta.delta) }) })
2819
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: "Overall" }),
2820
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: overallDelta.baseline.toFixed(1) }),
2821
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: overallDelta.experiment.toFixed(1) }),
2822
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: formatDelta(overallDelta.delta) }),
2823
+ /* @__PURE__ */ jsx10(Box7, { children: /* @__PURE__ */ jsx10(Badge2, { tone: changeTone(classify(overallDelta.delta)), children: classify(overallDelta.delta) }) })
2475
2824
  ]
2476
2825
  }
2477
2826
  )
2478
2827
  ] }) });
2479
2828
  }
2480
2829
  function DimensionDeltasTable({ dimDeltas }) {
2481
- return /* @__PURE__ */ jsx8(Card3, { overflow: "auto", padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs6(Stack5, { space: 3, children: [
2482
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: "Dimension deltas" }),
2483
- /* @__PURE__ */ jsxs6(Grid, { columns: 4, gap: 2, children: [
2484
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Area" }),
2485
- /* @__PURE__ */ jsx8(
2830
+ return /* @__PURE__ */ jsx10(Card5, { overflow: "auto", padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs8(Stack7, { space: 3, children: [
2831
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: "Dimension deltas" }),
2832
+ /* @__PURE__ */ jsxs8(Grid, { columns: 4, gap: 2, children: [
2833
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Area" }),
2834
+ /* @__PURE__ */ jsx10(
2486
2835
  ColumnHeader,
2487
2836
  {
2488
2837
  label: "Task completion",
2489
2838
  tooltip: GLOSSARY.dimTaskCompletion
2490
2839
  }
2491
2840
  ),
2492
- /* @__PURE__ */ jsx8(
2841
+ /* @__PURE__ */ jsx10(
2493
2842
  ColumnHeader,
2494
2843
  {
2495
2844
  label: "Code correctness",
2496
2845
  tooltip: GLOSSARY.dimCodeCorrectness
2497
2846
  }
2498
2847
  ),
2499
- /* @__PURE__ */ jsx8(
2848
+ /* @__PURE__ */ jsx10(
2500
2849
  ColumnHeader,
2501
2850
  {
2502
2851
  label: "Doc coverage",
@@ -2504,11 +2853,11 @@ function DimensionDeltasTable({ dimDeltas }) {
2504
2853
  }
2505
2854
  )
2506
2855
  ] }),
2507
- dimDeltas.map((row) => /* @__PURE__ */ jsxs6(Grid, { columns: 4, gap: 2, children: [
2508
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.area }),
2509
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: formatDelta(row.taskDelta) }),
2510
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: formatDelta(row.codeDelta) }),
2511
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: formatDelta(row.docDelta) })
2856
+ dimDeltas.map((row) => /* @__PURE__ */ jsxs8(Grid, { columns: 4, gap: 2, children: [
2857
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.area }),
2858
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: formatDelta(row.taskDelta) }),
2859
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: formatDelta(row.codeDelta) }),
2860
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: formatDelta(row.docDelta) })
2512
2861
  ] }, row.area))
2513
2862
  ] }) });
2514
2863
  }
@@ -2518,27 +2867,27 @@ function ThreeLayerDeltasTable({
2518
2867
  const filtered = threeLayerDeltas.filter(
2519
2868
  (d) => d.baseActual !== null || d.baseRetGap !== null
2520
2869
  );
2521
- return /* @__PURE__ */ jsx8(Card3, { overflow: "auto", padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs6(Stack5, { space: 3, children: [
2522
- /* @__PURE__ */ jsxs6(Flex3, { align: "center", gap: 2, children: [
2523
- /* @__PURE__ */ jsx8(Text7, { size: 1, weight: "semibold", children: "Three-layer decomposition deltas" }),
2524
- /* @__PURE__ */ jsx8(Badge2, { fontSize: 0, tone: "primary", children: "full mode" })
2870
+ return /* @__PURE__ */ jsx10(Card5, { overflow: "auto", padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs8(Stack7, { space: 3, children: [
2871
+ /* @__PURE__ */ jsxs8(Flex5, { align: "center", gap: 2, children: [
2872
+ /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: "Three-layer decomposition deltas" }),
2873
+ /* @__PURE__ */ jsx10(Badge2, { fontSize: 0, tone: "primary", children: "full mode" })
2525
2874
  ] }),
2526
- /* @__PURE__ */ jsxs6(Grid, { columns: 7, gap: 2, children: [
2527
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Area" }),
2528
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Actual (B)", tooltip: GLOSSARY.actual }),
2529
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Actual (E)", tooltip: GLOSSARY.actual }),
2530
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Actual \u0394", tooltip: GLOSSARY.actualDelta }),
2531
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Ret. Gap \u0394", tooltip: GLOSSARY.retGapDelta }),
2532
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Eff. (B)", tooltip: GLOSSARY.efficiency }),
2533
- /* @__PURE__ */ jsx8(ColumnHeader, { label: "Eff. (E)", tooltip: GLOSSARY.efficiency })
2875
+ /* @__PURE__ */ jsxs8(Grid, { columns: 7, gap: 2, children: [
2876
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Area" }),
2877
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Actual (B)", tooltip: GLOSSARY.actual }),
2878
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Actual (E)", tooltip: GLOSSARY.actual }),
2879
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Actual \u0394", tooltip: GLOSSARY.actualDelta }),
2880
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Ret. Gap \u0394", tooltip: GLOSSARY.retGapDelta }),
2881
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Eff. (B)", tooltip: GLOSSARY.efficiency }),
2882
+ /* @__PURE__ */ jsx10(ColumnHeader, { label: "Eff. (E)", tooltip: GLOSSARY.efficiency })
2534
2883
  ] }),
2535
- filtered.map((row) => /* @__PURE__ */ jsxs6(Grid, { columns: 7, gap: 2, children: [
2536
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.area }),
2537
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.baseActual != null ? row.baseActual.toFixed(1) : "\u2014" }),
2538
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.expActual != null ? row.expActual.toFixed(1) : "\u2014" }),
2539
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: row.actualDelta != null ? formatDelta(row.actualDelta) : "\u2014" }),
2540
- /* @__PURE__ */ jsx8(
2541
- Text7,
2884
+ filtered.map((row) => /* @__PURE__ */ jsxs8(Grid, { columns: 7, gap: 2, children: [
2885
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.area }),
2886
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.baseActual != null ? row.baseActual.toFixed(1) : "\u2014" }),
2887
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.expActual != null ? row.expActual.toFixed(1) : "\u2014" }),
2888
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: row.actualDelta != null ? formatDelta(row.actualDelta) : "\u2014" }),
2889
+ /* @__PURE__ */ jsx10(
2890
+ Text9,
2542
2891
  {
2543
2892
  size: 1,
2544
2893
  style: {
@@ -2547,8 +2896,8 @@ function ThreeLayerDeltasTable({
2547
2896
  children: row.retGapDelta != null ? formatDelta(row.retGapDelta) : "\u2014"
2548
2897
  }
2549
2898
  ),
2550
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: formatPercent(row.baseEfficiency) }),
2551
- /* @__PURE__ */ jsx8(Text7, { size: 1, children: formatPercent(row.expEfficiency) })
2899
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: formatPercent(row.baseEfficiency) }),
2900
+ /* @__PURE__ */ jsx10(Text9, { size: 1, children: formatPercent(row.expEfficiency) })
2552
2901
  ] }, `tl-${row.area}`))
2553
2902
  ] }) });
2554
2903
  }
@@ -2561,25 +2910,25 @@ function formatOption(r) {
2561
2910
  import { SortIcon } from "@sanity/icons";
2562
2911
  import {
2563
2912
  Badge as Badge11,
2564
- Box as Box6,
2913
+ Box as Box8,
2565
2914
  Button,
2566
- Card as Card9,
2567
- Flex as Flex12,
2915
+ Card as Card11,
2916
+ Flex as Flex14,
2568
2917
  Menu,
2569
2918
  MenuButton,
2570
2919
  MenuItem,
2571
- Stack as Stack10,
2572
- Text as Text16
2920
+ Stack as Stack12,
2921
+ Text as Text18
2573
2922
  } from "@sanity/ui";
2574
- import { useCallback as useCallback8, useEffect as useEffect5, useMemo as useMemo3, useState as useState6 } from "react";
2923
+ import { useCallback as useCallback10, useEffect as useEffect5, useMemo as useMemo3, useState as useState6 } from "react";
2575
2924
  import { useClient as useClient5 } from "sanity";
2576
2925
 
2577
2926
  // src/components/content-filters/DocumentFilter.tsx
2578
2927
  import { SearchIcon } from "@sanity/icons";
2579
- import { Autocomplete, Badge as Badge3, Card as Card4, Flex as Flex4, Stack as Stack6, Text as Text8 } from "@sanity/ui";
2580
- import { useCallback as useCallback3, useEffect as useEffect2, useRef, useState as useState3 } from "react";
2928
+ import { Autocomplete, Badge as Badge3, Card as Card6, Flex as Flex6, Stack as Stack8, Text as Text10 } from "@sanity/ui";
2929
+ import { useCallback as useCallback5, useEffect as useEffect2, useRef, useState as useState3 } from "react";
2581
2930
  import { useClient as useClient3 } from "sanity";
2582
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
2931
+ import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
2583
2932
  var SEARCH_DEBOUNCE_MS = 300;
2584
2933
  function DocumentFilter({
2585
2934
  value,
@@ -2595,7 +2944,7 @@ function DocumentFilter({
2595
2944
  if (timer.current) clearTimeout(timer.current);
2596
2945
  };
2597
2946
  }, []);
2598
- const handleQueryChange = useCallback3(
2947
+ const handleQueryChange = useCallback5(
2599
2948
  (query) => {
2600
2949
  if (timer.current) clearTimeout(timer.current);
2601
2950
  const trimmed = (query ?? "").trim();
@@ -2639,7 +2988,7 @@ function DocumentFilter({
2639
2988
  },
2640
2989
  [client]
2641
2990
  );
2642
- const handleSelect = useCallback3(
2991
+ const handleSelect = useCallback5(
2643
2992
  (selected) => {
2644
2993
  const option = options.find((o) => o.value === selected);
2645
2994
  const slug = option?.payload.slug ?? selected;
@@ -2650,25 +2999,25 @@ function DocumentFilter({
2650
2999
  },
2651
3000
  [options, onChange, onPerspectiveHint]
2652
3001
  );
2653
- const renderOption = useCallback3((option) => {
3002
+ const renderOption = useCallback5((option) => {
2654
3003
  const { provenance, releaseId } = option.payload;
2655
3004
  const badgeTone = provenance === "published" ? "positive" : provenance === "release" ? "primary" : "caution";
2656
3005
  const badgeLabel = provenance === "published" ? "Published" : provenance === "release" ? releaseId ?? "Release" : "Draft";
2657
- return /* @__PURE__ */ jsx9(Card4, { as: "button", padding: 3, children: /* @__PURE__ */ jsxs7(Flex4, { align: "center", gap: 2, children: [
2658
- /* @__PURE__ */ jsxs7(Stack6, { flex: 1, space: 1, children: [
2659
- /* @__PURE__ */ jsx9(Text8, { size: 1, weight: "semibold", children: option.payload.title }),
2660
- /* @__PURE__ */ jsx9(Text8, { muted: true, size: 1, children: option.payload.path })
3006
+ return /* @__PURE__ */ jsx11(Card6, { as: "button", padding: 3, children: /* @__PURE__ */ jsxs9(Flex6, { align: "center", gap: 2, children: [
3007
+ /* @__PURE__ */ jsxs9(Stack8, { flex: 1, space: 1, children: [
3008
+ /* @__PURE__ */ jsx11(Text10, { size: 1, weight: "semibold", children: option.payload.title }),
3009
+ /* @__PURE__ */ jsx11(Text10, { muted: true, size: 1, children: option.payload.path })
2661
3010
  ] }),
2662
- /* @__PURE__ */ jsx9(Badge3, { fontSize: 0, tone: badgeTone, children: badgeLabel })
3011
+ /* @__PURE__ */ jsx11(Badge3, { fontSize: 0, tone: badgeTone, children: badgeLabel })
2663
3012
  ] }) });
2664
3013
  }, []);
2665
- const renderValue = useCallback3((_value, option) => {
3014
+ const renderValue = useCallback5((_value, option) => {
2666
3015
  if (option?.payload.title) {
2667
3016
  return `${option.payload.title} (${option.payload.slug})`;
2668
3017
  }
2669
3018
  return _value;
2670
3019
  }, []);
2671
- return /* @__PURE__ */ jsx9(
3020
+ return /* @__PURE__ */ jsx11(
2672
3021
  Autocomplete,
2673
3022
  {
2674
3023
  filterOption: () => true,
@@ -2699,7 +3048,7 @@ function classifyDocId(id) {
2699
3048
 
2700
3049
  // src/components/content-filters/PerspectiveFilter.tsx
2701
3050
  import { SearchIcon as SearchIcon2 } from "@sanity/icons";
2702
- import { Autocomplete as Autocomplete2, Badge as Badge4, Card as Card5, Flex as Flex5, Stack as Stack7, Text as Text9 } from "@sanity/ui";
3051
+ import { Autocomplete as Autocomplete2, Badge as Badge4, Card as Card7, Flex as Flex7, Stack as Stack9, Text as Text11 } from "@sanity/ui";
2703
3052
  import { useEffect as useEffect3, useMemo as useMemo2, useState as useState4 } from "react";
2704
3053
  import {
2705
3054
  getReleaseIdFromReleaseDocumentId,
@@ -2707,7 +3056,7 @@ import {
2707
3056
  useArchivedReleases,
2708
3057
  useClient as useClient4
2709
3058
  } from "sanity";
2710
- import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
3059
+ import { jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
2711
3060
  function PerspectiveFilter({ value, onChange }) {
2712
3061
  const client = useClient4({ apiVersion: API_VERSION });
2713
3062
  const [reportPerspectives, setReportPerspectives] = useState4([]);
@@ -2744,7 +3093,7 @@ function PerspectiveFilter({ value, onChange }) {
2744
3093
  }));
2745
3094
  return result;
2746
3095
  }, [activeReleases, archivedReleases, reportPerspectives]);
2747
- return /* @__PURE__ */ jsx10(
3096
+ return /* @__PURE__ */ jsx12(
2748
3097
  Autocomplete2,
2749
3098
  {
2750
3099
  filterOption: (query, option) => {
@@ -2759,12 +3108,12 @@ function PerspectiveFilter({ value, onChange }) {
2759
3108
  placeholder: "Search by title or ID\u2026",
2760
3109
  renderOption: (option) => {
2761
3110
  const opt = option;
2762
- return /* @__PURE__ */ jsx10(Card5, { as: "button", padding: 3, children: /* @__PURE__ */ jsxs8(Flex5, { align: "center", gap: 2, children: [
2763
- /* @__PURE__ */ jsxs8(Stack7, { flex: 1, space: 1, children: [
2764
- /* @__PURE__ */ jsx10(Text9, { size: 1, weight: "semibold", children: opt.payload.title }),
2765
- opt.payload.title !== opt.value && /* @__PURE__ */ jsx10(Text9, { muted: true, size: 1, children: opt.value })
3111
+ return /* @__PURE__ */ jsx12(Card7, { as: "button", padding: 3, children: /* @__PURE__ */ jsxs10(Flex7, { align: "center", gap: 2, children: [
3112
+ /* @__PURE__ */ jsxs10(Stack9, { flex: 1, space: 1, children: [
3113
+ /* @__PURE__ */ jsx12(Text11, { size: 1, weight: "semibold", children: opt.payload.title }),
3114
+ opt.payload.title !== opt.value && /* @__PURE__ */ jsx12(Text11, { muted: true, size: 1, children: opt.value })
2766
3115
  ] }),
2767
- opt.payload.hasReport && /* @__PURE__ */ jsx10(Badge4, { fontSize: 0, tone: "positive", children: "Has reports" })
3116
+ opt.payload.hasReport && /* @__PURE__ */ jsx12(Badge4, { fontSize: 0, tone: "positive", children: "Has reports" })
2768
3117
  ] }) });
2769
3118
  },
2770
3119
  renderValue: (v, option) => {
@@ -2780,15 +3129,15 @@ function PerspectiveFilter({ value, onChange }) {
2780
3129
  }
2781
3130
 
2782
3131
  // src/components/report-card/ReportCard.tsx
2783
- import { Badge as Badge8, Card as Card6, Flex as Flex8, Text as Text12 } from "@sanity/ui";
2784
- import { useCallback as useCallback4 } from "react";
3132
+ import { Badge as Badge8, Card as Card8, Flex as Flex10, Text as Text14 } from "@sanity/ui";
3133
+ import { useCallback as useCallback6 } from "react";
2785
3134
 
2786
3135
  // src/components/primitives/DeltaIndicator.tsx
2787
- import { Text as Text10 } from "@sanity/ui";
2788
- import { jsx as jsx11 } from "react/jsx-runtime";
3136
+ import { Text as Text12 } from "@sanity/ui";
3137
+ import { jsx as jsx13 } from "react/jsx-runtime";
2789
3138
  function DeltaIndicator({ delta, size = 1 }) {
2790
- return /* @__PURE__ */ jsx11(
2791
- Text10,
3139
+ return /* @__PURE__ */ jsx13(
3140
+ Text12,
2792
3141
  {
2793
3142
  size,
2794
3143
  style: {
@@ -2800,17 +3149,17 @@ function DeltaIndicator({ delta, size = 1 }) {
2800
3149
  }
2801
3150
 
2802
3151
  // src/components/report-card/ReportMeta.tsx
2803
- import { Stack as Stack8, Text as Text11 } from "@sanity/ui";
3152
+ import { Stack as Stack10, Text as Text13 } from "@sanity/ui";
2804
3153
 
2805
3154
  // src/components/report-card/AreaTags.tsx
2806
- import { Badge as Badge5, Flex as Flex6 } from "@sanity/ui";
2807
- import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
3155
+ import { Badge as Badge5, Flex as Flex8 } from "@sanity/ui";
3156
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
2808
3157
  function AreaTags({ areas, targetDocuments }) {
2809
3158
  const hasAreas = areas && areas.length > 0;
2810
3159
  const hasDocs = targetDocuments && targetDocuments.length > 0;
2811
3160
  if (!hasAreas && !hasDocs) return null;
2812
- return /* @__PURE__ */ jsxs9(Flex6, { gap: 1, paddingTop: 1, wrap: "wrap", children: [
2813
- hasAreas && areas.map((area) => /* @__PURE__ */ jsx12(
3161
+ return /* @__PURE__ */ jsxs11(Flex8, { gap: 1, paddingTop: 1, wrap: "wrap", children: [
3162
+ hasAreas && areas.map((area) => /* @__PURE__ */ jsx14(
2814
3163
  Badge5,
2815
3164
  {
2816
3165
  fontSize: 0,
@@ -2820,7 +3169,7 @@ function AreaTags({ areas, targetDocuments }) {
2820
3169
  },
2821
3170
  `area-${area}`
2822
3171
  )),
2823
- hasDocs && targetDocuments.map((doc) => /* @__PURE__ */ jsx12(Badge5, { fontSize: 0, mode: "outline", tone: "primary", children: doc }, `doc-${doc}`))
3172
+ hasDocs && targetDocuments.map((doc) => /* @__PURE__ */ jsx14(Badge5, { fontSize: 0, mode: "outline", tone: "primary", children: doc }, `doc-${doc}`))
2824
3173
  ] });
2825
3174
  }
2826
3175
 
@@ -2864,7 +3213,7 @@ function formatCardDate(iso) {
2864
3213
  }
2865
3214
 
2866
3215
  // src/components/report-card/ReportMeta.tsx
2867
- import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
3216
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
2868
3217
  function ReportMeta({ data }) {
2869
3218
  const segments = [data.mode, data.source];
2870
3219
  if (data.models && data.models.length > 0) {
@@ -2876,10 +3225,10 @@ function ReportMeta({ data }) {
2876
3225
  if (data.durationMs && data.durationMs > 0) {
2877
3226
  segments.push(formatDuration(data.durationMs));
2878
3227
  }
2879
- return /* @__PURE__ */ jsxs10(Stack8, { flex: 1, space: 1, children: [
2880
- /* @__PURE__ */ jsx13(Text11, { weight: "semibold", children: data.tag ?? formatCardDate(data.completedAt) }),
2881
- /* @__PURE__ */ jsx13(Text11, { muted: true, size: 1, children: segments.join(" \xB7 ") }),
2882
- /* @__PURE__ */ jsx13(AreaTags, { areas: data.areas, targetDocuments: data.targetDocuments })
3228
+ return /* @__PURE__ */ jsxs12(Stack10, { flex: 1, space: 1, children: [
3229
+ /* @__PURE__ */ jsx15(Text13, { weight: "semibold", children: data.tag ?? formatCardDate(data.completedAt) }),
3230
+ /* @__PURE__ */ jsx15(Text13, { muted: true, size: 1, children: segments.join(" \xB7 ") }),
3231
+ /* @__PURE__ */ jsx15(AreaTags, { areas: data.areas, targetDocuments: data.targetDocuments })
2883
3232
  ] });
2884
3233
  }
2885
3234
 
@@ -2916,10 +3265,10 @@ function rowBackground(index) {
2916
3265
  }
2917
3266
 
2918
3267
  // src/components/primitives/ScoreBadge.tsx
2919
- import { jsx as jsx14 } from "react/jsx-runtime";
3268
+ import { jsx as jsx16 } from "react/jsx-runtime";
2920
3269
  function ScoreBadge({ score, fontSize = 1 }) {
2921
3270
  const rounded = Math.round(score);
2922
- return /* @__PURE__ */ jsx14(
3271
+ return /* @__PURE__ */ jsx16(
2923
3272
  Badge6,
2924
3273
  {
2925
3274
  fontSize,
@@ -2931,18 +3280,18 @@ function ScoreBadge({ score, fontSize = 1 }) {
2931
3280
  }
2932
3281
 
2933
3282
  // src/components/primitives/StatusBadges.tsx
2934
- import { Badge as Badge7, Flex as Flex7 } from "@sanity/ui";
2935
- import { jsxs as jsxs11 } from "react/jsx-runtime";
3283
+ import { Badge as Badge7, Flex as Flex9 } from "@sanity/ui";
3284
+ import { jsxs as jsxs13 } from "react/jsx-runtime";
2936
3285
  function StatusBadges({ regressed, improved }) {
2937
3286
  const hasRegressed = regressed && regressed.length > 0;
2938
3287
  const hasImproved = improved && improved.length > 0;
2939
3288
  if (!hasRegressed && !hasImproved) return null;
2940
- return /* @__PURE__ */ jsxs11(Flex7, { gap: 1, children: [
2941
- hasRegressed && /* @__PURE__ */ jsxs11(Badge7, { fontSize: 0, tone: "critical", children: [
3289
+ return /* @__PURE__ */ jsxs13(Flex9, { gap: 1, children: [
3290
+ hasRegressed && /* @__PURE__ */ jsxs13(Badge7, { fontSize: 0, tone: "critical", children: [
2942
3291
  regressed.length,
2943
3292
  " regressed"
2944
3293
  ] }),
2945
- hasImproved && /* @__PURE__ */ jsxs11(Badge7, { fontSize: 0, tone: "positive", children: [
3294
+ hasImproved && /* @__PURE__ */ jsxs13(Badge7, { fontSize: 0, tone: "positive", children: [
2946
3295
  improved.length,
2947
3296
  " improved"
2948
3297
  ] })
@@ -2950,26 +3299,26 @@ function StatusBadges({ regressed, improved }) {
2950
3299
  }
2951
3300
 
2952
3301
  // src/components/report-card/ReportCard.tsx
2953
- import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
3302
+ import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
2954
3303
  function ReportCard({ data, onSelectReport }) {
2955
- const handleClick = useCallback4(() => {
3304
+ const handleClick = useCallback6(() => {
2956
3305
  onSelectReport(data.reportId);
2957
3306
  }, [data.reportId, onSelectReport]);
2958
- return /* @__PURE__ */ jsx15(
2959
- Card6,
3307
+ return /* @__PURE__ */ jsx17(
3308
+ Card8,
2960
3309
  {
2961
3310
  onClick: handleClick,
2962
3311
  padding: 3,
2963
3312
  radius: 2,
2964
3313
  shadow: 1,
2965
3314
  style: { cursor: "pointer" },
2966
- children: /* @__PURE__ */ jsxs12(Flex8, { align: "center", gap: 3, children: [
2967
- /* @__PURE__ */ jsx15(ScoreBadge, { score: data.overall }),
2968
- /* @__PURE__ */ jsx15(ReportMeta, { data }),
2969
- data.comparisonDelta != null && /* @__PURE__ */ jsx15(DeltaIndicator, { delta: data.comparisonDelta }),
2970
- /* @__PURE__ */ jsx15(StatusBadges, { improved: data.improved, regressed: data.regressed }),
2971
- /* @__PURE__ */ jsx15(Text12, { muted: true, size: 0, title: new Date(data.completedAt).toISOString(), children: formatRelativeTime(data.completedAt) }),
2972
- data.trigger && /* @__PURE__ */ jsx15(Badge8, { fontSize: 0, tone: "default", children: data.trigger })
3315
+ children: /* @__PURE__ */ jsxs14(Flex10, { align: "center", gap: 3, children: [
3316
+ /* @__PURE__ */ jsx17(ScoreBadge, { score: data.overall }),
3317
+ /* @__PURE__ */ jsx17(ReportMeta, { data }),
3318
+ data.comparisonDelta != null && /* @__PURE__ */ jsx17(DeltaIndicator, { delta: data.comparisonDelta }),
3319
+ /* @__PURE__ */ jsx17(StatusBadges, { improved: data.improved, regressed: data.regressed }),
3320
+ /* @__PURE__ */ jsx17(Text14, { muted: true, size: 0, title: new Date(data.completedAt).toISOString(), children: formatRelativeTime(data.completedAt) }),
3321
+ data.trigger && /* @__PURE__ */ jsx17(Badge8, { fontSize: 0, tone: "default", children: data.trigger })
2973
3322
  ] })
2974
3323
  }
2975
3324
  );
@@ -2977,9 +3326,9 @@ function ReportCard({ data, onSelectReport }) {
2977
3326
 
2978
3327
  // src/components/search-bar/SearchBar.tsx
2979
3328
  import { SearchIcon as SearchIcon3 } from "@sanity/icons";
2980
- import { Card as Card8, Flex as Flex11, Text as Text15 } from "@sanity/ui";
3329
+ import { Card as Card10, Flex as Flex13, Text as Text17 } from "@sanity/ui";
2981
3330
  import {
2982
- useCallback as useCallback7,
3331
+ useCallback as useCallback9,
2983
3332
  useEffect as useEffect4,
2984
3333
  useRef as useRef2,
2985
3334
  useState as useState5
@@ -3122,20 +3471,20 @@ function filterAndExclude(values, query, dim, activeTokens) {
3122
3471
 
3123
3472
  // src/components/search-bar/FilterBadge.tsx
3124
3473
  import { CloseIcon } from "@sanity/icons";
3125
- import { Badge as Badge9, Flex as Flex9, Text as Text13 } from "@sanity/ui";
3126
- import { useCallback as useCallback5 } from "react";
3127
- import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
3474
+ import { Badge as Badge9, Flex as Flex11, Text as Text15 } from "@sanity/ui";
3475
+ import { useCallback as useCallback7 } from "react";
3476
+ import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
3128
3477
  function FilterBadge({ token, onRemove }) {
3129
3478
  const dim = DIMENSIONS.find((d) => d.key === token.dimension);
3130
3479
  const tone = dim?.tone ?? "default";
3131
- const handleRemove = useCallback5(
3480
+ const handleRemove = useCallback7(
3132
3481
  (e) => {
3133
3482
  e.stopPropagation();
3134
3483
  onRemove(token.id);
3135
3484
  },
3136
3485
  [onRemove, token.id]
3137
3486
  );
3138
- return /* @__PURE__ */ jsx16(
3487
+ return /* @__PURE__ */ jsx18(
3139
3488
  Badge9,
3140
3489
  {
3141
3490
  fontSize: 0,
@@ -3145,20 +3494,20 @@ function FilterBadge({ token, onRemove }) {
3145
3494
  userSelect: "none"
3146
3495
  },
3147
3496
  tone,
3148
- children: /* @__PURE__ */ jsxs13(Flex9, { align: "center", gap: 1, children: [
3149
- /* @__PURE__ */ jsxs13(Text13, { size: 0, children: [
3497
+ children: /* @__PURE__ */ jsxs15(Flex11, { align: "center", gap: 1, children: [
3498
+ /* @__PURE__ */ jsxs15(Text15, { size: 0, children: [
3150
3499
  token.dimension,
3151
3500
  ":",
3152
3501
  token.label
3153
3502
  ] }),
3154
- /* @__PURE__ */ jsx16(
3155
- Text13,
3503
+ /* @__PURE__ */ jsx18(
3504
+ Text15,
3156
3505
  {
3157
3506
  muted: true,
3158
3507
  onClick: handleRemove,
3159
3508
  size: 0,
3160
3509
  style: { cursor: "pointer", lineHeight: 1 },
3161
- children: /* @__PURE__ */ jsx16(CloseIcon, {})
3510
+ children: /* @__PURE__ */ jsx18(CloseIcon, {})
3162
3511
  }
3163
3512
  )
3164
3513
  ] })
@@ -3167,9 +3516,9 @@ function FilterBadge({ token, onRemove }) {
3167
3516
  }
3168
3517
 
3169
3518
  // src/components/search-bar/SuggestionList.tsx
3170
- import { Badge as Badge10, Card as Card7, Flex as Flex10, Stack as Stack9, Text as Text14 } from "@sanity/ui";
3171
- import { useCallback as useCallback6 } from "react";
3172
- import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
3519
+ import { Badge as Badge10, Card as Card9, Flex as Flex12, Stack as Stack11, Text as Text16 } from "@sanity/ui";
3520
+ import { useCallback as useCallback8 } from "react";
3521
+ import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
3173
3522
  function SuggestionList({
3174
3523
  suggestions,
3175
3524
  activeIndex,
@@ -3178,8 +3527,8 @@ function SuggestionList({
3178
3527
  if (suggestions.length === 0) return null;
3179
3528
  const groups = groupByCategory(suggestions);
3180
3529
  let globalIndex = -1;
3181
- return /* @__PURE__ */ jsx17(
3182
- Card7,
3530
+ return /* @__PURE__ */ jsx19(
3531
+ Card9,
3183
3532
  {
3184
3533
  overflow: "auto",
3185
3534
  radius: 2,
@@ -3192,9 +3541,9 @@ function SuggestionList({
3192
3541
  top: "100%",
3193
3542
  zIndex: 100
3194
3543
  },
3195
- children: /* @__PURE__ */ jsx17(Stack9, { padding: 1, space: 1, children: groups.map(([category, items]) => /* @__PURE__ */ jsxs14(Stack9, { space: 0, children: [
3196
- /* @__PURE__ */ jsx17(
3197
- Text14,
3544
+ children: /* @__PURE__ */ jsx19(Stack11, { padding: 1, space: 1, children: groups.map(([category, items]) => /* @__PURE__ */ jsxs16(Stack11, { space: 0, children: [
3545
+ /* @__PURE__ */ jsx19(
3546
+ Text16,
3198
3547
  {
3199
3548
  muted: true,
3200
3549
  size: 0,
@@ -3210,7 +3559,7 @@ function SuggestionList({
3210
3559
  items.map((suggestion) => {
3211
3560
  globalIndex++;
3212
3561
  const isActive = globalIndex === activeIndex;
3213
- return /* @__PURE__ */ jsx17(
3562
+ return /* @__PURE__ */ jsx19(
3214
3563
  SuggestionItem,
3215
3564
  {
3216
3565
  active: isActive,
@@ -3232,20 +3581,20 @@ function SuggestionItem({
3232
3581
  const dim = DIMENSIONS.find((d) => d.key === suggestion.dimension);
3233
3582
  const tone = dim?.tone ?? "default";
3234
3583
  const isHint = suggestion.category === "Filters";
3235
- const handleClick = useCallback6(() => {
3584
+ const handleClick = useCallback8(() => {
3236
3585
  onSelect(suggestion);
3237
3586
  }, [onSelect, suggestion]);
3238
- return /* @__PURE__ */ jsx17(
3239
- Card7,
3587
+ return /* @__PURE__ */ jsx19(
3588
+ Card9,
3240
3589
  {
3241
3590
  onClick: handleClick,
3242
3591
  padding: 2,
3243
3592
  radius: 2,
3244
3593
  style: { cursor: "pointer" },
3245
3594
  tone: active ? "primary" : "default",
3246
- children: /* @__PURE__ */ jsxs14(Flex10, { align: "center", gap: 2, children: [
3247
- !isHint && /* @__PURE__ */ jsx17(Badge10, { fontSize: 0, tone, children: suggestion.dimension }),
3248
- /* @__PURE__ */ jsx17(Text14, { size: 1, children: suggestion.label })
3595
+ children: /* @__PURE__ */ jsxs16(Flex12, { align: "center", gap: 2, children: [
3596
+ !isHint && /* @__PURE__ */ jsx19(Badge10, { fontSize: 0, tone, children: suggestion.dimension }),
3597
+ /* @__PURE__ */ jsx19(Text16, { size: 1, children: suggestion.label })
3249
3598
  ] })
3250
3599
  }
3251
3600
  );
@@ -3260,7 +3609,7 @@ function groupByCategory(suggestions) {
3260
3609
  }
3261
3610
 
3262
3611
  // src/components/search-bar/SearchBar.tsx
3263
- import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
3612
+ import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
3264
3613
  function SearchBar({
3265
3614
  tokens,
3266
3615
  query,
@@ -3285,7 +3634,7 @@ function SearchBar({
3285
3634
  useEffect4(() => {
3286
3635
  setActiveIndex(-1);
3287
3636
  }, [query, tokens.length]);
3288
- const handleTokenRemove = useCallback7(
3637
+ const handleTokenRemove = useCallback9(
3289
3638
  (id) => {
3290
3639
  onTokenRemove(id);
3291
3640
  requestAnimationFrame(() => {
@@ -3294,7 +3643,7 @@ function SearchBar({
3294
3643
  },
3295
3644
  [onTokenRemove]
3296
3645
  );
3297
- const handleSuggestionSelect = useCallback7(
3646
+ const handleSuggestionSelect = useCallback9(
3298
3647
  (suggestion) => {
3299
3648
  if (suggestion.category === "Filters") {
3300
3649
  onQueryChange(suggestion.value);
@@ -3313,7 +3662,7 @@ function SearchBar({
3313
3662
  },
3314
3663
  [onTokenAdd, onQueryChange]
3315
3664
  );
3316
- const handleKeyDown = useCallback7(
3665
+ const handleKeyDown = useCallback9(
3317
3666
  (e) => {
3318
3667
  if (e.key === "ArrowDown") {
3319
3668
  e.preventDefault();
@@ -3341,41 +3690,41 @@ function SearchBar({
3341
3690
  handleSuggestionSelect
3342
3691
  ]
3343
3692
  );
3344
- const handleInputChange = useCallback7(
3693
+ const handleInputChange = useCallback9(
3345
3694
  (e) => {
3346
3695
  const value = e.target.value;
3347
3696
  onQueryChange(value);
3348
3697
  },
3349
3698
  [onQueryChange]
3350
3699
  );
3351
- const handleBlur = useCallback7(() => {
3700
+ const handleBlur = useCallback9(() => {
3352
3701
  blurTimerRef.current = setTimeout(() => {
3353
3702
  blurTimerRef.current = null;
3354
3703
  setFocused(false);
3355
3704
  }, 200);
3356
3705
  }, []);
3357
- const handleFocus = useCallback7(() => {
3706
+ const handleFocus = useCallback9(() => {
3358
3707
  if (blurTimerRef.current) {
3359
3708
  clearTimeout(blurTimerRef.current);
3360
3709
  blurTimerRef.current = null;
3361
3710
  }
3362
3711
  setFocused(true);
3363
3712
  }, []);
3364
- const handleBarClick = useCallback7(() => {
3713
+ const handleBarClick = useCallback9(() => {
3365
3714
  inputRef.current?.focus();
3366
3715
  }, []);
3367
- return /* @__PURE__ */ jsxs15("div", { style: { position: "relative" }, children: [
3368
- /* @__PURE__ */ jsx18(
3369
- Card8,
3716
+ return /* @__PURE__ */ jsxs17("div", { style: { position: "relative" }, children: [
3717
+ /* @__PURE__ */ jsx20(
3718
+ Card10,
3370
3719
  {
3371
3720
  border: true,
3372
3721
  onClick: handleBarClick,
3373
3722
  padding: 2,
3374
3723
  radius: 2,
3375
3724
  style: { cursor: "text" },
3376
- children: /* @__PURE__ */ jsxs15(Flex11, { align: "center", gap: 1, wrap: "wrap", children: [
3377
- /* @__PURE__ */ jsx18(Text15, { muted: true, size: 1, style: { flexShrink: 0, padding: "0 4px" }, children: /* @__PURE__ */ jsx18(SearchIcon3, {}) }),
3378
- tokens.map((token) => /* @__PURE__ */ jsx18(
3725
+ children: /* @__PURE__ */ jsxs17(Flex13, { align: "center", gap: 1, wrap: "wrap", children: [
3726
+ /* @__PURE__ */ jsx20(Text17, { muted: true, size: 1, style: { flexShrink: 0, padding: "0 4px" }, children: /* @__PURE__ */ jsx20(SearchIcon3, {}) }),
3727
+ tokens.map((token) => /* @__PURE__ */ jsx20(
3379
3728
  FilterBadge,
3380
3729
  {
3381
3730
  onRemove: handleTokenRemove,
@@ -3383,7 +3732,7 @@ function SearchBar({
3383
3732
  },
3384
3733
  token.id
3385
3734
  )),
3386
- /* @__PURE__ */ jsx18(
3735
+ /* @__PURE__ */ jsx20(
3387
3736
  "input",
3388
3737
  {
3389
3738
  onBlur: handleBlur,
@@ -3410,7 +3759,7 @@ function SearchBar({
3410
3759
  ] })
3411
3760
  }
3412
3761
  ),
3413
- focused && suggestions.length > 0 && /* @__PURE__ */ jsx18(
3762
+ focused && suggestions.length > 0 && /* @__PURE__ */ jsx20(
3414
3763
  SuggestionList,
3415
3764
  {
3416
3765
  activeIndex,
@@ -3422,7 +3771,7 @@ function SearchBar({
3422
3771
  }
3423
3772
 
3424
3773
  // src/components/LatestReports.tsx
3425
- import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
3774
+ import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
3426
3775
  var SORT_LABELS = {
3427
3776
  date: "Date",
3428
3777
  name: "Name",
@@ -3467,7 +3816,7 @@ function LatestReports({
3467
3816
  setInitialLoading(false);
3468
3817
  });
3469
3818
  }, [client, pageSize, mode, source]);
3470
- const handleLoadMore = useCallback8(() => {
3819
+ const handleLoadMore = useCallback10(() => {
3471
3820
  if (loadingMore || !hasMore) return;
3472
3821
  setLoadingMore(true);
3473
3822
  const nextLimit = reports.length + pageSize;
@@ -3568,7 +3917,7 @@ function LatestReports({
3568
3917
  });
3569
3918
  return result;
3570
3919
  }, [reports, searchQuery, activeFilters, documentSlug, perspective, sort]);
3571
- const handleTokenAdd = useCallback8((token) => {
3920
+ const handleTokenAdd = useCallback10((token) => {
3572
3921
  setFilterTokens((prev) => {
3573
3922
  const dim = token.dimension;
3574
3923
  const isMulti = dim === "area";
@@ -3578,38 +3927,38 @@ function LatestReports({
3578
3927
  return [...prev, token];
3579
3928
  });
3580
3929
  }, []);
3581
- const handleTokenRemove = useCallback8((id) => {
3930
+ const handleTokenRemove = useCallback10((id) => {
3582
3931
  setFilterTokens((prev) => prev.filter((t) => t.id !== id));
3583
3932
  }, []);
3584
- const toggleSortDirection = useCallback8(() => {
3933
+ const toggleSortDirection = useCallback10(() => {
3585
3934
  setSort((prev) => ({
3586
3935
  ...prev,
3587
3936
  direction: prev.direction === "asc" ? "desc" : "asc"
3588
3937
  }));
3589
3938
  }, []);
3590
- const handleSortFieldChange = useCallback8((field) => {
3939
+ const handleSortFieldChange = useCallback10((field) => {
3591
3940
  setSort(
3592
3941
  (prev) => prev.field === field ? { ...prev, direction: prev.direction === "asc" ? "desc" : "asc" } : { direction: "desc", field }
3593
3942
  );
3594
3943
  }, []);
3595
3944
  const hasActiveFilters = searchQuery.trim() !== "" || filterTokens.length > 0 || documentSlug.trim() !== "" || perspective.trim() !== "";
3596
- const handleClearFilters = useCallback8(() => {
3945
+ const handleClearFilters = useCallback10(() => {
3597
3946
  setSearchQuery("");
3598
3947
  setFilterTokens([]);
3599
3948
  setDocumentSlug("");
3600
3949
  setPerspective("");
3601
3950
  }, []);
3602
3951
  if (initialLoading) {
3603
- return /* @__PURE__ */ jsx19(Card9, { padding: 4, children: /* @__PURE__ */ jsx19(Text16, { muted: true, children: "Loading reports\u2026" }) });
3952
+ return /* @__PURE__ */ jsx21(Card11, { padding: 4, children: /* @__PURE__ */ jsx21(Text18, { muted: true, children: "Loading reports\u2026" }) });
3604
3953
  }
3605
3954
  if (reports.length === 0) {
3606
- return /* @__PURE__ */ jsx19(Card9, { padding: 4, children: /* @__PURE__ */ jsx19(Text16, { muted: true, children: "No reports found. Run the pipeline with --publish to create reports." }) });
3955
+ return /* @__PURE__ */ jsx21(Card11, { padding: 4, children: /* @__PURE__ */ jsx21(Text18, { muted: true, children: "No reports found. Run the pipeline with --publish to create reports." }) });
3607
3956
  }
3608
- return /* @__PURE__ */ jsxs16(Stack10, { space: 3, children: [
3609
- /* @__PURE__ */ jsx19(Card9, { padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs16(Stack10, { space: 3, children: [
3610
- /* @__PURE__ */ jsxs16(Stack10, { space: 1, children: [
3611
- /* @__PURE__ */ jsx19(Text16, { muted: true, size: 0, children: "Search & filter" }),
3612
- /* @__PURE__ */ jsx19(
3957
+ return /* @__PURE__ */ jsxs18(Stack12, { space: 3, children: [
3958
+ /* @__PURE__ */ jsx21(Card11, { padding: 3, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs18(Stack12, { space: 3, children: [
3959
+ /* @__PURE__ */ jsxs18(Stack12, { space: 1, children: [
3960
+ /* @__PURE__ */ jsx21(Text18, { muted: true, size: 0, children: "Search & filter" }),
3961
+ /* @__PURE__ */ jsx21(
3613
3962
  SearchBar,
3614
3963
  {
3615
3964
  areas: availableAreas,
@@ -3622,10 +3971,10 @@ function LatestReports({
3622
3971
  }
3623
3972
  )
3624
3973
  ] }),
3625
- /* @__PURE__ */ jsxs16(Flex12, { gap: 2, children: [
3626
- /* @__PURE__ */ jsx19(Box6, { flex: 1, children: /* @__PURE__ */ jsxs16(Stack10, { space: 1, children: [
3627
- /* @__PURE__ */ jsx19(Text16, { muted: true, size: 0, children: "Document" }),
3628
- /* @__PURE__ */ jsx19(
3974
+ /* @__PURE__ */ jsxs18(Flex14, { gap: 2, children: [
3975
+ /* @__PURE__ */ jsx21(Box8, { flex: 1, children: /* @__PURE__ */ jsxs18(Stack12, { space: 1, children: [
3976
+ /* @__PURE__ */ jsx21(Text18, { muted: true, size: 0, children: "Document" }),
3977
+ /* @__PURE__ */ jsx21(
3629
3978
  DocumentFilter,
3630
3979
  {
3631
3980
  onChange: setDocumentSlug,
@@ -3634,9 +3983,9 @@ function LatestReports({
3634
3983
  }
3635
3984
  )
3636
3985
  ] }) }),
3637
- /* @__PURE__ */ jsx19(Box6, { flex: 1, children: /* @__PURE__ */ jsxs16(Stack10, { space: 1, children: [
3638
- /* @__PURE__ */ jsx19(Text16, { muted: true, size: 0, children: "Content release" }),
3639
- /* @__PURE__ */ jsx19(
3986
+ /* @__PURE__ */ jsx21(Box8, { flex: 1, children: /* @__PURE__ */ jsxs18(Stack12, { space: 1, children: [
3987
+ /* @__PURE__ */ jsx21(Text18, { muted: true, size: 0, children: "Content release" }),
3988
+ /* @__PURE__ */ jsx21(
3640
3989
  PerspectiveFilter,
3641
3990
  {
3642
3991
  onChange: setPerspective,
@@ -3645,20 +3994,20 @@ function LatestReports({
3645
3994
  )
3646
3995
  ] }) })
3647
3996
  ] }),
3648
- (documentSlug.trim() || perspective.trim()) && /* @__PURE__ */ jsxs16(Flex12, { align: "center", gap: 1, children: [
3649
- documentSlug.trim() && /* @__PURE__ */ jsxs16(Badge11, { fontSize: 0, tone: "primary", children: [
3997
+ (documentSlug.trim() || perspective.trim()) && /* @__PURE__ */ jsxs18(Flex14, { align: "center", gap: 1, children: [
3998
+ documentSlug.trim() && /* @__PURE__ */ jsxs18(Badge11, { fontSize: 0, tone: "primary", children: [
3650
3999
  "Document: ",
3651
4000
  documentSlug.trim()
3652
4001
  ] }),
3653
- perspective.trim() && /* @__PURE__ */ jsxs16(Badge11, { fontSize: 0, tone: "primary", children: [
4002
+ perspective.trim() && /* @__PURE__ */ jsxs18(Badge11, { fontSize: 0, tone: "primary", children: [
3654
4003
  "Perspective: ",
3655
4004
  perspective.trim()
3656
4005
  ] })
3657
4006
  ] })
3658
4007
  ] }) }),
3659
- /* @__PURE__ */ jsxs16(Flex12, { align: "center", gap: 2, paddingX: 1, wrap: "wrap", children: [
3660
- /* @__PURE__ */ jsx19(Text16, { muted: true, size: 1, children: filteredReports.length === reports.length ? `${reports.length} reports` : `${filteredReports.length} of ${reports.length} reports` }),
3661
- hasActiveFilters && /* @__PURE__ */ jsx19(
4008
+ /* @__PURE__ */ jsxs18(Flex14, { align: "center", gap: 2, paddingX: 1, wrap: "wrap", children: [
4009
+ /* @__PURE__ */ jsx21(Text18, { muted: true, size: 1, children: filteredReports.length === reports.length ? `${reports.length} reports` : `${filteredReports.length} of ${reports.length} reports` }),
4010
+ hasActiveFilters && /* @__PURE__ */ jsx21(
3662
4011
  Button,
3663
4012
  {
3664
4013
  fontSize: 0,
@@ -3668,11 +4017,11 @@ function LatestReports({
3668
4017
  tone: "critical"
3669
4018
  }
3670
4019
  ),
3671
- /* @__PURE__ */ jsxs16(Flex12, { align: "center", gap: 1, style: { marginLeft: "auto" }, children: [
3672
- /* @__PURE__ */ jsx19(
4020
+ /* @__PURE__ */ jsxs18(Flex14, { align: "center", gap: 1, style: { marginLeft: "auto" }, children: [
4021
+ /* @__PURE__ */ jsx21(
3673
4022
  MenuButton,
3674
4023
  {
3675
- button: /* @__PURE__ */ jsx19(
4024
+ button: /* @__PURE__ */ jsx21(
3676
4025
  Button,
3677
4026
  {
3678
4027
  fontSize: 1,
@@ -3682,8 +4031,8 @@ function LatestReports({
3682
4031
  }
3683
4032
  ),
3684
4033
  id: "sort-menu",
3685
- menu: /* @__PURE__ */ jsxs16(Menu, { children: [
3686
- /* @__PURE__ */ jsx19(
4034
+ menu: /* @__PURE__ */ jsxs18(Menu, { children: [
4035
+ /* @__PURE__ */ jsx21(
3687
4036
  MenuItem,
3688
4037
  {
3689
4038
  onClick: () => handleSortFieldChange("date"),
@@ -3691,7 +4040,7 @@ function LatestReports({
3691
4040
  text: "Date"
3692
4041
  }
3693
4042
  ),
3694
- /* @__PURE__ */ jsx19(
4043
+ /* @__PURE__ */ jsx21(
3695
4044
  MenuItem,
3696
4045
  {
3697
4046
  onClick: () => handleSortFieldChange("score"),
@@ -3699,7 +4048,7 @@ function LatestReports({
3699
4048
  text: "Score"
3700
4049
  }
3701
4050
  ),
3702
- /* @__PURE__ */ jsx19(
4051
+ /* @__PURE__ */ jsx21(
3703
4052
  MenuItem,
3704
4053
  {
3705
4054
  onClick: () => handleSortFieldChange("name"),
@@ -3711,7 +4060,7 @@ function LatestReports({
3711
4060
  popover: { portal: true }
3712
4061
  }
3713
4062
  ),
3714
- /* @__PURE__ */ jsx19(
4063
+ /* @__PURE__ */ jsx21(
3715
4064
  Button,
3716
4065
  {
3717
4066
  fontSize: 1,
@@ -3723,9 +4072,9 @@ function LatestReports({
3723
4072
  )
3724
4073
  ] })
3725
4074
  ] }),
3726
- filteredReports.length === 0 ? /* @__PURE__ */ jsx19(Card9, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs16(Stack10, { space: 3, children: [
3727
- /* @__PURE__ */ jsx19(Text16, { align: "center", muted: true, size: 2, children: "No reports match the current filters." }),
3728
- /* @__PURE__ */ jsx19(Flex12, { justify: "center", children: /* @__PURE__ */ jsx19(
4075
+ filteredReports.length === 0 ? /* @__PURE__ */ jsx21(Card11, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs18(Stack12, { space: 3, children: [
4076
+ /* @__PURE__ */ jsx21(Text18, { align: "center", muted: true, size: 2, children: "No reports match the current filters." }),
4077
+ /* @__PURE__ */ jsx21(Flex14, { justify: "center", children: /* @__PURE__ */ jsx21(
3729
4078
  Button,
3730
4079
  {
3731
4080
  fontSize: 1,
@@ -3734,7 +4083,7 @@ function LatestReports({
3734
4083
  text: "Clear all filters"
3735
4084
  }
3736
4085
  ) })
3737
- ] }) }) : /* @__PURE__ */ jsx19(Stack10, { space: 2, children: filteredReports.map((report) => /* @__PURE__ */ jsx19(
4086
+ ] }) }) : /* @__PURE__ */ jsx21(Stack12, { space: 2, children: filteredReports.map((report) => /* @__PURE__ */ jsx21(
3738
4087
  ReportCard,
3739
4088
  {
3740
4089
  data: fromReportListItem(report),
@@ -3742,7 +4091,7 @@ function LatestReports({
3742
4091
  },
3743
4092
  report._id
3744
4093
  )) }),
3745
- hasMore && /* @__PURE__ */ jsx19(Flex12, { justify: "center", paddingY: 3, children: /* @__PURE__ */ jsx19(
4094
+ hasMore && /* @__PURE__ */ jsx21(Flex14, { justify: "center", paddingY: 3, children: /* @__PURE__ */ jsx21(
3746
4095
  Button,
3747
4096
  {
3748
4097
  disabled: loadingMore,
@@ -3790,28 +4139,28 @@ function getDateThreshold(preset) {
3790
4139
 
3791
4140
  // src/components/report-detail/ReportDetail.tsx
3792
4141
  import { ArrowLeftIcon as ArrowLeftIcon2 } from "@sanity/icons";
3793
- import { Box as Box12, Button as Button3, Stack as Stack19, Text as Text26, useToast } from "@sanity/ui";
3794
- import { useCallback as useCallback9, useEffect as useEffect6, useState as useState8 } from "react";
4142
+ import { Box as Box14, Button as Button3, Stack as Stack21, Text as Text28, useToast } from "@sanity/ui";
4143
+ import { useCallback as useCallback11, useEffect as useEffect6, useState as useState8 } from "react";
3795
4144
  import { useClient as useClient6 } from "sanity";
3796
4145
 
3797
4146
  // src/components/report-detail/AreaScoreTable.tsx
3798
4147
  import React from "react";
3799
- import { Card as Card11, Stack as Stack11, Text as Text18 } from "@sanity/ui";
4148
+ import { Card as Card13, Stack as Stack13, Text as Text20 } from "@sanity/ui";
3800
4149
 
3801
4150
  // src/components/primitives/ScoreCell.tsx
3802
- import { Card as Card10, Text as Text17 } from "@sanity/ui";
3803
- import { jsx as jsx20 } from "react/jsx-runtime";
4151
+ import { Card as Card12, Text as Text19 } from "@sanity/ui";
4152
+ import { jsx as jsx22 } from "react/jsx-runtime";
3804
4153
  function ScoreCell({ score, size = 1 }) {
3805
4154
  const rounded = Math.round(score);
3806
- return /* @__PURE__ */ jsx20(Card10, { padding: 1, radius: 2, tone: scoreTone(rounded), children: /* @__PURE__ */ jsx20(Text17, { align: "center", size, weight: "medium", children: rounded }) });
4155
+ return /* @__PURE__ */ jsx22(Card12, { padding: 1, radius: 2, tone: scoreTone(rounded), children: /* @__PURE__ */ jsx22(Text19, { align: "center", size, weight: "medium", children: rounded }) });
3807
4156
  }
3808
4157
 
3809
4158
  // src/components/report-detail/AreaScoreTable.tsx
3810
- import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
4159
+ import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
3811
4160
  function AreaScoreTable({ scores }) {
3812
- return /* @__PURE__ */ jsx21(Card11, { overflow: "auto", padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs17(Stack11, { space: 4, children: [
3813
- /* @__PURE__ */ jsx21(Text18, { size: 2, weight: "semibold", children: "Per-Area Scores" }),
3814
- /* @__PURE__ */ jsxs17(
4161
+ return /* @__PURE__ */ jsx23(Card13, { overflow: "auto", padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs19(Stack13, { space: 4, children: [
4162
+ /* @__PURE__ */ jsx23(Text20, { size: 2, weight: "semibold", children: "Per-Area Scores" }),
4163
+ /* @__PURE__ */ jsxs19(
3815
4164
  "div",
3816
4165
  {
3817
4166
  style: {
@@ -3820,9 +4169,9 @@ function AreaScoreTable({ scores }) {
3820
4169
  gridTemplateColumns: "2fr 1fr 1fr 1fr 1fr 1fr 1fr"
3821
4170
  },
3822
4171
  children: [
3823
- /* @__PURE__ */ jsx21(ColumnHeader, { borderBottom: true, label: "Area" }),
3824
- /* @__PURE__ */ jsx21(ColumnHeader, { borderBottom: true, label: "Score", tooltip: GLOSSARY.score }),
3825
- /* @__PURE__ */ jsx21(
4172
+ /* @__PURE__ */ jsx23(ColumnHeader, { borderBottom: true, label: "Area" }),
4173
+ /* @__PURE__ */ jsx23(ColumnHeader, { borderBottom: true, label: "Score", tooltip: GLOSSARY.score }),
4174
+ /* @__PURE__ */ jsx23(
3826
4175
  ColumnHeader,
3827
4176
  {
3828
4177
  borderBottom: true,
@@ -3830,7 +4179,7 @@ function AreaScoreTable({ scores }) {
3830
4179
  tooltip: GLOSSARY.taskCompletion
3831
4180
  }
3832
4181
  ),
3833
- /* @__PURE__ */ jsx21(
4182
+ /* @__PURE__ */ jsx23(
3834
4183
  ColumnHeader,
3835
4184
  {
3836
4185
  borderBottom: true,
@@ -3838,7 +4187,7 @@ function AreaScoreTable({ scores }) {
3838
4187
  tooltip: GLOSSARY.codeCorrectness
3839
4188
  }
3840
4189
  ),
3841
- /* @__PURE__ */ jsx21(
4190
+ /* @__PURE__ */ jsx23(
3842
4191
  ColumnHeader,
3843
4192
  {
3844
4193
  borderBottom: true,
@@ -3846,10 +4195,10 @@ function AreaScoreTable({ scores }) {
3846
4195
  tooltip: GLOSSARY.docCoverage
3847
4196
  }
3848
4197
  ),
3849
- /* @__PURE__ */ jsx21(ColumnHeader, { borderBottom: true, label: "Lift", tooltip: GLOSSARY.docLift }),
3850
- /* @__PURE__ */ jsx21(ColumnHeader, { borderBottom: true, label: "Tests", tooltip: GLOSSARY.tests }),
3851
- scores.map((score, i) => /* @__PURE__ */ jsxs17(React.Fragment, { children: [
3852
- /* @__PURE__ */ jsx21(
4198
+ /* @__PURE__ */ jsx23(ColumnHeader, { borderBottom: true, label: "Lift", tooltip: GLOSSARY.docLift }),
4199
+ /* @__PURE__ */ jsx23(ColumnHeader, { borderBottom: true, label: "Tests", tooltip: GLOSSARY.tests }),
4200
+ scores.map((score, i) => /* @__PURE__ */ jsxs19(React.Fragment, { children: [
4201
+ /* @__PURE__ */ jsx23(
3853
4202
  "div",
3854
4203
  {
3855
4204
  style: {
@@ -3857,14 +4206,14 @@ function AreaScoreTable({ scores }) {
3857
4206
  borderRadius: 4,
3858
4207
  padding: "8px 0 8px 4px"
3859
4208
  },
3860
- children: /* @__PURE__ */ jsx21(Text18, { size: 1, weight: "medium", children: score.feature })
4209
+ children: /* @__PURE__ */ jsx23(Text20, { size: 1, weight: "medium", children: score.feature })
3861
4210
  }
3862
4211
  ),
3863
- /* @__PURE__ */ jsx21("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx21(ScoreCell, { score: score.totalScore }) }),
3864
- /* @__PURE__ */ jsx21("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx21(ScoreCell, { score: score.taskCompletion }) }),
3865
- /* @__PURE__ */ jsx21("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx21(ScoreCell, { score: score.codeCorrectness }) }),
3866
- /* @__PURE__ */ jsx21("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx21(ScoreCell, { score: score.docCoverage }) }),
3867
- /* @__PURE__ */ jsx21(
4212
+ /* @__PURE__ */ jsx23("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx23(ScoreCell, { score: score.totalScore }) }),
4213
+ /* @__PURE__ */ jsx23("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx23(ScoreCell, { score: score.taskCompletion }) }),
4214
+ /* @__PURE__ */ jsx23("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx23(ScoreCell, { score: score.codeCorrectness }) }),
4215
+ /* @__PURE__ */ jsx23("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx23(ScoreCell, { score: score.docCoverage }) }),
4216
+ /* @__PURE__ */ jsx23(
3868
4217
  "div",
3869
4218
  {
3870
4219
  style: {
@@ -3872,10 +4221,10 @@ function AreaScoreTable({ scores }) {
3872
4221
  background: rowBackground(i),
3873
4222
  display: "flex"
3874
4223
  },
3875
- children: /* @__PURE__ */ jsx21(Text18, { size: 1, children: formatDelta(score.docLift) })
4224
+ children: /* @__PURE__ */ jsx23(Text20, { size: 1, children: formatDelta(score.docLift) })
3876
4225
  }
3877
4226
  ),
3878
- /* @__PURE__ */ jsx21(
4227
+ /* @__PURE__ */ jsx23(
3879
4228
  "div",
3880
4229
  {
3881
4230
  style: {
@@ -3883,7 +4232,7 @@ function AreaScoreTable({ scores }) {
3883
4232
  background: rowBackground(i),
3884
4233
  display: "flex"
3885
4234
  },
3886
- children: /* @__PURE__ */ jsx21(Text18, { muted: true, size: 1, children: score.testCount })
4235
+ children: /* @__PURE__ */ jsx23(Text20, { muted: true, size: 1, children: score.testCount })
3887
4236
  }
3888
4237
  )
3889
4238
  ] }, score.feature))
@@ -3894,13 +4243,13 @@ function AreaScoreTable({ scores }) {
3894
4243
  }
3895
4244
 
3896
4245
  // src/components/report-detail/ComparisonSummary.tsx
3897
- import { Badge as Badge12, Box as Box7, Card as Card12, Flex as Flex13, Grid as Grid2, Stack as Stack12, Text as Text19, Tooltip as Tooltip3 } from "@sanity/ui";
3898
- import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
4246
+ import { Badge as Badge12, Box as Box9, Card as Card14, Flex as Flex15, Grid as Grid2, Stack as Stack14, Text as Text21, Tooltip as Tooltip3 } from "@sanity/ui";
4247
+ import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
3899
4248
  function ComparisonSummary({ comparison }) {
3900
- return /* @__PURE__ */ jsx22(Card12, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs18(Stack12, { space: 4, children: [
3901
- /* @__PURE__ */ jsxs18(Flex13, { align: "center", gap: 3, wrap: "wrap", children: [
3902
- /* @__PURE__ */ jsx22(Text19, { size: 2, weight: "semibold", children: "Comparison" }),
3903
- /* @__PURE__ */ jsx22(
4249
+ return /* @__PURE__ */ jsx24(Card14, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs20(Stack14, { space: 4, children: [
4250
+ /* @__PURE__ */ jsxs20(Flex15, { align: "center", gap: 3, wrap: "wrap", children: [
4251
+ /* @__PURE__ */ jsx24(Text21, { size: 2, weight: "semibold", children: "Comparison" }),
4252
+ /* @__PURE__ */ jsx24(
3904
4253
  DeltaCard,
3905
4254
  {
3906
4255
  delta: comparison.deltas.overall,
@@ -3908,7 +4257,7 @@ function ComparisonSummary({ comparison }) {
3908
4257
  tooltip: GLOSSARY.overallDelta
3909
4258
  }
3910
4259
  ),
3911
- comparison.deltas.actualDelta != null && /* @__PURE__ */ jsx22(
4260
+ comparison.deltas.actualDelta != null && /* @__PURE__ */ jsx24(
3912
4261
  DeltaCard,
3913
4262
  {
3914
4263
  delta: comparison.deltas.actualDelta,
@@ -3916,7 +4265,7 @@ function ComparisonSummary({ comparison }) {
3916
4265
  tooltip: GLOSSARY.actualDelta
3917
4266
  }
3918
4267
  ),
3919
- comparison.deltas.retrievalGapDelta != null && /* @__PURE__ */ jsx22(
4268
+ comparison.deltas.retrievalGapDelta != null && /* @__PURE__ */ jsx24(
3920
4269
  DeltaCard,
3921
4270
  {
3922
4271
  delta: comparison.deltas.retrievalGapDelta,
@@ -3926,8 +4275,8 @@ function ComparisonSummary({ comparison }) {
3926
4275
  }
3927
4276
  )
3928
4277
  ] }),
3929
- /* @__PURE__ */ jsxs18(Grid2, { columns: [1, 1, 3], gap: 3, children: [
3930
- comparison.improved.length > 0 && /* @__PURE__ */ jsx22(
4278
+ /* @__PURE__ */ jsxs20(Grid2, { columns: [1, 1, 3], gap: 3, children: [
4279
+ comparison.improved.length > 0 && /* @__PURE__ */ jsx24(
3931
4280
  AreaBadgeGroup,
3932
4281
  {
3933
4282
  areas: comparison.improved,
@@ -3935,7 +4284,7 @@ function ComparisonSummary({ comparison }) {
3935
4284
  tone: "positive"
3936
4285
  }
3937
4286
  ),
3938
- comparison.regressed.length > 0 && /* @__PURE__ */ jsx22(
4287
+ comparison.regressed.length > 0 && /* @__PURE__ */ jsx24(
3939
4288
  AreaBadgeGroup,
3940
4289
  {
3941
4290
  areas: comparison.regressed,
@@ -3943,7 +4292,7 @@ function ComparisonSummary({ comparison }) {
3943
4292
  tone: "critical"
3944
4293
  }
3945
4294
  ),
3946
- comparison.unchanged.length > 0 && /* @__PURE__ */ jsx22(
4295
+ comparison.unchanged.length > 0 && /* @__PURE__ */ jsx24(
3947
4296
  AreaBadgeGroup,
3948
4297
  {
3949
4298
  areas: comparison.unchanged,
@@ -3962,19 +4311,19 @@ function DeltaCard({
3962
4311
  }) {
3963
4312
  const isPositive = invertedPolarity ? delta < 0 : delta > 0;
3964
4313
  const isNegative = invertedPolarity ? delta > 0 : delta < 0;
3965
- return /* @__PURE__ */ jsx22(
4314
+ return /* @__PURE__ */ jsx24(
3966
4315
  Tooltip3,
3967
4316
  {
3968
- content: /* @__PURE__ */ jsx22(Box7, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx22(Text19, { size: 1, children: tooltip }) }),
4317
+ content: /* @__PURE__ */ jsx24(Box9, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx24(Text21, { size: 1, children: tooltip }) }),
3969
4318
  placement: "bottom",
3970
4319
  portal: true,
3971
- children: /* @__PURE__ */ jsx22(
3972
- Card12,
4320
+ children: /* @__PURE__ */ jsx24(
4321
+ Card14,
3973
4322
  {
3974
4323
  padding: 2,
3975
4324
  radius: 2,
3976
4325
  tone: isPositive ? "positive" : isNegative ? "critical" : "default",
3977
- children: /* @__PURE__ */ jsxs18(Text19, { size: 1, weight: "bold", children: [
4326
+ children: /* @__PURE__ */ jsxs20(Text21, { size: 1, weight: "bold", children: [
3978
4327
  formatDelta(delta),
3979
4328
  " ",
3980
4329
  label
@@ -3989,9 +4338,9 @@ function AreaBadgeGroup({
3989
4338
  label,
3990
4339
  tone
3991
4340
  }) {
3992
- return /* @__PURE__ */ jsxs18(Stack12, { space: 2, children: [
3993
- /* @__PURE__ */ jsx22(
3994
- Text19,
4341
+ return /* @__PURE__ */ jsxs20(Stack14, { space: 2, children: [
4342
+ /* @__PURE__ */ jsx24(
4343
+ Text21,
3995
4344
  {
3996
4345
  muted: true,
3997
4346
  size: 0,
@@ -4000,21 +4349,21 @@ function AreaBadgeGroup({
4000
4349
  children: label
4001
4350
  }
4002
4351
  ),
4003
- /* @__PURE__ */ jsx22(Flex13, { gap: 1, wrap: "wrap", children: areas.map((a) => /* @__PURE__ */ jsx22(Badge12, { tone, children: a }, a)) })
4352
+ /* @__PURE__ */ jsx24(Flex15, { gap: 1, wrap: "wrap", children: areas.map((a) => /* @__PURE__ */ jsx24(Badge12, { tone, children: a }, a)) })
4004
4353
  ] });
4005
4354
  }
4006
4355
 
4007
4356
  // src/components/report-detail/JudgmentList.tsx
4008
4357
  import { useState as useState7 } from "react";
4009
- import { HelpCircleIcon as HelpCircleIcon2 } from "@sanity/icons";
4010
- import { Badge as Badge13, Box as Box8, Card as Card13, Flex as Flex14, Stack as Stack13, Text as Text20, Tooltip as Tooltip4 } from "@sanity/ui";
4358
+ import { HelpCircleIcon as HelpCircleIcon4 } from "@sanity/icons";
4359
+ import { Badge as Badge13, Box as Box10, Card as Card15, Flex as Flex16, Stack as Stack15, Text as Text22, Tooltip as Tooltip4 } from "@sanity/ui";
4011
4360
 
4012
4361
  // src/components/primitives/InlineCode.tsx
4013
- import { Fragment as Fragment2, jsx as jsx23 } from "react/jsx-runtime";
4362
+ import { Fragment as Fragment4, jsx as jsx25 } from "react/jsx-runtime";
4014
4363
  function InlineCode({ text }) {
4015
4364
  const parts = text.split(/`([^`]+)`/);
4016
- return /* @__PURE__ */ jsx23(Fragment2, { children: parts.map(
4017
- (part, i) => i % 2 === 1 ? /* @__PURE__ */ jsx23(
4365
+ return /* @__PURE__ */ jsx25(Fragment4, { children: parts.map(
4366
+ (part, i) => i % 2 === 1 ? /* @__PURE__ */ jsx25(
4018
4367
  "code",
4019
4368
  {
4020
4369
  style: {
@@ -4026,12 +4375,12 @@ function InlineCode({ text }) {
4026
4375
  children: part
4027
4376
  },
4028
4377
  i
4029
- ) : /* @__PURE__ */ jsx23("span", { children: part }, i)
4378
+ ) : /* @__PURE__ */ jsx25("span", { children: part }, i)
4030
4379
  ) });
4031
4380
  }
4032
4381
 
4033
4382
  // src/components/report-detail/JudgmentList.tsx
4034
- import { jsx as jsx24, jsxs as jsxs19 } from "react/jsx-runtime";
4383
+ import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
4035
4384
  function groupByArea(judgments) {
4036
4385
  const byArea = /* @__PURE__ */ new Map();
4037
4386
  for (const j of judgments) {
@@ -4046,36 +4395,36 @@ var DIMENSION_LABELS = DIMENSION_LABELS_KEBAB;
4046
4395
  function JudgmentList({ judgments }) {
4047
4396
  if (judgments.length === 0) return null;
4048
4397
  const grouped = groupByArea(judgments);
4049
- return /* @__PURE__ */ jsx24(Card13, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs19(Stack13, { space: 4, children: [
4050
- /* @__PURE__ */ jsxs19(Flex14, { align: "center", gap: 3, wrap: "wrap", children: [
4051
- /* @__PURE__ */ jsx24(Text20, { size: 2, weight: "semibold", children: "Low-Scoring Judgments" }),
4052
- /* @__PURE__ */ jsx24(
4398
+ return /* @__PURE__ */ jsx26(Card15, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs21(Stack15, { space: 4, children: [
4399
+ /* @__PURE__ */ jsxs21(Flex16, { align: "center", gap: 3, wrap: "wrap", children: [
4400
+ /* @__PURE__ */ jsx26(Text22, { size: 2, weight: "semibold", children: "Low-Scoring Judgments" }),
4401
+ /* @__PURE__ */ jsx26(
4053
4402
  Tooltip4,
4054
4403
  {
4055
- content: /* @__PURE__ */ jsx24(Box8, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx24(Text20, { size: 1, children: GLOSSARY.lowScoringJudgments }) }),
4404
+ content: /* @__PURE__ */ jsx26(Box10, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx26(Text22, { size: 1, children: GLOSSARY.lowScoringJudgments }) }),
4056
4405
  placement: "bottom",
4057
4406
  portal: true,
4058
- children: /* @__PURE__ */ jsx24(Text20, { muted: true, size: 0, children: /* @__PURE__ */ jsx24(HelpCircleIcon2, {}) })
4407
+ children: /* @__PURE__ */ jsx26(Text22, { muted: true, size: 0, children: /* @__PURE__ */ jsx26(HelpCircleIcon4, {}) })
4059
4408
  }
4060
4409
  ),
4061
- /* @__PURE__ */ jsx24(Card13, { padding: 2, radius: 2, tone: "critical", children: /* @__PURE__ */ jsxs19(Text20, { size: 1, weight: "bold", children: [
4410
+ /* @__PURE__ */ jsx26(Card15, { padding: 2, radius: 2, tone: "critical", children: /* @__PURE__ */ jsxs21(Text22, { size: 1, weight: "bold", children: [
4062
4411
  judgments.length,
4063
4412
  " judgment",
4064
4413
  judgments.length === 1 ? "" : "s",
4065
4414
  " below 70"
4066
4415
  ] }) })
4067
4416
  ] }),
4068
- grouped.map(([area, areaJudgments]) => /* @__PURE__ */ jsx24(Card13, { padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsxs19(Stack13, { space: 3, children: [
4069
- /* @__PURE__ */ jsxs19(Text20, { size: 1, weight: "semibold", children: [
4417
+ grouped.map(([area, areaJudgments]) => /* @__PURE__ */ jsx26(Card15, { padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsxs21(Stack15, { space: 3, children: [
4418
+ /* @__PURE__ */ jsxs21(Text22, { size: 1, weight: "semibold", children: [
4070
4419
  area,
4071
4420
  " ",
4072
- /* @__PURE__ */ jsxs19(Text20, { muted: true, size: 1, weight: "regular", as: "span", children: [
4421
+ /* @__PURE__ */ jsxs21(Text22, { muted: true, size: 1, weight: "regular", as: "span", children: [
4073
4422
  "(",
4074
4423
  areaJudgments.length,
4075
4424
  ")"
4076
4425
  ] })
4077
4426
  ] }),
4078
- areaJudgments.map((j, i) => /* @__PURE__ */ jsx24(JudgmentCard, { judgment: j }, `${area}-${i}`))
4427
+ areaJudgments.map((j, i) => /* @__PURE__ */ jsx26(JudgmentCard, { judgment: j }, `${area}-${i}`))
4079
4428
  ] }) }, area))
4080
4429
  ] }) });
4081
4430
  }
@@ -4084,18 +4433,18 @@ function JudgmentCard({ judgment }) {
4084
4433
  const dimLabel = DIMENSION_LABELS[judgment.dimension] ?? judgment.dimension;
4085
4434
  const sep = judgment.taskId.indexOf(" - ");
4086
4435
  const taskName = sep > 0 ? judgment.taskId.substring(sep + 3) : judgment.taskId;
4087
- return /* @__PURE__ */ jsx24(
4088
- Card13,
4436
+ return /* @__PURE__ */ jsx26(
4437
+ Card15,
4089
4438
  {
4090
4439
  padding: 3,
4091
4440
  radius: 2,
4092
4441
  shadow: 1,
4093
4442
  style: { cursor: "pointer" },
4094
4443
  onClick: () => setExpanded(!expanded),
4095
- children: /* @__PURE__ */ jsxs19(Stack13, { space: 3, children: [
4096
- /* @__PURE__ */ jsxs19(Flex14, { align: "center", gap: 2, wrap: "wrap", children: [
4097
- /* @__PURE__ */ jsx24(Card13, { padding: 2, radius: 2, tone: scoreTone(judgment.score), children: /* @__PURE__ */ jsx24(
4098
- Text20,
4444
+ children: /* @__PURE__ */ jsxs21(Stack15, { space: 3, children: [
4445
+ /* @__PURE__ */ jsxs21(Flex16, { align: "center", gap: 2, wrap: "wrap", children: [
4446
+ /* @__PURE__ */ jsx26(Card15, { padding: 2, radius: 2, tone: scoreTone(judgment.score), children: /* @__PURE__ */ jsx26(
4447
+ Text22,
4099
4448
  {
4100
4449
  align: "center",
4101
4450
  size: 1,
@@ -4104,32 +4453,32 @@ function JudgmentCard({ judgment }) {
4104
4453
  children: judgment.score
4105
4454
  }
4106
4455
  ) }),
4107
- /* @__PURE__ */ jsx24(Badge13, { tone: "default", children: dimLabel }),
4108
- /* @__PURE__ */ jsx24(Text20, { size: 1, weight: "medium", children: taskName }),
4109
- /* @__PURE__ */ jsx24(Text20, { muted: true, size: 0, children: judgment.modelId }),
4110
- /* @__PURE__ */ jsx24(Text20, { muted: true, size: 0, style: { marginLeft: "auto" }, children: expanded ? "\u25B2" : "\u25BC" })
4456
+ /* @__PURE__ */ jsx26(Badge13, { tone: "default", children: dimLabel }),
4457
+ /* @__PURE__ */ jsx26(Text22, { size: 1, weight: "medium", children: taskName }),
4458
+ /* @__PURE__ */ jsx26(Text22, { muted: true, size: 0, children: judgment.modelId }),
4459
+ /* @__PURE__ */ jsx26(Text22, { muted: true, size: 0, style: { marginLeft: "auto" }, children: expanded ? "\u25B2" : "\u25BC" })
4111
4460
  ] }),
4112
- expanded && /* @__PURE__ */ jsxs19(Stack13, { space: 3, children: [
4113
- /* @__PURE__ */ jsx24(Card13, { padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsx24(
4114
- Text20,
4461
+ expanded && /* @__PURE__ */ jsxs21(Stack15, { space: 3, children: [
4462
+ /* @__PURE__ */ jsx26(Card15, { padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsx26(
4463
+ Text22,
4115
4464
  {
4116
4465
  muted: true,
4117
4466
  size: 1,
4118
4467
  style: { lineHeight: 1.6, whiteSpace: "pre-wrap" },
4119
- children: /* @__PURE__ */ jsx24(InlineCode, { text: judgment.reason })
4468
+ children: /* @__PURE__ */ jsx26(InlineCode, { text: judgment.reason })
4120
4469
  }
4121
4470
  ) }),
4122
- judgment.canonicalDocs && judgment.canonicalDocs.length > 0 && /* @__PURE__ */ jsxs19(Flex14, { align: "center", gap: 2, wrap: "wrap", children: [
4123
- /* @__PURE__ */ jsx24(Text20, { muted: true, size: 0, children: "Docs:" }),
4471
+ judgment.canonicalDocs && judgment.canonicalDocs.length > 0 && /* @__PURE__ */ jsxs21(Flex16, { align: "center", gap: 2, wrap: "wrap", children: [
4472
+ /* @__PURE__ */ jsx26(Text22, { muted: true, size: 0, children: "Docs:" }),
4124
4473
  judgment.canonicalDocs.map((doc) => {
4125
- const badge = /* @__PURE__ */ jsx24(Badge13, { mode: "outline", tone: "primary", children: doc.slug });
4126
- return /* @__PURE__ */ jsx24(
4474
+ const badge = /* @__PURE__ */ jsx26(Badge13, { mode: "outline", tone: "primary", children: doc.slug });
4475
+ return /* @__PURE__ */ jsx26(
4127
4476
  Tooltip4,
4128
4477
  {
4129
- content: /* @__PURE__ */ jsx24(Box8, { padding: 2, children: /* @__PURE__ */ jsx24(Text20, { size: 1, children: doc.title || doc.slug }) }),
4478
+ content: /* @__PURE__ */ jsx26(Box10, { padding: 2, children: /* @__PURE__ */ jsx26(Text22, { size: 1, children: doc.title || doc.slug }) }),
4130
4479
  placement: "bottom",
4131
4480
  portal: true,
4132
- children: doc.documentId ? /* @__PURE__ */ jsx24(
4481
+ children: doc.documentId ? /* @__PURE__ */ jsx26(
4133
4482
  "a",
4134
4483
  {
4135
4484
  href: `/intent/edit/id=${doc.documentId}`,
@@ -4153,9 +4502,9 @@ function JudgmentCard({ judgment }) {
4153
4502
  import { Grid as Grid3 } from "@sanity/ui";
4154
4503
 
4155
4504
  // src/components/primitives/StatCard.tsx
4156
- import { HelpCircleIcon as HelpCircleIcon3 } from "@sanity/icons";
4157
- import { Box as Box9, Card as Card14, Stack as Stack14, Text as Text21, Tooltip as Tooltip5 } from "@sanity/ui";
4158
- import { Fragment as Fragment3, jsx as jsx25, jsxs as jsxs20 } from "react/jsx-runtime";
4505
+ import { HelpCircleIcon as HelpCircleIcon5 } from "@sanity/icons";
4506
+ import { Box as Box11, Card as Card16, Stack as Stack16, Text as Text23, Tooltip as Tooltip5 } from "@sanity/ui";
4507
+ import { Fragment as Fragment5, jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
4159
4508
  function StatCard({
4160
4509
  label,
4161
4510
  value,
@@ -4163,24 +4512,24 @@ function StatCard({
4163
4512
  suffix,
4164
4513
  tone = "default"
4165
4514
  }) {
4166
- return /* @__PURE__ */ jsx25(Card14, { padding: 3, radius: 2, shadow: 1, tone, children: /* @__PURE__ */ jsxs20(Stack14, { space: 2, children: [
4167
- /* @__PURE__ */ jsxs20(Text21, { muted: true, size: 1, children: [
4515
+ return /* @__PURE__ */ jsx27(Card16, { padding: 3, radius: 2, shadow: 1, tone, children: /* @__PURE__ */ jsxs22(Stack16, { space: 2, children: [
4516
+ /* @__PURE__ */ jsxs22(Text23, { muted: true, size: 1, children: [
4168
4517
  label,
4169
- tooltip && /* @__PURE__ */ jsxs20(Fragment3, { children: [
4518
+ tooltip && /* @__PURE__ */ jsxs22(Fragment5, { children: [
4170
4519
  " ",
4171
- /* @__PURE__ */ jsx25(
4520
+ /* @__PURE__ */ jsx27(
4172
4521
  Tooltip5,
4173
4522
  {
4174
- content: /* @__PURE__ */ jsx25(Box9, { padding: 2, children: /* @__PURE__ */ jsx25(Text21, { size: 1, children: tooltip }) }),
4523
+ content: /* @__PURE__ */ jsx27(Box11, { padding: 2, children: /* @__PURE__ */ jsx27(Text23, { size: 1, children: tooltip }) }),
4175
4524
  portal: true,
4176
- children: /* @__PURE__ */ jsx25("span", { style: { cursor: "help" }, children: /* @__PURE__ */ jsx25(HelpCircleIcon3, {}) })
4525
+ children: /* @__PURE__ */ jsx27("span", { style: { cursor: "help" }, children: /* @__PURE__ */ jsx27(HelpCircleIcon5, {}) })
4177
4526
  }
4178
4527
  )
4179
4528
  ] })
4180
4529
  ] }),
4181
- /* @__PURE__ */ jsxs20(Text21, { size: 3, weight: "bold", children: [
4530
+ /* @__PURE__ */ jsxs22(Text23, { size: 3, weight: "bold", children: [
4182
4531
  value,
4183
- suffix && /* @__PURE__ */ jsxs20("span", { style: { fontSize: "0.6em", fontWeight: 400 }, children: [
4532
+ suffix && /* @__PURE__ */ jsxs22("span", { style: { fontSize: "0.6em", fontWeight: 400 }, children: [
4184
4533
  " ",
4185
4534
  suffix
4186
4535
  ] })
@@ -4189,7 +4538,7 @@ function StatCard({
4189
4538
  }
4190
4539
 
4191
4540
  // src/components/report-detail/OverviewStats.tsx
4192
- import { jsx as jsx26, jsxs as jsxs21 } from "react/jsx-runtime";
4541
+ import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
4193
4542
  function OverviewStats({
4194
4543
  overall,
4195
4544
  durationMs,
@@ -4197,8 +4546,8 @@ function OverviewStats({
4197
4546
  isFullMode
4198
4547
  }) {
4199
4548
  const overallTone = scoreTone(overall.avgScore);
4200
- return /* @__PURE__ */ jsxs21(Grid3, { columns: [1, 1, 2, isFullMode ? 4 : 4], gap: 3, children: [
4201
- /* @__PURE__ */ jsx26(
4549
+ return /* @__PURE__ */ jsxs23(Grid3, { columns: [1, 1, 2, isFullMode ? 4 : 4], gap: 3, children: [
4550
+ /* @__PURE__ */ jsx28(
4202
4551
  StatCard,
4203
4552
  {
4204
4553
  label: "Overall Score",
@@ -4207,7 +4556,7 @@ function OverviewStats({
4207
4556
  value: overall.avgScore.toFixed(1)
4208
4557
  }
4209
4558
  ),
4210
- /* @__PURE__ */ jsx26(
4559
+ /* @__PURE__ */ jsx28(
4211
4560
  StatCard,
4212
4561
  {
4213
4562
  label: "Doc Lift",
@@ -4216,7 +4565,7 @@ function OverviewStats({
4216
4565
  value: overall.avgDocLift.toFixed(1)
4217
4566
  }
4218
4567
  ),
4219
- isFullMode && overall.avgActualScore != null && /* @__PURE__ */ jsx26(
4568
+ isFullMode && overall.avgActualScore != null && /* @__PURE__ */ jsx28(
4220
4569
  StatCard,
4221
4570
  {
4222
4571
  label: "Actual Score",
@@ -4225,7 +4574,7 @@ function OverviewStats({
4225
4574
  value: overall.avgActualScore.toFixed(1)
4226
4575
  }
4227
4576
  ),
4228
- isFullMode && overall.avgRetrievalGap != null && /* @__PURE__ */ jsx26(
4577
+ isFullMode && overall.avgRetrievalGap != null && /* @__PURE__ */ jsx28(
4229
4578
  StatCard,
4230
4579
  {
4231
4580
  label: "Retrieval Gap",
@@ -4235,7 +4584,7 @@ function OverviewStats({
4235
4584
  value: overall.avgRetrievalGap.toFixed(1)
4236
4585
  }
4237
4586
  ),
4238
- isFullMode && overall.avgInfrastructureEfficiency != null && /* @__PURE__ */ jsx26(
4587
+ isFullMode && overall.avgInfrastructureEfficiency != null && /* @__PURE__ */ jsx28(
4239
4588
  StatCard,
4240
4589
  {
4241
4590
  label: "Infra Efficiency",
@@ -4243,8 +4592,8 @@ function OverviewStats({
4243
4592
  value: formatPercent(overall.avgInfrastructureEfficiency)
4244
4593
  }
4245
4594
  ),
4246
- /* @__PURE__ */ jsx26(StatCard, { label: "Duration", value: formatDuration(durationMs) }),
4247
- /* @__PURE__ */ jsx26(
4595
+ /* @__PURE__ */ jsx28(StatCard, { label: "Duration", value: formatDuration(durationMs) }),
4596
+ /* @__PURE__ */ jsx28(
4248
4597
  StatCard,
4249
4598
  {
4250
4599
  label: "Tests",
@@ -4256,31 +4605,31 @@ function OverviewStats({
4256
4605
  }
4257
4606
 
4258
4607
  // src/components/report-detail/ProvenanceCard.tsx
4259
- import { Card as Card15, Flex as Flex15, Grid as Grid4, Stack as Stack15, Text as Text22 } from "@sanity/ui";
4260
- import { jsx as jsx27, jsxs as jsxs22 } from "react/jsx-runtime";
4608
+ import { Card as Card17, Flex as Flex17, Grid as Grid4, Stack as Stack17, Text as Text24 } from "@sanity/ui";
4609
+ import { jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
4261
4610
  var VIEWABLE_PROMPTFOO_MODES = /* @__PURE__ */ new Set(["agentic", "observed"]);
4262
4611
  function ProvenanceCard({ provenance }) {
4263
- return /* @__PURE__ */ jsx27(Card15, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs22(Stack15, { space: 4, children: [
4264
- /* @__PURE__ */ jsx27(Text22, { size: 2, weight: "semibold", children: "Provenance" }),
4265
- /* @__PURE__ */ jsxs22(Grid4, { columns: [1, 2, 3], gap: 4, children: [
4266
- /* @__PURE__ */ jsx27(Field, { label: "Mode", value: provenance.mode }),
4267
- /* @__PURE__ */ jsx27(Field, { label: "Source", value: provenance.source.name }),
4268
- /* @__PURE__ */ jsx27(
4612
+ return /* @__PURE__ */ jsx29(Card17, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs24(Stack17, { space: 4, children: [
4613
+ /* @__PURE__ */ jsx29(Text24, { size: 2, weight: "semibold", children: "Provenance" }),
4614
+ /* @__PURE__ */ jsxs24(Grid4, { columns: [1, 2, 3], gap: 4, children: [
4615
+ /* @__PURE__ */ jsx29(Field, { label: "Mode", value: provenance.mode }),
4616
+ /* @__PURE__ */ jsx29(Field, { label: "Source", value: provenance.source.name }),
4617
+ /* @__PURE__ */ jsx29(
4269
4618
  Field,
4270
4619
  {
4271
4620
  label: "Trigger",
4272
4621
  value: provenance.trigger.type + (provenance.trigger.workflow ? ` (${provenance.trigger.workflow})` : "")
4273
4622
  }
4274
4623
  ),
4275
- /* @__PURE__ */ jsx27(
4624
+ /* @__PURE__ */ jsx29(
4276
4625
  Field,
4277
4626
  {
4278
4627
  label: "Models",
4279
4628
  value: provenance.models.map((m) => m.label).join(", ")
4280
4629
  }
4281
4630
  ),
4282
- /* @__PURE__ */ jsx27(Field, { label: "Grader Model", mono: true, value: provenance.graderModel }),
4283
- provenance.contextHash && /* @__PURE__ */ jsx27(
4631
+ /* @__PURE__ */ jsx29(Field, { label: "Grader Model", mono: true, value: provenance.graderModel }),
4632
+ provenance.contextHash && /* @__PURE__ */ jsx29(
4284
4633
  Field,
4285
4634
  {
4286
4635
  label: "Context Hash",
@@ -4289,8 +4638,8 @@ function ProvenanceCard({ provenance }) {
4289
4638
  }
4290
4639
  )
4291
4640
  ] }),
4292
- provenance.git && /* @__PURE__ */ jsx27(GitInfo, { git: provenance.git }),
4293
- /* @__PURE__ */ jsx27(PromptfooLinks, { provenance })
4641
+ provenance.git && /* @__PURE__ */ jsx29(GitInfo, { git: provenance.git }),
4642
+ /* @__PURE__ */ jsx29(PromptfooLinks, { provenance })
4294
4643
  ] }) });
4295
4644
  }
4296
4645
  function Field({
@@ -4298,9 +4647,9 @@ function Field({
4298
4647
  mono,
4299
4648
  value
4300
4649
  }) {
4301
- return /* @__PURE__ */ jsxs22(Stack15, { space: 1, children: [
4302
- /* @__PURE__ */ jsx27(
4303
- Text22,
4650
+ return /* @__PURE__ */ jsxs24(Stack17, { space: 1, children: [
4651
+ /* @__PURE__ */ jsx29(
4652
+ Text24,
4304
4653
  {
4305
4654
  muted: true,
4306
4655
  size: 0,
@@ -4309,19 +4658,19 @@ function Field({
4309
4658
  children: label
4310
4659
  }
4311
4660
  ),
4312
- /* @__PURE__ */ jsx27(Text22, { size: 1, style: mono ? { fontFamily: "monospace" } : void 0, children: value })
4661
+ /* @__PURE__ */ jsx29(Text24, { size: 1, style: mono ? { fontFamily: "monospace" } : void 0, children: value })
4313
4662
  ] });
4314
4663
  }
4315
4664
  function GitInfo({ git }) {
4316
- return /* @__PURE__ */ jsx27(Card15, { border: true, padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsxs22(Flex15, { align: "center", gap: 3, wrap: "wrap", children: [
4317
- /* @__PURE__ */ jsx27(Text22, { muted: true, size: 1, weight: "semibold", children: "Git" }),
4318
- /* @__PURE__ */ jsxs22(Text22, { size: 1, children: [
4665
+ return /* @__PURE__ */ jsx29(Card17, { border: true, padding: 3, radius: 2, tone: "transparent", children: /* @__PURE__ */ jsxs24(Flex17, { align: "center", gap: 3, wrap: "wrap", children: [
4666
+ /* @__PURE__ */ jsx29(Text24, { muted: true, size: 1, weight: "semibold", children: "Git" }),
4667
+ /* @__PURE__ */ jsxs24(Text24, { size: 1, children: [
4319
4668
  git.repo,
4320
4669
  " / ",
4321
4670
  git.branch
4322
4671
  ] }),
4323
- /* @__PURE__ */ jsx27(Text22, { muted: true, size: 1, style: { fontFamily: "monospace" }, children: git.sha.slice(0, 12) }),
4324
- git.prNumber && /* @__PURE__ */ jsx27(Text22, { size: 1, children: /* @__PURE__ */ jsxs22(
4672
+ /* @__PURE__ */ jsx29(Text24, { muted: true, size: 1, style: { fontFamily: "monospace" }, children: git.sha.slice(0, 12) }),
4673
+ git.prNumber && /* @__PURE__ */ jsx29(Text24, { size: 1, children: /* @__PURE__ */ jsxs24(
4325
4674
  "a",
4326
4675
  {
4327
4676
  href: `https://github.com/${git.repo}/pull/${git.prNumber}`,
@@ -4344,14 +4693,14 @@ function PromptfooLinks({
4344
4693
  (e) => VIEWABLE_PROMPTFOO_MODES.has(e.mode)
4345
4694
  );
4346
4695
  if (viewable.length === 0) return null;
4347
- return /* @__PURE__ */ jsx27(Flex15, { gap: 3, wrap: "wrap", children: viewable.map((entry) => /* @__PURE__ */ jsx27(Text22, { size: 1, children: /* @__PURE__ */ jsxs22("a", { href: entry.url, rel: "noopener noreferrer", target: "_blank", children: [
4696
+ return /* @__PURE__ */ jsx29(Flex17, { gap: 3, wrap: "wrap", children: viewable.map((entry) => /* @__PURE__ */ jsx29(Text24, { size: 1, children: /* @__PURE__ */ jsxs24("a", { href: entry.url, rel: "noopener noreferrer", target: "_blank", children: [
4348
4697
  "View in Promptfoo (",
4349
4698
  entry.mode,
4350
4699
  ") \u2192"
4351
4700
  ] }) }, entry.mode)) });
4352
4701
  }
4353
4702
  if (provenance.promptfooUrl && VIEWABLE_PROMPTFOO_MODES.has(provenance.mode)) {
4354
- return /* @__PURE__ */ jsx27(Text22, { size: 1, children: /* @__PURE__ */ jsx27(
4703
+ return /* @__PURE__ */ jsx29(Text24, { size: 1, children: /* @__PURE__ */ jsx29(
4355
4704
  "a",
4356
4705
  {
4357
4706
  href: provenance.promptfooUrl,
@@ -4366,32 +4715,32 @@ function PromptfooLinks({
4366
4715
 
4367
4716
  // src/components/report-detail/RecommendationsSection.tsx
4368
4717
  import React3 from "react";
4369
- import { Badge as Badge14, Box as Box10, Card as Card16, Flex as Flex16, Stack as Stack16, Text as Text23, Tooltip as Tooltip6 } from "@sanity/ui";
4370
- import { HelpCircleIcon as HelpCircleIcon4 } from "@sanity/icons";
4371
- import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
4718
+ import { Badge as Badge14, Box as Box12, Card as Card18, Flex as Flex18, Stack as Stack18, Text as Text25, Tooltip as Tooltip6 } from "@sanity/ui";
4719
+ import { HelpCircleIcon as HelpCircleIcon6 } from "@sanity/icons";
4720
+ import { jsx as jsx30, jsxs as jsxs25 } from "react/jsx-runtime";
4372
4721
  function RecommendationsSection({
4373
4722
  recommendations
4374
4723
  }) {
4375
4724
  if (recommendations.gaps.length === 0) return null;
4376
- return /* @__PURE__ */ jsx28(Card16, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs23(Stack16, { space: 4, children: [
4377
- /* @__PURE__ */ jsxs23(Flex16, { align: "center", gap: 3, wrap: "wrap", children: [
4378
- /* @__PURE__ */ jsx28(Text23, { size: 2, weight: "semibold", children: "Recommendations" }),
4379
- /* @__PURE__ */ jsx28(
4725
+ return /* @__PURE__ */ jsx30(Card18, { padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs25(Stack18, { space: 4, children: [
4726
+ /* @__PURE__ */ jsxs25(Flex18, { align: "center", gap: 3, wrap: "wrap", children: [
4727
+ /* @__PURE__ */ jsx30(Text25, { size: 2, weight: "semibold", children: "Recommendations" }),
4728
+ /* @__PURE__ */ jsx30(
4380
4729
  Tooltip6,
4381
4730
  {
4382
- content: /* @__PURE__ */ jsx28(Box10, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx28(Text23, { size: 1, children: GLOSSARY.recommendations }) }),
4731
+ content: /* @__PURE__ */ jsx30(Box12, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx30(Text25, { size: 1, children: GLOSSARY.recommendations }) }),
4383
4732
  placement: "bottom",
4384
4733
  portal: true,
4385
- children: /* @__PURE__ */ jsx28(Text23, { muted: true, size: 0, children: /* @__PURE__ */ jsx28(HelpCircleIcon4, {}) })
4734
+ children: /* @__PURE__ */ jsx30(Text25, { muted: true, size: 0, children: /* @__PURE__ */ jsx30(HelpCircleIcon6, {}) })
4386
4735
  }
4387
4736
  ),
4388
- /* @__PURE__ */ jsx28(
4737
+ /* @__PURE__ */ jsx30(
4389
4738
  Tooltip6,
4390
4739
  {
4391
- content: /* @__PURE__ */ jsx28(Box10, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx28(Text23, { size: 1, children: GLOSSARY.totalPotentialLift }) }),
4740
+ content: /* @__PURE__ */ jsx30(Box12, { padding: 2, style: { maxWidth: 260 }, children: /* @__PURE__ */ jsx30(Text25, { size: 1, children: GLOSSARY.totalPotentialLift }) }),
4392
4741
  placement: "bottom",
4393
4742
  portal: true,
4394
- children: /* @__PURE__ */ jsx28(Card16, { padding: 2, radius: 2, tone: "positive", children: /* @__PURE__ */ jsxs23(Text23, { size: 1, weight: "bold", children: [
4743
+ children: /* @__PURE__ */ jsx30(Card18, { padding: 2, radius: 2, tone: "positive", children: /* @__PURE__ */ jsxs25(Text25, { size: 1, weight: "bold", children: [
4395
4744
  "+",
4396
4745
  recommendations.totalPotentialLift.toFixed(1),
4397
4746
  " pts potential lift"
@@ -4399,7 +4748,7 @@ function RecommendationsSection({
4399
4748
  }
4400
4749
  )
4401
4750
  ] }),
4402
- /* @__PURE__ */ jsxs23(
4751
+ /* @__PURE__ */ jsxs25(
4403
4752
  "div",
4404
4753
  {
4405
4754
  style: {
@@ -4408,9 +4757,9 @@ function RecommendationsSection({
4408
4757
  gridTemplateColumns: "auto 2fr 2fr 1fr 1fr 1fr"
4409
4758
  },
4410
4759
  children: [
4411
- /* @__PURE__ */ jsx28(ColumnHeader, { borderBottom: true, label: "#" }),
4412
- /* @__PURE__ */ jsx28(ColumnHeader, { borderBottom: true, label: "Area" }),
4413
- /* @__PURE__ */ jsx28(
4760
+ /* @__PURE__ */ jsx30(ColumnHeader, { borderBottom: true, label: "#" }),
4761
+ /* @__PURE__ */ jsx30(ColumnHeader, { borderBottom: true, label: "Area" }),
4762
+ /* @__PURE__ */ jsx30(
4414
4763
  ColumnHeader,
4415
4764
  {
4416
4765
  borderBottom: true,
@@ -4418,8 +4767,8 @@ function RecommendationsSection({
4418
4767
  tooltip: GLOSSARY.failureMode
4419
4768
  }
4420
4769
  ),
4421
- /* @__PURE__ */ jsx28(ColumnHeader, { borderBottom: true, label: "Action" }),
4422
- /* @__PURE__ */ jsx28(
4770
+ /* @__PURE__ */ jsx30(ColumnHeader, { borderBottom: true, label: "Action" }),
4771
+ /* @__PURE__ */ jsx30(
4423
4772
  ColumnHeader,
4424
4773
  {
4425
4774
  borderBottom: true,
@@ -4427,7 +4776,7 @@ function RecommendationsSection({
4427
4776
  tooltip: GLOSSARY.estimatedLift
4428
4777
  }
4429
4778
  ),
4430
- /* @__PURE__ */ jsx28(
4779
+ /* @__PURE__ */ jsx30(
4431
4780
  ColumnHeader,
4432
4781
  {
4433
4782
  borderBottom: true,
@@ -4435,7 +4784,7 @@ function RecommendationsSection({
4435
4784
  tooltip: GLOSSARY.confidence
4436
4785
  }
4437
4786
  ),
4438
- recommendations.gaps.map((gap, i) => /* @__PURE__ */ jsx28(RecommendationRow, { gap, index: i }, `gap-${i}`))
4787
+ recommendations.gaps.map((gap, i) => /* @__PURE__ */ jsx30(RecommendationRow, { gap, index: i }, `gap-${i}`))
4439
4788
  ]
4440
4789
  }
4441
4790
  )
@@ -4447,8 +4796,8 @@ function RecommendationRow({
4447
4796
  }) {
4448
4797
  const confIcon = gap.confidence === "high" ? "\u{1F7E2}" : gap.confidence === "medium" ? "\u{1F7E1}" : "\u{1F534}";
4449
4798
  const bg = rowBackground(index);
4450
- return /* @__PURE__ */ jsxs23(React3.Fragment, { children: [
4451
- /* @__PURE__ */ jsx28(
4799
+ return /* @__PURE__ */ jsxs25(React3.Fragment, { children: [
4800
+ /* @__PURE__ */ jsx30(
4452
4801
  "div",
4453
4802
  {
4454
4803
  style: {
@@ -4458,10 +4807,10 @@ function RecommendationRow({
4458
4807
  display: "flex",
4459
4808
  padding: "8px 4px"
4460
4809
  },
4461
- children: /* @__PURE__ */ jsx28(Text23, { muted: true, size: 1, children: index + 1 })
4810
+ children: /* @__PURE__ */ jsx30(Text25, { muted: true, size: 1, children: index + 1 })
4462
4811
  }
4463
4812
  ),
4464
- /* @__PURE__ */ jsx28(
4813
+ /* @__PURE__ */ jsx30(
4465
4814
  "div",
4466
4815
  {
4467
4816
  style: {
@@ -4470,10 +4819,10 @@ function RecommendationRow({
4470
4819
  display: "flex",
4471
4820
  padding: "8px 0"
4472
4821
  },
4473
- children: /* @__PURE__ */ jsx28(Text23, { size: 1, weight: "medium", children: gap.area })
4822
+ children: /* @__PURE__ */ jsx30(Text25, { size: 1, weight: "medium", children: gap.area })
4474
4823
  }
4475
4824
  ),
4476
- /* @__PURE__ */ jsx28(
4825
+ /* @__PURE__ */ jsx30(
4477
4826
  "div",
4478
4827
  {
4479
4828
  style: {
@@ -4482,7 +4831,7 @@ function RecommendationRow({
4482
4831
  display: "flex",
4483
4832
  padding: "8px 0"
4484
4833
  },
4485
- children: /* @__PURE__ */ jsx28(
4834
+ children: /* @__PURE__ */ jsx30(
4486
4835
  Badge14,
4487
4836
  {
4488
4837
  tone: gap.failureMode === "missing-docs" ? "critical" : gap.failureMode === "incorrect-docs" ? "critical" : gap.failureMode === "outdated-docs" ? "caution" : "default",
@@ -4491,7 +4840,7 @@ function RecommendationRow({
4491
4840
  )
4492
4841
  }
4493
4842
  ),
4494
- /* @__PURE__ */ jsx28(
4843
+ /* @__PURE__ */ jsx30(
4495
4844
  "div",
4496
4845
  {
4497
4846
  style: {
@@ -4500,10 +4849,10 @@ function RecommendationRow({
4500
4849
  display: "flex",
4501
4850
  padding: "8px 0"
4502
4851
  },
4503
- children: /* @__PURE__ */ jsx28(Text23, { muted: true, size: 1, children: gap.remediation })
4852
+ children: /* @__PURE__ */ jsx30(Text25, { muted: true, size: 1, children: gap.remediation })
4504
4853
  }
4505
4854
  ),
4506
- /* @__PURE__ */ jsx28(
4855
+ /* @__PURE__ */ jsx30(
4507
4856
  "div",
4508
4857
  {
4509
4858
  style: {
@@ -4512,13 +4861,13 @@ function RecommendationRow({
4512
4861
  display: "flex",
4513
4862
  padding: "8px 0"
4514
4863
  },
4515
- children: /* @__PURE__ */ jsx28(Card16, { padding: 2, radius: 2, tone: "positive", children: /* @__PURE__ */ jsxs23(Text23, { align: "center", size: 1, weight: "medium", children: [
4864
+ children: /* @__PURE__ */ jsx30(Card18, { padding: 2, radius: 2, tone: "positive", children: /* @__PURE__ */ jsxs25(Text25, { align: "center", size: 1, weight: "medium", children: [
4516
4865
  "+",
4517
4866
  gap.estimatedLift.toFixed(1)
4518
4867
  ] }) })
4519
4868
  }
4520
4869
  ),
4521
- /* @__PURE__ */ jsx28(
4870
+ /* @__PURE__ */ jsx30(
4522
4871
  "div",
4523
4872
  {
4524
4873
  style: {
@@ -4527,7 +4876,7 @@ function RecommendationRow({
4527
4876
  display: "flex",
4528
4877
  padding: "8px 0"
4529
4878
  },
4530
- children: /* @__PURE__ */ jsxs23(Text23, { size: 1, children: [
4879
+ children: /* @__PURE__ */ jsxs25(Text25, { size: 1, children: [
4531
4880
  confIcon,
4532
4881
  " ",
4533
4882
  gap.confidence
@@ -4541,15 +4890,15 @@ function RecommendationRow({
4541
4890
  import { ArrowLeftIcon, ClipboardIcon } from "@sanity/icons";
4542
4891
  import {
4543
4892
  Badge as Badge15,
4544
- Box as Box11,
4893
+ Box as Box13,
4545
4894
  Button as Button2,
4546
- Card as Card17,
4547
- Flex as Flex17,
4548
- Stack as Stack17,
4549
- Text as Text24,
4895
+ Card as Card19,
4896
+ Flex as Flex19,
4897
+ Stack as Stack19,
4898
+ Text as Text26,
4550
4899
  Tooltip as Tooltip7
4551
4900
  } from "@sanity/ui";
4552
- import { Fragment as Fragment4, jsx as jsx29, jsxs as jsxs24 } from "react/jsx-runtime";
4901
+ import { Fragment as Fragment6, jsx as jsx31, jsxs as jsxs26 } from "react/jsx-runtime";
4553
4902
  function ReportHeader({
4554
4903
  completedAt,
4555
4904
  mode,
@@ -4562,9 +4911,9 @@ function ReportHeader({
4562
4911
  const dateLabel = formatCardDate(completedAt);
4563
4912
  const title = tag ?? dateLabel;
4564
4913
  const hasTag = Boolean(tag);
4565
- return /* @__PURE__ */ jsxs24(Fragment4, { children: [
4566
- /* @__PURE__ */ jsxs24(Flex17, { align: "center", gap: 3, children: [
4567
- /* @__PURE__ */ jsx29(
4914
+ return /* @__PURE__ */ jsxs26(Fragment6, { children: [
4915
+ /* @__PURE__ */ jsxs26(Flex19, { align: "center", gap: 3, children: [
4916
+ /* @__PURE__ */ jsx31(
4568
4917
  Button2,
4569
4918
  {
4570
4919
  icon: ArrowLeftIcon,
@@ -4573,23 +4922,23 @@ function ReportHeader({
4573
4922
  text: "Back"
4574
4923
  }
4575
4924
  ),
4576
- /* @__PURE__ */ jsxs24(Stack17, { flex: 1, space: 1, children: [
4577
- /* @__PURE__ */ jsx29(Text24, { size: 3, weight: "bold", children: title }),
4578
- hasTag && /* @__PURE__ */ jsx29(Text24, { muted: true, size: 1, children: dateLabel })
4925
+ /* @__PURE__ */ jsxs26(Stack19, { flex: 1, space: 1, children: [
4926
+ /* @__PURE__ */ jsx31(Text26, { size: 3, weight: "bold", children: title }),
4927
+ hasTag && /* @__PURE__ */ jsx31(Text26, { muted: true, size: 1, children: dateLabel })
4579
4928
  ] }),
4580
- /* @__PURE__ */ jsxs24(Flex17, { gap: 2, children: [
4581
- /* @__PURE__ */ jsx29(Badge15, { mode: "outline", tone: "default", children: sourceName }),
4582
- /* @__PURE__ */ jsx29(Badge15, { tone: "primary", children: mode })
4929
+ /* @__PURE__ */ jsxs26(Flex19, { gap: 2, children: [
4930
+ /* @__PURE__ */ jsx31(Badge15, { mode: "outline", tone: "default", children: sourceName }),
4931
+ /* @__PURE__ */ jsx31(Badge15, { tone: "primary", children: mode })
4583
4932
  ] })
4584
4933
  ] }),
4585
- /* @__PURE__ */ jsx29(
4934
+ /* @__PURE__ */ jsx31(
4586
4935
  Tooltip7,
4587
4936
  {
4588
- content: /* @__PURE__ */ jsx29(Box11, { padding: 2, children: /* @__PURE__ */ jsx29(Text24, { size: 1, children: "Click to copy report ID" }) }),
4937
+ content: /* @__PURE__ */ jsx31(Box13, { padding: 2, children: /* @__PURE__ */ jsx31(Text26, { size: 1, children: "Click to copy report ID" }) }),
4589
4938
  placement: "bottom",
4590
4939
  portal: true,
4591
- children: /* @__PURE__ */ jsx29(
4592
- Card17,
4940
+ children: /* @__PURE__ */ jsx31(
4941
+ Card19,
4593
4942
  {
4594
4943
  border: true,
4595
4944
  onClick: onCopyId,
@@ -4597,9 +4946,9 @@ function ReportHeader({
4597
4946
  radius: 2,
4598
4947
  style: { cursor: "pointer" },
4599
4948
  tone: "transparent",
4600
- children: /* @__PURE__ */ jsxs24(Flex17, { align: "center", gap: 3, children: [
4601
- /* @__PURE__ */ jsx29(
4602
- Text24,
4949
+ children: /* @__PURE__ */ jsxs26(Flex19, { align: "center", gap: 3, children: [
4950
+ /* @__PURE__ */ jsx31(
4951
+ Text26,
4603
4952
  {
4604
4953
  muted: true,
4605
4954
  size: 0,
@@ -4611,8 +4960,8 @@ function ReportHeader({
4611
4960
  children: "Report ID"
4612
4961
  }
4613
4962
  ),
4614
- /* @__PURE__ */ jsx29(
4615
- Text24,
4963
+ /* @__PURE__ */ jsx31(
4964
+ Text26,
4616
4965
  {
4617
4966
  size: 1,
4618
4967
  style: {
@@ -4622,7 +4971,7 @@ function ReportHeader({
4622
4971
  children: reportId
4623
4972
  }
4624
4973
  ),
4625
- /* @__PURE__ */ jsx29(Box11, { style: { marginLeft: "auto" }, children: /* @__PURE__ */ jsx29(Text24, { muted: true, size: 1, children: /* @__PURE__ */ jsx29(ClipboardIcon, {}) }) })
4974
+ /* @__PURE__ */ jsx31(Box13, { style: { marginLeft: "auto" }, children: /* @__PURE__ */ jsx31(Text26, { muted: true, size: 1, children: /* @__PURE__ */ jsx31(ClipboardIcon, {}) }) })
4626
4975
  ] })
4627
4976
  }
4628
4977
  )
@@ -4633,18 +4982,18 @@ function ReportHeader({
4633
4982
 
4634
4983
  // src/components/report-detail/ThreeLayerTable.tsx
4635
4984
  import React4 from "react";
4636
- import { Badge as Badge16, Card as Card18, Flex as Flex18, Stack as Stack18, Text as Text25 } from "@sanity/ui";
4637
- import { jsx as jsx30, jsxs as jsxs25 } from "react/jsx-runtime";
4985
+ import { Badge as Badge16, Card as Card20, Flex as Flex20, Stack as Stack20, Text as Text27 } from "@sanity/ui";
4986
+ import { jsx as jsx32, jsxs as jsxs27 } from "react/jsx-runtime";
4638
4987
  function ThreeLayerTable({ scores }) {
4639
4988
  const filtered = scores.filter((s) => s.actualScore != null);
4640
4989
  if (filtered.length === 0) return null;
4641
4990
  const hasInverted = filtered.some((s) => s.invertedRetrievalGap);
4642
- return /* @__PURE__ */ jsx30(Card18, { overflow: "auto", padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs25(Stack18, { space: 4, children: [
4643
- /* @__PURE__ */ jsxs25(Flex18, { align: "center", gap: 3, children: [
4644
- /* @__PURE__ */ jsx30(Text25, { size: 2, weight: "semibold", children: "Three-Layer Decomposition" }),
4645
- /* @__PURE__ */ jsx30(Badge16, { tone: "primary", children: "full mode" })
4991
+ return /* @__PURE__ */ jsx32(Card20, { overflow: "auto", padding: 4, radius: 2, shadow: 1, children: /* @__PURE__ */ jsxs27(Stack20, { space: 4, children: [
4992
+ /* @__PURE__ */ jsxs27(Flex20, { align: "center", gap: 3, children: [
4993
+ /* @__PURE__ */ jsx32(Text27, { size: 2, weight: "semibold", children: "Three-Layer Decomposition" }),
4994
+ /* @__PURE__ */ jsx32(Badge16, { tone: "primary", children: "full mode" })
4646
4995
  ] }),
4647
- /* @__PURE__ */ jsxs25(
4996
+ /* @__PURE__ */ jsxs27(
4648
4997
  "div",
4649
4998
  {
4650
4999
  style: {
@@ -4653,9 +5002,9 @@ function ThreeLayerTable({ scores }) {
4653
5002
  gridTemplateColumns: "2fr 1fr 1fr 1fr 1fr 1fr"
4654
5003
  },
4655
5004
  children: [
4656
- /* @__PURE__ */ jsx30(ColumnHeader, { borderBottom: true, label: "Area" }),
4657
- /* @__PURE__ */ jsx30(ColumnHeader, { borderBottom: true, label: "Floor", tooltip: GLOSSARY.floor }),
4658
- /* @__PURE__ */ jsx30(
5005
+ /* @__PURE__ */ jsx32(ColumnHeader, { borderBottom: true, label: "Area" }),
5006
+ /* @__PURE__ */ jsx32(ColumnHeader, { borderBottom: true, label: "Floor", tooltip: GLOSSARY.floor }),
5007
+ /* @__PURE__ */ jsx32(
4659
5008
  ColumnHeader,
4660
5009
  {
4661
5010
  borderBottom: true,
@@ -4663,8 +5012,8 @@ function ThreeLayerTable({ scores }) {
4663
5012
  tooltip: GLOSSARY.ceiling
4664
5013
  }
4665
5014
  ),
4666
- /* @__PURE__ */ jsx30(ColumnHeader, { borderBottom: true, label: "Actual", tooltip: GLOSSARY.actual }),
4667
- /* @__PURE__ */ jsx30(
5015
+ /* @__PURE__ */ jsx32(ColumnHeader, { borderBottom: true, label: "Actual", tooltip: GLOSSARY.actual }),
5016
+ /* @__PURE__ */ jsx32(
4668
5017
  ColumnHeader,
4669
5018
  {
4670
5019
  borderBottom: true,
@@ -4672,7 +5021,7 @@ function ThreeLayerTable({ scores }) {
4672
5021
  tooltip: GLOSSARY.retGap
4673
5022
  }
4674
5023
  ),
4675
- /* @__PURE__ */ jsx30(
5024
+ /* @__PURE__ */ jsx32(
4676
5025
  ColumnHeader,
4677
5026
  {
4678
5027
  borderBottom: true,
@@ -4680,8 +5029,8 @@ function ThreeLayerTable({ scores }) {
4680
5029
  tooltip: GLOSSARY.efficiency
4681
5030
  }
4682
5031
  ),
4683
- filtered.map((score, i) => /* @__PURE__ */ jsxs25(React4.Fragment, { children: [
4684
- /* @__PURE__ */ jsx30(
5032
+ filtered.map((score, i) => /* @__PURE__ */ jsxs27(React4.Fragment, { children: [
5033
+ /* @__PURE__ */ jsx32(
4685
5034
  "div",
4686
5035
  {
4687
5036
  style: {
@@ -4689,13 +5038,13 @@ function ThreeLayerTable({ scores }) {
4689
5038
  borderRadius: 4,
4690
5039
  padding: "8px 0 8px 4px"
4691
5040
  },
4692
- children: /* @__PURE__ */ jsx30(Text25, { size: 1, weight: "medium", children: score.feature })
5041
+ children: /* @__PURE__ */ jsx32(Text27, { size: 1, weight: "medium", children: score.feature })
4693
5042
  }
4694
5043
  ),
4695
- /* @__PURE__ */ jsx30("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx30(ScoreCell, { score: score.floorScore ?? 0 }) }),
4696
- /* @__PURE__ */ jsx30("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx30(ScoreCell, { score: score.ceilingScore ?? score.totalScore }) }),
4697
- /* @__PURE__ */ jsx30("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx30(ScoreCell, { score: score.actualScore ?? 0 }) }),
4698
- /* @__PURE__ */ jsx30(
5044
+ /* @__PURE__ */ jsx32("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx32(ScoreCell, { score: score.floorScore ?? 0 }) }),
5045
+ /* @__PURE__ */ jsx32("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx32(ScoreCell, { score: score.ceilingScore ?? score.totalScore }) }),
5046
+ /* @__PURE__ */ jsx32("div", { style: { background: rowBackground(i), padding: "6px 0" }, children: /* @__PURE__ */ jsx32(ScoreCell, { score: score.actualScore ?? 0 }) }),
5047
+ /* @__PURE__ */ jsx32(
4699
5048
  "div",
4700
5049
  {
4701
5050
  style: {
@@ -4704,10 +5053,10 @@ function ThreeLayerTable({ scores }) {
4704
5053
  display: "flex",
4705
5054
  padding: "6px 0"
4706
5055
  },
4707
- children: /* @__PURE__ */ jsx30(Text25, { size: 1, children: score.retrievalGap != null ? score.retrievalGap.toFixed(1) : "\u2014" })
5056
+ children: /* @__PURE__ */ jsx32(Text27, { size: 1, children: score.retrievalGap != null ? score.retrievalGap.toFixed(1) : "\u2014" })
4708
5057
  }
4709
5058
  ),
4710
- /* @__PURE__ */ jsx30(
5059
+ /* @__PURE__ */ jsx32(
4711
5060
  "div",
4712
5061
  {
4713
5062
  style: {
@@ -4716,7 +5065,7 @@ function ThreeLayerTable({ scores }) {
4716
5065
  display: "flex",
4717
5066
  padding: "6px 0"
4718
5067
  },
4719
- children: /* @__PURE__ */ jsxs25(Text25, { size: 1, children: [
5068
+ children: /* @__PURE__ */ jsxs27(Text27, { size: 1, children: [
4720
5069
  formatPercent(score.infrastructureEfficiency),
4721
5070
  score.invertedRetrievalGap && " \u26A0\uFE0F"
4722
5071
  ] })
@@ -4726,12 +5075,12 @@ function ThreeLayerTable({ scores }) {
4726
5075
  ]
4727
5076
  }
4728
5077
  ),
4729
- hasInverted && /* @__PURE__ */ jsx30(Text25, { muted: true, size: 0, children: GLOSSARY.invertedRetGap })
5078
+ hasInverted && /* @__PURE__ */ jsx32(Text27, { muted: true, size: 0, children: GLOSSARY.invertedRetGap })
4730
5079
  ] }) });
4731
5080
  }
4732
5081
 
4733
5082
  // src/components/report-detail/ReportDetail.tsx
4734
- import { jsx as jsx31, jsxs as jsxs26 } from "react/jsx-runtime";
5083
+ import { jsx as jsx33, jsxs as jsxs28 } from "react/jsx-runtime";
4735
5084
  function ReportDetail({ onBack, reportId }) {
4736
5085
  const client = useClient6({ apiVersion: API_VERSION });
4737
5086
  const toast = useToast();
@@ -4752,7 +5101,7 @@ function ReportDetail({ onBack, reportId }) {
4752
5101
  cancelled = true;
4753
5102
  };
4754
5103
  }, [client, reportId]);
4755
- const handleCopyReportId = useCallback9(() => {
5104
+ const handleCopyReportId = useCallback11(() => {
4756
5105
  if (!report) return;
4757
5106
  navigator.clipboard.writeText(report.reportId).then(() => {
4758
5107
  toast.push({
@@ -4769,11 +5118,11 @@ function ReportDetail({ onBack, reportId }) {
4769
5118
  });
4770
5119
  }, [report, toast]);
4771
5120
  if (loading) {
4772
- return /* @__PURE__ */ jsx31(LoadingState, { message: "Loading report\u2026" });
5121
+ return /* @__PURE__ */ jsx33(LoadingState, { message: "Loading report\u2026" });
4773
5122
  }
4774
5123
  if (!report) {
4775
- return /* @__PURE__ */ jsx31(Box12, { padding: 5, children: /* @__PURE__ */ jsxs26(Stack19, { space: 4, children: [
4776
- /* @__PURE__ */ jsx31(
5124
+ return /* @__PURE__ */ jsx33(Box14, { padding: 5, children: /* @__PURE__ */ jsxs28(Stack21, { space: 4, children: [
5125
+ /* @__PURE__ */ jsx33(
4777
5126
  Button3,
4778
5127
  {
4779
5128
  icon: ArrowLeftIcon2,
@@ -4782,14 +5131,14 @@ function ReportDetail({ onBack, reportId }) {
4782
5131
  text: "Back"
4783
5132
  }
4784
5133
  ),
4785
- /* @__PURE__ */ jsx31(Text26, { align: "center", muted: true, size: 2, children: "Report not found" })
5134
+ /* @__PURE__ */ jsx33(Text28, { align: "center", muted: true, size: 2, children: "Report not found" })
4786
5135
  ] }) });
4787
5136
  }
4788
5137
  const { comparison, provenance, summary } = report;
4789
5138
  const totalTests = summary.scores.reduce((n, s) => n + s.testCount, 0);
4790
5139
  const isFullMode = summary.evaluationMode === "full" || summary.scores.some((s) => s.actualScore != null);
4791
- return /* @__PURE__ */ jsx31(Box12, { padding: 4, children: /* @__PURE__ */ jsxs26(Stack19, { space: 5, children: [
4792
- /* @__PURE__ */ jsx31(
5140
+ return /* @__PURE__ */ jsx33(Box14, { padding: 4, children: /* @__PURE__ */ jsxs28(Stack21, { space: 5, children: [
5141
+ /* @__PURE__ */ jsx33(
4793
5142
  ReportHeader,
4794
5143
  {
4795
5144
  completedAt: report.completedAt,
@@ -4801,7 +5150,7 @@ function ReportDetail({ onBack, reportId }) {
4801
5150
  tag: report.tag
4802
5151
  }
4803
5152
  ),
4804
- /* @__PURE__ */ jsx31(
5153
+ /* @__PURE__ */ jsx33(
4805
5154
  OverviewStats,
4806
5155
  {
4807
5156
  durationMs: report.durationMs,
@@ -4810,20 +5159,20 @@ function ReportDetail({ onBack, reportId }) {
4810
5159
  totalTests
4811
5160
  }
4812
5161
  ),
4813
- isFullMode && /* @__PURE__ */ jsx31(ThreeLayerTable, { scores: summary.scores }),
4814
- /* @__PURE__ */ jsx31(AreaScoreTable, { scores: summary.scores }),
4815
- summary.recommendations && summary.recommendations.gaps.length > 0 && /* @__PURE__ */ jsx31(RecommendationsSection, { recommendations: summary.recommendations }),
4816
- summary.lowScoringJudgments && summary.lowScoringJudgments.length > 0 && /* @__PURE__ */ jsx31(JudgmentList, { judgments: summary.lowScoringJudgments }),
4817
- comparison && /* @__PURE__ */ jsx31(ComparisonSummary, { comparison }),
4818
- /* @__PURE__ */ jsx31(ProvenanceCard, { provenance })
5162
+ isFullMode && /* @__PURE__ */ jsx33(ThreeLayerTable, { scores: summary.scores }),
5163
+ /* @__PURE__ */ jsx33(AreaScoreTable, { scores: summary.scores }),
5164
+ summary.recommendations && summary.recommendations.gaps.length > 0 && /* @__PURE__ */ jsx33(RecommendationsSection, { recommendations: summary.recommendations }),
5165
+ summary.lowScoringJudgments && summary.lowScoringJudgments.length > 0 && /* @__PURE__ */ jsx33(JudgmentList, { judgments: summary.lowScoringJudgments }),
5166
+ comparison && /* @__PURE__ */ jsx33(ComparisonSummary, { comparison }),
5167
+ /* @__PURE__ */ jsx33(ProvenanceCard, { provenance })
4819
5168
  ] }) });
4820
5169
  }
4821
5170
 
4822
5171
  // src/components/ScoreTimeline.tsx
4823
- import { Card as Card19, Flex as Flex19, Select as Select2, Stack as Stack20, Text as Text27 } from "@sanity/ui";
4824
- import { useCallback as useCallback10, useEffect as useEffect7, useMemo as useMemo4, useState as useState9 } from "react";
5172
+ import { Card as Card21, Flex as Flex21, Select as Select2, Stack as Stack22, Text as Text29 } from "@sanity/ui";
5173
+ import { useCallback as useCallback12, useEffect as useEffect7, useMemo as useMemo4, useState as useState9 } from "react";
4825
5174
  import { useClient as useClient7 } from "sanity";
4826
- import { jsx as jsx32, jsxs as jsxs27 } from "react/jsx-runtime";
5175
+ import { jsx as jsx34, jsxs as jsxs29 } from "react/jsx-runtime";
4827
5176
  var CHART_HEIGHT = 220;
4828
5177
  var CHART_WIDTH = 800;
4829
5178
  var PAD_BOTTOM = 30;
@@ -4871,7 +5220,7 @@ function ScoreTimeline({ mode = null, source = null }) {
4871
5220
  }
4872
5221
  return Array.from(names).sort();
4873
5222
  }, [dataPoints]);
4874
- const fetchData = useCallback10(async () => {
5223
+ const fetchData = useCallback12(async () => {
4875
5224
  setLoading(true);
4876
5225
  try {
4877
5226
  const startDate = rangeDays ? daysAgo(rangeDays) : "1970-01-01T00:00:00Z";
@@ -4907,14 +5256,14 @@ function ScoreTimeline({ mode = null, source = null }) {
4907
5256
  if (chartPoints.length === 0) return 0;
4908
5257
  return chartPoints.reduce((sum, p) => sum + p.score, 0) / chartPoints.length;
4909
5258
  }, [chartPoints]);
4910
- const handleRangeChange = useCallback10(
5259
+ const handleRangeChange = useCallback12(
4911
5260
  (e) => {
4912
5261
  const val = e.currentTarget.value;
4913
5262
  setRangeDays(val === "all" ? null : Number(val));
4914
5263
  },
4915
5264
  []
4916
5265
  );
4917
- const handleAreaChange = useCallback10(
5266
+ const handleAreaChange = useCallback12(
4918
5267
  (e) => {
4919
5268
  const val = e.currentTarget.value;
4920
5269
  setSelectedArea(val || null);
@@ -4922,22 +5271,22 @@ function ScoreTimeline({ mode = null, source = null }) {
4922
5271
  []
4923
5272
  );
4924
5273
  const polylinePoints = chartPoints.map((p) => `${p.x},${p.y}`).join(" ");
4925
- return /* @__PURE__ */ jsxs27(Stack20, { space: 4, children: [
4926
- /* @__PURE__ */ jsxs27(Flex19, { gap: 3, children: [
4927
- /* @__PURE__ */ jsx32(
5274
+ return /* @__PURE__ */ jsxs29(Stack22, { space: 4, children: [
5275
+ /* @__PURE__ */ jsxs29(Flex21, { gap: 3, children: [
5276
+ /* @__PURE__ */ jsx34(
4928
5277
  Select2,
4929
5278
  {
4930
5279
  onChange: handleRangeChange,
4931
5280
  value: rangeDays?.toString() ?? "all",
4932
- children: TIME_RANGES.map((r) => /* @__PURE__ */ jsx32("option", { value: r.days?.toString() ?? "all", children: r.label }, r.label))
5281
+ children: TIME_RANGES.map((r) => /* @__PURE__ */ jsx34("option", { value: r.days?.toString() ?? "all", children: r.label }, r.label))
4933
5282
  }
4934
5283
  ),
4935
- /* @__PURE__ */ jsxs27(Select2, { onChange: handleAreaChange, value: selectedArea ?? "", children: [
4936
- /* @__PURE__ */ jsx32("option", { value: "", children: "Overall" }),
4937
- areaNames.map((name) => /* @__PURE__ */ jsx32("option", { value: name, children: name }, name))
5284
+ /* @__PURE__ */ jsxs29(Select2, { onChange: handleAreaChange, value: selectedArea ?? "", children: [
5285
+ /* @__PURE__ */ jsx34("option", { value: "", children: "Overall" }),
5286
+ areaNames.map((name) => /* @__PURE__ */ jsx34("option", { value: name, children: name }, name))
4938
5287
  ] })
4939
5288
  ] }),
4940
- /* @__PURE__ */ jsx32(Card19, { padding: 3, radius: 2, shadow: 1, children: loading ? /* @__PURE__ */ jsx32(Flex19, { align: "center", justify: "center", style: { height: 200 }, children: /* @__PURE__ */ jsx32(Text27, { muted: true, size: 1, children: "Loading\u2026" }) }) : chartPoints.length === 0 ? /* @__PURE__ */ jsx32(Flex19, { align: "center", justify: "center", style: { height: 200 }, children: /* @__PURE__ */ jsx32(Text27, { muted: true, size: 1, children: "No reports found for this time range" }) }) : /* @__PURE__ */ jsxs27(
5289
+ /* @__PURE__ */ jsx34(Card21, { padding: 3, radius: 2, shadow: 1, children: loading ? /* @__PURE__ */ jsx34(Flex21, { align: "center", justify: "center", style: { height: 200 }, children: /* @__PURE__ */ jsx34(Text29, { muted: true, size: 1, children: "Loading\u2026" }) }) : chartPoints.length === 0 ? /* @__PURE__ */ jsx34(Flex21, { align: "center", justify: "center", style: { height: 200 }, children: /* @__PURE__ */ jsx34(Text29, { muted: true, size: 1, children: "No reports found for this time range" }) }) : /* @__PURE__ */ jsxs29(
4941
5290
  "svg",
4942
5291
  {
4943
5292
  style: { display: "block", width: "100%" },
@@ -4945,8 +5294,8 @@ function ScoreTimeline({ mode = null, source = null }) {
4945
5294
  children: [
4946
5295
  Y_TICKS.map((tick) => {
4947
5296
  const y = PAD_TOP + PLOT_HEIGHT - tick / Y_MAX * PLOT_HEIGHT;
4948
- return /* @__PURE__ */ jsxs27("g", { children: [
4949
- /* @__PURE__ */ jsx32(
5297
+ return /* @__PURE__ */ jsxs29("g", { children: [
5298
+ /* @__PURE__ */ jsx34(
4950
5299
  "line",
4951
5300
  {
4952
5301
  stroke: "#ccc",
@@ -4957,7 +5306,7 @@ function ScoreTimeline({ mode = null, source = null }) {
4957
5306
  y2: y
4958
5307
  }
4959
5308
  ),
4960
- /* @__PURE__ */ jsx32(
5309
+ /* @__PURE__ */ jsx34(
4961
5310
  "text",
4962
5311
  {
4963
5312
  dominantBaseline: "middle",
@@ -4977,7 +5326,7 @@ function ScoreTimeline({ mode = null, source = null }) {
4977
5326
  chartPoints.length - 1
4978
5327
  ].map((idx) => {
4979
5328
  const p = chartPoints[idx];
4980
- return /* @__PURE__ */ jsx32(
5329
+ return /* @__PURE__ */ jsx34(
4981
5330
  "text",
4982
5331
  {
4983
5332
  fill: "#999",
@@ -4989,7 +5338,7 @@ function ScoreTimeline({ mode = null, source = null }) {
4989
5338
  },
4990
5339
  idx
4991
5340
  );
4992
- }) : chartPoints.map((p, idx) => /* @__PURE__ */ jsx32(
5341
+ }) : chartPoints.map((p, idx) => /* @__PURE__ */ jsx34(
4993
5342
  "text",
4994
5343
  {
4995
5344
  fill: "#999",
@@ -5001,7 +5350,7 @@ function ScoreTimeline({ mode = null, source = null }) {
5001
5350
  },
5002
5351
  idx
5003
5352
  )),
5004
- /* @__PURE__ */ jsx32(
5353
+ /* @__PURE__ */ jsx34(
5005
5354
  "polyline",
5006
5355
  {
5007
5356
  fill: "none",
@@ -5011,7 +5360,7 @@ function ScoreTimeline({ mode = null, source = null }) {
5011
5360
  strokeWidth: 2.5
5012
5361
  }
5013
5362
  ),
5014
- chartPoints.map((p, idx) => /* @__PURE__ */ jsx32(
5363
+ chartPoints.map((p, idx) => /* @__PURE__ */ jsx34(
5015
5364
  "circle",
5016
5365
  {
5017
5366
  cx: p.x,
@@ -5020,7 +5369,7 @@ function ScoreTimeline({ mode = null, source = null }) {
5020
5369
  r: 4,
5021
5370
  stroke: "#fff",
5022
5371
  strokeWidth: 1.5,
5023
- children: /* @__PURE__ */ jsxs27("title", { children: [
5372
+ children: /* @__PURE__ */ jsxs29("title", { children: [
5024
5373
  formatDate2(p.date),
5025
5374
  ": ",
5026
5375
  Math.round(p.score)
@@ -5031,7 +5380,7 @@ function ScoreTimeline({ mode = null, source = null }) {
5031
5380
  ]
5032
5381
  }
5033
5382
  ) }),
5034
- /* @__PURE__ */ jsxs27(Text27, { muted: true, size: 1, children: [
5383
+ /* @__PURE__ */ jsxs29(Text29, { muted: true, size: 1, children: [
5035
5384
  chartPoints.length,
5036
5385
  " data point",
5037
5386
  chartPoints.length !== 1 ? "s" : ""
@@ -5041,7 +5390,7 @@ function ScoreTimeline({ mode = null, source = null }) {
5041
5390
  var ScoreTimeline_default = ScoreTimeline;
5042
5391
 
5043
5392
  // src/components/Dashboard.tsx
5044
- import { jsx as jsx33, jsxs as jsxs28 } from "react/jsx-runtime";
5393
+ import { jsx as jsx35, jsxs as jsxs30 } from "react/jsx-runtime";
5045
5394
  var VIEW_PARAM_MAP = {
5046
5395
  compare: "compare",
5047
5396
  timeline: "timeline"
@@ -5053,7 +5402,7 @@ function Dashboard() {
5053
5402
  const reportId = routerState.reportId ?? null;
5054
5403
  const isDetail = reportId !== null;
5055
5404
  const activeTab = isDetail ? "latest" : VIEW_PARAM_MAP[routerState.view ?? ""] ?? "latest";
5056
- const navigateToTab = useCallback11(
5405
+ const navigateToTab = useCallback13(
5057
5406
  (tab) => {
5058
5407
  if (tab === "latest") {
5059
5408
  router.navigate({});
@@ -5063,13 +5412,13 @@ function Dashboard() {
5063
5412
  },
5064
5413
  [router]
5065
5414
  );
5066
- const handleSelectReport = useCallback11(
5415
+ const handleSelectReport = useCallback13(
5067
5416
  (id) => {
5068
5417
  router.navigate({ reportId: id });
5069
5418
  },
5070
5419
  [router]
5071
5420
  );
5072
- const handleBack = useCallback11(() => {
5421
+ const handleBack = useCallback13(() => {
5073
5422
  router.navigate({});
5074
5423
  }, [router]);
5075
5424
  const [source, setSource] = useState10(null);
@@ -5080,41 +5429,41 @@ function Dashboard() {
5080
5429
  client.fetch(distinctSourcesQuery).then((data) => setSources(data ?? [])).catch(() => setSources([]));
5081
5430
  client.fetch(distinctModesQuery).then((data) => setModes(data ?? [])).catch(() => setModes([]));
5082
5431
  }, [client]);
5083
- return /* @__PURE__ */ jsx33(Container, { width: 2, children: /* @__PURE__ */ jsxs28(Stack21, { padding: 4, space: 4, children: [
5084
- /* @__PURE__ */ jsxs28(Flex20, { align: "center", gap: 3, children: [
5085
- /* @__PURE__ */ jsxs28(Stack21, { flex: 1, space: 1, children: [
5086
- /* @__PURE__ */ jsx33(Text28, { size: 3, weight: "bold", children: "AI Literacy" }),
5087
- /* @__PURE__ */ jsx33(Text28, { muted: true, size: 1, children: "Evaluation reports and score trending" })
5432
+ return /* @__PURE__ */ jsx35(Container, { width: 2, children: /* @__PURE__ */ jsxs30(Stack23, { padding: 4, space: 4, children: [
5433
+ /* @__PURE__ */ jsxs30(Flex22, { align: "center", gap: 3, children: [
5434
+ /* @__PURE__ */ jsxs30(Stack23, { flex: 1, space: 1, children: [
5435
+ /* @__PURE__ */ jsx35(Text30, { size: 3, weight: "bold", children: "AI Literacy" }),
5436
+ /* @__PURE__ */ jsx35(Text30, { muted: true, size: 1, children: "Evaluation reports and score trends" })
5088
5437
  ] }),
5089
- !isDetail && /* @__PURE__ */ jsxs28(Flex20, { gap: 2, children: [
5090
- /* @__PURE__ */ jsxs28(
5438
+ !isDetail && /* @__PURE__ */ jsxs30(Flex22, { gap: 2, children: [
5439
+ /* @__PURE__ */ jsxs30(
5091
5440
  Select3,
5092
5441
  {
5093
5442
  fontSize: 1,
5094
5443
  onChange: (e) => setSource(e.currentTarget.value || null),
5095
5444
  value: source ?? "",
5096
5445
  children: [
5097
- /* @__PURE__ */ jsx33("option", { value: "", children: "All sources" }),
5098
- sources.map((s) => /* @__PURE__ */ jsx33("option", { value: s, children: s }, s))
5446
+ /* @__PURE__ */ jsx35("option", { value: "", children: "All sources" }),
5447
+ sources.map((s) => /* @__PURE__ */ jsx35("option", { value: s, children: s }, s))
5099
5448
  ]
5100
5449
  }
5101
5450
  ),
5102
- /* @__PURE__ */ jsxs28(
5451
+ /* @__PURE__ */ jsxs30(
5103
5452
  Select3,
5104
5453
  {
5105
5454
  fontSize: 1,
5106
5455
  onChange: (e) => setMode(e.currentTarget.value || null),
5107
5456
  value: mode ?? "",
5108
5457
  children: [
5109
- /* @__PURE__ */ jsx33("option", { value: "", children: "All modes" }),
5110
- modes.map((m) => /* @__PURE__ */ jsx33("option", { value: m, children: m }, m))
5458
+ /* @__PURE__ */ jsx35("option", { value: "", children: "All modes" }),
5459
+ modes.map((m) => /* @__PURE__ */ jsx35("option", { value: m, children: m }, m))
5111
5460
  ]
5112
5461
  }
5113
5462
  )
5114
5463
  ] })
5115
5464
  ] }),
5116
- !isDetail && /* @__PURE__ */ jsxs28(TabList, { space: 1, children: [
5117
- /* @__PURE__ */ jsx33(
5465
+ !isDetail && /* @__PURE__ */ jsxs30(TabList, { space: 1, children: [
5466
+ /* @__PURE__ */ jsx35(
5118
5467
  Tab,
5119
5468
  {
5120
5469
  "aria-controls": "latest-panel",
@@ -5124,7 +5473,7 @@ function Dashboard() {
5124
5473
  selected: activeTab === "latest"
5125
5474
  }
5126
5475
  ),
5127
- /* @__PURE__ */ jsx33(
5476
+ /* @__PURE__ */ jsx35(
5128
5477
  Tab,
5129
5478
  {
5130
5479
  "aria-controls": "timeline-panel",
@@ -5134,7 +5483,7 @@ function Dashboard() {
5134
5483
  selected: activeTab === "timeline"
5135
5484
  }
5136
5485
  ),
5137
- /* @__PURE__ */ jsx33(
5486
+ /* @__PURE__ */ jsx35(
5138
5487
  Tab,
5139
5488
  {
5140
5489
  "aria-controls": "compare-panel",
@@ -5145,7 +5494,7 @@ function Dashboard() {
5145
5494
  }
5146
5495
  )
5147
5496
  ] }),
5148
- !isDetail && activeTab === "latest" && /* @__PURE__ */ jsx33(TabPanel, { "aria-labelledby": "latest-tab", id: "latest-panel", children: /* @__PURE__ */ jsx33(
5497
+ !isDetail && activeTab === "latest" && /* @__PURE__ */ jsx35(TabPanel, { "aria-labelledby": "latest-tab", id: "latest-panel", children: /* @__PURE__ */ jsx35(
5149
5498
  LatestReports,
5150
5499
  {
5151
5500
  mode,
@@ -5153,9 +5502,9 @@ function Dashboard() {
5153
5502
  source
5154
5503
  }
5155
5504
  ) }),
5156
- !isDetail && activeTab === "timeline" && /* @__PURE__ */ jsx33(TabPanel, { "aria-labelledby": "timeline-tab", id: "timeline-panel", children: /* @__PURE__ */ jsx33(ScoreTimeline_default, { mode, source }) }),
5157
- !isDetail && activeTab === "compare" && /* @__PURE__ */ jsx33(TabPanel, { "aria-labelledby": "compare-tab", id: "compare-panel", children: /* @__PURE__ */ jsx33(ComparisonView, {}) }),
5158
- isDetail && reportId && /* @__PURE__ */ jsx33(ReportDetail, { onBack: handleBack, reportId })
5505
+ !isDetail && activeTab === "timeline" && /* @__PURE__ */ jsx35(TabPanel, { "aria-labelledby": "timeline-tab", id: "timeline-panel", children: /* @__PURE__ */ jsx35(ScoreTimeline_default, { mode, source }) }),
5506
+ !isDetail && activeTab === "compare" && /* @__PURE__ */ jsx35(TabPanel, { "aria-labelledby": "compare-tab", id: "compare-panel", children: /* @__PURE__ */ jsx35(ComparisonView, {}) }),
5507
+ isDetail && reportId && /* @__PURE__ */ jsx35(ReportDetail, { onBack: handleBack, reportId })
5159
5508
  ] }) });
5160
5509
  }
5161
5510
 
@@ -5176,7 +5525,7 @@ function ailfTool(options = {}) {
5176
5525
 
5177
5526
  // src/actions/RunEvaluationAction.tsx
5178
5527
  import { BarChartIcon as BarChartIcon2 } from "@sanity/icons";
5179
- import { useCallback as useCallback12, useEffect as useEffect9, useRef as useRef3, useState as useState11 } from "react";
5528
+ import { useCallback as useCallback14, useEffect as useEffect9, useRef as useRef3, useState as useState11 } from "react";
5180
5529
  import {
5181
5530
  getReleaseIdFromReleaseDocumentId as getReleaseIdFromReleaseDocumentId2,
5182
5531
  useClient as useClient9,
@@ -5302,7 +5651,7 @@ function createRunEvaluationAction(options = {}) {
5302
5651
  }, 15e3);
5303
5652
  return () => clearTimeout(timer);
5304
5653
  }, [client, perspectiveId, state]);
5305
- const handleRequest = useCallback12(async () => {
5654
+ const handleRequest = useCallback14(async () => {
5306
5655
  const releaseTitle = release.metadata?.title ?? perspectiveId ?? "release";
5307
5656
  const tag = `release-${slugify(releaseTitle)}-${dateStamp()}`;
5308
5657
  const now = Date.now();
@@ -5424,6 +5773,8 @@ var ailfPlugin = definePlugin({
5424
5773
  tools: [ailfTool()]
5425
5774
  });
5426
5775
  export {
5776
+ AssertionInput,
5777
+ CanonicalDocInput,
5427
5778
  GLOSSARY,
5428
5779
  GraduateToNativeAction,
5429
5780
  MirrorBanner,