inspect-ai 0.3.90__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 -41
  12. inspect_ai/_eval/task/sandbox.py +19 -5
  13. inspect_ai/_util/_async.py +1 -1
  14. inspect_ai/_util/constants.py +1 -0
  15. inspect_ai/_util/environ.py +32 -0
  16. inspect_ai/_util/file.py +8 -1
  17. inspect_ai/_util/httpx.py +105 -22
  18. inspect_ai/_util/registry.py +83 -9
  19. inspect_ai/_util/text.py +81 -17
  20. inspect_ai/_util/transcript.py +9 -6
  21. inspect_ai/_util/vscode.py +7 -2
  22. inspect_ai/_view/schema.py +1 -1
  23. inspect_ai/_view/www/babel.config.js +11 -0
  24. inspect_ai/_view/www/dist/assets/index.css +3640 -3563
  25. inspect_ai/_view/www/dist/assets/index.js +59204 -52519
  26. inspect_ai/_view/www/eslint.config.mjs +10 -1
  27. inspect_ai/_view/www/jest.config.mjs +21 -0
  28. inspect_ai/_view/www/log-schema.json +111 -2
  29. inspect_ai/_view/www/package.json +19 -5
  30. inspect_ai/_view/www/src/{types → @types}/log.d.ts +95 -32
  31. inspect_ai/_view/www/{App.css → src/app/App.css} +22 -14
  32. inspect_ai/_view/www/src/app/App.tsx +168 -0
  33. inspect_ai/_view/www/src/{AppErrorBoundary.tsx → app/AppErrorBoundary.tsx} +1 -1
  34. inspect_ai/_view/www/src/{appearance → app/appearance}/icons.ts +1 -0
  35. inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.tsx +5 -5
  36. inspect_ai/_view/www/src/{workspace/WorkSpaceView.tsx → app/log-view/LogView.tsx} +59 -40
  37. inspect_ai/_view/www/src/app/log-view/LogViewContainer.tsx +159 -0
  38. inspect_ai/_view/www/src/app/log-view/LogViewLayout.tsx +109 -0
  39. inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.tsx +3 -3
  40. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.tsx +1 -1
  41. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.tsx +4 -4
  42. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.tsx +8 -8
  43. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.tsx +6 -6
  44. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.tsx +1 -1
  45. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.tsx +1 -1
  46. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.tsx +8 -8
  47. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.tsx +35 -6
  48. inspect_ai/_view/www/src/app/log-view/tabs/JsonTab.tsx +136 -0
  49. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/SamplesTab.tsx +82 -73
  50. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/grouping.ts +3 -3
  51. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/types.ts +1 -1
  52. inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.tsx +2 -2
  53. inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.tsx +1 -1
  54. inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.tsx +4 -4
  55. inspect_ai/_view/www/src/{plan → app/plan}/PlanCard.tsx +2 -2
  56. inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.tsx +5 -5
  57. inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.tsx +1 -1
  58. inspect_ai/_view/www/src/app/routing/AppRouter.tsx +58 -0
  59. inspect_ai/_view/www/src/app/routing/navigationHooks.ts +182 -0
  60. inspect_ai/_view/www/src/app/routing/url.ts +43 -0
  61. inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.tsx +11 -27
  62. inspect_ai/_view/www/src/{samples → app/samples}/SampleDialog.tsx +36 -40
  63. inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.module.css +4 -0
  64. inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.tsx +116 -49
  65. inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.module.css +1 -1
  66. inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.tsx +29 -26
  67. inspect_ai/_view/www/src/{samples → app/samples}/SamplesTools.tsx +3 -3
  68. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.module.css +5 -2
  69. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.tsx +12 -4
  70. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRenderer.tsx +3 -3
  71. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.tsx +6 -1
  72. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatView.tsx +4 -2
  73. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.tsx +5 -3
  74. inspect_ai/_view/www/src/app/samples/chat/MessageContent.module.css +12 -0
  75. inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContent.tsx +11 -10
  76. inspect_ai/_view/www/src/app/samples/chat/MessageContents.module.css +7 -0
  77. inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContents.tsx +14 -8
  78. inspect_ai/_view/www/src/{samples → app/samples}/chat/messages.ts +2 -2
  79. inspect_ai/_view/www/src/app/samples/chat/tools/ToolCallView.module.css +7 -0
  80. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolCallView.tsx +26 -27
  81. inspect_ai/_view/www/src/app/samples/chat/tools/ToolInput.module.css +19 -0
  82. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolInput.tsx +3 -3
  83. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.module.css +1 -0
  84. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.tsx +1 -1
  85. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.module.css +4 -0
  86. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.tsx +2 -2
  87. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/tool.ts +1 -1
  88. inspect_ai/_view/www/src/app/samples/chat/types.ts +1 -0
  89. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/samplesDescriptor.tsx +38 -15
  90. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.tsx +1 -1
  91. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/CategoricalScoreDescriptor.tsx +2 -2
  92. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/NumericScoreDescriptor.tsx +3 -3
  93. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.tsx +4 -4
  94. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/OtherScoreDescriptor.tsx +2 -2
  95. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.tsx +2 -2
  96. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ScoreDescriptor.tsx +1 -1
  97. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/types.ts +4 -3
  98. inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.module.css +2 -1
  99. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.tsx +3 -0
  100. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.tsx +47 -33
  101. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.module.css +16 -0
  102. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.tsx +47 -20
  103. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.tsx +1 -1
  104. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.tsx +4 -4
  105. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/filters.ts +8 -6
  106. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.tsx +4 -3
  107. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/completions.ts +1 -1
  108. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/language.ts +1 -0
  109. inspect_ai/_view/www/src/{samples → app/samples}/sampleDataAdapter.ts +3 -3
  110. inspect_ai/_view/www/src/{samples → app/samples}/sampleLimit.ts +1 -1
  111. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.tsx +1 -1
  112. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.tsx +12 -11
  113. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.tsx +6 -6
  114. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ApprovalEventView.tsx +1 -1
  115. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ErrorEventView.tsx +3 -3
  116. inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.tsx +4 -4
  117. inspect_ai/_view/www/src/{samples → app/samples}/transcript/InputEventView.tsx +3 -3
  118. inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.tsx +3 -3
  119. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.module.css +13 -7
  120. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.tsx +49 -21
  121. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.tsx +11 -9
  122. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleLimitEventView.tsx +1 -1
  123. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.tsx +8 -6
  124. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.tsx +4 -4
  125. inspect_ai/_view/www/src/{samples → app/samples}/transcript/StepEventView.tsx +11 -3
  126. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.tsx +2 -2
  127. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.tsx +2 -2
  128. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.module.css +8 -7
  129. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.tsx +32 -114
  130. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.module.css +6 -5
  131. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.tsx +14 -2
  132. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.tsx +2 -2
  133. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.tsx +1 -1
  134. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/utils.ts +1 -1
  135. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenderers.tsx +23 -21
  136. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenders.module.css +7 -0
  137. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.tsx +2 -2
  138. inspect_ai/_view/www/src/app/samples/transcript/transform/fixups.ts +142 -0
  139. inspect_ai/_view/www/src/app/samples/transcript/transform/treeify.ts +39 -0
  140. inspect_ai/_view/www/src/{samples → app/samples}/transcript/types.ts +1 -1
  141. inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.tsx +1 -1
  142. inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.module.css +16 -0
  143. inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.tsx +70 -0
  144. inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.module.css +8 -0
  145. inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.tsx +35 -17
  146. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.tsx +1 -1
  147. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.tsx +2 -2
  148. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.tsx +2 -2
  149. inspect_ai/_view/www/src/{types.ts → app/types.ts} +18 -11
  150. inspect_ai/_view/www/src/{usage → app/usage}/ModelTokenTable.tsx +1 -1
  151. inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.tsx +2 -2
  152. inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.tsx +1 -1
  153. inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.tsx +6 -6
  154. inspect_ai/_view/www/src/{api → client/api}/api-browser.ts +2 -2
  155. inspect_ai/_view/www/src/{api → client/api}/api-http.ts +3 -3
  156. inspect_ai/_view/www/src/{api → client/api}/api-vscode.ts +2 -2
  157. inspect_ai/_view/www/src/{api → client/api}/client-api.ts +6 -5
  158. inspect_ai/_view/www/src/{api → client/api}/index.ts +2 -2
  159. inspect_ai/_view/www/src/{api → client/api}/types.ts +4 -1
  160. inspect_ai/_view/www/src/{logfile → client/remote}/remoteLogFile.ts +3 -3
  161. inspect_ai/_view/www/src/{storage → client/storage}/index.ts +11 -5
  162. inspect_ai/_view/www/src/components/Card.tsx +1 -1
  163. inspect_ai/_view/www/src/components/CopyButton.tsx +1 -1
  164. inspect_ai/_view/www/src/components/DownloadButton.tsx +1 -1
  165. inspect_ai/_view/www/src/components/ErrorPanel.tsx +1 -1
  166. inspect_ai/_view/www/src/components/{ExpandablePanel.css → ExpandablePanel.module.css} +14 -11
  167. inspect_ai/_view/www/src/components/ExpandablePanel.tsx +16 -10
  168. inspect_ai/_view/www/src/components/FindBand.tsx +1 -1
  169. inspect_ai/_view/www/src/components/JsonPanel.css +2 -2
  170. inspect_ai/_view/www/src/components/LargeModal.tsx +12 -1
  171. inspect_ai/_view/www/src/components/LightboxCarousel.tsx +1 -1
  172. inspect_ai/_view/www/src/components/MarkdownDiv.tsx +3 -1
  173. inspect_ai/_view/www/src/components/MessageBand.tsx +1 -1
  174. inspect_ai/_view/www/src/components/NoContentsPanel.tsx +1 -1
  175. inspect_ai/_view/www/src/constants.ts +10 -9
  176. inspect_ai/_view/www/src/index.tsx +27 -11
  177. inspect_ai/_view/www/src/state/appSlice.ts +44 -5
  178. inspect_ai/_view/www/src/state/hooks.ts +30 -7
  179. inspect_ai/_view/www/src/state/logSlice.ts +7 -5
  180. inspect_ai/_view/www/src/state/logsPolling.ts +1 -1
  181. inspect_ai/_view/www/src/state/logsSlice.ts +18 -13
  182. inspect_ai/_view/www/src/state/samplePolling.ts +12 -12
  183. inspect_ai/_view/www/src/state/sampleSlice.ts +3 -5
  184. inspect_ai/_view/www/src/state/sampleUtils.ts +1 -1
  185. inspect_ai/_view/www/src/{scoring/utils.ts → state/scoring.ts} +2 -2
  186. inspect_ai/_view/www/src/state/store.ts +9 -7
  187. inspect_ai/_view/www/src/state/utils.ts +1 -1
  188. inspect_ai/_view/www/src/tests/README.md +49 -0
  189. inspect_ai/_view/www/src/tests/__mocks__/fileMock.js +1 -0
  190. inspect_ai/_view/www/src/tests/__mocks__/styleMock.js +1 -0
  191. inspect_ai/_view/www/src/tests/setupTests.mjs +1 -0
  192. inspect_ai/_view/www/src/tests/utils/base64.test.ts +23 -0
  193. inspect_ai/_view/www/src/tests/utils/format.test.ts +127 -0
  194. inspect_ai/_view/www/src/tests/utils/path.test.ts +54 -0
  195. inspect_ai/_view/www/src/utils/format.ts +8 -2
  196. inspect_ai/_view/www/src/utils/path.ts +14 -2
  197. inspect_ai/_view/www/src/utils/polling.ts +1 -2
  198. inspect_ai/_view/www/src/utils/uri.ts +32 -0
  199. inspect_ai/_view/www/yarn.lock +3310 -382
  200. inspect_ai/agent/_handoff.py +6 -3
  201. inspect_ai/agent/_human/agent.py +5 -3
  202. inspect_ai/agent/_human/install.py +16 -7
  203. inspect_ai/agent/_human/panel.py +14 -1
  204. inspect_ai/agent/_human/service.py +5 -1
  205. inspect_ai/agent/_react.py +161 -128
  206. inspect_ai/agent/_types.py +15 -4
  207. inspect_ai/approval/_policy.py +2 -2
  208. inspect_ai/log/_file.py +30 -11
  209. inspect_ai/log/_log.py +7 -1
  210. inspect_ai/log/_recorders/eval.py +3 -0
  211. inspect_ai/log/_recorders/types.py +1 -0
  212. inspect_ai/log/_samples.py +4 -0
  213. inspect_ai/model/_call_tools.py +33 -17
  214. inspect_ai/model/_generate_config.py +10 -2
  215. inspect_ai/model/_model.py +41 -21
  216. inspect_ai/model/_model_output.py +2 -1
  217. inspect_ai/model/_openai.py +10 -8
  218. inspect_ai/model/_openai_responses.py +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.90.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.90.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.90.dist-info/RECORD +0 -705
  275. /inspect_ai/_view/www/src/{types → @types}/asciicinema-player.d.ts +0 -0
  276. /inspect_ai/_view/www/src/{types → @types}/jsondiffpatch.d.ts +0 -0
  277. /inspect_ai/_view/www/src/{types → @types}/markdown-it-katex.d.ts +0 -0
  278. /inspect_ai/_view/www/src/{types → @types}/prism.d.ts +0 -0
  279. /inspect_ai/_view/www/src/{appearance → app/appearance}/colors.ts +0 -0
  280. /inspect_ai/_view/www/src/{appearance → app/appearance}/fonts.ts +0 -0
  281. /inspect_ai/_view/www/src/{appearance → app/appearance}/styles.ts +0 -0
  282. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataGrid.tsx +0 -0
  283. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.module.css +0 -0
  284. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.tsx +0 -0
  285. /inspect_ai/_view/www/src/{metadata → app/content}/MetadataGrid.module.css +0 -0
  286. /inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.module.css +0 -0
  287. /inspect_ai/_view/www/src/{metadata → app/content}/types.ts +0 -0
  288. /inspect_ai/_view/www/src/{workspace/WorkSpaceView.module.css → app/log-view/LogView.module.css} +0 -0
  289. /inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.module.css +0 -0
  290. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.module.css +0 -0
  291. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.module.css +0 -0
  292. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.module.css +0 -0
  293. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.module.css +0 -0
  294. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.module.css +0 -0
  295. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.module.css +0 -0
  296. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.module.css +0 -0
  297. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.module.css +0 -0
  298. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.tsx +0 -0
  299. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.module.css +0 -0
  300. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/JsonTab.module.css +0 -0
  301. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.module.css +0 -0
  302. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.tsx +0 -0
  303. /inspect_ai/_view/www/src/{workspace → app/log-view}/types.ts +0 -0
  304. /inspect_ai/_view/www/src/{workspace → app/log-view}/utils.ts +0 -0
  305. /inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.module.css +0 -0
  306. /inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.module.css +0 -0
  307. /inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.module.css +0 -0
  308. /inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.module.css +0 -0
  309. /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.module.css +0 -0
  310. /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.tsx +0 -0
  311. /inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.module.css +0 -0
  312. /inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.module.css +0 -0
  313. /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.module.css +0 -0
  314. /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.module.css +0 -0
  315. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.module.css +0 -0
  316. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.module.css +0 -0
  317. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.module.css +0 -0
  318. /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.module.css +0 -0
  319. /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.tsx +0 -0
  320. /inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.tsx +0 -0
  321. /inspect_ai/_view/www/src/{samples → app/samples}/error/error.ts +0 -0
  322. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.module.css +0 -0
  323. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.tsx +0 -0
  324. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.module.css +0 -0
  325. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.module.css +0 -0
  326. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.module.css +0 -0
  327. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.tsx +0 -0
  328. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.module.css +0 -0
  329. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.tsx +0 -0
  330. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.module.css +0 -0
  331. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.module.css +0 -0
  332. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.module.css +0 -0
  333. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/tokenize.ts +0 -0
  334. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.module.css +0 -0
  335. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.module.css +0 -0
  336. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.module.css +0 -0
  337. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.module.css +0 -0
  338. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.module.css +0 -0
  339. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.module.css +0 -0
  340. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.module.css +0 -0
  341. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.module.css +0 -0
  342. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.module.css +0 -0
  343. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.module.css +0 -0
  344. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.module.css +0 -0
  345. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.tsx +0 -0
  346. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.module.css +0 -0
  347. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.tsx +0 -0
  348. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.module.css +0 -0
  349. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.module.css +0 -0
  350. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.tsx +0 -0
  351. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.module.css +0 -0
  352. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.tsx +0 -0
  353. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.module.css +0 -0
  354. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.tsx +0 -0
  355. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.module.css +0 -0
  356. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateDiffView.tsx +0 -0
  357. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.module.css +0 -0
  358. /inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.module.css +0 -0
  359. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.module.css +0 -0
  360. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.module.css +0 -0
  361. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.module.css +0 -0
  362. /inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.module.css +0 -0
  363. /inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.module.css +0 -0
  364. /inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.module.css +0 -0
  365. /inspect_ai/_view/www/src/{api → client/api}/api-shared.ts +0 -0
  366. /inspect_ai/_view/www/src/{api → client/api}/jsonrpc.ts +0 -0
  367. /inspect_ai/_view/www/src/{logfile → client/remote}/remoteZipFile.ts +0 -0
  368. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/entry_points.txt +0 -0
  369. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/licenses/LICENSE +0 -0
  370. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.91.dist-info}/top_level.txt +0 -0
