inspect-ai 0.3.89__py3-none-any.whl → 0.3.91__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 +40 -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 -53
  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 +3583 -3508
  25. inspect_ai/_view/www/dist/assets/index.js +59212 -52521
  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 +13 -5
  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 +22 -8
  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 -9
  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 +83 -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.89.dist-info → inspect_ai-0.3.91.dist-info}/METADATA +6 -2
  263. inspect_ai-0.3.91.dist-info/RECORD +732 -0
  264. {inspect_ai-0.3.89.dist-info → inspect_ai-0.3.91.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.89.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.89.dist-info → inspect_ai-0.3.91.dist-info}/entry_points.txt +0 -0
  369. {inspect_ai-0.3.89.dist-info → inspect_ai-0.3.91.dist-info}/licenses/LICENSE +0 -0
  370. {inspect_ai-0.3.89.dist-info → inspect_ai-0.3.91.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,136 @@
1
+ import { filename } from "../../../utils/path";
2
+
3
+ import clsx from "clsx";
4
+ import { FC, MouseEvent, useMemo } from "react";
5
+ import {
6
+ EvalError,
7
+ EvalPlan,
8
+ EvalResults,
9
+ EvalSpec,
10
+ EvalStats,
11
+ Status,
12
+ } from "../../../@types/log";
13
+ import { DownloadPanel } from "../../../components/DownloadPanel";
14
+ import { JSONPanel } from "../../../components/JsonPanel";
15
+ import { ToolButton } from "../../../components/ToolButton";
16
+ import { kLogViewJsonTabId } from "../../../constants";
17
+ import { useStore } from "../../../state/store";
18
+ import { ApplicationIcons } from "../../appearance/icons";
19
+ import styles from "./JsonTab.module.css";
20
+
21
+ const kJsonMaxSize = 10000000;
22
+
23
+ // Individual hook for JSON tab
24
+ export const useJsonTabConfig = (
25
+ evalVersion: number | undefined,
26
+ evalStatus: Status | undefined,
27
+ evalSpec: EvalSpec | undefined,
28
+ evalPlan: EvalPlan | undefined,
29
+ evalError: EvalError | undefined | null,
30
+ evalResults: EvalResults | undefined | null,
31
+ evalStats: EvalStats | undefined,
32
+ ) => {
33
+ const selectedLogFile = useStore((state) =>
34
+ state.logsActions.getSelectedLogFile(),
35
+ );
36
+ const selectedTab = useStore((state) => state.app.tabs.workspace);
37
+
38
+ return useMemo(() => {
39
+ const evalHeader = {
40
+ version: evalVersion,
41
+ status: evalStatus,
42
+ eval: evalSpec,
43
+ plan: evalPlan,
44
+ error: evalError,
45
+ results: evalResults,
46
+ stats: evalStats,
47
+ };
48
+
49
+ return {
50
+ id: kLogViewJsonTabId,
51
+ label: "JSON",
52
+ scrollable: true,
53
+ component: JsonTab,
54
+ componentProps: {
55
+ logFile: selectedLogFile,
56
+ json: JSON.stringify(evalHeader, null, 2),
57
+ selected: selectedTab === kLogViewJsonTabId,
58
+ },
59
+ tools: () => [
60
+ <ToolButton
61
+ key="copy-json"
62
+ label="Copy JSON"
63
+ icon={ApplicationIcons.copy}
64
+ className={clsx("task-btn-json-copy", "clipboard-button")}
65
+ data-clipboard-target="#task-json-contents"
66
+ onClick={copyFeedback}
67
+ />,
68
+ ],
69
+ };
70
+ }, [
71
+ selectedLogFile,
72
+ evalVersion,
73
+ evalStatus,
74
+ evalSpec,
75
+ evalPlan,
76
+ evalError,
77
+ evalResults,
78
+ evalStats,
79
+ selectedTab,
80
+ ]);
81
+ };
82
+
83
+ // Helper function for copy feedback
84
+ const copyFeedback = (e: MouseEvent<HTMLElement>) => {
85
+ const textEl = e.currentTarget.querySelector(".task-btn-copy-content");
86
+ const iconEl = e.currentTarget.querySelector("i.bi");
87
+ if (textEl) {
88
+ const htmlEl = textEl as HTMLElement;
89
+ const htmlIconEl = iconEl as HTMLElement;
90
+ const oldText = htmlEl.innerText;
91
+ const oldIconClz = htmlIconEl.className;
92
+ htmlEl.innerText = "Copied!";
93
+ htmlIconEl.className = `${ApplicationIcons.confirm}`;
94
+ setTimeout(() => {
95
+ window.getSelection()?.removeAllRanges();
96
+ }, 50);
97
+ setTimeout(() => {
98
+ htmlEl.innerText = oldText;
99
+ htmlIconEl.className = oldIconClz;
100
+ }, 1250);
101
+ }
102
+ };
103
+
104
+ interface JsonTabProps {
105
+ logFile?: string;
106
+ selected: boolean;
107
+ json: string;
108
+ }
109
+
110
+ /**
111
+ * Renders JSON tab
112
+ */
113
+ export const JsonTab: FC<JsonTabProps> = ({ logFile, json }) => {
114
+ const downloadFiles = useStore((state) => state.capabilities.downloadFiles);
115
+ if (logFile && json.length > kJsonMaxSize && downloadFiles) {
116
+ // This JSON file is so large we can't really productively render it
117
+ // we should instead just provide a DL link
118
+ const file = `${filename(logFile)}.json`;
119
+ return (
120
+ <div className={styles.jsonTab}>
121
+ <DownloadPanel
122
+ message="The JSON for this log file is too large to render."
123
+ buttonLabel="Download JSON File"
124
+ fileName={file}
125
+ fileContents={json}
126
+ />
127
+ </div>
128
+ );
129
+ } else {
130
+ return (
131
+ <div className={styles.jsonTab}>
132
+ <JSONPanel id="task-json-contents" json={json} simple={true} />
133
+ </div>
134
+ );
135
+ }
136
+ };
@@ -1,17 +1,16 @@
1
- import {
2
- FC,
3
- Fragment,
4
- useCallback,
5
- useEffect,
6
- useMemo,
7
- useRef,
8
- useState,
9
- } from "react";
1
+ import { FC, Fragment, useEffect, useMemo, useRef, useState } from "react";
10
2
  import { VirtuosoHandle } from "react-virtuoso";
11
- import { NoContentsPanel } from "../../components/NoContentsPanel.tsx";
12
- import { InlineSampleDisplay } from "../../samples/InlineSampleDisplay.tsx";
13
- import { SampleDialog } from "../../samples/SampleDialog.tsx";
14
- import { SampleList } from "../../samples/list/SampleList.tsx";
3
+ import { Status } from "../../../@types/log";
4
+ import { InlineSampleDisplay } from "../../../app/samples/InlineSampleDisplay.tsx";
5
+ import { SampleDialog } from "../../../app/samples/SampleDialog.tsx";
6
+ import {
7
+ SampleTools,
8
+ ScoreFilterTools,
9
+ } from "../../../app/samples/SamplesTools.tsx";
10
+ import { SampleList } from "../../../app/samples/list/SampleList.tsx";
11
+ import { NoContentsPanel } from "../../../components/NoContentsPanel.tsx";
12
+ import { ToolButton } from "../../../components/ToolButton.tsx";
13
+ import { kLogViewSamplesTabId } from "../../../constants.ts";
15
14
  import {
16
15
  useFilteredSamples,
17
16
  useGroupBy,
@@ -19,19 +18,67 @@ import {
19
18
  useSampleDescriptor,
20
19
  useScore,
21
20
  useTotalSampleCount,
22
- } from "../../state/hooks.ts";
23
- import { useStore } from "../../state/store.ts";
21
+ } from "../../../state/hooks.ts";
22
+ import { useStore } from "../../../state/store.ts";
23
+ import { ApplicationIcons } from "../../appearance/icons.ts";
24
24
  import { RunningNoSamples } from "./RunningNoSamples.tsx";
25
25
  import { getSampleProcessor } from "./grouping.ts";
26
26
  import { ListItem } from "./types.ts";
27
27
 
28
+ // Individual hook for Samples tab
29
+ export const useSamplesTabConfig = (
30
+ evalStatus: Status | undefined,
31
+ refreshLog: () => void,
32
+ ) => {
33
+ const totalSampleCount = useTotalSampleCount();
34
+ const samplesDescriptor = useSampleDescriptor();
35
+ const sampleSummaries = useFilteredSamples();
36
+ const streamSamples = useStore((state) => state.capabilities.streamSamples);
37
+
38
+ return useMemo(() => {
39
+ return {
40
+ id: kLogViewSamplesTabId,
41
+ scrollable: false,
42
+ label: totalSampleCount > 1 ? "Samples" : "Sample",
43
+ component: SamplesTab,
44
+ componentProps: {
45
+ running: evalStatus === "started",
46
+ },
47
+ tools: () =>
48
+ !samplesDescriptor
49
+ ? undefined
50
+ : totalSampleCount === 1
51
+ ? [<ScoreFilterTools />]
52
+ : [
53
+ <SampleTools
54
+ samples={sampleSummaries || []}
55
+ key="sample-tools"
56
+ />,
57
+ evalStatus === "started" && !streamSamples && (
58
+ <ToolButton
59
+ key="refresh"
60
+ label="Refresh"
61
+ icon={ApplicationIcons.refresh}
62
+ onClick={refreshLog}
63
+ />
64
+ ),
65
+ ],
66
+ };
67
+ }, [
68
+ evalStatus,
69
+ refreshLog,
70
+ sampleSummaries,
71
+ samplesDescriptor,
72
+ totalSampleCount,
73
+ ]);
74
+ };
75
+
28
76
  interface SamplesTabProps {
29
77
  // Required props
30
78
  running: boolean;
31
79
  }
32
80
 
33
81
  export const SamplesTab: FC<SamplesTabProps> = ({ running }) => {
34
- const selectSample = useStore((state) => state.logActions.selectSample);
35
82
  const selectedSampleIndex = useStore(
36
83
  (state) => state.log.selectedSampleIndex,
37
84
  );
@@ -68,25 +115,6 @@ export const SamplesTab: FC<SamplesTabProps> = ({ running }) => {
68
115
  const [sampleItems, setSampleItems] = useState<ListItem[]>([]);
69
116
 
70
117
  const sampleListHandle = useRef<VirtuosoHandle | null>(null);
71
- const sampleDialogRef = useRef<HTMLDivElement>(null);
72
-
73
- const selectedSampleTab = useStore((state) => state.app.tabs.sample);
74
- const setSelectedSampleTab = useStore(
75
- (state) => state.appActions.setSampleTab,
76
- );
77
- const showingSampleDialog = useStore((state) => state.app.dialogs.sample);
78
- const setShowingSampleDialog = useStore(
79
- (state) => state.appActions.setShowingSampleDialog,
80
- );
81
-
82
- // Shows the sample dialog
83
- const showSample = useCallback(
84
- (index: number) => {
85
- selectSample(index);
86
- setShowingSampleDialog(true);
87
- },
88
- [selectSample, setShowingSampleDialog],
89
- );
90
118
 
91
119
  // Keep the selected item scrolled into view
92
120
  useEffect(() => {
@@ -97,13 +125,25 @@ export const SamplesTab: FC<SamplesTabProps> = ({ running }) => {
97
125
  }, 0);
98
126
  }, [selectedSampleIndex]);
99
127
 
100
- // Focus the dialog when it is shown
128
+ const showingSampleDialog = useStore((state) => state.app.dialogs.sample);
129
+
130
+ // Focus the sample list when sample dialog is hidden, but only when it's being dismissed
131
+ const previousShowingDialogRef = useRef(showingSampleDialog);
101
132
  useEffect(() => {
102
- if (showingSampleDialog) {
133
+ // Only focus when transitioning from showing dialog to not showing dialog
134
+ if (
135
+ previousShowingDialogRef.current &&
136
+ !showingSampleDialog &&
137
+ sampleListHandle.current
138
+ ) {
103
139
  setTimeout(() => {
104
- sampleDialogRef.current?.focus();
105
- }, 0);
140
+ const element = document.querySelector(".samples-list");
141
+ if (element instanceof HTMLElement) {
142
+ element.focus();
143
+ }
144
+ }, 10);
106
145
  }
146
+ previousShowingDialogRef.current = showingSampleDialog;
107
147
  }, [showingSampleDialog]);
108
148
 
109
149
  const sampleProcessor = useMemo(() => {
@@ -149,25 +189,6 @@ export const SamplesTab: FC<SamplesTabProps> = ({ running }) => {
149
189
  );
150
190
  }, [sampleSummaries, sampleProcessor]);
151
191
 
152
- const previousSampleIndex = useCallback(() => {
153
- return selectedSampleIndex > 0 ? selectedSampleIndex - 1 : -1;
154
- }, [selectedSampleIndex]);
155
-
156
- // Manage the next / previous state the selected sample
157
- const nextSample = useCallback(() => {
158
- const next = Math.min(selectedSampleIndex + 1, sampleItems.length - 1);
159
- if (next > -1) {
160
- selectSample(next);
161
- }
162
- }, [selectedSampleIndex, sampleItems, selectSample]);
163
-
164
- const previousSample = useCallback(() => {
165
- const prev = previousSampleIndex();
166
- if (prev > -1) {
167
- selectSample(prev);
168
- }
169
- }, [previousSampleIndex, selectSample]);
170
-
171
192
  const title =
172
193
  selectedSampleIndex > -1 && sampleItems.length > selectedSampleIndex
173
194
  ? sampleItems[selectedSampleIndex].label
@@ -183,11 +204,7 @@ export const SamplesTab: FC<SamplesTabProps> = ({ running }) => {
183
204
  return (
184
205
  <Fragment>
185
206
  {samplesDescriptor && totalSampleCount === 1 ? (
186
- <InlineSampleDisplay
187
- id="sample-display"
188
- selectedTab={selectedSampleTab}
189
- setSelectedTab={setSelectedSampleTab}
190
- />
207
+ <InlineSampleDisplay />
191
208
  ) : undefined}
192
209
  {samplesDescriptor && totalSampleCount > 1 ? (
193
210
  <SampleList
@@ -195,23 +212,15 @@ export const SamplesTab: FC<SamplesTabProps> = ({ running }) => {
195
212
  items={items}
196
213
  totalItemCount={evalSampleCount}
197
214
  running={running}
198
- nextSample={nextSample}
199
- prevSample={previousSample}
200
- showSample={showSample}
201
215
  />
202
216
  ) : undefined}
203
- {showingSampleDialog ? (
217
+ {showingSampleDialog && (
204
218
  <SampleDialog
205
219
  id={String(selectedSample?.id || "")}
206
220
  title={title}
207
221
  showingSampleDialog={showingSampleDialog}
208
- setShowingSampleDialog={setShowingSampleDialog}
209
- selectedTab={selectedSampleTab}
210
- setSelectedTab={setSelectedSampleTab}
211
- nextSample={nextSample}
212
- prevSample={previousSample}
213
222
  />
214
- ) : undefined}
223
+ )}
215
224
  </Fragment>
216
225
  );
217
226
  }
@@ -1,7 +1,7 @@
1
- import { SampleSummary } from "../../api/types";
1
+ import { Epochs } from "../../../@types/log";
2
+ import { ScoreLabel } from "../../../app/types";
3
+ import { SampleSummary } from "../../../client/api/types";
2
4
  import { SamplesDescriptor } from "../../samples/descriptor/samplesDescriptor";
3
- import { ScoreLabel } from "../../types";
4
- import { Epochs } from "../../types/log";
5
5
  import { ListItem, SampleListItem, SeparatorListItem } from "./types";
6
6
 
7
7
  export const getSampleProcessor = (
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from "react";
2
- import { SampleSummary } from "../../api/types";
2
+ import { SampleSummary } from "../../../client/api/types";
3
3
 
4
4
  export interface SampleListItem {
5
5
  label: string;
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
- import { MetaDataView } from "../metadata/MetaDataView";
3
- import { EvalDataset } from "../types/log";
2
+ import { EvalDataset } from "../../@types/log";
3
+ import { MetaDataView } from "../content/MetaDataView";
4
4
 
5
5
  import { CSSProperties, FC } from "react";
6
6
  import styles from "./DatasetDetailView.module.css";
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { FC } from "react";
3
- import { MetaDataGrid } from "../metadata/MetaDataGrid";
3
+ import { MetaDataGrid } from "../content/MetaDataGrid";
4
4
  import styles from "./DetailStep.module.css";
5
5
 
6
6
  interface DetailStepProps {
@@ -1,10 +1,10 @@
1
1
  import { FC } from "react";
2
- import { ApplicationIcons } from "../appearance/icons";
3
- import { Card, CardBody, CardHeader } from "../components/Card";
4
- import { EvalModelConfig, EvalSpec } from "../types/log";
5
2
 
6
3
  import clsx from "clsx";
7
- import { MetaDataGrid } from "../metadata/MetaDataGrid";
4
+ import { EvalModelConfig, EvalSpec } from "../../@types/log";
5
+ import { Card, CardBody, CardHeader } from "../../components/Card";
6
+ import { ApplicationIcons } from "../appearance/icons";
7
+ import { MetaDataGrid } from "../content/MetaDataGrid";
8
8
  import styles from "./ModelCard.module.css";
9
9
 
10
10
  interface ModelCardProps {
@@ -1,7 +1,7 @@
1
1
  import { FC } from "react";
2
+ import { EvalPlan, EvalScore, EvalSpec } from "../../@types/log";
3
+ import { Card, CardBody, CardHeader } from "../../components/Card";
2
4
  import { ApplicationIcons } from "../appearance/icons";
3
- import { Card, CardBody, CardHeader } from "../components/Card";
4
- import { EvalPlan, EvalScore, EvalSpec } from "../types/log";
5
5
  import { PlanDetailView } from "./PlanDetailView";
6
6
 
7
7
  interface PlanCardProps {
@@ -1,14 +1,14 @@
1
- import { MetaDataView } from "../metadata/MetaDataView";
2
- import { EvalPlan, EvalScore, EvalSpec, Params2 } from "../types/log";
3
- import { toTitleCase } from "../utils/format";
4
- import { ghCommitUrl } from "../utils/git";
1
+ import { EvalPlan, EvalScore, EvalSpec, Params2 } from "../../@types/log";
2
+ import { toTitleCase } from "../../utils/format";
3
+ import { ghCommitUrl } from "../../utils/git";
4
+ import { MetaDataView } from "../content/MetaDataView";
5
5
  import { DatasetDetailView } from "./DatasetDetailView";
6
6
  import { ScorerDetailView } from "./ScorerDetailView";
7
7
  import { SolversDetailView } from "./SolverDetailView";
8
8
 
9
9
  import clsx from "clsx";
10
10
  import { FC, ReactNode } from "react";
11
- import { kModelNone } from "../constants";
11
+ import { kModelNone } from "../../constants";
12
12
  import styles from "./PlanDetailView.module.css";
13
13
 
14
14
  interface PlanDetailViewProps {
@@ -1,7 +1,7 @@
1
1
  import clsx from "clsx";
2
2
  import { FC, Fragment } from "react";
3
+ import { Steps } from "../../@types/log";
3
4
  import { ApplicationIcons } from "../appearance/icons";
4
- import { Steps } from "../types/log";
5
5
  import { DetailStep } from "./DetailStep";
6
6
  import styles from "./SolverDetailView.module.css";
7
7
 
@@ -0,0 +1,58 @@
1
+ import { useEffect } from "react";
2
+ import {
3
+ createHashRouter,
4
+ Navigate,
5
+ Outlet,
6
+ useLocation,
7
+ } from "react-router-dom";
8
+ import { storeImplementation } from "../../state/store";
9
+ import { AppErrorBoundary } from "../AppErrorBoundary";
10
+ import { LogViewContainer } from "../log-view/LogViewContainer";
11
+ import { kLogRouteUrlPattern, kSampleRouteUrlPattern } from "./url";
12
+
13
+ // Create a layout component that includes the RouteTracker
14
+ const AppLayout = () => {
15
+ const location = useLocation();
16
+
17
+ // Track changes to routes
18
+ useEffect(() => {
19
+ if (storeImplementation) {
20
+ storeImplementation.getState().appActions.setUrlHash(location.pathname);
21
+ }
22
+ }, [location]);
23
+
24
+ return (
25
+ <AppErrorBoundary>
26
+ <Outlet />
27
+ </AppErrorBoundary>
28
+ );
29
+ };
30
+
31
+ // Create router with our routes (using hash router for static deployments)
32
+ export const AppRouter = createHashRouter(
33
+ [
34
+ {
35
+ path: "/",
36
+ element: <AppLayout />,
37
+ children: [
38
+ {
39
+ index: true, // This will match exactly the "/" path
40
+ element: <LogViewContainer />,
41
+ },
42
+ {
43
+ path: kLogRouteUrlPattern,
44
+ element: <LogViewContainer />,
45
+ },
46
+ {
47
+ path: kSampleRouteUrlPattern,
48
+ element: <LogViewContainer />,
49
+ },
50
+ ],
51
+ },
52
+ {
53
+ path: "*",
54
+ element: <Navigate to="/" replace />,
55
+ },
56
+ ],
57
+ { basename: "" },
58
+ );