import { type ChatFirstAppRegistration, type ChatFirstAppLayoutPreference } from "@agent-native/core/client/agent-chat"; import { type ChatFirstAppItem, type ChatFirstCopy, type ChatFirstPrimaryTab } from "@agent-native/core/client/chat-first"; import { type ComponentType, type ReactNode } from "react"; export { buildChatFirstEmbedSessionInput } from "../workspace-app-host.js"; export type DispatchNavSection = "primary" | "operations"; export type DispatchNavIcon = ComponentType<{ size?: number | string; className?: string; }>; export interface DispatchNavItem { /** Stable id used for keys and navigation.view. Avoid built-in ids. */ id: string; /** React Router path for the tab, usually backed by an app/routes/*.tsx file. */ to: string; label: string; icon?: DispatchNavIcon; /** Defaults to "operations", which renders under the Admin control plane. */ section?: DispatchNavSection; /** Override active matching for nested or multi-route tools. */ match?: (pathname: string) => boolean; /** Canonical path inside the Admin shell for management tabs. */ adminTo?: string; } export interface DispatchExtensionConfig { /** Opt into the Codex/T3-like chat-first shell for chat routes. */ chatFirst?: boolean; /** Extra sidebar tabs supplied by the generated workspace. */ navItems?: readonly DispatchNavItem[]; /** Extra React Query keys to invalidate when Dispatch receives DB sync events. */ queryKeys?: readonly string[]; } export declare const CHAT_FIRST_SURFACE_PANEL_TOGGLE_CLASS_NAME = "absolute right-3 top-2 z-20"; export declare function useDispatchExtensions(): DispatchExtensionConfig | undefined; export declare function isElectronEmbeddedSearch(search: string): boolean; export declare function shouldAutoCollapseDispatchSidebar(pathname: string): boolean; export declare function formatThreadAge(updatedAt: number, now?: number): string; export declare function NavContent({ onNavigate, extensions, chatFirstMode, chatFirstEmbedded, collapsed, collapsible, onCollapsedChange, chatFirstAppLayout, onChatFirstAppLayoutChange, chatFirstApps, chatFirstAppsLoading, chatFirstAppsError, chatFirstActiveAppId, chatFirstActivePrimaryTab, onChatFirstNewChat, onChatFirstAppOpen, onChatFirstAppsRetry, }: { onNavigate?: () => void; extensions?: DispatchExtensionConfig; chatFirstMode?: boolean; chatFirstEmbedded?: boolean; collapsed?: boolean; collapsible?: boolean; onCollapsedChange?: (collapsed: boolean) => void; chatFirstAppLayout?: ChatFirstAppLayoutPreference; onChatFirstAppLayoutChange?: (layout: ChatFirstAppLayoutPreference) => void; chatFirstApps?: readonly ChatFirstAppItem[]; chatFirstAppsLoading?: boolean; chatFirstAppsError?: string | null; chatFirstActiveAppId?: string; chatFirstActivePrimaryTab?: ChatFirstPrimaryTab; onChatFirstNewChat?: () => void; onChatFirstAppOpen?: (app: ChatFirstAppItem) => void; onChatFirstAppsRetry?: () => void; }): import("node_modules/@types/react").JSX.Element; /** * Below 768px `ChatFirstSurfacePanel` is already a full-screen overlay * (surface-panel.tsx). Mounting the sub-app's own `AgentSidebar` chat rail * inside it too would stack a second full-screen shell on top of it, so the * rail only gets its own chat surface once there is room beside the panel. */ export declare function renderChatFirstAppSurfaceTab({ registration, embedPath, loading, isMobileSurface, copy, }: { registration: ChatFirstAppRegistration | null; embedPath: string; loading: boolean; isMobileSurface: boolean; copy: ChatFirstCopy; }): ReactNode; export declare function Layout({ children, extensions, agentPageHref, }: { children: ReactNode; extensions?: DispatchExtensionConfig; agentPageHref?: string; }): import("node_modules/@types/react").JSX.Element; //# sourceMappingURL=Layout.d.ts.map