inspect-ai 0.3.69__py3-none-any.whl → 0.3.71__py3-none-any.whl

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 (242) hide show
  1. inspect_ai/_cli/eval.py +27 -9
  2. inspect_ai/_display/core/display.py +2 -0
  3. inspect_ai/_display/core/footer.py +13 -3
  4. inspect_ai/_display/plain/display.py +6 -2
  5. inspect_ai/_display/rich/display.py +19 -6
  6. inspect_ai/_display/textual/app.py +9 -3
  7. inspect_ai/_display/textual/display.py +4 -0
  8. inspect_ai/_display/textual/widgets/samples.py +4 -10
  9. inspect_ai/_display/textual/widgets/transcript.py +35 -18
  10. inspect_ai/_eval/eval.py +14 -2
  11. inspect_ai/_eval/evalset.py +6 -1
  12. inspect_ai/_eval/run.py +6 -0
  13. inspect_ai/_eval/task/run.py +49 -23
  14. inspect_ai/_eval/task/task.py +26 -3
  15. inspect_ai/_util/content.py +20 -1
  16. inspect_ai/_util/interrupt.py +6 -0
  17. inspect_ai/_util/logger.py +19 -0
  18. inspect_ai/_util/rich.py +7 -8
  19. inspect_ai/_util/text.py +13 -0
  20. inspect_ai/_util/transcript.py +20 -6
  21. inspect_ai/_util/working.py +50 -0
  22. inspect_ai/_view/www/App.css +6 -0
  23. inspect_ai/_view/www/dist/assets/index.css +171 -99
  24. inspect_ai/_view/www/dist/assets/index.js +5972 -2770
  25. inspect_ai/_view/www/eslint.config.mjs +24 -1
  26. inspect_ai/_view/www/log-schema.json +619 -21
  27. inspect_ai/_view/www/package.json +8 -3
  28. inspect_ai/_view/www/src/App.tsx +2 -2
  29. inspect_ai/_view/www/src/appearance/icons.ts +3 -1
  30. inspect_ai/_view/www/src/components/AnsiDisplay.tsx +4 -3
  31. inspect_ai/_view/www/src/components/Card.tsx +9 -8
  32. inspect_ai/_view/www/src/components/DownloadButton.tsx +2 -1
  33. inspect_ai/_view/www/src/components/EmptyPanel.tsx +2 -2
  34. inspect_ai/_view/www/src/components/ErrorPanel.tsx +4 -3
  35. inspect_ai/_view/www/src/components/ExpandablePanel.tsx +13 -5
  36. inspect_ai/_view/www/src/components/FindBand.tsx +3 -3
  37. inspect_ai/_view/www/src/components/HumanBaselineView.tsx +3 -3
  38. inspect_ai/_view/www/src/components/LabeledValue.tsx +5 -4
  39. inspect_ai/_view/www/src/components/LargeModal.tsx +18 -13
  40. inspect_ai/_view/www/src/components/{LightboxCarousel.css → LightboxCarousel.module.css} +22 -18
  41. inspect_ai/_view/www/src/components/LightboxCarousel.tsx +36 -27
  42. inspect_ai/_view/www/src/components/MessageBand.tsx +2 -1
  43. inspect_ai/_view/www/src/components/NavPills.tsx +9 -8
  44. inspect_ai/_view/www/src/components/ProgressBar.tsx +2 -1
  45. inspect_ai/_view/www/src/components/TabSet.tsx +21 -15
  46. inspect_ai/_view/www/src/index.tsx +2 -2
  47. inspect_ai/_view/www/src/metadata/MetaDataGrid.tsx +11 -9
  48. inspect_ai/_view/www/src/metadata/MetaDataView.tsx +3 -2
  49. inspect_ai/_view/www/src/metadata/MetadataGrid.module.css +1 -0
  50. inspect_ai/_view/www/src/metadata/RenderedContent.tsx +16 -1
  51. inspect_ai/_view/www/src/plan/DatasetDetailView.tsx +3 -2
  52. inspect_ai/_view/www/src/plan/DetailStep.tsx +2 -1
  53. inspect_ai/_view/www/src/plan/PlanCard.tsx +2 -5
  54. inspect_ai/_view/www/src/plan/PlanDetailView.tsx +6 -9
  55. inspect_ai/_view/www/src/plan/ScorerDetailView.tsx +2 -1
  56. inspect_ai/_view/www/src/plan/SolverDetailView.tsx +3 -3
  57. inspect_ai/_view/www/src/samples/InlineSampleDisplay.tsx +2 -2
  58. inspect_ai/_view/www/src/samples/SampleDialog.tsx +3 -3
  59. inspect_ai/_view/www/src/samples/SampleDisplay.module.css +9 -1
  60. inspect_ai/_view/www/src/samples/SampleDisplay.tsx +30 -3
  61. inspect_ai/_view/www/src/samples/SampleSummaryView.module.css +4 -0
  62. inspect_ai/_view/www/src/samples/SampleSummaryView.tsx +25 -4
  63. inspect_ai/_view/www/src/samples/SamplesTools.tsx +2 -1
  64. inspect_ai/_view/www/src/samples/chat/ChatMessage.tsx +3 -19
  65. inspect_ai/_view/www/src/samples/chat/ChatMessageRenderer.tsx +2 -1
  66. inspect_ai/_view/www/src/samples/chat/ChatMessageRow.tsx +2 -1
  67. inspect_ai/_view/www/src/samples/chat/ChatView.tsx +2 -1
  68. inspect_ai/_view/www/src/samples/chat/ChatViewVirtualList.tsx +22 -7
  69. inspect_ai/_view/www/src/samples/chat/MessageContent.tsx +35 -6
  70. inspect_ai/_view/www/src/samples/chat/MessageContents.tsx +2 -2
  71. inspect_ai/_view/www/src/samples/chat/messages.ts +15 -2
  72. inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.tsx +13 -4
  73. inspect_ai/_view/www/src/samples/chat/tools/ToolInput.module.css +2 -2
  74. inspect_ai/_view/www/src/samples/chat/tools/ToolInput.tsx +18 -19
  75. inspect_ai/_view/www/src/samples/chat/tools/ToolOutput.module.css +1 -1
  76. inspect_ai/_view/www/src/samples/chat/tools/ToolOutput.tsx +4 -3
  77. inspect_ai/_view/www/src/samples/chat/tools/ToolTitle.tsx +2 -2
  78. inspect_ai/_view/www/src/samples/error/FlatSampleErrorView.tsx +2 -3
  79. inspect_ai/_view/www/src/samples/error/SampleErrorView.tsx +3 -2
  80. inspect_ai/_view/www/src/samples/list/SampleFooter.tsx +2 -1
  81. inspect_ai/_view/www/src/samples/list/SampleHeader.tsx +2 -1
  82. inspect_ai/_view/www/src/samples/list/SampleList.tsx +57 -45
  83. inspect_ai/_view/www/src/samples/list/SampleRow.tsx +2 -1
  84. inspect_ai/_view/www/src/samples/list/SampleSeparator.tsx +2 -1
  85. inspect_ai/_view/www/src/samples/sample-tools/EpochFilter.tsx +2 -2
  86. inspect_ai/_view/www/src/samples/sample-tools/SelectScorer.tsx +4 -3
  87. inspect_ai/_view/www/src/samples/sample-tools/SortFilter.tsx +2 -5
  88. inspect_ai/_view/www/src/samples/sample-tools/sample-filter/SampleFilter.tsx +2 -2
  89. inspect_ai/_view/www/src/samples/scores/SampleScoreView.tsx +2 -1
  90. inspect_ai/_view/www/src/samples/scores/SampleScores.tsx +2 -2
  91. inspect_ai/_view/www/src/samples/transcript/ApprovalEventView.tsx +2 -1
  92. inspect_ai/_view/www/src/samples/transcript/ErrorEventView.tsx +2 -1
  93. inspect_ai/_view/www/src/samples/transcript/InfoEventView.tsx +2 -1
  94. inspect_ai/_view/www/src/samples/transcript/InputEventView.tsx +2 -1
  95. inspect_ai/_view/www/src/samples/transcript/LoggerEventView.module.css +4 -0
  96. inspect_ai/_view/www/src/samples/transcript/LoggerEventView.tsx +12 -2
  97. inspect_ai/_view/www/src/samples/transcript/ModelEventView.module.css +1 -1
  98. inspect_ai/_view/www/src/samples/transcript/ModelEventView.tsx +25 -28
  99. inspect_ai/_view/www/src/samples/transcript/SampleInitEventView.tsx +2 -1
  100. inspect_ai/_view/www/src/samples/transcript/SampleLimitEventView.tsx +9 -4
  101. inspect_ai/_view/www/src/samples/transcript/SampleTranscript.tsx +2 -2
  102. inspect_ai/_view/www/src/samples/transcript/SandboxEventView.module.css +32 -0
  103. inspect_ai/_view/www/src/samples/transcript/SandboxEventView.tsx +153 -0
  104. inspect_ai/_view/www/src/samples/transcript/ScoreEventView.tsx +2 -2
  105. inspect_ai/_view/www/src/samples/transcript/StepEventView.tsx +12 -5
  106. inspect_ai/_view/www/src/samples/transcript/SubtaskEventView.tsx +18 -14
  107. inspect_ai/_view/www/src/samples/transcript/ToolEventView.tsx +5 -5
  108. inspect_ai/_view/www/src/samples/transcript/TranscriptView.tsx +53 -16
  109. inspect_ai/_view/www/src/samples/transcript/event/EventNav.tsx +2 -1
  110. inspect_ai/_view/www/src/samples/transcript/event/EventNavs.tsx +2 -1
  111. inspect_ai/_view/www/src/samples/transcript/event/EventPanel.tsx +6 -3
  112. inspect_ai/_view/www/src/samples/transcript/event/EventRow.tsx +3 -2
  113. inspect_ai/_view/www/src/samples/transcript/event/EventSection.tsx +2 -2
  114. inspect_ai/_view/www/src/samples/transcript/event/EventTimingPanel.module.css +28 -0
  115. inspect_ai/_view/www/src/samples/transcript/event/EventTimingPanel.tsx +115 -0
  116. inspect_ai/_view/www/src/samples/transcript/event/utils.ts +29 -0
  117. inspect_ai/_view/www/src/samples/transcript/state/StateDiffView.tsx +2 -1
  118. inspect_ai/_view/www/src/samples/transcript/state/StateEventRenderers.tsx +3 -3
  119. inspect_ai/_view/www/src/samples/transcript/state/StateEventView.tsx +11 -8
  120. inspect_ai/_view/www/src/samples/transcript/types.ts +3 -1
  121. inspect_ai/_view/www/src/types/log.d.ts +312 -137
  122. inspect_ai/_view/www/src/usage/ModelTokenTable.tsx +6 -10
  123. inspect_ai/_view/www/src/usage/ModelUsagePanel.module.css +4 -0
  124. inspect_ai/_view/www/src/usage/ModelUsagePanel.tsx +32 -9
  125. inspect_ai/_view/www/src/usage/TokenTable.tsx +4 -6
  126. inspect_ai/_view/www/src/usage/UsageCard.tsx +2 -1
  127. inspect_ai/_view/www/src/utils/format.ts +8 -5
  128. inspect_ai/_view/www/src/utils/json.ts +24 -0
  129. inspect_ai/_view/www/src/workspace/WorkSpace.tsx +6 -5
  130. inspect_ai/_view/www/src/workspace/WorkSpaceView.tsx +18 -8
  131. inspect_ai/_view/www/src/workspace/error/TaskErrorPanel.tsx +2 -1
  132. inspect_ai/_view/www/src/workspace/navbar/Navbar.tsx +2 -1
  133. inspect_ai/_view/www/src/workspace/navbar/PrimaryBar.tsx +3 -3
  134. inspect_ai/_view/www/src/workspace/navbar/ResultsPanel.tsx +4 -3
  135. inspect_ai/_view/www/src/workspace/navbar/SecondaryBar.tsx +5 -4
  136. inspect_ai/_view/www/src/workspace/navbar/StatusPanel.tsx +5 -8
  137. inspect_ai/_view/www/src/workspace/sidebar/EvalStatus.tsx +5 -4
  138. inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.tsx +2 -1
  139. inspect_ai/_view/www/src/workspace/sidebar/Sidebar.tsx +2 -1
  140. inspect_ai/_view/www/src/workspace/sidebar/SidebarLogEntry.tsx +2 -2
  141. inspect_ai/_view/www/src/workspace/sidebar/SidebarScoreView.tsx +2 -1
  142. inspect_ai/_view/www/src/workspace/sidebar/SidebarScoresView.tsx +2 -2
  143. inspect_ai/_view/www/src/workspace/tabs/InfoTab.tsx +2 -2
  144. inspect_ai/_view/www/src/workspace/tabs/JsonTab.tsx +2 -5
  145. inspect_ai/_view/www/src/workspace/tabs/SamplesTab.tsx +12 -11
  146. inspect_ai/_view/www/yarn.lock +241 -5
  147. inspect_ai/log/__init__.py +2 -0
  148. inspect_ai/log/_condense.py +4 -0
  149. inspect_ai/log/_log.py +72 -12
  150. inspect_ai/log/_recorders/eval.py +6 -1
  151. inspect_ai/log/_samples.py +5 -1
  152. inspect_ai/log/_transcript.py +89 -2
  153. inspect_ai/model/__init__.py +2 -0
  154. inspect_ai/model/_call_tools.py +8 -1
  155. inspect_ai/model/_chat_message.py +22 -7
  156. inspect_ai/model/_conversation.py +11 -9
  157. inspect_ai/model/_generate_config.py +25 -4
  158. inspect_ai/model/_model.py +164 -72
  159. inspect_ai/model/_model_call.py +10 -3
  160. inspect_ai/model/_model_output.py +3 -0
  161. inspect_ai/model/_openai.py +106 -40
  162. inspect_ai/model/_providers/anthropic.py +145 -26
  163. inspect_ai/model/_providers/bedrock.py +7 -0
  164. inspect_ai/model/_providers/cloudflare.py +20 -7
  165. inspect_ai/model/_providers/google.py +29 -8
  166. inspect_ai/model/_providers/groq.py +66 -27
  167. inspect_ai/model/_providers/hf.py +6 -0
  168. inspect_ai/model/_providers/mistral.py +78 -51
  169. inspect_ai/model/_providers/openai.py +66 -4
  170. inspect_ai/model/_providers/openai_o1.py +10 -0
  171. inspect_ai/model/_providers/providers.py +2 -2
  172. inspect_ai/model/_providers/util/tracker.py +92 -0
  173. inspect_ai/model/_providers/vllm.py +13 -5
  174. inspect_ai/model/_reasoning.py +15 -2
  175. inspect_ai/scorer/_model.py +23 -19
  176. inspect_ai/solver/_basic_agent.py +1 -3
  177. inspect_ai/solver/_bridge/patch.py +0 -2
  178. inspect_ai/solver/_human_agent/agent.py +14 -10
  179. inspect_ai/solver/_human_agent/commands/__init__.py +7 -3
  180. inspect_ai/solver/_human_agent/commands/submit.py +76 -30
  181. inspect_ai/solver/_limit.py +4 -4
  182. inspect_ai/solver/_plan.py +0 -3
  183. inspect_ai/solver/_task_state.py +7 -0
  184. inspect_ai/tool/__init__.py +2 -0
  185. inspect_ai/tool/_tool.py +3 -1
  186. inspect_ai/tool/_tools/_computer/_resources/tool/_run.py +1 -1
  187. inspect_ai/tool/_tools/_web_browser/_resources/.pylintrc +8 -0
  188. inspect_ai/tool/_tools/_web_browser/_resources/.vscode/launch.json +24 -0
  189. inspect_ai/tool/_tools/_web_browser/_resources/.vscode/settings.json +25 -0
  190. inspect_ai/tool/_tools/_web_browser/_resources/Dockerfile +5 -6
  191. inspect_ai/tool/_tools/_web_browser/_resources/README.md +10 -11
  192. inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree.py +71 -0
  193. inspect_ai/tool/_tools/_web_browser/_resources/accessibility_tree_node.py +323 -0
  194. inspect_ai/tool/_tools/_web_browser/_resources/cdp/__init__.py +5 -0
  195. inspect_ai/tool/_tools/_web_browser/_resources/cdp/a11y.py +279 -0
  196. inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom.py +9 -0
  197. inspect_ai/tool/_tools/_web_browser/_resources/cdp/dom_snapshot.py +293 -0
  198. inspect_ai/tool/_tools/_web_browser/_resources/cdp/page.py +94 -0
  199. inspect_ai/tool/_tools/_web_browser/_resources/constants.py +2 -0
  200. inspect_ai/tool/_tools/_web_browser/_resources/images/usage_diagram.svg +2 -0
  201. inspect_ai/tool/_tools/_web_browser/_resources/playwright_browser.py +50 -0
  202. inspect_ai/tool/_tools/_web_browser/_resources/playwright_crawler.py +31 -359
  203. inspect_ai/tool/_tools/_web_browser/_resources/playwright_page_crawler.py +280 -0
  204. inspect_ai/tool/_tools/_web_browser/_resources/pyproject.toml +65 -0
  205. inspect_ai/tool/_tools/_web_browser/_resources/rectangle.py +64 -0
  206. inspect_ai/tool/_tools/_web_browser/_resources/rpc_client_helpers.py +146 -0
  207. inspect_ai/tool/_tools/_web_browser/_resources/scale_factor.py +64 -0
  208. inspect_ai/tool/_tools/_web_browser/_resources/test_accessibility_tree_node.py +180 -0
  209. inspect_ai/tool/_tools/_web_browser/_resources/test_playwright_crawler.py +15 -9
  210. inspect_ai/tool/_tools/_web_browser/_resources/test_rectangle.py +15 -0
  211. inspect_ai/tool/_tools/_web_browser/_resources/test_web_client.py +44 -0
  212. inspect_ai/tool/_tools/_web_browser/_resources/web_browser_rpc_types.py +39 -0
  213. inspect_ai/tool/_tools/_web_browser/_resources/web_client.py +198 -48
  214. inspect_ai/tool/_tools/_web_browser/_resources/web_client_new_session.py +26 -25
  215. inspect_ai/tool/_tools/_web_browser/_resources/web_server.py +178 -39
  216. inspect_ai/tool/_tools/_web_browser/_web_browser.py +38 -19
  217. inspect_ai/tool/_tools/_web_search.py +3 -3
  218. inspect_ai/util/__init__.py +2 -1
  219. inspect_ai/util/_concurrency.py +14 -8
  220. inspect_ai/util/_display.py +12 -0
  221. inspect_ai/util/_sandbox/context.py +15 -0
  222. inspect_ai/util/_sandbox/docker/docker.py +7 -5
  223. inspect_ai/util/_sandbox/environment.py +32 -1
  224. inspect_ai/util/_sandbox/events.py +183 -0
  225. inspect_ai/util/_sandbox/local.py +3 -3
  226. inspect_ai/util/_sandbox/self_check.py +131 -43
  227. inspect_ai/util/_subtask.py +11 -0
  228. {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/METADATA +3 -3
  229. {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/RECORD +233 -211
  230. {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/WHEEL +1 -1
  231. inspect_ai/_view/www/src/components/VirtualList.module.css +0 -19
  232. inspect_ai/_view/www/src/components/VirtualList.tsx +0 -292
  233. inspect_ai/tool/_tools/_web_browser/_resources/accessibility_node.py +0 -312
  234. inspect_ai/tool/_tools/_web_browser/_resources/dm_env_servicer.py +0 -275
  235. inspect_ai/tool/_tools/_web_browser/_resources/images/usage_diagram.png +0 -0
  236. inspect_ai/tool/_tools/_web_browser/_resources/test_accessibility_node.py +0 -176
  237. inspect_ai/tool/_tools/_web_browser/_resources/test_dm_env_servicer.py +0 -135
  238. inspect_ai/tool/_tools/_web_browser/_resources/test_web_environment.py +0 -71
  239. inspect_ai/tool/_tools/_web_browser/_resources/web_environment.py +0 -184
  240. {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/LICENSE +0 -0
  241. {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/entry_points.txt +0 -0
  242. {inspect_ai-0.3.69.dist-info → inspect_ai-0.3.71.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  import {
2
+ FC,
2
3
  Fragment,
3
4
  RefObject,
4
5
  useCallback,
@@ -6,9 +7,9 @@ import {
6
7
  useRef,
7
8
  useState,
8
9
  } from "react";
10
+ import { VirtuosoHandle } from "react-virtuoso";
9
11
  import { SampleSummary } from "../../api/types.ts";
10
12
  import { EmptyPanel } from "../../components/EmptyPanel.tsx";
11
- import { VirtualListRef } from "../../components/VirtualList.tsx";
12
13
  import { InlineSampleDisplay } from "../../samples/InlineSampleDisplay";
13
14
  import { SampleDialog } from "../../samples/SampleDialog";
14
15
  import { SamplesDescriptor } from "../../samples/descriptor/samplesDescriptor.tsx";
@@ -43,7 +44,7 @@ interface SamplesTabProps {
43
44
  sampleTabScrollRef: RefObject<HTMLDivElement | null>;
44
45
  }
45
46
 
46
- export const SamplesTab: React.FC<SamplesTabProps> = ({
47
+ export const SamplesTab: FC<SamplesTabProps> = ({
47
48
  sample,
48
49
  samples,
49
50
  sampleMode,
@@ -65,7 +66,7 @@ export const SamplesTab: React.FC<SamplesTabProps> = ({
65
66
  const [items, setItems] = useState<ListItem[]>([]);
66
67
  const [sampleItems, setSampleItems] = useState<ListItem[]>([]);
67
68
 
68
- const sampleListRef = useRef<VirtualListRef>(null);
69
+ const sampleListHandle = useRef<VirtuosoHandle | null>(null);
69
70
  const sampleDialogRef = useRef<HTMLDivElement>(null);
70
71
 
71
72
  // Shows the sample dialog
@@ -74,7 +75,7 @@ export const SamplesTab: React.FC<SamplesTabProps> = ({
74
75
  setSelectedSampleIndex(index);
75
76
  setShowingSampleDialog(true);
76
77
  },
77
- [sampleDialogRef],
78
+ [setSelectedSampleIndex, setShowingSampleDialog],
78
79
  );
79
80
 
80
81
  useEffect(() => {
@@ -84,8 +85,8 @@ export const SamplesTab: React.FC<SamplesTabProps> = ({
84
85
  }, 0);
85
86
  } else {
86
87
  setTimeout(() => {
87
- if (sampleListRef.current) {
88
- sampleListRef.current.focus();
88
+ if (sampleListHandle.current) {
89
+ sampleListHandle.current.scrollToIndex(0);
89
90
  }
90
91
  }, 0);
91
92
  }
@@ -128,11 +129,11 @@ export const SamplesTab: React.FC<SamplesTabProps> = ({
128
129
  } else {
129
130
  return -1;
130
131
  }
131
- }, [selectedSampleIndex, items]);
132
+ }, [selectedSampleIndex, sampleItems.length]);
132
133
 
133
134
  const previousSampleIndex = useCallback(() => {
134
135
  return selectedSampleIndex > 0 ? selectedSampleIndex - 1 : -1;
135
- }, [selectedSampleIndex, items]);
136
+ }, [selectedSampleIndex]);
136
137
 
137
138
  // Manage the next / previous state the selected sample
138
139
  const nextSample = useCallback(() => {
@@ -140,14 +141,14 @@ export const SamplesTab: React.FC<SamplesTabProps> = ({
140
141
  if (sampleStatus !== "loading" && next > -1) {
141
142
  setSelectedSampleIndex(next);
142
143
  }
143
- }, [selectedSampleIndex, samples, sampleStatus, nextSampleIndex]);
144
+ }, [nextSampleIndex, sampleStatus, setSelectedSampleIndex]);
144
145
 
145
146
  const previousSample = useCallback(() => {
146
147
  const prev = previousSampleIndex();
147
148
  if (sampleStatus !== "loading" && prev > -1) {
148
149
  setSelectedSampleIndex(prev);
149
150
  }
150
- }, [selectedSampleIndex, samples, sampleStatus, previousSampleIndex]);
151
+ }, [previousSampleIndex, sampleStatus, setSelectedSampleIndex]);
151
152
 
152
153
  const title =
153
154
  selectedSampleIndex > -1 && sampleItems.length > selectedSampleIndex
@@ -173,7 +174,7 @@ export const SamplesTab: React.FC<SamplesTabProps> = ({
173
174
  ) : undefined}
174
175
  {sampleDescriptor && sampleMode === "many" ? (
175
176
  <SampleList
176
- listRef={sampleListRef}
177
+ listHandle={sampleListHandle}
177
178
  items={items}
178
179
  sampleDescriptor={sampleDescriptor}
179
180
  selectedIndex={selectedSampleIndex}
@@ -351,14 +351,14 @@
351
351
  resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
352
352
  integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
353
353
 
354
- "@eslint-community/eslint-utils@^4.2.0":
354
+ "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
355
355
  version "4.4.1"
356
356
  resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56"
357
357
  integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==
358
358
  dependencies:
359
359
  eslint-visitor-keys "^3.4.3"
360
360
 
361
- "@eslint-community/regexpp@^4.12.1":
361
+ "@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.12.1":
362
362
  version "4.12.1"
363
363
  resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0"
364
364
  integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==
@@ -496,6 +496,27 @@
496
496
  resolved "https://registry.yarnpkg.com/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz#775374306116d51c0c500b8c4face0f9a04752d8"
497
497
  integrity sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==
498
498
 
499
+ "@nodelib/fs.scandir@2.1.5":
500
+ version "2.1.5"
501
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
502
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
503
+ dependencies:
504
+ "@nodelib/fs.stat" "2.0.5"
505
+ run-parallel "^1.1.9"
506
+
507
+ "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
508
+ version "2.0.5"
509
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
510
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
511
+
512
+ "@nodelib/fs.walk@^1.2.3":
513
+ version "1.2.8"
514
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
515
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
516
+ dependencies:
517
+ "@nodelib/fs.scandir" "2.1.5"
518
+ fastq "^1.6.0"
519
+
499
520
  "@popperjs/core@^2.11.8", "@popperjs/core@^2.9.2":
500
521
  version "2.11.8"
501
522
  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
@@ -712,6 +733,87 @@
712
733
  dependencies:
713
734
  "@types/estree" "*"
714
735
 
736
+ "@typescript-eslint/eslint-plugin@8.25.0":
737
+ version "8.25.0"
738
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz#5e1d56f067e5808fa82d1b75bced82396e868a14"
739
+ integrity sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==
740
+ dependencies:
741
+ "@eslint-community/regexpp" "^4.10.0"
742
+ "@typescript-eslint/scope-manager" "8.25.0"
743
+ "@typescript-eslint/type-utils" "8.25.0"
744
+ "@typescript-eslint/utils" "8.25.0"
745
+ "@typescript-eslint/visitor-keys" "8.25.0"
746
+ graphemer "^1.4.0"
747
+ ignore "^5.3.1"
748
+ natural-compare "^1.4.0"
749
+ ts-api-utils "^2.0.1"
750
+
751
+ "@typescript-eslint/parser@8.25.0":
752
+ version "8.25.0"
753
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.25.0.tgz#58fb81c7b7a35184ba17583f3d7ac6c4f3d95be8"
754
+ integrity sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==
755
+ dependencies:
756
+ "@typescript-eslint/scope-manager" "8.25.0"
757
+ "@typescript-eslint/types" "8.25.0"
758
+ "@typescript-eslint/typescript-estree" "8.25.0"
759
+ "@typescript-eslint/visitor-keys" "8.25.0"
760
+ debug "^4.3.4"
761
+
762
+ "@typescript-eslint/scope-manager@8.25.0":
763
+ version "8.25.0"
764
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz#ac3805077aade898e98ca824294c998545597df3"
765
+ integrity sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==
766
+ dependencies:
767
+ "@typescript-eslint/types" "8.25.0"
768
+ "@typescript-eslint/visitor-keys" "8.25.0"
769
+
770
+ "@typescript-eslint/type-utils@8.25.0":
771
+ version "8.25.0"
772
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz#ee0d2f67c80af5ae74b5d6f977e0f8ded0059677"
773
+ integrity sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==
774
+ dependencies:
775
+ "@typescript-eslint/typescript-estree" "8.25.0"
776
+ "@typescript-eslint/utils" "8.25.0"
777
+ debug "^4.3.4"
778
+ ts-api-utils "^2.0.1"
779
+
780
+ "@typescript-eslint/types@8.25.0":
781
+ version "8.25.0"
782
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.25.0.tgz#f91512c2f532b1d6a8826cadd0b0e5cd53cf97e0"
783
+ integrity sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==
784
+
785
+ "@typescript-eslint/typescript-estree@8.25.0":
786
+ version "8.25.0"
787
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz#d8409c63abddd4cf5b93c031b24b9edc1c7c1299"
788
+ integrity sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==
789
+ dependencies:
790
+ "@typescript-eslint/types" "8.25.0"
791
+ "@typescript-eslint/visitor-keys" "8.25.0"
792
+ debug "^4.3.4"
793
+ fast-glob "^3.3.2"
794
+ is-glob "^4.0.3"
795
+ minimatch "^9.0.4"
796
+ semver "^7.6.0"
797
+ ts-api-utils "^2.0.1"
798
+
799
+ "@typescript-eslint/utils@8.25.0":
800
+ version "8.25.0"
801
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.25.0.tgz#3ea2f9196a915ef4daa2c8eafd44adbd7d56d08a"
802
+ integrity sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==
803
+ dependencies:
804
+ "@eslint-community/eslint-utils" "^4.4.0"
805
+ "@typescript-eslint/scope-manager" "8.25.0"
806
+ "@typescript-eslint/types" "8.25.0"
807
+ "@typescript-eslint/typescript-estree" "8.25.0"
808
+
809
+ "@typescript-eslint/visitor-keys@8.25.0":
810
+ version "8.25.0"
811
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz#e8646324cd1793f96e02669cb717a05319403164"
812
+ integrity sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==
813
+ dependencies:
814
+ "@typescript-eslint/types" "8.25.0"
815
+ eslint-visitor-keys "^4.2.0"
816
+
715
817
  "@vitejs/plugin-react@^4.3.4":
716
818
  version "4.3.4"
717
819
  resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz#c64be10b54c4640135a5b28a2432330e88ad7c20"
@@ -791,6 +893,20 @@ brace-expansion@^1.1.7:
791
893
  balanced-match "^1.0.0"
792
894
  concat-map "0.0.1"
793
895
 
896
+ brace-expansion@^2.0.1:
897
+ version "2.0.1"
898
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
899
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
900
+ dependencies:
901
+ balanced-match "^1.0.0"
902
+
903
+ braces@^3.0.3:
904
+ version "3.0.3"
905
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
906
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
907
+ dependencies:
908
+ fill-range "^7.1.1"
909
+
794
910
  browserslist@^4.24.0:
795
911
  version "4.24.4"
796
912
  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b"
@@ -897,7 +1013,7 @@ cuint@^0.2.2:
897
1013
  resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
898
1014
  integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==
899
1015
 
900
- debug@^4.1.0, debug@^4.3.1, debug@^4.3.2:
1016
+ debug@^4.1.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
901
1017
  version "4.4.0"
902
1018
  resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a"
903
1019
  integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==
@@ -968,6 +1084,11 @@ escape-string-regexp@^4.0.0:
968
1084
  resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
969
1085
  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
970
1086
 
1087
+ eslint-plugin-react-hooks@^5.1.0:
1088
+ version "5.1.0"
1089
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz#3d34e37d5770866c34b87d5b499f5f0b53bf0854"
1090
+ integrity sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==
1091
+
971
1092
  eslint-scope@^8.2.0:
972
1093
  version "8.2.0"
973
1094
  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442"
@@ -1064,6 +1185,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
1064
1185
  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
1065
1186
  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
1066
1187
 
1188
+ fast-glob@^3.3.2:
1189
+ version "3.3.3"
1190
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
1191
+ integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
1192
+ dependencies:
1193
+ "@nodelib/fs.stat" "^2.0.2"
1194
+ "@nodelib/fs.walk" "^1.2.3"
1195
+ glob-parent "^5.1.2"
1196
+ merge2 "^1.3.0"
1197
+ micromatch "^4.0.8"
1198
+
1067
1199
  fast-json-patch@^3.1.1:
1068
1200
  version "3.1.1"
1069
1201
  resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947"
@@ -1079,6 +1211,13 @@ fast-levenshtein@^2.0.6:
1079
1211
  resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
1080
1212
  integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
1081
1213
 
1214
+ fastq@^1.6.0:
1215
+ version "1.19.1"
1216
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5"
1217
+ integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==
1218
+ dependencies:
1219
+ reusify "^1.0.4"
1220
+
1082
1221
  fflate@^0.8.2:
1083
1222
  version "0.8.2"
1084
1223
  resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea"
@@ -1091,6 +1230,13 @@ file-entry-cache@^8.0.0:
1091
1230
  dependencies:
1092
1231
  flat-cache "^4.0.0"
1093
1232
 
1233
+ fill-range@^7.1.1:
1234
+ version "7.1.1"
1235
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
1236
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
1237
+ dependencies:
1238
+ to-regex-range "^5.0.1"
1239
+
1094
1240
  filtrex@^3.1.0:
1095
1241
  version "3.1.0"
1096
1242
  resolved "https://registry.yarnpkg.com/filtrex/-/filtrex-3.1.0.tgz#5ec00994615ff10e5e09c89bb290c855cb408c21"
@@ -1127,6 +1273,13 @@ gensync@^1.0.0-beta.2:
1127
1273
  resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
1128
1274
  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
1129
1275
 
1276
+ glob-parent@^5.1.2:
1277
+ version "5.1.2"
1278
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
1279
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
1280
+ dependencies:
1281
+ is-glob "^4.0.1"
1282
+
1130
1283
  glob-parent@^6.0.2:
1131
1284
  version "6.0.2"
1132
1285
  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
@@ -1156,6 +1309,11 @@ good-listener@^1.2.2:
1156
1309
  dependencies:
1157
1310
  delegate "^3.1.2"
1158
1311
 
1312
+ graphemer@^1.4.0:
1313
+ version "1.4.0"
1314
+ resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
1315
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
1316
+
1159
1317
  has-flag@^4.0.0:
1160
1318
  version "4.0.0"
1161
1319
  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
@@ -1166,7 +1324,7 @@ htm@^3.1.1:
1166
1324
  resolved "https://registry.yarnpkg.com/htm/-/htm-3.1.1.tgz#49266582be0dc66ed2235d5ea892307cc0c24b78"
1167
1325
  integrity sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==
1168
1326
 
1169
- ignore@^5.2.0:
1327
+ ignore@^5.2.0, ignore@^5.3.1:
1170
1328
  version "5.3.2"
1171
1329
  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
1172
1330
  integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
@@ -1189,13 +1347,18 @@ is-extglob@^2.1.1:
1189
1347
  resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
1190
1348
  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
1191
1349
 
1192
- is-glob@^4.0.0, is-glob@^4.0.3:
1350
+ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
1193
1351
  version "4.0.3"
1194
1352
  resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
1195
1353
  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
1196
1354
  dependencies:
1197
1355
  is-extglob "^2.1.1"
1198
1356
 
1357
+ is-number@^7.0.0:
1358
+ version "7.0.0"
1359
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
1360
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
1361
+
1199
1362
  isexe@^2.0.0:
1200
1363
  version "2.0.0"
1201
1364
  resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
@@ -1317,6 +1480,19 @@ mdurl@^2.0.0:
1317
1480
  resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0"
1318
1481
  integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==
1319
1482
 
1483
+ merge2@^1.3.0:
1484
+ version "1.4.1"
1485
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
1486
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
1487
+
1488
+ micromatch@^4.0.8:
1489
+ version "4.0.8"
1490
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
1491
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
1492
+ dependencies:
1493
+ braces "^3.0.3"
1494
+ picomatch "^2.3.1"
1495
+
1320
1496
  mime@~2.5.2:
1321
1497
  version "2.5.2"
1322
1498
  resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
@@ -1329,6 +1505,13 @@ minimatch@^3.1.2:
1329
1505
  dependencies:
1330
1506
  brace-expansion "^1.1.7"
1331
1507
 
1508
+ minimatch@^9.0.4:
1509
+ version "9.0.5"
1510
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
1511
+ integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
1512
+ dependencies:
1513
+ brace-expansion "^2.0.1"
1514
+
1332
1515
  minimatch@~3.0.4:
1333
1516
  version "3.0.8"
1334
1517
  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
@@ -1409,6 +1592,11 @@ picocolors@^1.0.0, picocolors@^1.1.1:
1409
1592
  resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
1410
1593
  integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
1411
1594
 
1595
+ picomatch@^2.3.1:
1596
+ version "2.3.1"
1597
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
1598
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
1599
+
1412
1600
  postcss-url@^10.1.3:
1413
1601
  version "10.1.3"
1414
1602
  resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-10.1.3.tgz#54120cc910309e2475ec05c2cfa8f8a2deafdf1e"
@@ -1453,6 +1641,11 @@ punycode@^2.1.0:
1453
1641
  resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
1454
1642
  integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
1455
1643
 
1644
+ queue-microtask@^1.2.2:
1645
+ version "1.2.3"
1646
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
1647
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
1648
+
1456
1649
  react-dom@^19.0.0:
1457
1650
  version "19.0.0"
1458
1651
  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.0.0.tgz#43446f1f01c65a4cd7f7588083e686a6726cfb57"
@@ -1465,6 +1658,11 @@ react-refresh@^0.14.2:
1465
1658
  resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9"
1466
1659
  integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==
1467
1660
 
1661
+ react-virtuoso@^4.12.5:
1662
+ version "4.12.5"
1663
+ resolved "https://registry.yarnpkg.com/react-virtuoso/-/react-virtuoso-4.12.5.tgz#cf92efc2527e56d6df1d4d63c6e4dd3fac5a4030"
1664
+ integrity sha512-YeCbRRsC9CLf0buD0Rct7WsDbzf+yBU1wGbo05/XjbcN2nJuhgh040m3y3+6HVogTZxEqVm45ac9Fpae4/MxRQ==
1665
+
1468
1666
  react@^19.0.0:
1469
1667
  version "19.0.0"
1470
1668
  resolved "https://registry.yarnpkg.com/react/-/react-19.0.0.tgz#6e1969251b9f108870aa4bff37a0ce9ddfaaabdd"
@@ -1480,6 +1678,11 @@ resolve-from@^4.0.0:
1480
1678
  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
1481
1679
  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
1482
1680
 
1681
+ reusify@^1.0.4:
1682
+ version "1.1.0"
1683
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f"
1684
+ integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
1685
+
1483
1686
  rollup@^4.20.0:
1484
1687
  version "4.31.0"
1485
1688
  resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.31.0.tgz#b84af969a0292cb047dce2c0ec5413a9457597a4"
@@ -1508,6 +1711,13 @@ rollup@^4.20.0:
1508
1711
  "@rollup/rollup-win32-x64-msvc" "4.31.0"
1509
1712
  fsevents "~2.3.2"
1510
1713
 
1714
+ run-parallel@^1.1.9:
1715
+ version "1.2.0"
1716
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
1717
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
1718
+ dependencies:
1719
+ queue-microtask "^1.2.2"
1720
+
1511
1721
  scheduler@^0.25.0:
1512
1722
  version "0.25.0"
1513
1723
  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.25.0.tgz#336cd9768e8cceebf52d3c80e3dcf5de23e7e015"
@@ -1523,6 +1733,11 @@ semver@^6.0.0, semver@^6.3.1:
1523
1733
  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
1524
1734
  integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
1525
1735
 
1736
+ semver@^7.6.0:
1737
+ version "7.7.1"
1738
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
1739
+ integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
1740
+
1526
1741
  seroval-plugins@^1.1.0:
1527
1742
  version "1.2.0"
1528
1743
  resolved "https://registry.yarnpkg.com/seroval-plugins/-/seroval-plugins-1.2.0.tgz#7fcf8537938e0446f843897172fc64f01322c33f"
@@ -1581,6 +1796,18 @@ tiny-emitter@^2.0.0:
1581
1796
  resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423"
1582
1797
  integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==
1583
1798
 
1799
+ to-regex-range@^5.0.1:
1800
+ version "5.0.1"
1801
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1802
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1803
+ dependencies:
1804
+ is-number "^7.0.0"
1805
+
1806
+ ts-api-utils@^2.0.1:
1807
+ version "2.0.1"
1808
+ resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.1.tgz#660729385b625b939aaa58054f45c058f33f10cd"
1809
+ integrity sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==
1810
+
1584
1811
  type-check@^0.4.0, type-check@~0.4.0:
1585
1812
  version "0.4.0"
1586
1813
  resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@@ -1588,6 +1815,15 @@ type-check@^0.4.0, type-check@~0.4.0:
1588
1815
  dependencies:
1589
1816
  prelude-ls "^1.2.1"
1590
1817
 
1818
+ typescript-eslint@^8.25.0:
1819
+ version "8.25.0"
1820
+ resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.25.0.tgz#73047c157cd70ee93cf2f9243f1599d21cf60239"
1821
+ integrity sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==
1822
+ dependencies:
1823
+ "@typescript-eslint/eslint-plugin" "8.25.0"
1824
+ "@typescript-eslint/parser" "8.25.0"
1825
+ "@typescript-eslint/utils" "8.25.0"
1826
+
1591
1827
  typescript@^5.7.3:
1592
1828
  version "5.7.3"
1593
1829
  resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.3.tgz#919b44a7dbb8583a9b856d162be24a54bf80073e"
@@ -41,6 +41,7 @@ from ._transcript import (
41
41
  ModelEvent,
42
42
  SampleInitEvent,
43
43
  SampleLimitEvent,
44
+ SandboxEvent,
44
45
  ScoreEvent,
45
46
  StateEvent,
46
47
  StepEvent,
@@ -82,6 +83,7 @@ __all__ = [
82
83
  "ModelEvent",
83
84
  "SampleInitEvent",
84
85
  "SampleLimitEvent",
86
+ "SandboxEvent",
85
87
  "ScoreEvent",
86
88
  "StateEvent",
87
89
  "StepEvent",
@@ -10,6 +10,7 @@ from inspect_ai._util.content import (
10
10
  Content,
11
11
  ContentAudio,
12
12
  ContentImage,
13
+ ContentReasoning,
13
14
  ContentText,
14
15
  ContentVideo,
15
16
  )
@@ -217,6 +218,7 @@ def walk_model_call(
217
218
  return ModelCall(
218
219
  request=walk_json_dict(call.request, content_fn),
219
220
  response=walk_json_dict(call.response, content_fn),
221
+ time=call.time,
220
222
  )
221
223
  else:
222
224
  return None
@@ -314,3 +316,5 @@ def walk_content(content: Content, content_fn: Callable[[str], str]) -> Content:
314
316
  return content.model_copy(update=dict(audio=content_fn(content.audio)))
315
317
  elif isinstance(content, ContentVideo):
316
318
  return content.model_copy(update=dict(video=content_fn(content.video)))
319
+ elif isinstance(content, ContentReasoning):
320
+ return content.model_copy(update=dict(reasoning=content_fn(content.reasoning)))
inspect_ai/log/_log.py CHANGED
@@ -4,7 +4,7 @@ import sys
4
4
  import traceback
5
5
  from logging import getLogger
6
6
  from types import TracebackType
7
- from typing import Any, Literal, Type, TypedDict
7
+ from typing import Any, Literal, Tuple, Type, TypedDict
8
8
 
9
9
  import click
10
10
  import tenacity
@@ -86,13 +86,16 @@ class EvalConfig(BaseModel):
86
86
  """
87
87
 
88
88
  message_limit: int | None = Field(default=None)
89
- """Maximum messages to allow in a chat conversation."""
89
+ """Maximum messages to allow per sample."""
90
90
 
91
91
  token_limit: int | None = Field(default=None)
92
- """Maximum tokens to allow in a chat conversation."""
92
+ """Maximum tokens usage per sample."""
93
93
 
94
94
  time_limit: int | None = Field(default=None)
95
- """Maximum seconds for chat conversation."""
95
+ """Maximum clock time per sample."""
96
+
97
+ working_limit: int | None = Field(default=None)
98
+ """Meximum working time per sample."""
96
99
 
97
100
  max_samples: int | None = Field(default=None)
98
101
  """Maximum number of samples to run in parallel."""
@@ -141,7 +144,9 @@ class EvalConfig(BaseModel):
141
144
  class EvalSampleLimit(BaseModel):
142
145
  """Limit encontered by sample."""
143
146
 
144
- type: Literal["context", "time", "message", "token", "operator", "custom"]
147
+ type: Literal[
148
+ "context", "time", "working", "message", "token", "operator", "custom"
149
+ ]
145
150
  """The type of limit"""
146
151
 
147
152
  limit: int
@@ -218,6 +223,15 @@ class EvalSample(BaseModel):
218
223
  model_usage: dict[str, ModelUsage] = Field(default_factory=dict)
219
224
  """Model token usage for sample."""
220
225
 
226
+ total_time: float | None = Field(default=None)
227
+ """Total time that the sample was running."""
228
+
229
+ working_time: float | None = Field(default=None)
230
+ """Time spent working (model generation, sandbox calls, etc.)"""
231
+
232
+ uuid: str | None = Field(default=None)
233
+ """Globally unique identifier for sample run (exists for samples created in Inspect >= 0.3.70)"""
234
+
221
235
  error: EvalError | None = Field(default=None)
222
236
  """Error that halted sample."""
223
237
 
@@ -601,14 +615,15 @@ def eval_error(
601
615
  exc_traceback: TracebackType | None,
602
616
  ) -> EvalError:
603
617
  # get text traceback
604
- traceback_text = "\n".join(
605
- traceback.format_exception(exc_type, exc_value, exc_traceback)
606
- )
618
+ traceback_text, truncated = truncate_traceback(exc_type, exc_value, exc_traceback)
607
619
 
608
- with open(os.devnull, "w") as f:
609
- console = Console(record=True, file=f, legacy_windows=True)
610
- console.print(rich_traceback(exc_type, exc_value, exc_traceback))
611
- traceback_ansi = console.export_text(styles=True)
620
+ if not truncated:
621
+ with open(os.devnull, "w") as f:
622
+ console = Console(record=True, file=f, legacy_windows=True)
623
+ console.print(rich_traceback(exc_type, exc_value, exc_traceback))
624
+ traceback_ansi = console.export_text(styles=True)
625
+ else:
626
+ traceback_ansi = traceback_text
612
627
 
613
628
  # return error
614
629
  return EvalError(
@@ -632,6 +647,51 @@ def rich_traceback(
632
647
  return rich_tb
633
648
 
634
649
 
650
+ def truncate_traceback(
651
+ exc_type: Type[Any],
652
+ exc_value: BaseException,
653
+ exc_traceback: TracebackType | None,
654
+ max_length: int = 1048576, # 1MB
655
+ ) -> Tuple[str, bool]:
656
+ tb_list = traceback.format_exception(exc_type, exc_value, exc_traceback)
657
+
658
+ # Keep the front and back of the traceback
659
+ header = tb_list[0]
660
+ error_msg = tb_list[-1]
661
+
662
+ # Join the middle parts (stack frames)
663
+ frames = "".join(tb_list[1:-1])
664
+
665
+ # It all fits, use it as is
666
+ full_tb = header + frames + error_msg
667
+ if len(full_tb) <= max_length:
668
+ return full_tb, False
669
+
670
+ ellipsis = "\n...\n"
671
+
672
+ # Minimum header size
673
+ header_size = min(len(header), 1024)
674
+
675
+ # Minimum frames size
676
+ frames_size = min(len(frames), 1024)
677
+
678
+ # Remaining space for error message
679
+ error_msg_size = max(0, max_length - header_size - frames_size)
680
+
681
+ def truncate_middle(text: str, size: int) -> str:
682
+ if len(text) <= size:
683
+ return text
684
+ half = (size - len(ellipsis)) // 2
685
+ return f"{text[:half]}{ellipsis}{text[-half:]}"
686
+
687
+ # Truncate each part as needed
688
+ truncated_header = truncate_middle(header, header_size)
689
+ truncated_frames = truncate_middle(frames, frames_size)
690
+ truncated_error = truncate_middle(error_msg, error_msg_size)
691
+
692
+ return truncated_header + truncated_frames + truncated_error, True
693
+
694
+
635
695
  class EvalStats(BaseModel):
636
696
  """Timing and usage statistics."""
637
697