diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 17fb0370..7bbd6b3d 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -4,6 +4,7 @@ import { I18nextProvider } from 'react-i18next'; import i18n from '@/i18n'; import { Projects } from '@/pages/projects'; import { ProjectTasks } from '@/pages/project-tasks'; +import { FullAttemptLogsPage } from '@/pages/full-attempt-logs'; import { NormalLayout } from '@/components/layout/NormalLayout'; import { usePostHog } from 'posthog-js/react'; @@ -29,8 +30,6 @@ import { ThemeMode } from 'shared/types'; import * as Sentry from '@sentry/react'; import { Loader } from '@/components/ui/loader'; -import { AppWithStyleOverride } from '@/utils/style-override'; -import { WebviewContextMenu } from '@/vscode/ContextMenu'; import NiceModal from '@ebay/nice-modal-react'; import { OnboardingResult } from './components/dialogs/global/OnboardingDialog'; import { ClickedElementsProvider } from './contexts/ClickedElementsProvider'; @@ -157,44 +156,46 @@ function AppContent() { return ( - - -
- + +
+ + {/* VS Code full-page logs route (outside NormalLayout for minimal UI) */} + } + /> - - }> - } /> - } /> - } /> - } - /> - }> - } /> - } /> - } /> - } /> - - } - /> - } - /> - } - /> + }> + } /> + } /> + } /> + } + /> + }> + } /> + } /> + } /> + } /> - -
- -
- + } + /> + } + /> + } + /> + + +
+ +
); diff --git a/frontend/src/lib/paths.ts b/frontend/src/lib/paths.ts index 868359cd..19fd0dad 100644 --- a/frontend/src/lib/paths.ts +++ b/frontend/src/lib/paths.ts @@ -5,4 +5,6 @@ export const paths = { `/projects/${projectId}/tasks/${taskId}`, attempt: (projectId: string, taskId: string, attemptId: string) => `/projects/${projectId}/tasks/${taskId}/attempts/${attemptId}`, + attemptFull: (projectId: string, taskId: string, attemptId: string) => + `/projects/${projectId}/tasks/${taskId}/attempts/${attemptId}/full`, }; diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx index 88b8622f..cfd8d471 100644 --- a/frontend/src/main.tsx +++ b/frontend/src/main.tsx @@ -61,8 +61,6 @@ NiceModal.register('project-editor-selection', ProjectEditorSelectionDialog); NiceModal.register('restore-logs', RestoreLogsDialog); NiceModal.register('view-processes', ViewProcessesDialog); NiceModal.register('create-attempt', CreateAttemptDialog); -// Install VS Code iframe keyboard bridge when running inside an iframe -import './vscode/bridge'; import { useLocation, diff --git a/frontend/src/pages/full-attempt-logs.tsx b/frontend/src/pages/full-attempt-logs.tsx new file mode 100644 index 00000000..d5f36875 --- /dev/null +++ b/frontend/src/pages/full-attempt-logs.tsx @@ -0,0 +1,77 @@ +// VS Code webview integration - install keyboard/clipboard bridge +import '@/vscode/bridge'; + +import { useParams } from 'react-router-dom'; +import { AppWithStyleOverride } from '@/utils/style-override'; +import { WebviewContextMenu } from '@/vscode/ContextMenu'; +import TaskAttemptPanel from '@/components/panels/TaskAttemptPanel'; +import { useTaskAttempt } from '@/hooks/useTaskAttempt'; +import { useProjectTasks } from '@/hooks/useProjectTasks'; +import { ExecutionProcessesProvider } from '@/contexts/ExecutionProcessesContext'; +import { ReviewProvider } from '@/contexts/ReviewProvider'; +import { ClickedElementsProvider } from '@/contexts/ClickedElementsProvider'; + +export function FullAttemptLogsPage() { + const { + projectId = '', + taskId = '', + attemptId = '', + } = useParams<{ + projectId: string; + taskId: string; + attemptId: string; + }>(); + + const { data: attempt } = useTaskAttempt(attemptId); + const { tasksById } = useProjectTasks(projectId); + const task = taskId ? (tasksById[taskId] ?? null) : null; + + return ( + +
+ + +
+ {attempt ? ( + + + + + {({ logs, followUp }) => ( +
+
+ {logs} +
+
+
+ {followUp} +
+
+
+ )} +
+
+
+
+ ) : ( + + {({ logs, followUp }) => ( +
+
{logs}
+
+
+ {followUp} +
+
+
+ )} +
+ )} +
+
+
+ ); +}