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
@@ -4,22 +4,23 @@ import "prismjs/components/prism-python";
4
4
 
5
5
  import clsx from "clsx";
6
6
  import { FC, Fragment, useMemo } from "react";
7
- import { ApplicationIcons } from "../../appearance/icons";
8
- import { MetaDataGrid } from "../../metadata/MetaDataGrid";
9
7
  import {
10
8
  ModelCall,
11
9
  ModelEvent,
12
10
  Request,
13
11
  Response,
12
+ ToolChoice,
14
13
  Tools1,
15
- } from "../../types/log";
14
+ } from "../../../@types/log";
15
+ import { ApplicationIcons } from "../../appearance/icons";
16
+ import { MetaDataGrid } from "../../content/MetaDataGrid";
16
17
  import { ModelUsagePanel } from "../../usage/ModelUsagePanel";
17
18
  import { ChatView } from "../chat/ChatView";
18
19
  import { EventPanel } from "./event/EventPanel";
19
20
  import { EventSection } from "./event/EventSection";
20
21
 
21
- import { PulsingDots } from "../../components/PulsingDots";
22
- import { usePrismHighlight } from "../../state/hooks";
22
+ import { PulsingDots } from "../../../components/PulsingDots";
23
+ import { usePrismHighlight } from "../../../state/hooks";
23
24
  import styles from "./ModelEventView.module.css";
24
25
  import { EventTimingPanel } from "./event/EventTimingPanel";
25
26
  import { formatTiming, formatTitle } from "./event/utils";
@@ -48,7 +49,6 @@ export const ModelEventView: FC<ModelEventViewProps> = ({
48
49
  });
49
50
 
50
51
  const entries: Record<string, unknown> = { ...event.config };
51
- entries["tool_choice"] = event.tool_choice;
52
52
  delete entries["max_connections"];
53
53
 
54
54
  // For any user messages which immediately preceded this model call, including a
