* fix(opencode): recover empty bridge output sends * fix(opencode): handle empty readiness bridge output * fix(opencode): retry read-only bridge no-output * fix(opencode): recover empty bridge output sends --------- Co-authored-by: iliya <iliyazelenkog@gmail.com> * fix(runtime-provider): clarify opencode model routes ux * fix(team): show create dialog loading fallback * feat(team): support revising sent messages * test(team): cover sent message revision flow * fix(opencode): harden local runtime bridge support * fix(member-work-sync): recover stale nudge payload conflicts * fix(runtime): gate codex install prompt on runtime status * fix(team): persist incomplete launch state before cleanup * fix(team): keep launch pending for dead runtime entries * feat(logs): compact team log source controls * fix(build): verify radix presence patch before build * fix(renderer): recover failed dynamic imports * fix(team): preserve task labels and change presence * fix(logs): restore member process log source * fix(team): require revision notice before editing --------- Co-authored-by: iliya <iliyazelenkog@gmail.com> Co-authored-by: 777genius <quantjumppro@gmail.com>
86 lines
3 KiB
TypeScript
86 lines
3 KiB
TypeScript
import { useMemo } from 'react';
|
|
|
|
import { useAppTranslation } from '@features/localization/renderer';
|
|
import { useStore } from '@renderer/store';
|
|
import {
|
|
getCurrentProvisioningProgressForTeam,
|
|
selectTeamMemberSnapshotsForName,
|
|
} from '@renderer/store/slices/teamSlice';
|
|
import { buildTeamMemberLaunchDiagnosticsPayloads } from '@renderer/utils/memberLaunchDiagnostics';
|
|
import { buildTeamProvisioningPresentation } from '@renderer/utils/teamProvisioningPresentation';
|
|
import { useShallow } from 'zustand/react/shallow';
|
|
|
|
import type { MemberLaunchDiagnosticsPayload } from '@renderer/utils/memberLaunchDiagnostics';
|
|
import type { TeamProvisioningPresentation } from '@renderer/utils/teamProvisioningPresentation';
|
|
import type { RetryFailedOpenCodeSecondaryLanesResult } from '@shared/types';
|
|
|
|
export function useTeamProvisioningPresentation(teamName: string): {
|
|
presentation: TeamProvisioningPresentation | null;
|
|
cancelProvisioning: ((runId: string) => Promise<void>) | null;
|
|
retryFailedOpenCodeSecondaryLanes:
|
|
| ((teamName: string) => Promise<RetryFailedOpenCodeSecondaryLanesResult>)
|
|
| null;
|
|
memberDiagnostics: MemberLaunchDiagnosticsPayload[];
|
|
runInstanceKey: string | null;
|
|
} {
|
|
const { t } = useAppTranslation('team');
|
|
const {
|
|
progress,
|
|
cancelProvisioning,
|
|
retryFailedOpenCodeSecondaryLanes,
|
|
teamMembers,
|
|
memberSpawnStatuses,
|
|
memberSpawnSnapshot,
|
|
runtimeSnapshot,
|
|
} = useStore(
|
|
useShallow((s) => ({
|
|
progress: getCurrentProvisioningProgressForTeam(s, teamName),
|
|
cancelProvisioning: s.cancelProvisioning,
|
|
retryFailedOpenCodeSecondaryLanes: s.retryFailedOpenCodeSecondaryLanes,
|
|
teamMembers: selectTeamMemberSnapshotsForName(s, teamName),
|
|
memberSpawnStatuses: s.memberSpawnStatusesByTeam[teamName],
|
|
memberSpawnSnapshot: s.memberSpawnSnapshotsByTeam[teamName],
|
|
runtimeSnapshot: s.teamAgentRuntimeByTeam?.[teamName],
|
|
}))
|
|
);
|
|
|
|
const presentation = useMemo(
|
|
() =>
|
|
buildTeamProvisioningPresentation({
|
|
progress,
|
|
members: teamMembers,
|
|
memberSpawnStatuses,
|
|
memberSpawnSnapshot,
|
|
memberRuntimeEntries: runtimeSnapshot?.members,
|
|
t,
|
|
}),
|
|
[memberSpawnSnapshot, memberSpawnStatuses, progress, runtimeSnapshot?.members, teamMembers, t]
|
|
);
|
|
const memberDiagnostics = useMemo(
|
|
() =>
|
|
buildTeamMemberLaunchDiagnosticsPayloads({
|
|
teamName,
|
|
runId: runtimeSnapshot?.runId ?? memberSpawnSnapshot?.runId ?? progress?.runId,
|
|
members: teamMembers,
|
|
memberSpawnStatuses,
|
|
memberSpawnSnapshot,
|
|
runtimeEntries: runtimeSnapshot?.members,
|
|
}),
|
|
[
|
|
memberSpawnSnapshot,
|
|
memberSpawnStatuses,
|
|
progress?.runId,
|
|
runtimeSnapshot,
|
|
teamMembers,
|
|
teamName,
|
|
]
|
|
);
|
|
|
|
return {
|
|
presentation,
|
|
cancelProvisioning,
|
|
retryFailedOpenCodeSecondaryLanes: retryFailedOpenCodeSecondaryLanes ?? null,
|
|
memberDiagnostics,
|
|
runInstanceKey: progress ? `${teamName}:${progress.runId}:${progress.startedAt}` : null,
|
|
};
|
|
}
|