@@ -4,48 +4,66 @@ import {
4
4
  FC,
5
5
  Fragment,
6
6
  MouseEvent,
7
- RefObject,
8
7
  useCallback,
8
+ useRef,
9
9
  } from "react";
10
- import { RunningMetric } from "../api/types";
11
- import { EmptyPanel } from "../components/EmptyPanel";
12
- import { TabPanel, TabSet } from "../components/TabSet";
13
- import {
14
- EvalPlan,
15
- EvalResults,
16
- EvalSpec,
17
- EvalStats,
18
- Status,
19
- } from "../types/log";
10
+ import { EmptyPanel } from "../../components/EmptyPanel";
11
+ import { TabPanel, TabSet } from "../../components/TabSet";
20
12
  import { Navbar } from "./navbar/Navbar";
13
+
14
+ import { useEvalSpec, useRefreshLog } from "../../state/hooks";
15
+ import { useStore } from "../../state/store";
16
+ import { useLogNavigation } from "../routing/navigationHooks";
17
+ import styles from "./LogView.module.css";
18
+ import { useInfoTabConfig } from "./tabs/InfoTab";
19
+ import { useJsonTabConfig } from "./tabs/JsonTab";
20
+ import { useSamplesTabConfig } from "./tabs/SamplesTab";
21
21
  import { TabDescriptor } from "./types";
