import type { UiMessage } from "@/data/dto/chat"; import type { PendingChatUnlockKind } from "@/lib/navigation/chat_unlock_session"; export type ChatUpgradeReason = "weekly_limit" | "insufficient_credits"; export interface ChatUnlockPaywallRequest { messageId: string; kind: PendingChatUnlockKind; reason: string; creditBalance: number; requiredCredits: number; shortfallCredits: number; } export interface ChatState { messages: UiMessage[]; isReplyingAI: boolean; pendingReplyCount: number; upgradePromptVisible: boolean; upgradeReason: ChatUpgradeReason | null; canSendMessage: boolean; cannotSendReason: string | null; creditBalance: number; creditsCharged: number; requiredCredits: number; shortfallCredits: number; isLoadingMore: boolean; hasMore: boolean; historyOffset: number; /** history 加载完成标志(initial load —— local → network → save 跑完) * - guestSession.initializing / user sessions initializing 走 always barrier * - 不被 `loadMoreHistoryActor` 设置(翻页是另一码事) */ historyLoaded: boolean; paymentUnlockPending: boolean; unlockHistoryPromptVisible: boolean; lockedHistoryCount: number; isUnlockingHistory: boolean; unlockHistoryError: string | null; isUnlockingMessage: boolean; unlockingMessageId: string | null; unlockingMessageKind: PendingChatUnlockKind | null; unlockMessageError: string | null; unlockPaywallRequest: ChatUnlockPaywallRequest | null; } export const initialState: ChatState = { messages: [], isReplyingAI: false, pendingReplyCount: 0, upgradePromptVisible: false, upgradeReason: null, canSendMessage: true, cannotSendReason: null, creditBalance: 0, creditsCharged: 0, requiredCredits: 0, shortfallCredits: 0, isLoadingMore: false, hasMore: true, historyOffset: 0, historyLoaded: false, paymentUnlockPending: false, unlockHistoryPromptVisible: false, lockedHistoryCount: 0, isUnlockingHistory: false, unlockHistoryError: null, isUnlockingMessage: false, unlockingMessageId: null, unlockingMessageKind: null, unlockMessageError: null, unlockPaywallRequest: null, };