inspect-ai 0.3.62__py3-none-any.whl → 0.3.64__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 (518) hide show
  1. inspect_ai/_cli/cache.py +8 -7
  2. inspect_ai/_cli/common.py +0 -12
  3. inspect_ai/_cli/eval.py +32 -4
  4. inspect_ai/_cli/info.py +1 -0
  5. inspect_ai/_cli/list.py +1 -1
  6. inspect_ai/_cli/log.py +2 -0
  7. inspect_ai/_cli/main.py +1 -1
  8. inspect_ai/_cli/sandbox.py +4 -1
  9. inspect_ai/_cli/score.py +181 -32
  10. inspect_ai/_cli/trace.py +10 -0
  11. inspect_ai/_cli/view.py +4 -2
  12. inspect_ai/_display/core/active.py +2 -3
  13. inspect_ai/_display/core/config.py +7 -1
  14. inspect_ai/_display/textual/widgets/samples.py +4 -3
  15. inspect_ai/_display/textual/widgets/sandbox.py +6 -0
  16. inspect_ai/_eval/eval.py +104 -101
  17. inspect_ai/_eval/evalset.py +75 -75
  18. inspect_ai/_eval/loader.py +122 -12
  19. inspect_ai/_eval/registry.py +1 -1
  20. inspect_ai/_eval/run.py +14 -0
  21. inspect_ai/_eval/score.py +125 -36
  22. inspect_ai/_eval/task/log.py +105 -4
  23. inspect_ai/_eval/task/results.py +92 -38
  24. inspect_ai/_eval/task/run.py +9 -2
  25. inspect_ai/_eval/task/sandbox.py +35 -2
  26. inspect_ai/_eval/task/task.py +49 -46
  27. inspect_ai/_util/constants.py +1 -1
  28. inspect_ai/_util/content.py +8 -0
  29. inspect_ai/_util/error.py +2 -0
  30. inspect_ai/_util/file.py +15 -1
  31. inspect_ai/_util/hash.py +1 -1
  32. inspect_ai/_util/logger.py +4 -2
  33. inspect_ai/_util/registry.py +7 -1
  34. inspect_ai/_view/view.py +1 -2
  35. inspect_ai/_view/www/.vscode/extensions.json +3 -0
  36. inspect_ai/_view/www/.vscode/settings.json +8 -0
  37. inspect_ai/_view/www/App.css +97 -29
  38. inspect_ai/_view/www/README.md +1 -1
  39. inspect_ai/_view/www/dist/assets/index.css +16663 -14674
  40. inspect_ai/_view/www/dist/assets/index.js +58808 -51348
  41. inspect_ai/_view/www/dist/index.html +1 -1
  42. inspect_ai/_view/www/index.html +2 -2
  43. inspect_ai/_view/www/log-schema.json +87 -73
  44. inspect_ai/_view/www/package.json +22 -4
  45. inspect_ai/_view/www/postcss.config.cjs +8 -9
  46. inspect_ai/_view/www/src/{App.mjs → App.tsx} +356 -365
  47. inspect_ai/_view/www/src/AppErrorBoundary.tsx +47 -0
  48. inspect_ai/_view/www/src/api/api-browser.ts +2 -2
  49. inspect_ai/_view/www/src/api/api-http.ts +3 -5
  50. inspect_ai/_view/www/src/api/api-vscode.ts +6 -6
  51. inspect_ai/_view/www/src/api/client-api.ts +4 -4
  52. inspect_ai/_view/www/src/api/index.ts +4 -4
  53. inspect_ai/_view/www/src/api/{Types.ts → types.ts} +25 -9
  54. inspect_ai/_view/www/src/appearance/colors.ts +9 -0
  55. inspect_ai/_view/www/src/appearance/fonts.ts +39 -0
  56. inspect_ai/_view/www/src/appearance/icons.ts +100 -0
  57. inspect_ai/_view/www/src/appearance/{Styles.mjs → styles.ts} +2 -32
  58. inspect_ai/_view/www/src/components/AnsiDisplay.tsx +198 -0
  59. inspect_ai/_view/www/src/components/AsciinemaPlayer.tsx +86 -0
  60. inspect_ai/_view/www/src/components/Card.css +60 -0
  61. inspect_ai/_view/www/src/components/Card.tsx +109 -0
  62. inspect_ai/_view/www/src/components/CopyButton.module.css +11 -0
  63. inspect_ai/_view/www/src/components/CopyButton.tsx +58 -0
  64. inspect_ai/_view/www/src/components/DownloadButton.css +4 -0
  65. inspect_ai/_view/www/src/components/DownloadButton.tsx +25 -0
  66. inspect_ai/_view/www/src/components/DownloadPanel.css +10 -0
  67. inspect_ai/_view/www/src/components/DownloadPanel.tsx +30 -0
  68. inspect_ai/_view/www/src/components/EmptyPanel.css +12 -0
  69. inspect_ai/_view/www/src/components/EmptyPanel.tsx +15 -0
  70. inspect_ai/_view/www/src/components/ErrorPanel.css +37 -0
  71. inspect_ai/_view/www/src/components/ErrorPanel.tsx +39 -0
  72. inspect_ai/_view/www/src/components/ExpandablePanel.css +40 -0
  73. inspect_ai/_view/www/src/components/ExpandablePanel.tsx +115 -0
  74. inspect_ai/_view/www/src/components/FindBand.css +49 -0
  75. inspect_ai/_view/www/src/components/FindBand.tsx +130 -0
  76. inspect_ai/_view/www/src/components/HumanBaselineView.css +41 -0
  77. inspect_ai/_view/www/src/components/HumanBaselineView.tsx +162 -0
  78. inspect_ai/_view/www/src/components/JsonPanel.css +20 -0
  79. inspect_ai/_view/www/src/components/JsonPanel.tsx +82 -0
  80. inspect_ai/_view/www/src/components/LabeledValue.css +20 -0
  81. inspect_ai/_view/www/src/components/LabeledValue.tsx +41 -0
  82. inspect_ai/_view/www/src/components/LargeModal.module.css +54 -0
  83. inspect_ai/_view/www/src/components/LargeModal.tsx +189 -0
  84. inspect_ai/_view/www/src/components/LightboxCarousel.css +95 -0
  85. inspect_ai/_view/www/src/components/LightboxCarousel.tsx +132 -0
  86. inspect_ai/_view/www/src/components/MarkdownDiv.css +3 -0
  87. inspect_ai/_view/www/src/components/MarkdownDiv.tsx +133 -0
  88. inspect_ai/_view/www/src/components/MessageBand.css +43 -0
  89. inspect_ai/_view/www/src/components/MessageBand.tsx +39 -0
  90. inspect_ai/_view/www/src/components/MorePopOver.css +0 -0
  91. inspect_ai/_view/www/src/components/MorePopOver.tsx +67 -0
  92. inspect_ai/_view/www/src/components/NavPills.module.css +18 -0
  93. inspect_ai/_view/www/src/components/NavPills.tsx +101 -0
  94. inspect_ai/_view/www/src/components/ProgressBar.module.css +37 -0
  95. inspect_ai/_view/www/src/components/ProgressBar.tsx +22 -0
  96. inspect_ai/_view/www/src/components/TabSet.module.css +40 -0
  97. inspect_ai/_view/www/src/components/TabSet.tsx +215 -0
  98. inspect_ai/_view/www/src/components/ToolButton.css +3 -0
  99. inspect_ai/_view/www/src/components/ToolButton.tsx +27 -0
  100. inspect_ai/_view/www/src/components/VirtualList.module.css +19 -0
  101. inspect_ai/_view/www/src/components/VirtualList.tsx +292 -0
  102. inspect_ai/_view/www/src/{index.js → index.tsx} +45 -19
  103. inspect_ai/_view/www/src/{log → logfile}/remoteLogFile.ts +3 -8
  104. inspect_ai/_view/www/src/{utils/remoteZipFile.mjs → logfile/remoteZipFile.ts} +86 -80
  105. inspect_ai/_view/www/src/metadata/MetaDataGrid.tsx +83 -0
  106. inspect_ai/_view/www/src/metadata/MetaDataView.module.css +35 -0
  107. inspect_ai/_view/www/src/metadata/MetaDataView.tsx +95 -0
  108. inspect_ai/_view/www/src/metadata/MetadataGrid.module.css +15 -0
  109. inspect_ai/_view/www/src/metadata/RenderedContent.module.css +12 -0
  110. inspect_ai/_view/www/src/{components/RenderedContent/RenderedContent.mjs → metadata/RenderedContent.tsx} +92 -73
  111. inspect_ai/_view/www/src/metadata/types.ts +18 -0
  112. inspect_ai/_view/www/src/plan/DatasetDetailView.module.css +3 -0
  113. inspect_ai/_view/www/src/plan/DatasetDetailView.tsx +37 -0
  114. inspect_ai/_view/www/src/plan/DetailStep.module.css +9 -0
  115. inspect_ai/_view/www/src/plan/DetailStep.tsx +31 -0
  116. inspect_ai/_view/www/src/plan/PlanCard.tsx +28 -0
  117. inspect_ai/_view/www/src/plan/PlanDetailView.module.css +48 -0
  118. inspect_ai/_view/www/src/plan/PlanDetailView.tsx +324 -0
  119. inspect_ai/_view/www/src/plan/ScorerDetailView.module.css +3 -0
  120. inspect_ai/_view/www/src/plan/ScorerDetailView.tsx +30 -0
  121. inspect_ai/_view/www/src/plan/SolverDetailView.module.css +15 -0
  122. inspect_ai/_view/www/src/plan/SolverDetailView.tsx +32 -0
  123. inspect_ai/_view/www/src/samples/InlineSampleDisplay.module.css +8 -0
  124. inspect_ai/_view/www/src/samples/InlineSampleDisplay.tsx +53 -0
  125. inspect_ai/_view/www/src/samples/SampleDialog.tsx +122 -0
  126. inspect_ai/_view/www/src/samples/SampleDisplay.module.css +29 -0
  127. inspect_ai/_view/www/src/samples/SampleDisplay.tsx +331 -0
  128. inspect_ai/_view/www/src/samples/SampleSummaryView.module.css +24 -0
  129. inspect_ai/_view/www/src/samples/SampleSummaryView.tsx +177 -0
  130. inspect_ai/_view/www/src/samples/SamplesTools.tsx +52 -0
  131. inspect_ai/_view/www/src/samples/chat/ChatMessage.module.css +29 -0
  132. inspect_ai/_view/www/src/samples/chat/ChatMessage.tsx +76 -0
  133. inspect_ai/_view/www/src/samples/chat/ChatMessageRenderer.tsx +60 -0
  134. inspect_ai/_view/www/src/samples/chat/ChatMessageRow.module.css +9 -0
  135. inspect_ai/_view/www/src/samples/chat/ChatMessageRow.tsx +57 -0
  136. inspect_ai/_view/www/src/samples/chat/ChatView.tsx +47 -0
  137. inspect_ai/_view/www/src/samples/chat/ChatViewVirtualList.module.css +4 -0
  138. inspect_ai/_view/www/src/samples/chat/ChatViewVirtualList.tsx +58 -0
  139. inspect_ai/_view/www/src/samples/chat/MessageContent.module.css +4 -0
  140. inspect_ai/_view/www/src/samples/chat/MessageContent.tsx +157 -0
  141. inspect_ai/_view/www/src/samples/chat/MessageContents.module.css +3 -0
  142. inspect_ai/_view/www/src/samples/chat/MessageContents.tsx +133 -0
  143. inspect_ai/_view/www/src/samples/chat/messages.ts +112 -0
  144. inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.tsx +147 -0
  145. inspect_ai/_view/www/src/samples/chat/tools/ToolInput.module.css +14 -0
  146. inspect_ai/_view/www/src/samples/chat/tools/ToolInput.tsx +76 -0
  147. inspect_ai/_view/www/src/samples/chat/tools/ToolOutput.module.css +19 -0
  148. inspect_ai/_view/www/src/samples/chat/tools/ToolOutput.tsx +60 -0
  149. inspect_ai/_view/www/src/samples/chat/tools/ToolTitle.module.css +4 -0
  150. inspect_ai/_view/www/src/samples/chat/tools/ToolTitle.tsx +18 -0
  151. inspect_ai/_view/www/src/samples/chat/tools/tool.ts +92 -0
  152. inspect_ai/_view/www/src/samples/descriptor/samplesDescriptor.tsx +365 -0
  153. inspect_ai/_view/www/src/samples/descriptor/score/BooleanScoreDescriptor.module.css +22 -0
  154. inspect_ai/_view/www/src/samples/descriptor/score/BooleanScoreDescriptor.tsx +26 -0
  155. inspect_ai/_view/www/src/samples/descriptor/score/CategoricalScoreDescriptor.tsx +18 -0
  156. inspect_ai/_view/www/src/samples/descriptor/score/NumericScoreDescriptor.tsx +27 -0
  157. inspect_ai/_view/www/src/samples/descriptor/score/ObjectScoreDescriptor.module.css +18 -0
  158. inspect_ai/_view/www/src/samples/descriptor/score/ObjectScoreDescriptor.tsx +71 -0
  159. inspect_ai/_view/www/src/samples/descriptor/score/OtherScoreDescriptor.tsx +20 -0
  160. inspect_ai/_view/www/src/samples/descriptor/score/PassFailScoreDescriptor.module.css +28 -0
  161. inspect_ai/_view/www/src/samples/descriptor/score/PassFailScoreDescriptor.tsx +81 -0
  162. inspect_ai/_view/www/src/samples/descriptor/score/ScoreDescriptor.tsx +99 -0
  163. inspect_ai/_view/www/src/samples/descriptor/types.ts +55 -0
  164. inspect_ai/_view/www/src/samples/error/FlatSampleErrorView.module.css +19 -0
  165. inspect_ai/_view/www/src/samples/error/FlatSampleErrorView.tsx +22 -0
  166. inspect_ai/_view/www/src/samples/error/SampleErrorView.module.css +17 -0
  167. inspect_ai/_view/www/src/samples/error/SampleErrorView.tsx +31 -0
  168. inspect_ai/_view/www/src/samples/error/error.ts +15 -0
  169. inspect_ai/_view/www/src/samples/list/SampleFooter.module.css +9 -0
  170. inspect_ai/_view/www/src/samples/list/SampleFooter.tsx +14 -0
  171. inspect_ai/_view/www/src/samples/list/SampleHeader.module.css +13 -0
  172. inspect_ai/_view/www/src/samples/list/SampleHeader.tsx +36 -0
  173. inspect_ai/_view/www/src/samples/list/SampleList.module.css +11 -0
  174. inspect_ai/_view/www/src/samples/list/SampleList.tsx +247 -0
  175. inspect_ai/_view/www/src/samples/list/SampleRow.module.css +33 -0
  176. inspect_ai/_view/www/src/samples/list/SampleRow.tsx +98 -0
  177. inspect_ai/_view/www/src/samples/list/SampleSeparator.module.css +6 -0
  178. inspect_ai/_view/www/src/samples/list/SampleSeparator.tsx +24 -0
  179. inspect_ai/_view/www/src/samples/sample-tools/EpochFilter.module.css +9 -0
  180. inspect_ai/_view/www/src/samples/sample-tools/EpochFilter.tsx +51 -0
  181. inspect_ai/_view/www/src/samples/sample-tools/SelectScorer.module.css +16 -0
  182. inspect_ai/_view/www/src/samples/sample-tools/SelectScorer.tsx +175 -0
  183. inspect_ai/_view/www/src/samples/sample-tools/SortFilter.module.css +9 -0
  184. inspect_ai/_view/www/src/samples/sample-tools/SortFilter.tsx +186 -0
  185. inspect_ai/_view/www/src/samples/{tools/filters.mjs → sample-tools/filters.ts} +86 -81
  186. inspect_ai/_view/www/src/samples/sample-tools/sample-filter/SampleFilter.module.css +16 -0
  187. inspect_ai/_view/www/src/samples/sample-tools/sample-filter/SampleFilter.tsx +288 -0
  188. inspect_ai/_view/www/src/samples/sample-tools/sample-filter/completions.ts +346 -0
  189. inspect_ai/_view/www/src/samples/sample-tools/sample-filter/language.ts +19 -0
  190. inspect_ai/_view/www/src/samples/sample-tools/sample-filter/tokenize.ts +97 -0
  191. inspect_ai/_view/www/src/samples/{SampleLimit.mjs → sampleLimit.ts} +3 -6
  192. inspect_ai/_view/www/src/samples/scores/SampleScoreView.module.css +53 -0
  193. inspect_ai/_view/www/src/samples/scores/SampleScoreView.tsx +168 -0
  194. inspect_ai/_view/www/src/samples/scores/SampleScores.module.css +5 -0
  195. inspect_ai/_view/www/src/samples/scores/SampleScores.tsx +37 -0
  196. inspect_ai/_view/www/src/samples/transcript/ApprovalEventView.tsx +66 -0
  197. inspect_ai/_view/www/src/samples/transcript/ErrorEventView.tsx +51 -0
  198. inspect_ai/_view/www/src/samples/transcript/InfoEventView.module.css +3 -0
  199. inspect_ai/_view/www/src/samples/transcript/InfoEventView.tsx +54 -0
  200. inspect_ai/_view/www/src/samples/transcript/InputEventView.tsx +48 -0
  201. inspect_ai/_view/www/src/samples/transcript/LoggerEventView.module.css +6 -0
  202. inspect_ai/_view/www/src/samples/transcript/LoggerEventView.tsx +36 -0
  203. inspect_ai/_view/www/src/samples/transcript/ModelEventView.module.css +43 -0
  204. inspect_ai/_view/www/src/samples/transcript/ModelEventView.tsx +223 -0
  205. inspect_ai/_view/www/src/samples/transcript/SampleInitEventView.module.css +23 -0
  206. inspect_ai/_view/www/src/samples/transcript/SampleInitEventView.tsx +112 -0
  207. inspect_ai/_view/www/src/samples/transcript/SampleLimitEventView.tsx +75 -0
  208. inspect_ai/_view/www/src/samples/transcript/SampleTranscript.tsx +22 -0
  209. inspect_ai/_view/www/src/samples/transcript/ScoreEventView.module.css +15 -0
  210. inspect_ai/_view/www/src/samples/transcript/ScoreEventView.tsx +100 -0
  211. inspect_ai/_view/www/src/samples/transcript/StepEventView.tsx +171 -0
  212. inspect_ai/_view/www/src/samples/transcript/SubtaskEventView.module.css +19 -0
  213. inspect_ai/_view/www/src/samples/transcript/SubtaskEventView.tsx +133 -0
  214. inspect_ai/_view/www/src/samples/transcript/ToolEventView.module.css +10 -0
  215. inspect_ai/_view/www/src/samples/transcript/ToolEventView.tsx +92 -0
  216. inspect_ai/_view/www/src/samples/transcript/TranscriptView.module.css +49 -0
  217. inspect_ai/_view/www/src/samples/transcript/TranscriptView.tsx +449 -0
  218. inspect_ai/_view/www/src/samples/transcript/event/EventNav.module.css +5 -0
  219. inspect_ai/_view/www/src/samples/transcript/event/EventNav.tsx +43 -0
  220. inspect_ai/_view/www/src/samples/transcript/event/EventNavs.module.css +3 -0
  221. inspect_ai/_view/www/src/samples/transcript/event/EventNavs.tsx +39 -0
  222. inspect_ai/_view/www/src/samples/transcript/event/EventPanel.module.css +25 -0
  223. inspect_ai/_view/www/src/samples/transcript/event/EventPanel.tsx +191 -0
  224. inspect_ai/_view/www/src/samples/transcript/event/EventRow.module.css +13 -0
  225. inspect_ai/_view/www/src/samples/transcript/event/EventRow.tsx +32 -0
  226. inspect_ai/_view/www/src/samples/transcript/event/EventSection.module.css +8 -0
  227. inspect_ai/_view/www/src/samples/transcript/event/EventSection.tsx +29 -0
  228. inspect_ai/_view/www/src/samples/transcript/state/StateDiffView.tsx +67 -0
  229. inspect_ai/_view/www/src/samples/transcript/state/StateEventRenderers.tsx +285 -0
  230. inspect_ai/_view/www/src/samples/transcript/state/StateEventRenders.module.css +10 -0
  231. inspect_ai/_view/www/src/samples/transcript/state/StateEventView.module.css +9 -0
  232. inspect_ai/_view/www/src/samples/transcript/state/StateEventView.tsx +346 -0
  233. inspect_ai/_view/www/src/samples/transcript/types.ts +58 -0
  234. inspect_ai/_view/www/src/types/log.d.ts +108 -19
  235. inspect_ai/_view/www/src/types/prism.d.ts +11 -0
  236. inspect_ai/_view/www/src/types.ts +71 -0
  237. inspect_ai/_view/www/src/usage/ModelTokenTable.tsx +28 -0
  238. inspect_ai/_view/www/src/usage/ModelUsagePanel.module.css +24 -0
  239. inspect_ai/_view/www/src/usage/ModelUsagePanel.tsx +97 -0
  240. inspect_ai/_view/www/src/usage/TokenTable.module.css +17 -0
  241. inspect_ai/_view/www/src/usage/TokenTable.tsx +91 -0
  242. inspect_ai/_view/www/src/usage/UsageCard.module.css +15 -0
  243. inspect_ai/_view/www/src/usage/UsageCard.tsx +67 -0
  244. inspect_ai/_view/www/src/utils/attachments.ts +42 -0
  245. inspect_ai/_view/www/src/utils/{Base64.mjs → base64.ts} +1 -6
  246. inspect_ai/_view/www/src/{components/Browser.mjs → utils/browser.ts} +0 -1
  247. inspect_ai/_view/www/src/utils/debugging.ts +28 -0
  248. inspect_ai/_view/www/src/utils/dom.ts +30 -0
  249. inspect_ai/_view/www/src/utils/format.ts +194 -0
  250. inspect_ai/_view/www/src/utils/git.ts +7 -0
  251. inspect_ai/_view/www/src/utils/html.ts +6 -0
  252. inspect_ai/_view/www/src/utils/http.ts +14 -0
  253. inspect_ai/_view/www/src/utils/{Path.mjs → path.ts} +2 -9
  254. inspect_ai/_view/www/src/utils/{Print.mjs → print.ts} +34 -26
  255. inspect_ai/_view/www/src/utils/queue.ts +51 -0
  256. inspect_ai/_view/www/src/utils/sync.ts +114 -0
  257. inspect_ai/_view/www/src/utils/{Type.mjs → type.ts} +3 -6
  258. inspect_ai/_view/www/src/utils/vscode.ts +13 -0
  259. inspect_ai/_view/www/src/workspace/WorkSpace.tsx +324 -0
  260. inspect_ai/_view/www/src/workspace/WorkSpaceView.module.css +33 -0
  261. inspect_ai/_view/www/src/workspace/WorkSpaceView.tsx +158 -0
  262. inspect_ai/_view/www/src/workspace/error/TaskErrorPanel.module.css +3 -0
  263. inspect_ai/_view/www/src/workspace/error/TaskErrorPanel.tsx +28 -0
  264. inspect_ai/_view/www/src/workspace/navbar/Navbar.module.css +54 -0
  265. inspect_ai/_view/www/src/workspace/navbar/Navbar.tsx +68 -0
  266. inspect_ai/_view/www/src/workspace/navbar/PrimaryBar.module.css +52 -0
  267. inspect_ai/_view/www/src/workspace/navbar/PrimaryBar.tsx +114 -0
  268. inspect_ai/_view/www/src/workspace/navbar/ResultsPanel.module.css +90 -0
  269. inspect_ai/_view/www/src/workspace/navbar/ResultsPanel.tsx +180 -0
  270. inspect_ai/_view/www/src/workspace/navbar/SecondaryBar.module.css +28 -0
  271. inspect_ai/_view/www/src/workspace/navbar/SecondaryBar.tsx +226 -0
  272. inspect_ai/_view/www/src/workspace/navbar/StatusPanel.module.css +14 -0
  273. inspect_ai/_view/www/src/workspace/navbar/StatusPanel.tsx +61 -0
  274. inspect_ai/_view/www/src/workspace/sidebar/EvalStatus.module.css +15 -0
  275. inspect_ai/_view/www/src/workspace/sidebar/EvalStatus.tsx +71 -0
  276. inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.module.css +5 -0
  277. inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.tsx +56 -0
  278. inspect_ai/_view/www/src/workspace/sidebar/Sidebar.module.css +68 -0
  279. inspect_ai/_view/www/src/workspace/sidebar/Sidebar.tsx +85 -0
  280. inspect_ai/_view/www/src/workspace/sidebar/SidebarLogEntry.module.css +29 -0
  281. inspect_ai/_view/www/src/workspace/sidebar/SidebarLogEntry.tsx +95 -0
  282. inspect_ai/_view/www/src/workspace/sidebar/SidebarScoreView.module.css +23 -0
  283. inspect_ai/_view/www/src/workspace/sidebar/SidebarScoreView.tsx +43 -0
  284. inspect_ai/_view/www/src/workspace/sidebar/SidebarScoresView.module.css +35 -0
  285. inspect_ai/_view/www/src/workspace/sidebar/SidebarScoresView.tsx +63 -0
  286. inspect_ai/_view/www/src/workspace/tabs/InfoTab.module.css +0 -0
  287. inspect_ai/_view/www/src/workspace/tabs/InfoTab.tsx +70 -0
  288. inspect_ai/_view/www/src/workspace/tabs/JsonTab.module.css +5 -0
  289. inspect_ai/_view/www/src/workspace/tabs/JsonTab.tsx +46 -0
  290. inspect_ai/_view/www/src/workspace/tabs/SamplesTab.tsx +204 -0
  291. inspect_ai/_view/www/src/workspace/tabs/grouping.ts +195 -0
  292. inspect_ai/_view/www/src/workspace/tabs/types.ts +19 -0
  293. inspect_ai/_view/www/src/workspace/types.ts +10 -0
  294. inspect_ai/_view/www/src/workspace/utils.ts +34 -0
  295. inspect_ai/_view/www/tsconfig.json +23 -9
  296. inspect_ai/_view/www/vite.config.js +8 -17
  297. inspect_ai/_view/www/yarn.lock +627 -556
  298. inspect_ai/approval/_approval.py +2 -0
  299. inspect_ai/approval/_approver.py +4 -4
  300. inspect_ai/approval/_auto.py +1 -1
  301. inspect_ai/approval/_human/approver.py +3 -0
  302. inspect_ai/approval/_policy.py +5 -0
  303. inspect_ai/approval/_registry.py +2 -2
  304. inspect_ai/dataset/_dataset.py +64 -37
  305. inspect_ai/dataset/_sources/__init__.py +0 -0
  306. inspect_ai/dataset/_sources/csv.py +20 -12
  307. inspect_ai/dataset/_sources/file.py +4 -0
  308. inspect_ai/dataset/_sources/hf.py +39 -29
  309. inspect_ai/dataset/_sources/json.py +17 -9
  310. inspect_ai/log/__init__.py +2 -0
  311. inspect_ai/log/_convert.py +3 -3
  312. inspect_ai/log/_file.py +24 -9
  313. inspect_ai/log/_log.py +101 -13
  314. inspect_ai/log/_message.py +4 -2
  315. inspect_ai/log/_recorders/file.py +4 -0
  316. inspect_ai/log/_recorders/json.py +5 -7
  317. inspect_ai/log/_recorders/recorder.py +3 -0
  318. inspect_ai/log/_transcript.py +19 -8
  319. inspect_ai/model/__init__.py +2 -0
  320. inspect_ai/model/_cache.py +39 -21
  321. inspect_ai/model/_call_tools.py +4 -3
  322. inspect_ai/model/_chat_message.py +14 -4
  323. inspect_ai/model/_generate_config.py +1 -1
  324. inspect_ai/model/_model.py +31 -24
  325. inspect_ai/model/_model_output.py +14 -1
  326. inspect_ai/model/_openai.py +10 -18
  327. inspect_ai/model/_providers/anthropic.py +3 -3
  328. inspect_ai/model/_providers/google.py +9 -5
  329. inspect_ai/model/_providers/openai.py +5 -9
  330. inspect_ai/model/_providers/openai_o1.py +3 -5
  331. inspect_ai/model/_providers/openrouter.py +86 -0
  332. inspect_ai/model/_providers/providers.py +11 -0
  333. inspect_ai/scorer/__init__.py +6 -1
  334. inspect_ai/scorer/_answer.py +7 -7
  335. inspect_ai/scorer/_classification.py +38 -18
  336. inspect_ai/scorer/_common.py +2 -8
  337. inspect_ai/scorer/_match.py +4 -5
  338. inspect_ai/scorer/_metric.py +87 -28
  339. inspect_ai/scorer/_metrics/__init__.py +3 -3
  340. inspect_ai/scorer/_metrics/accuracy.py +8 -10
  341. inspect_ai/scorer/_metrics/mean.py +3 -17
  342. inspect_ai/scorer/_metrics/std.py +111 -30
  343. inspect_ai/scorer/_model.py +12 -12
  344. inspect_ai/scorer/_pattern.py +3 -3
  345. inspect_ai/scorer/_reducer/reducer.py +36 -21
  346. inspect_ai/scorer/_reducer/registry.py +2 -2
  347. inspect_ai/scorer/_reducer/types.py +7 -1
  348. inspect_ai/scorer/_score.py +11 -1
  349. inspect_ai/scorer/_scorer.py +110 -16
  350. inspect_ai/solver/__init__.py +1 -1
  351. inspect_ai/solver/_basic_agent.py +19 -22
  352. inspect_ai/solver/_bridge/__init__.py +0 -3
  353. inspect_ai/solver/_bridge/bridge.py +3 -3
  354. inspect_ai/solver/_chain.py +1 -2
  355. inspect_ai/solver/_critique.py +3 -3
  356. inspect_ai/solver/_fork.py +2 -2
  357. inspect_ai/solver/_human_agent/__init__.py +0 -0
  358. inspect_ai/solver/_human_agent/agent.py +5 -8
  359. inspect_ai/solver/_human_agent/commands/clock.py +14 -10
  360. inspect_ai/solver/_human_agent/commands/note.py +1 -1
  361. inspect_ai/solver/_human_agent/commands/score.py +0 -11
  362. inspect_ai/solver/_multiple_choice.py +38 -26
  363. inspect_ai/solver/_prompt.py +7 -7
  364. inspect_ai/solver/_solver.py +53 -52
  365. inspect_ai/solver/_task_state.py +80 -69
  366. inspect_ai/solver/_use_tools.py +9 -9
  367. inspect_ai/tool/__init__.py +4 -1
  368. inspect_ai/tool/_tool.py +43 -14
  369. inspect_ai/tool/_tool_call.py +6 -2
  370. inspect_ai/tool/_tool_choice.py +3 -1
  371. inspect_ai/tool/_tool_def.py +10 -8
  372. inspect_ai/tool/_tool_params.py +24 -0
  373. inspect_ai/tool/_tool_with.py +7 -7
  374. inspect_ai/tool/_tools/__init__.py +0 -0
  375. inspect_ai/tool/{beta → _tools}/_computer/_common.py +2 -2
  376. inspect_ai/tool/{beta → _tools}/_computer/_computer.py +13 -5
  377. inspect_ai/tool/_tools/_computer/_resources/tool/__init__.py +0 -0
  378. inspect_ai/tool/{beta → _tools}/_computer/_resources/tool/_x11_client.py +1 -1
  379. inspect_ai/tool/_tools/_computer/_resources/tool/requirements.txt +0 -0
  380. inspect_ai/tool/_tools/_execute.py +23 -11
  381. inspect_ai/tool/_tools/_web_browser/_resources/README.md +2 -2
  382. inspect_ai/tool/_tools/_web_browser/_web_browser.py +5 -3
  383. inspect_ai/tool/_tools/_web_search.py +7 -5
  384. inspect_ai/tool/beta.py +3 -0
  385. inspect_ai/util/_concurrency.py +3 -3
  386. inspect_ai/util/_panel.py +2 -0
  387. inspect_ai/util/_resource.py +12 -12
  388. inspect_ai/util/_sandbox/docker/compose.py +23 -20
  389. inspect_ai/util/_sandbox/docker/config.py +2 -1
  390. inspect_ai/util/_sandbox/docker/docker.py +42 -86
  391. inspect_ai/util/_sandbox/docker/service.py +100 -0
  392. inspect_ai/util/_sandbox/environment.py +99 -96
  393. inspect_ai/util/_sandbox/self_check.py +124 -16
  394. inspect_ai/util/_subprocess.py +5 -3
  395. inspect_ai/util/_subtask.py +15 -16
  396. {inspect_ai-0.3.62.dist-info → inspect_ai-0.3.64.dist-info}/LICENSE +1 -1
  397. {inspect_ai-0.3.62.dist-info → inspect_ai-0.3.64.dist-info}/METADATA +11 -6
  398. inspect_ai-0.3.64.dist-info/RECORD +625 -0
  399. inspect_ai/_view/www/src/Register.mjs +0 -3
  400. inspect_ai/_view/www/src/Types.mjs +0 -38
  401. inspect_ai/_view/www/src/appearance/Colors.mjs +0 -27
  402. inspect_ai/_view/www/src/appearance/Fonts.mjs +0 -66
  403. inspect_ai/_view/www/src/appearance/Icons.mjs +0 -240
  404. inspect_ai/_view/www/src/components/AnsiDisplay.mjs +0 -184
  405. inspect_ai/_view/www/src/components/AppErrorBoundary.mjs +0 -34
  406. inspect_ai/_view/www/src/components/AsciiCinemaPlayer.mjs +0 -74
  407. inspect_ai/_view/www/src/components/Card.mjs +0 -126
  408. inspect_ai/_view/www/src/components/ChatView.mjs +0 -441
  409. inspect_ai/_view/www/src/components/CopyButton.mjs +0 -48
  410. inspect_ai/_view/www/src/components/Dialog.mjs +0 -61
  411. inspect_ai/_view/www/src/components/DownloadButton.mjs +0 -15
  412. inspect_ai/_view/www/src/components/DownloadPanel.mjs +0 -29
  413. inspect_ai/_view/www/src/components/EmptyPanel.mjs +0 -23
  414. inspect_ai/_view/www/src/components/ErrorPanel.mjs +0 -66
  415. inspect_ai/_view/www/src/components/ExpandablePanel.mjs +0 -136
  416. inspect_ai/_view/www/src/components/FindBand.mjs +0 -157
  417. inspect_ai/_view/www/src/components/HumanBaselineView.mjs +0 -168
  418. inspect_ai/_view/www/src/components/JsonPanel.mjs +0 -61
  419. inspect_ai/_view/www/src/components/LabeledValue.mjs +0 -32
  420. inspect_ai/_view/www/src/components/LargeModal.mjs +0 -190
  421. inspect_ai/_view/www/src/components/LightboxCarousel.mjs +0 -217
  422. inspect_ai/_view/www/src/components/MarkdownDiv.mjs +0 -118
  423. inspect_ai/_view/www/src/components/MessageBand.mjs +0 -48
  424. inspect_ai/_view/www/src/components/MessageContent.mjs +0 -111
  425. inspect_ai/_view/www/src/components/MetaDataGrid.mjs +0 -92
  426. inspect_ai/_view/www/src/components/MetaDataView.mjs +0 -109
  427. inspect_ai/_view/www/src/components/MorePopOver.mjs +0 -50
  428. inspect_ai/_view/www/src/components/NavPills.mjs +0 -63
  429. inspect_ai/_view/www/src/components/ProgressBar.mjs +0 -51
  430. inspect_ai/_view/www/src/components/RenderedContent/ChatMessageRenderer.mjs +0 -54
  431. inspect_ai/_view/www/src/components/RenderedContent/Types.mjs +0 -19
  432. inspect_ai/_view/www/src/components/TabSet.mjs +0 -184
  433. inspect_ai/_view/www/src/components/ToolButton.mjs +0 -16
  434. inspect_ai/_view/www/src/components/Tools.mjs +0 -376
  435. inspect_ai/_view/www/src/components/VirtualList.mjs +0 -280
  436. inspect_ai/_view/www/src/components/ansi-output.js +0 -932
  437. inspect_ai/_view/www/src/json/JsonTab.mjs +0 -48
  438. inspect_ai/_view/www/src/log-reader/Log-Reader.mjs +0 -25
  439. inspect_ai/_view/www/src/log-reader/Native-Log-Reader.mjs +0 -13
  440. inspect_ai/_view/www/src/log-reader/Open-AI-Log-Reader.mjs +0 -263
  441. inspect_ai/_view/www/src/navbar/Navbar.mjs +0 -418
  442. inspect_ai/_view/www/src/navbar/SecondaryBar.mjs +0 -175
  443. inspect_ai/_view/www/src/plan/PlanCard.mjs +0 -418
  444. inspect_ai/_view/www/src/samples/SampleDialog.mjs +0 -123
  445. inspect_ai/_view/www/src/samples/SampleDisplay.mjs +0 -516
  446. inspect_ai/_view/www/src/samples/SampleError.mjs +0 -99
  447. inspect_ai/_view/www/src/samples/SampleList.mjs +0 -427
  448. inspect_ai/_view/www/src/samples/SampleScoreView.mjs +0 -172
  449. inspect_ai/_view/www/src/samples/SampleScores.mjs +0 -34
  450. inspect_ai/_view/www/src/samples/SampleTranscript.mjs +0 -20
  451. inspect_ai/_view/www/src/samples/SamplesDescriptor.mjs +0 -771
  452. inspect_ai/_view/www/src/samples/SamplesTab.mjs +0 -399
  453. inspect_ai/_view/www/src/samples/SamplesTools.mjs +0 -64
  454. inspect_ai/_view/www/src/samples/tools/EpochFilter.mjs +0 -38
  455. inspect_ai/_view/www/src/samples/tools/SampleFilter.mjs +0 -756
  456. inspect_ai/_view/www/src/samples/tools/SelectScorer.mjs +0 -141
  457. inspect_ai/_view/www/src/samples/tools/SortFilter.mjs +0 -151
  458. inspect_ai/_view/www/src/samples/transcript/ApprovalEventView.mjs +0 -71
  459. inspect_ai/_view/www/src/samples/transcript/ErrorEventView.mjs +0 -44
  460. inspect_ai/_view/www/src/samples/transcript/EventPanel.mjs +0 -271
  461. inspect_ai/_view/www/src/samples/transcript/EventRow.mjs +0 -46
  462. inspect_ai/_view/www/src/samples/transcript/EventSection.mjs +0 -33
  463. inspect_ai/_view/www/src/samples/transcript/InfoEventView.mjs +0 -59
  464. inspect_ai/_view/www/src/samples/transcript/InputEventView.mjs +0 -44
  465. inspect_ai/_view/www/src/samples/transcript/LoggerEventView.mjs +0 -32
  466. inspect_ai/_view/www/src/samples/transcript/ModelEventView.mjs +0 -216
  467. inspect_ai/_view/www/src/samples/transcript/SampleInitEventView.mjs +0 -107
  468. inspect_ai/_view/www/src/samples/transcript/SampleLimitEventView.mjs +0 -74
  469. inspect_ai/_view/www/src/samples/transcript/ScoreEventView.mjs +0 -100
  470. inspect_ai/_view/www/src/samples/transcript/StepEventView.mjs +0 -187
  471. inspect_ai/_view/www/src/samples/transcript/SubtaskEventView.mjs +0 -133
  472. inspect_ai/_view/www/src/samples/transcript/ToolEventView.mjs +0 -88
  473. inspect_ai/_view/www/src/samples/transcript/TranscriptView.mjs +0 -459
  474. inspect_ai/_view/www/src/samples/transcript/Types.mjs +0 -44
  475. inspect_ai/_view/www/src/samples/transcript/state/StateDiffView.mjs +0 -53
  476. inspect_ai/_view/www/src/samples/transcript/state/StateEventRenderers.mjs +0 -254
  477. inspect_ai/_view/www/src/samples/transcript/state/StateEventView.mjs +0 -313
  478. inspect_ai/_view/www/src/sidebar/Sidebar.mjs +0 -418
  479. inspect_ai/_view/www/src/usage/ModelTokenTable.mjs +0 -72
  480. inspect_ai/_view/www/src/usage/UsageCard.mjs +0 -159
  481. inspect_ai/_view/www/src/utils/Format.mjs +0 -260
  482. inspect_ai/_view/www/src/utils/Git.mjs +0 -12
  483. inspect_ai/_view/www/src/utils/Html.mjs +0 -21
  484. inspect_ai/_view/www/src/utils/attachments.mjs +0 -31
  485. inspect_ai/_view/www/src/utils/debugging.mjs +0 -23
  486. inspect_ai/_view/www/src/utils/http.mjs +0 -18
  487. inspect_ai/_view/www/src/utils/queue.mjs +0 -67
  488. inspect_ai/_view/www/src/utils/sync.mjs +0 -101
  489. inspect_ai/_view/www/src/workspace/TaskErrorPanel.mjs +0 -17
  490. inspect_ai/_view/www/src/workspace/WorkSpace.mjs +0 -516
  491. inspect_ai/tool/beta/__init__.py +0 -5
  492. inspect_ai-0.3.62.dist-info/RECORD +0 -481
  493. /inspect_ai/{tool/beta/_computer/_resources/tool → _eval}/__init__.py +0 -0
  494. /inspect_ai/{tool/beta/_computer/_resources/tool/requirements.txt → _util/__init__.py} +0 -0
  495. /inspect_ai/_view/www/src/{constants.mjs → constants.ts} +0 -0
  496. /inspect_ai/tool/{beta → _tools}/_computer/__init__.py +0 -0
  497. /inspect_ai/tool/{beta → _tools}/_computer/_computer_split.py +0 -0
  498. /inspect_ai/tool/{beta → _tools}/_computer/_resources/Dockerfile +0 -0
  499. /inspect_ai/tool/{beta → _tools}/_computer/_resources/README.md +0 -0
  500. /inspect_ai/tool/{beta → _tools}/_computer/_resources/entrypoint/entrypoint.sh +0 -0
  501. /inspect_ai/tool/{beta → _tools}/_computer/_resources/entrypoint/novnc_startup.sh +0 -0
  502. /inspect_ai/tool/{beta → _tools}/_computer/_resources/entrypoint/x11vnc_startup.sh +0 -0
  503. /inspect_ai/tool/{beta → _tools}/_computer/_resources/entrypoint/xfce_startup.sh +0 -0
  504. /inspect_ai/tool/{beta → _tools}/_computer/_resources/entrypoint/xvfb_startup.sh +0 -0
  505. /inspect_ai/tool/{beta → _tools}/_computer/_resources/image_home_dir/.config/Code/User/globalStorage/state.vscdb +0 -0
  506. /inspect_ai/tool/{beta → _tools}/_computer/_resources/image_home_dir/.config/Code/User/settings.json +0 -0
  507. /inspect_ai/tool/{beta → _tools}/_computer/_resources/image_home_dir/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-panel.xml +0 -0
  508. /inspect_ai/tool/{beta → _tools}/_computer/_resources/image_home_dir/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-screensaver.xml +0 -0
  509. /inspect_ai/tool/{beta → _tools}/_computer/_resources/image_home_dir/Desktop/Firefox Web Browser.desktop +0 -0
  510. /inspect_ai/tool/{beta → _tools}/_computer/_resources/image_home_dir/Desktop/Terminal.desktop +0 -0
  511. /inspect_ai/tool/{beta → _tools}/_computer/_resources/image_home_dir/Desktop/Visual Studio Code.desktop +0 -0
  512. /inspect_ai/tool/{beta → _tools}/_computer/_resources/tool/_logger.py +0 -0
  513. /inspect_ai/tool/{beta → _tools}/_computer/_resources/tool/_run.py +0 -0
  514. /inspect_ai/tool/{beta → _tools}/_computer/_resources/tool/_tool_result.py +0 -0
  515. /inspect_ai/tool/{beta → _tools}/_computer/_resources/tool/computer_tool.py +0 -0
  516. {inspect_ai-0.3.62.dist-info → inspect_ai-0.3.64.dist-info}/WHEEL +0 -0
  517. {inspect_ai-0.3.62.dist-info → inspect_ai-0.3.64.dist-info}/entry_points.txt +0 -0
  518. {inspect_ai-0.3.62.dist-info → inspect_ai-0.3.64.dist-info}/top_level.txt +0 -0
