inspect-ai 0.3.90__py3-none-any.whl → 0.3.92__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. inspect_ai/_cli/common.py +13 -0
  2. inspect_ai/_cli/eval.py +44 -0
  3. inspect_ai/_display/textual/widgets/samples.py +49 -4
  4. inspect_ai/_display/textual/widgets/vscode.py +4 -2
  5. inspect_ai/_eval/eval.py +41 -28
  6. inspect_ai/_eval/evalset.py +4 -0
  7. inspect_ai/_eval/loader.py +4 -5
  8. inspect_ai/_eval/registry.py +1 -1
  9. inspect_ai/_eval/run.py +6 -3
  10. inspect_ai/_eval/task/log.py +6 -0
  11. inspect_ai/_eval/task/run.py +108 -41
  12. inspect_ai/_eval/task/sandbox.py +19 -5
  13. inspect_ai/_util/_async.py +1 -1
  14. inspect_ai/_util/constants.py +1 -0
  15. inspect_ai/_util/environ.py +32 -0
  16. inspect_ai/_util/file.py +8 -1
  17. inspect_ai/_util/httpx.py +105 -22
  18. inspect_ai/_util/registry.py +83 -9
  19. inspect_ai/_util/text.py +81 -17
  20. inspect_ai/_util/transcript.py +9 -6
  21. inspect_ai/_util/vscode.py +7 -2
  22. inspect_ai/_view/schema.py +1 -1
  23. inspect_ai/_view/www/babel.config.js +11 -0
  24. inspect_ai/_view/www/dist/assets/index.css +3640 -3563
  25. inspect_ai/_view/www/dist/assets/index.js +59204 -52519
  26. inspect_ai/_view/www/eslint.config.mjs +10 -1
  27. inspect_ai/_view/www/jest.config.mjs +21 -0
  28. inspect_ai/_view/www/log-schema.json +111 -2
  29. inspect_ai/_view/www/package.json +19 -5
  30. inspect_ai/_view/www/src/{types → @types}/log.d.ts +95 -32
  31. inspect_ai/_view/www/{App.css → src/app/App.css} +22 -14
  32. inspect_ai/_view/www/src/app/App.tsx +168 -0
  33. inspect_ai/_view/www/src/{AppErrorBoundary.tsx → app/AppErrorBoundary.tsx} +1 -1
  34. inspect_ai/_view/www/src/{appearance → app/appearance}/icons.ts +1 -0
  35. inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.tsx +5 -5
  36. inspect_ai/_view/www/src/{workspace/WorkSpaceView.tsx → app/log-view/LogView.tsx} +59 -40
  37. inspect_ai/_view/www/src/app/log-view/LogViewContainer.tsx +159 -0
  38. inspect_ai/_view/www/src/app/log-view/LogViewLayout.tsx +109 -0
  39. inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.tsx +3 -3
  40. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.tsx +1 -1
  41. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.tsx +4 -4
  42. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.tsx +8 -8
  43. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.tsx +6 -6
  44. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.tsx +1 -1
  45. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.tsx +1 -1
  46. inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.tsx +8 -8
  47. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.tsx +35 -6
  48. inspect_ai/_view/www/src/app/log-view/tabs/JsonTab.tsx +136 -0
  49. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/SamplesTab.tsx +82 -73
  50. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/grouping.ts +3 -3
  51. inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/types.ts +1 -1
  52. inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.tsx +2 -2
  53. inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.tsx +1 -1
  54. inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.tsx +4 -4
  55. inspect_ai/_view/www/src/{plan → app/plan}/PlanCard.tsx +2 -2
  56. inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.tsx +5 -5
  57. inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.tsx +1 -1
  58. inspect_ai/_view/www/src/app/routing/AppRouter.tsx +58 -0
  59. inspect_ai/_view/www/src/app/routing/navigationHooks.ts +182 -0
  60. inspect_ai/_view/www/src/app/routing/url.ts +43 -0
  61. inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.tsx +11 -27
  62. inspect_ai/_view/www/src/{samples → app/samples}/SampleDialog.tsx +36 -40
  63. inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.module.css +4 -0
  64. inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.tsx +116 -49
  65. inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.module.css +1 -1
  66. inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.tsx +29 -26
  67. inspect_ai/_view/www/src/{samples → app/samples}/SamplesTools.tsx +3 -3
  68. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.module.css +5 -2
  69. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.tsx +12 -4
  70. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRenderer.tsx +3 -3
  71. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.tsx +6 -1
  72. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatView.tsx +4 -2
  73. inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.tsx +5 -3
  74. inspect_ai/_view/www/src/app/samples/chat/MessageContent.module.css +12 -0
  75. inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContent.tsx +11 -10
  76. inspect_ai/_view/www/src/app/samples/chat/MessageContents.module.css +7 -0
  77. inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContents.tsx +14 -8
  78. inspect_ai/_view/www/src/{samples → app/samples}/chat/messages.ts +2 -2
  79. inspect_ai/_view/www/src/app/samples/chat/tools/ToolCallView.module.css +7 -0
  80. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolCallView.tsx +26 -27
  81. inspect_ai/_view/www/src/app/samples/chat/tools/ToolInput.module.css +19 -0
  82. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolInput.tsx +3 -3
  83. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.module.css +1 -0
  84. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.tsx +1 -1
  85. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.module.css +4 -0
  86. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.tsx +2 -2
  87. inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/tool.ts +1 -1
  88. inspect_ai/_view/www/src/app/samples/chat/types.ts +1 -0
  89. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/samplesDescriptor.tsx +38 -15
  90. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.tsx +1 -1
  91. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/CategoricalScoreDescriptor.tsx +2 -2
  92. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/NumericScoreDescriptor.tsx +3 -3
  93. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.tsx +4 -4
  94. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/OtherScoreDescriptor.tsx +2 -2
  95. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.tsx +2 -2
  96. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ScoreDescriptor.tsx +1 -1
  97. inspect_ai/_view/www/src/{samples → app/samples}/descriptor/types.ts +4 -3
  98. inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.module.css +2 -1
  99. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.tsx +3 -0
  100. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.tsx +47 -33
  101. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.module.css +16 -0
  102. inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.tsx +47 -20
  103. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.tsx +1 -1
  104. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.tsx +4 -4
  105. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/filters.ts +8 -6
  106. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.tsx +4 -3
  107. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/completions.ts +1 -1
  108. inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/language.ts +1 -0
  109. inspect_ai/_view/www/src/{samples → app/samples}/sampleDataAdapter.ts +3 -3
  110. inspect_ai/_view/www/src/{samples → app/samples}/sampleLimit.ts +1 -1
  111. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.tsx +1 -1
  112. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.tsx +12 -11
  113. inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.tsx +6 -6
  114. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ApprovalEventView.tsx +1 -1
  115. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ErrorEventView.tsx +3 -3
  116. inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.tsx +4 -4
  117. inspect_ai/_view/www/src/{samples → app/samples}/transcript/InputEventView.tsx +3 -3
  118. inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.tsx +3 -3
  119. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.module.css +13 -7
  120. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.tsx +49 -21
  121. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.tsx +11 -9
  122. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleLimitEventView.tsx +1 -1
  123. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.tsx +8 -6
  124. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.tsx +4 -4
  125. inspect_ai/_view/www/src/{samples → app/samples}/transcript/StepEventView.tsx +11 -3
  126. inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.tsx +2 -2
  127. inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.tsx +2 -2
  128. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.module.css +8 -7
  129. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.tsx +32 -114
  130. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.module.css +6 -5
  131. inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.tsx +14 -2
  132. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.tsx +2 -2
  133. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.tsx +1 -1
  134. inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/utils.ts +1 -1
  135. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenderers.tsx +23 -21
  136. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenders.module.css +7 -0
  137. inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.tsx +2 -2
  138. inspect_ai/_view/www/src/app/samples/transcript/transform/fixups.ts +142 -0
  139. inspect_ai/_view/www/src/app/samples/transcript/transform/treeify.ts +39 -0
  140. inspect_ai/_view/www/src/{samples → app/samples}/transcript/types.ts +1 -1
  141. inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.tsx +1 -1
  142. inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.module.css +16 -0
  143. inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.tsx +70 -0
  144. inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.module.css +8 -0
  145. inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.tsx +35 -17
  146. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.tsx +1 -1
  147. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.tsx +2 -2
  148. inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.tsx +2 -2
  149. inspect_ai/_view/www/src/{types.ts → app/types.ts} +18 -11
  150. inspect_ai/_view/www/src/{usage → app/usage}/ModelTokenTable.tsx +1 -1
  151. inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.tsx +2 -2
  152. inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.tsx +1 -1
  153. inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.tsx +6 -6
  154. inspect_ai/_view/www/src/{api → client/api}/api-browser.ts +2 -2
  155. inspect_ai/_view/www/src/{api → client/api}/api-http.ts +3 -3
  156. inspect_ai/_view/www/src/{api → client/api}/api-vscode.ts +2 -2
  157. inspect_ai/_view/www/src/{api → client/api}/client-api.ts +6 -5
  158. inspect_ai/_view/www/src/{api → client/api}/index.ts +2 -2
  159. inspect_ai/_view/www/src/{api → client/api}/types.ts +4 -1
  160. inspect_ai/_view/www/src/{logfile → client/remote}/remoteLogFile.ts +3 -3
  161. inspect_ai/_view/www/src/{storage → client/storage}/index.ts +11 -5
  162. inspect_ai/_view/www/src/components/Card.tsx +1 -1
  163. inspect_ai/_view/www/src/components/CopyButton.tsx +1 -1
  164. inspect_ai/_view/www/src/components/DownloadButton.tsx +1 -1
  165. inspect_ai/_view/www/src/components/ErrorPanel.tsx +1 -1
  166. inspect_ai/_view/www/src/components/{ExpandablePanel.css → ExpandablePanel.module.css} +14 -11
  167. inspect_ai/_view/www/src/components/ExpandablePanel.tsx +16 -10
  168. inspect_ai/_view/www/src/components/FindBand.tsx +1 -1
  169. inspect_ai/_view/www/src/components/JsonPanel.css +2 -2
  170. inspect_ai/_view/www/src/components/LargeModal.tsx +12 -1
  171. inspect_ai/_view/www/src/components/LightboxCarousel.tsx +1 -1
  172. inspect_ai/_view/www/src/components/MarkdownDiv.tsx +3 -1
  173. inspect_ai/_view/www/src/components/MessageBand.tsx +1 -1
  174. inspect_ai/_view/www/src/components/NoContentsPanel.tsx +1 -1
  175. inspect_ai/_view/www/src/constants.ts +10 -9
  176. inspect_ai/_view/www/src/index.tsx +27 -11
  177. inspect_ai/_view/www/src/state/appSlice.ts +44 -5
  178. inspect_ai/_view/www/src/state/hooks.ts +30 -7
  179. inspect_ai/_view/www/src/state/logSlice.ts +7 -5
  180. inspect_ai/_view/www/src/state/logsPolling.ts +1 -1
  181. inspect_ai/_view/www/src/state/logsSlice.ts +18 -13
  182. inspect_ai/_view/www/src/state/samplePolling.ts +12 -12
  183. inspect_ai/_view/www/src/state/sampleSlice.ts +3 -5
  184. inspect_ai/_view/www/src/state/sampleUtils.ts +1 -1
  185. inspect_ai/_view/www/src/{scoring/utils.ts → state/scoring.ts} +2 -2
  186. inspect_ai/_view/www/src/state/store.ts +9 -7
  187. inspect_ai/_view/www/src/state/utils.ts +1 -1
  188. inspect_ai/_view/www/src/tests/README.md +49 -0
  189. inspect_ai/_view/www/src/tests/__mocks__/fileMock.js +1 -0
  190. inspect_ai/_view/www/src/tests/__mocks__/styleMock.js +1 -0
  191. inspect_ai/_view/www/src/tests/setupTests.mjs +1 -0
  192. inspect_ai/_view/www/src/tests/utils/base64.test.ts +23 -0
  193. inspect_ai/_view/www/src/tests/utils/format.test.ts +127 -0
  194. inspect_ai/_view/www/src/tests/utils/path.test.ts +54 -0
  195. inspect_ai/_view/www/src/utils/format.ts +8 -2
  196. inspect_ai/_view/www/src/utils/path.ts +14 -2
  197. inspect_ai/_view/www/src/utils/polling.ts +1 -2
  198. inspect_ai/_view/www/src/utils/uri.ts +32 -0
  199. inspect_ai/_view/www/yarn.lock +3310 -382
  200. inspect_ai/agent/_handoff.py +6 -3
  201. inspect_ai/agent/_human/agent.py +5 -3
  202. inspect_ai/agent/_human/install.py +16 -7
  203. inspect_ai/agent/_human/panel.py +14 -1
  204. inspect_ai/agent/_human/service.py +5 -1
  205. inspect_ai/agent/_react.py +161 -128
  206. inspect_ai/agent/_types.py +15 -4
  207. inspect_ai/approval/_policy.py +2 -2
  208. inspect_ai/log/_file.py +30 -11
  209. inspect_ai/log/_log.py +7 -1
  210. inspect_ai/log/_recorders/eval.py +3 -0
  211. inspect_ai/log/_recorders/types.py +1 -0
  212. inspect_ai/log/_samples.py +4 -0
  213. inspect_ai/model/_call_tools.py +33 -17
  214. inspect_ai/model/_generate_config.py +10 -2
  215. inspect_ai/model/_model.py +41 -21
  216. inspect_ai/model/_model_output.py +2 -1
  217. inspect_ai/model/_openai.py +10 -8
  218. inspect_ai/model/_openai_responses.py +95 -42
  219. inspect_ai/model/_providers/anthropic.py +14 -12
  220. inspect_ai/model/_providers/google.py +191 -95
  221. inspect_ai/model/_providers/hf.py +1 -1
  222. inspect_ai/model/_providers/mistral.py +2 -3
  223. inspect_ai/model/_providers/openai.py +54 -17
  224. inspect_ai/model/_providers/openai_o1.py +1 -1
  225. inspect_ai/model/_providers/openai_responses.py +28 -16
  226. inspect_ai/model/_providers/openrouter.py +14 -0
  227. inspect_ai/model/_providers/providers.py +2 -2
  228. inspect_ai/model/_providers/util/chatapi.py +17 -7
  229. inspect_ai/model/_providers/vllm.py +1 -1
  230. inspect_ai/scorer/_metric.py +17 -1
  231. inspect_ai/scorer/_model.py +51 -6
  232. inspect_ai/scorer/_scorer.py +1 -1
  233. inspect_ai/solver/_human_agent.py +3 -0
  234. inspect_ai/solver/_plan.py +1 -1
  235. inspect_ai/solver/_solver.py +1 -1
  236. inspect_ai/solver/_use_tools.py +14 -8
  237. inspect_ai/tool/__init__.py +16 -1
  238. inspect_ai/tool/_json_rpc_helpers.py +285 -0
  239. inspect_ai/tool/_mcp/__init__.py +13 -0
  240. inspect_ai/tool/_mcp/_context.py +14 -0
  241. inspect_ai/tool/_mcp/_mcp.py +293 -0
  242. inspect_ai/tool/_mcp/_sandbox.py +104 -0
  243. inspect_ai/tool/_mcp/_types.py +31 -0
  244. inspect_ai/tool/_mcp/connection.py +60 -0
  245. inspect_ai/tool/_mcp/sampling.py +118 -0
  246. inspect_ai/tool/_mcp/server.py +112 -0
  247. inspect_ai/tool/_mcp/tools.py +34 -0
  248. inspect_ai/tool/_tool.py +13 -0
  249. inspect_ai/tool/_tool_def.py +24 -7
  250. inspect_ai/tool/_tool_support_helpers.py +129 -153
  251. inspect_ai/tool/_tools/_bash_session.py +11 -11
  252. inspect_ai/tool/_tools/_text_editor.py +6 -6
  253. inspect_ai/tool/_tools/_web_browser/_web_browser.py +8 -8
  254. inspect_ai/util/_anyio.py +31 -20
  255. inspect_ai/util/_json.py +20 -2
  256. inspect_ai/util/_sandbox/context.py +18 -7
  257. inspect_ai/util/_sandbox/docker/compose.py +1 -1
  258. inspect_ai/util/_sandbox/docker/docker.py +92 -21
  259. inspect_ai/util/_sandbox/environment.py +33 -2
  260. inspect_ai/util/_sandbox/events.py +2 -2
  261. inspect_ai/util/_sandbox/service.py +13 -3
  262. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/METADATA +6 -2
  263. inspect_ai-0.3.92.dist-info/RECORD +732 -0
  264. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/WHEEL +1 -1
  265. inspect_ai/_view/www/src/App.tsx +0 -316
  266. inspect_ai/_view/www/src/samples/chat/MessageContent.module.css +0 -4
  267. inspect_ai/_view/www/src/samples/chat/MessageContents.module.css +0 -3
  268. inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.module.css +0 -3
  269. inspect_ai/_view/www/src/samples/chat/tools/ToolInput.module.css +0 -14
  270. inspect_ai/_view/www/src/workspace/WorkSpace.tsx +0 -292
  271. inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.module.css +0 -5
  272. inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.tsx +0 -57
  273. inspect_ai/_view/www/src/workspace/tabs/JsonTab.tsx +0 -43
  274. inspect_ai-0.3.90.dist-info/RECORD +0 -705
  275. /inspect_ai/_view/www/src/{types → @types}/asciicinema-player.d.ts +0 -0
  276. /inspect_ai/_view/www/src/{types → @types}/jsondiffpatch.d.ts +0 -0
  277. /inspect_ai/_view/www/src/{types → @types}/markdown-it-katex.d.ts +0 -0
  278. /inspect_ai/_view/www/src/{types → @types}/prism.d.ts +0 -0
  279. /inspect_ai/_view/www/src/{appearance → app/appearance}/colors.ts +0 -0
  280. /inspect_ai/_view/www/src/{appearance → app/appearance}/fonts.ts +0 -0
  281. /inspect_ai/_view/www/src/{appearance → app/appearance}/styles.ts +0 -0
  282. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataGrid.tsx +0 -0
  283. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.module.css +0 -0
  284. /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.tsx +0 -0
  285. /inspect_ai/_view/www/src/{metadata → app/content}/MetadataGrid.module.css +0 -0
  286. /inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.module.css +0 -0
  287. /inspect_ai/_view/www/src/{metadata → app/content}/types.ts +0 -0
  288. /inspect_ai/_view/www/src/{workspace/WorkSpaceView.module.css → app/log-view/LogView.module.css} +0 -0
  289. /inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.module.css +0 -0
  290. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.module.css +0 -0
  291. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.module.css +0 -0
  292. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.module.css +0 -0
  293. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.module.css +0 -0
  294. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.module.css +0 -0
  295. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.module.css +0 -0
  296. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.module.css +0 -0
  297. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.module.css +0 -0
  298. /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.tsx +0 -0
  299. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.module.css +0 -0
  300. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/JsonTab.module.css +0 -0
  301. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.module.css +0 -0
  302. /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.tsx +0 -0
  303. /inspect_ai/_view/www/src/{workspace → app/log-view}/types.ts +0 -0
  304. /inspect_ai/_view/www/src/{workspace → app/log-view}/utils.ts +0 -0
  305. /inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.module.css +0 -0
  306. /inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.module.css +0 -0
  307. /inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.module.css +0 -0
  308. /inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.module.css +0 -0
  309. /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.module.css +0 -0
  310. /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.tsx +0 -0
  311. /inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.module.css +0 -0
  312. /inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.module.css +0 -0
  313. /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.module.css +0 -0
  314. /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.module.css +0 -0
  315. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.module.css +0 -0
  316. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.module.css +0 -0
  317. /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.module.css +0 -0
  318. /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.module.css +0 -0
  319. /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.tsx +0 -0
  320. /inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.tsx +0 -0
  321. /inspect_ai/_view/www/src/{samples → app/samples}/error/error.ts +0 -0
  322. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.module.css +0 -0
  323. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.tsx +0 -0
  324. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.module.css +0 -0
  325. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.module.css +0 -0
  326. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.module.css +0 -0
  327. /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.tsx +0 -0
  328. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.module.css +0 -0
  329. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.tsx +0 -0
  330. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.module.css +0 -0
  331. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.module.css +0 -0
  332. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.module.css +0 -0
  333. /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/tokenize.ts +0 -0
  334. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.module.css +0 -0
  335. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.module.css +0 -0
  336. /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.module.css +0 -0
  337. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.module.css +0 -0
  338. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.module.css +0 -0
  339. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.module.css +0 -0
  340. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.module.css +0 -0
  341. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.module.css +0 -0
  342. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.module.css +0 -0
  343. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.module.css +0 -0
  344. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.module.css +0 -0
  345. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.tsx +0 -0
  346. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.module.css +0 -0
  347. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.tsx +0 -0
  348. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.module.css +0 -0
  349. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.module.css +0 -0
  350. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.tsx +0 -0
  351. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.module.css +0 -0
  352. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.tsx +0 -0
  353. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.module.css +0 -0
  354. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.tsx +0 -0
  355. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.module.css +0 -0
  356. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateDiffView.tsx +0 -0
  357. /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.module.css +0 -0
  358. /inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.module.css +0 -0
  359. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.module.css +0 -0
  360. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.module.css +0 -0
  361. /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.module.css +0 -0
  362. /inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.module.css +0 -0
  363. /inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.module.css +0 -0
  364. /inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.module.css +0 -0
  365. /inspect_ai/_view/www/src/{api → client/api}/api-shared.ts +0 -0
  366. /inspect_ai/_view/www/src/{api → client/api}/jsonrpc.ts +0 -0
  367. /inspect_ai/_view/www/src/{logfile → client/remote}/remoteZipFile.ts +0 -0
  368. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/entry_points.txt +0 -0
  369. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/licenses/LICENSE +0 -0
  370. {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,10 @@
1
+ import { EvalLog, EvalSample } from "../../@types/log";
1
2
  import {
2
3
  openRemoteLogFile,
3
4
  RemoteLogFile,
4
5
  SampleNotFoundError,
5
- } from "../logfile/remoteLogFile";
6
- import { FileSizeLimitError } from "../logfile/remoteZipFile";
7
- import { EvalLog, EvalSample } from "../types/log";
6
+ } from "../remote/remoteLogFile";
7
+ import { FileSizeLimitError } from "../remote/remoteZipFile";
8
8
  import { encodePathParts } from "./api-shared";
