From 7e0520cb4c3b8018c8639689735c8dfb38c5cffb Mon Sep 17 00:00:00 2001 From: 777genius Date: Mon, 25 May 2026 17:17:11 +0300 Subject: [PATCH] fix(logs): restore member process log source --- .../adapters/MemberLogStreamSection.tsx | 90 ++++++++++++++----- .../cli/CliStatusVisibility.test.ts | 8 +- 2 files changed, 72 insertions(+), 26 deletions(-) diff --git a/src/features/member-log-stream/renderer/adapters/MemberLogStreamSection.tsx b/src/features/member-log-stream/renderer/adapters/MemberLogStreamSection.tsx index 627f2acb..c383ffe9 100644 --- a/src/features/member-log-stream/renderer/adapters/MemberLogStreamSection.tsx +++ b/src/features/member-log-stream/renderer/adapters/MemberLogStreamSection.tsx @@ -1,13 +1,15 @@ -import { useEffect, useMemo } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import { useAppTranslation } from '@features/localization/renderer'; +import { api } from '@renderer/api'; import { useStore } from '@renderer/store'; import { selectResolvedMembersForTeamName } from '@renderer/store/slices/teamSlice'; import { useMemberLogStream } from '../hooks/useMemberLogStream'; import { ExecutionLogStreamView } from '../ui/ExecutionLogStreamView'; +import { MemberRuntimeProcessLogsPanel } from '../ui/MemberRuntimeProcessLogsPanel'; -import type { MemberLogStreamSegment } from '../../contracts'; +import type { MemberLogStreamSegment, MemberRuntimeLogKind } from '../../contracts'; import type { ResolvedTeamMember } from '@shared/types'; interface MemberLogStreamSectionProps { @@ -17,6 +19,10 @@ interface MemberLogStreamSectionProps { onInitialLoadErrorChange?: (hasError: boolean) => void; } +function describeMemberStream(): string { + return 'Member-scoped transcript and runtime logs rendered with the same execution-log components used in Task Log Stream.'; +} + function getSegmentMetaLabel(segment: MemberLogStreamSegment): string { const details = [segment.source.label]; if (segment.source.laneId) { @@ -39,8 +45,17 @@ export const MemberLogStreamSection = ({ onInitialLoadErrorChange, }: Readonly): React.JSX.Element => { const { t } = useAppTranslation('team'); + const [selectedLogView, setSelectedLogView] = useState<'execution' | 'process'>('execution'); const teamMembers = useStore((s) => selectResolvedMembersForTeamName(s, teamName)); const { stream, loading, error } = useMemberLogStream({ teamName, member, enabled }); + const loadRuntimeLogTail = useCallback( + (input: { + readonly kind: MemberRuntimeLogKind; + readonly maxBytes: number; + readonly forceRefresh?: boolean; + }) => api.memberLogStream.getMemberRuntimeLogTail(teamName, member.name, input), + [member.name, teamName] + ); const hasInitialLoadError = Boolean(error && !stream && !loading); const boundedHistoryNote = useMemo(() => { if (!stream) return null; @@ -55,24 +70,57 @@ export const MemberLogStreamSection = ({ }, [hasInitialLoadError, onInitialLoadErrorChange]); return ( - +
+
+ + +
+ + {selectedLogView === 'execution' ? ( + + ) : ( + + )} +
); }; diff --git a/test/renderer/components/cli/CliStatusVisibility.test.ts b/test/renderer/components/cli/CliStatusVisibility.test.ts index 9cd22ef6..b6168105 100644 --- a/test/renderer/components/cli/CliStatusVisibility.test.ts +++ b/test/renderer/components/cli/CliStatusVisibility.test.ts @@ -733,11 +733,9 @@ describe('CLI status visibility during completed install state', () => { vi.stubGlobal('IS_REACT_ACT_ENVIRONMENT', true); storeState.cliInstallerState = 'idle'; storeState.codexRuntimeStatus = { - installed: true, - source: 'path', - state: 'ready', - binaryPath: '/usr/local/bin/codex', - version: 'codex-cli 0.125.0', + installed: false, + source: 'missing', + state: 'idle', }; storeState.cliStatus = createInstalledCliStatus({ flavor: 'agent_teams_orchestrator',