22
22
 
23
- import { useStore } from "../state/store";
24
- import styles from "./WorkSpaceView.module.css";
23
+ export const LogView: FC = () => {
24
+ const divRef = useRef<HTMLDivElement>(null);
25
+
26
+ const refreshLog = useRefreshLog();
27
+ const navigation = useLogNavigation();
28
+
29
+ const selectedLogSummary = useStore((state) => state.log.selectedLogSummary);
30
+ const evalSpec = useEvalSpec();
31
+ const runningMetrics = useStore(
32
+ (state) => state.log.pendingSampleSummaries?.metrics,
33
+ );
34
+ const logs = useStore((state) => state.logs.logs);
35
+ const showToggle = logs.files.length > 1 || !!logs.log_dir || false;
36
+
37
+ // Use individual tab config hooks
38
+ const samplesTabConfig = useSamplesTabConfig(
39
+ selectedLogSummary?.status,
40
+ refreshLog,
41
+ );
42
+
43
+ const configTabConfig = useInfoTabConfig(
44
+ evalSpec,
45
+ selectedLogSummary?.plan,
46
+ selectedLogSummary?.error,
47
+ selectedLogSummary?.results,
48
+ selectedLogSummary?.stats,
49
+ );
50
+
51
+ const jsonTabConfig = useJsonTabConfig(
52
+ selectedLogSummary?.version,
53
+ selectedLogSummary?.status,
54
+ evalSpec,
55
+ selectedLogSummary?.plan,
56
+ selectedLogSummary?.error,
57
+ selectedLogSummary?.results,
58
+ selectedLogSummary?.stats,
59
+ );
25
60
 
26
- interface WorkSpaceViewProps {
27
- evalSpec: EvalSpec;
28
- evalPlan?: EvalPlan;
29
- evalResults?: EvalResults;
30
- runningMetrics?: RunningMetric[];
31
- evalStats?: EvalStats;
32
- status?: Status;
33
- showToggle: boolean;
34
- tabs: Record<string, TabDescriptor<any>>;
35
- divRef: RefObject<HTMLDivElement | null>;
36
- }
61
+ const tabs: Record<string, TabDescriptor<any>> = {
62
+ ...(samplesTabConfig ? { samples: samplesTabConfig } : {}),
63
+ config: configTabConfig,
64
+ json: jsonTabConfig,
65
+ };
37
66
 
38
- export const WorkSpaceView: FC<WorkSpaceViewProps> = ({
39
- evalSpec,
40
- evalPlan,
41
- evalResults,
42
- runningMetrics,
43
- evalStats,
44
- status,
45
- showToggle,
46
- tabs,
47
- divRef,
48
- }) => {
49
67
  const selectedTab = useStore((state) => state.app.tabs.workspace);
50
68
  const setSelectedTab = useStore((state) => state.appActions.setWorkspaceTab);
51
69
 
@@ -54,9 +72,10 @@ export const WorkSpaceView: FC<WorkSpaceViewProps> = ({
54
72
  const id = e.currentTarget?.id;
55
73
  if (id) {
56
74
  setSelectedTab(id);
75
+ navigation.selectTab(id);
57
76
  }
58
77
  },
59
- [setSelectedTab],
78
+ [setSelectedTab, navigation.selectTab],
60
79
  );
61
80
 
62
81
  if (evalSpec === undefined) {
@@ -83,11 +102,11 @@ export const WorkSpaceView: FC<WorkSpaceViewProps> = ({
83
102
  <Fragment>
84
103
  <Navbar
85
104
  evalSpec={evalSpec}
86
- evalPlan={evalPlan}
87
- evalResults={evalResults}
105
+ evalPlan={selectedLogSummary?.plan}
106
+ evalResults={selectedLogSummary?.results}
88
107
  runningMetrics={runningMetrics}
89
- evalStats={evalStats}
90
- status={status}
108
+ evalStats={selectedLogSummary?.stats}
109
+ status={selectedLogSummary?.status}
91
110
  showToggle={showToggle}
92
111
  />
93
112
  <div ref={divRef} className={clsx("workspace", styles.workspace)}>
@@ -0,0 +1,159 @@
1
+ import { FC, useEffect } from "react";
2
+ import { useNavigate, useParams } from "react-router-dom";
3
+ import { kLogViewSamplesTabId } from "../../constants";
4
+ import { useFilteredSamples, useTotalSampleCount } from "../../state/hooks";
5
+ import { useStore } from "../../state/store";
6
+ import { baseUrl } from "../routing/url";
7
+ import { LogViewLayout } from "./LogViewLayout";
8
+
9
+ /**
10
+ * LogContainer component that handles routing to specific logs, tabs, and samples
11
+ */
12
+ export const LogViewContainer: FC = () => {
13
+ const { logPath, tabId, sampleId, epoch, sampleTabId } = useParams<{
14
+ logPath?: string;
15
+ tabId?: string;
16
+ sampleId?: string;
17
+ epoch?: string;
18
+ sampleTabId?: string;
19
+ }>();
20
+ const selectLogFile = useStore((state) => state.logsActions.selectLogFile);
21
+ const refreshLogs = useStore((state) => state.logsActions.refreshLogs);
22
+ const setWorkspaceTab = useStore((state) => state.appActions.setWorkspaceTab);
23
+ const setShowingSampleDialog = useStore(
24
+ (state) => state.appActions.setShowingSampleDialog,
25
+ );
26
+ const selectSample = useStore((state) => state.logActions.selectSample);
27
+ const setSampleTab = useStore((state) => state.appActions.setSampleTab);
28
+ const filteredSamples = useFilteredSamples();
29
+ const totalSampleCount = useTotalSampleCount();
30
+ const setStatus = useStore((state) => state.appActions.setStatus);
31
+ const setSelectedLogIndex = useStore(
32
+ (state) => state.logsActions.setSelectedLogIndex,
33
+ );
34
+
35
+ const selectedLogIndex = useStore((state) => state.logs.selectedLogIndex);
36
+ const initialState = useStore((state) => state.app.initialState);
37
+ const clearInitialState = useStore(
38
+ (state) => state.appActions.clearInitialState,
39
+ );
40
+ const navigate = useNavigate();
41
+
42
+ useEffect(() => {
43
+ if (initialState) {
44
+ const url = baseUrl(
45
+ initialState.log,
46
+ initialState.sample_id,
47
+ initialState.sample_epoch,
48
+ );
49
+ clearInitialState();
50
+ navigate(url);
51
+ }
52
+ }, [initialState]);
53
+
54
+ useEffect(() => {
55
+ const loadLogFromPath = async () => {
56
+ if (logPath) {
57
+ await selectLogFile(decodeURIComponent(logPath));
58
+
59
+ // Set the tab if specified in the URL
60
+ if (tabId) {
61
+ // Only set the tab if it's valid - the LogView component will handle
62
+ // determining if the tab exists before updating the state
63
+ setWorkspaceTab(tabId);
64
+ } else {
65
+ setWorkspaceTab(kLogViewSamplesTabId);
66
+ }
67
+ } else {
68
+ setStatus({
69
+ loading: true,
70
+ error: undefined,
71
+ });
72
+
73
+ // Reset the log/task tab
74
+ setSelectedLogIndex(-1);
75
+ setWorkspaceTab(kLogViewSamplesTabId);
76
+
77
+ // Refresh the list of logs
78
+ await refreshLogs();
79
+
80
+ // Select the first log in the list
81
+ setSelectedLogIndex(0);
82
+
83
+ if (!sampleId) {
84
+ selectSample(0);
85
+ }
86
+
87
+ setStatus({
88
+ loading: false,
89
+ error: undefined,
90
+ });
91
+ }
92
+ };
93
+
94
+ loadLogFromPath();
95
+ }, [
96
+ logPath,
97
+ tabId,
98
+ selectLogFile,
99
+ refreshLogs,
100
+ setWorkspaceTab,
101
+ setSelectedLogIndex,
102
+ setStatus,
103
+ ]);
104
+
105
+ const clearSample = useStore(
106
+ (state) => state.sampleActions.clearSelectedSample,
107
+ );
108
+
109
+ useEffect(() => {
110
+ if (selectedLogIndex > -1) {
111
+ selectSample(0);
112
+ }
113
+ }, [selectedLogIndex]);
114
+
115
+ // Handle sample selection from URL params
116
+ useEffect(() => {
117
+ if (sampleId && filteredSamples) {
118
+ // Find the sample with matching ID and epoch
119
+ const targetEpoch = epoch ? parseInt(epoch, 10) : undefined;
120
+ const sampleIndex = filteredSamples.findIndex((sample) => {
121
+ const matches =
122
+ String(sample.id) === sampleId &&
123
+ (targetEpoch === undefined || sample.epoch === targetEpoch);
124
+ return matches;
125
+ });
126
+
127
+ if (sampleIndex >= 0) {
128
+ selectSample(sampleIndex);
129
+ // Set the sample tab if specified in the URL
130
+ if (sampleTabId) {
131
+ setSampleTab(sampleTabId);
132
+ }
133
+
134
+ if (filteredSamples.length > 1) {
135
+ setShowingSampleDialog(true);
136
+ }
137
+ }
138
+ } else {
139
+ // If we don't have sample params in the URL but the dialog is showing, close it
140
+ // This handles the case when user navigates back from a sample
141
+ setShowingSampleDialog(false);
142
+ if (totalSampleCount > 1) {
143
+ clearSample();
144
+ }
145
+ }
146
+ }, [
147
+ sampleId,
148
+ epoch,
149
+ sampleTabId,
150
+ filteredSamples,
151
+ totalSampleCount,
152
+ selectSample,
153
+ setSampleTab,
154
+ setShowingSampleDialog,
155
+ clearSample,
156
+ ]);
157
+
158
+ return <LogViewLayout />;
159
+ };
@@ -0,0 +1,109 @@
1
+ import clsx from "clsx";
2
+ import { FC, KeyboardEvent, useCallback, useRef } from "react";
3
+ import { ErrorPanel } from "../../components/ErrorPanel";
4
+ import { FindBand } from "../../components/FindBand";
5
+ import { ProgressBar } from "../../components/ProgressBar";
6
+ import { useStore } from "../../state/store";
7
+ import { Sidebar } from "../sidebar/Sidebar";
8
+ import { LogView } from "./LogView";
9
+
10
+ /**
11
+ * AppContent component with the main UI layout
12
+ */
13
+ export const LogViewLayout: FC = () => {
14
+ // App layout and state
15
+ const appStatus = useStore((state) => state.app.status);
16
+ const offCanvas = useStore((state) => state.app.offcanvas);
17
+ const setOffCanvas = useStore((state) => state.appActions.setOffcanvas);
18
+ const clearWorkspaceTab = useStore(
19
+ (state) => state.appActions.clearWorkspaceTab,
20
+ );
21
+ const clearSampleTab = useStore((state) => state.appActions.clearSampleTab);
22
+
23
+ // Find
24
+ const nativeFind = useStore((state) => state.capabilities.nativeFind);
25
+ const showFind = useStore((state) => state.app.showFind);
26
+ const setShowFind = useStore((state) => state.appActions.setShowFind);
27
+ const hideFind = useStore((state) => state.appActions.hideFind);
28
+
29
+ // Logs Data
30
+ const logs = useStore((state) => state.logs.logs);
31
+ const selectedLogIndex = useStore((state) => state.logs.selectedLogIndex);
32
+ const logHeaders = useStore((state) => state.logs.logHeaders);
33
+ const headersLoading = useStore((state) => state.logs.headersLoading);
34
+
35
+ // Log Data
36
+ const selectedLogSummary = useStore((state) => state.log.selectedLogSummary);
37
+ const resetFiltering = useStore((state) => state.logActions.resetFiltering);
38
+ const selectSample = useStore((state) => state.logActions.selectSample);
39
+
40
+ // The main application reference
41
+ const mainAppRef = useRef<HTMLDivElement>(null);
42
+
43
+ // Configure an app envelope specific to the current state
44
+ // if there are no log files, then don't show sidebar
45
+ const fullScreen = logs.files.length === 1 && !logs.log_dir;
46
+
47
+ const handleSelectedIndexChanged = useCallback(() => {
48
+ setOffCanvas(false);
49
+ resetFiltering();
50
+ clearSampleTab();
51
+ clearWorkspaceTab();
52
+ }, [
53
+ setOffCanvas,
54
+ resetFiltering,
55
+ clearSampleTab,
56
+ clearWorkspaceTab,
57
+ selectSample,
58
+ ]);
59
+
60
+ const handleKeyboard = useCallback(
61
+ (e: KeyboardEvent) => {
62
+ // Add keyboard shortcuts for find, if needed
63
+ if (nativeFind || !setShowFind) {
64
+ return;
65
+ }
66
+
67
+ if ((e.ctrlKey || e.metaKey) && e.key === "f") {
68
+ setShowFind(true);
69
+ } else if (e.key === "Escape") {
70
+ hideFind();
71
+ }
72
+ },
73
+ [nativeFind, setShowFind, hideFind],
74
+ );
75
+
76
+ return (
77
+ <>
78
+ {!fullScreen && selectedLogSummary ? (
79
+ <Sidebar
80
+ logHeaders={logHeaders}
81
+ loading={headersLoading}
82
+ selectedIndex={selectedLogIndex}
83
+ onSelectedIndexChanged={handleSelectedIndexChanged}
84
+ />
85
+ ) : undefined}
86
+ <div
87
+ ref={mainAppRef}
88
+ className={clsx(
89
+ "app-main-grid",
90
+ fullScreen ? "full-screen" : undefined,
91
+ offCanvas ? "off-canvas" : undefined,
92
+ )}
93
+ tabIndex={0}
94
+ onKeyDown={handleKeyboard}
95
+ >
96
+ {!nativeFind && showFind ? <FindBand /> : ""}
97
+ <ProgressBar animating={appStatus.loading} />
98
+ {appStatus.error ? (
99
+ <ErrorPanel
100
+ title="An error occurred while loading this task."
101
+ error={appStatus.error}
102
+ />
103
+ ) : (
104
+ <LogView />
105
+ )}
106
+ </div>
107
+ </>
108
+ );
109
+ };
@@ -1,9 +1,9 @@
1
1
  import { FC } from "react";
2
2
  import { ApplicationIcons } from "../../appearance/icons";
3
3
 
4
- import { ANSIDisplay } from "../../components/AnsiDisplay";
5
- import { Card, CardBody, CardHeader } from "../../components/Card";
6
- import { EvalError } from "../../types/log";
4
+ import { EvalError } from "../../../@types/log";
5
+ import { ANSIDisplay } from "../../../components/AnsiDisplay";
6
+ import { Card, CardBody, CardHeader } from "../../../components/Card";
7
7
 
8
8
  import styles from "./TaskErrorPanel.module.css";
9
9
 
@@ -1,7 +1,7 @@
1
1
  import { FC } from "react";
2
- import { ModelRoles } from "../../types/log";
3
2
 
4
3
  import clsx from "clsx";
4
+ import { ModelRoles } from "../../../@types/log";
5
5
  import styles from "./ModelRolesView.module.css";
6
6
 
7
7
  interface ModelRolesViewProps {
@@ -1,21 +1,21 @@
1
1
  import clsx from "clsx";
2
2
  import { FC } from "react";
3
- import { RunningMetric } from "../../api/types";
4
- import { useTotalSampleCount } from "../../state/hooks";
5
3
  import {
6
4
  EvalPlan,
7
5
  EvalResults,
8
6
  EvalSpec,
9
7
  EvalStats,
10
8
  Status,
11
- } from "../../types/log";
9
+ } from "../../../@types/log";
10
+ import { RunningMetric } from "../../../client/api/types";
11
+ import { useTotalSampleCount } from "../../../state/hooks";
12
12
  import styles from "./Navbar.module.css";
13
13
  import { PrimaryBar } from "./PrimaryBar";
14
14
  import { SecondaryBar } from "./SecondaryBar";
15
15
 
16
16
  interface NavBarProps {
17
17
  evalSpec?: EvalSpec;
18
- evalResults?: EvalResults;
18
+ evalResults?: EvalResults | null;
19
19
  runningMetrics?: RunningMetric[];
20
20
  evalPlan?: EvalPlan;
21
21
  evalStats?: EvalStats;
@@ -1,13 +1,12 @@
1
1
  import clsx from "clsx";
2
2
  import { FC, useCallback } from "react";
3
- import { RunningMetric } from "../../api/types";
3
+ import { EvalResults, EvalSpec, Status } from "../../../@types/log";
4
+ import { RunningMetric } from "../../../client/api/types";
5
+ import { CopyButton } from "../../../components/CopyButton";
6
+ import { kModelNone } from "../../../constants";
7
+ import { useStore } from "../../../state/store";
8
+ import { filename } from "../../../utils/path";
4
9
  import { ApplicationIcons } from "../../appearance/icons";
5
- import { CopyButton } from "../../components/CopyButton";
6
- import { kModelNone } from "../../constants";
7
- import { useStore } from "../../state/store";
8
- import { EvalResults, EvalSpec, Status } from "../../types/log";
9
- import { filename } from "../../utils/path";
10
- import { ModelRolesView } from "./ModelRolesView";
11
10
  import styles from "./PrimaryBar.module.css";
12
11
  import {
13
12
  displayScorersFromRunningMetrics,
@@ -16,11 +15,12 @@ import {
16
15
  } from "./ResultsPanel";
17
16
  import { RunningStatusPanel } from "./RunningStatusPanel";
18
17
  import { CancelledPanel, ErroredPanel } from "./StatusPanel";
18
+ import { ModelRolesView } from "./ModelRolesView";
19
19
 
20
20
  interface PrimaryBarProps {
21
21
  showToggle: boolean;
22
22
  status?: Status;
23
- evalResults?: EvalResults;
23
+ evalResults?: EvalResults | null;
24
24
  runningMetrics?: RunningMetric[];
25
25
  evalSpec?: EvalSpec;
26
26
  sampleCount?: number;
@@ -1,11 +1,11 @@
1
1
  import clsx from "clsx";
2
2
  import { FC } from "react";
3
- import { RunningMetric } from "../../api/types";
4
- import { LinkButton } from "../../components/LinkButton";
5
- import { Modal } from "../../components/Modal";
6
- import { useProperty } from "../../state/hooks";
7
- import { Scores } from "../../types/log";
8
- import { formatPrettyDecimal } from "../../utils/format";
3
+ import { Scores } from "../../../@types/log";
4
+ import { RunningMetric } from "../../../client/api/types";
5
+ import { LinkButton } from "../../../components/LinkButton";
6
+ import { Modal } from "../../../components/Modal";
7
+ import { useProperty } from "../../../state/hooks";
8
+ import { formatPrettyDecimal } from "../../../utils/format";
9
9
  import { metricDisplayName } from "../utils";
10
10
  import styles from "./ResultsPanel.module.css";
11
11
  import { ScoreGrid } from "./ScoreGrid";
@@ -1,5 +1,5 @@
1
1
  import clsx from "clsx";
2
- import { RunningMetric } from "../../api/types";
2
+ import { RunningMetric } from "../../../client/api/types";
3
3
  import { ApplicationIcons } from "../../appearance/icons";
4
4
 
5
5
  import { FC } from "react";
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { FC, ReactNode } from "react";
3
- import { formatPrettyDecimal } from "../../utils/format";
3
+ import { formatPrettyDecimal } from "../../../utils/format";
4
4
  import { ResultsScorer } from "./ResultsPanel";
5
5
 
6
6
  import styles from "./ScoreGrid.module.css";
@@ -1,24 +1,24 @@
1
1
  import clsx from "clsx";
2
2
  import { FC } from "react";
3
- import { ExpandablePanel } from "../../components/ExpandablePanel";
4
- import { LabeledValue } from "../../components/LabeledValue";
5
- import { EvalDescriptor } from "../../samples/descriptor/types";
6
- import { scoreFilterItems } from "../../samples/sample-tools/filters";
7
- import { useEvalDescriptor } from "../../state/hooks";
8
3
  import {
9
4
  EvalDataset,
10
5
  EvalPlan,
11
6
  EvalResults,
12
7
  EvalSpec,
13
8
  EvalStats,
14
- } from "../../types/log";
15
- import { formatDataset, formatDuration } from "../../utils/format";
9
+ } from "../../../@types/log";
10
+ import { EvalDescriptor } from "../../../app/samples/descriptor/types";
11
+ import { scoreFilterItems } from "../../../app/samples/sample-tools/filters";
12
+ import { ExpandablePanel } from "../../../components/ExpandablePanel";
13
+ import { LabeledValue } from "../../../components/LabeledValue";
14
+ import { useEvalDescriptor } from "../../../state/hooks";
15
+ import { formatDataset, formatDuration } from "../../../utils/format";
16
16
  import styles from "./SecondaryBar.module.css";
17
17
 
18
18
  interface SecondaryBarProps {
19
19
  evalSpec?: EvalSpec;
20
20
  evalPlan?: EvalPlan;
21
- evalResults?: EvalResults;
21
+ evalResults?: EvalResults | null;
22
22
  evalStats?: EvalStats;
23
23
  status?: string;
24
24
  sampleCount?: number;
@@ -1,17 +1,46 @@
1
- import { FC } from "react";
2
- import { SampleSummary } from "../../api/types";
3
- import { MessageBand } from "../../components/MessageBand";
4
- import { ModelCard } from "../../plan/ModelCard";
5
- import { PlanCard } from "../../plan/PlanCard";
1
+ import { FC, useMemo } from "react";
6
2
  import {
7
3
  EvalError,
8
4
  EvalPlan,
9
5
  EvalResults,
10
6
  EvalSpec,
11
7
  EvalStats,
12
- } from "../../types/log";
8
+ } from "../../../@types/log";
13
9
  import { UsageCard } from "../../usage/UsageCard";
14
10
  import { TaskErrorCard } from "../error/TaskErrorPanel";
11
+ import { SampleSummary } from "../../../client/api/types";
12
+ import { MessageBand } from "../../../components/MessageBand";
13
+ import { ModelCard } from "../../plan/ModelCard";
14
+ import { kLogViewInfoTabId } from "../../../constants";
15
+ import { useTotalSampleCount } from "../../../state/hooks";
16
+ import { PlanCard } from "../../plan/PlanCard";
17
+
18
+ // Individual hook for Info tab
19
+ export const useInfoTabConfig = (
20
+ evalSpec: EvalSpec | undefined,
21
+ evalPlan: EvalPlan | undefined,
22
+ evalError: EvalError | undefined | null,
23
+ evalResults: EvalResults | undefined | null,
24
+ evalStats: EvalStats | undefined,
25
+ ) => {
26
+ const totalSampleCount = useTotalSampleCount();
27
+ return useMemo(() => {
28
+ return {
29
+ id: kLogViewInfoTabId,
30
+ label: "Info",
31
+ scrollable: true,
32
+ component: InfoTab,
33
+ componentProps: {
34
+ evalSpec,
35
+ evalPlan,
36
+ evalError,
37
+ evalResults,
38
+ evalStats,
39
+ sampleCount: totalSampleCount,
40
+ },
41
+ };
42
+ }, [evalSpec, evalPlan, evalError, evalResults, evalStats, totalSampleCount]);
43
+ };
15
44
 
16
45
  interface PlanTabProps {
17
46
  evalSpec?: EvalSpec;