@@ -1,178 +1,181 @@
1
- import "bootstrap/dist/css/bootstrap.css";
2
1
  import "bootstrap-icons/font/bootstrap-icons.css";
3
- import "prismjs/themes/prism.css";
2
+ import "bootstrap/dist/css/bootstrap.css";
3
+
4
4
  import "prismjs";
5
+ import "prismjs/components/prism-bash";
6
+ import "prismjs/components/prism-clike";
7
+ import "prismjs/components/prism-javascript";
8
+ import "prismjs/components/prism-json";
9
+ import "prismjs/components/prism-python";
10
+ import "prismjs/themes/prism.css";
11
+
5
12
  import "../App.css";
6
- import "asciinema-player/dist/bundle/asciinema-player.css";
7
13
 
8
- import { default as ClipboardJS } from "clipboard";
9
- // @ts-ignore
10
- import { Offcanvas } from "bootstrap";
11
- import { html } from "htm/preact";
12
- import {
13
- useCallback,
14
- useEffect,
15
- useMemo,
16
- useRef,
17
- useState,
18
- } from "preact/hooks";
19
-
20
- // Registration component
21
- import "./Register.mjs";
22
-
23
- import { debounce, sleep } from "./utils/sync.mjs";
24
- import { clearDocumentSelection } from "./components/Browser.mjs";
25
- import { AppErrorBoundary } from "./components/AppErrorBoundary.mjs";
26
- import { ErrorPanel } from "./components/ErrorPanel.mjs";
27
- import { ProgressBar } from "./components/ProgressBar.mjs";
28
-
29
- import { Sidebar } from "./sidebar/Sidebar.mjs";
30
- import { WorkSpace } from "./workspace/WorkSpace.mjs";
31
- import { FindBand } from "./components/FindBand.mjs";
32
- import { isVscode } from "./utils/Html.mjs";
33
- import { getVscodeApi } from "./utils/vscode";
34
- import { kDefaultSort } from "./constants.mjs";
14
+ import { AppErrorBoundary } from "./AppErrorBoundary";
15
+ import { ErrorPanel } from "./components/ErrorPanel";
16
+ import { ProgressBar } from "./components/ProgressBar";
17
+ import { clearDocumentSelection } from "./utils/browser";
18
+ import { debounce, sleep } from "./utils/sync";
19
+
20
+ import { FindBand } from "./components/FindBand";
21
+ import { kDefaultSort } from "./constants";
35
22
  import {
36
23
  createEvalDescriptor,
37
24
  createSamplesDescriptor,
38
- } from "./samples/SamplesDescriptor.mjs";
39
- import { byEpoch, bySample, sortSamples } from "./samples/tools/SortFilter.mjs";
40
- import { resolveAttachments } from "./utils/attachments.mjs";
41
- import { filterSamples } from "./samples/tools/filters.mjs";
25
+ } from "./samples/descriptor/samplesDescriptor";
26
+ import { filterSamples } from "./samples/sample-tools/filters";
27
+ import {
28
+ byEpoch,
29
+ bySample,
30
+ sortSamples,
31
+ } from "./samples/sample-tools/SortFilter";
32
+ import { resolveAttachments } from "./utils/attachments";
33
+ import { getVscodeApi } from "./utils/vscode";
34
+ import { Sidebar } from "./workspace/sidebar/Sidebar.tsx";
35
+ import { WorkSpace } from "./workspace/WorkSpace";
42
36
 
