import type { TeamChannel } from '../team-app-contract.js'; import type { TeamWorldTarget } from '../team-world-contract.js'; import type { ExploreModule } from '../explore-contract.js'; import type { TeamMessageIntent } from './team-messaging-events.js'; import type { ArkmeRecordingSearchIdentity, ArkmeRecordingTarget } from '../types.js'; import { type RecordOwnerId } from '../record-owner-id.js'; import type { ArkmeBotSummary, ArkmeSourceItem } from '../types.js'; import type { ArkmeExtensionShareAction } from './extension-share-deeplink.js'; import type { CodexConversationTarget } from './redesign/contacts/codex-conversation-target.js'; export interface ArkmeUiState { composerFocusRevision?: number; authRevision: number; chatRevision: number; recordRevision: number; topicDirectoryRevision: number; mode: 'login' | 'source' | 'bot' | 'calls' | 'recordings' | 'arrangements' | 'recognized-speakers' | 'world' | 'search' | 'extensions' | 'notifications' | 'voiceprint' | 'contact-add' | 'arko' | 'harness' | 'codex' | 'team' | 'explore' | 'statistics'; statisticsMonth?: string; calendarInitialDate?: string; exploreModule?: ExploreModule; codexTarget?: CodexConversationTarget; productMode?: 'conversations' | 'contacts'; selectedSource?: ArkmeSourceItem; selectedBot?: ArkmeBotSummary; teamIntent?: TeamMessageIntent; teamDirectory?: { teamRef?: string; channel?: TeamChannel; }; /** Forces a real conversation-surface commit for every native notification click, including the current source. */ notificationActivationRevision?: number; conversationUnreadJumpRevision?: number; conversationTarget?: { revision: number; itemUid: string; sendAtMillis: number; recordOwnerUserId?: RecordOwnerId; momentId?: string; contextRef?: string; systemRef?: string; transientHighlight?: boolean; openDetail?: boolean; }; recordingTarget?: ArkmeRecordingTarget; recordingReturnDateStamp?: number; searchTarget?: { revision: number; query: string; }; extensionShareRef?: string; extensionShareAction?: ArkmeExtensionShareAction; extensionDetailId?: string; extensionAuthorFilter?: ArkmeExtensionAuthorFilter; locationOpen?: boolean; calendarOpen?: boolean; worldTarget?: ArkmeWorldViewTarget; worldTeamTarget?: TeamWorldTarget; worldInteractionRef?: string; worldInitialScope?: 'all' | 'mine'; worldNavigationRevision?: number; /** Web-only login is an overlay so a logged-out Harness view remains in place. */ webLoginDialogOpen?: boolean; } export type ArkmeUiViewState = Omit; export interface ArkmeExtensionAuthorFilter { ownerUserId: number; ownerName: string; } export interface ArkmeWorldTarget { userId: number; displayName: string; avatarRef?: string; avatarFallback?: { kind: 'phone_default'; colorIndex: number; label: string; }; } export interface ArkmeContactWorldTarget extends ArkmeWorldTarget { contactRef: string; } export type ArkmeWorldViewTarget = ArkmeWorldTarget | ArkmeContactWorldTarget; export declare class ArkmeUiController { private state; private viewState; /** Runtime-only conversation memory. A fresh client always starts in Harness. */ private lastConversationDestination; /** Personal topic selection survives other conversations, but never an account/client session. */ private readonly lastTeamConversations; private readonly teamDirectoryScroll; private lastSelfSource; private readonly listeners; private settingsOpener; private conversationTargetRevision; private notificationActivationRevision; private searchTargetRevision; private recordingTargetRevision; readonly getSnapshot: () => ArkmeUiState; /** Navigation and presentation state, stable across projection-only invalidations. */ readonly getViewSnapshot: () => ArkmeUiViewState; readonly getChatRevision: () => number; readonly getTopicDirectoryRevision: () => number; readonly getRecordRevision: () => number; readonly subscribe: (listener: () => void) => (() => void); bindSettingsOpener(opener: (section?: ArkmeSettingsSection) => void): () => void; openDshSettings(section?: ArkmeSettingsSection): void; focusSendToSelf(focusComposer?: boolean): void; resumeSendToSelf(): void; /** Read-only access for previews; does not activate or change the remembered topic. */ getRememberedSelfSource(): ArkmeSourceItem | undefined; private rememberSelfSource; authChanged(authenticated?: boolean, resetSelection?: boolean): void; chatChanged(): void; topicDirectoryChanged(): void; recordChanged(): void; showLogin(): void; openWebLoginDialog(): void; closeWebLoginDialog(): void; showRecordings(): void; showCalls(): void; showArrangements(): void; showCalendar(): void; hideCalendar(): void; showWorld(scope?: 'all' | 'mine'): void; showWorldInteraction(interactionRef: string): void; showUserWorld(target: ArkmeWorldTarget): void; showContactWorld(target: ArkmeContactWorldTarget): void; showTeamWorld(target: TeamWorldTarget): void; backFromWorld(): void; showStatistics(month?: string): void; openCalendarDate(date: string): void; openLocation(): void; closeLocation(): void; showExplore(module: ExploreModule): void; showRecordingTarget(dateStamp: number, startAtMillis: number, segment?: ArkmeRecordingSearchIdentity, window?: import('../types.js').ArkmeRecordingWindow): void; showRecordingSummaryTarget(dateStamp: number, versionId?: string, window?: import('../types.js').ArkmeRecordingWindow): void; showRecordingTimelineTarget(dateStamp: number, versionId?: string, window?: import('../types.js').ArkmeRecordingWindow): void; showSearch(): void; showTagSearch(tagText: string): void; consumeSearchTarget(revision: number): void; showVoiceprint(): void; showRecognizedSpeakers(returnDateStamp?: number): void; showExtensions(): void; showAuthorExtensions(ownerUserId: number, ownerName: string): void; showExtensionDetail(extensionId: string): void; showTeamConversation(intent: TeamMessageIntent): void; resolveTeamDirectory(teamRef: string, channel: TeamChannel): void; closeTeamDirectory(): void; forgetTeamConversation(channel: TeamChannel): void; readTeamDirectoryScroll(key: string): number; rememberTeamDirectoryScroll(key: string, top: number): void; showConversations(): void; showNotifications(): void; locateNextUnreadConversation(): void; showContacts(): void; showContactAdd(): void; showArko(): void; showHarness(): void; showCodex(target?: CodexConversationTarget | null): void; openExtensionShare(shareRef: string, action?: ArkmeExtensionShareAction): void; dismissExtensionShare(): void; selectSource(source: ArkmeSourceItem): void; updateSelectedSourceProjection(source: ArkmeSourceItem): boolean; activateNotificationSource(source: ArkmeSourceItem): void; openBotConversation(bot: ArkmeBotSummary): void; showConversationTarget(source: ArkmeSourceItem, itemUid: string, sendAtMillis: number, recordOwnerUserId?: RecordOwnerId, momentId?: string, transientHighlight?: boolean, openDetail?: boolean, contextRef?: string, systemRef?: string): void; consumeConversationTarget(revision: number): void; private publish; private leaveContacts; } export declare const arkmeUi: ArkmeUiController; export type ArkmeSettingsSection = 'arkme-account' | 'arkme-usage' | 'arkme-data'; //# sourceMappingURL=ui-controller.d.ts.map