import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'; import type { SharesStore } from '../client-data/shares.ts'; import type { RenameResult, SessionId, UseJobs } from './compat/types.ts'; import { NS } from './locales.ts'; /** Full props for the session-info sheet (header.utilities, second entry). */ export type MobileSessionInfoProps = PropsRuntime<'conversation.session.header.utilities'> & PropsLocale & { /** Bound ctx.sessions.fork({sessionId}). */ forkSession: (sessionId: SessionId) => Promise; /** Bound ctx.uiWorkspace.openSession(id) — lands on the freshly forked session. */ openSession: (id: SessionId) => void; /** Bound ctx.sessions.binding(id)?.session.rename(title); undefined when the binding is gone. */ renameSession: (sessionId: SessionId, title: string) => RenameResult | undefined; /** Bound ctx.workspaces.archiveSession(sessionId). */ archiveSession: (sessionId: SessionId) => Promise; /** Bound ctx.sessionLogDownload.download(sessionId) — owns its own progress/result modal. */ downloadSessionLog: (sessionId: SessionId) => Promise; /** * Job-roster hook, always present (fixed empty source when the `jobs` * service is absent — see index.tsx activityInject — so the hook is * called on every render and the hook count never varies). */ useJobs: UseJobs; /** Keeps the session's job roster stream open while the sheet's session is mounted. */ watchRows: (sessionId: SessionId) => () => void; /** * The page-wide shares store (T67) — the SAME singleton the title-row * icon and the menu item read, so this row adds no second poll loop. * Subscribed ONLY while the sheet is open (the phone shell must not * keep a 30 s admin/shares GET alive behind the gateway — the same * rule that keeps the icon unsubscribed there). */ shares: SharesStore; }; /** * Session-info sheet: the bottom sheet that gathers everything S3 pulled off * the composer (the official stats strip) and everything S2 left out of the * header (Chat/Trajectory as a real control, badges, session actions). * * Registered as a SECOND entry on `conversation.session.header.utilities` — * session scope, sibling to the ⓘ button that opens it * (MobileSessionHeader.tsx dispatches {@link SESSION_INFO_EVENT}). * * Mount-point choice (the plan's own tradeoff to weigh): this needs * `useProjection`/`sessionId` for the stats grid, and those are * session-scope-only standard props — `header.utilities` has them, * `shell.overlay` (S1's other option) does not. `shell.overlay` would have * gained nothing in exchange (GlobalStandardProps — `useSessions` for the * badges/subagent-count — is unconditional on every slot per * `PropsRuntime`, so this component gets it here for free too) while * running into a real problem: shell.overlay content renders inside the * `pI_x6G_overlayLayer`, a z-index:20 stacking context (AGENTS.md), and the * composer's own permission/model bottom sheets sit at z:60 — a * shell.overlay-hosted info sheet would render BEHIND an open composer * menu. Mounting inside the header's own DOM (outside that capped layer) * lets this sheet's z-index clear every other phone-shell float. */ export declare function MobileSessionInfo({ sessionId, useSessions, useProjection, forkSession, openSession, renameSession, archiveSession, downloadSessionLog, useJobs, watchRows, shares, t, }: MobileSessionInfoProps): import("react").JSX.Element | null; //# sourceMappingURL=MobileSessionInfo.d.ts.map