inspect-ai 0.3.90__py3-none-any.whl → 0.3.92__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 (370) hide show
  1. inspect_ai/_cli/common.py +13 -0
  2. inspect_ai/_cli/eval.py +44 -0
  3. inspect_ai/_display/textual/widgets/samples.py +49 -4
  4. inspect_ai/_display/textual/widgets/vscode.py +4 -2
  5. inspect_ai/_eval/eval.py +41 -28
  6. inspect_ai/_eval/evalset.py +4 -0
  7. inspect_ai/_eval/loader.py +4 -5
  8. inspect_ai/_eval/registry.py +1 -1
  9. inspect_ai/_eval/run.py +6 -3
  10. inspect_ai/_eval/task/log.py +6 -0
  11. inspect_ai/_eval/task/run.py +108 -41
  12. inspect_ai/_eval/task/sandbox.py +19 -5
  13. inspect_ai/_util/_async.py +1 -1
  14. inspect_ai/_util/constants.py +1 -0
  15. inspect_ai/_util/environ.py +32 -0
  16. inspect_ai/_util/file.py +8 -1
  17. inspect_ai/_util/httpx.py +105 -22
  18. inspect_ai/_util/registry.py +83 -9
  19. inspect_ai/_util/text.py +81 -17
  20. inspect_ai/_util/transcript.py +9 -6
  21. inspect_ai/_util/vscode.py +7 -2
  22. inspect_ai/_view/schema.py +1 -1
  23. inspect_ai/_view/www/babel.config.js +11 -0
  24. inspect_ai/_view/www/dist/assets/index.css +3640 -3563
  25. inspect_ai/_view/www/dist/assets/index.js +59204 -52519
  26. inspect_ai/_view/www/eslint.config.mjs +10 -1
  27. inspect_ai/_view/www/jest.config.mjs +21 -0
  28. inspect_ai/_view/www/log-schema.json +111 -2
  29. inspect_ai/_view/www/package.json +19 -5
  30. inspect_ai/_view/www/src/{types → @types}/log.d.ts +95 -32
  31. inspect_ai/_view/www/{App.css → src/app/App.css} +22 -14
  32. inspect_ai/_view/www/src/app/App.tsx +168 -0
  33. inspect_ai/_view/www/src/{AppErrorBoundary.tsx → app/AppErrorBoundary.tsx} +1 -1
  34. inspect_ai/_view/www/src/{appearance → app/appearance}/icons.ts +1 -0
  35. inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.tsx +5 -5
  36. inspect_ai/_view/www/src/{workspace/WorkSpaceView.tsx → app/log-view/LogView.tsx} +59 -40
  37. inspect_ai/_view/www/src/app/log-view/LogViewContainer.tsx +159 -0
  38. inspect_ai/_view/www/src/app/log-view/LogViewLayout.tsx +109 -0
  39. inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.tsx +3 -3
  40. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.tsx +1 -1
  41. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.tsx +4 -4
  42. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.tsx +8 -8
  43. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.tsx +6 -6
  44. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.tsx +1 -1
  45. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.tsx +1 -1
  46. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.tsx +8 -8
  47. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.tsx +35 -6
  48. inspect_ai/_view/www/src/app/log-view/tabs/JsonTab.tsx +136 -0
  49. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/SamplesTab.tsx +82 -73
  50. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/grouping.ts +3 -3
  51. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/types.ts +1 -1
  52. inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.tsx +2 -2
  53. inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.tsx +1 -1
  54. inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.tsx +4 -4
  55. inspect_ai/_view/www/src/{plan → app/plan}/PlanCard.tsx +2 -2
  56. inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.tsx +5 -5
  57. inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.tsx +1 -1
  58. inspect_ai/_view/www/src/app/routing/AppRouter.tsx +58 -0
  59. inspect_ai/_view/www/src/app/routing/navigationHooks.ts +182 -0
  60. inspect_ai/_view/www/src/app/routing/url.ts +43 -0
  61. inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.tsx +11 -27
  62. inspect_ai/_view/www/src/{samples → app/samples}/SampleDialog.tsx +36 -40
  63. inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.module.css +4 -0
  64. inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.tsx +116 -49
  65. inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.module.css +1 -1
  66. inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.tsx +29 -26
  67. inspect_ai/_view/www/src/{samples → app/samples}/SamplesTools.tsx +3 -3
  68. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.module.css +5 -2
  69. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.tsx +12 -4
  70. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRenderer.tsx +3 -3
  71. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.tsx +6 -1
  72. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatView.tsx +4 -2
  73. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.tsx +5 -3
  74. inspect_ai/_view/www/src/app/samples/chat/MessageContent.module.css +12 -0
  75. inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContent.tsx +11 -10
  76. inspect_ai/_view/www/src/app/samples/chat/MessageContents.module.css +7 -0
  77. inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContents.tsx +14 -8
  78. inspect_ai/_view/www/src/{samples → app/samples}/chat/messages.ts +2 -2
  79. inspect_ai/_view/www/src/app/samples/chat/tools/ToolCallView.module.css +7 -0
  80. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolCallView.tsx +26 -27
  81. inspect_ai/_view/www/src/app/samples/chat/tools/ToolInput.module.css +19 -0
  82. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolInput.tsx +3 -3
  83. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.module.css +1 -0
  84. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.tsx +1 -1
  85. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.module.css +4 -0
  86. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.tsx +2 -2
  87. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/tool.ts +1 -1
  88. inspect_ai/_view/www/src/app/samples/chat/types.ts +1 -0
  89. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/samplesDescriptor.tsx +38 -15
  90. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.tsx +1 -1
  91. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/CategoricalScoreDescriptor.tsx +2 -2
  92. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/NumericScoreDescriptor.tsx +3 -3
  93. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.tsx +4 -4
  94. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/OtherScoreDescriptor.tsx +2 -2
  95. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.tsx +2 -2
  96. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ScoreDescriptor.tsx +1 -1
  97. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/types.ts +4 -3
  98. inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.module.css +2 -1
  99. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.tsx +3 -0
  100. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.tsx +47 -33
  101. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.module.css +16 -0
  102. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.tsx +47 -20
  103. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.tsx +1 -1
  104. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.tsx +4 -4
  105. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/filters.ts +8 -6
  106. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.tsx +4 -3
  107. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/completions.ts +1 -1
  108. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/language.ts +1 -0
  109. inspect_ai/_view/www/src/{samples → app/samples}/sampleDataAdapter.ts +3 -3
  110. inspect_ai/_view/www/src/{samples → app/samples}/sampleLimit.ts +1 -1
  111. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.tsx +1 -1
  112. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.tsx +12 -11
  113. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.tsx +6 -6
  114. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ApprovalEventView.tsx +1 -1
  115. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ErrorEventView.tsx +3 -3
  116. inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.tsx +4 -4
  117. inspect_ai/_view/www/src/{samples → app/samples}/transcript/InputEventView.tsx +3 -3
  118. inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.tsx +3 -3
  119. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.module.css +13 -7
  120. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.tsx +49 -21
  121. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.tsx +11 -9
  122. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleLimitEventView.tsx +1 -1
  123. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.tsx +8 -6
  124. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.tsx +4 -4
  125. inspect_ai/_view/www/src/{samples → app/samples}/transcript/StepEventView.tsx +11 -3
  126. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.tsx +2 -2
  127. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.tsx +2 -2
  128. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.module.css +8 -7
  129. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.tsx +32 -114
  130. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.module.css +6 -5
  131. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.tsx +14 -2
  132. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.tsx +2 -2
  133. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.tsx +1 -1
  134. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/utils.ts +1 -1
  135. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenderers.tsx +23 -21
  136. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenders.module.css +7 -0
  137. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.tsx +2 -2
  138. inspect_ai/_view/www/src/app/samples/transcript/transform/fixups.ts +142 -0
  139. inspect_ai/_view/www/src/app/samples/transcript/transform/treeify.ts +39 -0
  140. inspect_ai/_view/www/src/{samples → app/samples}/transcript/types.ts +1 -1
  141. inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.tsx +1 -1
  142. inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.module.css +16 -0
  143. inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.tsx +70 -0
  144. inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.module.css +8 -0
  145. inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.tsx +35 -17
  146. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.tsx +1 -1
  147. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.tsx +2 -2
  148. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.tsx +2 -2
  149. inspect_ai/_view/www/src/{types.ts → app/types.ts} +18 -11
  150. inspect_ai/_view/www/src/{usage → app/usage}/ModelTokenTable.tsx +1 -1
  151. inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.tsx +2 -2
  152. inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.tsx +1 -1
  153. inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.tsx +6 -6
  154. inspect_ai/_view/www/src/{api → client/api}/api-browser.ts +2 -2
  155. inspect_ai/_view/www/src/{api → client/api}/api-http.ts +3 -3
  156. inspect_ai/_view/www/src/{api → client/api}/api-vscode.ts +2 -2
  157. inspect_ai/_view/www/src/{api → client/api}/client-api.ts +6 -5
  158. inspect_ai/_view/www/src/{api → client/api}/index.ts +2 -2
  159. inspect_ai/_view/www/src/{api → client/api}/types.ts +4 -1
  160. inspect_ai/_view/www/src/{logfile → client/remote}/remoteLogFile.ts +3 -3
  161. inspect_ai/_view/www/src/{storage → client/storage}/index.ts +11 -5
  162. inspect_ai/_view/www/src/components/Card.tsx +1 -1
  163. inspect_ai/_view/www/src/components/CopyButton.tsx +1 -1
  164. inspect_ai/_view/www/src/components/DownloadButton.tsx +1 -1
  165. inspect_ai/_view/www/src/components/ErrorPanel.tsx +1 -1
  166. inspect_ai/_view/www/src/components/{ExpandablePanel.css → ExpandablePanel.module.css} +14 -11
  167. inspect_ai/_view/www/src/components/ExpandablePanel.tsx +16 -10
  168. inspect_ai/_view/www/src/components/FindBand.tsx +1 -1
  169. inspect_ai/_view/www/src/components/JsonPanel.css +2 -2
  170. inspect_ai/_view/www/src/components/LargeModal.tsx +12 -1
  171. inspect_ai/_view/www/src/components/LightboxCarousel.tsx +1 -1
  172. inspect_ai/_view/www/src/components/MarkdownDiv.tsx +3 -1
  173. inspect_ai/_view/www/src/components/MessageBand.tsx +1 -1
  174. inspect_ai/_view/www/src/components/NoContentsPanel.tsx +1 -1
  175. inspect_ai/_view/www/src/constants.ts +10 -9
  176. inspect_ai/_view/www/src/index.tsx +27 -11
  177. inspect_ai/_view/www/src/state/appSlice.ts +44 -5
  178. inspect_ai/_view/www/src/state/hooks.ts +30 -7
  179. inspect_ai/_view/www/src/state/logSlice.ts +7 -5
  180. inspect_ai/_view/www/src/state/logsPolling.ts +1 -1
  181. inspect_ai/_view/www/src/state/logsSlice.ts +18 -13
  182. inspect_ai/_view/www/src/state/samplePolling.ts +12 -12
  183. inspect_ai/_view/www/src/state/sampleSlice.ts +3 -5
  184. inspect_ai/_view/www/src/state/sampleUtils.ts +1 -1
  185. inspect_ai/_view/www/src/{scoring/utils.ts → state/scoring.ts} +2 -2
  186. inspect_ai/_view/www/src/state/store.ts +9 -7
  187. inspect_ai/_view/www/src/state/utils.ts +1 -1
  188. inspect_ai/_view/www/src/tests/README.md +49 -0
  189. inspect_ai/_view/www/src/tests/__mocks__/fileMock.js +1 -0
  190. inspect_ai/_view/www/src/tests/__mocks__/styleMock.js +1 -0
  191. inspect_ai/_view/www/src/tests/setupTests.mjs +1 -0
  192. inspect_ai/_view/www/src/tests/utils/base64.test.ts +23 -0
  193. inspect_ai/_view/www/src/tests/utils/format.test.ts +127 -0
  194. inspect_ai/_view/www/src/tests/utils/path.test.ts +54 -0
  195. inspect_ai/_view/www/src/utils/format.ts +8 -2
  196. inspect_ai/_view/www/src/utils/path.ts +14 -2
  197. inspect_ai/_view/www/src/utils/polling.ts +1 -2
  198. inspect_ai/_view/www/src/utils/uri.ts +32 -0
  199. inspect_ai/_view/www/yarn.lock +3310 -382
  200. inspect_ai/agent/_handoff.py +6 -3
  201. inspect_ai/agent/_human/agent.py +5 -3
  202. inspect_ai/agent/_human/install.py +16 -7
  203. inspect_ai/agent/_human/panel.py +14 -1
  204. inspect_ai/agent/_human/service.py +5 -1
  205. inspect_ai/agent/_react.py +161 -128
  206. inspect_ai/agent/_types.py +15 -4
  207. inspect_ai/approval/_policy.py +2 -2
  208. inspect_ai/log/_file.py +30 -11
  209. inspect_ai/log/_log.py +7 -1
  210. inspect_ai/log/_recorders/eval.py +3 -0
  211. inspect_ai/log/_recorders/types.py +1 -0
  212. inspect_ai/log/_samples.py +4 -0
  213. inspect_ai/model/_call_tools.py +33 -17
  214. inspect_ai/model/_generate_config.py +10 -2
  215. inspect_ai/model/_model.py +41 -21
  216. inspect_ai/model/_model_output.py +2 -1
  217. inspect_ai/model/_openai.py +10 -8
  218. inspect_ai/model/_openai_responses.py +95 -42
  219. inspect_ai/model/_providers/anthropic.py +14 -12
  220. inspect_ai/model/_providers/google.py +191 -95
  221. inspect_ai/model/_providers/hf.py +1 -1
  222. inspect_ai/model/_providers/mistral.py +2 -3
  223. inspect_ai/model/_providers/openai.py +54 -17
  224. inspect_ai/model/_providers/openai_o1.py +1 -1
  225. inspect_ai/model/_providers/openai_responses.py +28 -16
  226. inspect_ai/model/_providers/openrouter.py +14 -0
  227. inspect_ai/model/_providers/providers.py +2 -2
  228. inspect_ai/model/_providers/util/chatapi.py +17 -7
  229. inspect_ai/model/_providers/vllm.py +1 -1
  230. inspect_ai/scorer/_metric.py +17 -1
  231. inspect_ai/scorer/_model.py +51 -6
  232. inspect_ai/scorer/_scorer.py +1 -1
  233. inspect_ai/solver/_human_agent.py +3 -0
  234. inspect_ai/solver/_plan.py +1 -1
  235. inspect_ai/solver/_solver.py +1 -1
  236. inspect_ai/solver/_use_tools.py +14 -8
  237. inspect_ai/tool/__init__.py +16 -1
  238. inspect_ai/tool/_json_rpc_helpers.py +285 -0
  239. inspect_ai/tool/_mcp/__init__.py +13 -0
  240. inspect_ai/tool/_mcp/_context.py +14 -0
  241. inspect_ai/tool/_mcp/_mcp.py +293 -0
  242. inspect_ai/tool/_mcp/_sandbox.py +104 -0
  243. inspect_ai/tool/_mcp/_types.py +31 -0
  244. inspect_ai/tool/_mcp/connection.py +60 -0
  245. inspect_ai/tool/_mcp/sampling.py +118 -0
  246. inspect_ai/tool/_mcp/server.py +112 -0
  247. inspect_ai/tool/_mcp/tools.py +34 -0
  248. inspect_ai/tool/_tool.py +13 -0
  249. inspect_ai/tool/_tool_def.py +24 -7
  250. inspect_ai/tool/_tool_support_helpers.py +129 -153
  251. inspect_ai/tool/_tools/_bash_session.py +11 -11
  252. inspect_ai/tool/_tools/_text_editor.py +6 -6
  253. inspect_ai/tool/_tools/_web_browser/_web_browser.py +8 -8
  254. inspect_ai/util/_anyio.py +31 -20
  255. inspect_ai/util/_json.py +20 -2
  256. inspect_ai/util/_sandbox/context.py +18 -7
  257. inspect_ai/util/_sandbox/docker/compose.py +1 -1
  258. inspect_ai/util/_sandbox/docker/docker.py +92 -21
  259. inspect_ai/util/_sandbox/environment.py +33 -2
  260. inspect_ai/util/_sandbox/events.py +2 -2
  261. inspect_ai/util/_sandbox/service.py +13 -3
  262. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/METADATA +6 -2
  263. inspect_ai-0.3.92.dist-info/RECORD +732 -0
  264. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/WHEEL +1 -1
  265. inspect_ai/_view/www/src/App.tsx +0 -316
  266. inspect_ai/_view/www/src/samples/chat/MessageContent.module.css +0 -4
  267. inspect_ai/_view/www/src/samples/chat/MessageContents.module.css +0 -3
  268. inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.module.css +0 -3
  269. inspect_ai/_view/www/src/samples/chat/tools/ToolInput.module.css +0 -14
  270. inspect_ai/_view/www/src/workspace/WorkSpace.tsx +0 -292
  271. inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.module.css +0 -5
  272. inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.tsx +0 -57
  273. inspect_ai/_view/www/src/workspace/tabs/JsonTab.tsx +0 -43
  274. inspect_ai-0.3.90.dist-info/RECORD +0 -705
  275. /inspect_ai/_view/www/src/{types → @types}/asciicinema-player.d.ts +0 -0
  276. /inspect_ai/_view/www/src/{types → @types}/jsondiffpatch.d.ts +0 -0
  277. /inspect_ai/_view/www/src/{types → @types}/markdown-it-katex.d.ts +0 -0
  278. /inspect_ai/_view/www/src/{types → @types}/prism.d.ts +0 -0
  279. /inspect_ai/_view/www/src/{appearance → app/appearance}/colors.ts +0 -0
  280. /inspect_ai/_view/www/src/{appearance → app/appearance}/fonts.ts +0 -0
  281. /inspect_ai/_view/www/src/{appearance → app/appearance}/styles.ts +0 -0
  282. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataGrid.tsx +0 -0
  283. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.module.css +0 -0
  284. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.tsx +0 -0
  285. /inspect_ai/_view/www/src/{metadata → app/content}/MetadataGrid.module.css +0 -0
  286. /inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.module.css +0 -0
  287. /inspect_ai/_view/www/src/{metadata → app/content}/types.ts +0 -0
  288. /inspect_ai/_view/www/src/{workspace/WorkSpaceView.module.css → app/log-view/LogView.module.css} +0 -0
  289. /inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.module.css +0 -0
  290. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.module.css +0 -0
  291. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.module.css +0 -0
  292. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.module.css +0 -0
  293. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.module.css +0 -0
  294. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.module.css +0 -0
  295. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.module.css +0 -0
  296. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.module.css +0 -0
  297. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.module.css +0 -0
  298. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.tsx +0 -0
  299. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.module.css +0 -0
  300. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/JsonTab.module.css +0 -0
  301. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.module.css +0 -0
  302. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.tsx +0 -0
  303. /inspect_ai/_view/www/src/{workspace → app/log-view}/types.ts +0 -0
  304. /inspect_ai/_view/www/src/{workspace → app/log-view}/utils.ts +0 -0
  305. /inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.module.css +0 -0
  306. /inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.module.css +0 -0
  307. /inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.module.css +0 -0
  308. /inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.module.css +0 -0
  309. /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.module.css +0 -0
  310. /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.tsx +0 -0
  311. /inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.module.css +0 -0
  312. /inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.module.css +0 -0
  313. /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.module.css +0 -0
  314. /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.module.css +0 -0
  315. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.module.css +0 -0
  316. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.module.css +0 -0
  317. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.module.css +0 -0
  318. /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.module.css +0 -0
  319. /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.tsx +0 -0
  320. /inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.tsx +0 -0
  321. /inspect_ai/_view/www/src/{samples → app/samples}/error/error.ts +0 -0
  322. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.module.css +0 -0
  323. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.tsx +0 -0
  324. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.module.css +0 -0
  325. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.module.css +0 -0
  326. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.module.css +0 -0
  327. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.tsx +0 -0
  328. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.module.css +0 -0
  329. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.tsx +0 -0
  330. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.module.css +0 -0
  331. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.module.css +0 -0
  332. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.module.css +0 -0
  333. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/tokenize.ts +0 -0
  334. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.module.css +0 -0
  335. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.module.css +0 -0
  336. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.module.css +0 -0
  337. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.module.css +0 -0
  338. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.module.css +0 -0
  339. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.module.css +0 -0
  340. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.module.css +0 -0
  341. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.module.css +0 -0
  342. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.module.css +0 -0
  343. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.module.css +0 -0
  344. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.module.css +0 -0
  345. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.tsx +0 -0
  346. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.module.css +0 -0
  347. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.tsx +0 -0
  348. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.module.css +0 -0
  349. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.module.css +0 -0
  350. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.tsx +0 -0
  351. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.module.css +0 -0
  352. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.tsx +0 -0
  353. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.module.css +0 -0
  354. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.tsx +0 -0
  355. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.module.css +0 -0
  356. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateDiffView.tsx +0 -0
  357. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.module.css +0 -0
  358. /inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.module.css +0 -0
  359. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.module.css +0 -0
  360. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.module.css +0 -0
  361. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.module.css +0 -0
  362. /inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.module.css +0 -0
  363. /inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.module.css +0 -0
  364. /inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.module.css +0 -0
  365. /inspect_ai/_view/www/src/{api → client/api}/api-shared.ts +0 -0
  366. /inspect_ai/_view/www/src/{api → client/api}/jsonrpc.ts +0 -0
  367. /inspect_ai/_view/www/src/{logfile → client/remote}/remoteZipFile.ts +0 -0
  368. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/entry_points.txt +0 -0
  369. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/licenses/LICENSE +0 -0
  370. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/top_level.txt +0 -0
