Merge branch 'dev' of https://github.com/777genius/claude_agent_teams_ui into dev
This commit is contained in:
commit
53dd857e0f
20 changed files with 53 additions and 41 deletions
|
|
@ -95,11 +95,11 @@ import {
|
||||||
} from './utils/safeWebContentsSend';
|
} from './utils/safeWebContentsSend';
|
||||||
import { syncTelemetryFlag } from './sentry';
|
import { syncTelemetryFlag } from './sentry';
|
||||||
import {
|
import {
|
||||||
|
BranchStatusService,
|
||||||
CliInstallerService,
|
CliInstallerService,
|
||||||
configManager,
|
configManager,
|
||||||
LocalFileSystemProvider,
|
LocalFileSystemProvider,
|
||||||
MemberStatsComputer,
|
MemberStatsComputer,
|
||||||
BranchStatusService,
|
|
||||||
NotificationManager,
|
NotificationManager,
|
||||||
PtyTerminalService,
|
PtyTerminalService,
|
||||||
ServiceContext,
|
ServiceContext,
|
||||||
|
|
@ -108,8 +108,8 @@ import {
|
||||||
TaskBoundaryParser,
|
TaskBoundaryParser,
|
||||||
TeamDataService,
|
TeamDataService,
|
||||||
TeamLogSourceTracker,
|
TeamLogSourceTracker,
|
||||||
TeamMemberLogsFinder,
|
|
||||||
TeammateToolTracker,
|
TeammateToolTracker,
|
||||||
|
TeamMemberLogsFinder,
|
||||||
TeamProvisioningService,
|
TeamProvisioningService,
|
||||||
UpdaterService,
|
UpdaterService,
|
||||||
} from './services';
|
} from './services';
|
||||||
|
|
|
||||||
|
|
@ -88,8 +88,8 @@ import { registerValidationHandlers, removeValidationHandlers } from './validati
|
||||||
import { registerWindowHandlers, removeWindowHandlers } from './window';
|
import { registerWindowHandlers, removeWindowHandlers } from './window';
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
ChangeExtractorService,
|
|
||||||
BranchStatusService,
|
BranchStatusService,
|
||||||
|
ChangeExtractorService,
|
||||||
CliInstallerService,
|
CliInstallerService,
|
||||||
FileContentResolver,
|
FileContentResolver,
|
||||||
GitDiffFallback,
|
GitDiffFallback,
|
||||||
|
|
@ -100,8 +100,8 @@ import type {
|
||||||
ServiceContextRegistry,
|
ServiceContextRegistry,
|
||||||
SshConnectionManager,
|
SshConnectionManager,
|
||||||
TeamDataService,
|
TeamDataService,
|
||||||
TeamMemberLogsFinder,
|
|
||||||
TeammateToolTracker,
|
TeammateToolTracker,
|
||||||
|
TeamMemberLogsFinder,
|
||||||
TeamProvisioningService,
|
TeamProvisioningService,
|
||||||
UpdaterService,
|
UpdaterService,
|
||||||
} from '../services';
|
} from '../services';
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,8 @@ import {
|
||||||
TEAM_SEND_MESSAGE,
|
TEAM_SEND_MESSAGE,
|
||||||
TEAM_SET_CHANGE_PRESENCE_TRACKING,
|
TEAM_SET_CHANGE_PRESENCE_TRACKING,
|
||||||
TEAM_SET_PROJECT_BRANCH_TRACKING,
|
TEAM_SET_PROJECT_BRANCH_TRACKING,
|
||||||
TEAM_SET_TOOL_ACTIVITY_TRACKING,
|
|
||||||
TEAM_SET_TASK_CLARIFICATION,
|
TEAM_SET_TASK_CLARIFICATION,
|
||||||
|
TEAM_SET_TOOL_ACTIVITY_TRACKING,
|
||||||
TEAM_SHOW_MESSAGE_NOTIFICATION,
|
TEAM_SHOW_MESSAGE_NOTIFICATION,
|
||||||
TEAM_SOFT_DELETE_TASK,
|
TEAM_SOFT_DELETE_TASK,
|
||||||
TEAM_START_TASK,
|
TEAM_START_TASK,
|
||||||
|
|
@ -113,8 +113,8 @@ import {
|
||||||
import type {
|
import type {
|
||||||
BranchStatusService,
|
BranchStatusService,
|
||||||
MemberStatsComputer,
|
MemberStatsComputer,
|
||||||
TeammateToolTracker,
|
|
||||||
TeamDataService,
|
TeamDataService,
|
||||||
|
TeammateToolTracker,
|
||||||
TeamMemberLogsFinder,
|
TeamMemberLogsFinder,
|
||||||
TeamProvisioningService,
|
TeamProvisioningService,
|
||||||
} from '../services';
|
} from '../services';
|
||||||
|
|
@ -2978,7 +2978,7 @@ async function handleToolApprovalSettings(
|
||||||
|
|
||||||
try {
|
try {
|
||||||
getTeamProvisioningService().updateToolApprovalSettings(
|
getTeamProvisioningService().updateToolApprovalSettings(
|
||||||
teamName as string,
|
teamName,
|
||||||
s as unknown as ToolApprovalSettings
|
s as unknown as ToolApprovalSettings
|
||||||
);
|
);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import * as path from 'path';
|
|
||||||
|
|
||||||
import { createLogger } from '@shared/utils/logger';
|
import { createLogger } from '@shared/utils/logger';
|
||||||
|
import * as path from 'path';
|
||||||
|
|
||||||
import { gitIdentityResolver } from '../parsing/GitIdentityResolver';
|
import { gitIdentityResolver } from '../parsing/GitIdentityResolver';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -337,7 +337,7 @@ export class TeammateToolTracker {
|
||||||
|
|
||||||
for (const block of content) {
|
for (const block of content) {
|
||||||
if (!block || typeof block !== 'object') continue;
|
if (!block || typeof block !== 'object') continue;
|
||||||
const typedBlock = block as Record<string, unknown>;
|
const typedBlock = block;
|
||||||
if (typedBlock.type === 'tool_use') {
|
if (typedBlock.type === 'tool_use') {
|
||||||
const rawId = typeof typedBlock.id === 'string' ? typedBlock.id.trim() : '';
|
const rawId = typeof typedBlock.id === 'string' ? typedBlock.id.trim() : '';
|
||||||
if (!rawId) continue;
|
if (!rawId) continue;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
export { CascadeGuard } from './CascadeGuard';
|
|
||||||
export { BranchStatusService } from './BranchStatusService';
|
export { BranchStatusService } from './BranchStatusService';
|
||||||
|
export { CascadeGuard } from './CascadeGuard';
|
||||||
export { ChangeExtractorService } from './ChangeExtractorService';
|
export { ChangeExtractorService } from './ChangeExtractorService';
|
||||||
export { ClaudeBinaryResolver } from './ClaudeBinaryResolver';
|
export { ClaudeBinaryResolver } from './ClaudeBinaryResolver';
|
||||||
export { CrossTeamOutbox } from './CrossTeamOutbox';
|
export { CrossTeamOutbox } from './CrossTeamOutbox';
|
||||||
|
|
@ -18,10 +18,10 @@ export { TeamInboxReader } from './TeamInboxReader';
|
||||||
export { TeamInboxWriter } from './TeamInboxWriter';
|
export { TeamInboxWriter } from './TeamInboxWriter';
|
||||||
export { TeamKanbanManager } from './TeamKanbanManager';
|
export { TeamKanbanManager } from './TeamKanbanManager';
|
||||||
export { TeamLogSourceTracker } from './TeamLogSourceTracker';
|
export { TeamLogSourceTracker } from './TeamLogSourceTracker';
|
||||||
|
export { TeammateToolTracker } from './TeammateToolTracker';
|
||||||
export { TeamMemberLogsFinder } from './TeamMemberLogsFinder';
|
export { TeamMemberLogsFinder } from './TeamMemberLogsFinder';
|
||||||
export { TeamMemberResolver } from './TeamMemberResolver';
|
export { TeamMemberResolver } from './TeamMemberResolver';
|
||||||
export { TeamMembersMetaStore } from './TeamMembersMetaStore';
|
export { TeamMembersMetaStore } from './TeamMembersMetaStore';
|
||||||
export { TeammateToolTracker } from './TeammateToolTracker';
|
|
||||||
export { TeamProvisioningService } from './TeamProvisioningService';
|
export { TeamProvisioningService } from './TeamProvisioningService';
|
||||||
export { TeamSentMessagesStore } from './TeamSentMessagesStore';
|
export { TeamSentMessagesStore } from './TeamSentMessagesStore';
|
||||||
export { TeamTaskReader } from './TeamTaskReader';
|
export { TeamTaskReader } from './TeamTaskReader';
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
import { isParsedSystemChunkMessage, isParsedUserChunkMessage, isTextContent } from '@main/types';
|
import { isParsedSystemChunkMessage, isParsedUserChunkMessage, isTextContent } from '@main/types';
|
||||||
import { parseJsonlLine } from '@main/utils/jsonl';
|
import { parseJsonlLine } from '@main/utils/jsonl';
|
||||||
import { createHash } from 'crypto';
|
|
||||||
import * as fs from 'fs';
|
|
||||||
|
|
||||||
import { extractCommandOutputInfo, extractSlashInfo } from '@shared/utils/contentSanitizer';
|
import { extractCommandOutputInfo, extractSlashInfo } from '@shared/utils/contentSanitizer';
|
||||||
import { buildSlashCommandMeta } from '@shared/utils/slashCommands';
|
import { buildSlashCommandMeta } from '@shared/utils/slashCommands';
|
||||||
|
import { createHash } from 'crypto';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
import type { ParsedMessage } from '@main/types';
|
import type { ParsedMessage } from '@main/types';
|
||||||
import type { CommandOutputMeta, InboxMessage, SlashCommandMeta } from '@shared/types';
|
import type { CommandOutputMeta, InboxMessage, SlashCommandMeta } from '@shared/types';
|
||||||
|
|
|
||||||
|
|
@ -126,7 +126,6 @@ import {
|
||||||
TEAM_GET_MEMBER_LOGS,
|
TEAM_GET_MEMBER_LOGS,
|
||||||
TEAM_GET_MEMBER_STATS,
|
TEAM_GET_MEMBER_STATS,
|
||||||
TEAM_GET_PROJECT_BRANCH,
|
TEAM_GET_PROJECT_BRANCH,
|
||||||
TEAM_PROJECT_BRANCH_CHANGE,
|
|
||||||
TEAM_GET_SAVED_REQUEST,
|
TEAM_GET_SAVED_REQUEST,
|
||||||
TEAM_GET_TASK_ATTACHMENT,
|
TEAM_GET_TASK_ATTACHMENT,
|
||||||
TEAM_GET_TASK_CHANGE_PRESENCE,
|
TEAM_GET_TASK_CHANGE_PRESENCE,
|
||||||
|
|
@ -140,6 +139,7 @@ import {
|
||||||
TEAM_PREPARE_PROVISIONING,
|
TEAM_PREPARE_PROVISIONING,
|
||||||
TEAM_PROCESS_ALIVE,
|
TEAM_PROCESS_ALIVE,
|
||||||
TEAM_PROCESS_SEND,
|
TEAM_PROCESS_SEND,
|
||||||
|
TEAM_PROJECT_BRANCH_CHANGE,
|
||||||
TEAM_PROVISIONING_PROGRESS,
|
TEAM_PROVISIONING_PROGRESS,
|
||||||
TEAM_PROVISIONING_STATUS,
|
TEAM_PROVISIONING_STATUS,
|
||||||
TEAM_REMOVE_MEMBER,
|
TEAM_REMOVE_MEMBER,
|
||||||
|
|
@ -152,8 +152,8 @@ import {
|
||||||
TEAM_SEND_MESSAGE,
|
TEAM_SEND_MESSAGE,
|
||||||
TEAM_SET_CHANGE_PRESENCE_TRACKING,
|
TEAM_SET_CHANGE_PRESENCE_TRACKING,
|
||||||
TEAM_SET_PROJECT_BRANCH_TRACKING,
|
TEAM_SET_PROJECT_BRANCH_TRACKING,
|
||||||
TEAM_SET_TOOL_ACTIVITY_TRACKING,
|
|
||||||
TEAM_SET_TASK_CLARIFICATION,
|
TEAM_SET_TASK_CLARIFICATION,
|
||||||
|
TEAM_SET_TOOL_ACTIVITY_TRACKING,
|
||||||
TEAM_SHOW_MESSAGE_NOTIFICATION,
|
TEAM_SHOW_MESSAGE_NOTIFICATION,
|
||||||
TEAM_SOFT_DELETE_TASK,
|
TEAM_SOFT_DELETE_TASK,
|
||||||
TEAM_START_TASK,
|
TEAM_START_TASK,
|
||||||
|
|
@ -250,6 +250,7 @@ import type {
|
||||||
MemberLogSummary,
|
MemberLogSummary,
|
||||||
MemberSpawnStatusesSnapshot,
|
MemberSpawnStatusesSnapshot,
|
||||||
NotificationTrigger,
|
NotificationTrigger,
|
||||||
|
ProjectBranchChangeEvent,
|
||||||
RejectResult,
|
RejectResult,
|
||||||
ReplaceMembersRequest,
|
ReplaceMembersRequest,
|
||||||
Schedule,
|
Schedule,
|
||||||
|
|
@ -268,7 +269,6 @@ import type {
|
||||||
TaskChangePresenceState,
|
TaskChangePresenceState,
|
||||||
TaskChangeSetV2,
|
TaskChangeSetV2,
|
||||||
TaskComment,
|
TaskComment,
|
||||||
ProjectBranchChangeEvent,
|
|
||||||
TeamChangeEvent,
|
TeamChangeEvent,
|
||||||
TeamClaudeLogsQuery,
|
TeamClaudeLogsQuery,
|
||||||
TeamClaudeLogsResponse,
|
TeamClaudeLogsResponse,
|
||||||
|
|
|
||||||
|
|
@ -81,12 +81,12 @@ import { MemberList } from './members/MemberList';
|
||||||
import { MessagesPanel } from './messages/MessagesPanel';
|
import { MessagesPanel } from './messages/MessagesPanel';
|
||||||
import { ChangeReviewDialog } from './review/ChangeReviewDialog';
|
import { ChangeReviewDialog } from './review/ChangeReviewDialog';
|
||||||
import { ScheduleSection } from './schedule/ScheduleSection';
|
import { ScheduleSection } from './schedule/ScheduleSection';
|
||||||
import { ClaudeLogsSection } from './ClaudeLogsSection';
|
|
||||||
import { CollapsibleTeamSection } from './CollapsibleTeamSection';
|
|
||||||
import { ProcessesSection } from './ProcessesSection';
|
|
||||||
import { TeamSidebarHost } from './sidebar/TeamSidebarHost';
|
import { TeamSidebarHost } from './sidebar/TeamSidebarHost';
|
||||||
import { TeamSidebarPortalSource } from './sidebar/TeamSidebarPortalSource';
|
import { TeamSidebarPortalSource } from './sidebar/TeamSidebarPortalSource';
|
||||||
import { TeamSidebarRail } from './sidebar/TeamSidebarRail';
|
import { TeamSidebarRail } from './sidebar/TeamSidebarRail';
|
||||||
|
import { ClaudeLogsSection } from './ClaudeLogsSection';
|
||||||
|
import { CollapsibleTeamSection } from './CollapsibleTeamSection';
|
||||||
|
import { ProcessesSection } from './ProcessesSection';
|
||||||
import { TeamProvisioningBanner } from './TeamProvisioningBanner';
|
import { TeamProvisioningBanner } from './TeamProvisioningBanner';
|
||||||
import { TeamSessionsSection } from './TeamSessionsSection';
|
import { TeamSessionsSection } from './TeamSessionsSection';
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,12 @@ import { shortenDisplayPath } from '@renderer/utils/pathDisplay';
|
||||||
import { highlightLines } from '@renderer/utils/syntaxHighlighter';
|
import { highlightLines } from '@renderer/utils/syntaxHighlighter';
|
||||||
import { AlertTriangle, FileText, MessageCircleQuestion, Search, Terminal } from 'lucide-react';
|
import { AlertTriangle, FileText, MessageCircleQuestion, Search, Terminal } from 'lucide-react';
|
||||||
|
|
||||||
import { MemberBadge } from './MemberBadge';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ToolApprovalSettingsContent,
|
ToolApprovalSettingsContent,
|
||||||
ToolApprovalSettingsToggle,
|
ToolApprovalSettingsToggle,
|
||||||
} from './dialogs/ToolApprovalSettingsPanel';
|
} from './dialogs/ToolApprovalSettingsPanel';
|
||||||
import { FileIcon } from './editor/FileIcon';
|
import { FileIcon } from './editor/FileIcon';
|
||||||
|
import { MemberBadge } from './MemberBadge';
|
||||||
import { ToolApprovalDiffPreview } from './ToolApprovalDiffPreview';
|
import { ToolApprovalDiffPreview } from './ToolApprovalDiffPreview';
|
||||||
|
|
||||||
import type { ToolApprovalRequest } from '@shared/types';
|
import type { ToolApprovalRequest } from '@shared/types';
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ import { useMemo } from 'react';
|
||||||
import { Button } from '@renderer/components/ui/button';
|
import { Button } from '@renderer/components/ui/button';
|
||||||
import { Checkbox } from '@renderer/components/ui/checkbox';
|
import { Checkbox } from '@renderer/components/ui/checkbox';
|
||||||
import { Popover, PopoverContent, PopoverTrigger } from '@renderer/components/ui/popover';
|
import { Popover, PopoverContent, PopoverTrigger } from '@renderer/components/ui/popover';
|
||||||
import { formatSessionLabel } from '@renderer/utils/sessionTitleParser';
|
|
||||||
import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip';
|
import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip';
|
||||||
import { displayMemberName } from '@renderer/utils/memberHelpers';
|
import { displayMemberName } from '@renderer/utils/memberHelpers';
|
||||||
|
import { formatSessionLabel } from '@renderer/utils/sessionTitleParser';
|
||||||
import { Crown, Filter } from 'lucide-react';
|
import { Crown, Filter } from 'lucide-react';
|
||||||
|
|
||||||
import type { Session } from '@renderer/types/data';
|
import type { Session } from '@renderer/types/data';
|
||||||
|
|
|
||||||
|
|
@ -191,10 +191,10 @@ export const FileSectionDiff = ({
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
function OversizedDiffNotice({ message }: { message: string }): React.ReactElement {
|
const OversizedDiffNotice = ({ message }: { message: string }): React.ReactElement => {
|
||||||
return (
|
return (
|
||||||
<div className="border-b border-border bg-amber-500/10 px-4 py-3 text-xs text-amber-300">
|
<div className="border-b border-border bg-amber-500/10 px-4 py-3 text-xs text-amber-300">
|
||||||
{message}
|
{message}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
|
||||||
|
|
@ -3,13 +3,13 @@ import { createPortal } from 'react-dom';
|
||||||
|
|
||||||
import { useStore } from '@renderer/store';
|
import { useStore } from '@renderer/store';
|
||||||
|
|
||||||
|
import { useTeamSidebarHostId } from './TeamSidebarHost';
|
||||||
import {
|
import {
|
||||||
getTeamSidebarHostElement,
|
getTeamSidebarHostElement,
|
||||||
removeTeamSidebarSource,
|
removeTeamSidebarSource,
|
||||||
upsertTeamSidebarSource,
|
upsertTeamSidebarSource,
|
||||||
useTeamSidebarPortalSnapshot,
|
useTeamSidebarPortalSnapshot,
|
||||||
} from './TeamSidebarPortalManager';
|
} from './TeamSidebarPortalManager';
|
||||||
import { useTeamSidebarHostId } from './TeamSidebarHost';
|
|
||||||
|
|
||||||
interface TeamSidebarPortalSourceProps {
|
interface TeamSidebarPortalSourceProps {
|
||||||
teamName: string;
|
teamName: string;
|
||||||
|
|
|
||||||
|
|
@ -13,12 +13,12 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||||
import { api } from '@renderer/api';
|
import { api } from '@renderer/api';
|
||||||
import { useStore } from '@renderer/store';
|
import { useStore } from '@renderer/store';
|
||||||
|
|
||||||
import { DEFAULT_CLAUDE_LOGS_FILTER } from './ClaudeLogsFilterPopover';
|
|
||||||
import {
|
import {
|
||||||
createDefaultClaudeLogsSidebarUiState,
|
createDefaultClaudeLogsSidebarUiState,
|
||||||
getTeamClaudeLogsSidebarUiState,
|
getTeamClaudeLogsSidebarUiState,
|
||||||
setTeamClaudeLogsSidebarUiState,
|
setTeamClaudeLogsSidebarUiState,
|
||||||
} from './sidebar/teamSidebarUiState';
|
} from './sidebar/teamSidebarUiState';
|
||||||
|
import { DEFAULT_CLAUDE_LOGS_FILTER } from './ClaudeLogsFilterPopover';
|
||||||
|
|
||||||
import type { ClaudeLogsFilterState } from './ClaudeLogsFilterPopover';
|
import type { ClaudeLogsFilterState } from './ClaudeLogsFilterPopover';
|
||||||
import type { ClaudeLogsViewerState } from './CliLogsRichView';
|
import type { ClaudeLogsViewerState } from './CliLogsRichView';
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@
|
||||||
* Class-based with ES #private fields, caching, and DI-ready constructor.
|
* Class-based with ES #private fields, caching, and DI-ready constructor.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { isLeadMember } from '@shared/utils/leadDetection';
|
|
||||||
import { agentAvatarUrl } from '@renderer/utils/memberHelpers';
|
import { agentAvatarUrl } from '@renderer/utils/memberHelpers';
|
||||||
|
import { isLeadMember } from '@shared/utils/leadDetection';
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
GraphDataPort,
|
GraphDataPort,
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@
|
||||||
import { Badge } from '@renderer/components/ui/badge';
|
import { Badge } from '@renderer/components/ui/badge';
|
||||||
import { Button } from '@renderer/components/ui/button';
|
import { Button } from '@renderer/components/ui/button';
|
||||||
import { agentAvatarUrl } from '@renderer/utils/memberHelpers';
|
import { agentAvatarUrl } from '@renderer/utils/memberHelpers';
|
||||||
import { Loader2, MessageSquare, ExternalLink, User, Plus } from 'lucide-react';
|
import { ExternalLink, Loader2, MessageSquare, Plus, User } from 'lucide-react';
|
||||||
|
|
||||||
import type { GraphNode } from '@claude-teams/agent-graph';
|
import type { GraphNode } from '@claude-teams/agent-graph';
|
||||||
|
|
||||||
|
|
@ -51,14 +51,14 @@ interface GraphNodePopoverProps {
|
||||||
onCreateTask?: (owner: string) => void;
|
onCreateTask?: (owner: string) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function GraphNodePopover({
|
export const GraphNodePopover = ({
|
||||||
node,
|
node,
|
||||||
onClose,
|
onClose,
|
||||||
onSendMessage,
|
onSendMessage,
|
||||||
onOpenTaskDetail,
|
onOpenTaskDetail,
|
||||||
onOpenMemberProfile,
|
onOpenMemberProfile,
|
||||||
onCreateTask,
|
onCreateTask,
|
||||||
}: GraphNodePopoverProps): React.JSX.Element {
|
}: GraphNodePopoverProps): React.JSX.Element => {
|
||||||
if (node.kind === 'member' || node.kind === 'lead') {
|
if (node.kind === 'member' || node.kind === 'lead') {
|
||||||
return (
|
return (
|
||||||
<MemberPopoverContent
|
<MemberPopoverContent
|
||||||
|
|
@ -92,11 +92,11 @@ export function GraphNodePopover({
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
// ─── Member Popover ─────────────────────────────────────────────────────────
|
// ─── Member Popover ─────────────────────────────────────────────────────────
|
||||||
|
|
||||||
function MemberPopoverContent({
|
const MemberPopoverContent = ({
|
||||||
node,
|
node,
|
||||||
onClose,
|
onClose,
|
||||||
onSendMessage,
|
onSendMessage,
|
||||||
|
|
@ -110,7 +110,7 @@ function MemberPopoverContent({
|
||||||
onOpenProfile?: (name: string) => void;
|
onOpenProfile?: (name: string) => void;
|
||||||
onCreateTask?: (owner: string) => void;
|
onCreateTask?: (owner: string) => void;
|
||||||
onOpenTask?: (taskId: string) => void;
|
onOpenTask?: (taskId: string) => void;
|
||||||
}): React.JSX.Element {
|
}): React.JSX.Element => {
|
||||||
const memberName =
|
const memberName =
|
||||||
node.domainRef.kind === 'member' || node.domainRef.kind === 'lead'
|
node.domainRef.kind === 'member' || node.domainRef.kind === 'lead'
|
||||||
? node.domainRef.memberName
|
? node.domainRef.memberName
|
||||||
|
|
@ -317,11 +317,11 @@ function MemberPopoverContent({
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
// ─── Task Popover ───────────────────────────────────────────────────────────
|
// ─── Task Popover ───────────────────────────────────────────────────────────
|
||||||
|
|
||||||
function TaskPopoverContent({
|
const TaskPopoverContent = ({
|
||||||
node,
|
node,
|
||||||
onClose,
|
onClose,
|
||||||
onOpenDetail,
|
onOpenDetail,
|
||||||
|
|
@ -329,7 +329,7 @@ function TaskPopoverContent({
|
||||||
node: GraphNode;
|
node: GraphNode;
|
||||||
onClose: () => void;
|
onClose: () => void;
|
||||||
onOpenDetail?: (taskId: string) => void;
|
onOpenDetail?: (taskId: string) => void;
|
||||||
}): React.JSX.Element {
|
}): React.JSX.Element => {
|
||||||
const taskId = node.domainRef.kind === 'task' ? node.domainRef.taskId : '';
|
const taskId = node.domainRef.kind === 'task' ? node.domainRef.taskId : '';
|
||||||
|
|
||||||
const statusColor =
|
const statusColor =
|
||||||
|
|
@ -393,4 +393,4 @@ function TaskPopoverContent({
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import { GraphView } from '@claude-teams/agent-graph';
|
||||||
import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHost';
|
import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHost';
|
||||||
|
|
||||||
import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter';
|
import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter';
|
||||||
|
|
||||||
import { GraphNodePopover } from './GraphNodePopover';
|
import { GraphNodePopover } from './GraphNodePopover';
|
||||||
|
|
||||||
import type { GraphDomainRef, GraphEventPort } from '@claude-teams/agent-graph';
|
import type { GraphDomainRef, GraphEventPort } from '@claude-teams/agent-graph';
|
||||||
|
|
|
||||||
|
|
@ -3,12 +3,13 @@
|
||||||
* Provides Fullscreen button that opens the overlay.
|
* Provides Fullscreen button that opens the overlay.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { useCallback, useState, lazy, Suspense } from 'react';
|
import { lazy, Suspense, useCallback, useState } from 'react';
|
||||||
|
|
||||||
import { GraphView } from '@claude-teams/agent-graph';
|
import { GraphView } from '@claude-teams/agent-graph';
|
||||||
import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHost';
|
import { TeamSidebarHost } from '@renderer/components/team/sidebar/TeamSidebarHost';
|
||||||
|
|
||||||
import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter';
|
import { useTeamGraphAdapter } from '../adapters/useTeamGraphAdapter';
|
||||||
|
|
||||||
import { GraphNodePopover } from './GraphNodePopover';
|
import { GraphNodePopover } from './GraphNodePopover';
|
||||||
|
|
||||||
import type { GraphDomainRef, GraphEventPort, GraphNode } from '@claude-teams/agent-graph';
|
import type { GraphDomainRef, GraphEventPort, GraphNode } from '@claude-teams/agent-graph';
|
||||||
|
|
|
||||||
|
|
@ -6,12 +6,12 @@ import { api } from '@renderer/api';
|
||||||
import { syncRendererTelemetry } from '@renderer/sentry';
|
import { syncRendererTelemetry } from '@renderer/sentry';
|
||||||
import { cleanupStale as cleanupCommentReadState } from '@renderer/services/commentReadStorage';
|
import { cleanupStale as cleanupCommentReadState } from '@renderer/services/commentReadStorage';
|
||||||
import { normalizePath } from '@renderer/utils/pathNormalize';
|
import { normalizePath } from '@renderer/utils/pathNormalize';
|
||||||
import { isVersionOlder, normalizeVersion } from '@shared/utils/version';
|
|
||||||
import {
|
import {
|
||||||
buildTaskChangePresenceKey,
|
buildTaskChangePresenceKey,
|
||||||
buildTaskChangeRequestOptions,
|
buildTaskChangeRequestOptions,
|
||||||
canDisplayTaskChangesForOptions,
|
canDisplayTaskChangesForOptions,
|
||||||
} from '@renderer/utils/taskChangeRequest';
|
} from '@renderer/utils/taskChangeRequest';
|
||||||
|
import { isVersionOlder, normalizeVersion } from '@shared/utils/version';
|
||||||
import { create } from 'zustand';
|
import { create } from 'zustand';
|
||||||
|
|
||||||
import { createChangeReviewSlice } from './slices/changeReviewSlice';
|
import { createChangeReviewSlice } from './slices/changeReviewSlice';
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,15 @@ vi.mock('@main/utils/shellEnv', () => ({
|
||||||
resolveInteractiveShellEnv: vi.fn(),
|
resolveInteractiveShellEnv: vi.fn(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
const addTeamNotificationMock = vi.fn().mockResolvedValue(null);
|
||||||
|
vi.mock('@main/services/infrastructure/NotificationManager', () => ({
|
||||||
|
NotificationManager: {
|
||||||
|
getInstance: () => ({
|
||||||
|
addTeamNotification: addTeamNotificationMock,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
import { TeamProvisioningService } from '@main/services/team/TeamProvisioningService';
|
import { TeamProvisioningService } from '@main/services/team/TeamProvisioningService';
|
||||||
import { ClaudeBinaryResolver } from '@main/services/team/ClaudeBinaryResolver';
|
import { ClaudeBinaryResolver } from '@main/services/team/ClaudeBinaryResolver';
|
||||||
import { resolveInteractiveShellEnv } from '@main/utils/shellEnv';
|
import { resolveInteractiveShellEnv } from '@main/utils/shellEnv';
|
||||||
|
|
@ -21,6 +30,7 @@ describe('TeamProvisioningService prepare/auth behavior', () => {
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
vi.clearAllMocks();
|
vi.clearAllMocks();
|
||||||
|
addTeamNotificationMock.mockResolvedValue(null);
|
||||||
tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-team-prepare-'));
|
tempRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-team-prepare-'));
|
||||||
vi.mocked(ClaudeBinaryResolver.resolve).mockResolvedValue('/fake/claude');
|
vi.mocked(ClaudeBinaryResolver.resolve).mockResolvedValue('/fake/claude');
|
||||||
vi.mocked(resolveInteractiveShellEnv).mockResolvedValue({
|
vi.mocked(resolveInteractiveShellEnv).mockResolvedValue({
|
||||||
|
|
@ -228,6 +238,9 @@ describe('TeamProvisioningService prepare/auth behavior', () => {
|
||||||
const svc = new TeamProvisioningService();
|
const svc = new TeamProvisioningService();
|
||||||
const emitter = vi.fn();
|
const emitter = vi.fn();
|
||||||
svc.setTeamChangeEmitter(emitter);
|
svc.setTeamChangeEmitter(emitter);
|
||||||
|
vi.spyOn(svc as any, 'updateConfigPostLaunch').mockResolvedValue(undefined);
|
||||||
|
vi.spyOn(svc as any, 'cleanupPrelaunchBackup').mockResolvedValue(undefined);
|
||||||
|
vi.spyOn(svc as any, 'relayLeadInboxMessages').mockResolvedValue(undefined);
|
||||||
|
|
||||||
const run = {
|
const run = {
|
||||||
runId: 'run-3',
|
runId: 'run-3',
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue