Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 6 additions & 6 deletions apps/desktop/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,19 +45,19 @@
"@ling-stack/api-client": "workspace:*",
"@ling-stack/contracts": "workspace:*",
"@ling-stack/ui-react": "workspace:*",
"lucide-react": "^0.468.0",
"lucide-react": "^1.29.0",
"mammoth": "1.12.0",
"pdf-parse": "1.1.1",
"react": "^18.3.1",
"react-dom": "^18.3.1"
"pdf-parse": "2.4.5",
"react": "^19.2.8",
"react-dom": "^19.2.8"
},
"devDependencies": {
"@electron/asar": "4.2.1",
"@electron/osx-sign": "2.6.0",
"@fontsource-variable/inter": "5.3.0",
"@playwright/test": "^1.55.0",
"@types/react": "^18.3.1",
"@types/react-dom": "^18.3.1",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4",
"ajv": "8.20.0",
"ajv-formats": "3.0.1",
"electron": "^43.1.1",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ function PageDeckChrome({
readonly setViewAllOpen: (open: boolean) => void;
readonly t: ComputerUsePreviewTranslate;
readonly viewAllOpen: boolean;
readonly viewAllTriggerRef: React.RefObject<HTMLButtonElement>;
readonly viewAllTriggerRef: React.RefObject<HTMLButtonElement | null>;
}) {
const activePage = pageDeck.residentPages.find((page) => page.active);
const viewAllPanelRef = useRef<HTMLDivElement>(null);
Expand Down
8 changes: 4 additions & 4 deletions apps/mobile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
"@ling-stack/remote-client": "workspace:*",
"@ling-stack/remote-protocol": "workspace:*",
"@expo/vector-icons": "^15.0.2",
"@react-native-async-storage/async-storage": "2.2.0",
"@react-navigation/native": "^7.3.14",
"@react-native-async-storage/async-storage": "3.1.1",
"@react-navigation/native": "^7.3.16",
"@react-navigation/native-stack": "^7.18.6",
"expo": "~57.0.7",
"expo-camera": "~57.0.3",
Expand All @@ -33,9 +33,9 @@
"expo-image-picker": "~57.0.7",
"expo-network": "~57.0.1",
"expo-secure-store": "~57.0.1",
"react": "19.2.3",
"react": "19.2.8",
"react-native": "0.86.2",
"react-native-safe-area-context": "~5.7.0",
"react-native-safe-area-context": "~5.8.1",
"react-native-screens": "~4.26.0"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion apps/mobile/src/platform/remote-storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ export async function removeConversationDrafts(workspaceBindingId: string): Prom
const prefix = draftNamespacePrefix(workspaceBindingId);
const keys = (await AsyncStorage.getAllKeys()).filter((key) => key.startsWith(prefix));
if (keys.length > 0) {
await AsyncStorage.multiRemove(keys);
await AsyncStorage.removeMany(keys);
}
}

Expand Down
2 changes: 1 addition & 1 deletion apps/web/e2e/ui2-channel-error-ownership.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ test("T13-P.9D Channel removes the generic AppShell error owner", async () => {

const workspaceClientSignature = workspaceClientSource.slice(
workspaceClientSource.indexOf("export function WorkspaceClientView"),
workspaceClientSource.indexOf("): JSX.Element {", workspaceClientSource.indexOf("export function WorkspaceClientView")),
workspaceClientSource.indexOf("): React.JSX.Element {", workspaceClientSource.indexOf("export function WorkspaceClientView")),
);
expect(workspaceClientSignature).not.toContain("readonly errorMessage: string;");
expect(workspaceClientSource).not.toMatch(/\n\s*errorMessage,\n\s*onChannelCreateOpenChange/u);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/e2e/ui2-media-production-workflow.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -233,7 +233,7 @@ test("MP-11 delayed old cwd responses cannot overwrite the current workflow stat
const host = document.createElement("div");
host.id = "workflow-controller-probe";
document.body.append(host);
function Probe(): JSX.Element {
function Probe(): React.JSX.Element {
const [cwdValue, setCwdValue] = React.useState("/cwd-a");
const controller = controllerModule.useMediaWorkflowController({ cwd: cwdValue, onJobsChanged: () => undefined });
return React.createElement("section", {},
Expand Down
12 changes: 6 additions & 6 deletions apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,18 @@
"@ling-stack/ui-react": "workspace:*",
"@tanstack/react-virtual": "^3.14.2",
"@xyflow/react": "^12.9.3",
"katex": "^0.16.22",
"lucide-react": "^0.468.0",
"katex": "^0.18.1",
"lucide-react": "^1.29.0",
"qrcode": "1.5.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react": "^19.2.8",
"react-dom": "^19.2.8",
"react-icons": "^5.5.0",
"shiki": "^4.3.0"
},
"devDependencies": {
"@playwright/test": "^1.55.0",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4",
"@vitejs/plugin-react": "^6.0.5",
"fflate": "^0.8.2",
"vite": "^8.2.1"
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { AppShell } from "./app/AppShell.js";
import { DesktopThemeBridge } from "./app/DesktopThemeBridge.js";

export function App(): JSX.Element {
export function App(): React.JSX.Element {
return (
<>
<DesktopThemeBridge />
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/AppConnectionStatus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export function AppConnectionStatus({
readonly offline: boolean;
readonly refreshing: boolean;
readonly onRetry: () => void;
}): JSX.Element | null {
}): React.JSX.Element | null {
const { t } = useI18n();
if (!offline) return null;

Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/app/AppShell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ function isSettingsWorkspaceToolView(view: ViewId): view is Exclude<SettingsWork
return view === "providers" || view === "teammates" || view === "councils";
}

export function AppShell(): JSX.Element {
export function AppShell(): React.JSX.Element {
const { locale, setLocale, t } = useI18n();
const { preference: themePreference, setLegacyPreference: setThemePreference } = useTheme();
const { dismissToast, showToast } = useLingToast();
Expand Down Expand Up @@ -271,7 +271,7 @@ export function AppShell(): JSX.Element {
const [teammateCreateOpen, setTeammateCreateOpen] = useState(false);
const workspaceTimelineLoadRef = useRef("");
const channelEditFormSyncKeyRef = useRef("");
const workspaceDefaultProviderPresetIdRef = useRef<string>();
const workspaceDefaultProviderPresetIdRef = useRef<string | undefined>(undefined);
const workspaceDefaultProviderAssignmentPendingRef = useRef("");
useEffect(() => {
if (narrowViewport) setChannelSidebarOpen(false);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/AppShellOverlayBoundary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export interface AppShellOverlayBoundaryProps extends Omit<HTMLAttributes<HTMLEl
export function AppShellOverlayBoundary({
children,
...props
}: AppShellOverlayBoundaryProps): JSX.Element {
}: AppShellOverlayBoundaryProps): React.JSX.Element {
const viewport = useAppViewportState();
return (
<main
Expand Down
12 changes: 6 additions & 6 deletions apps/web/src/app/DesktopComputerUseBridge.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,20 +61,20 @@ export function DesktopComputerUseBridge({
}: {
readonly selectedConversationId?: string;
readonly surfaceKind?: "channel" | "normal_conversation" | "teammate_direct";
readonly hostRef: RefObject<HTMLElement>;
readonly hostRef: RefObject<HTMLElement | null>;
}) {
const { locale } = useI18n();
const capabilities = window.lingDesktop?.computerUse;
const [summary, setSummary] = useState<ComputerUseSummary | undefined>();
const [stopRequest, setStopRequest] = useState<StopRequestState | undefined>();
const [visibilityRequest, setVisibilityRequest] = useState<VisibilityRequestState | undefined>();
const stopRequestSequenceRef = useRef(0);
const pendingStopRequestRef = useRef<PendingStopRequest | undefined>();
const stopConvergenceTimeoutIdRef = useRef<number | undefined>();
const pendingStopRequestRef = useRef<PendingStopRequest | undefined>(undefined);
const stopConvergenceTimeoutIdRef = useRef<number | undefined>(undefined);
const visibilityRequestSequenceRef = useRef(0);
const pendingVisibilityRequestRef = useRef<PendingVisibilityRequest | undefined>();
const visibilityConvergenceTimeoutIdRef = useRef<number | undefined>();
const activeSummarySessionIdRef = useRef<string | undefined>();
const pendingVisibilityRequestRef = useRef<PendingVisibilityRequest | undefined>(undefined);
const visibilityConvergenceTimeoutIdRef = useRef<number | undefined>(undefined);
const activeSummarySessionIdRef = useRef<string | undefined>(undefined);
const selectedConversationIdRef = useRef(selectedConversationId);
selectedConversationIdRef.current = selectedConversationId;

Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/DesktopComputerUseControlSlot.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export function DesktopComputerUseControlSlot({
};
readonly onToggleVisibility: () => void;
readonly onStop: () => void;
}): JSX.Element {
}): React.JSX.Element {
const { t } = useI18n();
const stopFeedbackId = useId();
const visibilityFeedbackId = useId();
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/DesktopWindowChrome.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export function DesktopWindowChrome(): JSX.Element | null {
export function DesktopWindowChrome(): React.JSX.Element | null {
const isMacosDesktop =
typeof window !== "undefined" && window.lingDesktop?.platform === "macos";

Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/FullAccessConfirmationDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export function FullAccessConfirmationDialog({
readonly onConfirm: () => void;
readonly open: boolean;
readonly returnFocusTarget?: HTMLElement | null;
}): JSX.Element {
}): React.JSX.Element {
const { t } = useI18n();
const cancelButtonRef = useRef<HTMLButtonElement>(null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ interface ComputerUseObstacleRect {

export function useDesktopComputerUseHostLayoutReporter(
capabilities: DesktopComputerUseCapabilities | undefined,
hostRef: RefObject<HTMLElement>,
hostRef: RefObject<HTMLElement | null>,
): void {
useEffect(() => {
const host = hostRef.current;
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/use-focused-domain-error-owner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export function useFocusedDomainErrorOwner<
>(identity: string): FocusedDomainErrorOwner<TDomain, TAction> {
const mountedRef = useRef(true);
const [, rerender] = useReducer((value: number) => value + 1, 0);
const ownerRef = useRef<FocusedDomainErrorOwner<TDomain, TAction>>();
const ownerRef = useRef<FocusedDomainErrorOwner<TDomain, TAction> | undefined>(undefined);
if (!ownerRef.current) {
ownerRef.current = createFocusedDomainErrorOwner<TDomain, TAction>(identity, () => {
if (mountedRef.current) rerender();
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/use-shell-error-feedback.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export function useShellErrorFeedback(input: {
readonly dismissToast: (idOrScope: string) => void;
readonly showToast: (toast: LingToastInput) => string;
}): void {
const coordinatorRef = useRef<ReturnType<typeof createShellErrorFeedbackCoordinator>>();
const coordinatorRef = useRef<ReturnType<typeof createShellErrorFeedbackCoordinator> | undefined>(undefined);
const dismissToastRef = useRef(input.dismissToast);
const itemsRef = useRef(input.items);
const showToastRef = useRef(input.showToast);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/app/use-workspace-settings-controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export function useWorkspaceSettingsController(input: {
const [workspaceSettings, setWorkspaceSettings] = useState<WorkspaceSettings | undefined>();
const [effectiveConfig, setEffectiveConfig] = useState<EffectiveConfigResponse | undefined>();
const workspaceSettingsLoadedCwdRef = useRef("");
const interfaceSettingsSyncRef = useRef<{ readonly cwd: string; readonly theme: ThemePreference; readonly locale: Locale } | undefined>();
const interfaceSettingsSyncRef = useRef<{ readonly cwd: string; readonly theme: ThemePreference; readonly locale: Locale } | undefined>(undefined);
const currentLocaleRef = useRef(input.locale);
const workspaceCwd = input.form.cwd.trim();
const errorOwner = useFocusedDomainErrorOwner<"workspace-settings", WorkspaceSettingsErrorAction>(
Expand Down
6 changes: 3 additions & 3 deletions apps/web/src/app/useFullAccessConfirmationController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ export interface FullAccessConfirmationController {
export function useFullAccessConfirmationController(): FullAccessConfirmationController {
const [open, setOpen] = useState(false);
const [, setConfirmationRevision] = useState(0);
const confirmedByScopeRef = useRef<Map<string, PermissionConfirmation>>();
const storageRef = useRef<FullAccessConfirmationStorage>();
const pendingRef = useRef<PendingFullAccessConfirmation>();
const confirmedByScopeRef = useRef<Map<string, PermissionConfirmation> | undefined>(undefined);
const storageRef = useRef<FullAccessConfirmationStorage | undefined>(undefined);
const pendingRef = useRef<PendingFullAccessConfirmation | undefined>(undefined);
const returnFocusTargetRef = useRef<HTMLElement | null>(null);
if (!confirmedByScopeRef.current) {
storageRef.current = browserFullAccessConfirmationStorage();
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/domains/media/use-media-domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export function useMediaDomain(input: {
const artifactGuard = useLatestKeyedRequestGuard();
const workspaceEpochRef = useRef(0);
const mutationEpochRef = useRef(0);
const listInFlightRef = useRef<Promise<void>>();
const listInFlightRef = useRef<Promise<void> | undefined>(undefined);
const cwdRef = useRef(input.cwd.trim());
const jobsRef = useRef(mediaJobs);
const artifactsRef = useRef(artifactsByJob);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/domains/plugins/use-plugins-domain.ts
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ export function usePluginsDomain(input: {
const [pluginPendingActions, setPluginPendingActions] = useState<readonly PluginPendingAction[]>([]);
const [pluginActionErrors, setPluginActionErrors] = useState<readonly PluginActionError[]>([]);
const [error, setError] = useState<DomainError | undefined>();
const autoConnectInFlightRef = useRef<Promise<ManagedPluginView | undefined> | undefined>();
const autoConnectInFlightRef = useRef<Promise<ManagedPluginView | undefined> | undefined>(undefined);
const actionFenceRef = useRef(new PluginActionRequestFence());
const loadRequestIdRef = useRef(0);
const internalRequestIdRef = useRef(0);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/features/approvals/ApprovalCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export function ApprovalCard({
readonly onExecuteExternalAction?: (actionId: string) => void;
readonly onCancelExternalAction?: (actionId: string) => void;
readonly onRefreshExternalAction?: () => void;
}): JSX.Element {
}): React.JSX.Element {
return (
<article
className={`approval-row approval-card${compact ? " compact" : ""}${selected ? " selected" : ""}`}
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/features/approvals/ApprovalDecisionDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,11 @@ export function ApprovalDecisionDialog({
readonly reasonRequired: boolean;
readonly reasonError: string;
readonly mutationError: string;
readonly restoreFocusRef: RefObject<HTMLButtonElement>;
readonly restoreFocusRef: RefObject<HTMLButtonElement | null>;
readonly onOpenChange: (open: boolean) => void;
readonly onReasonChange: (reason: string) => void;
readonly onConfirm: (decision: ApprovalResolution) => void;
}): JSX.Element {
}): React.JSX.Element {
const { t } = useI18n();
const cancelRef = useRef<HTMLButtonElement>(null);
return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export function ApprovalDecisionPanel({
readonly errorMessage?: string;
readonly resolvingDecision?: ApprovalResolution;
readonly onResolve: (approvalId: string, decision: ApprovalResolution, reason?: string) => void;
}): JSX.Element | null {
}): React.JSX.Element | null {
const { t } = useI18n();
const approveButtonRef = useRef<HTMLButtonElement>(null);
const decision = useApprovalDecisionController({ approval, resolvingDecision, errorMessage, onResolve });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export function ApprovalExternalActionSection({
readonly onExecute?: (actionId: string) => void;
readonly onCancel?: (actionId: string) => void;
readonly onRefresh?: () => void;
}): JSX.Element | null {
}): React.JSX.Element | null {
const { t } = useI18n();
const hasExternalPayload = readDataString(approval.payload, "type") === "external_action";
const action = actionView?.action;
Expand Down Expand Up @@ -110,7 +110,7 @@ function ExternalActionRetry({ operation, actionId, canExecute, canCancel, onExe
readonly onExecute?: (actionId: string) => void;
readonly onCancel?: (actionId: string) => void;
readonly onRefresh?: () => void;
}): JSX.Element | null {
}): React.JSX.Element | null {
const { t } = useI18n();
if (operation.failedOperation === "execute" && actionId && canExecute) return <Button size="sm" variant="ghost" onClick={() => onExecute?.(actionId)}>{t("Retry")}</Button>;
if (operation.failedOperation === "cancel" && actionId && canCancel) return <Button size="sm" variant="ghost" onClick={() => onCancel?.(actionId)}>{t("Retry")}</Button>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { useI18n, type Translate } from "../../i18n.js";
import { formatUnknownPreview, readDataField, readDataString } from "../../lib/data.js";
import type { ApprovalRequest } from "../../types.js";

export function ApprovalPayloadSummary({ approval }: { readonly approval: ApprovalRequest }): JSX.Element | null {
export function ApprovalPayloadSummary({ approval }: { readonly approval: ApprovalRequest }): React.JSX.Element | null {
const { t } = useI18n();
const payloadType = readDataString(approval.payload, "type");
if (payloadType === "bash") {
Expand Down
4 changes: 2 additions & 2 deletions apps/web/src/features/approvals/ApprovalPermissionDelta.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export function ApprovalPermissionDelta({
}: {
readonly approval: ApprovalRequest;
readonly compact?: boolean;
}): JSX.Element | null {
}): React.JSX.Element | null {
const { t } = useI18n();
const delta = projectRuntimePermissionDelta(approval);
if (!delta || delta.added.length + delta.removed.length + delta.unchanged.length === 0) return null;
Expand Down Expand Up @@ -40,7 +40,7 @@ export function ApprovalPermissionDelta({
);
}

function PermissionEntries({ label, entries }: { readonly label: string; readonly entries: readonly string[] }): JSX.Element | null {
function PermissionEntries({ label, entries }: { readonly label: string; readonly entries: readonly string[] }): React.JSX.Element | null {
if (entries.length === 0) return null;
return (
<span className="approval-permission-column">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function ApprovalRunRepairPanel({
readonly approvals: readonly ApprovalRequest[];
readonly onOpenRun: () => void;
readonly onClear: () => void;
}): JSX.Element {
}): React.JSX.Element {
const { t } = useI18n();
const pendingCount = approvals.filter((approval) => effectiveApprovalStatus(approval) === "pending").length;
const highestRisk = highestApprovalRisk(approvals);
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/features/approvals/ApprovalSummary.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { ApprovalRequest } from "../../types.js";
import { approvalActionDisplayKey, approvalRiskTone, approvalStatusTone } from "./approval-view-models.js";
import { ApprovalPayloadSummary } from "./ApprovalPayloadSummary.js";

export function ApprovalSummary({ approval }: { readonly approval: ApprovalRequest }): JSX.Element {
export function ApprovalSummary({ approval }: { readonly approval: ApprovalRequest }): React.JSX.Element {
const { t } = useI18n();
const status = effectiveApprovalStatus(approval);
const timing = approvalTimingLabel(approval);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { useI18n } from "../../i18n.js";
import { formatEventData } from "../../lib/data.js";
import type { ApprovalRequest } from "../../types.js";

export function ApprovalTechnicalDetails({ approval }: { readonly approval: ApprovalRequest }): JSX.Element {
export function ApprovalTechnicalDetails({ approval }: { readonly approval: ApprovalRequest }): React.JSX.Element {
const { t } = useI18n();
return (
<InspectorSection className="approval-technical-details" summary={approval.id} title={t("Technical details")}>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/features/approvals/ApprovalToolbar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export function ApprovalToolbar({
readonly onRiskChange: (risk: ApprovalRisk | "all") => void;
readonly onSearchChange: (search: string) => void;
readonly onClear: () => void;
}): JSX.Element {
}): React.JSX.Element {
const { t } = useI18n();
return (
<div className="approvals-ui2-toolbar" aria-label={t("Filters")}>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/src/features/approvals/ApprovalsHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export function ApprovalsHeader({
}: {
readonly pendingCount: number;
readonly repairScoped: boolean;
}): JSX.Element {
}): React.JSX.Element {
const { t } = useI18n();
return (
<header className="approvals-ui2-header">
Expand Down
Loading