@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/README.md +43 -6
- package/dist/index.d.ts +9 -5
- package/dist/index.js +921 -570
- package/package.json +1 -1
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
|
|
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
|
|
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
|
|
1092
|
-
import { jsx as
|
|
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__ */
|
|
1380
|
+
return /* @__PURE__ */ jsx4(
|
|
1117
1381
|
Tooltip,
|
|
1118
1382
|
{
|
|
1119
|
-
content: /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1137
|
-
/* @__PURE__ */
|
|
1138
|
-
/* @__PURE__ */
|
|
1139
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
1415
|
+
) : /* @__PURE__ */ jsx5("strong", { children: repoDisplay }),
|
|
1152
1416
|
". Edit it there to make changes."
|
|
1153
1417
|
] })
|
|
1154
1418
|
] }),
|
|
1155
|
-
/* @__PURE__ */
|
|
1156
|
-
lastSyncedAt && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
1188
|
-
/* @__PURE__ */
|
|
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
|
|
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: "
|
|
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: "
|
|
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({
|
|
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:
|
|
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
|
-
|
|
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
|
|
2181
|
+
Flex as Flex22,
|
|
1833
2182
|
Select as Select3,
|
|
1834
|
-
Stack as
|
|
2183
|
+
Stack as Stack23,
|
|
1835
2184
|
Tab,
|
|
1836
2185
|
TabList,
|
|
1837
2186
|
TabPanel,
|
|
1838
|
-
Text as
|
|
2187
|
+
Text as Text30
|
|
1839
2188
|
} from "@sanity/ui";
|
|
1840
|
-
import { useCallback as
|
|
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
|
|
2086
|
-
import { useCallback as
|
|
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
|
|
2281
|
-
import { jsx as
|
|
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__ */
|
|
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
|
|
2289
|
-
import { jsx as
|
|
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__ */
|
|
2300
|
-
/* @__PURE__ */
|
|
2301
|
-
|
|
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__ */
|
|
2659
|
+
tooltip && /* @__PURE__ */ jsx8(
|
|
2311
2660
|
Tooltip2,
|
|
2312
2661
|
{
|
|
2313
|
-
content: /* @__PURE__ */
|
|
2662
|
+
content: /* @__PURE__ */ jsx8(Box5, { padding: 2, children: /* @__PURE__ */ jsx8(Text7, { size: 1, children: tooltip }) }),
|
|
2314
2663
|
portal: true,
|
|
2315
|
-
children: /* @__PURE__ */
|
|
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
|
|
2323
|
-
import { jsx as
|
|
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__ */
|
|
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
|
|
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 =
|
|
2746
|
+
const onBaseline = useCallback4(
|
|
2398
2747
|
(e) => setBaselineId(e.currentTarget.value || null),
|
|
2399
2748
|
[]
|
|
2400
2749
|
);
|
|
2401
|
-
const onExperiment =
|
|
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__ */
|
|
2408
|
-
/* @__PURE__ */
|
|
2409
|
-
/* @__PURE__ */
|
|
2410
|
-
/* @__PURE__ */
|
|
2411
|
-
/* @__PURE__ */
|
|
2412
|
-
/* @__PURE__ */
|
|
2413
|
-
/* @__PURE__ */
|
|
2414
|
-
baselineOptions.map((r) => /* @__PURE__ */
|
|
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__ */
|
|
2418
|
-
/* @__PURE__ */
|
|
2419
|
-
/* @__PURE__ */
|
|
2420
|
-
/* @__PURE__ */
|
|
2421
|
-
experimentOptions.map((r) => /* @__PURE__ */
|
|
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__ */
|
|
2426
|
-
hasBoth && !loading && !hasData && /* @__PURE__ */
|
|
2427
|
-
hasBoth && !loading && hasData && /* @__PURE__ */
|
|
2428
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2436
|
-
hasThreeLayerData && /* @__PURE__ */
|
|
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__ */
|
|
2445
|
-
/* @__PURE__ */
|
|
2446
|
-
/* @__PURE__ */
|
|
2447
|
-
/* @__PURE__ */
|
|
2448
|
-
/* @__PURE__ */
|
|
2449
|
-
/* @__PURE__ */
|
|
2450
|
-
/* @__PURE__ */
|
|
2451
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2454
|
-
/* @__PURE__ */
|
|
2455
|
-
/* @__PURE__ */
|
|
2456
|
-
/* @__PURE__ */
|
|
2457
|
-
/* @__PURE__ */
|
|
2458
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
2471
|
-
/* @__PURE__ */
|
|
2472
|
-
/* @__PURE__ */
|
|
2473
|
-
/* @__PURE__ */
|
|
2474
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2482
|
-
/* @__PURE__ */
|
|
2483
|
-
/* @__PURE__ */
|
|
2484
|
-
/* @__PURE__ */
|
|
2485
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2841
|
+
/* @__PURE__ */ jsx10(
|
|
2493
2842
|
ColumnHeader,
|
|
2494
2843
|
{
|
|
2495
2844
|
label: "Code correctness",
|
|
2496
2845
|
tooltip: GLOSSARY.dimCodeCorrectness
|
|
2497
2846
|
}
|
|
2498
2847
|
),
|
|
2499
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2508
|
-
/* @__PURE__ */
|
|
2509
|
-
/* @__PURE__ */
|
|
2510
|
-
/* @__PURE__ */
|
|
2511
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2522
|
-
/* @__PURE__ */
|
|
2523
|
-
/* @__PURE__ */
|
|
2524
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2527
|
-
/* @__PURE__ */
|
|
2528
|
-
/* @__PURE__ */
|
|
2529
|
-
/* @__PURE__ */
|
|
2530
|
-
/* @__PURE__ */
|
|
2531
|
-
/* @__PURE__ */
|
|
2532
|
-
/* @__PURE__ */
|
|
2533
|
-
/* @__PURE__ */
|
|
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__ */
|
|
2536
|
-
/* @__PURE__ */
|
|
2537
|
-
/* @__PURE__ */
|
|
2538
|
-
/* @__PURE__ */
|
|
2539
|
-
/* @__PURE__ */
|
|
2540
|
-
/* @__PURE__ */
|
|
2541
|
-
|
|
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__ */
|
|
2551
|
-
/* @__PURE__ */
|
|
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
|
|
2913
|
+
Box as Box8,
|
|
2565
2914
|
Button,
|
|
2566
|
-
Card as
|
|
2567
|
-
Flex as
|
|
2915
|
+
Card as Card11,
|
|
2916
|
+
Flex as Flex14,
|
|
2568
2917
|
Menu,
|
|
2569
2918
|
MenuButton,
|
|
2570
2919
|
MenuItem,
|
|
2571
|
-
Stack as
|
|
2572
|
-
Text as
|
|
2920
|
+
Stack as Stack12,
|
|
2921
|
+
Text as Text18
|
|
2573
2922
|
} from "@sanity/ui";
|
|
2574
|
-
import { useCallback as
|
|
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
|
|
2580
|
-
import { useCallback as
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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__ */
|
|
2658
|
-
/* @__PURE__ */
|
|
2659
|
-
/* @__PURE__ */
|
|
2660
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3011
|
+
/* @__PURE__ */ jsx11(Badge3, { fontSize: 0, tone: badgeTone, children: badgeLabel })
|
|
2663
3012
|
] }) });
|
|
2664
3013
|
}, []);
|
|
2665
|
-
const renderValue =
|
|
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__ */
|
|
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
|
|
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
|
|
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__ */
|
|
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__ */
|
|
2763
|
-
/* @__PURE__ */
|
|
2764
|
-
/* @__PURE__ */
|
|
2765
|
-
opt.payload.title !== opt.value && /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
2784
|
-
import { useCallback as
|
|
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
|
|
2788
|
-
import { jsx as
|
|
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__ */
|
|
2791
|
-
|
|
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
|
|
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
|
|
2807
|
-
import { jsx as
|
|
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__ */
|
|
2813
|
-
hasAreas && areas.map((area) => /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
2880
|
-
/* @__PURE__ */
|
|
2881
|
-
/* @__PURE__ */
|
|
2882
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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
|
|
2935
|
-
import { jsxs as
|
|
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__ */
|
|
2941
|
-
hasRegressed && /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
3302
|
+
import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2954
3303
|
function ReportCard({ data, onSelectReport }) {
|
|
2955
|
-
const handleClick =
|
|
3304
|
+
const handleClick = useCallback6(() => {
|
|
2956
3305
|
onSelectReport(data.reportId);
|
|
2957
3306
|
}, [data.reportId, onSelectReport]);
|
|
2958
|
-
return /* @__PURE__ */
|
|
2959
|
-
|
|
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__ */
|
|
2967
|
-
/* @__PURE__ */
|
|
2968
|
-
/* @__PURE__ */
|
|
2969
|
-
data.comparisonDelta != null && /* @__PURE__ */
|
|
2970
|
-
/* @__PURE__ */
|
|
2971
|
-
/* @__PURE__ */
|
|
2972
|
-
data.trigger && /* @__PURE__ */
|
|
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
|
|
3329
|
+
import { Card as Card10, Flex as Flex13, Text as Text17 } from "@sanity/ui";
|
|
2981
3330
|
import {
|
|
2982
|
-
useCallback as
|
|
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
|
|
3126
|
-
import { useCallback as
|
|
3127
|
-
import { jsx as
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
3149
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3155
|
-
|
|
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__ */
|
|
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
|
|
3171
|
-
import { useCallback as
|
|
3172
|
-
import { jsx as
|
|
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__ */
|
|
3182
|
-
|
|
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__ */
|
|
3196
|
-
/* @__PURE__ */
|
|
3197
|
-
|
|
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__ */
|
|
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 =
|
|
3584
|
+
const handleClick = useCallback8(() => {
|
|
3236
3585
|
onSelect(suggestion);
|
|
3237
3586
|
}, [onSelect, suggestion]);
|
|
3238
|
-
return /* @__PURE__ */
|
|
3239
|
-
|
|
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__ */
|
|
3247
|
-
!isHint && /* @__PURE__ */
|
|
3248
|
-
/* @__PURE__ */
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3713
|
+
const handleBarClick = useCallback9(() => {
|
|
3365
3714
|
inputRef.current?.focus();
|
|
3366
3715
|
}, []);
|
|
3367
|
-
return /* @__PURE__ */
|
|
3368
|
-
/* @__PURE__ */
|
|
3369
|
-
|
|
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__ */
|
|
3377
|
-
/* @__PURE__ */
|
|
3378
|
-
tokens.map((token) => /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
3930
|
+
const handleTokenRemove = useCallback10((id) => {
|
|
3582
3931
|
setFilterTokens((prev) => prev.filter((t) => t.id !== id));
|
|
3583
3932
|
}, []);
|
|
3584
|
-
const toggleSortDirection =
|
|
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 =
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
3609
|
-
/* @__PURE__ */
|
|
3610
|
-
/* @__PURE__ */
|
|
3611
|
-
/* @__PURE__ */
|
|
3612
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3626
|
-
/* @__PURE__ */
|
|
3627
|
-
/* @__PURE__ */
|
|
3628
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3638
|
-
/* @__PURE__ */
|
|
3639
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3649
|
-
documentSlug.trim() && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
3660
|
-
/* @__PURE__ */
|
|
3661
|
-
hasActiveFilters && /* @__PURE__ */
|
|
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__ */
|
|
3672
|
-
/* @__PURE__ */
|
|
4020
|
+
/* @__PURE__ */ jsxs18(Flex14, { align: "center", gap: 1, style: { marginLeft: "auto" }, children: [
|
|
4021
|
+
/* @__PURE__ */ jsx21(
|
|
3673
4022
|
MenuButton,
|
|
3674
4023
|
{
|
|
3675
|
-
button: /* @__PURE__ */
|
|
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__ */
|
|
3686
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
3727
|
-
/* @__PURE__ */
|
|
3728
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
3794
|
-
import { useCallback as
|
|
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
|
|
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
|
|
3803
|
-
import { jsx as
|
|
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__ */
|
|
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
|
|
4159
|
+
import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
3811
4160
|
function AreaScoreTable({ scores }) {
|
|
3812
|
-
return /* @__PURE__ */
|
|
3813
|
-
/* @__PURE__ */
|
|
3814
|
-
/* @__PURE__ */
|
|
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__ */
|
|
3824
|
-
/* @__PURE__ */
|
|
3825
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
3850
|
-
/* @__PURE__ */
|
|
3851
|
-
scores.map((score, i) => /* @__PURE__ */
|
|
3852
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4209
|
+
children: /* @__PURE__ */ jsx23(Text20, { size: 1, weight: "medium", children: score.feature })
|
|
3861
4210
|
}
|
|
3862
4211
|
),
|
|
3863
|
-
/* @__PURE__ */
|
|
3864
|
-
/* @__PURE__ */
|
|
3865
|
-
/* @__PURE__ */
|
|
3866
|
-
/* @__PURE__ */
|
|
3867
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4224
|
+
children: /* @__PURE__ */ jsx23(Text20, { size: 1, children: formatDelta(score.docLift) })
|
|
3876
4225
|
}
|
|
3877
4226
|
),
|
|
3878
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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
|
|
3898
|
-
import { jsx as
|
|
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__ */
|
|
3901
|
-
/* @__PURE__ */
|
|
3902
|
-
/* @__PURE__ */
|
|
3903
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
3930
|
-
comparison.improved.length > 0 && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4314
|
+
return /* @__PURE__ */ jsx24(
|
|
3966
4315
|
Tooltip3,
|
|
3967
4316
|
{
|
|
3968
|
-
content: /* @__PURE__ */
|
|
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__ */
|
|
3972
|
-
|
|
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__ */
|
|
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__ */
|
|
3993
|
-
/* @__PURE__ */
|
|
3994
|
-
|
|
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__ */
|
|
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
|
|
4010
|
-
import { Badge as Badge13, Box as
|
|
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
|
|
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__ */
|
|
4017
|
-
(part, i) => i % 2 === 1 ? /* @__PURE__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
4050
|
-
/* @__PURE__ */
|
|
4051
|
-
/* @__PURE__ */
|
|
4052
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4407
|
+
children: /* @__PURE__ */ jsx26(Text22, { muted: true, size: 0, children: /* @__PURE__ */ jsx26(HelpCircleIcon4, {}) })
|
|
4059
4408
|
}
|
|
4060
4409
|
),
|
|
4061
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4069
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4088
|
-
|
|
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__ */
|
|
4096
|
-
/* @__PURE__ */
|
|
4097
|
-
/* @__PURE__ */
|
|
4098
|
-
|
|
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__ */
|
|
4108
|
-
/* @__PURE__ */
|
|
4109
|
-
/* @__PURE__ */
|
|
4110
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4113
|
-
/* @__PURE__ */
|
|
4114
|
-
|
|
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__ */
|
|
4468
|
+
children: /* @__PURE__ */ jsx26(InlineCode, { text: judgment.reason })
|
|
4120
4469
|
}
|
|
4121
4470
|
) }),
|
|
4122
|
-
judgment.canonicalDocs && judgment.canonicalDocs.length > 0 && /* @__PURE__ */
|
|
4123
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4126
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
4157
|
-
import { Box as
|
|
4158
|
-
import { Fragment as
|
|
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__ */
|
|
4167
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4518
|
+
tooltip && /* @__PURE__ */ jsxs22(Fragment5, { children: [
|
|
4170
4519
|
" ",
|
|
4171
|
-
/* @__PURE__ */
|
|
4520
|
+
/* @__PURE__ */ jsx27(
|
|
4172
4521
|
Tooltip5,
|
|
4173
4522
|
{
|
|
4174
|
-
content: /* @__PURE__ */
|
|
4523
|
+
content: /* @__PURE__ */ jsx27(Box11, { padding: 2, children: /* @__PURE__ */ jsx27(Text23, { size: 1, children: tooltip }) }),
|
|
4175
4524
|
portal: true,
|
|
4176
|
-
children: /* @__PURE__ */
|
|
4525
|
+
children: /* @__PURE__ */ jsx27("span", { style: { cursor: "help" }, children: /* @__PURE__ */ jsx27(HelpCircleIcon5, {}) })
|
|
4177
4526
|
}
|
|
4178
4527
|
)
|
|
4179
4528
|
] })
|
|
4180
4529
|
] }),
|
|
4181
|
-
/* @__PURE__ */
|
|
4530
|
+
/* @__PURE__ */ jsxs22(Text23, { size: 3, weight: "bold", children: [
|
|
4182
4531
|
value,
|
|
4183
|
-
suffix && /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
4201
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4247
|
-
/* @__PURE__ */
|
|
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
|
|
4260
|
-
import { jsx as
|
|
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__ */
|
|
4264
|
-
/* @__PURE__ */
|
|
4265
|
-
/* @__PURE__ */
|
|
4266
|
-
/* @__PURE__ */
|
|
4267
|
-
/* @__PURE__ */
|
|
4268
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4283
|
-
provenance.contextHash && /* @__PURE__ */
|
|
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__ */
|
|
4293
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4302
|
-
/* @__PURE__ */
|
|
4303
|
-
|
|
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__ */
|
|
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__ */
|
|
4317
|
-
/* @__PURE__ */
|
|
4318
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4324
|
-
git.prNumber && /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
4370
|
-
import { HelpCircleIcon as
|
|
4371
|
-
import { jsx as
|
|
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__ */
|
|
4377
|
-
/* @__PURE__ */
|
|
4378
|
-
/* @__PURE__ */
|
|
4379
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4734
|
+
children: /* @__PURE__ */ jsx30(Text25, { muted: true, size: 0, children: /* @__PURE__ */ jsx30(HelpCircleIcon6, {}) })
|
|
4386
4735
|
}
|
|
4387
4736
|
),
|
|
4388
|
-
/* @__PURE__ */
|
|
4737
|
+
/* @__PURE__ */ jsx30(
|
|
4389
4738
|
Tooltip6,
|
|
4390
4739
|
{
|
|
4391
|
-
content: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4412
|
-
/* @__PURE__ */
|
|
4413
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4422
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4451
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4810
|
+
children: /* @__PURE__ */ jsx30(Text25, { muted: true, size: 1, children: index + 1 })
|
|
4462
4811
|
}
|
|
4463
4812
|
),
|
|
4464
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4822
|
+
children: /* @__PURE__ */ jsx30(Text25, { size: 1, weight: "medium", children: gap.area })
|
|
4474
4823
|
}
|
|
4475
4824
|
),
|
|
4476
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4852
|
+
children: /* @__PURE__ */ jsx30(Text25, { muted: true, size: 1, children: gap.remediation })
|
|
4504
4853
|
}
|
|
4505
4854
|
),
|
|
4506
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
4893
|
+
Box as Box13,
|
|
4545
4894
|
Button as Button2,
|
|
4546
|
-
Card as
|
|
4547
|
-
Flex as
|
|
4548
|
-
Stack as
|
|
4549
|
-
Text as
|
|
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
|
|
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__ */
|
|
4566
|
-
/* @__PURE__ */
|
|
4567
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4577
|
-
/* @__PURE__ */
|
|
4578
|
-
hasTag && /* @__PURE__ */
|
|
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__ */
|
|
4581
|
-
/* @__PURE__ */
|
|
4582
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4934
|
+
/* @__PURE__ */ jsx31(
|
|
4586
4935
|
Tooltip7,
|
|
4587
4936
|
{
|
|
4588
|
-
content: /* @__PURE__ */
|
|
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__ */
|
|
4592
|
-
|
|
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__ */
|
|
4601
|
-
/* @__PURE__ */
|
|
4602
|
-
|
|
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__ */
|
|
4615
|
-
|
|
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__ */
|
|
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
|
|
4637
|
-
import { jsx as
|
|
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__ */
|
|
4643
|
-
/* @__PURE__ */
|
|
4644
|
-
/* @__PURE__ */
|
|
4645
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4657
|
-
/* @__PURE__ */
|
|
4658
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4667
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4684
|
-
/* @__PURE__ */
|
|
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__ */
|
|
5041
|
+
children: /* @__PURE__ */ jsx32(Text27, { size: 1, weight: "medium", children: score.feature })
|
|
4693
5042
|
}
|
|
4694
5043
|
),
|
|
4695
|
-
/* @__PURE__ */
|
|
4696
|
-
/* @__PURE__ */
|
|
4697
|
-
/* @__PURE__ */
|
|
4698
|
-
/* @__PURE__ */
|
|
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__ */
|
|
5056
|
+
children: /* @__PURE__ */ jsx32(Text27, { size: 1, children: score.retrievalGap != null ? score.retrievalGap.toFixed(1) : "\u2014" })
|
|
4708
5057
|
}
|
|
4709
5058
|
),
|
|
4710
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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 =
|
|
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__ */
|
|
5121
|
+
return /* @__PURE__ */ jsx33(LoadingState, { message: "Loading report\u2026" });
|
|
4773
5122
|
}
|
|
4774
5123
|
if (!report) {
|
|
4775
|
-
return /* @__PURE__ */
|
|
4776
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4792
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4814
|
-
/* @__PURE__ */
|
|
4815
|
-
summary.recommendations && summary.recommendations.gaps.length > 0 && /* @__PURE__ */
|
|
4816
|
-
summary.lowScoringJudgments && summary.lowScoringJudgments.length > 0 && /* @__PURE__ */
|
|
4817
|
-
comparison && /* @__PURE__ */
|
|
4818
|
-
/* @__PURE__ */
|
|
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
|
|
4824
|
-
import { useCallback as
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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__ */
|
|
4926
|
-
/* @__PURE__ */
|
|
4927
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4936
|
-
/* @__PURE__ */
|
|
4937
|
-
areaNames.map((name) => /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4949
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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 =
|
|
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 =
|
|
5415
|
+
const handleSelectReport = useCallback13(
|
|
5067
5416
|
(id) => {
|
|
5068
5417
|
router.navigate({ reportId: id });
|
|
5069
5418
|
},
|
|
5070
5419
|
[router]
|
|
5071
5420
|
);
|
|
5072
|
-
const handleBack =
|
|
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__ */
|
|
5084
|
-
/* @__PURE__ */
|
|
5085
|
-
/* @__PURE__ */
|
|
5086
|
-
/* @__PURE__ */
|
|
5087
|
-
/* @__PURE__ */
|
|
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__ */
|
|
5090
|
-
/* @__PURE__ */
|
|
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__ */
|
|
5098
|
-
sources.map((s) => /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
5110
|
-
modes.map((m) => /* @__PURE__ */
|
|
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__ */
|
|
5117
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
5157
|
-
!isDetail && activeTab === "compare" && /* @__PURE__ */
|
|
5158
|
-
isDetail && reportId && /* @__PURE__ */
|
|
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
|
|
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 =
|
|
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,
|