agent-ecosystem/src/renderer/components/team/useTeamProvisioningPresentation.ts
infiniti 9758fafd10
feat(team): support sent message revisions
* 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>
2026-05-25 21:11:59 +03:00

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,
};
}