37
+ import ClipboardJS from "clipboard";
38
+ import clsx from "clsx";
39
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
40
+ import {
41
+ ClientAPI,
42
+ EvalLogHeader,
43
+ EvalSummary,
44
+ HostMessage,
45
+ LogFiles,
46
+ SampleSummary,
47
+ } from "./api/types.ts";
43
48
  import {
44
49
  kEvalWorkspaceTabId,
45
50
  kInfoWorkspaceTabId,
46
51
  kSampleMessagesTabId,
47
52
  kSampleTranscriptTabId,
48
- } from "./constants.mjs";
53
+ } from "./constants";
54
+ import {
55
+ ApplicationState,
56
+ AppStatus,
57
+ Capabilities,
58
+ CurrentLog,
59
+ ScoreFilter,
60
+ ScoreLabel,
61
+ } from "./types.ts";
62
+ import { EvalSample } from "./types/log";
63
+
64
+ interface AppProps {
65
+ api: ClientAPI;
66
+ applicationState?: ApplicationState;
67
+ saveApplicationState?: (state: ApplicationState) => void;
68
+ pollForLogs: boolean;
69
+ capabilities: Capabilities;
70
+ }
49
71
 
50
72
  /**
51
73
  * Renders the Main Application
52
- *
53
- * @param {Object} props - The parameters for the component.
54
- * @param {import("./api/Types.ts").ClientAPI} props.api - The api that this view should use
55
- * @param {Object} [props.initialState] - Initial state for app (optional, used by VS Code extension)
56
- * @param {(state: Object) => void} [props.saveInitialState] - Save initial state for app (optional, used by VS Code extension)
57
- * @param {boolean} props.pollForLogs - Whether the application should poll for log changes
58
- * @returns {import("preact").JSX.Element} The App component.
59
74
  */
