@sanity/ailf-studio 1.7.1 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +104 -79
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6064,7 +6064,7 @@ import {
6064
6064
  import {
6065
6065
  useCallback as useCallback32,
6066
6066
  useEffect as useEffect10,
6067
- useMemo as useMemo13,
6067
+ useMemo as useMemo15,
6068
6068
  useState as useState22
6069
6069
  } from "react";
6070
6070
  import { useClient as useClient10 } from "sanity";
@@ -6095,8 +6095,21 @@ function findManifestEntry(ref, key) {
6095
6095
  return ref.entries.find((e) => e.key === key);
6096
6096
  }
6097
6097
 
6098
+ // src/lib/use-test-outputs-artifact.ts
6099
+ import { useMemo as useMemo7 } from "react";
6100
+
6101
+ // src/lib/test-outputs-entry-key.ts
6102
+ var VARIANT_SUFFIX_PATTERN = /\s*\((gold|baseline)\)\s*$/i;
6103
+ function testOutputsEntryKey(taskId, modelId) {
6104
+ const match = VARIANT_SUFFIX_PATTERN.exec(taskId);
6105
+ if (!match) return null;
6106
+ const mode = match[1].toLowerCase();
6107
+ const task = taskId.slice(0, match.index).trim();
6108
+ return `${mode}--${task}--${modelId}`;
6109
+ }
6110
+
6098
6111
  // src/lib/useArtifactCache.ts
6099
- import { useCallback as useCallback15, useRef as useRef5, useState as useState11 } from "react";
6112
+ import { useCallback as useCallback15, useMemo as useMemo6, useRef as useRef5, useState as useState11 } from "react";
6100
6113
  function useArtifactCache(opts) {
6101
6114
  const { runId, artifactRef, type } = opts;
6102
6115
  const cacheRef = useRef5(/* @__PURE__ */ new Map());
@@ -6104,7 +6117,10 @@ function useArtifactCache(opts) {
6104
6117
  const [error, setError] = useState11(null);
6105
6118
  const inFlight2 = useRef5(/* @__PURE__ */ new Set());
6106
6119
  const BULK_KEY = "__bulk__";
6107
- const availableEntries = artifactRef?.entries?.map((e) => e.key) ?? [];
6120
+ const availableEntries = useMemo6(
6121
+ () => artifactRef?.entries?.map((e) => e.key) ?? [],
6122
+ [artifactRef]
6123
+ );
6108
6124
  const fetchEntry = useCallback15(
6109
6125
  async (key) => {
6110
6126
  if (!artifactRef || !runId) return;
@@ -6159,14 +6175,17 @@ function useArtifactCache(opts) {
6159
6175
  (key) => cacheRef.current.get(key) ?? null,
6160
6176
  []
6161
6177
  );
6162
- return {
6163
- status,
6164
- error,
6165
- availableEntries,
6166
- getEntry,
6167
- fetchEntry,
6168
- fetchAll
6169
- };
6178
+ return useMemo6(
6179
+ () => ({
6180
+ status,
6181
+ error,
6182
+ availableEntries,
6183
+ getEntry,
6184
+ fetchEntry,
6185
+ fetchAll
6186
+ }),
6187
+ [status, error, availableEntries, getEntry, fetchEntry, fetchAll]
6188
+ );
6170
6189
  }
6171
6190
  async function signAndFetch(signingUrl) {
6172
6191
  const signingRes = await fetch(signingUrl, {
@@ -6201,24 +6220,27 @@ function useTestOutputsArtifact(runId, artifactRef) {
6201
6220
  artifactRef,
6202
6221
  type: "testOutputs"
6203
6222
  });
6204
- return {
6205
- status: cache.status,
6206
- error: cache.error,
6207
- getOutput: (taskId, modelId) => cache.getEntry(`${taskId}::${modelId}`),
6208
- fetchOutput: async (taskId, modelId) => {
6209
- if (!artifactRef) return;
6210
- if (!artifactRef.layout || artifactRef.layout === "bulk") {
6211
- await cache.fetchAll();
6212
- return;
6223
+ return useMemo7(() => {
6224
+ const entryKey = (taskId, modelId) => testOutputsEntryKey(taskId, modelId) ?? `${taskId}::${modelId}`;
6225
+ return {
6226
+ status: cache.status,
6227
+ error: cache.error,
6228
+ getOutput: (taskId, modelId) => cache.getEntry(entryKey(taskId, modelId)),
6229
+ fetchOutput: async (taskId, modelId) => {
6230
+ if (!artifactRef) return;
6231
+ if (!artifactRef.layout || artifactRef.layout === "bulk") {
6232
+ await cache.fetchAll();
6233
+ return;
6234
+ }
6235
+ await cache.fetchEntry(entryKey(taskId, modelId));
6236
+ },
6237
+ hasOutput: (taskId, modelId) => {
6238
+ if (!artifactRef) return false;
6239
+ if (!artifactRef.layout || artifactRef.layout === "bulk") return true;
6240
+ return cache.availableEntries.includes(entryKey(taskId, modelId));
6213
6241
  }
6214
- await cache.fetchEntry(`${taskId}::${modelId}`);
6215
- },
6216
- hasOutput: (taskId, modelId) => {
6217
- if (!artifactRef) return false;
6218
- if (!artifactRef.layout || artifactRef.layout === "bulk") return true;
6219
- return cache.availableEntries.includes(`${taskId}::${modelId}`);
6220
- }
6221
- };
6242
+ };
6243
+ }, [cache, artifactRef]);
6222
6244
  }
6223
6245
 
6224
6246
  // src/lib/thresholds.ts
@@ -6262,7 +6284,7 @@ function negativeDocLiftSentiment(count) {
6262
6284
  }
6263
6285
 
6264
6286
  // src/components/report-detail/AgentBehaviorCard.tsx
6265
- import { useMemo as useMemo6, useState as useState12 } from "react";
6287
+ import { useMemo as useMemo8, useState as useState12 } from "react";
6266
6288
  import { HelpCircleIcon as HelpCircleIcon6, SearchIcon as SearchIcon4 } from "@sanity/icons";
6267
6289
  import {
6268
6290
  Badge as Badge5,
@@ -6473,7 +6495,7 @@ function SearchQueryList({
6473
6495
  truncated
6474
6496
  }) {
6475
6497
  const [filter, setFilter] = useState12("");
6476
- const filtered = useMemo6(() => {
6498
+ const filtered = useMemo8(() => {
6477
6499
  if (!filter) return queries;
6478
6500
  const lower = filter.toLowerCase();
6479
6501
  return queries.filter((q) => q.toLowerCase().includes(lower));
@@ -7146,7 +7168,7 @@ function Pill({
7146
7168
  import { Box as Box16, Flex as Flex15, Stack as Stack19, Text as Text24 } from "@sanity/ui";
7147
7169
 
7148
7170
  // src/lib/useArtifactListRow.ts
7149
- import { useCallback as useCallback18, useMemo as useMemo8 } from "react";
7171
+ import { useCallback as useCallback18, useMemo as useMemo10 } from "react";
7150
7172
 
7151
7173
  // src/lib/useArtifactDetail.ts
7152
7174
  import { useCallback as useCallback16, useEffect as useEffect7, useState as useState13 } from "react";
@@ -7375,7 +7397,7 @@ function useArtifactEntry(type, key) {
7375
7397
  }
7376
7398
 
7377
7399
  // src/lib/useArtifactPrefetch.ts
7378
- import { useCallback as useCallback17, useMemo as useMemo7 } from "react";
7400
+ import { useCallback as useCallback17, useMemo as useMemo9 } from "react";
7379
7401
  var NDJSON_TYPES2 = /* @__PURE__ */ new Set([
7380
7402
  "traces"
7381
7403
  ]);
@@ -7479,7 +7501,7 @@ function useArtifactPrefetch(type) {
7479
7501
  },
7480
7502
  [runId, ref, type]
7481
7503
  );
7482
- return useMemo7(
7504
+ return useMemo9(
7483
7505
  () => ({ prefetch, onHover, prefetchWindow, warmAll }),
7484
7506
  [prefetch, onHover, prefetchWindow, warmAll]
7485
7507
  );
@@ -7512,7 +7534,7 @@ function useArtifactListRow(type, key, listKeys) {
7512
7534
  const entry = useArtifactEntry(type, key);
7513
7535
  const [full, status, request] = useArtifactDetail(type, key);
7514
7536
  const { onHover, prefetchWindow } = useArtifactPrefetch(type);
7515
- const onMouseEnter = useMemo8(() => onHover(key), [onHover, key]);
7537
+ const onMouseEnter = useMemo10(() => onHover(key), [onHover, key]);
7516
7538
  const onFocus = useCallback18(() => {
7517
7539
  const idx = listKeys.indexOf(key);
7518
7540
  if (idx < 0) return;
@@ -7786,7 +7808,7 @@ function formatShortDate(iso) {
7786
7808
  }
7787
7809
 
7788
7810
  // src/components/report-detail/JudgmentList.tsx
7789
- import React2, { useCallback as useCallback21, useEffect as useEffect9, useMemo as useMemo9, useRef as useRef6, useState as useState15 } from "react";
7811
+ import React2, { useCallback as useCallback21, useEffect as useEffect9, useMemo as useMemo11, useRef as useRef6, useState as useState15 } from "react";
7790
7812
  import {
7791
7813
  ChevronDownIcon,
7792
7814
  ChevronRightIcon,
@@ -8136,11 +8158,7 @@ function testResultKey(taskId, dimension, modelId) {
8136
8158
  return `${taskId}::${dimension}::${modelId}`;
8137
8159
  }
8138
8160
  function testOutputsKeyFor(j) {
8139
- const match = /\s*\((gold|baseline)\)\s*$/i.exec(j.taskId);
8140
- if (!match) return null;
8141
- const mode = match[1].toLowerCase();
8142
- const task = j.taskId.slice(0, match.index).trim();
8143
- return `${mode}--${task}--${j.modelId}`;
8161
+ return testOutputsEntryKey(j.taskId, j.modelId);
8144
8162
  }
8145
8163
  function JudgmentList({
8146
8164
  artifactCache,
@@ -8155,7 +8173,7 @@ function JudgmentList({
8155
8173
  );
8156
8174
  const [scoreBand, setScoreBand] = useState15(null);
8157
8175
  const [sortOrder, setSortOrder] = useState15("score-desc");
8158
- const testResultMap = useMemo9(() => {
8176
+ const testResultMap = useMemo11(() => {
8159
8177
  const map = /* @__PURE__ */ new Map();
8160
8178
  if (!testResults) return map;
8161
8179
  for (const tr of testResults) {
@@ -8165,15 +8183,15 @@ function JudgmentList({
8165
8183
  }
8166
8184
  return map;
8167
8185
  }, [testResults]);
8168
- const pruned = useMemo9(() => pruneNoise(judgments), [judgments]);
8169
- const dimensionOptions = useMemo9(() => {
8186
+ const pruned = useMemo11(() => pruneNoise(judgments), [judgments]);
8187
+ const dimensionOptions = useMemo11(() => {
8170
8188
  const counts = /* @__PURE__ */ new Map();
8171
8189
  for (const j of pruned) {
8172
8190
  counts.set(j.dimension, (counts.get(j.dimension) ?? 0) + 1);
8173
8191
  }
8174
8192
  return [...counts.entries()].sort(([a], [b]) => a.localeCompare(b)).map(([key, count]) => ({ key, label: dimensionLabel2(key), count }));
8175
8193
  }, [pruned]);
8176
- const filtered = useMemo9(() => {
8194
+ const filtered = useMemo11(() => {
8177
8195
  return pruned.filter((j) => {
8178
8196
  if (selectedDimensions.size > 0 && !selectedDimensions.has(j.dimension))
8179
8197
  return false;
@@ -8182,17 +8200,17 @@ function JudgmentList({
8182
8200
  return true;
8183
8201
  });
8184
8202
  }, [pruned, selectedDimensions, scoreBand, query]);
8185
- const grouped = useMemo9(
8203
+ const grouped = useMemo11(
8186
8204
  () => groupByArea(filtered, sortOrder),
8187
8205
  [filtered, sortOrder]
8188
8206
  );
8189
- const groupedWithStats = useMemo9(
8207
+ const groupedWithStats = useMemo11(
8190
8208
  () => grouped.map(
8191
8209
  ([area, list]) => [area, list, computeGroupStats(list)]
8192
8210
  ),
8193
8211
  [grouped]
8194
8212
  );
8195
- const focusedJudgment = useMemo9(() => {
8213
+ const focusedJudgment = useMemo11(() => {
8196
8214
  if (!focus) return null;
8197
8215
  return pruned.find((j) => judgmentSlug(j) === focus) ?? null;
8198
8216
  }, [pruned, focus]);
@@ -8238,13 +8256,13 @@ function JudgmentList({
8238
8256
  });
8239
8257
  }, [focusedJudgment]);
8240
8258
  const [activeRowSlug, setActiveRowSlug] = useState15(null);
8241
- const flatSlugs = useMemo9(
8259
+ const flatSlugs = useMemo11(
8242
8260
  () => grouped.flatMap(
8243
8261
  ([, areaJudgments]) => areaJudgments.map((j) => judgmentSlug(j))
8244
8262
  ),
8245
8263
  [grouped]
8246
8264
  );
8247
- const flatKeys = useMemo9(
8265
+ const flatKeys = useMemo11(
8248
8266
  () => grouped.flatMap(
8249
8267
  ([, areaJudgments]) => areaJudgments.map((j) => j.id ?? "")
8250
8268
  ),
@@ -8583,7 +8601,7 @@ function JudgmentCard({
8583
8601
  },
8584
8602
  [handleClick]
8585
8603
  );
8586
- const onHoverTestOutputs = useMemo9(
8604
+ const onHoverTestOutputs = useMemo11(
8587
8605
  () => testOutputsKey ? testOutputsPrefetch.onHover(testOutputsKey) : null,
8588
8606
  [testOutputsPrefetch, testOutputsKey]
8589
8607
  );
@@ -9504,14 +9522,14 @@ function ReportHeader({
9504
9522
  }
9505
9523
 
9506
9524
  // src/components/report-detail/StrengthsList.tsx
9507
- import { useMemo as useMemo12 } from "react";
9525
+ import { useMemo as useMemo14 } from "react";
9508
9526
  import { CheckmarkCircleIcon as CheckmarkCircleIcon2, SearchIcon as SearchIcon7 } from "@sanity/icons";
9509
9527
  import { Box as Box21, Flex as Flex25, Stack as Stack26, Text as Text34 } from "@sanity/ui";
9510
9528
 
9511
9529
  // src/components/report-detail/AreaScoresGrid.tsx
9512
9530
  import React3, {
9513
9531
  useCallback as useCallback29,
9514
- useMemo as useMemo10,
9532
+ useMemo as useMemo12,
9515
9533
  useState as useState20
9516
9534
  } from "react";
9517
9535
  import { WarningOutlineIcon as WarningOutlineIcon2 } from "@sanity/icons";
@@ -9556,12 +9574,12 @@ function AreaScoresGrid({
9556
9574
  }) {
9557
9575
  const { ref: containerRef, width } = useContainerWidth();
9558
9576
  const tier = tableTier(width);
9559
- const hasActual = useMemo10(
9577
+ const hasActual = useMemo12(
9560
9578
  () => scores.some((s) => s.actualScore != null),
9561
9579
  [scores]
9562
9580
  );
9563
9581
  const showLift = isLiteracyMode(mode);
9564
- const dimKeys = useMemo10(() => collectDimensionKeys(scores), [scores]);
9582
+ const dimKeys = useMemo12(() => collectDimensionKeys(scores), [scores]);
9565
9583
  const [sortField, setSortField] = useState20("score");
9566
9584
  const [sortDir, setSortDir] = useState20("desc");
9567
9585
  const handleSort = useCallback29(
@@ -9575,7 +9593,7 @@ function AreaScoresGrid({
9575
9593
  },
9576
9594
  [sortField]
9577
9595
  );
9578
- const sorted = useMemo10(() => {
9596
+ const sorted = useMemo12(() => {
9579
9597
  const dir = sortDir === "asc" ? 1 : -1;
9580
9598
  return [...scores].sort((a, b) => {
9581
9599
  switch (sortField) {
@@ -9590,7 +9608,7 @@ function AreaScoresGrid({
9590
9608
  }
9591
9609
  });
9592
9610
  }, [scores, sortField, sortDir]);
9593
- const modelScoresByFeature = useMemo10(() => {
9611
+ const modelScoresByFeature = useMemo12(() => {
9594
9612
  if (!perModel) return null;
9595
9613
  const map = /* @__PURE__ */ new Map();
9596
9614
  for (const model of perModel) {
@@ -10202,7 +10220,7 @@ function Pill2({
10202
10220
  }
10203
10221
 
10204
10222
  // src/components/report-detail/useModelSelection.ts
10205
- import { useCallback as useCallback31, useMemo as useMemo11, useState as useState21 } from "react";
10223
+ import { useCallback as useCallback31, useMemo as useMemo13, useState as useState21 } from "react";
10206
10224
  function useModelSelection({
10207
10225
  scores,
10208
10226
  perModel
@@ -10213,7 +10231,7 @@ function useModelSelection({
10213
10231
  }, []);
10214
10232
  const isExpanded = selection === "expanded";
10215
10233
  const hasModels = perModel != null && perModel.length > 1;
10216
- const resolvedScores = useMemo11(() => {
10234
+ const resolvedScores = useMemo13(() => {
10217
10235
  if (isExpanded || selection === null || !perModel) return scores;
10218
10236
  const model = perModel.find((m) => m.modelId === selection);
10219
10237
  return model?.scores ?? scores;
@@ -10244,7 +10262,7 @@ function StrengthsList({
10244
10262
  hasModels,
10245
10263
  expandedPerModel
10246
10264
  } = useModelSelection({ scores, perModel });
10247
- const displayedScores = useMemo12(
10265
+ const displayedScores = useMemo14(
10248
10266
  () => resolvedScores.filter((s) => s.totalScore >= SCORE_CAUTION),
10249
10267
  [resolvedScores]
10250
10268
  );
@@ -10742,17 +10760,17 @@ function ReportDetail({
10742
10760
  const hasAgentActivity = Boolean(
10743
10761
  summary?.agentBehavior && summary.agentBehavior.length > 0
10744
10762
  );
10745
- const tabs = useMemo13(
10763
+ const tabs = useMemo15(
10746
10764
  () => [OVERVIEW_TAB, DIAGNOSTICS_TAB, ACTIVITY_TAB],
10747
10765
  []
10748
10766
  );
10749
- const disabledTabs = useMemo13(() => {
10767
+ const disabledTabs = useMemo15(() => {
10750
10768
  const set2 = /* @__PURE__ */ new Set();
10751
10769
  if (!hasDiagnostics) set2.add("diagnostics");
10752
10770
  if (!hasAgentActivity) set2.add("activity");
10753
10771
  return set2;
10754
10772
  }, [hasDiagnostics, hasAgentActivity]);
10755
- const currentTab = useMemo13(() => {
10773
+ const currentTab = useMemo15(() => {
10756
10774
  const parsed = parseTab(activeTab);
10757
10775
  if (disabledTabs.has(parsed)) return "overview";
10758
10776
  return tabs.some((t) => t.id === parsed) ? parsed : "overview";
@@ -11233,11 +11251,12 @@ var SECTION_LABEL_STYLE = {
11233
11251
  textTransform: "uppercase"
11234
11252
  };
11235
11253
  var COPYABLE_BLOCK_STYLE = {
11236
- paddingRight: 40
11254
+ position: "relative"
11237
11255
  };
11238
11256
  var COPY_BUTTON_SLOT_STYLE = {
11239
11257
  float: "right",
11240
11258
  marginLeft: 8,
11259
+ marginBottom: 4,
11241
11260
  position: "sticky",
11242
11261
  top: 0,
11243
11262
  zIndex: 1
@@ -11310,6 +11329,10 @@ function JudgmentDetailDrawer({
11310
11329
  useEffect12(() => {
11311
11330
  setTab("reasoning");
11312
11331
  }, [judgment.taskId, judgment.dimension, judgment.modelId]);
11332
+ const [fetchDispatched, setFetchDispatched] = useState24(false);
11333
+ useEffect12(() => {
11334
+ setFetchDispatched(false);
11335
+ }, [judgment.taskId, judgment.dimension, judgment.modelId]);
11313
11336
  const inlineOutput = testResult?.responseOutput;
11314
11337
  const artifactEntry = artifactCache?.getOutput(
11315
11338
  judgment.taskId,
@@ -11317,19 +11340,21 @@ function JudgmentDetailDrawer({
11317
11340
  );
11318
11341
  const resolvedOutput = inlineOutput ?? artifactEntry?.responseOutput ?? null;
11319
11342
  const resolvedTruncated = testResult?.responseOutputTruncated ?? artifactEntry?.responseOutputTruncated ?? false;
11320
- const entryKnownToManifest = artifactCache?.hasOutput(judgment.taskId, judgment.modelId) ?? false;
11321
- const canFetchArtifact = !inlineOutput && !artifactEntry && artifactCache != null && entryKnownToManifest;
11322
- const entryUnavailable = !inlineOutput && !artifactEntry && artifactCache != null && !entryKnownToManifest;
11323
- const hasOutputTab = resolvedOutput != null || canFetchArtifact || entryUnavailable;
11343
+ const canAttemptFetch = !inlineOutput && !artifactEntry && artifactCache != null;
11344
+ const fetchInFlight = canAttemptFetch && artifactCache?.status === "loading";
11345
+ const fetchFailed = canAttemptFetch && artifactCache?.status === "error";
11346
+ const entryUnavailable = canAttemptFetch && fetchDispatched && !fetchInFlight && !fetchFailed;
11347
+ const hasOutputTab = resolvedOutput != null || canAttemptFetch;
11324
11348
  useEffect12(() => {
11325
- if (tab === "output" && !resolvedOutput && artifactCache && entryKnownToManifest) {
11326
- artifactCache.fetchOutput(judgment.taskId, judgment.modelId);
11349
+ if (tab === "output" && canAttemptFetch && !fetchDispatched) {
11350
+ setFetchDispatched(true);
11351
+ void artifactCache.fetchOutput(judgment.taskId, judgment.modelId);
11327
11352
  }
11328
11353
  }, [
11329
11354
  tab,
11330
- resolvedOutput,
11355
+ canAttemptFetch,
11356
+ fetchDispatched,
11331
11357
  artifactCache,
11332
- entryKnownToManifest,
11333
11358
  judgment.taskId,
11334
11359
  judgment.modelId
11335
11360
  ]);
@@ -11553,12 +11578,12 @@ function JudgmentDetailDrawer({
11553
11578
  hidden: tab !== "output",
11554
11579
  id: "judgment-panel-output",
11555
11580
  children: [
11556
- !resolvedOutput && entryUnavailable && /* @__PURE__ */ jsx59(Text44, { muted: true, size: 1, children: "Model output not available for this entry." }),
11557
- !resolvedOutput && !entryUnavailable && artifactCache?.status === "loading" && /* @__PURE__ */ jsx59(Text44, { muted: true, size: 1, children: "Fetching model output\u2026" }),
11558
- !resolvedOutput && !entryUnavailable && artifactCache?.status === "error" && /* @__PURE__ */ jsxs42(Text44, { muted: true, size: 1, style: { color: "#f87171" }, children: [
11581
+ !resolvedOutput && fetchInFlight && /* @__PURE__ */ jsx59(Text44, { muted: true, size: 1, children: "Fetching model output\u2026" }),
11582
+ !resolvedOutput && fetchFailed && /* @__PURE__ */ jsxs42(Text44, { muted: true, size: 1, style: { color: "#f87171" }, children: [
11559
11583
  "Failed to load model output",
11560
- artifactCache.error ? `: ${artifactCache.error}` : ""
11584
+ artifactCache?.error ? `: ${artifactCache.error}` : ""
11561
11585
  ] }),
11586
+ !resolvedOutput && entryUnavailable && /* @__PURE__ */ jsx59(Text44, { muted: true, size: 1, children: "Model output not available for this entry." }),
11562
11587
  resolvedOutput && /* @__PURE__ */ jsxs42(Box28, { style: COPYABLE_BLOCK_STYLE, children: [
11563
11588
  /* @__PURE__ */ jsx59(Box28, { style: COPY_BUTTON_SLOT_STYLE, children: /* @__PURE__ */ jsx59(
11564
11589
  CopyButton,
@@ -11733,7 +11758,7 @@ function JudgmentDetailDrawerOutlet({
11733
11758
 
11734
11759
  // src/components/ScoreTimeline.tsx
11735
11760
  import { Card as Card21, Flex as Flex33, Select as Select2, Stack as Stack35, Text as Text45 } from "@sanity/ui";
11736
- import { useCallback as useCallback35, useEffect as useEffect14, useMemo as useMemo14, useState as useState26 } from "react";
11761
+ import { useCallback as useCallback35, useEffect as useEffect14, useMemo as useMemo16, useState as useState26 } from "react";
11737
11762
  import { useClient as useClient11 } from "sanity";
11738
11763
  import { jsx as jsx61, jsxs as jsxs44 } from "react/jsx-runtime";
11739
11764
  var CHART_HEIGHT = 220;
@@ -11774,7 +11799,7 @@ function ScoreTimeline({ mode = null, source = null }) {
11774
11799
  const [loading, setLoading] = useState26(true);
11775
11800
  const [rangeDays, setRangeDays] = useState26(30);
11776
11801
  const [selectedArea, setSelectedArea] = useState26(null);
11777
- const areaNames = useMemo14(() => {
11802
+ const areaNames = useMemo16(() => {
11778
11803
  const names = /* @__PURE__ */ new Set();
11779
11804
  for (const dp of dataPoints) {
11780
11805
  for (const s of dp.scores) {
@@ -11801,7 +11826,7 @@ function ScoreTimeline({ mode = null, source = null }) {
11801
11826
  useEffect14(() => {
11802
11827
  void fetchData();
11803
11828
  }, [fetchData]);
11804
- const chartPoints = useMemo14(() => {
11829
+ const chartPoints = useMemo16(() => {
11805
11830
  const pts = [];
11806
11831
  const scored = dataPoints.map((dp) => ({
11807
11832
  date: dp.completedAt,
@@ -11815,7 +11840,7 @@ function ScoreTimeline({ mode = null, source = null }) {
11815
11840
  });
11816
11841
  return pts;
11817
11842
  }, [dataPoints, selectedArea]);
11818
- const avgScore = useMemo14(() => {
11843
+ const avgScore = useMemo16(() => {
11819
11844
  if (chartPoints.length === 0) return 0;
11820
11845
  return chartPoints.reduce((sum, p) => sum + p.score, 0) / chartPoints.length;
11821
11846
  }, [chartPoints]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/ailf-studio",
3
- "version": "1.7.1",
3
+ "version": "1.7.2",
4
4
  "description": "AI Literacy Framework — Sanity Studio dashboard plugin",
5
5
  "type": "module",
6
6
  "license": "MIT",