diff --git a/packages/agent-graph/package.json b/packages/agent-graph/package.json index 0144aa33..fef2c312 100644 --- a/packages/agent-graph/package.json +++ b/packages/agent-graph/package.json @@ -12,8 +12,8 @@ } }, "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0", "lucide-react": ">=0.300.0" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 53f11ab3..66dc8138 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -531,13 +531,13 @@ importers: version: 3.0.0 lucide-react: specifier: '>=0.300.0' - version: 0.577.0(react@18.3.1) + version: 0.577.0(react@19.2.4) react: - specifier: ^18.0.0 - version: 18.3.1 + specifier: ^18.0.0 || ^19.0.0 + version: 19.2.4 react-dom: - specifier: ^18.0.0 - version: 18.3.1(react@18.3.1) + specifier: ^18.0.0 || ^19.0.0 + version: 19.2.4(react@19.2.4) devDependencies: '@types/d3-force': specifier: ^3.0.10 @@ -9108,11 +9108,6 @@ packages: rc9@3.0.0: resolution: {integrity: sha512-MGOue0VqscKWQ104udASX/3GYDcKyPI4j4F8gu/jHHzglpmy9a/anZK3PNe8ug6aZFl+9GxLtdhe3kVZuMaQbA==} - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - react-dom@19.2.4: resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: @@ -9195,10 +9190,6 @@ packages: react-dom: optional: true - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - react@19.2.4: resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} @@ -9465,9 +9456,6 @@ packages: resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -19356,10 +19344,6 @@ snapshots: dependencies: yallist: 4.0.0 - lucide-react@0.577.0(react@18.3.1): - dependencies: - react: 18.3.1 - lucide-react@0.577.0(react@19.2.4): dependencies: react: 19.2.4 @@ -21160,12 +21144,6 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - react-dom@19.2.4(react@19.2.4): dependencies: react: 19.2.4 @@ -21259,10 +21237,6 @@ snapshots: optionalDependencies: react-dom: 19.2.4(react@19.2.4) - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - react@19.2.4: {} read-binary-file-arch@1.0.6: @@ -21638,10 +21612,6 @@ snapshots: sax@1.6.0: {} - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - scheduler@0.27.0: {} scslre@0.3.0: diff --git a/src/main/index.ts b/src/main/index.ts index 980e216e..747e1c2e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -102,12 +102,12 @@ import { } from './utils/safeWebContentsSend'; import { syncTelemetryFlag } from './sentry'; import { - BranchStatusService, BoardTaskActivityRecordSource, BoardTaskActivityService, BoardTaskExactLogDetailService, BoardTaskExactLogsService, BoardTaskLogStreamService, + BranchStatusService, CliInstallerService, configManager, LocalFileSystemProvider, diff --git a/src/main/ipc/handlers.ts b/src/main/ipc/handlers.ts index cd33a6d4..819275be 100644 --- a/src/main/ipc/handlers.ts +++ b/src/main/ipc/handlers.ts @@ -89,11 +89,11 @@ import { registerValidationHandlers, removeValidationHandlers } from './validati import { registerWindowHandlers, removeWindowHandlers } from './window'; import type { - BranchStatusService, BoardTaskActivityService, - BoardTaskLogStreamService, BoardTaskExactLogDetailService, BoardTaskExactLogsService, + BoardTaskLogStreamService, + BranchStatusService, ChangeExtractorService, CliInstallerService, FileContentResolver, diff --git a/src/main/ipc/teams.ts b/src/main/ipc/teams.ts index d05f41fb..062f5e8e 100644 --- a/src/main/ipc/teams.ts +++ b/src/main/ipc/teams.ts @@ -22,17 +22,17 @@ import { TEAM_GET_DATA, TEAM_GET_DELETED_TASKS, TEAM_GET_LOGS_FOR_TASK, - TEAM_GET_TASK_ACTIVITY, - TEAM_GET_TASK_LOG_STREAM, - TEAM_GET_TASK_EXACT_LOG_DETAIL, - TEAM_GET_TASK_EXACT_LOG_SUMMARIES, TEAM_GET_MEMBER_LOGS, TEAM_GET_MEMBER_STATS, TEAM_GET_MESSAGES_PAGE, TEAM_GET_PROJECT_BRANCH, TEAM_GET_SAVED_REQUEST, + TEAM_GET_TASK_ACTIVITY, TEAM_GET_TASK_ATTACHMENT, TEAM_GET_TASK_CHANGE_PRESENCE, + TEAM_GET_TASK_EXACT_LOG_DETAIL, + TEAM_GET_TASK_EXACT_LOG_SUMMARIES, + TEAM_GET_TASK_LOG_STREAM, TEAM_KILL_PROCESS, TEAM_LAUNCH, TEAM_LEAD_ACTIVITY, @@ -121,11 +121,11 @@ import { } from './guards'; import type { - BranchStatusService, BoardTaskActivityService, - BoardTaskLogStreamService, BoardTaskExactLogDetailService, BoardTaskExactLogsService, + BoardTaskLogStreamService, + BranchStatusService, MemberStatsComputer, TeamDataService, TeammateToolTracker, @@ -140,9 +140,9 @@ import type { AttachmentMeta, AttachmentPayload, BoardTaskActivityEntry, - BoardTaskLogStreamResponse, BoardTaskExactLogDetailResult, BoardTaskExactLogSummariesResponse, + BoardTaskLogStreamResponse, CreateTaskRequest, EffortLevel, GlobalTask, diff --git a/src/main/services/team/TeamMemberLogsFinder.ts b/src/main/services/team/TeamMemberLogsFinder.ts index 6e42d880..c25220ac 100644 --- a/src/main/services/team/TeamMemberLogsFinder.ts +++ b/src/main/services/team/TeamMemberLogsFinder.ts @@ -7,13 +7,13 @@ import * as fs from 'fs/promises'; import * as path from 'path'; import * as readline from 'readline'; -import { TeamConfigReader } from './TeamConfigReader'; -import { TeamInboxReader } from './TeamInboxReader'; -import { TeamMembersMetaStore } from './TeamMembersMetaStore'; import { canonicalizeAgentTeamsToolName, lineHasAgentTeamsTaskBoundaryToolName, } from './agentTeamsToolNames'; +import { TeamConfigReader } from './TeamConfigReader'; +import { TeamInboxReader } from './TeamInboxReader'; +import { TeamMembersMetaStore } from './TeamMembersMetaStore'; import type { MemberLogSummary, MemberSubagentLogSummary } from '@shared/types'; diff --git a/src/main/services/team/index.ts b/src/main/services/team/index.ts index b4e954c9..d26e731c 100644 --- a/src/main/services/team/index.ts +++ b/src/main/services/team/index.ts @@ -1,9 +1,4 @@ export { BranchStatusService } from './BranchStatusService'; -export { BoardTaskActivityRecordSource } from './taskLogs/activity/BoardTaskActivityRecordSource'; -export { BoardTaskActivityService } from './taskLogs/activity/BoardTaskActivityService'; -export { BoardTaskExactLogsService } from './taskLogs/exact/BoardTaskExactLogsService'; -export { BoardTaskExactLogDetailService } from './taskLogs/exact/BoardTaskExactLogDetailService'; -export { BoardTaskLogStreamService } from './taskLogs/stream/BoardTaskLogStreamService'; export { CascadeGuard } from './CascadeGuard'; export { ChangeExtractorService } from './ChangeExtractorService'; export { ClaudeBinaryResolver } from './ClaudeBinaryResolver'; @@ -15,6 +10,11 @@ export { HunkSnippetMatcher } from './HunkSnippetMatcher'; export { MemberStatsComputer } from './MemberStatsComputer'; export { ReviewApplierService } from './ReviewApplierService'; export { TaskBoundaryParser } from './TaskBoundaryParser'; +export { BoardTaskActivityRecordSource } from './taskLogs/activity/BoardTaskActivityRecordSource'; +export { BoardTaskActivityService } from './taskLogs/activity/BoardTaskActivityService'; +export { BoardTaskExactLogDetailService } from './taskLogs/exact/BoardTaskExactLogDetailService'; +export { BoardTaskExactLogsService } from './taskLogs/exact/BoardTaskExactLogsService'; +export { BoardTaskLogStreamService } from './taskLogs/stream/BoardTaskLogStreamService'; export { TeamAttachmentStore } from './TeamAttachmentStore'; export { TeamBackupService } from './TeamBackupService'; export { TeamConfigReader } from './TeamConfigReader'; diff --git a/src/main/services/team/taskLogs/activity/BoardTaskActivityEntryBuilder.ts b/src/main/services/team/taskLogs/activity/BoardTaskActivityEntryBuilder.ts index c291484a..9f058609 100644 --- a/src/main/services/team/taskLogs/activity/BoardTaskActivityEntryBuilder.ts +++ b/src/main/services/team/taskLogs/activity/BoardTaskActivityEntryBuilder.ts @@ -1,8 +1,8 @@ import { BoardTaskActivityRecordBuilder } from './BoardTaskActivityRecordBuilder'; -import type { BoardTaskActivityEntry, TeamTask } from '@shared/types'; -import type { RawTaskActivityMessage } from './BoardTaskActivityTranscriptReader'; import type { BoardTaskActivityRecord } from './BoardTaskActivityRecord'; +import type { RawTaskActivityMessage } from './BoardTaskActivityTranscriptReader'; +import type { BoardTaskActivityEntry, TeamTask } from '@shared/types'; function cloneTaskRef(task: BoardTaskActivityRecord['task']): BoardTaskActivityEntry['task'] { return { diff --git a/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordBuilder.ts b/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordBuilder.ts index 3e20e820..fc58f657 100644 --- a/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordBuilder.ts +++ b/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordBuilder.ts @@ -1,6 +1,12 @@ import { createLogger } from '@shared/utils/logger'; import { getTaskDisplayId } from '@shared/utils/taskIdentity'; +import type { + ParsedBoardTaskLink, + ParsedBoardTaskToolAction, +} from '../contract/BoardTaskTranscriptContract'; +import type { BoardTaskActivityRecord } from './BoardTaskActivityRecord'; +import type { RawTaskActivityMessage } from './BoardTaskActivityTranscriptReader'; import type { BoardTaskActivityAction, BoardTaskActivityActor, @@ -10,12 +16,6 @@ import type { TaskRef, TeamTask, } from '@shared/types'; -import type { RawTaskActivityMessage } from './BoardTaskActivityTranscriptReader'; -import type { - ParsedBoardTaskLink, - ParsedBoardTaskToolAction, -} from '../contract/BoardTaskTranscriptContract'; -import type { BoardTaskActivityRecord } from './BoardTaskActivityRecord'; interface TaskLookup { byId: Map; diff --git a/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordSource.ts b/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordSource.ts index d981a08a..7af3dc1b 100644 --- a/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordSource.ts +++ b/src/main/services/team/taskLogs/activity/BoardTaskActivityRecordSource.ts @@ -1,5 +1,6 @@ import { TeamTaskReader } from '../../TeamTaskReader'; import { TeamTranscriptSourceLocator } from '../discovery/TeamTranscriptSourceLocator'; + import { BoardTaskActivityRecordBuilder } from './BoardTaskActivityRecordBuilder'; import { BoardTaskActivityTranscriptReader } from './BoardTaskActivityTranscriptReader'; diff --git a/src/main/services/team/taskLogs/activity/BoardTaskActivityTranscriptReader.ts b/src/main/services/team/taskLogs/activity/BoardTaskActivityTranscriptReader.ts index 89006645..ffeeef7d 100644 --- a/src/main/services/team/taskLogs/activity/BoardTaskActivityTranscriptReader.ts +++ b/src/main/services/team/taskLogs/activity/BoardTaskActivityTranscriptReader.ts @@ -1,11 +1,9 @@ +import { yieldToEventLoop } from '@main/utils/asyncYield'; import { createLogger } from '@shared/utils/logger'; import { createReadStream } from 'fs'; import * as fs from 'fs/promises'; import * as readline from 'readline'; -import { yieldToEventLoop } from '@main/utils/asyncYield'; - -import { BoardTaskActivityParseCache } from './BoardTaskActivityParseCache'; import { parseBoardTaskLinks, parseBoardTaskToolActions, @@ -13,6 +11,8 @@ import { type ParsedBoardTaskToolAction, } from '../contract/BoardTaskTranscriptContract'; +import { BoardTaskActivityParseCache } from './BoardTaskActivityParseCache'; + const logger = createLogger('Service:BoardTaskActivityTranscriptReader'); export interface RawTaskActivityMessage { diff --git a/src/main/services/team/taskLogs/contract/BoardTaskTranscriptContract.ts b/src/main/services/team/taskLogs/contract/BoardTaskTranscriptContract.ts index 425517ad..a7070335 100644 --- a/src/main/services/team/taskLogs/contract/BoardTaskTranscriptContract.ts +++ b/src/main/services/team/taskLogs/contract/BoardTaskTranscriptContract.ts @@ -1,4 +1,5 @@ import { createLogger } from '@shared/utils/logger'; + import type { BoardTaskActivityLinkKind, BoardTaskActivityPhase, diff --git a/src/main/services/team/taskLogs/diagnostics/BoardTaskLogDiagnosticsService.ts b/src/main/services/team/taskLogs/diagnostics/BoardTaskLogDiagnosticsService.ts index b9b6d730..4df44881 100644 --- a/src/main/services/team/taskLogs/diagnostics/BoardTaskLogDiagnosticsService.ts +++ b/src/main/services/team/taskLogs/diagnostics/BoardTaskLogDiagnosticsService.ts @@ -1,13 +1,14 @@ +import { getTaskDisplayId, taskMatchesRef } from '@shared/utils/taskIdentity'; + import { TeamTaskReader } from '../../TeamTaskReader'; import { BoardTaskActivityRecordSource } from '../activity/BoardTaskActivityRecordSource'; -import type { BoardTaskActivityRecord } from '../activity/BoardTaskActivityRecord'; import { TeamTranscriptSourceLocator } from '../discovery/TeamTranscriptSourceLocator'; import { BoardTaskExactLogStrictParser } from '../exact/BoardTaskExactLogStrictParser'; import { BoardTaskLogStreamService } from '../stream/BoardTaskLogStreamService'; +import type { BoardTaskActivityRecord } from '../activity/BoardTaskActivityRecord'; import type { ParsedMessage } from '@main/types'; -import type { TeamTask, TaskWorkInterval } from '@shared/types'; -import { getTaskDisplayId, taskMatchesRef } from '@shared/utils/taskIdentity'; +import type { TaskWorkInterval, TeamTask } from '@shared/types'; const BOARD_MCP_TOOL_PREFIXES = ['mcp__agent-teams__', 'mcp__agent_teams__'] as const; const MAX_EXAMPLES = 10; diff --git a/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailSelector.ts b/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailSelector.ts index 9a34ebe9..c64f71f1 100644 --- a/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailSelector.ts +++ b/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailSelector.ts @@ -1,12 +1,12 @@ import { extractToolCalls, extractToolResults } from '@main/utils/toolExtraction'; import { createLogger } from '@shared/utils/logger'; -import type { ContentBlock, ParsedMessage } from '@main/types'; import type { BoardTaskActivityRecord } from '../activity/BoardTaskActivityRecord'; import type { - BoardTaskExactLogDetailCandidate, BoardTaskExactLogBundleCandidate, + BoardTaskExactLogDetailCandidate, } from './BoardTaskExactLogTypes'; +import type { ContentBlock, ParsedMessage } from '@main/types'; const logger = createLogger('Service:BoardTaskExactLogDetailSelector'); @@ -63,7 +63,7 @@ function cloneBlock(block: T): T { } as T; } - return { ...block } as T; + return { ...block }; } function filterAssistantContent( @@ -249,7 +249,7 @@ function deduplicateAssistantMessagesByRequestId( continue; } - const existingRank = anchorEvidenceRank(messages[existingIndex]!, toolUseId); + const existingRank = anchorEvidenceRank(messages[existingIndex], toolUseId); const nextRank = anchorEvidenceRank(message, toolUseId); if (nextRank > existingRank || (nextRank === existingRank && i > existingIndex)) { preferredAssistantIndexByRequestId.set(message.requestId, i); diff --git a/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailService.ts b/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailService.ts index bdb4c0ee..469b09bc 100644 --- a/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailService.ts +++ b/src/main/services/team/taskLogs/exact/BoardTaskExactLogDetailService.ts @@ -1,10 +1,11 @@ import { BoardTaskActivityRecordSource } from '../activity/BoardTaskActivityRecordSource'; + import { BoardTaskExactLogChunkBuilder } from './BoardTaskExactLogChunkBuilder'; import { BoardTaskExactLogDetailSelector } from './BoardTaskExactLogDetailSelector'; import { BoardTaskExactLogStrictParser } from './BoardTaskExactLogStrictParser'; +import { BoardTaskExactLogSummarySelector } from './BoardTaskExactLogSummarySelector'; import { isBoardTaskExactLogsReadEnabled } from './featureGates'; import { getBoardTaskExactLogFileVersions } from './fileVersions'; -import { BoardTaskExactLogSummarySelector } from './BoardTaskExactLogSummarySelector'; import type { BoardTaskExactLogDetailResult } from '@shared/types'; diff --git a/src/main/services/team/taskLogs/exact/BoardTaskExactLogStrictParser.ts b/src/main/services/team/taskLogs/exact/BoardTaskExactLogStrictParser.ts index 0927411a..d52274bf 100644 --- a/src/main/services/team/taskLogs/exact/BoardTaskExactLogStrictParser.ts +++ b/src/main/services/team/taskLogs/exact/BoardTaskExactLogStrictParser.ts @@ -1,11 +1,10 @@ +import { yieldToEventLoop } from '@main/utils/asyncYield'; +import { parseJsonlLine } from '@main/utils/jsonl'; import { createLogger } from '@shared/utils/logger'; import { createReadStream } from 'fs'; import * as fs from 'fs/promises'; import * as readline from 'readline'; -import { yieldToEventLoop } from '@main/utils/asyncYield'; -import { parseJsonlLine } from '@main/utils/jsonl'; - import { BoardTaskExactLogsParseCache } from './BoardTaskExactLogsParseCache'; import type { ParsedMessage } from '@main/types'; diff --git a/src/main/services/team/taskLogs/exact/BoardTaskExactLogSummarySelector.ts b/src/main/services/team/taskLogs/exact/BoardTaskExactLogSummarySelector.ts index 74b3c88e..99950cec 100644 --- a/src/main/services/team/taskLogs/exact/BoardTaskExactLogSummarySelector.ts +++ b/src/main/services/team/taskLogs/exact/BoardTaskExactLogSummarySelector.ts @@ -1,7 +1,6 @@ -import { createHash } from 'crypto'; - import { describeBoardTaskActivityLabel } from '@shared/utils/boardTaskActivityLabels'; import { createLogger } from '@shared/utils/logger'; +import { createHash } from 'crypto'; import type { BoardTaskActivityRecord } from '../activity/BoardTaskActivityRecord'; import type { @@ -75,7 +74,7 @@ function sourceGenerationFor( version: BoardTaskExactLogFileVersion | undefined ): string | null { if (!version) return null; - const hash = createHash('sha1'); + const hash = createHash('sha256'); hash.update(anchor.filePath); hash.update('\0'); hash.update(String(version.size)); diff --git a/src/main/services/team/taskLogs/exact/BoardTaskExactLogTypes.ts b/src/main/services/team/taskLogs/exact/BoardTaskExactLogTypes.ts index 31550a5b..747038e2 100644 --- a/src/main/services/team/taskLogs/exact/BoardTaskExactLogTypes.ts +++ b/src/main/services/team/taskLogs/exact/BoardTaskExactLogTypes.ts @@ -1,3 +1,4 @@ +import type { BoardTaskActivityRecord } from '../activity/BoardTaskActivityRecord'; import type { ParsedMessage } from '@main/types'; import type { BoardTaskActivityCategory, @@ -7,7 +8,6 @@ import type { BoardTaskExactLogSource, BoardTaskExactLogSummary, } from '@shared/types'; -import type { BoardTaskActivityRecord } from '../activity/BoardTaskActivityRecord'; export interface BoardTaskExactLogFileVersion { filePath: string; diff --git a/src/main/services/team/taskLogs/exact/BoardTaskExactLogsService.ts b/src/main/services/team/taskLogs/exact/BoardTaskExactLogsService.ts index 12db7d35..3d8f41a7 100644 --- a/src/main/services/team/taskLogs/exact/BoardTaskExactLogsService.ts +++ b/src/main/services/team/taskLogs/exact/BoardTaskExactLogsService.ts @@ -1,8 +1,9 @@ import { BoardTaskActivityRecordSource } from '../activity/BoardTaskActivityRecordSource'; -import { isBoardTaskExactLogsReadEnabled } from './featureGates'; -import { getBoardTaskExactLogFileVersions } from './fileVersions'; + import { BoardTaskExactLogSummarySelector } from './BoardTaskExactLogSummarySelector'; import { mapCandidateToSummary } from './BoardTaskExactLogTypes'; +import { isBoardTaskExactLogsReadEnabled } from './featureGates'; +import { getBoardTaskExactLogFileVersions } from './fileVersions'; import type { BoardTaskExactLogSummariesResponse } from '@shared/types'; diff --git a/src/main/services/team/taskLogs/stream/BoardTaskLogStreamService.ts b/src/main/services/team/taskLogs/stream/BoardTaskLogStreamService.ts index 078f2ca8..2a47c4fb 100644 --- a/src/main/services/team/taskLogs/stream/BoardTaskLogStreamService.ts +++ b/src/main/services/team/taskLogs/stream/BoardTaskLogStreamService.ts @@ -4,10 +4,11 @@ import { BoardTaskActivityRecordSource } from '../activity/BoardTaskActivityReco import { BoardTaskExactLogChunkBuilder } from '../exact/BoardTaskExactLogChunkBuilder'; import { BoardTaskExactLogDetailSelector } from '../exact/BoardTaskExactLogDetailSelector'; import { BoardTaskExactLogStrictParser } from '../exact/BoardTaskExactLogStrictParser'; +import { BoardTaskExactLogSummarySelector } from '../exact/BoardTaskExactLogSummarySelector'; import { isBoardTaskExactLogsReadEnabled } from '../exact/featureGates'; import { getBoardTaskExactLogFileVersions } from '../exact/fileVersions'; -import { BoardTaskExactLogSummarySelector } from '../exact/BoardTaskExactLogSummarySelector'; +import type { BoardTaskExactLogDetailCandidate } from '../exact/BoardTaskExactLogTypes'; import type { ContentBlock, ParsedMessage, ToolUseResultData } from '@main/types'; import type { BoardTaskActivityCategory, @@ -16,7 +17,6 @@ import type { BoardTaskLogSegment, BoardTaskLogStreamResponse, } from '@shared/types'; -import type { BoardTaskExactLogDetailCandidate } from '../exact/BoardTaskExactLogTypes'; interface StreamSlice { id: string; @@ -533,7 +533,7 @@ function cloneBlock(block: T): T { } as T; } - return { ...block } as T; + return { ...block }; } function cloneMessageContent(content: ParsedMessage['content']): ParsedMessage['content'] { @@ -655,7 +655,7 @@ function rebuildMergedMessage( } function mergeMessages( - details: Array<{ filePath: string; filteredMessages: ParsedMessage[] }> + details: { filePath: string; filteredMessages: ParsedMessage[] }[] ): ParsedMessage[] { const byMessageKey = new Map(); let order = 0; @@ -808,8 +808,8 @@ export class BoardTaskLogStreamService { const flushSegment = (): void => { if (currentSegmentSlices.length === 0) return; - const participantKey = currentSegmentSlices[0]!.participantKey; - const actor = currentSegmentSlices[0]!.actor; + const participantKey = currentSegmentSlices[0].participantKey; + const actor = currentSegmentSlices[0].actor; const mergedMessages = mergeMessages( currentSegmentSlices.map((slice) => ({ filePath: slice.filePath, @@ -827,8 +827,8 @@ export class BoardTaskLogStreamService { id: buildSegmentId(participantKey, currentSegmentSlices), participantKey, actor, - startTimestamp: currentSegmentSlices[0]!.timestamp, - endTimestamp: currentSegmentSlices[currentSegmentSlices.length - 1]!.timestamp, + startTimestamp: currentSegmentSlices[0].timestamp, + endTimestamp: currentSegmentSlices[currentSegmentSlices.length - 1].timestamp, chunks, }); } @@ -838,7 +838,7 @@ export class BoardTaskLogStreamService { for (const slice of visibleSlices) { if ( currentSegmentSlices.length > 0 && - currentSegmentSlices[0]!.participantKey !== slice.participantKey + currentSegmentSlices[0].participantKey !== slice.participantKey ) { flushSegment(); } @@ -847,7 +847,7 @@ export class BoardTaskLogStreamService { flushSegment(); const namedParticipants = orderedParticipants.filter((participant) => !participant.isLead); - const defaultFilter = namedParticipants.length === 1 ? namedParticipants[0]!.key : 'all'; + const defaultFilter = namedParticipants.length === 1 ? namedParticipants[0].key : 'all'; return { participants: orderedParticipants, diff --git a/src/preload/index.ts b/src/preload/index.ts index 255b6bbc..cd0dfb78 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -124,17 +124,17 @@ import { TEAM_GET_DATA, TEAM_GET_DELETED_TASKS, TEAM_GET_LOGS_FOR_TASK, - TEAM_GET_TASK_ACTIVITY, - TEAM_GET_TASK_LOG_STREAM, - TEAM_GET_TASK_EXACT_LOG_DETAIL, - TEAM_GET_TASK_EXACT_LOG_SUMMARIES, TEAM_GET_MEMBER_LOGS, TEAM_GET_MEMBER_STATS, TEAM_GET_MESSAGES_PAGE, TEAM_GET_PROJECT_BRANCH, TEAM_GET_SAVED_REQUEST, + TEAM_GET_TASK_ACTIVITY, TEAM_GET_TASK_ATTACHMENT, TEAM_GET_TASK_CHANGE_PRESENCE, + TEAM_GET_TASK_EXACT_LOG_DETAIL, + TEAM_GET_TASK_EXACT_LOG_SUMMARIES, + TEAM_GET_TASK_LOG_STREAM, TEAM_KILL_PROCESS, TEAM_LAUNCH, TEAM_LEAD_ACTIVITY, @@ -233,9 +233,9 @@ import type { ApplyReviewResult, AttachmentFileData, BoardTaskActivityEntry, - BoardTaskLogStreamResponse, BoardTaskExactLogDetailResult, BoardTaskExactLogSummariesResponse, + BoardTaskLogStreamResponse, ChangeStats, ClaudeRootFolderSelection, ClaudeRootInfo, diff --git a/src/renderer/api/httpClient.ts b/src/renderer/api/httpClient.ts index 26ea9ed4..43d4b243 100644 --- a/src/renderer/api/httpClient.ts +++ b/src/renderer/api/httpClient.ts @@ -9,9 +9,9 @@ import type { AppConfig, AttachmentFileData, - BoardTaskLogStreamResponse, BoardTaskExactLogDetailResult, BoardTaskExactLogSummariesResponse, + BoardTaskLogStreamResponse, ClaudeMdFileInfo, ClaudeRootFolderSelection, ClaudeRootInfo, diff --git a/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx b/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx index 03ec75d4..62f80d62 100644 --- a/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx +++ b/src/renderer/components/runtime/ProviderRuntimeSettingsDialog.tsx @@ -1,7 +1,7 @@ import { useEffect, useMemo, useState } from 'react'; -import { Button } from '@renderer/components/ui/button'; import { ProviderBrandLogo } from '@renderer/components/common/ProviderBrandLogo'; +import { Button } from '@renderer/components/ui/button'; import { Dialog, DialogContent, @@ -1059,7 +1059,7 @@ export const ProviderRuntimeSettingsDialog = ({ ) : null} - {showApiKeySection ? ( + {showApiKeySection && apiKeyConfig ? (
diff --git a/src/renderer/components/team/activity/ActiveTasksBlock.tsx b/src/renderer/components/team/activity/ActiveTasksBlock.tsx index a90f12ca..8aba0be4 100644 --- a/src/renderer/components/team/activity/ActiveTasksBlock.tsx +++ b/src/renderer/components/team/activity/ActiveTasksBlock.tsx @@ -1,4 +1,4 @@ -import { useState, type ReactNode } from 'react'; +import { type ReactNode, useState } from 'react'; import { CARD_BG, CARD_BORDER_STYLE, CARD_ICON_MUTED } from '@renderer/constants/cssVariables'; import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; diff --git a/src/renderer/components/team/dialogs/CreateTeamDialog.tsx b/src/renderer/components/team/dialogs/CreateTeamDialog.tsx index b83ab498..d91680ee 100644 --- a/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +++ b/src/renderer/components/team/dialogs/CreateTeamDialog.tsx @@ -41,8 +41,8 @@ import { normalizeCreateLaunchProviderForUi, } from '@renderer/utils/geminiUiFreeze'; import { normalizePath } from '@renderer/utils/pathNormalize'; -import { getTeamProviderLabel as getCatalogTeamProviderLabel } from '@renderer/utils/teamModelCatalog'; import { normalizeTeamModelForUi } from '@renderer/utils/teamModelAvailability'; +import { getTeamProviderLabel as getCatalogTeamProviderLabel } from '@renderer/utils/teamModelCatalog'; import { isTeamProviderId, normalizeOptionalTeamProviderId } from '@shared/utils/teamProvider'; import { AlertTriangle, CheckCircle2, Info, Loader2, X } from 'lucide-react'; diff --git a/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx b/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx index 5a81a1a9..dd0075b5 100644 --- a/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +++ b/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx @@ -43,8 +43,8 @@ import { } from '@renderer/utils/geminiUiFreeze'; import { normalizePath } from '@renderer/utils/pathNormalize'; import { nameColorSet } from '@renderer/utils/projectColor'; -import { getTeamProviderLabel as getCatalogTeamProviderLabel } from '@renderer/utils/teamModelCatalog'; import { normalizeTeamModelForUi } from '@renderer/utils/teamModelAvailability'; +import { getTeamProviderLabel as getCatalogTeamProviderLabel } from '@renderer/utils/teamModelCatalog'; import { isTeamProviderId, normalizeOptionalTeamProviderId } from '@shared/utils/teamProvider'; import { AlertTriangle, diff --git a/src/renderer/components/team/kanban/KanbanBoard.tsx b/src/renderer/components/team/kanban/KanbanBoard.tsx index 54d86a85..62d5759e 100644 --- a/src/renderer/components/team/kanban/KanbanBoard.tsx +++ b/src/renderer/components/team/kanban/KanbanBoard.tsx @@ -159,7 +159,7 @@ function estimateGridSkeletonCardHeight( if ((task.blockedBy?.length ?? 0) > 0) height += 18; if ((task.blocks?.length ?? 0) > 0) height += 18; - const effectiveReviewer = (kanbanState.tasks[task.id]?.reviewer ?? task.reviewer ?? '').trim(); + const effectiveReviewer = (kanbanState.tasks[task.id]?.reviewer ?? '').trim(); if (columnId === 'review' && !hasReviewers && effectiveReviewer.length === 0) { height += 14; } diff --git a/src/renderer/components/team/kanban/KanbanGridLayout.tsx b/src/renderer/components/team/kanban/KanbanGridLayout.tsx index cb4da436..6b5f868e 100644 --- a/src/renderer/components/team/kanban/KanbanGridLayout.tsx +++ b/src/renderer/components/team/kanban/KanbanGridLayout.tsx @@ -39,10 +39,10 @@ export interface KanbanGridColumn { bodyBg?: string; content: React.ReactNode; showAddButton?: boolean; - skeletonCards?: Array<{ + skeletonCards?: { key: string; height: number; - }>; + }[]; } interface KanbanGridLayoutProps { diff --git a/src/renderer/components/team/messages/MessagesPanel.tsx b/src/renderer/components/team/messages/MessagesPanel.tsx index f43d316d..5638726c 100644 --- a/src/renderer/components/team/messages/MessagesPanel.tsx +++ b/src/renderer/components/team/messages/MessagesPanel.tsx @@ -298,7 +298,7 @@ export const MessagesPanel = memo(function MessagesPanel({ if (position !== 'bottom-sheet' || typeof ResizeObserver === 'undefined') return; const mountPointElement = mountPoint instanceof HTMLElement ? mountPoint : null; - const observedEntries: Array<[Element | null, (height: number) => void]> = [ + const observedEntries: [Element | null, (height: number) => void][] = [ [bottomSheetStickyTopRef.current, setBottomSheetStickyTopHeight], [mountPointElement, setBottomSheetMountHeight], ]; @@ -1096,7 +1096,7 @@ export const MessagesPanel = memo(function MessagesPanel({ {searchAndFilterControls}
)} -
+
void; } -export function ExactTaskLogCard({ +export const ExactTaskLogCard = ({ summary, expanded, detailState, onToggle, -}: ExactTaskLogCardProps): React.JSX.Element { +}: ExactTaskLogCardProps): React.JSX.Element => { const loadStateText = describeDetailState(detailState); return ( @@ -129,4 +129,4 @@ export function ExactTaskLogCard({ ) : null}
); -} +}; diff --git a/src/renderer/components/team/taskLogs/ExactTaskLogsSection.tsx b/src/renderer/components/team/taskLogs/ExactTaskLogsSection.tsx index 9d324047..732b2cb3 100644 --- a/src/renderer/components/team/taskLogs/ExactTaskLogsSection.tsx +++ b/src/renderer/components/team/taskLogs/ExactTaskLogsSection.tsx @@ -13,10 +13,10 @@ interface ExactTaskLogsSectionProps { taskId: string; } -export function ExactTaskLogsSection({ +export const ExactTaskLogsSection = ({ teamName, taskId, -}: ExactTaskLogsSectionProps): React.JSX.Element { +}: ExactTaskLogsSectionProps): React.JSX.Element => { const [summaries, setSummaries] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -259,4 +259,4 @@ export function ExactTaskLogsSection({ )}
); -} +}; diff --git a/src/renderer/components/team/taskLogs/ExecutionSessionsSection.tsx b/src/renderer/components/team/taskLogs/ExecutionSessionsSection.tsx index 283a2f2e..8249c8c5 100644 --- a/src/renderer/components/team/taskLogs/ExecutionSessionsSection.tsx +++ b/src/renderer/components/team/taskLogs/ExecutionSessionsSection.tsx @@ -1,18 +1,18 @@ -import type { ComponentProps } from 'react'; - import { MemberLogsTab } from '@renderer/components/team/members/MemberLogsTab'; import { Loader2 } from 'lucide-react'; +import type { ComponentProps } from 'react'; + interface ExecutionSessionsSectionProps extends ComponentProps { isRefreshing?: boolean; isPreviewOnline?: boolean; } -export function ExecutionSessionsSection({ +export const ExecutionSessionsSection = ({ isRefreshing = false, isPreviewOnline = false, ...props -}: ExecutionSessionsSectionProps): React.JSX.Element { +}: ExecutionSessionsSectionProps): React.JSX.Element => { return (
@@ -45,4 +45,4 @@ export function ExecutionSessionsSection({
); -} +}; diff --git a/src/renderer/components/team/taskLogs/TaskActivitySection.tsx b/src/renderer/components/team/taskLogs/TaskActivitySection.tsx index 1e24f039..8fc1d316 100644 --- a/src/renderer/components/team/taskLogs/TaskActivitySection.tsx +++ b/src/renderer/components/team/taskLogs/TaskActivitySection.tsx @@ -1,10 +1,11 @@ -import { api } from '@renderer/api'; -import { AlertCircle, Loader2 } from 'lucide-react'; import { useEffect, useMemo, useState } from 'react'; + +import { api } from '@renderer/api'; import { describeBoardTaskActivityLabel, formatBoardTaskActivityTaskLabel, } from '@shared/utils/boardTaskActivityLabels'; +import { AlertCircle, Loader2 } from 'lucide-react'; import type { BoardTaskActivityEntry, BoardTaskActivityTaskRef } from '@shared/types'; @@ -84,7 +85,7 @@ function actorLabel(entry: BoardTaskActivityEntry): string { return 'unknown actor'; } -function Row({ entry }: { entry: BoardTaskActivityEntry }): React.JSX.Element { +const Row = ({ entry }: { entry: BoardTaskActivityEntry }): React.JSX.Element => { const context = describeContext(entry); const tone = entry.task.resolution === 'resolved' @@ -110,12 +111,12 @@ function Row({ entry }: { entry: BoardTaskActivityEntry }): React.JSX.Element {
); -} +}; -export function TaskActivitySection({ +export const TaskActivitySection = ({ teamName, taskId, -}: TaskActivitySectionProps): React.JSX.Element { +}: TaskActivitySectionProps): React.JSX.Element => { const [entries, setEntries] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -208,4 +209,4 @@ export function TaskActivitySection({ {content} ); -} +}; diff --git a/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx b/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx index 4afa2cd5..b1908430 100644 --- a/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx +++ b/src/renderer/components/team/taskLogs/TaskLogStreamSection.tsx @@ -54,7 +54,7 @@ function normalizeResponse(response: BoardTaskLogStreamResponse): BoardTaskLogSt }; } -function SegmentMarker({ segment }: { segment: BoardTaskLogSegment }): React.JSX.Element { +const SegmentMarker = ({ segment }: { segment: BoardTaskLogSegment }): React.JSX.Element => { return (
@@ -66,27 +66,27 @@ function SegmentMarker({ segment }: { segment: BoardTaskLogSegment }): React.JSX
); -} +}; -function SegmentBlock({ +const SegmentBlock = ({ segment, showHeader, }: { segment: BoardTaskLogSegment; showHeader: boolean; -}): React.JSX.Element { +}): React.JSX.Element => { return (
{showHeader ? : null}
); -} +}; -export function TaskLogStreamSection({ +export const TaskLogStreamSection = ({ teamName, taskId, -}: TaskLogStreamSectionProps): React.JSX.Element { +}: TaskLogStreamSectionProps): React.JSX.Element => { const [stream, setStream] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -219,4 +219,4 @@ export function TaskLogStreamSection({ )} ); -} +}; diff --git a/src/renderer/components/team/taskLogs/TaskLogsPanel.tsx b/src/renderer/components/team/taskLogs/TaskLogsPanel.tsx index 913e5537..7dbafe15 100644 --- a/src/renderer/components/team/taskLogs/TaskLogsPanel.tsx +++ b/src/renderer/components/team/taskLogs/TaskLogsPanel.tsx @@ -1,7 +1,7 @@ import { ExecutionSessionsSection } from './ExecutionSessionsSection'; +import { isBoardTaskActivityUiEnabled, isBoardTaskExactLogsUiEnabled } from './featureGates'; import { TaskActivitySection } from './TaskActivitySection'; import { TaskLogStreamSection } from './TaskLogStreamSection'; -import { isBoardTaskActivityUiEnabled, isBoardTaskExactLogsUiEnabled } from './featureGates'; import type { TeamTaskWithKanban } from '@shared/types'; @@ -17,7 +17,7 @@ interface TaskLogsPanelProps { onPreviewOnlineChange?: (isOnline: boolean) => void; } -export function TaskLogsPanel({ +export const TaskLogsPanel = ({ teamName, task, taskSince, @@ -27,7 +27,7 @@ export function TaskLogsPanel({ showSubagentPreview = false, showLeadPreview = false, onPreviewOnlineChange, -}: TaskLogsPanelProps): React.JSX.Element { +}: TaskLogsPanelProps): React.JSX.Element => { return (
{isBoardTaskActivityUiEnabled() ? ( @@ -52,4 +52,4 @@ export function TaskLogsPanel({ />
); -} +}; diff --git a/src/renderer/components/team/useTeamProvisioningPresentation.ts b/src/renderer/components/team/useTeamProvisioningPresentation.ts index f7b3570b..3eac3f72 100644 --- a/src/renderer/components/team/useTeamProvisioningPresentation.ts +++ b/src/renderer/components/team/useTeamProvisioningPresentation.ts @@ -2,8 +2,8 @@ import { useMemo } from 'react'; import { useStore } from '@renderer/store'; import { - selectTeamDataForName, getCurrentProvisioningProgressForTeam, + selectTeamDataForName, } from '@renderer/store/slices/teamSlice'; import { buildTeamProvisioningPresentation } from '@renderer/utils/teamProvisioningPresentation'; import { useShallow } from 'zustand/react/shallow'; diff --git a/src/renderer/components/ui/MentionableTextarea.tsx b/src/renderer/components/ui/MentionableTextarea.tsx index 41861772..d548ae4d 100644 --- a/src/renderer/components/ui/MentionableTextarea.tsx +++ b/src/renderer/components/ui/MentionableTextarea.tsx @@ -1134,7 +1134,7 @@ export const MentionableTextarea = React.forwardRef 0 && surfaceShellMetrics.height > 0 ? (
-
{title}
+
+
{title}
{tasks.map((task) => (
); -} +}; diff --git a/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx b/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx index 746d8565..029b1834 100644 --- a/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx +++ b/src/renderer/features/agent-graph/ui/GraphNodePopover.tsx @@ -17,6 +17,7 @@ import { ExternalLink, Loader2, MessageSquare, Plus, User } from 'lucide-react'; import { useShallow } from 'zustand/react/shallow'; import { isTaskInReviewCycle, resolveTaskReviewer } from '../utils/taskGraphSemantics'; + import { GraphTaskCard } from './GraphTaskCard'; import type { GraphNode } from '@claude-teams/agent-graph'; @@ -225,7 +226,7 @@ const OverflowPopoverContent = ({
); -} +}; diff --git a/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx b/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx index 31ca16e12..72ab6652 100644 --- a/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx +++ b/src/renderer/features/agent-graph/ui/TeamGraphOverlay.tsx @@ -10,8 +10,8 @@ import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHo import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter'; -import { GraphBlockingEdgePopover } from './GraphBlockingEdgePopover'; import { GraphActivityHud } from './GraphActivityHud'; +import { GraphBlockingEdgePopover } from './GraphBlockingEdgePopover'; import { GraphNodePopover } from './GraphNodePopover'; import { GraphProvisioningHud } from './GraphProvisioningHud'; diff --git a/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx b/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx index 4a96cebd..06e6ff04 100644 --- a/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx +++ b/src/renderer/features/agent-graph/ui/TeamGraphTab.tsx @@ -10,8 +10,8 @@ import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHo import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter'; -import { GraphBlockingEdgePopover } from './GraphBlockingEdgePopover'; import { GraphActivityHud } from './GraphActivityHud'; +import { GraphBlockingEdgePopover } from './GraphBlockingEdgePopover'; import { GraphNodePopover } from './GraphNodePopover'; import { GraphProvisioningHud } from './GraphProvisioningHud'; diff --git a/src/renderer/features/agent-graph/utils/buildInlineActivityEntries.ts b/src/renderer/features/agent-graph/utils/buildInlineActivityEntries.ts index 24dde1b3..575a883c 100644 --- a/src/renderer/features/agent-graph/utils/buildInlineActivityEntries.ts +++ b/src/renderer/features/agent-graph/utils/buildInlineActivityEntries.ts @@ -160,8 +160,8 @@ export function buildInlineActivityEntries({ function collectTaskComments( tasks: readonly TeamTaskWithKanban[] -): Array<{ task: TeamTaskWithKanban; comment: TaskComment }> { - const items: Array<{ task: TeamTaskWithKanban; comment: TaskComment }> = []; +): { task: TeamTaskWithKanban; comment: TaskComment }[] { + const items: { task: TeamTaskWithKanban; comment: TaskComment }[] = []; for (const task of tasks) { for (const comment of task.comments ?? []) { items.push({ task, comment }); diff --git a/src/renderer/features/agent-graph/utils/taskGraphSemantics.ts b/src/renderer/features/agent-graph/utils/taskGraphSemantics.ts index 38da36d1..b629857e 100644 --- a/src/renderer/features/agent-graph/utils/taskGraphSemantics.ts +++ b/src/renderer/features/agent-graph/utils/taskGraphSemantics.ts @@ -1,4 +1,4 @@ -import type { KanbanTaskState, KanbanColumnId, TeamTask, TeamTaskWithKanban } from '@shared/types'; +import type { KanbanColumnId, KanbanTaskState, TeamTask, TeamTaskWithKanban } from '@shared/types'; type TaskColumnInput = Pick; type TaskReviewerInput = Pick; diff --git a/src/renderer/store/index.ts b/src/renderer/store/index.ts index 0c41978d..82c5d7e6 100644 --- a/src/renderer/store/index.ts +++ b/src/renderer/store/index.ts @@ -195,7 +195,7 @@ export function initializeNotificationListeners(): () => void { const nav: NavigatorWithUserAgentData | null = typeof navigator !== 'undefined' ? (navigator as NavigatorWithUserAgentData) : null; // Prefer UA-CH when available; fall back to deprecated-but-still-supported navigator.platform. - // eslint-disable-next-line sonarjs/deprecation -- navigator.platform is deprecated but needed as fallback + const platform: string = nav?.userAgentData?.platform ?? nav?.platform ?? nav?.userAgent ?? ''; const isWindows = platform.toLowerCase().includes('win'); diff --git a/src/renderer/utils/memberHelpers.ts b/src/renderer/utils/memberHelpers.ts index 9066c898..da447536 100644 --- a/src/renderer/utils/memberHelpers.ts +++ b/src/renderer/utils/memberHelpers.ts @@ -484,31 +484,31 @@ export function buildMemberLaunchPresentation({ const keepLaunchSettlingVisuals = isTeamProvisioning === true || isLaunchSettling; let launchVisualState: MemberLaunchVisualState = null; - if (isTeamAlive === false && !isTeamProvisioning) { - launchVisualState = null; - } else if (spawnLaunchState === 'failed_to_start' || spawnStatus === 'error') { - launchVisualState = 'error'; - } else if ( - spawnLaunchState === 'runtime_pending_bootstrap' && - spawnStatus === 'online' && - spawnRuntimeAlive === true - ) { - launchVisualState = 'runtime_pending'; - } else if ( - isLaunchStillStarting( - spawnStatus, - spawnLaunchState, - spawnRuntimeAlive, - keepLaunchSettlingVisuals - ) - ) { - launchVisualState = spawnStatus === 'spawning' ? 'spawning' : 'waiting'; - } else if ( - isLaunchSettling && - spawnStatus === 'online' && - spawnLaunchState === 'confirmed_alive' - ) { - launchVisualState = 'settling'; + if (isTeamAlive !== false || isTeamProvisioning) { + if (spawnLaunchState === 'failed_to_start' || spawnStatus === 'error') { + launchVisualState = 'error'; + } else if ( + spawnLaunchState === 'runtime_pending_bootstrap' && + spawnStatus === 'online' && + spawnRuntimeAlive === true + ) { + launchVisualState = 'runtime_pending'; + } else if ( + isLaunchStillStarting( + spawnStatus, + spawnLaunchState, + spawnRuntimeAlive, + keepLaunchSettlingVisuals + ) + ) { + launchVisualState = spawnStatus === 'spawning' ? 'spawning' : 'waiting'; + } else if ( + isLaunchSettling && + spawnStatus === 'online' && + spawnLaunchState === 'confirmed_alive' + ) { + launchVisualState = 'settling'; + } } const spawnBadgeLabel = diff --git a/src/shared/types/api.ts b/src/shared/types/api.ts index 8eb817cf..0510a7b6 100644 --- a/src/shared/types/api.ts +++ b/src/shared/types/api.ts @@ -38,12 +38,12 @@ import type { } from './schedule'; import type { AddMemberRequest, - BoardTaskActivityEntry, - BoardTaskLogStreamResponse, - BoardTaskExactLogDetailResult, - BoardTaskExactLogSummariesResponse, AddTaskCommentRequest, AttachmentFileData, + BoardTaskActivityEntry, + BoardTaskExactLogDetailResult, + BoardTaskExactLogSummariesResponse, + BoardTaskLogStreamResponse, CreateTaskRequest, CrossTeamMessage, CrossTeamSendRequest, diff --git a/test/renderer/components/runtime/ProviderRuntimeSettingsDialog.test.ts b/test/renderer/components/runtime/ProviderRuntimeSettingsDialog.test.ts index 7c68f7d0..a8ceb766 100644 --- a/test/renderer/components/runtime/ProviderRuntimeSettingsDialog.test.ts +++ b/test/renderer/components/runtime/ProviderRuntimeSettingsDialog.test.ts @@ -556,8 +556,8 @@ describe('ProviderRuntimeSettingsDialog Codex connection flows', () => { const icon = host.querySelector('[data-testid="provider-api-key-icon"]'); expect(icon).not.toBeNull(); - expect(icon?.className).toContain('h-8'); - expect(icon?.className).toContain('w-8'); + expect(icon?.className).toContain('size-8'); + expect(icon?.className).not.toContain('w-8'); expect(icon?.className).toContain('shrink-0'); });