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
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (78.1.0)
2
+ Generator: setuptools (79.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,316 +0,0 @@
1
- import "bootstrap-icons/font/bootstrap-icons.css";
2
- import "bootstrap/dist/css/bootstrap.css";
3
- import JSON5 from "json5";
4
-
5
- import "prismjs";
6
- import "prismjs/components/prism-bash";
7
- import "prismjs/components/prism-clike";
8
- import "prismjs/components/prism-javascript";
9
- import "prismjs/components/prism-json";
10
- import "prismjs/components/prism-python";
11
- import "prismjs/themes/prism.css";
12
-
13
- import "../App.css";
14
-
15
- import { ErrorPanel } from "./components/ErrorPanel";
16
- import { ProgressBar } from "./components/ProgressBar";
17
-
18
- import { FindBand } from "./components/FindBand";
19
- import { Sidebar } from "./workspace/sidebar/Sidebar.tsx";
20
- import { WorkSpace } from "./workspace/WorkSpace";
21
-
22
- import ClipboardJS from "clipboard";
23
- import clsx from "clsx";
24
- import { FC, KeyboardEvent, useCallback, useEffect, useRef } from "react";
25
- import { ClientAPI, HostMessage } from "./api/types.ts";
26
- import { useSetSelectedLogIndex } from "./state/hooks.ts";
27
- import { useStore } from "./state/store.ts";
28
-
29
- interface AppProps {
30
- api: ClientAPI;
31
- }
32
-
33
- /**
34
- * Renders the Main Application
35
- */
36
- export const App: FC<AppProps> = ({ api }) => {
37
- // App layout and state
38
- const appStatus = useStore((state) => state.app.status);
39
- const setAppStatus = useStore((state) => state.appActions.setStatus);
40
- const offCanvas = useStore((state) => state.app.offcanvas);
41
- const setOffCanvas = useStore((state) => state.appActions.setOffcanvas);
42
- const clearWorkspaceTab = useStore(
43
- (state) => state.appActions.clearWorkspaceTab,
44
- );
45
- const clearSampleTab = useStore((state) => state.appActions.clearSampleTab);
46
-
47
- // Find
48
- const nativeFind = useStore((state) => state.capabilities.nativeFind);
49
- const showFind = useStore((state) => state.app.showFind);
50
- const setShowFind = useStore((state) => state.appActions.setShowFind);
51
- const hideFind = useStore((state) => state.appActions.hideFind);
52
-
53
- // Logs Data
54
- const logs = useStore((state) => state.logs.logs);
55
- const selectedLogIndex = useStore((state) => state.logs.selectedLogIndex);
56
- const logHeaders = useStore((state) => state.logs.logHeaders);
57
- const headersLoading = useStore((state) => state.logs.headersLoading);
58
- const setLogs = useStore((state) => state.logsActions.setLogs);
59
- const selectedLogFile = useStore((state) =>
60
- state.logsActions.getSelectedLogFile(),
61
- );
62
- const setSelectedLogIndex = useSetSelectedLogIndex();
63
-
64
- const refreshLogs = useStore((state) => state.logsActions.refreshLogs);
65
- const selectLogFile = useStore((state) => state.logsActions.selectLogFile);
66
-
67
- // Log Data
68
- const selectedLogSummary = useStore((state) => state.log.selectedLogSummary);
69
- const loadedLogFile = useStore((state) => state.log.loadedLog);
70
- const runningMetrics = useStore(
71
- (state) => state.log.pendingSampleSummaries?.metrics,
72
- );
73
- const resetFiltering = useStore((state) => state.logActions.resetFiltering);
74
- const loadLog = useStore((state) => state.logActions.loadLog);
75
- const pollLog = useStore((state) => state.logActions.pollLog);
76
- const refreshLog = useStore((state) => state.logActions.refreshLog);
77
- const selectSample = useStore((state) => state.logActions.selectSample);
78
-
79
- // The main application reference
80
- const mainAppRef = useRef<HTMLDivElement>(null);
81
-
82
- // Load a specific log
83
- useEffect(() => {
84
- const loadSpecificLog = async () => {
85
- if (selectedLogFile && selectedLogFile !== loadedLogFile) {
86
- try {
87
- // Set loading first and wait for it to update
88
- setAppStatus({ loading: true, error: undefined });
89
-
90
- // Then load the log
91
- await loadLog(selectedLogFile);
92
- selectSample(0);
93
-
94
- // Finally set loading to false
95
- setAppStatus({ loading: false, error: undefined });
96
- } catch (e) {
97
- console.log(e);
98
- setAppStatus({ loading: false, error: e as Error });
99
- }
100
- }
101
- };
102
-
103
- loadSpecificLog();
104
- }, [selectedLogFile, loadedLogFile, loadLog, setAppStatus]);
105
-
106
- useEffect(() => {
107
- // If the component re-mounts and there is a running load loaded
108
- // start up polling
109
- const doPoll = async () => {
110
- await pollLog();
111
- };
112
- if (selectedLogSummary?.status === "started") {
113
- doPoll();
114
- }
115
- }, []);
116
-
117
- useEffect(() => {
118
- if (logs.log_dir && logs.files.length === 0) {
119
- setAppStatus({
120
- loading: false,
121
- error: new Error(
122
- `No log files to display in the directory ${logs.log_dir}. Are you sure this is the correct log directory?`,
123
- ),
124
- });
125
- }
126
- }, [logs.log_dir, logs.files.length]);
127
-
128
- const appRefreshLog = useCallback(() => {
129
- try {
130
- setAppStatus({ loading: true, error: undefined });
131
-
132
- refreshLog();
133
- resetFiltering();
134
-
135
- setAppStatus({ loading: false, error: undefined });
136
- } catch (e) {
137
- // Show an error
138
- console.log(e);
139
- setAppStatus({ loading: false, error: e as Error });
140
- }
141
- }, [refreshLog, resetFiltering, setAppStatus]);
142
-
143
- const onMessage = useCallback(
144
- async (e: HostMessage) => {
145
- switch (e.data.type) {
146
- case "updateState": {
147
- if (e.data.url) {
148
- const decodedUrl = decodeURIComponent(e.data.url);
149
- selectLogFile(decodedUrl);
150
- }
151
- break;
152
- }
153
- case "backgroundUpdate": {
154
- const decodedUrl = decodeURIComponent(e.data.url);
155
- const log_dir = e.data.log_dir;
156
- const isFocused = document.hasFocus();
157
- if (!isFocused) {
158
- if (log_dir === logs.log_dir) {
159
- selectLogFile(decodedUrl);
160
- } else {
161
- api.open_log_file(e.data.url, e.data.log_dir);
162
- }
163
- } else {
164
- refreshLogs();
165
- }
166
- break;
167
- }
168
- }
169
- },
170
- [logs, selectLogFile, refreshLogs],
171
- );
172
-
173
- // listen for updateState messages from vscode
174
- useEffect(() => {
175
- window.addEventListener("message", onMessage);
176
- return () => {
177
- window.removeEventListener("message", onMessage);
178
- };
179
- }, [onMessage]);
180
-
181
- useEffect(() => {
182
- const loadLogsAndState = async () => {
183
- // First see if there is embedded state and if so, use that
184
- const embeddedState = document.getElementById("logview-state");
185
- if (embeddedState) {
186
- const state = JSON5.parse(embeddedState.textContent || "");
187
- onMessage({ data: state });
188
- } else {
189
- // See whether a specific task_file has been passed.
190
- const urlParams = new URLSearchParams(window.location.search);
191
-
192
- // If the URL provides a task file, load that
193
- const logPath = urlParams.get("task_file");
194
-
195
- // Replace spaces with a '+' sign:
196
- const resolvedLogPath = logPath ? logPath.replace(" ", "+") : logPath;
197
-
198
- if (resolvedLogPath) {
199
- // Load only this file
200
- setLogs({
201
- log_dir: "",
202
- files: [{ name: resolvedLogPath }],
203
- });
204
- } else {
205
- // If a log file was passed, select it
206
- const log_file = urlParams.get("log_file");
207
- if (log_file) {
208
- await selectLogFile(log_file);
209
- } else {
210
- // Load all logs
211
- await refreshLogs();
212
- }
213
- }
214
- }
215
-
216
- new ClipboardJS(".clipboard-button,.copy-button");
217
- };
218
-
219
- loadLogsAndState();
220
- }, [setLogs, selectLogFile, refreshLogs]);
221
-
222
- // Configure an app envelope specific to the current state
223
- // if there are no log files, then don't show sidebar
224
- const fullScreen = logs.files.length === 1 && !logs.log_dir;
225
-
226
- const showToggle = logs.files.length > 1 || !!logs.log_dir || false;
227
-
228
- const handleSelectedIndexChanged = useCallback(
229
- (index: number) => {
230
- setSelectedLogIndex(index);
231
- setOffCanvas(false);
232
- resetFiltering();
233
- clearSampleTab();
234
- clearWorkspaceTab();
235
- selectSample(0);
236
- },
237
- [
238
- setSelectedLogIndex,
239
- setOffCanvas,
240
- resetFiltering,
241
- clearSampleTab,
242
- clearWorkspaceTab,
243
- selectSample,
244
- ],
245
- );
246
-
247
- const handleKeyboard = useCallback(
248
- (e: KeyboardEvent) => {
249
- // Add keyboard shortcuts for find, if needed
250
- if (nativeFind || !setShowFind) {
251
- return;
252
- }
253
-
254
- if ((e.ctrlKey || e.metaKey) && e.key === "f") {
255
- setShowFind(true);
256
- } else if (e.key === "Escape") {
257
- hideFind();
258
- }
259
- },
260
- [nativeFind, setShowFind, hideFind],
261
- );
262
-
263
- return (
264
- <>
265
- {!fullScreen && selectedLogSummary ? (
266
- <Sidebar
267
- logs={logs}
268
- logHeaders={logHeaders}
269
- loading={headersLoading}
270
- selectedIndex={selectedLogIndex}
271
- onSelectedIndexChanged={handleSelectedIndexChanged}
272
- />
273
- ) : undefined}
274
- <div
275
- ref={mainAppRef}
276
- className={clsx(
277
- "app-main-grid",
278
- fullScreen ? "full-screen" : undefined,
279
- offCanvas ? "off-canvas" : undefined,
280
- )}
281
- tabIndex={0}
282
- onKeyDown={handleKeyboard}
283
- >
284
- {!nativeFind && showFind ? <FindBand /> : ""}
285
- <ProgressBar animating={appStatus.loading} />
286
- {appStatus.error ? (
287
- <ErrorPanel
288
- title="An error occurred while loading this task."
289
- error={appStatus.error}
290
- />
291
- ) : (
292
- <WorkSpace
293
- task_id={selectedLogSummary?.eval?.task_id}
294
- evalStatus={selectedLogSummary?.status}
295
- evalError={filterNull(selectedLogSummary?.error)}
296
- evalVersion={selectedLogSummary?.version}
297
- evalSpec={selectedLogSummary?.eval}
298
- evalPlan={selectedLogSummary?.plan}
299
- evalStats={selectedLogSummary?.stats}
300
- evalResults={filterNull(selectedLogSummary?.results)}
301
- runningMetrics={runningMetrics}
302
- showToggle={showToggle}
303
- refreshLog={appRefreshLog}
304
- />
305
- )}
306
- </div>
307
- </>
308
- );
309
- };
310
-
311
- const filterNull = <T,>(obj: T | null): T | undefined => {
312
- if (obj === null) {
313
- return undefined;
314
- }
315
- return obj;
316
- };
@@ -1,4 +0,0 @@
1
- .contentImage {
2
- max-width: 800px;
3
- border: solid var(--bs-border-color) 1px;
4
- }
@@ -1,3 +0,0 @@
1
- .content {
2
- margin-bottom: 1em;
3
- }
@@ -1,3 +0,0 @@
1
- .output {
2
- padding-top: 1em;
3
- }
@@ -1,14 +0,0 @@
1
- .outputPre {
2
- padding: 0.5em;
3
- margin-top: 0.25em;
4
- margin-bottom: 1rem;
5
- }
6
-
7
- .outputCode {
8
- overflow-wrap: anywhere;
9
- white-space: pre-wrap;
10
- }
11
-
12
- .bottomPadding {
13
- padding-bottom: 1em;
14
- }
@@ -1,292 +0,0 @@
1
- import { ApplicationIcons } from "../appearance/icons";
2
- import { ToolButton } from "../components/ToolButton";
3
- import { SampleTools, ScoreFilterTools } from "../samples/SamplesTools";
4
- import { JsonTab } from "./tabs/JsonTab";
5
- import { SamplesTab } from "./tabs/SamplesTab";
6
-
7
- import clsx from "clsx";
8
- import { FC, MouseEvent, useEffect, useMemo, useRef } from "react";
9
- import { RunningMetric } from "../api/types.ts";
10
- import {
11
- kEvalWorkspaceTabId,
12
- kInfoWorkspaceTabId,
13
- kJsonWorkspaceTabId,
14
- } from "../constants";
15
- import {
16
- useFilteredSamples,
17
- useSampleDescriptor,
18
- useTotalSampleCount,
19
- } from "../state/hooks.ts";
20
- import { useStore } from "../state/store.ts";
21
- import { CurrentLog } from "../types.ts";
22
- import {
23
- EvalError,
24
- EvalPlan,
25
- EvalResults,
26
- EvalSpec,
27
- EvalStats,
28
- Status,
29
- } from "../types/log";
30
- import { InfoTab } from "./tabs/InfoTab.tsx";
31
- import { WorkSpaceView } from "./WorkSpaceView.tsx";
32
-
33
- interface WorkSpaceProps {
34
- task_id?: string;
35
- evalError?: EvalError;
36
- evalStatus?: Status;
37
- evalVersion?: number;
38
- evalSpec?: EvalSpec;
39
- evalPlan?: EvalPlan;
40
- evalStats?: EvalStats;
41
- evalResults?: EvalResults;
42
- runningMetrics?: RunningMetric[];
43
- log?: CurrentLog;
44
- showToggle: boolean;
45
- refreshLog: () => void;
46
- }
47
-
48
- /**
49
- * Renders the Main Application
50
- */
51
- export const WorkSpace: FC<WorkSpaceProps> = (props) => {
52
- const {
53
- task_id,
54
- evalStatus,
55
- evalSpec,
56
- evalPlan,
57
- evalStats,
58
- evalResults,
59
- runningMetrics,
60
- showToggle,
61
- } = props;
62
-
63
- const divRef = useRef<HTMLDivElement>(null);
64
-
65
- // Display the log
66
- useEffect(() => {
67
- if (divRef.current) {
68
- divRef.current.scrollTop = 0;
69
- }
70
- }, [task_id]);
71
-
72
- const resolvedTabs = useResolvedTabs(props);
73
-
74
- if (!evalSpec) {
75
- return undefined;
76
- }
77
-
78
- return (
79
- <WorkSpaceView
80
- divRef={divRef}
81
- evalSpec={evalSpec}
82
- evalPlan={evalPlan}
83
- evalResults={evalResults}
84
- runningMetrics={runningMetrics}
85
- evalStats={evalStats}
86
- status={evalStatus}
87
- tabs={resolvedTabs}
88
- showToggle={showToggle}
89
- />
90
- );
91
- };
92
-
93
- // Helper function for copy feedback
94
- const copyFeedback = (e: MouseEvent<HTMLElement>) => {
95
- const textEl = e.currentTarget.querySelector(".task-btn-copy-content");
96
- const iconEl = e.currentTarget.querySelector("i.bi");
97
- if (textEl) {
98
- const htmlEl = textEl as HTMLElement;
99
- const htmlIconEl = iconEl as HTMLElement;
100
- const oldText = htmlEl.innerText;
101
- const oldIconClz = htmlIconEl.className;
102
- htmlEl.innerText = "Copied!";
103
- htmlIconEl.className = `${ApplicationIcons.confirm}`;
104
- setTimeout(() => {
105
- window.getSelection()?.removeAllRanges();
106
- }, 50);
107
- setTimeout(() => {
108
- htmlEl.innerText = oldText;
109
- htmlIconEl.className = oldIconClz;
110
- }, 1250);
111
- }
112
- };
113
-
114
- // Individual hook for Samples tab
115
- export const useSamplesTabConfig = (
116
- evalStatus: Status | undefined,
117
- refreshLog: () => void,
118
- ) => {
119
- const totalSampleCount = useTotalSampleCount();
120
- const samplesDescriptor = useSampleDescriptor();
121
- const sampleSummaries = useFilteredSamples();
122
- const streamSamples = useStore((state) => state.capabilities.streamSamples);
123
-
124
- return useMemo(() => {
125
- return {
126
- id: kEvalWorkspaceTabId,
127
- scrollable: false,
128
- label: totalSampleCount > 1 ? "Samples" : "Sample",
129
- component: SamplesTab,
130
- componentProps: {
131
- running: evalStatus === "started",
132
- },
133
- tools: () =>
134
- !samplesDescriptor
135
- ? undefined
136
- : totalSampleCount === 1
137
- ? [<ScoreFilterTools />]
138
- : [
139
- <SampleTools
140
- samples={sampleSummaries || []}
141
- key="sample-tools"
142
- />,
143
- evalStatus === "started" && !streamSamples && (
144
- <ToolButton
145
- key="refresh"
146
- label="Refresh"
147
- icon={ApplicationIcons.refresh}
148
- onClick={refreshLog}
149
- />
150
- ),
151
- ],
152
- };
153
- }, [
154
- evalStatus,
155
- refreshLog,
156
- sampleSummaries,
157
- samplesDescriptor,
158
- totalSampleCount,
159
- ]);
160
- };
161
-
162
- // Individual hook for Info tab
163
- export const useInfoTabConfig = (
164
- evalSpec: EvalSpec | undefined,
165
- evalPlan: EvalPlan | undefined,
166
- evalError: EvalError | undefined,
167
- evalResults: EvalResults | undefined,
168
- evalStats: EvalStats | undefined,
169
- ) => {
170
- const totalSampleCount = useTotalSampleCount();
171
- return useMemo(() => {
172
- return {
173
- id: kInfoWorkspaceTabId,
174
- label: "Info",
175
- scrollable: true,
176
- component: InfoTab,
177
- componentProps: {
178
- evalSpec,
179
- evalPlan,
180
- evalError,
181
- evalResults,
182
- evalStats,
183
- sampleCount: totalSampleCount,
184
- },
185
- };
186
- }, [evalSpec, evalPlan, evalError, evalResults, evalStats, totalSampleCount]);
187
- };
188
-
189
- // Individual hook for JSON tab
190
- export const useJsonTabConfig = (
191
- evalVersion: number | undefined,
192
- evalStatus: Status | undefined,
193
- evalSpec: EvalSpec | undefined,
194
- evalPlan: EvalPlan | undefined,
195
- evalError: EvalError | undefined,
196
- evalResults: EvalResults | undefined,
197
- evalStats: EvalStats | undefined,
198
- ) => {
199
- const selectedLogFile = useStore((state) =>
200
- state.logsActions.getSelectedLogFile(),
201
- );
202
- const selectedTab = useStore((state) => state.app.tabs.workspace);
203
-
204
- return useMemo(() => {
205
- const evalHeader = {
206
- version: evalVersion,
207
- status: evalStatus,
208
- eval: evalSpec,
209
- plan: evalPlan,
210
- error: evalError,
211
- results: evalResults,
212
- stats: evalStats,
213
- };
214
-
215
- return {
216
- id: kJsonWorkspaceTabId,
217
- label: "JSON",
218
- scrollable: true,
219
- component: JsonTab,
220
- componentProps: {
221
- logFile: selectedLogFile,
222
- json: JSON.stringify(evalHeader, null, 2),
223
- selected: selectedTab === kJsonWorkspaceTabId,
224
- },
225
- tools: () => [
226
- <ToolButton
227
- key="copy-json"
228
- label="Copy JSON"
229
- icon={ApplicationIcons.copy}
230
- className={clsx("task-btn-json-copy", "clipboard-button")}
231
- data-clipboard-target="#task-json-contents"
232
- onClick={copyFeedback}
233
- />,
234
- ],
235
- };
236
- }, [
237
- selectedLogFile,
238
- evalVersion,
239
- evalStatus,
240
- evalSpec,
241
- evalPlan,
242
- evalError,
243
- evalResults,
244
- evalStats,
245
- selectedTab,
246
- ]);
247
- };
248
-
249
- // Main hook combining all tab configs
250
- export const useResolvedTabs = (props: WorkSpaceProps) => {
251
- const {
252
- evalVersion,
253
- evalStatus,
254
- evalSpec,
255
- evalPlan,
256
- evalResults,
257
- evalStats,
258
- evalError,
259
- refreshLog,
260
- } = props;
261
-
262
- // Use individual tab config hooks
263
- const samplesTabConfig = useSamplesTabConfig(evalStatus, refreshLog);
264
-
265
- const configTabConfig = useInfoTabConfig(
266
- evalSpec,
267
- evalPlan,
268
- evalError,
269
- evalResults,
270
- evalStats,
271
- );
272
-
273
- const jsonTabConfig = useJsonTabConfig(
274
- evalVersion,
275
- evalStatus,
276
- evalSpec,
277
- evalPlan,
278
- evalError,
279
- evalResults,
280
- evalStats,
281
- );
282
-
283
- // Combine all tab configs
284
- return useMemo(
285
- () => ({
286
- ...(samplesTabConfig ? { samples: samplesTabConfig } : {}),
287
- config: configTabConfig,
288
- json: jsonTabConfig,
289
- }),
290
- [samplesTabConfig, configTabConfig, jsonTabConfig],
291
- );
292
- };
@@ -1,5 +0,0 @@
1
- .dirname {
2
- overflow: hidden;
3
- white-space: nowrap;
4
- text-overflow: ellipsis;
5
- }
@@ -1,57 +0,0 @@
1
- import clsx from "clsx";
2
- import { FC } from "react";
3
- import { useStore } from "../../state/store";
4
- import styles from "./LogDirectoryTitleView.module.css";
5
-
6
- interface LogDirectoryTitleViewProps {
7
- log_dir?: string;
8
- }
9
-
10
- export const LogDirectoryTitleView: FC<LogDirectoryTitleViewProps> = ({
11
- log_dir,
12
- }) => {
13
- const offCanvas = useStore((state) => state.app.offcanvas);
14
- if (log_dir) {
15
- const displayDir = prettyDir(log_dir);
16
- return (
17
- <div style={{ display: "flex", flexDirection: "column" }}>
18
- <span
19
- className={clsx(
20
- "text-style-secondary",
21
- "text-style-label",
22
- "text-size-small",
23
- )}
24
- >
25
- Log Directory
26
- </span>
27
- <span
28
- title={displayDir}
29
- className={clsx("text-size-base", styles.dirname)}
30
- >
31
- {offCanvas ? displayDir : ""}
32
- </span>
33
- </div>
34
- );
35
- } else {
36
- return (
37
- <span className={clsx("text-size-title")}>
38
- {offCanvas ? "Log History" : ""}
39
- </span>
40
- );
41
- }
42
- };
43
-
44
- const prettyDir = (path: string): string => {
45
- try {
46
- // Try to create a new URL object
47
- let url = new URL(path);
48
-
49
- if (url.protocol === "file:") {
50
- return url.pathname;
51
- } else {
52
- return path;
53
- }
54
- } catch {
55
- return path;
56
- }
57
- };