9
9
  import {
10
10
  ClientAPI,
@@ -65,12 +65,13 @@ export const clientApi = (api: LogViewAPI, log_file?: string): ClientAPI => {
65
65
 
66
66
  const remoteEvalFile = async (log_file: string, cached: boolean = false) => {
67
67
  if (!cached || loadedEvalFile.file !== log_file) {
68
- loadedEvalFile.file = log_file;
69
- loadedEvalFile.remoteLog = await openRemoteLogFile(
68
+ const remoteLog = await openRemoteLogFile(
70
69
  api,
71
70
  encodePathParts(log_file),
72
71
  5,
73
72
  );
73
+ loadedEvalFile.file = log_file;
74
+ loadedEvalFile.remoteLog = remoteLog;
74
75
  }
75
76
  return loadedEvalFile.remoteLog;
76
77
  };
@@ -1,6 +1,6 @@
1
1
  import JSON5 from "json5";
2
- import { dirname } from "../utils/path";
3
- import { getVscodeApi } from "../utils/vscode";
2
+ import { dirname } from "../../utils/path";
3
+ import { getVscodeApi } from "../../utils/vscode";
4
4
  import browserApi from "./api-browser";
5
5
  import simpleHttpApi from "./api-http";
6
6
  import vscodeApi from "./api-vscode";
@@ -24,7 +24,7 @@ import {
24
24
  Target,
25
25
  ToolEvent,
26
26
  Version,
27
- } from "../types/log";
27
+ } from "../../@types/log";
28
28
 
29
29
  export interface EvalSummary {
30
30
  version?: Version;
@@ -116,6 +116,7 @@ export interface SampleSummary {
116
116
  error?: string;
117
117
  limit?: string;
118
118
  completed?: boolean;
119
+ retries?: number;
119
120
  }
120
121
 
121
122
  export interface BasicSampleData {
@@ -241,6 +242,8 @@ export interface UpdateStateMessage {
241
242
  data: {
242
243
  type: "updateState";
243
244
  url: string;
245
+ sample_id?: string;
246
+ sample_epoch?: string;
244
247
  };
245
248
  }
246
249
 
@@ -1,12 +1,12 @@
1
+ import { EvalLog, EvalPlan, EvalSample, EvalSpec } from "../../@types/log";
2
+ import { asyncJsonParse } from "../../utils/json-worker";
3
+ import { AsyncQueue } from "../../utils/queue";
1
4
  import {
2
5
  EvalHeader,
3
6
  EvalSummary,
4
7
  LogViewAPI,
5
8
  SampleSummary,
6
9
  } from "../api/types";
7
- import { EvalLog, EvalPlan, EvalSample, EvalSpec } from "../types/log";
8
- import { asyncJsonParse } from "../utils/json-worker";
9
- import { AsyncQueue } from "../utils/queue";
10
10
  import { FileSizeLimitError, openRemoteZipFile } from "./remoteZipFile";
11
11
 
12
12
  // don't try to load samples greater than 50mb
@@ -1,19 +1,25 @@
1
+ import JSON5 from "json5";
2
+ import { PersistedState } from "../../state/store";
3
+ import { getVscodeApi } from "../../utils/vscode";
1
4
  import { ClientStorage } from "../api/types";
2
- import { PersistedState } from "../state/store";
3
- import { getVscodeApi } from "../utils/vscode";
4
5
 
5
6
  const resolveStorage = (): ClientStorage | undefined => {
6
7
  const vscodeApi = getVscodeApi();
7
8
  if (vscodeApi) {
8
9
  return {
9
10
  getItem: (_name: string) => {
10
- const state = vscodeApi.getState() as PersistedState;
11
- return state;
11
+ const state = vscodeApi.getState() as string;
12
+ const deserialized = JSON5.parse(state) as {
13
+ state: PersistedState;
14
+ version: number;
15
+ };
16
+ return deserialized;
12
17
  },
13
18
  setItem: (_name: string, value: unknown) => {
14
19
  // TODO: This is pretty gnarly type hijinks
15
20
  const valObj = value as { state: PersistedState; version: number };
16
- vscodeApi.setState(valObj);
21
+ const serialized = JSON5.stringify(valObj);
22
+ vscodeApi.setState(serialized);
17
23
  },
18
24
  removeItem: (_name: string) => {
19
25
  vscodeApi.setState(null);
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { FC, ReactNode } from "react";
3
- import { ApplicationIcons } from "../appearance/icons";
3
+ import { ApplicationIcons } from "../app/appearance/icons";
4
4
  import "./Card.css";
5
5
 
6
6
  interface CardHeaderProps {
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { JSX, useState } from "react";
3
- import { ApplicationIcons } from "../appearance/icons";
3
+ import { ApplicationIcons } from "../app/appearance/icons";
4
4
  import styles from "./CopyButton.module.css";
5
5
 
6
6
  interface CopyButtonProps {
@@ -1,5 +1,5 @@
1
1
  import { FC } from "react";
2
- import api from "../api/index";
2
+ import api from "../client/api/index";
3
3
  import "./DownloadButton.css";
4
4
 
5
5
  interface DownloadButtonProps {
@@ -1,5 +1,5 @@
1
1
  import { FC } from "react";
2
- import { ApplicationIcons } from "../appearance/icons";
2
+ import { ApplicationIcons } from "../app/appearance/icons";
3
3
  import "./ErrorPanel.css";
4
4
 
5
5
  export interface DisplayError {
@@ -1,39 +1,42 @@
1
- .expandable-bordered {
1
+ .expandableBordered {
2
2
  border: solid var(--bs-light-border-subtle) 1px;
3
3
  }
4
4
 
5
- .expandable-togglable {
5
+ .expandableTogglable {
6
6
  margin-bottom: 1em;
7
7
  }
8
8
 
9
- .expandable-contents {
9
+ .expandableContents {
10
10
  font-size: var(--inspect-font-size-base);
11
11
  }
12
12
 
13
- .expandable-collapsed {
13
+ .expandableCollapsed {
14
14
  overflow: hidden;
15
15
  }
16
16
 
17
- .more-toggle {
17
+ .moreToggle {
18
18
  display: flex;
19
- margin-bottom: 0.5em;
20
19
  margin-top: 0;
20
+ position: relative;
21
+ height: 8px;
21
22
  }
22
23
 
23
- .more-toggle.bordered {
24
+ .moreToggle.bordered {
24
25
  border-top: solid var(--bs-light-border-subtle) 1px;
25
- margin-top: 0.5em;
26
26
  }
27
27
 
28
- .more-toggle-container {
28
+ .moreToggleContainer {
29
+ position: absolute;
30
+ top: -1px;
31
+ right: 0;
29
32
  display: inline-block;
30
33
  border: solid var(--bs-light-border-subtle) 1px;
31
34
  border-top: none;
32
35
  margin-left: auto;
33
- margin-right: 1em;
36
+ margin-right: 0;
34
37
  }
35
38
 
36
- .more-toggle-button {
39
+ .moreToggleButton {
37
40
  font-size: var(--inspect-font-size-smaller);
38
41
  border: none;
39
42
  padding: 0.1rem 0.5rem;
@@ -8,10 +8,10 @@ import {
8
8
  useRef,
9
9
  useState,
10
10
  } from "react";
11
- import { ApplicationIcons } from "../appearance/icons";
11
+ import { ApplicationIcons } from "../app/appearance/icons";
12
12
  import { useCollapsedState } from "../state/hooks";
13
13
  import { useResizeObserver } from "../utils/dom";
14
- import "./ExpandablePanel.css";
14
+ import styles from "./ExpandablePanel.module.css";
15
15
 
16
16
  interface ExpandablePanelProps {
17
17
  id: string;
@@ -51,7 +51,7 @@ export const ExpandablePanel: FC<ExpandablePanelProps> = memo(
51
51
  const baseStyles = {
52
52
  overflow: "hidden",
53
53
  ...(collapsed && {
54
- maxHeight: `${lines}em`,
54
+ maxHeight: `${lines}rem`,
55
55
  }),
56
56
  };
57
57
 
@@ -61,9 +61,9 @@ export const ExpandablePanel: FC<ExpandablePanelProps> = memo(
61
61
  style={baseStyles}
62
62
  ref={contentRef}
63
63
  className={clsx(
64
- "expandable-panel",
65
- collapsed ? "expandable-collapsed" : undefined,
66
- border ? "expandable-bordered" : undefined,
64
+ styles.expandablePanel,
65
+ collapsed ? styles.expandableCollapsed : undefined,
66
+ border ? styles.expandableBordered : undefined,
67
67
  )}
68
68
  >
69
69
  {children}
@@ -104,10 +104,16 @@ const MoreToggle: FC<MoreToggleProps> = ({
104
104
  }, [setCollapsed, collapsed]);
105
105
 
106
106
  return (
107
- <div className={`more-toggle ${border ? "bordered" : ""}`} style={style}>
108
- <div className="more-toggle-container">
109
- <button className="btn more-toggle-button" onClick={handleClick}>
110
- <i className={icon} />
107
+ <div
108
+ className={clsx(styles.moreToggle, border ? styles.bordered : undefined)}
109
+ style={style}
110
+ >
111
+ <div className={clsx(styles.moreToggleContainer)}>
112
+ <button
113
+ className={clsx("btn", styles.moreToggleButton, "text-size-smallest")}
114
+ onClick={handleClick}
115
+ >
116
+ <i className={clsx(icon, styles.icon)} />
111
117
  {text}
112
118
  </button>
113
119
  </div>
@@ -1,5 +1,5 @@
1
1
  import { FC, KeyboardEvent, useCallback, useEffect, useRef } from "react";
2
- import { ApplicationIcons } from "../appearance/icons";
2
+ import { ApplicationIcons } from "../app/appearance/icons";
3
3
  import { useStore } from "../state/store";
4
4
  import "./FindBand.css";
5
5
 
@@ -10,8 +10,8 @@
10
10
 
11
11
  .json-panel .source-code {
12
12
  font-size: var(--inspect-font-size-small);
13
- white-space: pre-wrap;
14
- word-wrap: anywhere;
13
+ white-space: pre-wrap !important;
14
+ word-wrap: anywhere !important;
15
15
  }
16
16
 
17
17
  /* Prism.js theme customizations can go here if needed */
@@ -1,7 +1,7 @@
1
1
  import clsx from "clsx";
2
2
  import { ProgressBar } from "./ProgressBar";
3
3
 
4
- import { FC, ReactNode, RefObject, useRef } from "react";
4
+ import { FC, ReactNode, RefObject, useEffect, useRef } from "react";
5
5
  import styles from "./LargeModal.module.css";
6
6
 
7
7
  export interface ModalTool {
@@ -55,6 +55,16 @@ export const LargeModal: FC<LargeModalProps> = ({
55
55
  const modalRef = useRef(null);
56
56
  scrollRef = scrollRef || modalRef;
57
57
 
58
+ // Focus the modal when it becomes visible
59
+ const dialogRef = useRef<HTMLDivElement>(null);
60
+
61
+ // Use effect to focus the modal when visible changes
62
+ useEffect(() => {
63
+ if (visible && dialogRef.current) {
64
+ dialogRef.current.focus();
65
+ }
66
+ }, [visible]);
67
+
58
68
  return (
59
69
  <div
60
70
  id={id}
@@ -66,6 +76,7 @@ export const LargeModal: FC<LargeModalProps> = ({
66
76
  role="dialog"
67
77
  onKeyUp={onkeyup}
68
78
  tabIndex={visible ? 0 : undefined}
79
+ ref={dialogRef}
69
80
  >
70
81
  <div
71
82
  className={clsx(
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { FC, MouseEvent, ReactNode, useCallback, useEffect } from "react";
3
- import { ApplicationIcons } from "../appearance/icons";
3
+ import { ApplicationIcons } from "../app/appearance/icons";
4
4
  import { useProperty } from "../state/hooks";
5
5
  import styles from "./LightboxCarousel.module.css";
6
6
 
@@ -97,7 +97,9 @@ const protectBackslashesInLatex = (content: string): string => {
97
97
  };
98
98
 
99
99
  const restoreBackslashesForLatex = (content: string): string => {
100
- if (!content) return content;
100
+ if (!content) {
101
+ return content;
102
+ }
101
103
 
102
104
  try {
103
105
  // First restore backslashes
@@ -1,7 +1,7 @@
1
1
  import { clsx } from "clsx";
2
2
 
3
3
  import { FC, useCallback } from "react";
4
- import { ApplicationIcons } from "../appearance/icons";
4
+ import { ApplicationIcons } from "../app/appearance/icons";
5
5
  import { useMessageVisibility } from "../state/hooks";
6
6
  import "./MessageBand.css";
7
7
 
@@ -1,7 +1,7 @@
1
1
  import clsx from "clsx";
2
2
  import { FC } from "react";
3
3
 
4
- import { ApplicationIcons } from "../appearance/icons";
4
+ import { ApplicationIcons } from "../app/appearance/icons";
5
5
  import styles from "./NoContentsPanel.module.css";
6
6
 
7
7
  interface NoContentsPanelProps {
@@ -2,17 +2,18 @@
2
2
  export const kModelNone = "none/none";
3
3
 
4
4
  // Workspace tab constants
5
- export const kEvalWorkspaceTabId = "eval-tab";
6
- export const kJsonWorkspaceTabId = "json-tab";
7
- export const kInfoWorkspaceTabId = "plan-tab";
5
+ export const kLogViewSamplesTabId = "samples";
6
+ export const kLogViewJsonTabId = "json";
7
+ export const kLogViewInfoTabId = "info";
8
8
 
9
9
  // Sample tab constants
10
- export const kSampleMessagesTabId = `sample-display-messages`;
11
- export const kSampleTranscriptTabId = `sample-display-transcript`;
12
- export const kSampleScoringTabId = `sample-display-scoring`;
13
- export const kSampleMetdataTabId = `sample-display-metadata`;
14
- export const kSampleErrorTabId = `sample-display-error`;
15
- export const kSampleJsonTabId = `sample-display-json`;
10
+ export const kSampleMessagesTabId = `messages`;
11
+ export const kSampleTranscriptTabId = `transcript`;
12
+ export const kSampleScoringTabId = `scoring`;
13
+ export const kSampleMetdataTabId = `metadata`;
14
+ export const kSampleErrorTabId = `error`;
15
+ export const kSampleErrorRetriesTabId = `retry-errors`;
16
+ export const kSampleJsonTabId = `json`;
16
17
 
17
18
  // Scoring constants
18
19
  export const kScoreTypePassFail = "passfail";
@@ -1,10 +1,9 @@
1
1
  import { createRoot } from "react-dom/client";
2
- import api from "./api/index";
3
- import { Capabilities } from "./api/types";
4
- import { App } from "./App";
5
- import { AppErrorBoundary } from "./AppErrorBoundary";
6
- import { initializeStore } from "./state/store";
7
- import storage from "./storage";
2
+ import { App } from "./app/App";
3
+ import api from "./client/api/index";
4
+ import { Capabilities } from "./client/api/types";
5
+ import storage from "./client/storage";
6
+ import { initializeStore, storeImplementation } from "./state/store";
8
7
  import { getVscodeApi } from "./utils/vscode";
9
8
 
10
9
  // Resolve the api
@@ -40,6 +39,9 @@ if (vscode) {
40
39
  // Inititialize the application store
41
40
  initializeStore(applicationApi, capabilities, applicationStorage);
42
41
 
42
+ // Determine whether we need to restore a stored hash
43
+ restoreHash();
44
+
43
45
  // Find the root element and render into it
44
46
  const containerId = "app";
45
47
  const container = document.getElementById(containerId);
@@ -52,8 +54,22 @@ if (!container) {
52
54
 
53
55
  // Render into the root
54
56
  const root = createRoot(container as HTMLElement);
55
- root.render(
56
- <AppErrorBoundary>
57
- <App api={applicationApi} />
58
- </AppErrorBoundary>,
59
- );
57
+ root.render(<App api={applicationApi} />);
58
+
59
+ function restoreHash() {
60
+ // Check if we need to restore a route
61
+ if (storeImplementation && storeImplementation.getState().app.urlHash) {
62
+ const storedHash = storeImplementation.getState().app.urlHash;
63
+ if (storedHash) {
64
+ // Directly set the window location hash if there is
65
+ // a stored hash that needs to be restored
66
+ if (storedHash.startsWith("/")) {
67
+ window.location.hash = storedHash;
68
+ } else if (storedHash.startsWith("#")) {
69
+ window.location.hash = storedHash;
70
+ } else {
71
+ window.location.hash = "#" + storedHash;
72
+ }
73
+ }
74
+ }
75
+ }
@@ -1,7 +1,7 @@
1
1
  import { StateSnapshot } from "react-virtuoso";
2
- import { Capabilities } from "../api/types";
3
- import { kEvalWorkspaceTabId, kSampleTranscriptTabId } from "../constants";
4
- import { AppState, AppStatus } from "../types";
2
+ import { AppState, AppStatus } from "../app/types";
3
+ import { Capabilities } from "../client/api/types";
4
+ import { kLogViewSamplesTabId, kSampleTranscriptTabId } from "../constants";
5
5
  import { clearDocumentSelection } from "../utils/browser";
6
6
  import { StoreState } from "./store";
7
7
 
@@ -18,6 +18,13 @@ export interface AppSlice {
18
18
  setWorkspaceTab: (tab: string) => void;
19
19
  clearWorkspaceTab: () => void;
20
20
 
21
+ setInitialState: (
22
+ log: string,
23
+ sample_id?: string,
24
+ sample_epoch?: string,
25
+ ) => void;
26
+ clearInitialState: () => void;
27
+
21
28
  setSampleTab: (tab: string) => void;
22
29
  clearSampleTab: () => void;
23
30
 
@@ -38,10 +45,12 @@ export interface AppSlice {
38
45
  getPropertyValue: <T>(bagName: string, key: string, defaultValue?: T) => T;
39
46
  setPropertyValue: <T>(bagName: string, key: string, value: T) => void;
40
47
  removePropertyValue: (bagName: string, key: string) => void;
48
+
49
+ setUrlHash: (urlHash: string) => void;
41
50
  };
42
51
  }
43
52
 
44
- const kDefaultWorkspaceTab = kEvalWorkspaceTabId;
53
+ const kDefaultWorkspaceTab = kLogViewSamplesTabId;
45
54
  const kDefaultSampleTab = kSampleTranscriptTabId;
46
55
 
47
56
  const initialState: AppState = {
@@ -108,13 +117,19 @@ export const createAppSlice = (
108
117
  });
109
118
  },
110
119
  setShowingSampleDialog: (showing: boolean) => {
120
+ const state = get();
121
+ const isShowing = state.app.dialogs.sample;
122
+
123
+ if (showing === isShowing) {
124
+ return;
125
+ }
126
+
111
127
  set((state) => {
112
128
  state.app.dialogs.sample = showing;
113
129
  });
114
130
  if (!showing) {
115
131
  const state = get();
116
132
  state.appActions.clearSampleTab();
117
- state.sampleActions.clearSelectedSample();
118
133
  }
119
134
  },
120
135
  setWorkspaceTab: (tab: string) => {
@@ -127,6 +142,24 @@ export const createAppSlice = (
127
142
  state.app.tabs.workspace = kDefaultWorkspaceTab;
128
143
  });
129
144
  },
145
+ setInitialState: (
146
+ log: string,
147
+ sample_id?: string,
148
+ sample_epoch?: string,
149
+ ) => {
150
+ set((state) => {
151
+ state.app.initialState = {
152
+ log,
153
+ sample_id,
154
+ sample_epoch,
155
+ };
156
+ });
157
+ },
158
+ clearInitialState: () => {
159
+ set((state) => {
160
+ state.app.initialState = undefined;
161
+ });
162
+ },
130
163
  setSampleTab: (tab: string) => {
131
164
  set((state) => {
132
165
  state.app.tabs.sample = tab;
@@ -223,6 +256,12 @@ export const createAppSlice = (
223
256
  }
224
257
  });
225
258
  },
259
+
260
+ setUrlHash: (urlHash: string) => {
261
+ set((state) => {
262
+ state.app.urlHash = urlHash;
263
+ });
264
+ },
226
265
  },
227
266
  } as const;
228
267
 
@@ -1,20 +1,20 @@
1
1
  import { highlightElement } from "prismjs";
2
2
  import { useCallback, useEffect, useMemo, useRef } from "react";
3
- import { SampleSummary } from "../api/types";
4
- import { kEpochAscVal, kSampleAscVal, kScoreAscVal } from "../constants";
3
+ import { Events } from "../@types/log";
5
4
  import {
6
5
  createEvalDescriptor,
7
6
  createSamplesDescriptor,
8
- } from "../samples/descriptor/samplesDescriptor";
9
- import { filterSamples } from "../samples/sample-tools/filters";
7
+ } from "../app/samples/descriptor/samplesDescriptor";
8
+ import { filterSamples } from "../app/samples/sample-tools/filters";
10
9
  import {
11
10
  byEpoch,
12
11
  bySample,
13
12
  sortSamples,
14
- } from "../samples/sample-tools/SortFilter";
15
- import { getAvailableScorers, getDefaultScorer } from "../scoring/utils";
16
- import { Events } from "../types/log";
13
+ } from "../app/samples/sample-tools/SortFilter";
14
+ import { SampleSummary } from "../client/api/types";
15
+ import { kEpochAscVal, kSampleAscVal, kScoreAscVal } from "../constants";
17
16
  import { createLogger } from "../utils/logger";
17
+ import { getAvailableScorers, getDefaultScorer } from "./scoring";
18
18
  import { useStore } from "./store";
19
19
  import { mergeSampleSummaries } from "./utils";
20
20
 
@@ -25,6 +25,27 @@ export const useEvalSpec = () => {
25
25
  return selectedLogSummary?.eval;
26
26
  };
27
27
 
28
+ export const useRefreshLog = () => {
29
+ const setAppStatus = useStore((state) => state.appActions.setStatus);
30
+ const refreshLog = useStore((state) => state.logActions.refreshLog);
31
+ const resetFiltering = useStore((state) => state.logActions.resetFiltering);
32
+
33
+ return useCallback(() => {
34
+ try {
35
+ setAppStatus({ loading: true, error: undefined });
36
+
37
+ refreshLog();
38
+ resetFiltering();
39
+
40
+ setAppStatus({ loading: false, error: undefined });
41
+ } catch (e) {
42
+ // Show an error
43
+ console.log(e);
44
+ setAppStatus({ loading: false, error: e as Error });
45
+ }
46
+ }, [refreshLog, resetFiltering, setAppStatus]);
47
+ };
48
+
28
49
  // Fetches all samples summaries (both completed and incomplete)
29
50
  // without applying any filtering
30
51
  export const useSampleSummaries = () => {
@@ -208,10 +229,12 @@ export const useLogSelection = () => {
208
229
  const selectedLogFile = useStore((state) =>
209
230
  state.logsActions.getSelectedLogFile(),
210
231
  );
232
+ const loadedLog = useStore((state) => state.log.loadedLog);
211
233
 
212
234
  return useMemo(() => {
213
235
  return {
214
236
  logFile: selectedLogFile,
237
+ loadedLog: loadedLog,
215
238
  sample: selectedSampleSummary,
216
239
  };
217
240
  }, [selectedLogFile, selectedSampleSummary]);
@@ -1,9 +1,9 @@
1
- import { EvalSummary, PendingSamples } from "../api/types";
2
- import { kDefaultSort, kInfoWorkspaceTabId } from "../constants";
3
- import { ScorerInfo } from "../scoring/utils";
4
- import { LogState, ScoreFilter, ScoreLabel } from "../types";
1
+ import { LogState, ScoreFilter, ScoreLabel } from "../app/types";
2
+ import { EvalSummary, PendingSamples } from "../client/api/types";
3
+ import { kDefaultSort, kLogViewInfoTabId } from "../constants";
5
4
  import { createLogger } from "../utils/logger";
6
5
  import { createLogPolling } from "./logPolling";
6
+ import { ScorerInfo } from "./scoring";
7
7
  import { StoreState } from "./store";
8
8
 
9
9
  const log = createLogger("logSlice");
@@ -96,7 +96,7 @@ export const createLogSlice = (
96
96
  selectedLogSummary.sampleSummaries.length === 0
97
97
  ) {
98
98
  // If there are no samples, use the workspace tab id by default
99
- get().appActions.setWorkspaceTab(kInfoWorkspaceTabId);
99
+ get().appActions.setWorkspaceTab(kLogViewInfoTabId);
100
100
  }
101
101
  },
102
102
 
@@ -175,6 +175,7 @@ export const createLogSlice = (
175
175
  logPolling.startPolling(logFileName);
176
176
  } catch (error) {
177
177
  log.error("Error loading log:", error);
178
+ throw error;
178
179
  }
179
180
  },
180
181
 
@@ -200,6 +201,7 @@ export const createLogSlice = (
200
201
  state.logActions.setSelectedLogSummary(logContents);
201
202
  } catch (error) {
202
203
  log.error("Error refreshing log:", error);
204
+ throw error;
203
205
  }
204
206
  },
205
207
  },
@@ -1,4 +1,4 @@
1
- import { EvalLogHeader, LogFiles } from "../api/types";
1
+ import { EvalLogHeader, LogFiles } from "../client/api/types";
2
2
  import { createLogger } from "../utils/logger";
3
3
  import { createPolling } from "../utils/polling";
4
4
  import { StoreState } from "./store";