import type { ArkmeRecordingCoverage, ArkmeRecordingDay, ArkmeTimelineItem, ArkmeRecordLocationObservation, ArkmeCallDetail, ArkmeCallHistoryItem, ArkmeSourceItem } from '../types.js'; /** Frontend read model, NOT a deployed HTTP contract. See docs/my-day-calendar.md. */ export type DayActivityKind = 'note' | 'private_chat' | 'group_chat' | 'call' | 'recording' | 'arko' | 'bot' | 'dsh'; /** A display filter may combine sources without changing their underlying identity. */ export type DayActivityFilter = DayActivityKind | 'all' | 'conversation'; export type DayActivityMode = 'activities' | 'records'; export interface DayActivityQuery { accountScope: string; bucketDate: string; timezone: string; mode: DayActivityMode; kind: DayActivityFilter; includeBackground: boolean; } export interface DayActivityEntry { /** Adapter-owned detail content version within the read session; independent of list cursors. */ detailRevision?: string; /** Shared text is distinct from the viewer's physical audio coverage. */ sharedRecording?: { detailRef?: string; sourceDigest: string; sourceLabel: string; }; /** Presentation only; image references retain the existing authorized image reader. */ avatar?: { [Key in 'avatarRef' | 'avatarRefs' | 'groupAvatar']?: ArkmeSourceItem[Key] | undefined; }; previewAuthor?: { name: string; remark?: string; }; /** Selected verbatim excerpts from the bounded loaded segment, never an AI summary. */ excerpts?: DayActivityExcerpt[]; location?: ArkmeRecordLocationObservation; /** Label-only location hint returned by the calendar index; coordinates stay protected. */ locationSummary?: { label?: string; capturedAtMillis?: number; }; canLoadLocation?: boolean; /** Explicit source identity, never a display name or a guessed participant. */ sourceIdentity?: string; statusLabel?: string; relatedCallId?: string; /** Source record ID or deterministic physical recording interval ID. */ id: string; kind: DayActivityKind; startAtMillis: number; endAtMillis: number; access: 'available' | 'restricted'; title: string; preview: string; sourceName: string; participant?: { name: string; remark?: string; }; recordCount: number; participation: 'self' | 'participated' | 'mentioned' | 'received' | 'background'; } export interface DayActivityExcerpt { id: string; text: string; author?: { name: string; remark?: string; }; self: boolean; } export interface DayActivityPage { /** Adapter must echo every query dimension; mismatched responses fail closed. */ query: DayActivityQuery; snapshotId: string; /** Existing domain readers use a local read-session ID, not an atomic backend snapshot. */ order?: 'ascending' | 'descending'; notice?: string; warnings?: string[]; /** Already generated recording-only material; never attached to one arbitrary activity. */ recordingReview?: Pick; /** Composite readers regroup their bounded loaded window when another page arrives. */ replaceItems?: boolean; items: DayActivityEntry[]; completeness: 'complete' | 'partial'; missingKinds: DayActivityKind[]; hasMore: boolean; nextCursor?: string; /** Day bounds supplied by the adapter, in the requested timezone (not always 24h). */ dayStartMillis: number; dayEndMillis: number; coverage?: ArkmeRecordingCoverage; speechIntervals?: Array<{ startAtMillis: number; endAtMillis: number; }>; } export interface DayActivityDetailPage { call?: { item: ArkmeCallHistoryItem; detail: ArkmeCallDetail; }; query: DayActivityQuery; activityId: string; snapshotId: string; access: 'available' | 'restricted'; items: Array<{ id: string; occurredAtMillis: number; author: { name: string; remark?: string; }; text: string; textFormat?: 'plain' | 'markdown'; content?: ArkmeTimelineItem; }>; hasMore: boolean; nextCursor?: string; /** Opaque authorized navigation target. Never an arbitrary URL. */ sourceRef?: string; } /** A read-only adapter. No send, read-receipt, recording, or mutation methods. */ export interface DayActivityReader { capabilities?: { kinds: readonly DayActivityKind[]; modes: readonly DayActivityMode[]; notice: string; autoLocationLimit?: number; background?: boolean; }; loadDay(query: DayActivityQuery, options: { signal: AbortSignal; cursor?: string; snapshotId?: string; onProgress?(page: DayActivityPage): void; }): Promise; loadDetail(query: DayActivityQuery, activityId: string, options: { signal: AbortSignal; snapshotId: string; cursor?: string; }): Promise; loadLocation?(query: DayActivityQuery, activityId: string, options: { signal: AbortSignal; snapshotId: string; }): Promise; } export interface DayActivityLocationDetail { query: DayActivityQuery; activityId: string; snapshotId: string; access: 'available' | 'restricted'; location?: ArkmeRecordLocationObservation; } export declare const dayActivityLabels: Record; export declare const dayActivityFilters: readonly [{ readonly kind: "all"; readonly label: string; }, { readonly kind: "note"; readonly label: "个人记录"; }, { readonly kind: "conversation"; readonly label: string; }, { readonly kind: "call"; readonly label: string; }, { readonly kind: "recording"; readonly label: string; }]; export declare function dayActivityMatchesFilter(filter: DayActivityFilter, kind: DayActivityKind): boolean; export declare function dayActivityQueryKey(query: DayActivityQuery): string; export declare function dayActivityDisplayName(person: { name: string; remark?: string; }): string; /** Do not rewrite free-text summaries or guess identities from a nickname. */ export declare function dayActivityTitle(entry: DayActivityEntry): string; export declare function mergeDayActivityItems(previous: readonly DayActivityEntry[], incoming: readonly DayActivityEntry[], order?: 'ascending' | 'descending'): DayActivityEntry[]; export declare function dayActivityTime(value: number, timezone: string): string; export declare function dayActivityPeriod(value: number, timezone: string): string; export declare function dayActivityOverview(items: readonly DayActivityEntry[], mode: DayActivityMode, reactionCount?: number): string; /** Clip each physical interval independently. A gap never becomes recorded time. */ export declare function dayActivityInterval(interval: { startAtMillis: number; endAtMillis: number; }, start: number, end: number): { left: string; width: string; } | undefined; //# sourceMappingURL=calendar-activity-model.d.ts.map