@@ -56,7 +56,7 @@ export const ModelEventView: FC<ModelEventViewProps> = ({
56
56
  // are already shown in the tool call above)
57
57
  const userMessages = [];
58
58
  for (const msg of event.input.slice().reverse()) {
59
- if (msg.role === "user" && !msg.tool_call_id) {
59
+ if ((msg.role === "user" && !msg.tool_call_id) || msg.role === "system") {
60
60
  userMessages.push(msg);
61
61
  } else {
62
62
  break;
@@ -79,9 +79,8 @@ export const ModelEventView: FC<ModelEventViewProps> = ({
79
79
  <ChatView
80
80
  id={`${id}-model-output`}
81
81
  messages={[...userMessages, ...(outputMessages || [])]}
82
- className={clsx(styles.output)}
83
82
  numbered={false}
84
- toolCallStyle="compact"
83
+ toolCallStyle="omit"
85
84
  />
86
85
  {event.pending ? (
87
86
  <div className={clsx(styles.progress)}>
@@ -91,9 +90,14 @@ export const ModelEventView: FC<ModelEventViewProps> = ({
91
90
  </div>
92
91
  <div data-name="All" className={styles.container}>
93
92
  <div className={styles.all}>
94
- <EventSection title="Configuration" className={styles.tableSelection}>
95
- <MetaDataGrid entries={entries} plain={true} />
96
- </EventSection>
93
+ {Object.keys(entries).length > 0 && (
94
+ <EventSection
95
+ title="Configuration"
96
+ className={styles.tableSelection}
97
+ >
98
+ <MetaDataGrid entries={entries} plain={true} />
99
+ </EventSection>
100
+ )}
97
101
 
98
102
  <EventSection title="Usage" className={styles.tableSelection}>
99
103
  {event.output.usage !== null ? (
@@ -109,13 +113,6 @@ export const ModelEventView: FC<ModelEventViewProps> = ({
109
113
  working_time={event.working_time}
110
114
  />
111
115
  </EventSection>
112
-
113
- <EventSection
114
- title="Tools"
115
- className={clsx(styles.tableSelection, styles.tools)}
116
- >
117
- <ToolsConfig tools={event.tools} />
118
- </EventSection>
119
116
  </div>
120
117
 
121
118
  <EventSection title="Messages">
@@ -126,6 +123,12 @@ export const ModelEventView: FC<ModelEventViewProps> = ({
126
123
  </EventSection>
127
124
  </div>
128
125
 
126
+ {event.tools.length > 1 && (
127
+ <div data-name="Tools" className={styles.container}>
128
+ <ToolsConfig tools={event.tools} toolChoice={event.tool_choice} />
129
+ </div>
130
+ )}
131
+
129
132
  {event.call ? (
130
133
  <APIView
131
134
  data-name="API"
@@ -192,9 +195,10 @@ export const APICodeCell: FC<APICodeCellProps> = ({ id, contents }) => {
192
195
 
193
196
  interface ToolConfigProps {
194
197
  tools: Tools1;
198
+ toolChoice: ToolChoice;
195
199
  }
196
200
 
197
- const ToolsConfig: FC<ToolConfigProps> = ({ tools }) => {
201
+ const ToolsConfig: FC<ToolConfigProps> = ({ tools, toolChoice }) => {
198
202
  const toolEls = tools.map((tool, idx) => {
199
203
  return (
200
204
  <Fragment key={`${tool.name}-${idx}`}>
@@ -206,5 +210,29 @@ const ToolsConfig: FC<ToolConfigProps> = ({ tools }) => {
206
210
  );
207
211
  });
208
212
 
209
- return <div className={styles.toolConfig}>{toolEls}</div>;
213
+ return (
214
+ <>
215
+ <div className={styles.toolConfig}>{toolEls}</div>
216
+ <div className={styles.toolChoice}>
217
+ <div className={clsx("text-style-label", "text-style-secondary")}>
218
+ Tool Choice
219
+ </div>
220
+ <div>
221
+ <ToolChoiceView toolChoice={toolChoice} />
222
+ </div>
223
+ </div>
224
+ </>
225
+ );
226
+ };
227
+
228
+ interface ToolChoiceViewProps {
229
+ toolChoice: ToolChoice;
230
+ }
231
+
232
+ const ToolChoiceView: FC<ToolChoiceViewProps> = ({ toolChoice }) => {
233
+ if (typeof toolChoice === "string") {
234
+ return toolChoice;
235
+ } else {
236
+ return <code>`${toolChoice.name}()`</code>;
237
+ }
210
238
  };
@@ -1,9 +1,9 @@
1
1
  // @ts-check
2
+ import { Messages, SampleInitEvent } from "../../../@types/log";
3
+ import { formatDateTime } from "../../../utils/format";
4
+ import { toArray } from "../../../utils/type";
2
5
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { MetaDataGrid } from "../../metadata/MetaDataGrid";
4
- import { Messages, SampleInitEvent } from "../../types/log";
5
- import { formatDateTime } from "../../utils/format";
6
- import { toArray } from "../../utils/type";
6
+ import { MetaDataGrid } from "../../content/MetaDataGrid";
7
7
  import { ChatView } from "../chat/ChatView";
8
8
  import { EventPanel } from "./event/EventPanel";
9
9
  import { EventSection } from "./event/EventSection";
@@ -78,11 +78,13 @@ export const SampleInitEventView: FC<SampleInitEventViewProps> = ({
78
78
  ) : (
79
79
  ""
80
80
  )}
81
- <EventSection title="Target">
82
- {toArray(event.sample.target).map((target) => {
83
- return <div key={target}>{target}</div>;
84
- })}
85
- </EventSection>
81
+ {event.sample.target ? (
82
+ <EventSection title="Target">
83
+ {toArray(event.sample.target).map((target) => {
84
+ return <div key={target}>{target}</div>;
85
+ })}
86
+ </EventSection>
87
+ ) : undefined}
86
88
  </div>
87
89
  </div>
88
90
  {event.sample.metadata &&
@@ -1,6 +1,6 @@
1
1
  import { FC } from "react";
2
+ import { SampleLimitEvent, Type10 } from "../../../@types/log";
2
3
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { SampleLimitEvent, Type10 } from "../../types/log";
4
4
  import { EventPanel } from "./event/EventPanel";
5
5
 
6
6
  interface SampleLimitEventViewProps {
@@ -1,8 +1,8 @@
1
+ import { SandboxEvent } from "../../../@types/log";
2
+ import ExpandablePanel from "../../../components/ExpandablePanel";
3
+ import { MarkdownDiv } from "../../../components/MarkdownDiv";
1
4
  import { ApplicationIcons } from "../../appearance/icons";
2
- import ExpandablePanel from "../../components/ExpandablePanel";
3
- import { MarkdownDiv } from "../../components/MarkdownDiv";
4
- import { MetaDataGrid } from "../../metadata/MetaDataGrid";
5
- import { SandboxEvent } from "../../types/log";
5
+ import { MetaDataGrid } from "../../content/MetaDataGrid";
6
6
  import { EventPanel } from "./event/EventPanel";
7
7
  import { EventSection } from "./event/EventSection";
8
8
 
@@ -68,7 +68,7 @@ const ExecView: FC<ExecViewProps> = ({ id, event }) => {
68
68
  {input !== null ? input?.trim() : undefined}
69
69
  </pre>
70
70
 
71
- {options !== null ? (
71
+ {options !== null && Object.keys(options).length > 0 ? (
72
72
  <EventSection title={`Options`}>
73
73
  <MetaDataGrid
74
74
  entries={options as Record<string, unknown>}
@@ -84,7 +84,9 @@ const ExecView: FC<ExecViewProps> = ({ id, event }) => {
84
84
  <MarkdownDiv markdown={output} />
85
85
  </ExpandablePanel>
86
86
  ) : undefined}
87
- <div className={clsx(styles.result)}>Exited with code {result}</div>
87
+ {result !== 0 ? (
88
+ <div className={clsx(styles.result)}>Exited with code {result}</div>
89
+ ) : undefined}
88
90
  </EventSection>
89
91
  </div>
90
92
  );
@@ -1,9 +1,9 @@
1
1
  import { FC, Fragment } from "react";
2
+ import { ScoreEvent, Value1 } from "../../../@types/log";
3
+ import { MarkdownDiv } from "../../../components/MarkdownDiv";
4
+ import { formatDateTime } from "../../../utils/format";
2
5
  import { ApplicationIcons } from "../../appearance/icons";
3
- import { MarkdownDiv } from "../../components/MarkdownDiv";
4
- import { MetaDataGrid } from "../../metadata/MetaDataGrid";
5
- import { ScoreEvent, Value1 } from "../../types/log";
6
- import { formatDateTime } from "../../utils/format";
6
+ import { MetaDataGrid } from "../../content/MetaDataGrid";
7
7
  import { EventPanel } from "./event/EventPanel";
8
8
 
9
9
  import clsx from "clsx";
@@ -1,9 +1,10 @@
1
1
  import clsx from "clsx";
2
2
  import { FC } from "react";
3
- import { StepEvent } from "../../types/log";
4
- import { formatDateTime } from "../../utils/format";
3
+ import { StepEvent } from "../../../@types/log";
4
+ import { formatDateTime } from "../../../utils/format";
5
5
  import { EventPanel } from "./event/EventPanel";
6
6
  import { TranscriptComponent } from "./TranscriptView";
7
+ import { kSandboxSignalName } from "./transform/fixups";
7
8
  import { EventNode } from "./types";
8
9
 
9
10
  interface StepEventViewProps {
@@ -114,6 +115,7 @@ const stepDescriptor = (
114
115
  case "system_message":
115
116
  return {
116
117
  ...rootStepDescriptor,
118
+ collapse: true,
117
119
  };
118
120
  case "use_tools":
119
121
  return {
@@ -133,7 +135,13 @@ const stepDescriptor = (
133
135
  ...rootStepDescriptor,
134
136
  };
135
137
  } else if (event.event === "step") {
136
- if (event.name === "init") {
138
+ if (event.name === kSandboxSignalName) {
139
+ return {
140
+ ...rootStepDescriptor,
141
+ name: "Sandbox Events",
142
+ collapse: true,
143
+ };
144
+ } else if (event.name === "init") {
137
145
  return {
138
146
  ...rootStepDescriptor,
139
147
  name: "Init",
@@ -1,8 +1,8 @@
1
1
  import clsx from "clsx";
2
2
  import { FC, ReactNode } from "react";
3
+ import { Input2, Input5, Result2, SubtaskEvent } from "../../../@types/log";
3
4
  import { ApplicationIcons } from "../../appearance/icons";
4
- import { MetaDataView } from "../../metadata/MetaDataView";
5
- import { Input2, Input5, Result2, SubtaskEvent } from "../../types/log";
5
+ import { MetaDataView } from "../../content/MetaDataView";
6
6
  import { EventPanel } from "./event/EventPanel";
7
7
  import { formatTiming, formatTitle } from "./event/utils";
8
8
  import styles from "./SubtaskEventView.module.css";
@@ -1,5 +1,5 @@
1
+ import { ToolEvent } from "../../../@types/log";
1
2
  import { ApplicationIcons } from "../../appearance/icons";
2
- import { ToolEvent } from "../../types/log";
3
3
  import { resolveToolInput } from "../chat/tools/tool";
4
4
  import { ToolCallView } from "../chat/tools/ToolCallView";
5
5
  import { ApprovalEventView } from "./ApprovalEventView";
@@ -8,7 +8,7 @@ import { TranscriptView } from "./TranscriptView";
8
8
 
9
9
  import clsx from "clsx";
10
10
  import { FC, useMemo } from "react";
11
- import { PulsingDots } from "../../components/PulsingDots";
11
+ import { PulsingDots } from "../../../components/PulsingDots";
12
12
  import { ChatView } from "../chat/ChatView";
13
13
  import { formatTiming, formatTitle } from "./event/utils";
14
14
  import styles from "./ToolEventView.module.css";
@@ -6,13 +6,9 @@
6
6
  background-color: var(--bs-body-bg);
7
7
  }
8
8
 
9
- .node.first {
10
- padding-top: 0.5em;
11
- }
12
-
13
9
  .node {
14
10
  padding-top: 0;
15
- padding-bottom: 0.5em;
11
+ padding-bottom: 0.65em;
16
12
  }
17
13
 
18
14
  .nodes {
@@ -22,7 +18,7 @@
22
18
 
23
19
  .transcriptComponent {
24
20
  display: grid;
25
- margin: 0.5em 0 0 0;
21
+ margin: 0 0 0 0;
26
22
  width: 100%;
27
23
  }
28
24
 
@@ -39,9 +35,14 @@
39
35
  }
40
36
 
41
37
  .eventNodeContainer {
42
- padding-bottom: 0.5em;
38
+ padding-top: 0.7em;
43
39
  }
44
40
 
45
41
  .eventNodeContainer.noBottom {
46
42
  padding-bottom: 0;
47
43
  }
44
+
45
+ .attached {
46
+ padding-top: 0rem;
47
+ margin-top: -8px;
48
+ }
@@ -1,5 +1,5 @@
1
- import { FC, memo, RefObject, useMemo } from "react";
2
- import { Events } from "../../types/log";
1
+ import { FC, JSX, memo, RefObject, useMemo } from "react";
2
+ import { Events } from "../../../@types/log";
3
3
  import { ApprovalEventView } from "./ApprovalEventView";
4
4
  import { ErrorEventView } from "./ErrorEventView";
5
5
  import { InfoEventView } from "./InfoEventView";
@@ -14,11 +14,13 @@ import { StateEventView } from "./state/StateEventView";
14
14
  import { StepEventView } from "./StepEventView";
15
15
  import { SubtaskEventView } from "./SubtaskEventView";
16
16
  import { ToolEventView } from "./ToolEventView";
17
- import { EventNode, EventType } from "./types";
17
+ import { EventNode } from "./types";
18
18
 
19
19
  import clsx from "clsx";
20
20
  import styles from "./TranscriptView.module.css";
21
21
  import { TranscriptVirtualListComponent } from "./TranscriptVirtualListComponent";
22
+ import { fixupEventStream } from "./transform/fixups";
23
+ import { treeifyEvents } from "./transform/treeify";
22
24
 
23
25
  interface TranscriptViewProps {
24
26
  id: string;
@@ -86,23 +88,40 @@ interface TranscriptComponentProps {
86
88
  */
87
89
  export const TranscriptComponent: FC<TranscriptComponentProps> = memo(
88
90
  ({ id, eventNodes }) => {
89
- const rows = eventNodes.map((eventNode, index) => {
91
+ const rows: JSX.Element[] = [];
92
+
93
+ let attached = false;
94
+ for (let i = 0; i < eventNodes.length; i++) {
95
+ const eventNode = eventNodes[i];
90
96
  const clz = [styles.eventNode];
97
+ const containerClz = [];
98
+
99
+ if (eventNode.event.event !== "tool") {
100
+ attached = false;
101
+ }
102
+
103
+ // Special handling for toggling color
91
104
  if (eventNode.depth % 2 == 0) {
92
105
  clz.push(styles.darkenBg);
93
106
  }
94
- if (index === eventNodes.length - 1) {
107
+
108
+ // Note last node
109
+ if (i === eventNodes.length - 1) {
95
110
  clz.push(styles.lastNode);
96
111
  }
97
112
 
98
- const eventId = `${id}|event|${index}`;
113
+ if (attached) {
114
+ containerClz.push(styles.attached);
115
+ }
99
116
 
117
+ const eventId = `${id}|event|${i}`;
100
118
  const row = (
101
119
  <div
102
120
  key={eventId}
103
121
  className={clsx(
104
122
  styles.eventNodeContainer,
105
- index === eventNodes.length - 1 ? styles.noBottom : undefined,
123
+ i === eventNodes.length - 1 ? styles.noBottom : undefined,
124
+ containerClz,
106
125
  )}
107
126
  >
108
127
  <RenderedEventNode
@@ -112,8 +131,12 @@ export const TranscriptComponent: FC<TranscriptComponentProps> = memo(
112
131
  />
113
132
  </div>
114
133
  );
115
- return row;
116
- });
134
+ rows.push(row);
135
+
136
+ if (eventNode.event.event === "model") {
137
+ attached = true;
138
+ }
139
+ }
117
140
 
118
141
  return (
119
142
  <div
@@ -241,108 +264,3 @@ export const RenderedEventNode: FC<RenderedEventNodeProps> = memo(
241
264
  }
242
265
  },
243
266
  );
244
-
245
- /**
246
- * Normalizes event content
247
- */
248
- const fixupEventStream = (events: Events, filterPending: boolean = true) => {
249
- const initEventIndex = events.findIndex((e) => {
250
- return e.event === "sample_init";
251
- });
252
- const initEvent = events[initEventIndex];
253
-
254
- // If filtering pending, just remove all pending events
255
- // otherise, collapse sequential pending events of the same
256
- // type
257
- const collapsed = filterPending
258
- ? events.filter((e) => !e.pending)
259
- : events.reduce<Events>((acc, event) => {
260
- // Collapse sequential pending events of the same type
261
- if (!event.pending) {
262
- // Not a pending event
263
- acc.push(event);
264
- } else {
265
- // For pending events, replace previous pending or add new
266
- const lastIndex = acc.length - 1;
267
- if (
268
- lastIndex >= 0 &&
269
- acc[lastIndex].pending &&
270
- acc[lastIndex].event === event.event
271
- ) {
272
- // Replace previous pending with current one (if they're of the same type)
273
- acc[lastIndex] = event;
274
- } else {
275
- // First event or follows non-pending
276
- acc.push(event);
277
- }
278
- }
279
- return acc;
280
- }, []);
281
- // See if the events have an init step
282
- const hasInitStep =
283
- collapsed.findIndex((e) => {
284
- return e.event === "step" && e.name === "init";
285
- }) !== -1;
286
-
287
- const fixedUp = [...collapsed];
288
- if (!hasInitStep && initEvent) {
289
- fixedUp.splice(initEventIndex, 0, {
290
- timestamp: initEvent.timestamp,
291
- event: "step",
292
- action: "begin",
293
- type: null,
294
- name: "sample_init",
295
- pending: false,
296
- working_start: 0,
297
- });
298
-
299
- fixedUp.splice(initEventIndex + 2, 0, {
300
- timestamp: initEvent.timestamp,
301
- event: "step",
302
- action: "end",
303
- type: null,
304
- name: "sample_init",
305
- pending: false,
306
- working_start: 0,
307
- });
308
- }
309
-
310
- return fixedUp;
311
- };
312
-
313
- /**
314
- * Gathers events into a hierarchy of EventNodes.
315
- */
316
- function treeifyEvents(events: Events, depth: number): EventNode[] {
317
- const rootNodes: EventNode[] = [];
318
- const stack: EventNode[] = [];
319
-
320
- const pushNode = (event: EventType): EventNode => {
321
- const node = new EventNode(event, stack.length + depth);
322
- if (stack.length > 0) {
323
- const parentNode = stack[stack.length - 1];
324
- parentNode.children.push(node);
325
- } else {
326
- rootNodes.push(node);
327
- }
328
- return node;
329
- };
330
-
331
- events.forEach((event) => {
332
- if (event.event === "step" && event.action === "begin") {
333
- // Starting a new step
334
- const node = pushNode(event);
335
- stack.push(node);
336
- } else if (event.event === "step" && event.action === "end") {
337
- // An ending step
338
- if (stack.length > 0) {
339
- stack.pop();
340
- }
341
- } else {
342
- // An event
343
- pushNode(event);
344
- }
345
- });
346
-
347
- return rootNodes;
348
- }
@@ -6,11 +6,12 @@
6
6
  background-color: var(--bs-body-bg);
7
7
  }
8
8
 
9
- .node.first {
10
- padding-top: 0.5em;
9
+ .node {
10
+ padding-top: 0.7rem;
11
+ padding-bottom: 0em;
11
12
  }
12
13
 
13
- .node {
14
- padding-top: 0;
15
- padding-bottom: 0.5em;
14
+ .attached {
15
+ padding-top: 0rem;
16
+ margin-top: -8px;
16
17
  }
@@ -3,7 +3,7 @@ import { FC, RefObject, useCallback } from "react";
3
3
  import { RenderedEventNode } from "./TranscriptView";
4
4
  import { EventNode } from "./types";
5
5
 
6
- import { LiveVirtualList } from "../../components/LiveVirtualList";
6
+ import { LiveVirtualList } from "../../../components/LiveVirtualList";
7
7
  import styles from "./TranscriptVirtualListComponent.module.css";
8
8
 
9
9
  interface TranscriptVirtualListComponentProps {
@@ -24,9 +24,21 @@ export const TranscriptVirtualListComponent: FC<
24
24
  const paddingClass = index === 0 ? styles.first : undefined;
25
25
 
26
26
  const eventId = `${id}-event-${index}`;
27
+ const previousIndex = index - 1;
28
+ const previous =
29
+ previousIndex > 0 && previousIndex <= eventNodes.length
30
+ ? eventNodes[previousIndex]
31
+ : undefined;
32
+ const attached =
33
+ item.event.event === "tool" &&
34
+ (previous?.event.event === "tool" || previous?.event.event === "model");
35
+ const attachedClass = attached ? styles.attached : undefined;
27
36
 
28
37
  return (
29
- <div key={eventId} className={clsx(styles.node, paddingClass)}>
38
+ <div
39
+ key={eventId}
40
+ className={clsx(styles.node, paddingClass, attachedClass)}
41
+ >
30
42
  <RenderedEventNode id={eventId} node={item} className={clsx(bgClass)} />
31
43
  </div>
32
44
  );
@@ -9,8 +9,8 @@ import {
9
9
  import { ApplicationIcons } from "../../../appearance/icons";
10
10
  import { EventNavs } from "./EventNavs";
11
11
 
12
- import { ProgressBar } from "../../../components/ProgressBar";
13
- import { useProperty } from "../../../state/hooks";
12
+ import { ProgressBar } from "../../../../components/ProgressBar";
13
+ import { useProperty } from "../../../../state/hooks";
14
14
  import styles from "./EventPanel.module.css";
15
15
 
16
16
  interface EventPanelProps {
@@ -1,6 +1,6 @@
1
1
  import clsx from "clsx";
2
2
  import { FC, Fragment } from "react";
3
- import { formatDateTime, formatTime } from "../../../utils/format";
3
+ import { formatDateTime, formatTime } from "../../../../utils/format";
4
4
  import styles from "./EventTimingPanel.module.css";
5
5
 
6
6
  interface EventTimingPanelProps {
@@ -2,7 +2,7 @@ import {
2
2
  formatDateTime,
3
3
  formatNumber,
4
4
  formatTime,
5
- } from "../../../utils/format";
5
+ } from "../../../../utils/format";
6
6
 
7
7
  export const formatTiming = (timestamp: string, working_start?: number) => {
8
8
  if (working_start) {