60
- export function App({
75
+ export const App: React.FC<AppProps> = ({
61
76
  api,
62
- initialState = undefined,
63
- saveInitialState = undefined,
77
+ applicationState,
78
+ saveApplicationState,
64
79
  pollForLogs = true,
65
- }) {
80
+ capabilities,
81
+ }) => {
66
82
  // List of Logs
67
- const [logs, setLogs] = useState(
68
- initialState?.logs || { log_dir: "", files: [] },
83
+ const [logs, setLogs] = useState<LogFiles>(
84
+ applicationState?.logs || { log_dir: "", files: [] },
69
85
  );
70
- const [selectedLogIndex, setSelectedLogIndex] = useState(
71
- initialState?.selectedLogIndex !== undefined
72
- ? initialState.selectedLogIndex
86
+ const [selectedLogIndex, setSelectedLogIndex] = useState<number>(
87
+ applicationState?.selectedLogIndex !== undefined
88
+ ? applicationState.selectedLogIndex
73
89
  : -1,
74
90
  );
75
91
 
76
92
  // Log Headers
77
- const [logHeaders, setLogHeaders] = useState(initialState?.logHeaders || {});
78
- const [headersLoading, setHeadersLoading] = useState(
79
- initialState?.headersLoading || false,
93
+ const [logHeaders, setLogHeaders] = useState<Record<string, EvalLogHeader>>(
94
+ applicationState?.logHeaders || {},
95
+ );
96
+ const [headersLoading, setHeadersLoading] = useState<boolean>(
97
+ applicationState?.headersLoading || false,
80
98
  );
81
99
 
82
- /** @type {[import("./Types.mjs").CurrentLog, function(import("./Types.mjs").CurrentLog): void]} */
83
- const [selectedLog, setSelectedLog] = useState(
84
- initialState?.selectedLog || {
85
- contents: undefined,
86
- name: undefined,
87
- },
100
+ const [selectedLog, setSelectedLog] = useState<CurrentLog | undefined>(
101
+ applicationState?.selectedLog,
88
102
  );
89
103
 
90
104
  // Workspace (the selected tab)
91
- const [selectedWorkspaceTab, setSelectedWorkspaceTab] = useState(
92
- initialState?.selectedWorkspaceTab || kEvalWorkspaceTabId,
105
+ const [selectedWorkspaceTab, setSelectedWorkspaceTab] = useState<string>(
106
+ applicationState?.selectedWorkspaceTab || kEvalWorkspaceTabId,
93
107
  );
94
-
95
- // Samples
96
- const [selectedSampleIndex, setSelectedSampleIndex] = useState(
97
- initialState?.selectedSampleIndex !== undefined
98
- ? initialState.selectedSampleIndex
108
+ const [selectedSampleIndex, setSelectedSampleIndex] = useState<number>(
109
+ applicationState?.selectedSampleIndex !== undefined
110
+ ? applicationState.selectedSampleIndex
99
111
  : -1,
100
112
  );
101
- /** @type {[import("./types/log").EvalSample, function(import("./types/log").EvalSample): void]} */
102
- const [selectedSample, setSelectedSample] = useState(
103
- initialState?.selectedSample,
113
+ const [selectedSample, setSelectedSample] = useState<EvalSample | undefined>(
114
+ applicationState?.selectedSample,
104
115
  );
105
- const [sampleStatus, setSampleStatus] = useState(initialState?.sampleStatus);
106
- const [sampleError, setSampleError] = useState(initialState?.sampleError);
107
- const [selectedSampleTab, setSelectedSampleTab] = useState(
108
- initialState?.selectedSampleTab,
116
+ const [sampleStatus, setSampleStatus] = useState<"loading" | "ok" | "error">(
117
+ applicationState?.sampleStatus || "loading",
109
118
  );
110
- const sampleScrollPosition = useRef(initialState?.sampleScrollPosition || 0);
111
- const loadingSampleIndexRef = useRef(null);
112
- const workspaceTabScrollPosition = useRef(
113
- initialState?.workspaceTabScrollPosition || {},
119
+ const [sampleError, setSampleError] = useState<Error | undefined>(
120
+ applicationState?.sampleError,
114
121
  );
115
-
116
- const [showingSampleDialog, setShowingSampleDialog] = useState(
117
- initialState?.showingSampleDialog,
122
+ const [selectedSampleTab, setSelectedSampleTab] = useState<
123
+ string | undefined
124
+ >(applicationState?.selectedSampleTab);
125
+ const sampleScrollPosition = useRef<number>(
126
+ applicationState?.sampleScrollPosition || 0,
127
+ );
128
+ const loadingSampleIndexRef = useRef<number | null>(null);
129
+ const workspaceTabScrollPosition = useRef<Record<string, number>>(
130
+ applicationState?.workspaceTabScrollPosition || {},
118
131
  );
119
132
 
120
- // App loading status
121
- const [status, setStatus] = useState(
122
- initialState?.status || {
123
- loading: true,
124
- error: undefined,
125
- },
133
+ const [showingSampleDialog, setShowingSampleDialog] = useState<boolean>(
134
+ !!applicationState?.showingSampleDialog,
126
135
  );
127
136
 
128
- // App host capabilities
129
- const [capabilities, setCapabilities] = useState(
130
- initialState?.capabilities || {
131
- downloadFiles: true,
132
- webWorkers: true,
133
- },
137
+ // App loading status
138
+ const [status, setStatus] = useState<AppStatus>(
139
+ applicationState?.status || { loading: false },
134
140
  );
135
141
 
136
142
  // Other application state
137
- const [offcanvas, setOffcanvas] = useState(initialState?.offcanvas || false);
138
- const [showFind, setShowFind] = useState(initialState?.showFind || false);
143
+ const [offcanvas, setOffcanvas] = useState<boolean>(
144
+ applicationState?.offcanvas || false,
145
+ );
146
+ const [showFind, setShowFind] = useState<boolean>(
147
+ applicationState?.showFind || false,
148
+ );
139
149
 
140
150
  // Filtering and sorting
141
- /**
142
- * @type {[import("./Types.mjs").ScoreFilter, function(import("./Types.mjs").ScoreFilter): void]}
143
- */
144
- const [filter, setFilter] = useState(initialState?.filter || {});
145
-
146
- /**
147
- * @type {[string, function(string): void]}
148
- */
149
- const [epoch, setEpoch] = useState(initialState?.epoch || "all");
151
+ const [filter, setFilter] = useState<ScoreFilter>(
152
+ applicationState?.filter || {},
153
+ );
150
154
 
151
- /**
152
- * @type {[string, function(string): void]}
153
- */
154
- const [sort, setSort] = useState(initialState?.sort || kDefaultSort);
155
+ const [epoch, setEpoch] = useState<string>(applicationState?.epoch || "all");
156
+ const [sort, setSort] = useState<string>(
157
+ applicationState?.sort || kDefaultSort,
158
+ );
155
159
 
156
- /**
157
- * @type {[import("./Types.mjs").ScoreLabel[], function(import("./Types.mjs").ScoreLabel[]): void]}
158
- */
159
- const [scores, setScores] = useState(initialState?.scores || []);
160
+ const [scores, setScores] = useState<ScoreLabel[]>(
161
+ applicationState?.scores || [],
162
+ );
160
163
 
161
- /**
162
- * @type {[import("./Types.mjs").ScoreLabel, function(import("./Types.mjs").ScoreLabel): void]}
163
- */
164
- const [score, setScore] = useState(initialState?.score);
164
+ const [score, setScore] = useState<ScoreLabel | undefined>(
165
+ applicationState?.score,
166
+ );
165
167
 
166
168
  // Re-filter the samples
167
- const [filteredSamples, setFilteredSamples] = useState(
168
- initialState?.filteredSamples || [],
169
+ const [filteredSamples, setFilteredSamples] = useState<SampleSummary[]>(
170
+ applicationState?.filteredSamples || [],
171
+ );
172
+ const [groupBy, setGroupBy] = useState<"none" | "epoch" | "sample">(
173
+ applicationState?.groupBy || "none",
169
174
  );
170
- const [groupBy, setGroupBy] = useState(initialState?.groupBy || "none");
171
- const [groupByOrder, setGroupByOrder] = useState(
172
- initialState?.groupByOrder || "asc",
175
+ const [groupByOrder, setGroupByOrder] = useState<"asc" | "desc">(
176
+ applicationState?.groupByOrder || "asc",
173
177
  );
174
178
 
175
- const afterBodyElements = [];
176
179
  const saveState = useCallback(() => {
177
180
  const state = {
178
181
  logs,
@@ -188,7 +191,6 @@ export function App({
188
191
  selectedSampleTab,
189
192
  showingSampleDialog,
190
193
  status,
191
- capabilities,
192
194
  offcanvas,
193
195
  showFind,
194
196
  filter,
@@ -202,8 +204,8 @@ export function App({
202
204
  sampleScrollPosition: sampleScrollPosition.current,
203
205
  workspaceTabScrollPosition: workspaceTabScrollPosition.current,
204
206
  };
205
- if (saveInitialState) {
206
- saveInitialState(state);
207
+ if (saveApplicationState) {
208
+ saveApplicationState(state);
207
209
  }
208
210
  }, [
209
211
  logs,
@@ -219,7 +221,6 @@ export function App({
219
221
  selectedSampleTab,
220
222
  showingSampleDialog,
221
223
  status,
222
- capabilities,
223
224
  offcanvas,
224
225
  showFind,
225
226
  filter,
@@ -277,7 +278,6 @@ export function App({
277
278
  selectedSampleTab,
278
279
  showingSampleDialog,
279
280
  status,
280
- capabilities,
281
281
  offcanvas,
282
282
  showFind,
283
283
  filter,
@@ -291,7 +291,7 @@ export function App({
291
291
  ]);
292
292
 
293
293
  const handleSampleShowingDialog = useCallback(
294
- (show) => {
294
+ (show: boolean) => {
295
295
  setShowingSampleDialog(show);
296
296
  if (!show) {
297
297
  setSelectedSample(undefined);
@@ -308,15 +308,15 @@ export function App({
308
308
 
309
309
  useEffect(() => {
310
310
  const samples = selectedLog?.contents?.sampleSummaries || [];
311
- const { result: prefiltered } = filterSamples(
312
- evalDescriptor,
313
- samples,
314
- filter?.value,
315
- );
311
+ const { result: prefiltered } =
312
+ evalDescriptor && filter?.value
313
+ ? filterSamples(evalDescriptor, samples, filter.value)
314
+ : { result: samples };
315
+
316
316
  const filtered = prefiltered.filter((sample) => {
317
317
  // Filter by epoch if specified
318
318
  if (epoch && epoch !== "all") {
319
- if (epoch !== sample.epoch + "") {
319
+ if (epoch !== String(sample.epoch)) {
320
320
  return false;
321
321
  }
322
322
  }
@@ -324,50 +324,53 @@ export function App({
324
324
  });
325
325
 
326
326
  // Sort the samples
327
- const { sorted, order } = sortSamples(sort, filtered, samplesDescriptor);
327
+ if (samplesDescriptor) {
328
+ const { sorted, order } = sortSamples(sort, filtered, samplesDescriptor);
329
+ setFilteredSamples(sorted);
330
+ setGroupByOrder(order);
331
+ }
328
332
 
329
333
  // Set the grouping
330
- let grouping = "none";
331
- if (samplesDescriptor?.evalDescriptor?.epochs > 1) {
334
+ let grouping: "none" | "epoch" | "sample" = "none";
335
+ if (
336
+ samplesDescriptor?.evalDescriptor?.epochs &&
337
+ samplesDescriptor.evalDescriptor.epochs > 1
338
+ ) {
332
339
  if (byEpoch(sort) || epoch !== "all") {
333
340
  grouping = "epoch";
334
341
  } else if (bySample(sort)) {
335
342
  grouping = "sample";
336
343
  }
337
344
  }
338
-
339
- setFilteredSamples(sorted);
340
345
  setGroupBy(grouping);
341
- setGroupByOrder(order);
342
346
  }, [selectedLog, filter, sort, epoch]);
343
347
 
344
348
  const evalDescriptor = useMemo(() => {
345
349
  return createEvalDescriptor(
346
350
  scores,
347
- selectedLog.contents?.sampleSummaries,
348
- selectedLog.contents?.eval?.config?.epochs || 1,
351
+ selectedLog?.contents?.eval?.config?.epochs || 1,
352
+ selectedLog?.contents?.sampleSummaries,
349
353
  );
350
354
  }, [selectedLog, scores]);
351
355
 
352
356
  const samplesDescriptor = useMemo(() => {
353
- return createSamplesDescriptor(evalDescriptor, score);
357
+ return evalDescriptor && score
358
+ ? createSamplesDescriptor(evalDescriptor, score)
359
+ : undefined;
354
360
  }, [evalDescriptor, score]);
355
361
 
356
- const refreshSampleTab = useCallback(
357
- (sample) => {
358
- if (selectedSampleTab === undefined) {
359
- const defaultTab =
360
- sample.events && sample.events.length > 0
361
- ? kSampleTranscriptTabId
362
- : kSampleMessagesTabId;
363
- setSelectedSampleTab(defaultTab);
364
- }
365
- },
366
- [selectedSampleTab, showingSampleDialog],
367
- );
362
+ useEffect(() => {
363
+ if (selectedSampleTab === undefined && selectedSample) {
364
+ setSelectedSampleTab(
365
+ selectedSample.events && selectedSample.events.length > 0
366
+ ? kSampleTranscriptTabId
367
+ : kSampleMessagesTabId,
368
+ );
369
+ }
370
+ }, [selectedSample, selectedSampleTab]);
368
371
 
369
372
  // The main application reference
370
- const mainAppRef = useRef();
373
+ const mainAppRef = useRef<HTMLDivElement>(null);
371
374
 
372
375
  // Loads a sample
373
376
  useEffect(() => {
@@ -408,30 +411,34 @@ export function App({
408
411
  api
409
412
  .get_log_sample(selectedLog.name, summary.id, summary.epoch)
410
413
  .then((sample) => {
411
- // migrate transcript to new structure
412
- // @ts-ignore
413
- if (sample.transcript) {
414
- // @ts-ignore
415
- sample.events = sample.transcript.events;
416
- // @ts-ignore
417
- sample.attachments = sample.transcript.content;
414
+ if (sample) {
415
+ // This migrates old samples (with raw transcript element)
416
+ // to the new structure (hence the type bypass).
417
+ const anySample = sample as any;
418
+ if (anySample.transcript) {
419
+ sample.events = anySample.transcript.events;
420
+ sample.attachments = anySample.transcript.content;
421
+ }
422
+ sample.attachments = sample.attachments || {};
423
+ sample.input = resolveAttachments(sample.input, sample.attachments);
424
+ sample.messages = resolveAttachments(
425
+ sample.messages,
426
+ sample.attachments,
427
+ );
428
+ sample.events = resolveAttachments(
429
+ sample.events,
430
+ sample.attachments,
431
+ );
432
+ sample.attachments = {};
433
+
434
+ sampleScrollPosition.current = 0;
435
+ setSelectedSample(sample);
436
+
437
+ setSampleStatus("ok");
438
+ loadingSampleIndexRef.current = null;
439
+ } else {
440
+ throw Error("Unable to load sample - an unknown error occurred.");
418
441
  }
419
- sample.attachments = sample.attachments || {};
420
- sample.input = resolveAttachments(sample.input, sample.attachments);
421
- sample.messages = resolveAttachments(
422
- sample.messages,
423
- sample.attachments,
424
- );
425
- sample.events = resolveAttachments(sample.events, sample.attachments);
426
- sample.attachments = {};
427
-
428
- sampleScrollPosition.current = 0;
429
- setSelectedSample(sample);
430
-
431
- refreshSampleTab(sample);
432
-
433
- setSampleStatus("ok");
434
- loadingSampleIndexRef.current = null;
435
442
  })
436
443
  .catch((e) => {
437
444
  setSampleStatus("error");
@@ -473,10 +480,10 @@ export function App({
473
480
  for (const fileList of fileLists) {
474
481
  const headers = await api.get_log_headers(fileList);
475
482
  setLogHeaders((prev) => {
476
- const updatedHeaders = {};
483
+ const updatedHeaders: Record<string, EvalLogHeader> = {};
477
484
  headers.forEach((header, index) => {
478
485
  const logFile = fileList[index];
479
- updatedHeaders[logFile] = header;
486
+ updatedHeaders[logFile] = header as EvalLogHeader;
480
487
  });
481
488
  return { ...prev, ...updatedHeaders };
482
489
  });
@@ -485,16 +492,18 @@ export function App({
485
492
  await sleep(5000); // Pause between chunks
486
493
  }
487
494
  }
488
- } catch (e) {
489
- if (e.message === "Load failed" || e.message === "Failed to fetch") {
495
+ } catch (e: unknown) {
496
+ if (
497
+ e instanceof Error &&
498
+ (e.message === "Load failed" || e.message === "Failed to fetch")
499
+ ) {
490
500
  // This will happen if the server disappears (e.g. inspect view is terminated)
491
501
  setStatus({ loading: false });
492
502
  } else {
493
503
  console.log(e);
494
- setStatus({ loading: false, error: e });
504
+ setStatus({ loading: false, error: e as Error });
495
505
  }
496
506
  }
497
-
498
507
  setHeadersLoading(false);
499
508
  };
500
509
 
@@ -506,15 +515,9 @@ export function App({
506
515
  *
507
516
  * Determines whether the workspace tab should display samples or info,
508
517
  * depending on the presence of samples and the log status.
509
- *
510
- * @param {import("./api/Types.ts").EvalSummary} log - The log object containing sample summaries and status.
511
- * @returns {void}
512
518
  */
513
519
  const resetWorkspace = useCallback(
514
- /**
515
- * @param {import("./api/Types.ts").EvalSummary} log
516
- */
517
- (log) => {
520
+ (log: EvalSummary) => {
518
521
  // Reset the workspace tab
519
522
  const hasSamples =
520
523
  !!log.sampleSummaries && log.sampleSummaries.length > 0;
@@ -573,7 +576,7 @@ export function App({
573
576
  }
574
577
  } catch (e) {
575
578
  console.log(e);
576
- setStatus({ loading: false, error: e });
579
+ setStatus({ loading: false, error: e as Error });
577
580
  }
578
581
  } else if (logs.log_dir && logs.files.length === 0) {
579
582
  setStatus({
@@ -586,36 +589,31 @@ export function App({
586
589
  };
587
590
 
588
591
  loadSpecificLog();
589
- }, [
590
- selectedLogIndex,
591
- logs,
592
- capabilities,
593
- selectedLog,
594
- setSelectedLog,
595
- setStatus,
596
- ]);
592
+ }, [selectedLogIndex, logs, selectedLog, setSelectedLog, setStatus]);
597
593
 
598
594
  // Load the list of logs
599
- const loadLogs = async () => {
595
+ const loadLogs = async (): Promise<LogFiles> => {
600
596
  try {
601
597
  const result = await api.get_log_paths();
598
+
602
599
  return result;
603
600
  } catch (e) {
604
601
  // Show an error
605
602
  console.log(e);
606
- setStatus({ loading: false, error: e });
603
+ setStatus({ loading: false, error: e as Error });
604
+ return { log_dir: "", files: [] };
607
605
  }
608
606
  };
609
607
 
610
608
  // Load a specific log file
611
- const loadLog = async (logFileName) => {
609
+ const loadLog = async (logFileName: string) => {
612
610
  try {
613
611
  const logContents = await api.get_log_summary(logFileName);
614
612
  return logContents;
615
613
  } catch (e) {
616
614
  // Show an error
617
615
  console.log(e);
618
- setStatus({ loading: false, error: e });
616
+ setStatus({ loading: false, error: e as Error });
619
617
  }
620
618
  };
621
619
 
@@ -629,10 +627,10 @@ export function App({
629
627
  if (log.status !== "started") {
630
628
  setLogHeaders((prev) => {
631
629
  const updatedState = { ...prev };
632
- const freshHeaders = {
630
+ const freshHeaders: EvalLogHeader = {
633
631
  eval: log.eval,
634
632
  plan: log.plan,
635
- results: log.results,
633
+ results: log.results !== null ? log.results : undefined,
636
634
  stats: log.stats,
637
635
  status: log.status,
638
636
  version: log.version,
@@ -655,12 +653,12 @@ export function App({
655
653
  } catch (e) {
656
654
  // Show an error
657
655
  console.log(e);
658
- setStatus({ loading: false, error: e });
656
+ setStatus({ loading: false, error: e as Error });
659
657
  }
660
658
  }, [logs, selectedLogIndex, setStatus, setSelectedLog, setLogHeaders]);
661
659
 
662
660
  const showLogFile = useCallback(
663
- async (logUrl) => {
661
+ async (logUrl: string) => {
664
662
  const index = logs.files.findIndex((val) => {
665
663
  return logUrl.endsWith(val.name);
666
664
  });
@@ -668,11 +666,11 @@ export function App({
668
666
  setSelectedLogIndex(index);
669
667
  } else {
670
668
  const result = await loadLogs();
671
- const idx = result.files.findIndex((file) => {
669
+ const idx = result?.files.findIndex((file) => {
672
670
  return logUrl.endsWith(file.name);
673
671
  });
674
- setLogs(result);
675
- setSelectedLogIndex(idx > -1 ? idx : 0);
672
+ setLogs(result || { log_dir: "", files: [] });
673
+ setSelectedLogIndex(idx && idx > -1 ? idx : 0);
676
674
  }
677
675
  },
678
676
  [logs, setSelectedLogIndex, setLogs],
@@ -680,19 +678,20 @@ export function App({
680
678
 
681
679
  const refreshLogList = useCallback(async () => {
682
680
  const currentLog = logs.files[selectedLogIndex > -1 ? selectedLogIndex : 0];
683
-
684
681
  const refreshedLogs = await loadLogs();
685
- const newIndex = refreshedLogs.files.findIndex((file) => {
682
+ setLogs(refreshedLogs || { log_dir: "", files: [] });
683
+
684
+ const newIndex = refreshedLogs?.files.findIndex((file) => {
686
685
  return currentLog.name.endsWith(file.name);
687
686
  });
688
- setLogs(refreshedLogs);
689
- setSelectedLogIndex(newIndex);
687
+ if (newIndex !== undefined) {
688
+ setSelectedLogIndex(newIndex);
689
+ }
690
690
  }, [logs, selectedLogIndex, setSelectedLogIndex, setLogs]);
691
691
 
692
- const onMessage = useMemo(() => {
693
- return async (e) => {
694
- const type = e.data.type || e.data.message;
695
- switch (type) {
692
+ const onMessage = useCallback(
693
+ async (e: HostMessage) => {
694
+ switch (e.data.type) {
696
695
  case "updateState": {
697
696
  if (e.data.url) {
698
697
  const decodedUrl = decodeURIComponent(e.data.url);
@@ -716,8 +715,9 @@ export function App({
716
715
  break;
717
716
  }
718
717
  }
719
- };
720
- }, [logs, showLogFile, refreshLogList]);
718
+ },
719
+ [logs, showLogFile, refreshLogList],
720
+ );
721
721
 
722
722
  // listen for updateState messages from vscode
723
723
  useEffect(() => {
@@ -732,29 +732,13 @@ export function App({
732
732
  // See whether a specific task_file has been passed.
733
733
  const urlParams = new URLSearchParams(window.location.search);
734
734
 
735
- // Determine the capabilities
736
- const extensionVersionEl = document.querySelector(
737
- 'meta[name="inspect-extension:version"]',
738
- );
739
- const extensionVersion = extensionVersionEl
740
- ? extensionVersionEl.getAttribute("content")
741
- : undefined;
742
-
743
- if (isVscode()) {
744
- if (!extensionVersion) {
745
- setCapabilities({ downloadFiles: false, webWorkers: false });
746
- }
747
- }
748
-
749
- setOffcanvas(true);
750
-
751
735
  // If the URL provides a task file, load that
752
736
  const logPath = urlParams.get("task_file");
753
737
 
754
738
  // Replace spaces with a '+' sign:
755
739
  const resolvedLogPath = logPath ? logPath.replace(" ", "+") : logPath;
756
740
  const load = resolvedLogPath
757
- ? async () => {
741
+ ? async (): Promise<LogFiles> => {
758
742
  return {
759
743
  log_dir: "",
760
744
  files: [{ name: resolvedLogPath }],
@@ -764,7 +748,7 @@ export function App({
764
748
 
765
749
  const embeddedState = document.getElementById("logview-state");
766
750
  if (embeddedState) {
767
- const state = JSON.parse(embeddedState.textContent);
751
+ const state = JSON.parse(embeddedState.textContent || "");
768
752
  onMessage({ data: state });
769
753
  } else {
770
754
  const result = await load();
@@ -828,31 +812,6 @@ export function App({
828
812
  // Configure an app envelope specific to the current state
829
813
  // if there are no log files, then don't show sidebar
830
814
  const fullScreen = logs.files.length === 1 && !logs.log_dir;
831
- const sidebar =
832
- !fullScreen && selectedLog.contents
833
- ? html`
834
- <${Sidebar}
835
- logs=${logs}
836
- logHeaders=${logHeaders}
837
- loading=${headersLoading}
838
- offcanvas=${offcanvas}
839
- selectedIndex=${selectedLogIndex}
840
- onSelectedIndexChanged=${(index) => {
841
- setSelectedLogIndex(index);
842
-
843
- // hide the sidebar offcanvas
844
- var myOffcanvas = document.getElementById("sidebarOffCanvas");
845
- var bsOffcanvas = Offcanvas.getInstance(myOffcanvas);
846
- if (bsOffcanvas) {
847
- bsOffcanvas.hide();
848
- }
849
- }}
850
- />
851
- `
852
- : "";
853
-
854
- const fullScreenClz = fullScreen ? " full-screen" : "";
855
- const offcanvasClz = offcanvas ? " off-canvas" : "";
856
815
 
857
816
  const hideFind = useCallback(() => {
858
817
  clearDocumentSelection();
@@ -861,12 +820,10 @@ export function App({
861
820
  }
862
821
  }, [showFind, setShowFind]);
863
822
 
864
- const showToggle = logs.files.length > 1 || logs.log_dir;
823
+ const showToggle = logs.files.length > 1 || !!logs.log_dir || false;
865
824
 
866
825
  /**
867
826
  * Determines the sample mode based on the selected log's contents.
868
- *
869
- * @type {import("./Types.mjs").SampleMode}
870
827
  */
871
828
  const sampleMode =
872
829
  selectedLog?.contents?.sampleSummaries === undefined ||
@@ -875,104 +832,135 @@ export function App({
875
832
  : selectedLog.contents.sampleSummaries.length === 1
876
833
  ? "single"
877
834
  : "many";
878
- return html`
879
- <${AppErrorBoundary}>
880
- ${sidebar}
881
- <div ref=${mainAppRef} class="app-main-grid${fullScreenClz}${offcanvasClz}" tabIndex="0" onKeyDown=${(
882
- e,
883
- ) => {
884
- // regular browsers user their own find
885
- if (!getVscodeApi()) {
886
- return;
887
- }
835
+ return (
836
+ <AppErrorBoundary>
837
+ {!fullScreen && selectedLog?.contents ? (
838
+ <Sidebar
839
+ logs={logs}
840
+ logHeaders={logHeaders}
841
+ loading={headersLoading}
842
+ offcanvas={offcanvas}
843
+ setOffcanvas={setOffcanvas}
844
+ selectedIndex={selectedLogIndex}
845
+ onSelectedIndexChanged={(index) => {
846
+ setSelectedLogIndex(index);
847
+ setOffcanvas(false);
848
+ }}
849
+ />
850
+ ) : undefined}
851
+ <div
852
+ ref={mainAppRef}
853
+ className={clsx(
854
+ "app-main-grid",
855
+ fullScreen ? "full-screen" : undefined,
856
+ offcanvas ? "off-canvas" : undefined,
857
+ )}
858
+ tabIndex={0}
859
+ onKeyDown={(e) => {
860
+ // regular browsers user their own find
861
+ if (!getVscodeApi()) {
862
+ return;
863
+ }
888
864
 
889
- if ((e.ctrlKey || e.metaKey) && e.key === "f") {
890
- setShowFind(true);
891
- } else if (e.key === "Escape") {
892
- hideFind();
893
- }
894
- }}>
895
- ${showFind ? html`<${FindBand} hideBand=${hideFind} />` : ""}
896
- <${ProgressBar} animating=${status.loading} containerStyle=${{
897
- background: "var(--bs-light)",
898
- marginBottom: "-1px",
899
- }}/>
900
- ${
901
- status.error
902
- ? html`<${ErrorPanel}
903
- title="An error occurred while loading this task."
904
- error=${status.error}
905
- />`
906
- : html`<${WorkSpace}
907
- task_id=${selectedLog?.contents?.eval?.task_id}
908
- logFileName=${selectedLog?.name}
909
- evalStatus=${selectedLog?.contents?.status}
910
- evalError=${selectedLog?.contents?.error}
911
- evalVersion=${selectedLog?.contents?.version}
912
- evalSpec=${selectedLog?.contents?.eval}
913
- evalPlan=${selectedLog?.contents?.plan}
914
- evalStats=${selectedLog?.contents?.stats}
915
- evalResults=${selectedLog?.contents?.results}
916
- showToggle=${showToggle}
917
- samples=${filteredSamples}
918
- sampleMode=${sampleMode}
919
- groupBy=${groupBy}
920
- groupByOrder=${groupByOrder}
921
- sampleStatus=${sampleStatus}
922
- sampleError=${sampleError}
923
- samplesDescriptor=${samplesDescriptor}
924
- refreshLog=${refreshLog}
925
- offcanvas=${offcanvas}
926
- capabilities=${capabilities}
927
- selected=${selectedLogIndex}
928
- selectedSample=${selectedSample}
929
- selectedSampleIndex=${selectedSampleIndex}
930
- setSelectedSampleIndex=${setSelectedSampleIndex}
931
- showingSampleDialog=${showingSampleDialog}
932
- setShowingSampleDialog=${handleSampleShowingDialog}
933
- selectedTab=${selectedWorkspaceTab}
934
- setSelectedTab=${setSelectedWorkspaceTab}
935
- selectedSampleTab=${selectedSampleTab}
936
- setSelectedSampleTab=${setSelectedSampleTab}
937
- sort=${sort}
938
- setSort=${setSort}
939
- epochs=${selectedLog?.contents?.eval?.config?.epochs}
940
- epoch=${epoch}
941
- setEpoch=${setEpoch}
942
- filter=${filter}
943
- setFilter=${setFilter}
944
- score=${score}
945
- setScore=${setScore}
946
- scores=${scores}
947
- sampleScrollPositionRef=${sampleScrollPosition}
948
- setSampleScrollPosition=${setSampleScrollPosition}
949
- workspaceTabScrollPositionRef=${workspaceTabScrollPosition}
950
- setWorkspaceTabScrollPosition=${setWorkspaceTabScrollPosition}
951
- />`
952
- }
953
- </div>
954
- ${afterBodyElements}
955
- </${AppErrorBoundary}>
956
- `;
865
+ if ((e.ctrlKey || e.metaKey) && e.key === "f") {
866
+ setShowFind(true);
867
+ } else if (e.key === "Escape") {
868
+ hideFind();
869
+ }
870
+ }}
871
+ >
872
+ {showFind ? <FindBand hideBand={hideFind} /> : ""}
873
+ <ProgressBar animating={status?.loading} />
874
+ {status?.error ? (
875
+ <ErrorPanel
876
+ title="An error occurred while loading this task."
877
+ error={status.error}
878
+ />
879
+ ) : (
880
+ <WorkSpace
881
+ task_id={selectedLog?.contents?.eval?.task_id}
882
+ logFileName={selectedLog?.name}
883
+ evalStatus={selectedLog?.contents?.status}
884
+ evalError={filterNull(selectedLog?.contents?.error)}
885
+ evalVersion={selectedLog?.contents?.version}
886
+ evalSpec={selectedLog?.contents?.eval}
887
+ evalPlan={selectedLog?.contents?.plan}
888
+ evalStats={selectedLog?.contents?.stats}
889
+ evalResults={filterNull(selectedLog?.contents?.results)}
890
+ showToggle={showToggle}
891
+ samples={filteredSamples}
892
+ sampleMode={sampleMode}
893
+ groupBy={groupBy}
894
+ groupByOrder={groupByOrder}
895
+ sampleStatus={sampleStatus}
896
+ sampleError={sampleError}
897
+ samplesDescriptor={samplesDescriptor}
898
+ refreshLog={refreshLog}
899
+ offcanvas={offcanvas}
900
+ setOffcanvas={setOffcanvas}
901
+ capabilities={capabilities}
902
+ selectedSample={selectedSample}
903
+ selectedSampleIndex={selectedSampleIndex}
904
+ setSelectedSampleIndex={setSelectedSampleIndex}
905
+ showingSampleDialog={showingSampleDialog}
906
+ setShowingSampleDialog={handleSampleShowingDialog}
907
+ selectedTab={selectedWorkspaceTab}
908
+ setSelectedTab={setSelectedWorkspaceTab}
909
+ selectedSampleTab={selectedSampleTab}
910
+ setSelectedSampleTab={setSelectedSampleTab}
911
+ sort={sort}
912
+ setSort={setSort}
913
+ epochs={selectedLog?.contents?.eval?.config?.epochs}
914
+ epoch={epoch}
915
+ setEpoch={setEpoch}
916
+ filter={filter}
917
+ setFilter={setFilter}
918
+ score={score}
919
+ setScore={setScore}
920
+ scores={scores}
921
+ sampleScrollPositionRef={sampleScrollPosition}
922
+ setSampleScrollPosition={setSampleScrollPosition}
923
+ workspaceTabScrollPositionRef={workspaceTabScrollPosition}
924
+ setWorkspaceTabScrollPosition={setWorkspaceTabScrollPosition}
925
+ />
926
+ )}
927
+ </div>
928
+ </AppErrorBoundary>
929
+ );
930
+ };
931
+
932
+ const filterNull = <T,>(obj: T | null): T | undefined => {
933
+ if (obj === null) {
934
+ return undefined;
935
+ }
936
+ return obj;
937
+ };
938
+
939
+ interface ScorerInfo {
940
+ name: string;
941
+ scorer: string;
957
942
  }
958
943
 
959
944
  /**
960
945
  * Determines the default scorer for a log
961
- *
962
- * @param {import("./api/Types.ts").EvalSummary} log - The log object containing sample summaries and status.
963
- * @returns {{name: string, scorer: string} | undefined} A scorer object with name and scorer properties, or undefined
964
946
  */
965
- const defaultScorer = (log) => {
947
+ const defaultScorer = (log: EvalSummary): ScorerInfo | undefined => {
948
+ if (log.sampleSummaries.length === 0) {
949
+ return undefined;
950
+ }
951
+
966
952
  // Select the default scorer to use
953
+ const scores = log.sampleSummaries[0].scores;
954
+
967
955
  const scorer = log.results?.scores[0]
968
956
  ? {
969
957
  name: log.results?.scores[0].name,
970
958
  scorer: log.results?.scores[0].scorer,
971
959
  }
972
- : log.sampleSummaries.length > 0
960
+ : log.sampleSummaries.length > 0 && scores !== null
973
961
  ? {
974
- name: Object.keys(log.sampleSummaries[0].scores)[0],
975
- scorer: Object.keys(log.sampleSummaries[0].scores)[0],
962
+ name: Object.keys(scores)[0],
963
+ scorer: Object.keys(scores)[0],
976
964
  }
977
965
  : undefined;
978
966
  return scorer;
@@ -980,14 +968,11 @@ const defaultScorer = (log) => {
980
968
 
981
969
  /**
982
970
  * Determines the default scorers for a log
983
- *
984
- * @param {import("./api/Types.ts").EvalSummary} log - The log object containing sample summaries and status.
985
- * @returns {Array<{name: string, scorer: string}>} An array of scorer objects with name and scorer properties, or an empty array if no scorers are found.
986
971
  */
987
- const defaultScorers = (log) => {
972
+ const defaultScorers = (log: EvalSummary): Array<ScorerInfo> => {
988
973
  if (log.results?.scores) {
989
974
  return (log.results?.scores || [])
990
- .map((score) => {
975
+ .map((score): ScorerInfo => {
991
976
  return {
992
977
  name: score.name,
993
978
  scorer: score.scorer,
@@ -1002,14 +987,20 @@ const defaultScorers = (log) => {
1002
987
  accum.push(scorer);
1003
988
  }
1004
989
  return accum;
1005
- }, []);
990
+ }, [] as Array<ScorerInfo>);
1006
991
  } else if (log.sampleSummaries && log.sampleSummaries.length > 0) {
1007
- return Object.keys(log.sampleSummaries[0].scores).map((key) => {
1008
- return {
1009
- name: key,
1010
- scorer: key,
1011
- };
1012
- });
992
+ const scores = log.sampleSummaries[0].scores;
993
+
994
+ if (scores !== null) {
995
+ return Object.keys(scores).map((key) => {
996
+ return {
997
+ name: key,
998
+ scorer: key,
999
+ };
1000
+ });
1001
+ } else {
1002
+ return [];
1003
+ }
1013
1004
  } else {
1014
1005
  return [];
1015
1006
  }