diff --git a/apps/desktop/package.json b/apps/desktop/package.json index e660500a6..cc55277d7 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -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", diff --git a/apps/desktop/renderer/computer-use-preview/ComputerUsePageDeck.tsx b/apps/desktop/renderer/computer-use-preview/ComputerUsePageDeck.tsx index aa426bbe0..d3f4cbe7e 100644 --- a/apps/desktop/renderer/computer-use-preview/ComputerUsePageDeck.tsx +++ b/apps/desktop/renderer/computer-use-preview/ComputerUsePageDeck.tsx @@ -169,7 +169,7 @@ function PageDeckChrome({ readonly setViewAllOpen: (open: boolean) => void; readonly t: ComputerUsePreviewTranslate; readonly viewAllOpen: boolean; - readonly viewAllTriggerRef: React.RefObject; + readonly viewAllTriggerRef: React.RefObject; }) { const activePage = pageDeck.residentPages.find((page) => page.active); const viewAllPanelRef = useRef(null); diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 4df469043..ed05f5eb7 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -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", @@ -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": { diff --git a/apps/mobile/src/platform/remote-storage.ts b/apps/mobile/src/platform/remote-storage.ts index f0d13c833..f3151f497 100644 --- a/apps/mobile/src/platform/remote-storage.ts +++ b/apps/mobile/src/platform/remote-storage.ts @@ -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); } } diff --git a/apps/web/e2e/ui2-channel-error-ownership.spec.ts b/apps/web/e2e/ui2-channel-error-ownership.spec.ts index 24e734ce4..f87255c10 100644 --- a/apps/web/e2e/ui2-channel-error-ownership.spec.ts +++ b/apps/web/e2e/ui2-channel-error-ownership.spec.ts @@ -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); diff --git a/apps/web/e2e/ui2-media-production-workflow.spec.ts b/apps/web/e2e/ui2-media-production-workflow.spec.ts index bfca55bdc..a8e554b5d 100644 --- a/apps/web/e2e/ui2-media-production-workflow.spec.ts +++ b/apps/web/e2e/ui2-media-production-workflow.spec.ts @@ -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", {}, diff --git a/apps/web/package.json b/apps/web/package.json index c9b0e1cce..b321cb51f 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -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" diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx index 0a232c394..928050446 100644 --- a/apps/web/src/App.tsx +++ b/apps/web/src/App.tsx @@ -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 ( <> diff --git a/apps/web/src/app/AppConnectionStatus.tsx b/apps/web/src/app/AppConnectionStatus.tsx index a34e373a0..78df57b99 100644 --- a/apps/web/src/app/AppConnectionStatus.tsx +++ b/apps/web/src/app/AppConnectionStatus.tsx @@ -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; diff --git a/apps/web/src/app/AppShell.tsx b/apps/web/src/app/AppShell.tsx index b3748350a..32cfa6ffc 100644 --- a/apps/web/src/app/AppShell.tsx +++ b/apps/web/src/app/AppShell.tsx @@ -212,7 +212,7 @@ function isSettingsWorkspaceToolView(view: ViewId): view is Exclude(); + const workspaceDefaultProviderPresetIdRef = useRef(undefined); const workspaceDefaultProviderAssignmentPendingRef = useRef(""); useEffect(() => { if (narrowViewport) setChannelSidebarOpen(false); diff --git a/apps/web/src/app/AppShellOverlayBoundary.tsx b/apps/web/src/app/AppShellOverlayBoundary.tsx index 4705ada1d..b5770c3f0 100644 --- a/apps/web/src/app/AppShellOverlayBoundary.tsx +++ b/apps/web/src/app/AppShellOverlayBoundary.tsx @@ -8,7 +8,7 @@ export interface AppShellOverlayBoundaryProps extends Omit; + readonly hostRef: RefObject; }) { const { locale } = useI18n(); const capabilities = window.lingDesktop?.computerUse; @@ -69,12 +69,12 @@ export function DesktopComputerUseBridge({ const [stopRequest, setStopRequest] = useState(); const [visibilityRequest, setVisibilityRequest] = useState(); const stopRequestSequenceRef = useRef(0); - const pendingStopRequestRef = useRef(); - const stopConvergenceTimeoutIdRef = useRef(); + const pendingStopRequestRef = useRef(undefined); + const stopConvergenceTimeoutIdRef = useRef(undefined); const visibilityRequestSequenceRef = useRef(0); - const pendingVisibilityRequestRef = useRef(); - const visibilityConvergenceTimeoutIdRef = useRef(); - const activeSummarySessionIdRef = useRef(); + const pendingVisibilityRequestRef = useRef(undefined); + const visibilityConvergenceTimeoutIdRef = useRef(undefined); + const activeSummarySessionIdRef = useRef(undefined); const selectedConversationIdRef = useRef(selectedConversationId); selectedConversationIdRef.current = selectedConversationId; diff --git a/apps/web/src/app/DesktopComputerUseControlSlot.tsx b/apps/web/src/app/DesktopComputerUseControlSlot.tsx index 0c6362aab..555635320 100644 --- a/apps/web/src/app/DesktopComputerUseControlSlot.tsx +++ b/apps/web/src/app/DesktopComputerUseControlSlot.tsx @@ -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(); diff --git a/apps/web/src/app/DesktopWindowChrome.tsx b/apps/web/src/app/DesktopWindowChrome.tsx index 151aa49a2..019ea5a7c 100644 --- a/apps/web/src/app/DesktopWindowChrome.tsx +++ b/apps/web/src/app/DesktopWindowChrome.tsx @@ -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"; diff --git a/apps/web/src/app/FullAccessConfirmationDialog.tsx b/apps/web/src/app/FullAccessConfirmationDialog.tsx index 404b1bec9..2020e0b9d 100644 --- a/apps/web/src/app/FullAccessConfirmationDialog.tsx +++ b/apps/web/src/app/FullAccessConfirmationDialog.tsx @@ -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(null); diff --git a/apps/web/src/app/use-desktop-computer-use-host-layout-reporter.ts b/apps/web/src/app/use-desktop-computer-use-host-layout-reporter.ts index ba4bf73ab..6511c204f 100644 --- a/apps/web/src/app/use-desktop-computer-use-host-layout-reporter.ts +++ b/apps/web/src/app/use-desktop-computer-use-host-layout-reporter.ts @@ -22,7 +22,7 @@ interface ComputerUseObstacleRect { export function useDesktopComputerUseHostLayoutReporter( capabilities: DesktopComputerUseCapabilities | undefined, - hostRef: RefObject, + hostRef: RefObject, ): void { useEffect(() => { const host = hostRef.current; diff --git a/apps/web/src/app/use-focused-domain-error-owner.ts b/apps/web/src/app/use-focused-domain-error-owner.ts index 9c8bb44e9..d03bb387e 100644 --- a/apps/web/src/app/use-focused-domain-error-owner.ts +++ b/apps/web/src/app/use-focused-domain-error-owner.ts @@ -151,7 +151,7 @@ export function useFocusedDomainErrorOwner< >(identity: string): FocusedDomainErrorOwner { const mountedRef = useRef(true); const [, rerender] = useReducer((value: number) => value + 1, 0); - const ownerRef = useRef>(); + const ownerRef = useRef | undefined>(undefined); if (!ownerRef.current) { ownerRef.current = createFocusedDomainErrorOwner(identity, () => { if (mountedRef.current) rerender(); diff --git a/apps/web/src/app/use-shell-error-feedback.ts b/apps/web/src/app/use-shell-error-feedback.ts index e08d7c853..fa79ed7a4 100644 --- a/apps/web/src/app/use-shell-error-feedback.ts +++ b/apps/web/src/app/use-shell-error-feedback.ts @@ -16,7 +16,7 @@ export function useShellErrorFeedback(input: { readonly dismissToast: (idOrScope: string) => void; readonly showToast: (toast: LingToastInput) => string; }): void { - const coordinatorRef = useRef>(); + const coordinatorRef = useRef | undefined>(undefined); const dismissToastRef = useRef(input.dismissToast); const itemsRef = useRef(input.items); const showToastRef = useRef(input.showToast); diff --git a/apps/web/src/app/use-workspace-settings-controller.ts b/apps/web/src/app/use-workspace-settings-controller.ts index f8621f957..1d2ee44dd 100644 --- a/apps/web/src/app/use-workspace-settings-controller.ts +++ b/apps/web/src/app/use-workspace-settings-controller.ts @@ -51,7 +51,7 @@ export function useWorkspaceSettingsController(input: { const [workspaceSettings, setWorkspaceSettings] = useState(); const [effectiveConfig, setEffectiveConfig] = useState(); 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>( diff --git a/apps/web/src/app/useFullAccessConfirmationController.ts b/apps/web/src/app/useFullAccessConfirmationController.ts index db5e730a8..c13ae28f4 100644 --- a/apps/web/src/app/useFullAccessConfirmationController.ts +++ b/apps/web/src/app/useFullAccessConfirmationController.ts @@ -31,9 +31,9 @@ export interface FullAccessConfirmationController { export function useFullAccessConfirmationController(): FullAccessConfirmationController { const [open, setOpen] = useState(false); const [, setConfirmationRevision] = useState(0); - const confirmedByScopeRef = useRef>(); - const storageRef = useRef(); - const pendingRef = useRef(); + const confirmedByScopeRef = useRef | undefined>(undefined); + const storageRef = useRef(undefined); + const pendingRef = useRef(undefined); const returnFocusTargetRef = useRef(null); if (!confirmedByScopeRef.current) { storageRef.current = browserFullAccessConfirmationStorage(); diff --git a/apps/web/src/domains/media/use-media-domain.ts b/apps/web/src/domains/media/use-media-domain.ts index 5c35c6668..fa0787549 100644 --- a/apps/web/src/domains/media/use-media-domain.ts +++ b/apps/web/src/domains/media/use-media-domain.ts @@ -71,7 +71,7 @@ export function useMediaDomain(input: { const artifactGuard = useLatestKeyedRequestGuard(); const workspaceEpochRef = useRef(0); const mutationEpochRef = useRef(0); - const listInFlightRef = useRef>(); + const listInFlightRef = useRef | undefined>(undefined); const cwdRef = useRef(input.cwd.trim()); const jobsRef = useRef(mediaJobs); const artifactsRef = useRef(artifactsByJob); diff --git a/apps/web/src/domains/plugins/use-plugins-domain.ts b/apps/web/src/domains/plugins/use-plugins-domain.ts index 51a786cec..6378cb1e9 100644 --- a/apps/web/src/domains/plugins/use-plugins-domain.ts +++ b/apps/web/src/domains/plugins/use-plugins-domain.ts @@ -88,7 +88,7 @@ export function usePluginsDomain(input: { const [pluginPendingActions, setPluginPendingActions] = useState([]); const [pluginActionErrors, setPluginActionErrors] = useState([]); const [error, setError] = useState(); - const autoConnectInFlightRef = useRef | undefined>(); + const autoConnectInFlightRef = useRef | undefined>(undefined); const actionFenceRef = useRef(new PluginActionRequestFence()); const loadRequestIdRef = useRef(0); const internalRequestIdRef = useRef(0); diff --git a/apps/web/src/features/approvals/ApprovalCard.tsx b/apps/web/src/features/approvals/ApprovalCard.tsx index eac21c4b6..0bcc7492c 100644 --- a/apps/web/src/features/approvals/ApprovalCard.tsx +++ b/apps/web/src/features/approvals/ApprovalCard.tsx @@ -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 (
; + readonly restoreFocusRef: RefObject; 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(null); return ( diff --git a/apps/web/src/features/approvals/ApprovalDecisionPanel.tsx b/apps/web/src/features/approvals/ApprovalDecisionPanel.tsx index 81c297c97..485b832c0 100644 --- a/apps/web/src/features/approvals/ApprovalDecisionPanel.tsx +++ b/apps/web/src/features/approvals/ApprovalDecisionPanel.tsx @@ -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(null); const decision = useApprovalDecisionController({ approval, resolvingDecision, errorMessage, onResolve }); diff --git a/apps/web/src/features/approvals/ApprovalExternalActionSection.tsx b/apps/web/src/features/approvals/ApprovalExternalActionSection.tsx index 7fd8cc823..54f8706aa 100644 --- a/apps/web/src/features/approvals/ApprovalExternalActionSection.tsx +++ b/apps/web/src/features/approvals/ApprovalExternalActionSection.tsx @@ -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; @@ -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 ; if (operation.failedOperation === "cancel" && actionId && canCancel) return ; diff --git a/apps/web/src/features/approvals/ApprovalPayloadSummary.tsx b/apps/web/src/features/approvals/ApprovalPayloadSummary.tsx index 385e84771..5a550f2d4 100644 --- a/apps/web/src/features/approvals/ApprovalPayloadSummary.tsx +++ b/apps/web/src/features/approvals/ApprovalPayloadSummary.tsx @@ -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") { diff --git a/apps/web/src/features/approvals/ApprovalPermissionDelta.tsx b/apps/web/src/features/approvals/ApprovalPermissionDelta.tsx index 57701ee11..f3c6e3f94 100644 --- a/apps/web/src/features/approvals/ApprovalPermissionDelta.tsx +++ b/apps/web/src/features/approvals/ApprovalPermissionDelta.tsx @@ -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; @@ -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 ( diff --git a/apps/web/src/features/approvals/ApprovalRunRepairPanel.tsx b/apps/web/src/features/approvals/ApprovalRunRepairPanel.tsx index 848f91a3f..bf1a4f4a6 100644 --- a/apps/web/src/features/approvals/ApprovalRunRepairPanel.tsx +++ b/apps/web/src/features/approvals/ApprovalRunRepairPanel.tsx @@ -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); diff --git a/apps/web/src/features/approvals/ApprovalSummary.tsx b/apps/web/src/features/approvals/ApprovalSummary.tsx index ea9486e68..ad971c1f5 100644 --- a/apps/web/src/features/approvals/ApprovalSummary.tsx +++ b/apps/web/src/features/approvals/ApprovalSummary.tsx @@ -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); diff --git a/apps/web/src/features/approvals/ApprovalTechnicalDetails.tsx b/apps/web/src/features/approvals/ApprovalTechnicalDetails.tsx index 87b18e7a9..fa260c20b 100644 --- a/apps/web/src/features/approvals/ApprovalTechnicalDetails.tsx +++ b/apps/web/src/features/approvals/ApprovalTechnicalDetails.tsx @@ -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 ( diff --git a/apps/web/src/features/approvals/ApprovalToolbar.tsx b/apps/web/src/features/approvals/ApprovalToolbar.tsx index 3e7f1c639..5d16d3057 100644 --- a/apps/web/src/features/approvals/ApprovalToolbar.tsx +++ b/apps/web/src/features/approvals/ApprovalToolbar.tsx @@ -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 (
diff --git a/apps/web/src/features/approvals/ApprovalsHeader.tsx b/apps/web/src/features/approvals/ApprovalsHeader.tsx index 28986c609..296a6e1c0 100644 --- a/apps/web/src/features/approvals/ApprovalsHeader.tsx +++ b/apps/web/src/features/approvals/ApprovalsHeader.tsx @@ -7,7 +7,7 @@ export function ApprovalsHeader({ }: { readonly pendingCount: number; readonly repairScoped: boolean; -}): JSX.Element { +}): React.JSX.Element { const { t } = useI18n(); return (
diff --git a/apps/web/src/features/approvals/ApprovalsPage.tsx b/apps/web/src/features/approvals/ApprovalsPage.tsx index 3c2a605a3..16c4ee12f 100644 --- a/apps/web/src/features/approvals/ApprovalsPage.tsx +++ b/apps/web/src/features/approvals/ApprovalsPage.tsx @@ -39,7 +39,7 @@ export function ApprovalsPage({ readonly onRouteExternalWork?: (externalWorkId: string, channelId: string) => void; readonly routingExternalWorkId?: string; readonly inlineApprovalIds?: ReadonlySet; -}): JSX.Element { +}): React.JSX.Element { const { t } = useI18n(); const controller = useApprovalsPageController({ approvals, repairRun, repairRunId, externalActionDetails, inlineApprovalIds, selectedApprovalId, isLoading, errorMessage, onSelectApproval }); const refresh = repairRunId ? () => onRefreshRepair(repairRunId) : onRefresh; diff --git a/apps/web/src/features/approvals/InlineApprovalStrip.tsx b/apps/web/src/features/approvals/InlineApprovalStrip.tsx index 11b24fa84..53d45b597 100644 --- a/apps/web/src/features/approvals/InlineApprovalStrip.tsx +++ b/apps/web/src/features/approvals/InlineApprovalStrip.tsx @@ -12,7 +12,7 @@ export function InlineApprovalStrip({ approvals, resolvingApprovals, onResolve, readonly resolvingApprovals: Readonly>; readonly onResolve: (approvalId: string, decision: ApprovalResolution, reason?: string) => void; readonly onOpenApproval: (approvalId: string) => void; -}): JSX.Element | null { +}): React.JSX.Element | null { const { t } = useI18n(); const [expanded, setExpanded] = useState(false); const uniqueApprovals = [...new Map(approvals.map((item) => [item.approval.id, item])).values()]; @@ -61,7 +61,7 @@ function InlineApprovalItem({ item, priority, resolvingDecision, onResolve, onOp readonly resolvingDecision?: ApprovalResolution; readonly onResolve: (approvalId: string, decision: ApprovalResolution, reason?: string) => void; readonly onOpenApproval: (approvalId: string) => void; -}): JSX.Element { +}): React.JSX.Element { const { t } = useI18n(); const isResolving = Boolean(resolvingDecision); return ( diff --git a/apps/web/src/features/approvals/ReviewQueueDetail.tsx b/apps/web/src/features/approvals/ReviewQueueDetail.tsx index 03313e5cb..fa5abf5d8 100644 --- a/apps/web/src/features/approvals/ReviewQueueDetail.tsx +++ b/apps/web/src/features/approvals/ReviewQueueDetail.tsx @@ -51,7 +51,7 @@ export function ReviewQueueDetail({ readonly onResolve: (approvalId: string, decision: ApprovalResolution, reason?: string) => void; readonly onExecuteExternalAction: (actionId: string) => void; readonly onCancelExternalAction: (actionId: string) => void; -}): JSX.Element { +}): React.JSX.Element { const { t } = useI18n(); if (initialLoading) return ; if (!row) { @@ -124,7 +124,7 @@ function QueueCategoryAction({ row, channels, routingExternalWorkId, onOpenRun, readonly onOpenRun: (runId: string) => void; readonly onOpenWorkBoard?: (scope?: "actionable" | "history") => void; readonly onRouteExternalWork?: (externalWorkId: string, channelId: string) => void; -}): JSX.Element | null { +}): React.JSX.Element | null { const { t } = useI18n(); if (row.category !== "route" && row.category !== "repair") return null; const externalWorkId = row.externalAction?.action.externalWorkId; @@ -156,7 +156,7 @@ function ReviewQueueRouteControl({ channels, currentChannelId, externalWorkId, r readonly externalWorkId: string; readonly routing: boolean; readonly onRouteExternalWork: (externalWorkId: string, channelId: string) => void; -}): JSX.Element { +}): React.JSX.Element { const { t } = useI18n(); const [targetChannelId, setTargetChannelId] = useState(""); useEffect(() => setTargetChannelId(""), [externalWorkId]); @@ -180,7 +180,7 @@ function ReviewQueueRouteControl({ channels, currentChannelId, externalWorkId, r ); } -function ReviewQueueDetailSkeleton(): JSX.Element { +function ReviewQueueDetailSkeleton(): React.JSX.Element { return (