@@ -9,17 +9,18 @@ import {
9
9
  useRef,
10
10
  } from "react";
11
11
  import { Virtuoso, VirtuosoHandle } from "react-virtuoso";
12
- import { MessageBand } from "../../components/MessageBand";
13
- import { formatNoDecimal } from "../../utils/format";
14
- import { ListItem } from "../../workspace/tabs/types";
12
+ import { MessageBand } from "../../../components/MessageBand";
13
+ import { formatNoDecimal } from "../../../utils/format";
14
+ import { ListItem } from "../../log-view/tabs/types";
15
15
  import { SamplesDescriptor } from "../descriptor/samplesDescriptor";
16
16
  import { SampleRow } from "./SampleRow";
17
17
  import { SampleSeparator } from "./SampleSeparator";
18
18
 
19
19
  import clsx from "clsx";
20
- import { useProperty, useSampleDescriptor } from "../../state/hooks";
21
- import { useVirtuosoState } from "../../state/scrolling";
22
- import { useStore } from "../../state/store";
20
+ import { useProperty, useSampleDescriptor } from "../../../state/hooks";
21
+ import { useVirtuosoState } from "../../../state/scrolling";
22
+ import { useStore } from "../../../state/store";
23
+ import { useSampleNavigation } from "../../routing/navigationHooks";
23
24
  import { SampleFooter } from "./SampleFooter";
