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.
- inspect_ai/_cli/common.py +13 -0
- inspect_ai/_cli/eval.py +44 -0
- inspect_ai/_display/textual/widgets/samples.py +49 -4
- inspect_ai/_display/textual/widgets/vscode.py +4 -2
- inspect_ai/_eval/eval.py +41 -28
- inspect_ai/_eval/evalset.py +4 -0
- inspect_ai/_eval/loader.py +4 -5
- inspect_ai/_eval/registry.py +1 -1
- inspect_ai/_eval/run.py +6 -3
- inspect_ai/_eval/task/log.py +6 -0
- inspect_ai/_eval/task/run.py +108 -41
- inspect_ai/_eval/task/sandbox.py +19 -5
- inspect_ai/_util/_async.py +1 -1
- inspect_ai/_util/constants.py +1 -0
- inspect_ai/_util/environ.py +32 -0
- inspect_ai/_util/file.py +8 -1
- inspect_ai/_util/httpx.py +105 -22
- inspect_ai/_util/registry.py +83 -9
- inspect_ai/_util/text.py +81 -17
- inspect_ai/_util/transcript.py +9 -6
- inspect_ai/_util/vscode.py +7 -2
- inspect_ai/_view/schema.py +1 -1
- inspect_ai/_view/www/babel.config.js +11 -0
- inspect_ai/_view/www/dist/assets/index.css +3640 -3563
- inspect_ai/_view/www/dist/assets/index.js +59204 -52519
- inspect_ai/_view/www/eslint.config.mjs +10 -1
- inspect_ai/_view/www/jest.config.mjs +21 -0
- inspect_ai/_view/www/log-schema.json +111 -2
- inspect_ai/_view/www/package.json +19 -5
- inspect_ai/_view/www/src/{types → @types}/log.d.ts +95 -32
- inspect_ai/_view/www/{App.css → src/app/App.css} +22 -14
- inspect_ai/_view/www/src/app/App.tsx +168 -0
- inspect_ai/_view/www/src/{AppErrorBoundary.tsx → app/AppErrorBoundary.tsx} +1 -1
- inspect_ai/_view/www/src/{appearance → app/appearance}/icons.ts +1 -0
- inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.tsx +5 -5
- inspect_ai/_view/www/src/{workspace/WorkSpaceView.tsx → app/log-view/LogView.tsx} +59 -40
- inspect_ai/_view/www/src/app/log-view/LogViewContainer.tsx +159 -0
- inspect_ai/_view/www/src/app/log-view/LogViewLayout.tsx +109 -0
- inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.tsx +3 -3
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.tsx +4 -4
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.tsx +8 -8
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.tsx +6 -6
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.tsx +8 -8
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.tsx +35 -6
- inspect_ai/_view/www/src/app/log-view/tabs/JsonTab.tsx +136 -0
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/SamplesTab.tsx +82 -73
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/grouping.ts +3 -3
- inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/types.ts +1 -1
- inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.tsx +2 -2
- inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.tsx +1 -1
- inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.tsx +4 -4
- inspect_ai/_view/www/src/{plan → app/plan}/PlanCard.tsx +2 -2
- inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.tsx +5 -5
- inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.tsx +1 -1
- inspect_ai/_view/www/src/app/routing/AppRouter.tsx +58 -0
- inspect_ai/_view/www/src/app/routing/navigationHooks.ts +182 -0
- inspect_ai/_view/www/src/app/routing/url.ts +43 -0
- inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.tsx +11 -27
- inspect_ai/_view/www/src/{samples → app/samples}/SampleDialog.tsx +36 -40
- inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.module.css +4 -0
- inspect_ai/_view/www/src/{samples → app/samples}/SampleDisplay.tsx +116 -49
- inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.module.css +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/SampleSummaryView.tsx +29 -26
- inspect_ai/_view/www/src/{samples → app/samples}/SamplesTools.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.module.css +5 -2
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessage.tsx +12 -4
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRenderer.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.tsx +6 -1
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatView.tsx +4 -2
- inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.tsx +5 -3
- inspect_ai/_view/www/src/app/samples/chat/MessageContent.module.css +12 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContent.tsx +11 -10
- inspect_ai/_view/www/src/app/samples/chat/MessageContents.module.css +7 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/MessageContents.tsx +14 -8
- inspect_ai/_view/www/src/{samples → app/samples}/chat/messages.ts +2 -2
- inspect_ai/_view/www/src/app/samples/chat/tools/ToolCallView.module.css +7 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolCallView.tsx +26 -27
- inspect_ai/_view/www/src/app/samples/chat/tools/ToolInput.module.css +19 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolInput.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.module.css +1 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolOutput.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.module.css +4 -0
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/ToolTitle.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/chat/tools/tool.ts +1 -1
- inspect_ai/_view/www/src/app/samples/chat/types.ts +1 -0
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/samplesDescriptor.tsx +38 -15
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/CategoricalScoreDescriptor.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/NumericScoreDescriptor.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/OtherScoreDescriptor.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ScoreDescriptor.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/descriptor/types.ts +4 -3
- inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.module.css +2 -1
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.tsx +3 -0
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.tsx +47 -33
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.module.css +16 -0
- inspect_ai/_view/www/src/{samples → app/samples}/list/SampleRow.tsx +47 -20
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/filters.ts +8 -6
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.tsx +4 -3
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/completions.ts +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/language.ts +1 -0
- inspect_ai/_view/www/src/{samples → app/samples}/sampleDataAdapter.ts +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/sampleLimit.ts +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.tsx +12 -11
- inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.tsx +6 -6
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ApprovalEventView.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ErrorEventView.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/InputEventView.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.tsx +3 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.module.css +13 -7
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ModelEventView.tsx +49 -21
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.tsx +11 -9
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleLimitEventView.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.tsx +8 -6
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.tsx +4 -4
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/StepEventView.tsx +11 -3
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.module.css +8 -7
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptView.tsx +32 -114
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.module.css +6 -5
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/TranscriptVirtualListComponent.tsx +14 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.tsx +2 -2
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.tsx +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/utils.ts +1 -1
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenderers.tsx +23 -21
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventRenders.module.css +7 -0
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.tsx +2 -2
- inspect_ai/_view/www/src/app/samples/transcript/transform/fixups.ts +142 -0
- inspect_ai/_view/www/src/app/samples/transcript/transform/treeify.ts +39 -0
- inspect_ai/_view/www/src/{samples → app/samples}/transcript/types.ts +1 -1
- inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.tsx +1 -1
- inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.module.css +16 -0
- inspect_ai/_view/www/src/app/sidebar/LogDirectoryTitleView.tsx +70 -0
- inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.module.css +8 -0
- inspect_ai/_view/www/src/{workspace → app}/sidebar/Sidebar.tsx +35 -17
- inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.tsx +1 -1
- inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.tsx +2 -2
- inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.tsx +2 -2
- inspect_ai/_view/www/src/{types.ts → app/types.ts} +18 -11
- inspect_ai/_view/www/src/{usage → app/usage}/ModelTokenTable.tsx +1 -1
- inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.tsx +2 -2
- inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.tsx +1 -1
- inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.tsx +6 -6
- inspect_ai/_view/www/src/{api → client/api}/api-browser.ts +2 -2
- inspect_ai/_view/www/src/{api → client/api}/api-http.ts +3 -3
- inspect_ai/_view/www/src/{api → client/api}/api-vscode.ts +2 -2
- inspect_ai/_view/www/src/{api → client/api}/client-api.ts +6 -5
- inspect_ai/_view/www/src/{api → client/api}/index.ts +2 -2
- inspect_ai/_view/www/src/{api → client/api}/types.ts +4 -1
- inspect_ai/_view/www/src/{logfile → client/remote}/remoteLogFile.ts +3 -3
- inspect_ai/_view/www/src/{storage → client/storage}/index.ts +11 -5
- inspect_ai/_view/www/src/components/Card.tsx +1 -1
- inspect_ai/_view/www/src/components/CopyButton.tsx +1 -1
- inspect_ai/_view/www/src/components/DownloadButton.tsx +1 -1
- inspect_ai/_view/www/src/components/ErrorPanel.tsx +1 -1
- inspect_ai/_view/www/src/components/{ExpandablePanel.css → ExpandablePanel.module.css} +14 -11
- inspect_ai/_view/www/src/components/ExpandablePanel.tsx +16 -10
- inspect_ai/_view/www/src/components/FindBand.tsx +1 -1
- inspect_ai/_view/www/src/components/JsonPanel.css +2 -2
- inspect_ai/_view/www/src/components/LargeModal.tsx +12 -1
- inspect_ai/_view/www/src/components/LightboxCarousel.tsx +1 -1
- inspect_ai/_view/www/src/components/MarkdownDiv.tsx +3 -1
- inspect_ai/_view/www/src/components/MessageBand.tsx +1 -1
- inspect_ai/_view/www/src/components/NoContentsPanel.tsx +1 -1
- inspect_ai/_view/www/src/constants.ts +10 -9
- inspect_ai/_view/www/src/index.tsx +27 -11
- inspect_ai/_view/www/src/state/appSlice.ts +44 -5
- inspect_ai/_view/www/src/state/hooks.ts +30 -7
- inspect_ai/_view/www/src/state/logSlice.ts +7 -5
- inspect_ai/_view/www/src/state/logsPolling.ts +1 -1
- inspect_ai/_view/www/src/state/logsSlice.ts +18 -13
- inspect_ai/_view/www/src/state/samplePolling.ts +12 -12
- inspect_ai/_view/www/src/state/sampleSlice.ts +3 -5
- inspect_ai/_view/www/src/state/sampleUtils.ts +1 -1
- inspect_ai/_view/www/src/{scoring/utils.ts → state/scoring.ts} +2 -2
- inspect_ai/_view/www/src/state/store.ts +9 -7
- inspect_ai/_view/www/src/state/utils.ts +1 -1
- inspect_ai/_view/www/src/tests/README.md +49 -0
- inspect_ai/_view/www/src/tests/__mocks__/fileMock.js +1 -0
- inspect_ai/_view/www/src/tests/__mocks__/styleMock.js +1 -0
- inspect_ai/_view/www/src/tests/setupTests.mjs +1 -0
- inspect_ai/_view/www/src/tests/utils/base64.test.ts +23 -0
- inspect_ai/_view/www/src/tests/utils/format.test.ts +127 -0
- inspect_ai/_view/www/src/tests/utils/path.test.ts +54 -0
- inspect_ai/_view/www/src/utils/format.ts +8 -2
- inspect_ai/_view/www/src/utils/path.ts +14 -2
- inspect_ai/_view/www/src/utils/polling.ts +1 -2
- inspect_ai/_view/www/src/utils/uri.ts +32 -0
- inspect_ai/_view/www/yarn.lock +3310 -382
- inspect_ai/agent/_handoff.py +6 -3
- inspect_ai/agent/_human/agent.py +5 -3
- inspect_ai/agent/_human/install.py +16 -7
- inspect_ai/agent/_human/panel.py +14 -1
- inspect_ai/agent/_human/service.py +5 -1
- inspect_ai/agent/_react.py +161 -128
- inspect_ai/agent/_types.py +15 -4
- inspect_ai/approval/_policy.py +2 -2
- inspect_ai/log/_file.py +30 -11
- inspect_ai/log/_log.py +7 -1
- inspect_ai/log/_recorders/eval.py +3 -0
- inspect_ai/log/_recorders/types.py +1 -0
- inspect_ai/log/_samples.py +4 -0
- inspect_ai/model/_call_tools.py +33 -17
- inspect_ai/model/_generate_config.py +10 -2
- inspect_ai/model/_model.py +41 -21
- inspect_ai/model/_model_output.py +2 -1
- inspect_ai/model/_openai.py +10 -8
- inspect_ai/model/_openai_responses.py +95 -42
- inspect_ai/model/_providers/anthropic.py +14 -12
- inspect_ai/model/_providers/google.py +191 -95
- inspect_ai/model/_providers/hf.py +1 -1
- inspect_ai/model/_providers/mistral.py +2 -3
- inspect_ai/model/_providers/openai.py +54 -17
- inspect_ai/model/_providers/openai_o1.py +1 -1
- inspect_ai/model/_providers/openai_responses.py +28 -16
- inspect_ai/model/_providers/openrouter.py +14 -0
- inspect_ai/model/_providers/providers.py +2 -2
- inspect_ai/model/_providers/util/chatapi.py +17 -7
- inspect_ai/model/_providers/vllm.py +1 -1
- inspect_ai/scorer/_metric.py +17 -1
- inspect_ai/scorer/_model.py +51 -6
- inspect_ai/scorer/_scorer.py +1 -1
- inspect_ai/solver/_human_agent.py +3 -0
- inspect_ai/solver/_plan.py +1 -1
- inspect_ai/solver/_solver.py +1 -1
- inspect_ai/solver/_use_tools.py +14 -8
- inspect_ai/tool/__init__.py +16 -1
- inspect_ai/tool/_json_rpc_helpers.py +285 -0
- inspect_ai/tool/_mcp/__init__.py +13 -0
- inspect_ai/tool/_mcp/_context.py +14 -0
- inspect_ai/tool/_mcp/_mcp.py +293 -0
- inspect_ai/tool/_mcp/_sandbox.py +104 -0
- inspect_ai/tool/_mcp/_types.py +31 -0
- inspect_ai/tool/_mcp/connection.py +60 -0
- inspect_ai/tool/_mcp/sampling.py +118 -0
- inspect_ai/tool/_mcp/server.py +112 -0
- inspect_ai/tool/_mcp/tools.py +34 -0
- inspect_ai/tool/_tool.py +13 -0
- inspect_ai/tool/_tool_def.py +24 -7
- inspect_ai/tool/_tool_support_helpers.py +129 -153
- inspect_ai/tool/_tools/_bash_session.py +11 -11
- inspect_ai/tool/_tools/_text_editor.py +6 -6
- inspect_ai/tool/_tools/_web_browser/_web_browser.py +8 -8
- inspect_ai/util/_anyio.py +31 -20
- inspect_ai/util/_json.py +20 -2
- inspect_ai/util/_sandbox/context.py +18 -7
- inspect_ai/util/_sandbox/docker/compose.py +1 -1
- inspect_ai/util/_sandbox/docker/docker.py +92 -21
- inspect_ai/util/_sandbox/environment.py +33 -2
- inspect_ai/util/_sandbox/events.py +2 -2
- inspect_ai/util/_sandbox/service.py +13 -3
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/METADATA +6 -2
- inspect_ai-0.3.92.dist-info/RECORD +732 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/WHEEL +1 -1
- inspect_ai/_view/www/src/App.tsx +0 -316
- inspect_ai/_view/www/src/samples/chat/MessageContent.module.css +0 -4
- inspect_ai/_view/www/src/samples/chat/MessageContents.module.css +0 -3
- inspect_ai/_view/www/src/samples/chat/tools/ToolCallView.module.css +0 -3
- inspect_ai/_view/www/src/samples/chat/tools/ToolInput.module.css +0 -14
- inspect_ai/_view/www/src/workspace/WorkSpace.tsx +0 -292
- inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.module.css +0 -5
- inspect_ai/_view/www/src/workspace/sidebar/LogDirectoryTitleView.tsx +0 -57
- inspect_ai/_view/www/src/workspace/tabs/JsonTab.tsx +0 -43
- inspect_ai-0.3.90.dist-info/RECORD +0 -705
- /inspect_ai/_view/www/src/{types → @types}/asciicinema-player.d.ts +0 -0
- /inspect_ai/_view/www/src/{types → @types}/jsondiffpatch.d.ts +0 -0
- /inspect_ai/_view/www/src/{types → @types}/markdown-it-katex.d.ts +0 -0
- /inspect_ai/_view/www/src/{types → @types}/prism.d.ts +0 -0
- /inspect_ai/_view/www/src/{appearance → app/appearance}/colors.ts +0 -0
- /inspect_ai/_view/www/src/{appearance → app/appearance}/fonts.ts +0 -0
- /inspect_ai/_view/www/src/{appearance → app/appearance}/styles.ts +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataGrid.tsx +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.module.css +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetaDataView.tsx +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/MetadataGrid.module.css +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/RenderedContent.module.css +0 -0
- /inspect_ai/_view/www/src/{metadata → app/content}/types.ts +0 -0
- /inspect_ai/_view/www/src/{workspace/WorkSpaceView.module.css → app/log-view/LogView.module.css} +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/error/TaskErrorPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ModelRolesView.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/Navbar.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/PrimaryBar.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ResultsPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/RunningStatusPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/ScoreGrid.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/SecondaryBar.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/navbar/StatusPanel.tsx +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/InfoTab.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/JsonTab.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/tabs/RunningNoSamples.tsx +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/types.ts +0 -0
- /inspect_ai/_view/www/src/{workspace → app/log-view}/utils.ts +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/DatasetDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/DetailStep.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/ModelCard.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/PlanDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/ScorerDetailView.tsx +0 -0
- /inspect_ai/_view/www/src/{plan → app/plan}/SolverDetailView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/InlineSampleDisplay.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatMessageRow.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/chat/ChatViewVirtualList.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/BooleanScoreDescriptor.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/ObjectScoreDescriptor.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/descriptor/score/PassFailScoreDescriptor.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/FlatSampleErrorView.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/SampleErrorView.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/error/error.ts +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleFooter.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleHeader.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleList.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/list/SampleSeparator.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/EpochFilter.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SelectScorer.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/SortFilter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/SampleFilter.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/sample-tools/sample-filter/tokenize.ts +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScores.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresGrid.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/scores/SampleScoresView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/InfoEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/LoggerEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SampleInitEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SandboxEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ScoreEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/SubtaskEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/ToolEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNav.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventNavs.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventProgressPanel.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventRow.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventSection.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/event/EventTimingPanel.module.css +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateDiffView.tsx +0 -0
- /inspect_ai/_view/www/src/{samples → app/samples}/transcript/state/StateEventView.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/EvalStatus.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarLogEntry.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoreView.module.css +0 -0
- /inspect_ai/_view/www/src/{workspace → app}/sidebar/SidebarScoresView.module.css +0 -0
- /inspect_ai/_view/www/src/{usage → app/usage}/ModelUsagePanel.module.css +0 -0
- /inspect_ai/_view/www/src/{usage → app/usage}/TokenTable.module.css +0 -0
- /inspect_ai/_view/www/src/{usage → app/usage}/UsageCard.module.css +0 -0
- /inspect_ai/_view/www/src/{api → client/api}/api-shared.ts +0 -0
- /inspect_ai/_view/www/src/{api → client/api}/jsonrpc.ts +0 -0
- /inspect_ai/_view/www/src/{logfile → client/remote}/remoteZipFile.ts +0 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/entry_points.txt +0 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/licenses/LICENSE +0 -0
- {inspect_ai-0.3.90.dist-info → inspect_ai-0.3.92.dist-info}/top_level.txt +0 -0
inspect_ai/_view/www/src/App.tsx
DELETED
@@ -1,316 +0,0 @@
|
|
1
|
-
import "bootstrap-icons/font/bootstrap-icons.css";
|
2
|
-
import "bootstrap/dist/css/bootstrap.css";
|
3
|
-
import JSON5 from "json5";
|
4
|
-
|
5
|
-
import "prismjs";
|
6
|
-
import "prismjs/components/prism-bash";
|
7
|
-
import "prismjs/components/prism-clike";
|
8
|
-
import "prismjs/components/prism-javascript";
|
9
|
-
import "prismjs/components/prism-json";
|
10
|
-
import "prismjs/components/prism-python";
|
11
|
-
import "prismjs/themes/prism.css";
|
12
|
-
|
13
|
-
import "../App.css";
|
14
|
-
|
15
|
-
import { ErrorPanel } from "./components/ErrorPanel";
|
16
|
-
import { ProgressBar } from "./components/ProgressBar";
|
17
|
-
|
18
|
-
import { FindBand } from "./components/FindBand";
|
19
|
-
import { Sidebar } from "./workspace/sidebar/Sidebar.tsx";
|
20
|
-
import { WorkSpace } from "./workspace/WorkSpace";
|
21
|
-
|
22
|
-
import ClipboardJS from "clipboard";
|
23
|
-
import clsx from "clsx";
|
24
|
-
import { FC, KeyboardEvent, useCallback, useEffect, useRef } from "react";
|
25
|
-
import { ClientAPI, HostMessage } from "./api/types.ts";
|
26
|
-
import { useSetSelectedLogIndex } from "./state/hooks.ts";
|
27
|
-
import { useStore } from "./state/store.ts";
|
28
|
-
|
29
|
-
interface AppProps {
|
30
|
-
api: ClientAPI;
|
31
|
-
}
|
32
|
-
|
33
|
-
/**
|
34
|
-
* Renders the Main Application
|
35
|
-
*/
|
36
|
-
export const App: FC<AppProps> = ({ api }) => {
|
37
|
-
// App layout and state
|
38
|
-
const appStatus = useStore((state) => state.app.status);
|
39
|
-
const setAppStatus = useStore((state) => state.appActions.setStatus);
|
40
|
-
const offCanvas = useStore((state) => state.app.offcanvas);
|
41
|
-
const setOffCanvas = useStore((state) => state.appActions.setOffcanvas);
|
42
|
-
const clearWorkspaceTab = useStore(
|
43
|
-
(state) => state.appActions.clearWorkspaceTab,
|
44
|
-
);
|
45
|
-
const clearSampleTab = useStore((state) => state.appActions.clearSampleTab);
|
46
|
-
|
47
|
-
// Find
|
48
|
-
const nativeFind = useStore((state) => state.capabilities.nativeFind);
|
49
|
-
const showFind = useStore((state) => state.app.showFind);
|
50
|
-
const setShowFind = useStore((state) => state.appActions.setShowFind);
|
51
|
-
const hideFind = useStore((state) => state.appActions.hideFind);
|
52
|
-
|
53
|
-
// Logs Data
|
54
|
-
const logs = useStore((state) => state.logs.logs);
|
55
|
-
const selectedLogIndex = useStore((state) => state.logs.selectedLogIndex);
|
56
|
-
const logHeaders = useStore((state) => state.logs.logHeaders);
|
57
|
-
const headersLoading = useStore((state) => state.logs.headersLoading);
|
58
|
-
const setLogs = useStore((state) => state.logsActions.setLogs);
|
59
|
-
const selectedLogFile = useStore((state) =>
|
60
|
-
state.logsActions.getSelectedLogFile(),
|
61
|
-
);
|
62
|
-
const setSelectedLogIndex = useSetSelectedLogIndex();
|
63
|
-
|
64
|
-
const refreshLogs = useStore((state) => state.logsActions.refreshLogs);
|
65
|
-
const selectLogFile = useStore((state) => state.logsActions.selectLogFile);
|
66
|
-
|
67
|
-
// Log Data
|
68
|
-
const selectedLogSummary = useStore((state) => state.log.selectedLogSummary);
|
69
|
-
const loadedLogFile = useStore((state) => state.log.loadedLog);
|
70
|
-
const runningMetrics = useStore(
|
71
|
-
(state) => state.log.pendingSampleSummaries?.metrics,
|
72
|
-
);
|
73
|
-
const resetFiltering = useStore((state) => state.logActions.resetFiltering);
|
74
|
-
const loadLog = useStore((state) => state.logActions.loadLog);
|
75
|
-
const pollLog = useStore((state) => state.logActions.pollLog);
|
76
|
-
const refreshLog = useStore((state) => state.logActions.refreshLog);
|
77
|
-
const selectSample = useStore((state) => state.logActions.selectSample);
|
78
|
-
|
79
|
-
// The main application reference
|
80
|
-
const mainAppRef = useRef<HTMLDivElement>(null);
|
81
|
-
|
82
|
-
// Load a specific log
|
83
|
-
useEffect(() => {
|
84
|
-
const loadSpecificLog = async () => {
|
85
|
-
if (selectedLogFile && selectedLogFile !== loadedLogFile) {
|
86
|
-
try {
|
87
|
-
// Set loading first and wait for it to update
|
88
|
-
setAppStatus({ loading: true, error: undefined });
|
89
|
-
|
90
|
-
// Then load the log
|
91
|
-
await loadLog(selectedLogFile);
|
92
|
-
selectSample(0);
|
93
|
-
|
94
|
-
// Finally set loading to false
|
95
|
-
setAppStatus({ loading: false, error: undefined });
|
96
|
-
} catch (e) {
|
97
|
-
console.log(e);
|
98
|
-
setAppStatus({ loading: false, error: e as Error });
|
99
|
-
}
|
100
|
-
}
|
101
|
-
};
|
102
|
-
|
103
|
-
loadSpecificLog();
|
104
|
-
}, [selectedLogFile, loadedLogFile, loadLog, setAppStatus]);
|
105
|
-
|
106
|
-
useEffect(() => {
|
107
|
-
// If the component re-mounts and there is a running load loaded
|
108
|
-
// start up polling
|
109
|
-
const doPoll = async () => {
|
110
|
-
await pollLog();
|
111
|
-
};
|
112
|
-
if (selectedLogSummary?.status === "started") {
|
113
|
-
doPoll();
|
114
|
-
}
|
115
|
-
}, []);
|
116
|
-
|
117
|
-
useEffect(() => {
|
118
|
-
if (logs.log_dir && logs.files.length === 0) {
|
119
|
-
setAppStatus({
|
120
|
-
loading: false,
|
121
|
-
error: new Error(
|
122
|
-
`No log files to display in the directory ${logs.log_dir}. Are you sure this is the correct log directory?`,
|
123
|
-
),
|
124
|
-
});
|
125
|
-
}
|
126
|
-
}, [logs.log_dir, logs.files.length]);
|
127
|
-
|
128
|
-
const appRefreshLog = useCallback(() => {
|
129
|
-
try {
|
130
|
-
setAppStatus({ loading: true, error: undefined });
|
131
|
-
|
132
|
-
refreshLog();
|
133
|
-
resetFiltering();
|
134
|
-
|
135
|
-
setAppStatus({ loading: false, error: undefined });
|
136
|
-
} catch (e) {
|
137
|
-
// Show an error
|
138
|
-
console.log(e);
|
139
|
-
setAppStatus({ loading: false, error: e as Error });
|
140
|
-
}
|
141
|
-
}, [refreshLog, resetFiltering, setAppStatus]);
|
142
|
-
|
143
|
-
const onMessage = useCallback(
|
144
|
-
async (e: HostMessage) => {
|
145
|
-
switch (e.data.type) {
|
146
|
-
case "updateState": {
|
147
|
-
if (e.data.url) {
|
148
|
-
const decodedUrl = decodeURIComponent(e.data.url);
|
149
|
-
selectLogFile(decodedUrl);
|
150
|
-
}
|
151
|
-
break;
|
152
|
-
}
|
153
|
-
case "backgroundUpdate": {
|
154
|
-
const decodedUrl = decodeURIComponent(e.data.url);
|
155
|
-
const log_dir = e.data.log_dir;
|
156
|
-
const isFocused = document.hasFocus();
|
157
|
-
if (!isFocused) {
|
158
|
-
if (log_dir === logs.log_dir) {
|
159
|
-
selectLogFile(decodedUrl);
|
160
|
-
} else {
|
161
|
-
api.open_log_file(e.data.url, e.data.log_dir);
|
162
|
-
}
|
163
|
-
} else {
|
164
|
-
refreshLogs();
|
165
|
-
}
|
166
|
-
break;
|
167
|
-
}
|
168
|
-
}
|
169
|
-
},
|
170
|
-
[logs, selectLogFile, refreshLogs],
|
171
|
-
);
|
172
|
-
|
173
|
-
// listen for updateState messages from vscode
|
174
|
-
useEffect(() => {
|
175
|
-
window.addEventListener("message", onMessage);
|
176
|
-
return () => {
|
177
|
-
window.removeEventListener("message", onMessage);
|
178
|
-
};
|
179
|
-
}, [onMessage]);
|
180
|
-
|
181
|
-
useEffect(() => {
|
182
|
-
const loadLogsAndState = async () => {
|
183
|
-
// First see if there is embedded state and if so, use that
|
184
|
-
const embeddedState = document.getElementById("logview-state");
|
185
|
-
if (embeddedState) {
|
186
|
-
const state = JSON5.parse(embeddedState.textContent || "");
|
187
|
-
onMessage({ data: state });
|
188
|
-
} else {
|
189
|
-
// See whether a specific task_file has been passed.
|
190
|
-
const urlParams = new URLSearchParams(window.location.search);
|
191
|
-
|
192
|
-
// If the URL provides a task file, load that
|
193
|
-
const logPath = urlParams.get("task_file");
|
194
|
-
|
195
|
-
// Replace spaces with a '+' sign:
|
196
|
-
const resolvedLogPath = logPath ? logPath.replace(" ", "+") : logPath;
|
197
|
-
|
198
|
-
if (resolvedLogPath) {
|
199
|
-
// Load only this file
|
200
|
-
setLogs({
|
201
|
-
log_dir: "",
|
202
|
-
files: [{ name: resolvedLogPath }],
|
203
|
-
});
|
204
|
-
} else {
|
205
|
-
// If a log file was passed, select it
|
206
|
-
const log_file = urlParams.get("log_file");
|
207
|
-
if (log_file) {
|
208
|
-
await selectLogFile(log_file);
|
209
|
-
} else {
|
210
|
-
// Load all logs
|
211
|
-
await refreshLogs();
|
212
|
-
}
|
213
|
-
}
|
214
|
-
}
|
215
|
-
|
216
|
-
new ClipboardJS(".clipboard-button,.copy-button");
|
217
|
-
};
|
218
|
-
|
219
|
-
loadLogsAndState();
|
220
|
-
}, [setLogs, selectLogFile, refreshLogs]);
|
221
|
-
|
222
|
-
// Configure an app envelope specific to the current state
|
223
|
-
// if there are no log files, then don't show sidebar
|
224
|
-
const fullScreen = logs.files.length === 1 && !logs.log_dir;
|
225
|
-
|
226
|
-
const showToggle = logs.files.length > 1 || !!logs.log_dir || false;
|
227
|
-
|
228
|
-
const handleSelectedIndexChanged = useCallback(
|
229
|
-
(index: number) => {
|
230
|
-
setSelectedLogIndex(index);
|
231
|
-
setOffCanvas(false);
|
232
|
-
resetFiltering();
|
233
|
-
clearSampleTab();
|
234
|
-
clearWorkspaceTab();
|
235
|
-
selectSample(0);
|
236
|
-
},
|
237
|
-
[
|
238
|
-
setSelectedLogIndex,
|
239
|
-
setOffCanvas,
|
240
|
-
resetFiltering,
|
241
|
-
clearSampleTab,
|
242
|
-
clearWorkspaceTab,
|
243
|
-
selectSample,
|
244
|
-
],
|
245
|
-
);
|
246
|
-
|
247
|
-
const handleKeyboard = useCallback(
|
248
|
-
(e: KeyboardEvent) => {
|
249
|
-
// Add keyboard shortcuts for find, if needed
|
250
|
-
if (nativeFind || !setShowFind) {
|
251
|
-
return;
|
252
|
-
}
|
253
|
-
|
254
|
-
if ((e.ctrlKey || e.metaKey) && e.key === "f") {
|
255
|
-
setShowFind(true);
|
256
|
-
} else if (e.key === "Escape") {
|
257
|
-
hideFind();
|
258
|
-
}
|
259
|
-
},
|
260
|
-
[nativeFind, setShowFind, hideFind],
|
261
|
-
);
|
262
|
-
|
263
|
-
return (
|
264
|
-
<>
|
265
|
-
{!fullScreen && selectedLogSummary ? (
|
266
|
-
<Sidebar
|
267
|
-
logs={logs}
|
268
|
-
logHeaders={logHeaders}
|
269
|
-
loading={headersLoading}
|
270
|
-
selectedIndex={selectedLogIndex}
|
271
|
-
onSelectedIndexChanged={handleSelectedIndexChanged}
|
272
|
-
/>
|
273
|
-
) : undefined}
|
274
|
-
<div
|
275
|
-
ref={mainAppRef}
|
276
|
-
className={clsx(
|
277
|
-
"app-main-grid",
|
278
|
-
fullScreen ? "full-screen" : undefined,
|
279
|
-
offCanvas ? "off-canvas" : undefined,
|
280
|
-
)}
|
281
|
-
tabIndex={0}
|
282
|
-
onKeyDown={handleKeyboard}
|
283
|
-
>
|
284
|
-
{!nativeFind && showFind ? <FindBand /> : ""}
|
285
|
-
<ProgressBar animating={appStatus.loading} />
|
286
|
-
{appStatus.error ? (
|
287
|
-
<ErrorPanel
|
288
|
-
title="An error occurred while loading this task."
|
289
|
-
error={appStatus.error}
|
290
|
-
/>
|
291
|
-
) : (
|
292
|
-
<WorkSpace
|
293
|
-
task_id={selectedLogSummary?.eval?.task_id}
|
294
|
-
evalStatus={selectedLogSummary?.status}
|
295
|
-
evalError={filterNull(selectedLogSummary?.error)}
|
296
|
-
evalVersion={selectedLogSummary?.version}
|
297
|
-
evalSpec={selectedLogSummary?.eval}
|
298
|
-
evalPlan={selectedLogSummary?.plan}
|
299
|
-
evalStats={selectedLogSummary?.stats}
|
300
|
-
evalResults={filterNull(selectedLogSummary?.results)}
|
301
|
-
runningMetrics={runningMetrics}
|
302
|
-
showToggle={showToggle}
|
303
|
-
refreshLog={appRefreshLog}
|
304
|
-
/>
|
305
|
-
)}
|
306
|
-
</div>
|
307
|
-
</>
|
308
|
-
);
|
309
|
-
};
|
310
|
-
|
311
|
-
const filterNull = <T,>(obj: T | null): T | undefined => {
|
312
|
-
if (obj === null) {
|
313
|
-
return undefined;
|
314
|
-
}
|
315
|
-
return obj;
|
316
|
-
};
|
@@ -1,292 +0,0 @@
|
|
1
|
-
import { ApplicationIcons } from "../appearance/icons";
|
2
|
-
import { ToolButton } from "../components/ToolButton";
|
3
|
-
import { SampleTools, ScoreFilterTools } from "../samples/SamplesTools";
|
4
|
-
import { JsonTab } from "./tabs/JsonTab";
|
5
|
-
import { SamplesTab } from "./tabs/SamplesTab";
|
6
|
-
|
7
|
-
import clsx from "clsx";
|
8
|
-
import { FC, MouseEvent, useEffect, useMemo, useRef } from "react";
|
9
|
-
import { RunningMetric } from "../api/types.ts";
|
10
|
-
import {
|
11
|
-
kEvalWorkspaceTabId,
|
12
|
-
kInfoWorkspaceTabId,
|
13
|
-
kJsonWorkspaceTabId,
|
14
|
-
} from "../constants";
|
15
|
-
import {
|
16
|
-
useFilteredSamples,
|
17
|
-
useSampleDescriptor,
|
18
|
-
useTotalSampleCount,
|
19
|
-
} from "../state/hooks.ts";
|
20
|
-
import { useStore } from "../state/store.ts";
|
21
|
-
import { CurrentLog } from "../types.ts";
|
22
|
-
import {
|
23
|
-
EvalError,
|
24
|
-
EvalPlan,
|
25
|
-
EvalResults,
|
26
|
-
EvalSpec,
|
27
|
-
EvalStats,
|
28
|
-
Status,
|
29
|
-
} from "../types/log";
|
30
|
-
import { InfoTab } from "./tabs/InfoTab.tsx";
|
31
|
-
import { WorkSpaceView } from "./WorkSpaceView.tsx";
|
32
|
-
|
33
|
-
interface WorkSpaceProps {
|
34
|
-
task_id?: string;
|
35
|
-
evalError?: EvalError;
|
36
|
-
evalStatus?: Status;
|
37
|
-
evalVersion?: number;
|
38
|
-
evalSpec?: EvalSpec;
|
39
|
-
evalPlan?: EvalPlan;
|
40
|
-
evalStats?: EvalStats;
|
41
|
-
evalResults?: EvalResults;
|
42
|
-
runningMetrics?: RunningMetric[];
|
43
|
-
log?: CurrentLog;
|
44
|
-
showToggle: boolean;
|
45
|
-
refreshLog: () => void;
|
46
|
-
}
|
47
|
-
|
48
|
-
/**
|
49
|
-
* Renders the Main Application
|
50
|
-
*/
|
51
|
-
export const WorkSpace: FC<WorkSpaceProps> = (props) => {
|
52
|
-
const {
|
53
|
-
task_id,
|
54
|
-
evalStatus,
|
55
|
-
evalSpec,
|
56
|
-
evalPlan,
|
57
|
-
evalStats,
|
58
|
-
evalResults,
|
59
|
-
runningMetrics,
|
60
|
-
showToggle,
|
61
|
-
} = props;
|
62
|
-
|
63
|
-
const divRef = useRef<HTMLDivElement>(null);
|
64
|
-
|
65
|
-
// Display the log
|
66
|
-
useEffect(() => {
|
67
|
-
if (divRef.current) {
|
68
|
-
divRef.current.scrollTop = 0;
|
69
|
-
}
|
70
|
-
}, [task_id]);
|
71
|
-
|
72
|
-
const resolvedTabs = useResolvedTabs(props);
|
73
|
-
|
74
|
-
if (!evalSpec) {
|
75
|
-
return undefined;
|
76
|
-
}
|
77
|
-
|
78
|
-
return (
|
79
|
-
<WorkSpaceView
|
80
|
-
divRef={divRef}
|
81
|
-
evalSpec={evalSpec}
|
82
|
-
evalPlan={evalPlan}
|
83
|
-
evalResults={evalResults}
|
84
|
-
runningMetrics={runningMetrics}
|
85
|
-
evalStats={evalStats}
|
86
|
-
status={evalStatus}
|
87
|
-
tabs={resolvedTabs}
|
88
|
-
showToggle={showToggle}
|
89
|
-
/>
|
90
|
-
);
|
91
|
-
};
|
92
|
-
|
93
|
-
// Helper function for copy feedback
|
94
|
-
const copyFeedback = (e: MouseEvent<HTMLElement>) => {
|
95
|
-
const textEl = e.currentTarget.querySelector(".task-btn-copy-content");
|
96
|
-
const iconEl = e.currentTarget.querySelector("i.bi");
|
97
|
-
if (textEl) {
|
98
|
-
const htmlEl = textEl as HTMLElement;
|
99
|
-
const htmlIconEl = iconEl as HTMLElement;
|
100
|
-
const oldText = htmlEl.innerText;
|
101
|
-
const oldIconClz = htmlIconEl.className;
|
102
|
-
htmlEl.innerText = "Copied!";
|
103
|
-
htmlIconEl.className = `${ApplicationIcons.confirm}`;
|
104
|
-
setTimeout(() => {
|
105
|
-
window.getSelection()?.removeAllRanges();
|
106
|
-
}, 50);
|
107
|
-
setTimeout(() => {
|
108
|
-
htmlEl.innerText = oldText;
|
109
|
-
htmlIconEl.className = oldIconClz;
|
110
|
-
}, 1250);
|
111
|
-
}
|
112
|
-
};
|
113
|
-
|
114
|
-
// Individual hook for Samples tab
|
115
|
-
export const useSamplesTabConfig = (
|
116
|
-
evalStatus: Status | undefined,
|
117
|
-
refreshLog: () => void,
|
118
|
-
) => {
|
119
|
-
const totalSampleCount = useTotalSampleCount();
|
120
|
-
const samplesDescriptor = useSampleDescriptor();
|
121
|
-
const sampleSummaries = useFilteredSamples();
|
122
|
-
const streamSamples = useStore((state) => state.capabilities.streamSamples);
|
123
|
-
|
124
|
-
return useMemo(() => {
|
125
|
-
return {
|
126
|
-
id: kEvalWorkspaceTabId,
|
127
|
-
scrollable: false,
|
128
|
-
label: totalSampleCount > 1 ? "Samples" : "Sample",
|
129
|
-
component: SamplesTab,
|
130
|
-
componentProps: {
|
131
|
-
running: evalStatus === "started",
|
132
|
-
},
|
133
|
-
tools: () =>
|
134
|
-
!samplesDescriptor
|
135
|
-
? undefined
|
136
|
-
: totalSampleCount === 1
|
137
|
-
? [<ScoreFilterTools />]
|
138
|
-
: [
|
139
|
-
<SampleTools
|
140
|
-
samples={sampleSummaries || []}
|
141
|
-
key="sample-tools"
|
142
|
-
/>,
|
143
|
-
evalStatus === "started" && !streamSamples && (
|
144
|
-
<ToolButton
|
145
|
-
key="refresh"
|
146
|
-
label="Refresh"
|
147
|
-
icon={ApplicationIcons.refresh}
|
148
|
-
onClick={refreshLog}
|
149
|
-
/>
|
150
|
-
),
|
151
|
-
],
|
152
|
-
};
|
153
|
-
}, [
|
154
|
-
evalStatus,
|
155
|
-
refreshLog,
|
156
|
-
sampleSummaries,
|
157
|
-
samplesDescriptor,
|
158
|
-
totalSampleCount,
|
159
|
-
]);
|
160
|
-
};
|
161
|
-
|
162
|
-
// Individual hook for Info tab
|
163
|
-
export const useInfoTabConfig = (
|
164
|
-
evalSpec: EvalSpec | undefined,
|
165
|
-
evalPlan: EvalPlan | undefined,
|
166
|
-
evalError: EvalError | undefined,
|
167
|
-
evalResults: EvalResults | undefined,
|
168
|
-
evalStats: EvalStats | undefined,
|
169
|
-
) => {
|
170
|
-
const totalSampleCount = useTotalSampleCount();
|
171
|
-
return useMemo(() => {
|
172
|
-
return {
|
173
|
-
id: kInfoWorkspaceTabId,
|
174
|
-
label: "Info",
|
175
|
-
scrollable: true,
|
176
|
-
component: InfoTab,
|
177
|
-
componentProps: {
|
178
|
-
evalSpec,
|
179
|
-
evalPlan,
|
180
|
-
evalError,
|
181
|
-
evalResults,
|
182
|
-
evalStats,
|
183
|
-
sampleCount: totalSampleCount,
|
184
|
-
},
|
185
|
-
};
|
186
|
-
}, [evalSpec, evalPlan, evalError, evalResults, evalStats, totalSampleCount]);
|
187
|
-
};
|
188
|
-
|
189
|
-
// Individual hook for JSON tab
|
190
|
-
export const useJsonTabConfig = (
|
191
|
-
evalVersion: number | undefined,
|
192
|
-
evalStatus: Status | undefined,
|
193
|
-
evalSpec: EvalSpec | undefined,
|
194
|
-
evalPlan: EvalPlan | undefined,
|
195
|
-
evalError: EvalError | undefined,
|
196
|
-
evalResults: EvalResults | undefined,
|
197
|
-
evalStats: EvalStats | undefined,
|
198
|
-
) => {
|
199
|
-
const selectedLogFile = useStore((state) =>
|
200
|
-
state.logsActions.getSelectedLogFile(),
|
201
|
-
);
|
202
|
-
const selectedTab = useStore((state) => state.app.tabs.workspace);
|
203
|
-
|
204
|
-
return useMemo(() => {
|
205
|
-
const evalHeader = {
|
206
|
-
version: evalVersion,
|
207
|
-
status: evalStatus,
|
208
|
-
eval: evalSpec,
|
209
|
-
plan: evalPlan,
|
210
|
-
error: evalError,
|
211
|
-
results: evalResults,
|
212
|
-
stats: evalStats,
|
213
|
-
};
|
214
|
-
|
215
|
-
return {
|
216
|
-
id: kJsonWorkspaceTabId,
|
217
|
-
label: "JSON",
|
218
|
-
scrollable: true,
|
219
|
-
component: JsonTab,
|
220
|
-
componentProps: {
|
221
|
-
logFile: selectedLogFile,
|
222
|
-
json: JSON.stringify(evalHeader, null, 2),
|
223
|
-
selected: selectedTab === kJsonWorkspaceTabId,
|
224
|
-
},
|
225
|
-
tools: () => [
|
226
|
-
<ToolButton
|
227
|
-
key="copy-json"
|
228
|
-
label="Copy JSON"
|
229
|
-
icon={ApplicationIcons.copy}
|
230
|
-
className={clsx("task-btn-json-copy", "clipboard-button")}
|
231
|
-
data-clipboard-target="#task-json-contents"
|
232
|
-
onClick={copyFeedback}
|
233
|
-
/>,
|
234
|
-
],
|
235
|
-
};
|
236
|
-
}, [
|
237
|
-
selectedLogFile,
|
238
|
-
evalVersion,
|
239
|
-
evalStatus,
|
240
|
-
evalSpec,
|
241
|
-
evalPlan,
|
242
|
-
evalError,
|
243
|
-
evalResults,
|
244
|
-
evalStats,
|
245
|
-
selectedTab,
|
246
|
-
]);
|
247
|
-
};
|
248
|
-
|
249
|
-
// Main hook combining all tab configs
|
250
|
-
export const useResolvedTabs = (props: WorkSpaceProps) => {
|
251
|
-
const {
|
252
|
-
evalVersion,
|
253
|
-
evalStatus,
|
254
|
-
evalSpec,
|
255
|
-
evalPlan,
|
256
|
-
evalResults,
|
257
|
-
evalStats,
|
258
|
-
evalError,
|
259
|
-
refreshLog,
|
260
|
-
} = props;
|
261
|
-
|
262
|
-
// Use individual tab config hooks
|
263
|
-
const samplesTabConfig = useSamplesTabConfig(evalStatus, refreshLog);
|
264
|
-
|
265
|
-
const configTabConfig = useInfoTabConfig(
|
266
|
-
evalSpec,
|
267
|
-
evalPlan,
|
268
|
-
evalError,
|
269
|
-
evalResults,
|
270
|
-
evalStats,
|
271
|
-
);
|
272
|
-
|
273
|
-
const jsonTabConfig = useJsonTabConfig(
|
274
|
-
evalVersion,
|
275
|
-
evalStatus,
|
276
|
-
evalSpec,
|
277
|
-
evalPlan,
|
278
|
-
evalError,
|
279
|
-
evalResults,
|
280
|
-
evalStats,
|
281
|
-
);
|
282
|
-
|
283
|
-
// Combine all tab configs
|
284
|
-
return useMemo(
|
285
|
-
() => ({
|
286
|
-
...(samplesTabConfig ? { samples: samplesTabConfig } : {}),
|
287
|
-
config: configTabConfig,
|
288
|
-
json: jsonTabConfig,
|
289
|
-
}),
|
290
|
-
[samplesTabConfig, configTabConfig, jsonTabConfig],
|
291
|
-
);
|
292
|
-
};
|
@@ -1,57 +0,0 @@
|
|
1
|
-
import clsx from "clsx";
|
2
|
-
import { FC } from "react";
|
3
|
-
import { useStore } from "../../state/store";
|
4
|
-
import styles from "./LogDirectoryTitleView.module.css";
|
5
|
-
|
6
|
-
interface LogDirectoryTitleViewProps {
|
7
|
-
log_dir?: string;
|
8
|
-
}
|
9
|
-
|
10
|
-
export const LogDirectoryTitleView: FC<LogDirectoryTitleViewProps> = ({
|
11
|
-
log_dir,
|
12
|
-
}) => {
|
13
|
-
const offCanvas = useStore((state) => state.app.offcanvas);
|
14
|
-
if (log_dir) {
|
15
|
-
const displayDir = prettyDir(log_dir);
|
16
|
-
return (
|
17
|
-
<div style={{ display: "flex", flexDirection: "column" }}>
|
18
|
-
<span
|
19
|
-
className={clsx(
|
20
|
-
"text-style-secondary",
|
21
|
-
"text-style-label",
|
22
|
-
"text-size-small",
|
23
|
-
)}
|
24
|
-
>
|
25
|
-
Log Directory
|
26
|
-
</span>
|
27
|
-
<span
|
28
|
-
title={displayDir}
|
29
|
-
className={clsx("text-size-base", styles.dirname)}
|
30
|
-
>
|
31
|
-
{offCanvas ? displayDir : ""}
|
32
|
-
</span>
|
33
|
-
</div>
|
34
|
-
);
|
35
|
-
} else {
|
36
|
-
return (
|
37
|
-
<span className={clsx("text-size-title")}>
|
38
|
-
{offCanvas ? "Log History" : ""}
|
39
|
-
</span>
|
40
|
-
);
|
41
|
-
}
|
42
|
-
};
|
43
|
-
|
44
|
-
const prettyDir = (path: string): string => {
|
45
|
-
try {
|
46
|
-
// Try to create a new URL object
|
47
|
-
let url = new URL(path);
|
48
|
-
|
49
|
-
if (url.protocol === "file:") {
|
50
|
-
return url.pathname;
|
51
|
-
} else {
|
52
|
-
return path;
|
53
|
-
}
|
54
|
-
} catch {
|
55
|
-
return path;
|
56
|
-
}
|
57
|
-
};
|