24
25
  import { SampleHeader } from "./SampleHeader";
25
26
  import styles from "./SampleList.module.css";
@@ -31,9 +32,6 @@ interface SampleListProps {
31
32
  items: ListItem[];
32
33
  totalItemCount: number;
33
34
  running: boolean;
34
- nextSample: () => void;
35
- prevSample: () => void;
36
- showSample: (index: number) => void;
37
35
  className?: string | string[];
38
36
  listHandle: RefObject<VirtuosoHandle | null>;
39
37
  }
@@ -41,22 +39,21 @@ interface SampleListProps {
41
39
  export const kSampleFollowProp = "sample-list";
42
40
 
43
41
  export const SampleList: FC<SampleListProps> = memo((props) => {
44
- const {
45
- items,
46
- totalItemCount,
47
- running,
48
- nextSample,
49
- prevSample,
50
- showSample,
51
- className,
52
- listHandle,
53
- } = props;
42
+ const { items, totalItemCount, running, className, listHandle } = props;
54
43
 
44
+ const selectedLogIndex = useStore((state) => state.logs.selectedLogIndex);
55
45
  const { getRestoreState, isScrolling } = useVirtuosoState(
56
46
  listHandle,
57
- "sample-list",
47
+ `sample-list-${selectedLogIndex}`,
58
48
  );
59
49
 
50
+ useEffect(() => {
51
+ listHandle.current?.scrollTo({ top: 0, behavior: "instant" });
52
+ }, [selectedLogIndex]);
53
+
54
+ // Get sample navigation utilities
55
+ const sampleNavigation = useSampleNavigation();
56
+
60
57
  const selectedSampleIndex = useStore(
61
58
  (state) => state.log.selectedSampleIndex,
62
59
  );
@@ -107,23 +104,28 @@ export const SampleList: FC<SampleListProps> = memo((props) => {
107
104
  (e: KeyboardEvent<HTMLDivElement>) => {
108
105
  switch (e.key) {
109
106
  case "ArrowUp":
110
- prevSample();
107
+ sampleNavigation.previousSample();
111
108
  e.preventDefault();
112
109
  e.stopPropagation();
113
110
  break;
114
111
  case "ArrowDown":
115
- nextSample();
112
+ sampleNavigation.nextSample();
116
113
  e.preventDefault();
117
114
  e.stopPropagation();
118
115
  break;
119
116
  case "Enter":
120
- showSample(selectedSampleIndex);
117
+ sampleNavigation.showSample(selectedSampleIndex);
121
118
  e.preventDefault();
122
119
  e.stopPropagation();
123
120
  break;
124
121
  }
125
122
  },
126
- [selectedSampleIndex, nextSample, prevSample, showSample],
123
+ [
124
+ selectedSampleIndex,
125
+ sampleNavigation.nextSample,
126
+ sampleNavigation.previousSample,
127
+ sampleNavigation.showSample,
128
+ ],
127
129
  );
128
130
 
129
131
  const gridColumnsTemplate = useMemo(() => {
@@ -143,7 +145,6 @@ export const SampleList: FC<SampleListProps> = memo((props) => {
143
145
  completed={item.completed}
144
146
  scoreRendered={item.scoreRendered}
145
147
  gridColumnsTemplate={gridColumnsTemplate}
146
- showSample={showSample}
147
148
  />
148
149
  );
149
150
  } else if (item.type === "separator") {
@@ -158,10 +159,11 @@ export const SampleList: FC<SampleListProps> = memo((props) => {
158
159
  return null;
159
160
  }
160
161
  },
161
- [showSample, gridColumnsTemplate],
162
+ [gridColumnsTemplate],
162
163
  );
163
164
 
164
- const { input, limit, answer, target } = gridColumns(samplesDescriptor);
165
+ const { input, limit, answer, target, retries } =
166
+ gridColumns(samplesDescriptor);
165
167
 
166
168
  const sampleCount = items?.reduce((prev, current) => {
167
169
  if (current.type === "sample") {
@@ -212,6 +214,7 @@ export const SampleList: FC<SampleListProps> = memo((props) => {
212
214
  target={target !== "0"}
213
215
  answer={answer !== "0"}
214
216
  limit={limit !== "0"}
217
+ retries={retries !== "0em"}
215
218
  gridColumnsTemplate={gridColumnsTemplate}
216
219
  />
217
220
  <Virtuoso
@@ -220,9 +223,13 @@ export const SampleList: FC<SampleListProps> = memo((props) => {
220
223
  data={items}
221
224
  defaultItemHeight={50}
222
225
  itemContent={renderRow}
223
- followOutput={(_atBottom: boolean) => {
224
- return followOutput;
225
- }}
226
+ followOutput={
227
+ running
228
+ ? (_atBottom: boolean) => {
229
+ return followOutput;
230
+ }
231
+ : undefined
232
+ }
226
233
  atBottomStateChange={handleAtBottomStateChange}
227
234
  atBottomThreshold={30}
228
235
  increaseViewportBy={{ top: 300, bottom: 300 }}
@@ -230,11 +237,12 @@ export const SampleList: FC<SampleListProps> = memo((props) => {
230
237
  main: 10,
231
238
  reverse: 10,
232
239
  }}
233
- className={clsx(className)}
240
+ className={clsx(className, "samples-list")}
234
241
  onKeyDown={onkeydown}
235
242
  skipAnimationFrameInResizeObserver={true}
236
243
  isScrolling={isScrolling}
237
244
  restoreStateFrom={getRestoreState()}
245
+ tabIndex={0}
238
246
  />
239
247
  <SampleFooter
240
248
  sampleCount={sampleCount}
@@ -246,9 +254,9 @@ export const SampleList: FC<SampleListProps> = memo((props) => {
246
254
  });
247
255
 
248
256
  const gridColumnsValue = (sampleDescriptor?: SamplesDescriptor) => {
249
- const { input, target, answer, limit, id, score } =
257
+ const { input, target, answer, limit, retries, id, score } =
250
258
  gridColumns(sampleDescriptor);
251
- return `${id} ${input} ${target} ${answer} ${limit} ${score}`;
259
+ return `${id} ${input} ${target} ${answer} ${limit} ${retries} ${score}`;
252
260
  };
253
261
 
254
262
  const gridColumns = (sampleDescriptor?: SamplesDescriptor) => {
@@ -268,6 +276,11 @@ const gridColumns = (sampleDescriptor?: SamplesDescriptor) => {
268
276
  sampleDescriptor && sampleDescriptor.messageShape.normalized.limit > 0
269
277
  ? Math.max(0.15, sampleDescriptor.messageShape.normalized.limit)
270
278
  : 0;
279
+ const retries =
280
+ sampleDescriptor && sampleDescriptor.messageShape.normalized.retries > 0
281
+ ? 4
282
+ : 0;
283
+
271
284
  const id = Math.max(
272
285
  2,
273
286
  Math.min(10, sampleDescriptor?.messageShape.raw.id || 0),
@@ -290,6 +303,7 @@ const gridColumns = (sampleDescriptor?: SamplesDescriptor) => {
290
303
  target: frSize(target),
291
304
  answer: frSize(answer),
292
305
  limit: frSize(limit),
306
+ retries: `${retries}em`,
293
307
  id: `${id}rem`,
294
308
  score: `${score}rem`,
295
309
  };
@@ -14,6 +14,17 @@
14
14
  box-shadow: inset 0 0 0px 2px var(--bs-focus-ring-color);
15
15
  }
16
16
 
17
+ .sampleRowLink {
18
+ text-decoration: none;
19
+ color: inherit;
20
+ display: block;
21
+ }
22
+
23
+ .disabled {
24
+ cursor: not-allowed;
25
+ opacity: 0.7;
26
+ }
27
+
17
28
  .cell {
18
29
  padding-left: 0;
19
30
  padding-right: 0;
@@ -32,6 +43,11 @@
32
43
  justify-self: center;
33
44
  }
34
45
 
46
+ .centered {
47
+ display: flex;
48
+ justify-content: center;
49
+ }
50
+
35
51
  .spinner {
36
52
  height: 1.4em;
37
53
  width: 1.4em;
@@ -1,10 +1,11 @@
1
1
  import clsx from "clsx";
2
- import { FC, ReactNode, useCallback } from "react";
3
- import { SampleSummary } from "../../api/types";
4
- import { MarkdownDiv } from "../../components/MarkdownDiv";
5
- import { PulsingDots } from "../../components/PulsingDots";
6
- import { useStore } from "../../state/store";
7
- import { arrayToString, inputString } from "../../utils/format";
2
+ import { FC, ReactNode } from "react";
3
+ import { SampleSummary } from "../../../client/api/types";
4
+ import { MarkdownDiv } from "../../../components/MarkdownDiv";
5
+ import { PulsingDots } from "../../../components/PulsingDots";
6
+ import { useStore } from "../../../state/store";
7
+ import { arrayToString, inputString } from "../../../utils/format";
8
+ import { useSampleNavigation } from "../../routing/navigationHooks";
8
9
  import { SampleErrorView } from "../error/SampleErrorView";
9
10
  import styles from "./SampleRow.module.css";
10
11
 
@@ -17,7 +18,6 @@ interface SampleRowProps {
17
18
  scoreRendered: ReactNode;
18
19
  gridColumnsTemplate: string;
19
20
  height: number;
20
- showSample: (index: number) => void;
21
21
  }
22
22
 
23
23
  export const SampleRow: FC<SampleRowProps> = ({
@@ -29,7 +29,6 @@ export const SampleRow: FC<SampleRowProps> = ({
29
29
  scoreRendered,
30
30
  gridColumnsTemplate,
31
31
  height,
32
- showSample,
33
32
  }) => {
34
33
  const streamSampleData = useStore(
35
34
  (state) => state.capabilities.streamSampleData,
@@ -37,20 +36,25 @@ export const SampleRow: FC<SampleRowProps> = ({
37
36
  const selectedSampleIndex = useStore(
38
37
  (state) => state.log.selectedSampleIndex,
39
38
  );
40
- const handleClick = useCallback(() => {
41
- if (completed || streamSampleData) {
42
- showSample(index);
43
- }
44
- }, [index, showSample, completed]);
39
+ // Determine if this sample can be viewed (completed or streaming)
40
+ const isViewable = completed || streamSampleData;
45
41
 
46
- return (
42
+ // Get sample navigation utilities
43
+ const sampleNavigation = useSampleNavigation();
44
+
45
+ // Use sample navigation hook to get sample URL
46
+ const sampleUrl = isViewable
47
+ ? sampleNavigation.getSampleUrl(sample.id, sample.epoch)
48
+ : undefined;
49
+
50
+ const rowContent = (
47
51
  <div
48
52
  id={`sample-${id}`}
49
- onClick={handleClick}
50
53
  className={clsx(
51
54
  styles.grid,
52
55
  "text-size-base",
53
56
  selectedSampleIndex === index ? styles.selected : undefined,
57
+ !isViewable && !sampleUrl ? styles.disabled : undefined,
54
58
  )}
55
59
  style={{
56
60
  height: `${height}px`,
@@ -72,10 +76,12 @@ export const SampleRow: FC<SampleRowProps> = ({
72
76
  <MarkdownDiv markdown={inputString(sample.input).join(" ")} />
73
77
  </div>
74
78
  <div className={clsx("sample-target", "three-line-clamp", styles.cell)}>
75
- <MarkdownDiv
76
- markdown={arrayToString(sample?.target)}
77
- className={clsx("no-last-para-padding", styles.noLeft)}
78
- />
79
+ {sample?.target ? (
80
+ <MarkdownDiv
81
+ markdown={arrayToString(sample.target)}
82
+ className={clsx("no-last-para-padding", styles.noLeft)}
83
+ />
84
+ ) : undefined}
79
85
  </div>
80
86
  <div className={clsx("sample-answer", "three-line-clamp", styles.cell)}>
81
87
  {sample ? (
@@ -97,7 +103,17 @@ export const SampleRow: FC<SampleRowProps> = ({
97
103
  >
98
104
  {sample.limit}
99
105
  </div>
100
-
106
+ <div
107
+ className={clsx(
108
+ "sample-retries",
109
+ "text-size-small",
110
+ "three-line-clamp",
111
+ styles.cell,
112
+ styles.centered,
113
+ )}
114
+ >
115
+ {sample.retries && sample.retries > 0 ? sample.retries : undefined}
116
+ </div>
101
117
  <div className={clsx("text-size-small", styles.cell, styles.score)}>
102
118
  {sample.error ? (
103
119
  <SampleErrorView message={sample.error} />
@@ -109,4 +125,15 @@ export const SampleRow: FC<SampleRowProps> = ({
109
125
  </div>
110
126
  </div>
111
127
  );
128
+
129
+ // Render the row content either as a link or directly
130
+ return (
131
+ <div
132
+ onClick={
133
+ isViewable ? () => sampleNavigation.showSample(index) : undefined
134
+ }
135
+ >
136
+ {rowContent}
137
+ </div>
138
+ );
112
139
  };
@@ -1,5 +1,5 @@
1
1
  import clsx from "clsx";
2
- import { ScoreLabel } from "../../types";
2
+ import { ScoreLabel } from "../../../app/types";
3
3
 
4
4
  import { ChangeEvent, FC, useCallback } from "react";
5
5
  import styles from "./SelectScorer.module.css";
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { ChangeEvent, FC, useCallback } from "react";
3
- import { SampleSummary } from "../../api/types";
3
+ import { SampleSummary } from "../../../client/api/types";
4
4
  import {
5
5
  kEpochAscVal,
6
6
  kEpochDescVal,
@@ -8,9 +8,9 @@ import {
8
8
  kSampleDescVal,
9
9
  kScoreAscVal,
10
10
  kScoreDescVal,
11
- } from "../../constants";
12
- import { ScoreLabel } from "../../types";
13
- import { isNumeric } from "../../utils/type";
11
+ } from "../../../constants";
12
+ import { ScoreLabel } from "../../../app/types";
13
+ import { isNumeric } from "../../../utils/type";
14
14
  import { SamplesDescriptor } from "../descriptor/samplesDescriptor";
15
15
  import styles from "./SortFilter.module.css";
16
16
 
@@ -1,9 +1,9 @@
1
1
  import { compileExpression } from "filtrex";
2
- import { SampleSummary } from "../../api/types";
3
- import { kScoreTypeBoolean } from "../../constants";
4
- import { ScoreLabel } from "../../types";
5
- import { Scores1 } from "../../types/log";
6
- import { inputString } from "../../utils/format";
2
+ import { Scores1 } from "../../../@types/log";
3
+ import { ScoreLabel } from "../../../app/types";
4
+ import { SampleSummary } from "../../../client/api/types";
5
+ import { kScoreTypeBoolean } from "../../../constants";
6
+ import { inputString } from "../../../utils/format";
7
7
  import { EvalDescriptor, ScoreDescriptor } from "../descriptor/types";
8
8
 
9
9
  export interface FilterError {
@@ -110,6 +110,7 @@ const scoreVariables = (
110
110
  const sampleVariables = (sample: SampleSummary): Record<string, unknown> => {
111
111
  return {
112
112
  has_error: !!sample.error,
113
+ has_retries: sample.retries !== undefined && sample.retries > 0,
113
114
  };
114
115
  };
115
116
 
@@ -220,7 +221,8 @@ export const filterExpression = (
220
221
  const resolveVariable = (name: string, get: (name: string) => any) => {
221
222
  // Sample variables (like has_error) always exist.
222
223
  if (name in mySampleVariables) {
223
- return get(name);
224
+ const value = get(name);
225
+ return value;
224
226
  }
225
227
  // Score variables exist only if the sample completed successfully.
226
228
  return sample.error ? undefined : get(name);
@@ -16,9 +16,9 @@ import clsx from "clsx";
16
16
  import { EditorView, minimalSetup } from "codemirror";
17
17
  import { FC, useEffect, useMemo, useRef, useState } from "react";
18
18
 
19
- import { SampleSummary } from "../../../api/types";
20
- import { useEvalDescriptor } from "../../../state/hooks";
21
- import { ScoreFilter } from "../../../types";
19
+ import { ScoreFilter } from "../../../../app/types";
20
+ import { SampleSummary } from "../../../../client/api/types";
21
+ import { useEvalDescriptor } from "../../../../state/hooks";
22
22
  import { EvalDescriptor } from "../../descriptor/types";
23
23
  import { FilterError, filterSamples, scoreFilterItems } from "../filters";
24
24
  import { getCompletions } from "./completions";
@@ -43,6 +43,7 @@ Filter samples by:
43
43
  • Scores
44
44
  • Samples with errors: has_error
45
45
  • Input, target and error regex search: input_contains, target_contains, error_contains
46
+ • Samples that have been retried: has_retries
46
47
 
47
48
  Supported expressions:
48
49
  • Arithmetic: +, -, *, /, mod, ^
@@ -11,7 +11,7 @@ import {
11
11
  kScoreTypeNumeric,
12
12
  kScoreTypeOther,
13
13
  kScoreTypePassFail,
14
- } from "../../../constants";
14
+ } from "../../../../constants";
15
15
  import { ScoreFilterItem } from "../filters";
16
16
  import {
17
17
  KEYWORDS,
@@ -15,6 +15,7 @@ export const MATH_FUNCTIONS: [string, string][] = [
15
15
 
16
16
  export const SAMPLE_VARIABLES: [string, string][] = [
17
17
  ["has_error", "Checks if the sample has an error"],
18
+ ["has_retries", "Checks if the sample has been retried"],
18
19
  ];
19
20
 
20
21
  export const SAMPLE_FUNCTIONS: [string, string][] = [
@@ -1,6 +1,6 @@
1
- import { EventData, SampleData } from "../api/types";
2
- import { Events } from "../types/log";
3
- import { resolveAttachments } from "../utils/attachments";
1
+ import { Events } from "../../@types/log";
2
+ import { EventData, SampleData } from "../../client/api/types";
3
+ import { resolveAttachments } from "../../utils/attachments";
4
4
 
5
5
  export const sampleDataAdapter = () => {
6
6
  const attachments: Record<string, string> = {};
@@ -1,4 +1,4 @@
1
- import { Type14 } from "../types/log";
1
+ import { Type14 } from "../../@types/log";
2
2
 
3
3
  /**
4
4
  * Formats a limit message
@@ -1,5 +1,5 @@
1
1
  import { FC } from "react";
2
- import { SampleSummary } from "../../api/types";
2
+ import { SampleSummary } from "../../../client/api/types";
3
3
 
4
4
  import { getScoreDescriptorForValues } from "../descriptor/score/ScoreDescriptor";
5
5
 
@@ -1,10 +1,11 @@
1
1
  import clsx from "clsx";
2
- import { FC } from "react";
3
- import { SampleSummary } from "../../api/types";
4
- import { EmptyPanel } from "../../components/EmptyPanel";
5
- import { MetaDataGrid } from "../../metadata/MetaDataGrid";
6
- import { useEvalDescriptor } from "../../state/hooks";
7
- import { EvalSample } from "../../types/log";
2
+ import { FC, Fragment } from "react";
3
+ import { EvalSample } from "../../../@types/log";
4
+ import { SampleSummary } from "../../../client/api/types";
5
+ import { EmptyPanel } from "../../../components/EmptyPanel";
6
+ import { MarkdownDiv } from "../../../components/MarkdownDiv";
7
+ import { useEvalDescriptor } from "../../../state/hooks";
8
+ import { MetaDataGrid } from "../../content/MetaDataGrid";
8
9
  import { SampleScores } from "./SampleScores";
9
10
  import styles from "./SampleScoresGrid.module.css";
10
11
 
@@ -73,7 +74,7 @@ export const SampleScoresGrid: FC<SampleScoresGridProps> = ({
73
74
  let metadata = scoreData.metadata || {};
74
75
 
75
76
  return (
76
- <>
77
+ <Fragment key={`${scorer}-row`}>
77
78
  <div className={clsx("text-size-base", styles.cell)}>{scorer}</div>
78
79
  <div className={clsx(styles.cell, "text-size-base")}>{answer}</div>
79
80
  <div className={clsx(styles.cell, "text-size-base")}>
@@ -83,11 +84,11 @@ export const SampleScoresGrid: FC<SampleScoresGridProps> = ({
83
84
  />
84
85
  </div>
85
86
  <div className={clsx("text-size-base", styles.cell)}>
86
- {explanation}
87
+ <MarkdownDiv markdown={explanation} />
87
88
  </div>
88
89
 
89
90
  {Object.keys(metadata).length > 0 ? (
90
- <>
91
+ <Fragment key={`${scorer}-metadata`}>
91
92
  <div
92
93
  className={clsx(
93
94
  "text-size-smaller",
@@ -108,9 +109,9 @@ export const SampleScoresGrid: FC<SampleScoresGridProps> = ({
108
109
  styles.fullWidth,
109
110
  )}
110
111
  ></div>
111
- </>
112
+ </Fragment>
112
113
  ) : undefined}
113
- </>
114
+ </Fragment>
114
115
  );
115
116
  })}
116
117
  </div>
@@ -1,12 +1,12 @@
1
1
  import clsx from "clsx";
2
- import { Card, CardBody } from "../../components/Card";
3
- import { MarkdownDiv } from "../../components/MarkdownDiv";
4
- import { EvalSample } from "../../types/log";
5
- import { inputString } from "../../utils/format";
2
+ import { EvalSample } from "../../../@types/log";
3
+ import { Card, CardBody } from "../../../components/Card";
4
+ import { MarkdownDiv } from "../../../components/MarkdownDiv";
5
+ import { inputString } from "../../../utils/format";
6
6
 
7
7
  import { FC } from "react";
8
- import ExpandablePanel from "../../components/ExpandablePanel";
9
- import { useEvalDescriptor } from "../../state/hooks";
8
+ import ExpandablePanel from "../../../components/ExpandablePanel";
9
+ import { useEvalDescriptor } from "../../../state/hooks";
10
10
  import { SampleScoresGrid } from "./SampleScoresGrid";
11
11
  import styles from "./SampleScoresView.module.css";
12
12
 
@@ -1,6 +1,6 @@
1
1
  import { FC } from "react";
2
+ import { ApprovalEvent } from "../../../@types/log";
2
3
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { ApprovalEvent } from "../../types/log";
4
4
  import { EventRow } from "./event/EventRow";
5
5
 
6
6
  interface ApprovalEventViewProps {
@@ -1,8 +1,8 @@
1
1
  import { FC } from "react";
2
+ import { ErrorEvent } from "../../../@types/log";
3
+ import { ANSIDisplay } from "../../../components/AnsiDisplay";
4
+ import { formatDateTime } from "../../../utils/format";
2
5
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { ANSIDisplay } from "../../components/AnsiDisplay";
4
- import { ErrorEvent } from "../../types/log";
5
- import { formatDateTime } from "../../utils/format";
6
6
  import { EventPanel } from "./event/EventPanel";
7
7
 
8
8
  interface ErrorEventViewProps {
@@ -1,9 +1,9 @@
1
1
  import { FC } from "react";
2
+ import { InfoEvent } from "../../../@types/log";
3
+ import { JSONPanel } from "../../../components/JsonPanel";
4
+ import { MarkdownDiv } from "../../../components/MarkdownDiv";
5
+ import { formatDateTime } from "../../../utils/format";
2
6
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { JSONPanel } from "../../components/JsonPanel";
4
- import { MarkdownDiv } from "../../components/MarkdownDiv";
5
- import { InfoEvent } from "../../types/log";
6
- import { formatDateTime } from "../../utils/format";
7
7
  import { EventPanel } from "./event/EventPanel";
8
8
  import styles from "./InfoEventView.module.css";
9
9
 
@@ -1,8 +1,8 @@
1
1
  import { FC } from "react";
2
+ import { InputEvent } from "../../../@types/log";
3
+ import { ANSIDisplay } from "../../../components/AnsiDisplay";
4
+ import { formatDateTime } from "../../../utils/format";
2
5
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { ANSIDisplay } from "../../components/AnsiDisplay";
4
- import { InputEvent } from "../../types/log";
5
- import { formatDateTime } from "../../utils/format";
6
6
  import { EventPanel } from "./event/EventPanel";
7
7
 
8
8
  interface InputEventViewProps {
@@ -1,11 +1,11 @@
1
1
  import clsx from "clsx";
2
+ import { LoggerEvent } from "../../../@types/log";
2
3
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { LoggerEvent } from "../../types/log";
4
4
  import { EventRow } from "./event/EventRow";
5
5
 
6
6
  import { FC } from "react";
7
- import { MetaDataGrid } from "../../metadata/MetaDataGrid";
8
- import { parsedJson as maybeParseJson } from "../../utils/json";
7
+ import { parsedJson as maybeParseJson } from "../../../utils/json";
8
+ import { MetaDataGrid } from "../../content/MetaDataGrid";
9
9
  import styles from "./LoggerEventView.module.css";
10
10
 
11
11
  interface LoggerEventViewProps {
@@ -1,9 +1,5 @@
1
- .output {
2
- padding-top: 1em;
3
- }
4
-
5
1
  .container {
6
- margin: 0.5em 0;
2
+ margin: 0.5em 0 0 0;
7
3
  width: 100%;
8
4
  }
9
5
 
@@ -35,13 +31,23 @@
35
31
  word-wrap: anywhere !important;
36
32
  }
37
33
 
34
+ .progress {
35
+ margin-left: 2em;
36
+ }
37
+
38
38
  .toolConfig {
39
39
  display: grid;
40
40
  grid-template-columns: max-content auto;
41
41
  column-gap: 1em;
42
42
  row-gap: 0.5em;
43
+ padding-top: 0.5em;
43
44
  }
44
45
 
45
- .progress {
46
- margin-left: 2em;
46
+ .toolChoice {
47
+ border-top: solid var(--bs-light-border-subtle) 1px;
48
+ display: grid;
49
+ grid-template-columns: max-content auto;
50
+ column-gap: 1em;
51
+ margin-top: 0.5em;
52
+ padding-top: 0.5em;
47
53
  }