SYMBOL INDEX (3969 symbols across 833 files) FILE: free-todo-frontend/app/home/HomePageClient.tsx function HomePageClient (line 17) | function HomePageClient() { FILE: free-todo-frontend/app/home/HomePageEntry.tsx function HomePageEntry (line 11) | function HomePageEntry() { FILE: free-todo-frontend/app/island/layout.tsx function IslandLayout (line 20) | async function IslandLayout({ FILE: free-todo-frontend/app/island/page.tsx function IslandPage (line 16) | function IslandPage() { FILE: free-todo-frontend/app/layout.tsx type RootLayoutProps (line 14) | interface RootLayoutProps { function RootLayout (line 23) | async function RootLayout({ children }: RootLayoutProps) { FILE: free-todo-frontend/app/page.tsx function HomePage (line 3) | function HomePage() { FILE: free-todo-frontend/apps/achievements/AchievementsPanel.tsx function AchievementsPanel (line 11) | function AchievementsPanel() { FILE: free-todo-frontend/apps/activity/ActivityCard.tsx type ActivityCardProps (line 6) | interface ActivityCardProps { FILE: free-todo-frontend/apps/activity/ActivityDetail.tsx type ActivityDetailProps (line 12) | interface ActivityDetailProps { function ActivityDetail (line 18) | function ActivityDetail({ FILE: free-todo-frontend/apps/activity/ActivityHeader.tsx type ActivityHeaderProps (line 13) | interface ActivityHeaderProps { function ActivityHeader (line 18) | function ActivityHeader({ FILE: free-todo-frontend/apps/activity/ActivityPanel.tsx function ActivityPanel (line 12) | function ActivityPanel() { FILE: free-todo-frontend/apps/activity/ActivitySidebar.tsx type ActivitySidebarProps (line 6) | interface ActivitySidebarProps { function ActivitySidebar (line 13) | function ActivitySidebar({ FILE: free-todo-frontend/apps/activity/ActivitySummary.tsx type ActivitySummaryProps (line 4) | interface ActivitySummaryProps { function ActivitySummary (line 88) | function ActivitySummary({ summary }: ActivitySummaryProps) { FILE: free-todo-frontend/apps/activity/utils/timeUtils.ts constant ONE_MINUTE (line 3) | const ONE_MINUTE = 60 * 1000; constant ONE_HOUR (line 4) | const ONE_HOUR = 60 * ONE_MINUTE; constant ONE_DAY (line 5) | const ONE_DAY = 24 * ONE_HOUR; function toDate (line 7) | function toDate(value?: string | null): Date | null { function isSameDay (line 13) | function isSameDay(a: Date, b: Date): boolean { function isYesterday (line 21) | function isYesterday(target: Date, now: Date): boolean { function isSameWeek (line 27) | function isSameWeek(target: Date, now: Date): boolean { function formatRelativeTime (line 38) | function formatRelativeTime(time?: string | null): string { function formatTimeRange (line 62) | function formatTimeRange( type ActivityGroup (line 82) | type ActivityGroup = { function groupActivitiesByTime (line 87) | function groupActivitiesByTime(activities: Activity[]): ActivityGroup[] { FILE: free-todo-frontend/apps/audio/AudioPanel.tsx function AudioPanel (line 24) | function AudioPanel() { FILE: free-todo-frontend/apps/audio/components/AudioExtractionPanel.tsx type TodoItem (line 9) | type TodoItem = { type ScheduleItem (line 22) | type ScheduleItem = { type ExtractionPanelProps (line 33) | interface ExtractionPanelProps { function AudioExtractionPanel (line 54) | function AudioExtractionPanel({ FILE: free-todo-frontend/apps/audio/components/AudioHeader.tsx type AudioHeaderProps (line 8) | interface AudioHeaderProps { function AudioHeader (line 18) | function AudioHeader({ FILE: free-todo-frontend/apps/audio/components/AudioList.tsx type AudioRecording (line 6) | interface AudioRecording { type AudioListProps (line 15) | interface AudioListProps { function AudioList (line 20) | function AudioList({ recordings, onPlay }: AudioListProps) { FILE: free-todo-frontend/apps/audio/components/AudioPlayer.tsx type AudioPlayerProps (line 5) | interface AudioPlayerProps { function AudioPlayer (line 23) | function AudioPlayer({ FILE: free-todo-frontend/apps/audio/components/RecordingStatus.tsx type RecordingStatusProps (line 7) | interface RecordingStatusProps { function RecordingStatus (line 13) | function RecordingStatus({ isRecording, recordingStartedAt }: RecordingS... FILE: free-todo-frontend/apps/audio/components/StopRecordingConfirm.tsx type StopRecordingConfirmProps (line 3) | interface StopRecordingConfirmProps { function StopRecordingConfirm (line 9) | function StopRecordingConfirm({ isOpen, onCancel, onConfirm }: StopRecor... FILE: free-todo-frontend/apps/audio/components/TranscriptionView.tsx type TodoItem (line 7) | interface TodoItem { type ScheduleItem (line 15) | interface ScheduleItem { type TranscriptionViewProps (line 22) | interface TranscriptionViewProps { type TextSegment (line 40) | interface TextSegment { function TranscriptionView (line 45) | function TranscriptionView({ FILE: free-todo-frontend/apps/audio/hooks/useAudioData.ts type DateCacheData (line 13) | type DateCacheData = { constant MAX_CACHE_DAYS (line 26) | const MAX_CACHE_DAYS = 7; constant CACHE_EXPIRY_MS (line 27) | const CACHE_EXPIRY_MS = MAX_CACHE_DAYS * 24 * 60 * 60 * 1000; type TodoItem (line 29) | type TodoItem = { type ScheduleItem (line 40) | type ScheduleItem = { function useAudioData (line 51) | function useAudioData( FILE: free-todo-frontend/apps/audio/hooks/useAudioDateSwitching.ts type UseAudioDateSwitchingProps (line 6) | interface UseAudioDateSwitchingProps { function useAudioDateSwitching (line 35) | function useAudioDateSwitching({ FILE: free-todo-frontend/apps/audio/hooks/useAudioLink.ts type TodoItem (line 6) | type TodoItem = { type ScheduleItem (line 17) | type ScheduleItem = { type ExtractionData (line 28) | type ExtractionData = { function useAudioLink (line 37) | function useAudioLink() { FILE: free-todo-frontend/apps/audio/hooks/useAudioPlayback.ts function useAudioPlayback (line 5) | function useAudioPlayback() { FILE: free-todo-frontend/apps/audio/hooks/useAudioRecording.ts function useAudioRecording (line 12) | function useAudioRecording() { FILE: free-todo-frontend/apps/audio/hooks/useAudioRecordingControl.ts type UseAudioRecordingControlProps (line 8) | interface UseAudioRecordingControlProps { function useAudioRecordingControl (line 43) | function useAudioRecordingControl({ FILE: free-todo-frontend/apps/audio/hooks/useSegmentSync.ts type UseSegmentSyncOptions (line 5) | interface UseSegmentSyncOptions { type UseSegmentSyncReturn (line 16) | interface UseSegmentSyncReturn { function useSegmentSync (line 27) | function useSegmentSync({ FILE: free-todo-frontend/apps/audio/hooks/useStopRecordingConfirm.ts type UseStopRecordingConfirmOptions (line 6) | interface UseStopRecordingConfirmOptions { type UseStopRecordingConfirmReturn (line 13) | interface UseStopRecordingConfirmReturn { function useStopRecordingConfirm (line 26) | function useStopRecordingConfirm({ FILE: free-todo-frontend/apps/audio/utils/parseTimeToIsoWithDate.ts function parseTimeToIsoWithDate (line 6) | function parseTimeToIsoWithDate(raw: string | null | undefined, selected... FILE: free-todo-frontend/apps/audio/utils/timeUtils.ts function parseLocalDate (line 13) | function parseLocalDate(dateStr: string | Date): Date { function toLocalISOString (line 40) | function toLocalISOString(date: Date): string { function calculateSegmentOffset (line 63) | function calculateSegmentOffset( function calculateSegmentAbsoluteTime (line 88) | function calculateSegmentAbsoluteTime( function isRecordingCrossDate (line 102) | function isRecordingCrossDate( function getSegmentDate (line 131) | function getSegmentDate( function formatDateTime (line 146) | function formatDateTime(date: Date): string { function formatTime (line 163) | function formatTime(seconds: number): string { function getDateString (line 175) | function getDateString(date: Date): string { function getLocalDateString (line 187) | function getLocalDateString(date: Date): string { function getLocalDateStringForCompare (line 199) | function getLocalDateStringForCompare(date: Date): string { FILE: free-todo-frontend/apps/calendar/CalendarPanel.tsx function CalendarPanel (line 36) | function CalendarPanel() { FILE: free-todo-frontend/apps/calendar/components/DayColumn.tsx function DayColumn (line 16) | function DayColumn({ FILE: free-todo-frontend/apps/calendar/components/DraggableTodo.tsx function DraggableTodo (line 16) | function DraggableTodo({ FILE: free-todo-frontend/apps/calendar/components/FloatingTodoCard.tsx function FloatingTodoCard (line 13) | function FloatingTodoCard({ FILE: free-todo-frontend/apps/calendar/components/QuickCreateBar.tsx function QuickCreateBar (line 10) | function QuickCreateBar({ FILE: free-todo-frontend/apps/calendar/components/QuickCreatePopover.tsx function QuickCreatePopover (line 14) | function QuickCreatePopover({ FILE: free-todo-frontend/apps/calendar/components/TimelineColumn.tsx constant MIN_ITEM_HEIGHT (line 20) | const MIN_ITEM_HEIGHT = 24; constant DEADLINE_HEIGHT (line 21) | const DEADLINE_HEIGHT = 20; constant MAX_TIMELINE_MINUTES (line 22) | const MAX_TIMELINE_MINUTES = 24 * 60 - MINUTES_PER_SLOT; type ResizePreview (line 24) | interface ResizePreview { function TimelineColumn (line 30) | function TimelineColumn({ FILE: free-todo-frontend/apps/calendar/components/TimelineCreatePopover.tsx function TimelineCreatePopover (line 14) | function TimelineCreatePopover({ FILE: free-todo-frontend/apps/calendar/components/TimelineSlot.tsx function TimelineSlot (line 11) | function TimelineSlot({ FILE: free-todo-frontend/apps/calendar/components/TimelineTodoCard.tsx function TimelineTodoCard (line 14) | function TimelineTodoCard({ FILE: free-todo-frontend/apps/calendar/hooks/useMonthScroll.ts type ScrollDirection (line 5) | type ScrollDirection = "prev" | "next"; function getMonthKey (line 7) | function getMonthKey(date: Date) { function useMonthScroll (line 11) | function useMonthScroll({ FILE: free-todo-frontend/apps/calendar/types.ts type CalendarView (line 7) | type CalendarView = "month" | "week" | "day"; type CalendarTodo (line 9) | interface CalendarTodo { type CalendarDay (line 18) | interface CalendarDay { type TimelineItem (line 23) | interface TimelineItem { function getStatusStyle (line 32) | function getStatusStyle(status: TodoStatus): string { function getScheduleSeverity (line 45) | function getScheduleSeverity( FILE: free-todo-frontend/apps/calendar/utils.ts constant DEFAULT_NEW_TIME (line 5) | const DEFAULT_NEW_TIME = "09:00"; constant DEFAULT_WORK_START_MINUTES (line 6) | const DEFAULT_WORK_START_MINUTES = 8 * 60; constant DEFAULT_WORK_END_MINUTES (line 7) | const DEFAULT_WORK_END_MINUTES = 22 * 60; constant MINUTES_PER_SLOT (line 8) | const MINUTES_PER_SLOT = 15; constant DEFAULT_DURATION_MINUTES (line 9) | const DEFAULT_DURATION_MINUTES = 30; function startOfDay (line 11) | function startOfDay(date: Date): Date { function endOfDay (line 17) | function endOfDay(date: Date): Date { function addDays (line 23) | function addDays(date: Date, days: number): Date { function addMonths (line 29) | function addMonths(date: Date, months: number): Date { function startOfWeek (line 35) | function startOfWeek(date: Date): Date { function startOfMonth (line 43) | function startOfMonth(date: Date): Date { function endOfMonth (line 47) | function endOfMonth(date: Date): Date { function getWeekOfYear (line 51) | function getWeekOfYear(date: Date): number { function toDateKey (line 63) | function toDateKey(date: Date): string { function parseTodoDateTime (line 70) | function parseTodoDateTime(value?: string): Date | null { function parseScheduleTime (line 85) | function parseScheduleTime(value?: string): Date | null { function parseDeadline (line 102) | function parseDeadline(deadline?: string): Date | null { function isAllDayDeadlineString (line 106) | function isAllDayDeadlineString(value?: string): boolean { function formatHumanDate (line 120) | function formatHumanDate(date: Date): string { function formatMonthLabel (line 124) | function formatMonthLabel(date: Date): string { function formatTimeLabel (line 128) | function formatTimeLabel(date: Date | null, allDayText: string): string { function formatTimeRangeLabel (line 135) | function formatTimeRangeLabel(start: number, end: number): string { function formatMinutesLabel (line 139) | function formatMinutesLabel(minutes: number): string { function isSameDay (line 145) | function isSameDay(a: Date, b: Date): boolean { function getMinutesFromDate (line 153) | function getMinutesFromDate(date: Date): number { function addMinutes (line 157) | function addMinutes(date: Date, minutes: number): Date { function setMinutesOnDate (line 163) | function setMinutesOnDate(date: Date, minutes: number): Date { function floorToMinutes (line 169) | function floorToMinutes(minutes: number, step = MINUTES_PER_SLOT): number { function ceilToMinutes (line 173) | function ceilToMinutes(minutes: number, step = MINUTES_PER_SLOT): number { function clampMinutes (line 177) | function clampMinutes(value: number, min: number, max: number): number { function buildMonthDays (line 181) | function buildMonthDays( function buildWeekDays (line 192) | function buildWeekDays( FILE: free-todo-frontend/apps/calendar/views/DayView.tsx constant SLOT_HEIGHT (line 35) | const SLOT_HEIGHT = 12; type ParsedTodo (line 37) | interface ParsedTodo { function DayView (line 45) | function DayView({ FILE: free-todo-frontend/apps/calendar/views/MonthScroller.tsx type WeekKey (line 18) | type WeekKey = string; function getWeekKey (line 20) | function getWeekKey(date: Date): WeekKey { function MonthScroller (line 24) | function MonthScroller({ FILE: free-todo-frontend/apps/calendar/views/MonthView.tsx function MonthView (line 11) | function MonthView({ FILE: free-todo-frontend/apps/calendar/views/WeekView.tsx constant SLOT_HEIGHT (line 33) | const SLOT_HEIGHT = 12; type ParsedTodo (line 35) | interface ParsedTodo { function WeekView (line 43) | function WeekView({ FILE: free-todo-frontend/apps/calendar/views/useWeekViewActions.ts type UseWeekViewActionsParams (line 18) | interface UseWeekViewActionsParams { function useWeekViewActions (line 31) | function useWeekViewActions({ FILE: free-todo-frontend/apps/chat/ChatPanel.tsx function ChatPanel (line 17) | function ChatPanel() { FILE: free-todo-frontend/apps/chat/components/breakdown/BreakdownStageRenderer.tsx type BreakdownStageRendererProps (line 12) | type BreakdownStageRendererProps = { function BreakdownStageRenderer (line 31) | function BreakdownStageRenderer({ FILE: free-todo-frontend/apps/chat/components/breakdown/BreakdownSummary.tsx type BreakdownSummaryProps (line 10) | interface BreakdownSummaryProps { function SubtaskTree (line 18) | function SubtaskTree({ function BreakdownSummary (line 44) | function BreakdownSummary({ FILE: free-todo-frontend/apps/chat/components/breakdown/Questionnaire.tsx type QuestionnaireProps (line 9) | interface QuestionnaireProps { function Questionnaire (line 18) | function Questionnaire({ FILE: free-todo-frontend/apps/chat/components/input/ChatInputSection.tsx type ChatInputSectionProps (line 10) | type ChatInputSectionProps = { function ChatInputSection (line 29) | function ChatInputSection({ FILE: free-todo-frontend/apps/chat/components/input/InputBox.tsx type InputBoxProps (line 7) | type InputBoxProps = { constant MIN_TEXTAREA_HEIGHT (line 28) | const MIN_TEXTAREA_HEIGHT = 24; constant SINGLE_LINE_ROWS (line 30) | const SINGLE_LINE_ROWS = 1; constant MULTI_LINE_ROWS (line 32) | const MULTI_LINE_ROWS = 1; function InputBox (line 34) | function InputBox({ FILE: free-todo-frontend/apps/chat/components/input/LinkedTodos.tsx type LinkedTodosProps (line 4) | type LinkedTodosProps = { function LinkedTodos (line 14) | function LinkedTodos({ FILE: free-todo-frontend/apps/chat/components/input/PromptSuggestions.tsx type PromptSuggestion (line 8) | type PromptSuggestion = { type PromptSuggestionsProps (line 15) | type PromptSuggestionsProps = { function PromptSuggestions (line 20) | function PromptSuggestions({ FILE: free-todo-frontend/apps/chat/components/input/ToolSelector.tsx constant FREETODO_TOOLS (line 13) | const FREETODO_TOOLS = [ constant EXTERNAL_TOOLS (line 40) | const EXTERNAL_TOOLS = [ type ToolSelectorProps (line 51) | interface ToolSelectorProps { function ToolSelector (line 61) | function ToolSelector({ disabled = false }: ToolSelectorProps) { FILE: free-todo-frontend/apps/chat/components/layout/HeaderBar.tsx type HeaderBarProps (line 10) | type HeaderBarProps = { function HeaderBar (line 17) | function HeaderBar({ FILE: free-todo-frontend/apps/chat/components/layout/HistoryDrawer.tsx type HistoryDrawerProps (line 5) | type HistoryDrawerProps = { function HistoryDrawer (line 20) | function HistoryDrawer({ FILE: free-todo-frontend/apps/chat/components/layout/WelcomeGreetings.tsx type WelcomeGreetingsProps (line 7) | type WelcomeGreetingsProps = { function WelcomeGreetings (line 11) | function WelcomeGreetings({ FILE: free-todo-frontend/apps/chat/components/message/EditModeMessage.tsx type EditModeMessageProps (line 16) | type EditModeMessageProps = { type BlockAppendState (line 27) | type BlockAppendState = { function EditModeMessage (line 58) | function EditModeMessage({ FILE: free-todo-frontend/apps/chat/components/message/MarkdownComponents.tsx type MessageRole (line 4) | type MessageRole = "user" | "assistant"; function createMarkdownComponents (line 10) | function createMarkdownComponents( FILE: free-todo-frontend/apps/chat/components/message/MessageContent.tsx type MessageContentProps (line 14) | type MessageContentProps = { function MessageContent (line 18) | function MessageContent({ message }: MessageContentProps) { FILE: free-todo-frontend/apps/chat/components/message/MessageContextMenu.tsx type MessageContextMenuProps (line 10) | type MessageContextMenuProps = { function MessageContextMenu (line 20) | function MessageContextMenu({ FILE: free-todo-frontend/apps/chat/components/message/MessageItem.tsx type MessageItemProps (line 17) | type MessageItemProps = { function MessageItem (line 28) | function MessageItem({ FILE: free-todo-frontend/apps/chat/components/message/MessageList.tsx type MessageListProps (line 12) | type MessageListProps = { function MessageList (line 19) | function MessageList({ FILE: free-todo-frontend/apps/chat/components/message/MessageSources.tsx type MessageSourcesProps (line 5) | type MessageSourcesProps = { function MessageSources (line 10) | function MessageSources({ sources, messageId }: MessageSourcesProps) { FILE: free-todo-frontend/apps/chat/components/message/MessageTodoExtractionModal.tsx type ExtractedTodo (line 11) | interface ExtractedTodo { type MessageTodoExtractionModalProps (line 21) | interface MessageTodoExtractionModalProps { function MessageTodoExtractionModal (line 36) | function MessageTodoExtractionModal({ FILE: free-todo-frontend/apps/chat/components/message/MessageTodoExtractionPanel.tsx type ExtractedTodo (line 10) | interface ExtractedTodo { type MessageTodoExtractionPanelProps (line 16) | interface MessageTodoExtractionPanelProps { function MessageTodoExtractionPanel (line 23) | function MessageTodoExtractionPanel({ FILE: free-todo-frontend/apps/chat/components/message/SummaryStreaming.tsx type SummaryStreamingProps (line 8) | interface SummaryStreamingProps { function SummaryStreaming (line 41) | function SummaryStreaming({ streamingText }: SummaryStreamingProps) { FILE: free-todo-frontend/apps/chat/components/message/ToolCallLoading.tsx type ToolCallLoadingProps (line 5) | type ToolCallLoadingProps = { function ToolCallLoading (line 11) | function ToolCallLoading({ FILE: free-todo-frontend/apps/chat/components/message/ToolCallSteps.tsx type ToolCallStepsProps (line 8) | type ToolCallStepsProps = { function ToolCallSteps (line 17) | function ToolCallSteps({ steps, className }: ToolCallStepsProps) { type ToolCallStepItemProps (line 33) | type ToolCallStepItemProps = { function ToolCallStepItem (line 41) | function ToolCallStepItem({ step, t }: ToolCallStepItemProps) { FILE: free-todo-frontend/apps/chat/components/message/utils/messageContentUtils.ts constant TOOL_CALL_PATTERN (line 3) | const TOOL_CALL_PATTERN = /\[使用工具:\s*([^|\]]+)(?:\s*\|\s*([^\]]+))?\]/g; constant TOOL_EVENT_PREFIX (line 4) | const TOOL_EVENT_PREFIX = "[TOOL_EVENT:"; constant TOOL_EVENT_SUFFIX (line 5) | const TOOL_EVENT_SUFFIX = "]"; type ToolCall (line 7) | type ToolCall = { function extractToolCalls (line 16) | function extractToolCalls(content: string): Array { function removeToolCalls (line 37) | function removeToolCalls(content: string): string { function removeToolEvents (line 44) | function removeToolEvents(content: string): string { type WebSearchSources (line 77) | type WebSearchSources = Array<{ title: string; url: string }>; type ParsedWebSearchMessage (line 79) | type ParsedWebSearchMessage = { function parseWebSearchMessage (line 87) | function parseWebSearchMessage(content: string): ParsedWebSearchMessage { function processBodyWithCitations (line 126) | function processBodyWithCitations( FILE: free-todo-frontend/apps/chat/hooks/useBreakdownService.ts type GenerateQuestionsResponse (line 6) | interface GenerateQuestionsResponse { type GenerateSummaryResponse (line 10) | interface GenerateSummaryResponse { FILE: free-todo-frontend/apps/chat/hooks/useChatController.ts type UseChatControllerParams (line 17) | type UseChatControllerParams = { FILE: free-todo-frontend/apps/chat/hooks/useChatPrompts.ts type ChatPromptsResponse (line 8) | interface ChatPromptsResponse { function loadPrompts (line 27) | async function loadPrompts() { FILE: free-todo-frontend/apps/chat/hooks/useMessageExtraction.ts type ExtractionState (line 8) | type ExtractionState = { type UseMessageExtractionParams (line 18) | type UseMessageExtractionParams = { function useMessageExtraction (line 26) | function useMessageExtraction({ FILE: free-todo-frontend/apps/chat/hooks/useMessageScroll.ts function useMessageScroll (line 7) | function useMessageScroll( FILE: free-todo-frontend/apps/chat/hooks/usePlanParser.ts type TranslationFunction (line 8) | type TranslationFunction = ( type ChatPromptsResponse (line 13) | interface ChatPromptsResponse { function loadPrompts (line 27) | async function loadPrompts() { FILE: free-todo-frontend/apps/chat/hooks/useSendMessage.ts type UseSendMessageParams (line 31) | interface UseSendMessageParams { type SendMessageReturn (line 70) | interface SendMessageReturn { FILE: free-todo-frontend/apps/chat/hooks/useSessionCache.ts type SessionCacheReturn (line 7) | interface SessionCacheReturn { FILE: free-todo-frontend/apps/chat/hooks/useSessionManager.ts type ToolEvent (line 9) | type ToolEvent = { type UseSessionManagerParams (line 20) | interface UseSessionManagerParams { type SessionManagerReturn (line 52) | interface SessionManagerReturn { FILE: free-todo-frontend/apps/chat/hooks/useStreamController.ts type CreateRequestResult (line 7) | interface CreateRequestResult { type StreamControllerReturn (line 17) | interface StreamControllerReturn { FILE: free-todo-frontend/apps/chat/hooks/useToolCallTracker.ts type ToolCallTrackerReturn (line 8) | interface ToolCallTrackerReturn { FILE: free-todo-frontend/apps/chat/types.ts type ToolCallStatus (line 6) | type ToolCallStatus = "running" | "completed" | "error"; type ToolCallStep (line 11) | type ToolCallStep = { type ChatMessage (line 31) | type ChatMessage = { type ChatMode (line 39) | type ChatMode = "agno"; type ParsedTodo (line 41) | type ParsedTodo = Pick< type ParsedTodoTree (line 46) | type ParsedTodoTree = ParsedTodo & { subtasks?: ParsedTodoTree[] }; type EditContentBlock (line 49) | type EditContentBlock = { FILE: free-todo-frontend/apps/chat/utils/messageBuilder.ts type BuildPayloadMessageParams (line 4) | interface BuildPayloadMessageParams { type PayloadMessageResult (line 13) | interface PayloadMessageResult { FILE: free-todo-frontend/apps/chat/utils/parseEditBlocks.ts function parseEditBlocks (line 29) | function parseEditBlocks(content: string): EditContentBlock[] { function extractAppendToMarker (line 103) | function extractAppendToMarker(content: string): { function getCleanBlockContent (line 129) | function getCleanBlockContent(block: EditContentBlock): string { FILE: free-todo-frontend/apps/chat/utils/responseHandlers.ts function handleStreamError (line 7) | function handleStreamError( function handleEmptyResponse (line 41) | function handleEmptyResponse( FILE: free-todo-frontend/apps/chat/utils/todoContext.ts type TranslationFunction (line 3) | type TranslationFunction = ( FILE: free-todo-frontend/apps/cost-tracking/CostTrackingPanel.tsx constant DEFAULT_DAYS (line 16) | const DEFAULT_DAYS = 30; function CostTrackingPanel (line 18) | function CostTrackingPanel() { FILE: free-todo-frontend/apps/debug/DebugCapturePanel.tsx function DebugCapturePanel (line 22) | function DebugCapturePanel() { type DateGroupProps (line 232) | interface DateGroupProps { function DateGroup (line 248) | function DateGroup({ type LoadingIndicatorProps (line 310) | interface LoadingIndicatorProps { function LoadingIndicator (line 319) | function LoadingIndicator({ FILE: free-todo-frontend/apps/debug/components/EventCard.tsx type EventCardProps (line 15) | interface EventCardProps { function EventCard (line 30) | function EventCard({ type ScreenshotThumbnailsProps (line 180) | interface ScreenshotThumbnailsProps { function ScreenshotThumbnails (line 191) | function ScreenshotThumbnails({ FILE: free-todo-frontend/apps/debug/components/EventSearchForm.tsx type EventSearchFormProps (line 6) | interface EventSearchFormProps { function EventSearchForm (line 20) | function EventSearchForm({ FILE: free-todo-frontend/apps/debug/components/ScreenshotModal.tsx type ScreenshotModalProps (line 10) | interface ScreenshotModalProps { function ScreenshotModal (line 20) | function ScreenshotModal({ FILE: free-todo-frontend/apps/debug/components/SelectedEventsBar.tsx type SelectedEventsBarProps (line 6) | interface SelectedEventsBarProps { function SelectedEventsBar (line 17) | function SelectedEventsBar({ FILE: free-todo-frontend/apps/debug/hooks/useEventActions.ts type ExtractionResult (line 16) | interface ExtractionResult { type TranslationFunction (line 22) | type TranslationFunction = ( type UseEventActionsOptions (line 27) | interface UseEventActionsOptions { function useEventActions (line 37) | function useEventActions({ FILE: free-todo-frontend/apps/debug/hooks/useEventData.ts constant PAGE_SIZE (line 14) | const PAGE_SIZE = 10; type EventDetail (line 17) | interface EventDetail { type GroupedEvents (line 22) | interface GroupedEvents { function useEventData (line 31) | function useEventData() { FILE: free-todo-frontend/apps/debug/utils.ts function formatDate (line 8) | function formatDate(date: Date): string { constant WHITELIST_APPS (line 19) | const WHITELIST_APPS = [ function isWhitelistApp (line 34) | function isWhitelistApp(appName: string | null | undefined): boolean { FILE: free-todo-frontend/apps/diary/DiaryEditor.tsx type DiaryEditorProps (line 8) | interface DiaryEditorProps { function DiaryEditor (line 27) | function DiaryEditor({ FILE: free-todo-frontend/apps/diary/DiaryHeader.tsx type DiaryHeaderProps (line 7) | interface DiaryHeaderProps { function DiaryHeader (line 19) | function DiaryHeader({ FILE: free-todo-frontend/apps/diary/DiaryPanel.tsx function DiaryPanel (line 53) | function DiaryPanel() { FILE: free-todo-frontend/apps/diary/DiarySettings.tsx type DiarySettingsProps (line 7) | interface DiarySettingsProps { function DiarySettings (line 26) | function DiarySettings({ FILE: free-todo-frontend/apps/diary/DiaryTabs.tsx type JournalTab (line 6) | type JournalTab = "original" | "objective" | "ai"; type DiaryTabsProps (line 8) | interface DiaryTabsProps { function DiaryTabs (line 13) | function DiaryTabs({ activeTab, onChange }: DiaryTabsProps) { FILE: free-todo-frontend/apps/diary/JournalHistory.tsx type JournalHistoryProps (line 6) | interface JournalHistoryProps { function JournalHistory (line 18) | function JournalHistory({ FILE: free-todo-frontend/apps/diary/types.ts type JournalDraft (line 1) | interface JournalDraft { FILE: free-todo-frontend/apps/settings/SettingsPanel.tsx constant SETTINGS_CATEGORY_IDS (line 35) | const SETTINGS_CATEGORY_IDS: SettingsCategoryId[] = [ function SettingsPanel (line 47) | function SettingsPanel() { FILE: free-todo-frontend/apps/settings/components/AudioAsrConfigSection.tsx type AudioAsrConfigSectionProps (line 11) | interface AudioAsrConfigSectionProps { function AudioAsrConfigSection (line 20) | function AudioAsrConfigSection({ config, loading = false }: AudioAsrConf... FILE: free-todo-frontend/apps/settings/components/AudioConfigSection.tsx type AudioConfigSectionProps (line 10) | interface AudioConfigSectionProps { function AudioConfigSection (line 19) | function AudioConfigSection({ FILE: free-todo-frontend/apps/settings/components/AutoTodoDetectionSection.tsx type AutoTodoDetectionSectionProps (line 12) | interface AutoTodoDetectionSectionProps { function AutoTodoDetectionSection (line 20) | function AutoTodoDetectionSection({ FILE: free-todo-frontend/apps/settings/components/AutomationTasksSection.tsx type AutomationTasksSectionProps (line 25) | interface AutomationTasksSectionProps { function AutomationTasksSection (line 29) | function AutomationTasksSection({ FILE: free-todo-frontend/apps/settings/components/DifyConfigSection.tsx type DifyConfigSectionProps (line 10) | interface DifyConfigSectionProps { function DifyConfigSection (line 20) | function DifyConfigSection({ FILE: free-todo-frontend/apps/settings/components/DockDisplayModeSection.tsx type DockDisplayModeSectionProps (line 9) | interface DockDisplayModeSectionProps { function DockDisplayModeSection (line 16) | function DockDisplayModeSection({ FILE: free-todo-frontend/apps/settings/components/JournalSettingsSection.tsx function JournalSettingsSection (line 9) | function JournalSettingsSection() { FILE: free-todo-frontend/apps/settings/components/LlmConfigSection.tsx type LlmConfigSectionProps (line 14) | interface LlmConfigSectionProps { function LlmConfigSection (line 22) | function LlmConfigSection({ FILE: free-todo-frontend/apps/settings/components/NotificationPermissionSection.tsx type PermissionStatus (line 10) | type PermissionStatus = type TauriNotificationApi (line 17) | type TauriNotificationApi = { type NotificationPermissionSectionProps (line 41) | interface NotificationPermissionSectionProps { function NotificationPermissionSection (line 45) | function NotificationPermissionSection({ FILE: free-todo-frontend/apps/settings/components/OnboardingSection.tsx type OnboardingSectionProps (line 8) | interface OnboardingSectionProps { function OnboardingSection (line 16) | function OnboardingSection({ loading = false }: OnboardingSectionProps) { FILE: free-todo-frontend/apps/settings/components/PanelSwitchesSection.tsx type PanelSwitchesSectionProps (line 17) | interface PanelSwitchesSectionProps { function PanelSwitchesSection (line 24) | function PanelSwitchesSection({ FILE: free-todo-frontend/apps/settings/components/RecorderConfigSection.tsx type RecorderConfigSectionProps (line 11) | interface RecorderConfigSectionProps { function RecorderConfigSection (line 20) | function RecorderConfigSection({ FILE: free-todo-frontend/apps/settings/components/SchedulerSection.tsx constant LEGACY_JOB_IDS (line 24) | const LEGACY_JOB_IDS = ["task_context_mapper_job", "task_summary_job"]; type SchedulerSectionProps (line 26) | interface SchedulerSectionProps { function SchedulerSection (line 33) | function SchedulerSection({ loading = false }: SchedulerSectionProps) { FILE: free-todo-frontend/apps/settings/components/SettingsCategoryPanel.tsx type SettingsCategoryId (line 8) | type SettingsCategoryId = type SettingsCategory (line 15) | interface SettingsCategory { type SettingsCategoryPanelProps (line 22) | interface SettingsCategoryPanelProps { function SettingsCategoryPanel (line 30) | function SettingsCategoryPanel({ FILE: free-todo-frontend/apps/settings/components/SettingsSearchAction.tsx type SettingsSearchActionProps (line 12) | interface SettingsSearchActionProps { function SettingsSearchAction (line 17) | function SettingsSearchAction({ FILE: free-todo-frontend/apps/settings/components/SettingsSection.tsx function SettingsSearchProvider (line 16) | function SettingsSearchProvider({ function SettingsSearchMatchProvider (line 30) | function SettingsSearchMatchProvider({ type SettingsSectionProps (line 60) | interface SettingsSectionProps { function SettingsSection (line 70) | function SettingsSection({ FILE: free-todo-frontend/apps/settings/components/TavilyConfigSection.tsx type TavilyConfigSectionProps (line 12) | interface TavilyConfigSectionProps { function TavilyConfigSection (line 22) | function TavilyConfigSection({ FILE: free-todo-frontend/apps/settings/components/ToggleSwitch.tsx type ToggleSwitchProps (line 3) | interface ToggleSwitchProps { function ToggleSwitch (line 14) | function ToggleSwitch({ FILE: free-todo-frontend/apps/settings/components/VersionInfoSection.tsx function VersionInfoSection (line 9) | function VersionInfoSection() { FILE: free-todo-frontend/apps/settings/hooks/useSettingsSearchMatchStats.ts type UseSettingsSearchMatchStatsOptions (line 6) | interface UseSettingsSearchMatchStatsOptions { function useSettingsSearchMatchStats (line 11) | function useSettingsSearchMatchStats({ FILE: free-todo-frontend/apps/todo-detail/TodoDetail.tsx function TodoDetail (line 36) | function TodoDetail() { FILE: free-todo-frontend/apps/todo-detail/components/ArtifactsView.tsx type ArtifactsViewProps (line 20) | interface ArtifactsViewProps { function ArtifactsView (line 41) | function ArtifactsView({ FILE: free-todo-frontend/apps/todo-detail/components/AttachmentPreviewPanel.tsx type AttachmentPreviewPanelProps (line 9) | interface AttachmentPreviewPanelProps { function AttachmentPreviewPanel (line 26) | function AttachmentPreviewPanel({ FILE: free-todo-frontend/apps/todo-detail/components/BackgroundSection.tsx type BackgroundSectionProps (line 10) | interface BackgroundSectionProps { function BackgroundSection (line 17) | function BackgroundSection({ FILE: free-todo-frontend/apps/todo-detail/components/ChildTodoSection.tsx type ChildTodoSectionProps (line 16) | interface ChildTodoSectionProps { function ChildTodoSection (line 27) | function ChildTodoSection({ FILE: free-todo-frontend/apps/todo-detail/components/DatePickerCalendar.tsx type MonthNavigationProps (line 15) | interface MonthNavigationProps { function MonthNavigation (line 23) | function MonthNavigation({ type WeekdayHeaderProps (line 67) | interface WeekdayHeaderProps { function WeekdayHeader (line 71) | function WeekdayHeader({ tCalendar }: WeekdayHeaderProps) { type CalendarGridProps (line 89) | interface CalendarGridProps { function CalendarGrid (line 98) | function CalendarGrid({ FILE: free-todo-frontend/apps/todo-detail/components/DatePickerPopover.tsx type DatePickerPopoverProps (line 36) | interface DatePickerPopoverProps { constant POPOVER_MARGIN (line 48) | const POPOVER_MARGIN = 8; type TabKey (line 50) | type TabKey = "date" | "range"; type DateTarget (line 52) | type DateTarget = "start" | "end"; function DatePickerPopover (line 54) | function DatePickerPopover({ FILE: free-todo-frontend/apps/todo-detail/components/DatePickerSidePanel.tsx type TabKey (line 9) | type TabKey = "date" | "range"; type DateTarget (line 10) | type DateTarget = "start" | "end"; type DatePickerSidePanelProps (line 12) | interface DatePickerSidePanelProps { function DatePickerSidePanel (line 33) | function DatePickerSidePanel({ FILE: free-todo-frontend/apps/todo-detail/components/DetailHeader.tsx type DetailHeaderProps (line 11) | interface DetailHeaderProps { function DetailHeader (line 18) | function DetailHeader({ FILE: free-todo-frontend/apps/todo-detail/components/DetailTitle.tsx type DetailTitleProps (line 6) | interface DetailTitleProps { function DetailTitle (line 11) | function DetailTitle({ name, onNameChange }: DetailTitleProps) { FILE: free-todo-frontend/apps/todo-detail/components/MetaSection.tsx type MetaSectionProps (line 17) | interface MetaSectionProps { function MetaSection (line 25) | function MetaSection({ FILE: free-todo-frontend/apps/todo-detail/components/NotesEditor.tsx type NotesEditorProps (line 13) | interface NotesEditorProps { function NotesEditor (line 21) | function NotesEditor({ FILE: free-todo-frontend/apps/todo-detail/components/datePickerUtils.ts constant FALLBACK_TIMEZONES (line 8) | const FALLBACK_TIMEZONES = [ constant DEFAULT_TIME (line 18) | const DEFAULT_TIME = "09:00"; constant DEFAULT_RANGE_MINUTES (line 19) | const DEFAULT_RANGE_MINUTES = 60; FILE: free-todo-frontend/apps/todo-detail/hooks/useNotesAutosize.ts function useNotesAutosize (line 3) | function useNotesAutosize(deps: unknown[]) { FILE: free-todo-frontend/apps/todo-detail/utils/date-utils.ts type CalendarDay (line 12) | interface CalendarDay { function startOfDay (line 28) | function startOfDay(date: Date): Date { function addDays (line 39) | function addDays(date: Date, days: number): Date { function startOfWeek (line 48) | function startOfWeek(date: Date): Date { function startOfMonth (line 59) | function startOfMonth(date: Date): Date { function toDateKey (line 66) | function toDateKey(date: Date): string { function buildMonthDays (line 78) | function buildMonthDays(currentDate: Date): CalendarDay[] { constant WEEKDAY_KEYS (line 98) | const WEEKDAY_KEYS = [ type WeekdayKey (line 108) | type WeekdayKey = (typeof WEEKDAY_KEYS)[number]; FILE: free-todo-frontend/apps/todo-detail/utils/holiday-utils.ts type HolidayInfo (line 9) | interface HolidayInfo { type YearHolidayConfig (line 19) | type YearHolidayConfig = Record; constant HOLIDAYS_2025 (line 25) | const HOLIDAYS_2025: YearHolidayConfig = { constant HOLIDAYS_2026 (line 39) | const HOLIDAYS_2026: YearHolidayConfig = { constant HOLIDAYS_BY_YEAR (line 49) | const HOLIDAYS_BY_YEAR: Record = { function getHolidayInfo (line 59) | function getHolidayInfo(date: Date): HolidayInfo | null { function isHoliday (line 78) | function isHoliday(date: Date): boolean { function isWorkday (line 88) | function isWorkday(date: Date): boolean { FILE: free-todo-frontend/apps/todo-detail/utils/lunar-utils.ts constant LUNAR_INFO (line 10) | const LUNAR_INFO = [ constant LUNAR_MONTH (line 40) | const LUNAR_MONTH = [ constant LUNAR_DAY (line 56) | const LUNAR_DAY = [ constant SOLAR_TERMS (line 90) | const SOLAR_TERMS = [ constant SOLAR_TERM_DAYS (line 118) | const SOLAR_TERM_DAYS: Record = { function lYearDays (line 136) | function lYearDays(y: number): number { function leapMonth (line 148) | function leapMonth(y: number): number { function leapDays (line 155) | function leapDays(y: number): number { function monthDays (line 165) | function monthDays(y: number, m: number): number { type LunarDate (line 172) | interface LunarDate { function getLunarDate (line 183) | function getLunarDate(date: Date): LunarDate { function getLunarDayText (line 238) | function getLunarDayText(date: Date): string { FILE: free-todo-frontend/apps/todo-list/CreateTodoForm.tsx type CreateTodoFormProps (line 9) | interface CreateTodoFormProps { function CreateTodoForm (line 13) | function CreateTodoForm({ onSuccess }: CreateTodoFormProps) { FILE: free-todo-frontend/apps/todo-list/NewTodoInlineForm.tsx type NewTodoInlineFormProps (line 8) | interface NewTodoInlineFormProps { function NewTodoInlineForm (line 15) | function NewTodoInlineForm({ FILE: free-todo-frontend/apps/todo-list/TodoCard.tsx type TodoCardProps (line 23) | interface TodoCardProps { function TodoCard (line 34) | function TodoCard({ FILE: free-todo-frontend/apps/todo-list/TodoExtractionModal.tsx type TodoExtractionModalProps (line 12) | interface TodoExtractionModalProps { function TodoExtractionModal (line 20) | function TodoExtractionModal({ FILE: free-todo-frontend/apps/todo-list/TodoList.tsx function TodoList (line 27) | function TodoList() { FILE: free-todo-frontend/apps/todo-list/TodoToolbar.tsx type TodoToolbarProps (line 16) | interface TodoToolbarProps { function TodoToolbar (line 24) | function TodoToolbar({ FILE: free-todo-frontend/apps/todo-list/TodoTreeList.tsx type TodoTreeListProps (line 18) | interface TodoTreeListProps { function TodoTreeList (line 25) | function TodoTreeList({ FILE: free-todo-frontend/apps/todo-list/components/TodoCardCheckbox.tsx type TodoCardCheckboxProps (line 6) | interface TodoCardCheckboxProps { function TodoCardCheckbox (line 11) | function TodoCardCheckbox({ todo, onToggle }: TodoCardCheckboxProps) { FILE: free-todo-frontend/apps/todo-list/components/TodoCardChildForm.tsx type TodoCardChildFormProps (line 5) | interface TodoCardChildFormProps { function TodoCardChildForm (line 13) | function TodoCardChildForm({ FILE: free-todo-frontend/apps/todo-list/components/TodoCardDropZone.tsx type TodoCardDropZoneProps (line 6) | interface TodoCardDropZoneProps { function TodoCardDropZone (line 10) | function TodoCardDropZone({ droppable }: TodoCardDropZoneProps) { FILE: free-todo-frontend/apps/todo-list/components/TodoCardExpandButton.tsx type TodoCardExpandButtonProps (line 5) | interface TodoCardExpandButtonProps { function TodoCardExpandButton (line 11) | function TodoCardExpandButton({ FILE: free-todo-frontend/apps/todo-list/components/TodoCardMetadata.tsx type TodoCardMetadataProps (line 5) | interface TodoCardMetadataProps { function TodoCardMetadata (line 9) | function TodoCardMetadata({ todo }: TodoCardMetadataProps) { FILE: free-todo-frontend/apps/todo-list/components/TodoCardName.tsx type TodoCardNameProps (line 5) | interface TodoCardNameProps { function TodoCardName (line 16) | function TodoCardName({ FILE: free-todo-frontend/apps/todo-list/components/TodoFilter.tsx type DueTimeFilter (line 10) | type DueTimeFilter = type TodoFilterState (line 19) | interface TodoFilterState { type TodoFilterProps (line 25) | interface TodoFilterProps { function TodoFilter (line 31) | function TodoFilter({ todos, filter, onFilterChange }: TodoFilterProps) { FILE: free-todo-frontend/apps/todo-list/hooks/useOrderedTodos.ts type OrderedTodo (line 6) | type OrderedTodo = { function isDueTimeMatch (line 11) | function isDueTimeMatch(todo: Todo, dueTimeFilter: DueTimeFilter): boole... function useOrderedTodos (line 68) | function useOrderedTodos( FILE: free-todo-frontend/apps/todo-list/hooks/useTodoCardDrag.ts type UseTodoCardDragParams (line 9) | interface UseTodoCardDragParams { function useTodoCardDrag (line 15) | function useTodoCardDrag({ FILE: free-todo-frontend/apps/todo-list/hooks/useTodoCardHandlers.ts type UseTodoCardHandlersParams (line 10) | interface UseTodoCardHandlersParams { function useTodoCardHandlers (line 20) | function useTodoCardHandlers({ FILE: free-todo-frontend/apps/todo-list/hooks/useTodoCardState.ts function useTodoCardState (line 4) | function useTodoCardState(todo: Todo) { FILE: free-todo-frontend/apps/todo-list/utils/todoCardUtils.ts function formatScheduleLabel (line 6) | function formatScheduleLabel( function getPriorityBorderColor (line 50) | function getPriorityBorderColor(priority: TodoPriority): string { FILE: free-todo-frontend/components/common/ReminderOptions.tsx type ReminderOptionsProps (line 13) | interface ReminderOptionsProps { function ReminderOptions (line 20) | function ReminderOptions({ FILE: free-todo-frontend/components/common/context-menu/BaseContextMenu.tsx type MenuItem (line 8) | interface MenuItem { type BaseContextMenuProps (line 18) | interface BaseContextMenuProps { function BaseContextMenu (line 40) | function BaseContextMenu({ function useContextMenu (line 130) | function useContextMenu() { FILE: free-todo-frontend/components/common/context-menu/MultiTodoContextMenu.tsx type MultiTodoContextMenuProps (line 15) | interface MultiTodoContextMenuProps { function MultiTodoContextMenu (line 20) | function MultiTodoContextMenu({ FILE: free-todo-frontend/components/common/context-menu/TodoContextMenu.tsx type TodoContextMenuProps (line 18) | interface TodoContextMenuProps { function TodoContextMenu (line 27) | function TodoContextMenu({ FILE: free-todo-frontend/components/common/layout/CollapsibleSection.tsx type CollapsibleSectionProps (line 7) | interface CollapsibleSectionProps { function CollapsibleSection (line 19) | function CollapsibleSection({ FILE: free-todo-frontend/components/common/layout/LayoutSelector.tsx type LayoutSelectorProps (line 28) | interface LayoutSelectorProps { function LayoutSelector (line 42) | function LayoutSelector({ FILE: free-todo-frontend/components/common/layout/LayoutSelectorDialogs.tsx type LayoutFormMode (line 28) | type LayoutFormMode = "save" | "rename"; type LayoutFormState (line 30) | interface LayoutFormState { type OverwriteConfirmState (line 36) | interface OverwriteConfirmState { type Translator (line 42) | type Translator = ReturnType; type LayoutSelectorDialogsProps (line 44) | interface LayoutSelectorDialogsProps { function LayoutSelectorDialogs (line 61) | function LayoutSelectorDialogs({ FILE: free-todo-frontend/components/common/layout/PanelHeader.tsx type PanelIconStyleConfig (line 40) | interface PanelIconStyleConfig { type PanelActionButtonStyleConfig (line 54) | interface PanelActionButtonStyleConfig { constant DEFAULT_HEADER_ICON_STYLE (line 79) | const DEFAULT_HEADER_ICON_STYLE: PanelIconStyleConfig = { constant DEFAULT_ACTION_ICON_STYLE (line 90) | const DEFAULT_ACTION_ICON_STYLE: PanelIconStyleConfig = { constant DEFAULT_ACTION_BUTTON_STYLE (line 107) | const DEFAULT_ACTION_BUTTON_STYLE: PanelActionButtonStyleConfig = { constant PRIMARY_ACTION_BUTTON_STYLE (line 120) | const PRIMARY_ACTION_BUTTON_STYLE: PanelActionButtonStyleConfig = { constant DESTRUCTIVE_ACTION_BUTTON_STYLE (line 128) | const DESTRUCTIVE_ACTION_BUTTON_STYLE: PanelActionButtonStyleConfig = { type PanelIconConfigContextValue (line 139) | interface PanelIconConfigContextValue { function PanelIconConfigProvider (line 164) | function PanelIconConfigProvider({ function usePanelIconStyle (line 212) | function usePanelIconStyle( function usePanelActionButtonStyle (line 235) | function usePanelActionButtonStyle( type PanelActionButtonProps (line 266) | interface PanelActionButtonProps function PanelActionButton (line 280) | function PanelActionButton({ function usePanelPosition (line 315) | function usePanelPosition(): PanelPosition | null { function PanelPositionProvider (line 319) | function PanelPositionProvider({ function PanelHeaderMenu (line 333) | function PanelHeaderMenu({ position }: { position: PanelPosition }) { type PanelHeaderProps (line 446) | interface PanelHeaderProps { function PanelHeader (line 461) | function PanelHeader({ FILE: free-todo-frontend/components/common/layout/SectionHeader.tsx type SectionHeaderProps (line 7) | interface SectionHeaderProps { function SectionHeader (line 18) | function SectionHeader({ FILE: free-todo-frontend/components/common/theme/ThemeProvider.tsx type ThemeProviderProps (line 7) | interface ThemeProviderProps { function ColorThemeApplier (line 11) | function ColorThemeApplier() { function ThemeProvider (line 22) | function ThemeProvider({ children }: ThemeProviderProps) { FILE: free-todo-frontend/components/common/theme/ThemeStyleSelect.tsx function ThemeStyleSelect (line 9) | function ThemeStyleSelect() { FILE: free-todo-frontend/components/common/theme/ThemeToggle.tsx function ThemeToggle (line 8) | function ThemeToggle() { FILE: free-todo-frontend/components/common/ui/BackendReadyGate.tsx type BackendReadyGateProps (line 7) | interface BackendReadyGateProps { function getBackendHealthUrl (line 11) | function getBackendHealthUrl(): string { function BackendReadyGate (line 16) | function BackendReadyGate({ children }: BackendReadyGateProps) { FILE: free-todo-frontend/components/common/ui/CapabilitiesSync.tsx type CapabilitiesResponse (line 9) | type CapabilitiesResponse = { function computeBackendDisabledFeatures (line 16) | function computeBackendDisabledFeatures( function CapabilitiesSync (line 37) | function CapabilitiesSync() { FILE: free-todo-frontend/components/common/ui/DockTriggerZone.tsx function DockTriggerZone (line 13) | function DockTriggerZone() { FILE: free-todo-frontend/components/common/ui/FrontendBoot.tsx function FrontendBoot (line 1) | function FrontendBoot() { FILE: free-todo-frontend/components/common/ui/LanguageToggle.tsx function LanguageToggle (line 9) | function LanguageToggle() { FILE: free-todo-frontend/components/common/ui/LocaleSync.tsx function syncLocaleToCookie (line 12) | function syncLocaleToCookie(locale: string) { function LocaleSync (line 30) | function LocaleSync() { FILE: free-todo-frontend/components/common/ui/ScrollbarController.tsx function ScrollbarController (line 10) | function ScrollbarController() { FILE: free-todo-frontend/components/common/ui/SettingsToggle.tsx function SettingsToggle (line 14) | function SettingsToggle() { FILE: free-todo-frontend/components/common/ui/UserAvatar.tsx function UserAvatar (line 6) | function UserAvatar() { FILE: free-todo-frontend/components/date-picker/DateOnlyPickerCalendar.tsx type MonthNavigationProps (line 15) | interface MonthNavigationProps { function MonthNavigation (line 22) | function MonthNavigation({ type WeekdayHeaderProps (line 56) | interface WeekdayHeaderProps { function WeekdayHeader (line 60) | function WeekdayHeader({ tCalendar }: WeekdayHeaderProps) { type CalendarGridProps (line 78) | interface CalendarGridProps { function CalendarGrid (line 84) | function CalendarGrid({ FILE: free-todo-frontend/components/date-picker/DateOnlyPickerPopover.tsx type DateOnlyPickerPopoverProps (line 17) | interface DateOnlyPickerPopoverProps { constant POPOVER_MARGIN (line 24) | const POPOVER_MARGIN = 8; function DateOnlyPickerPopover (line 26) | function DateOnlyPickerPopover({ FILE: free-todo-frontend/components/date-picker/date-picker-utils.ts type CalendarDay (line 3) | interface CalendarDay { constant WEEKDAY_KEYS (line 50) | const WEEKDAY_KEYS = [ type WeekdayKey (line 60) | type WeekdayKey = (typeof WEEKDAY_KEYS)[number]; FILE: free-todo-frontend/components/island/DynamicIsland.tsx type DynamicIslandProps (line 19) | interface DynamicIslandProps { FILE: free-todo-frontend/components/island/IslandContent.tsx type IconButtonProps (line 27) | interface IconButtonProps { type FloatContentProps (line 54) | interface FloatContentProps { type PopupContentProps (line 112) | interface PopupContentProps { FILE: free-todo-frontend/components/island/IslandFullscreenContent.tsx type IslandFullscreenContentProps (line 18) | interface IslandFullscreenContentProps { function IslandFullscreenContent (line 22) | function IslandFullscreenContent({ onModeChange }: IslandFullscreenConte... FILE: free-todo-frontend/components/island/IslandHeader.tsx type IslandHeaderProps (line 22) | interface IslandHeaderProps { function IslandHeader (line 35) | function IslandHeader({ mode, onModeChange, isExpanded = false, onDragSt... FILE: free-todo-frontend/components/island/IslandSidebarContent.tsx type IslandSidebarContentProps (line 23) | interface IslandSidebarContentProps { function IslandSidebarContent (line 31) | function IslandSidebarContent({ onModeChange, onHeaderDragStart, isDragg... FILE: free-todo-frontend/components/layout/AppHeader.tsx type AppHeaderProps (line 18) | interface AppHeaderProps { function AppHeader (line 23) | function AppHeader({ hasNotifications = false }: AppHeaderProps) { FILE: free-todo-frontend/components/layout/BottomDock.tsx constant DOCK_ANIMATION_CONFIG (line 18) | const DOCK_ANIMATION_CONFIG = { constant DOCK_TRIGGER_ZONE (line 28) | const DOCK_TRIGGER_ZONE = 80; constant HIDE_DELAY_MS (line 29) | const HIDE_DELAY_MS = 1000; constant DOCK_BOTTOM_OFFSET (line 30) | const DOCK_BOTTOM_OFFSET = 12; constant PANEL_VISIBLE_OFFSET (line 31) | const PANEL_VISIBLE_OFFSET = 8; type BottomDockProps (line 33) | interface BottomDockProps { type DockItem (line 45) | interface DockItem { constant FEATURE_LABEL_MAP (line 54) | const FEATURE_LABEL_MAP: Partial> = { function getFeatureLabelKey (line 69) | function getFeatureLabelKey(feature: PanelFeature): string { type DockItemButtonProps (line 74) | interface DockItemButtonProps { function DockItemButton (line 85) | function DockItemButton({ function BottomDock (line 201) | function BottomDock({ FILE: free-todo-frontend/components/layout/FullscreenHeader.tsx type MaximizeHeaderProps (line 15) | interface MaximizeHeaderProps { function MaximizeHeader (line 19) | function MaximizeHeader({ hasNotifications }: MaximizeHeaderProps) { FILE: free-todo-frontend/components/layout/PanelContainer.tsx type PanelContainerProps (line 10) | interface PanelContainerProps { constant ANIMATION_CONFIG (line 20) | const ANIMATION_CONFIG = { function PanelContainer (line 29) | function PanelContainer({ FILE: free-todo-frontend/components/layout/PanelContent.tsx type PanelContentProps (line 16) | interface PanelContentProps { function PanelContent (line 20) | function PanelContent({ position }: PanelContentProps) { FILE: free-todo-frontend/components/layout/PanelRegion.tsx constant BOTTOM_DOCK_HEIGHT (line 14) | const BOTTOM_DOCK_HEIGHT = 60; constant DOCK_MARGIN_TOP (line 16) | const DOCK_MARGIN_TOP = 0; type PanelRegionProps (line 18) | interface PanelRegionProps { function PanelRegion (line 46) | function PanelRegion({ FILE: free-todo-frontend/components/layout/PanelSelectorMenu.tsx type PanelSelectorMenuProps (line 12) | interface PanelSelectorMenuProps { function getFeatureLabelKey (line 21) | function getFeatureLabelKey(feature: PanelFeature): string { function PanelSelectorMenu (line 25) | function PanelSelectorMenu({ FILE: free-todo-frontend/components/layout/ResizeHandle.tsx type ResizeHandleProps (line 11) | interface ResizeHandleProps { constant ANIMATION_CONFIG (line 18) | const ANIMATION_CONFIG = { function ResizeHandle (line 27) | function ResizeHandle({ FILE: free-todo-frontend/components/notification/HeaderIsland.tsx function formatTime (line 14) | function formatTime( function formatCurrentTime (line 40) | function formatCurrentTime(t: ReturnType): { function HeaderIsland (line 59) | function HeaderIsland() { FILE: free-todo-frontend/components/ui/button.tsx type ButtonVariant (line 7) | type ButtonVariant = "default" | "outline" | "ghost" | "destructive"; type ButtonSize (line 8) | type ButtonSize = "default" | "sm" | "lg" | "icon"; type ButtonProps (line 10) | interface ButtonProps FILE: free-todo-frontend/electron/backend-server.ts class BackendServer (line 33) | class BackendServer extends ProcessManager { method constructor (line 53) | constructor() { method getServerMode (line 73) | getServerMode(): ServerMode { method resolveBackendPaths (line 81) | private resolveBackendPaths(): void { method checkBackendExists (line 122) | private checkBackendExists(): boolean { method isLifeTraceBackend (line 150) | private async isLifeTraceBackend(port: number): Promise { method detectRunningBackendPort (line 201) | async detectRunningBackendPort(): Promise { method setPort (line 231) | setPort(port: number): void { method waitForReadyAndVerify (line 239) | async waitForReadyAndVerify(timeout: number): Promise { method ensureHealthCheck (line 250) | ensureHealthCheck(): void { method start (line 259) | async start(options?: { waitForReady?: boolean }): Promise { method verifyBackendMode (line 469) | private async verifyBackendMode(): Promise { FILE: free-todo-frontend/electron/bootstrap-control.ts function isCancelled (line 11) | function isCancelled(): boolean { function setActiveProcess (line 15) | function setActiveProcess(proc: ChildProcess | null): void { function clearActiveProcess (line 19) | function clearActiveProcess(proc: ChildProcess | null): void { function onCancel (line 25) | function onCancel(handler: () => void): () => void { function cancelBootstrap (line 30) | function cancelBootstrap(): void { FILE: free-todo-frontend/electron/bootstrap-status.ts type BootstrapStatus (line 7) | type BootstrapStatus = { function emitStatus (line 19) | function emitStatus(status: BootstrapStatus): void { function emitLog (line 23) | function emitLog(line: string): void { function emitComplete (line 27) | function emitComplete(): void { function onStatus (line 31) | function onStatus(handler: (status: BootstrapStatus) => void): void { function onLog (line 35) | function onLog(handler: (line: string) => void): void { function onComplete (line 39) | function onComplete(handler: () => void): void { FILE: free-todo-frontend/electron/bootstrap-window.ts function getBootstrapHtml (line 11) | function getBootstrapHtml(): string { function createBootstrapWindow (line 224) | function createBootstrapWindow(): BrowserWindow { function getBootstrapWindow (line 278) | function getBootstrapWindow(): BrowserWindow | null { function closeBootstrapWindow (line 282) | function closeBootstrapWindow(): void { FILE: free-todo-frontend/electron/config.ts type ServerMode (line 13) | type ServerMode = "dev" | "build"; function getServerMode (line 19) | function getServerMode(): ServerMode { constant PORT_RANGES (line 46) | const PORT_RANGES = { constant PORT_CONFIG (line 63) | const PORT_CONFIG = { method default (line 67) | get default(): number { method default (line 80) | get default(): number { constant TIMEOUT_CONFIG (line 95) | const TIMEOUT_CONFIG = { constant HEALTH_CHECK_INTERVAL (line 111) | const HEALTH_CHECK_INTERVAL = { constant WINDOW_CONFIG (line 121) | const WINDOW_CONFIG = { type WindowMode (line 139) | type WindowMode = "island" | "web"; type BackendRuntime (line 153) | type BackendRuntime = "script" | "pyinstaller"; function getWindowMode (line 168) | function getWindowMode(): WindowMode { function getBackendRuntime (line 199) | function getBackendRuntime(): BackendRuntime { constant LOG_CONFIG (line 223) | const LOG_CONFIG = { constant PROCESS_CONFIG (line 233) | const PROCESS_CONFIG = { function isDevelopment (line 253) | function isDevelopment(isPackaged: boolean): boolean { FILE: free-todo-frontend/electron/git-info.ts function getGitCommit (line 6) | function getGitCommit(): string | null { FILE: free-todo-frontend/electron/global-shortcut-manager.ts type ShortcutConfig (line 14) | interface ShortcutConfig { class GlobalShortcutManager (line 27) | class GlobalShortcutManager { method constructor (line 59) | constructor(islandWindowManager: IslandWindowManager) { method registerDefaults (line 67) | registerDefaults(): void { method register (line 97) | register( method unregister (line 140) | unregister(name: string): void { method unregisterAll (line 162) | unregisterAll(): void { method isRegistered (line 180) | isRegistered(accelerator: string): boolean { method getShortcuts (line 188) | getShortcuts(): Map { method updateShortcut (line 199) | updateShortcut(name: string, newAccelerator: string): boolean { method setupCleanup (line 238) | private setupCleanup(): void { FILE: free-todo-frontend/electron/ipc-handlers-todo-capture.ts type JimpScanContext (line 11) | type JimpScanContext = { function sendToBackend (line 20) | async function sendToBackend( function maskWindowArea (line 106) | async function maskWindowArea( function setupTodoCaptureIpcHandlers (line 197) | function setupTodoCaptureIpcHandlers( FILE: free-todo-frontend/electron/ipc-handlers.ts function setupIpcHandlers (line 21) | function setupIpcHandlers( function setupIslandIpcHandlers (line 113) | function setupIslandIpcHandlers(islandWindowManager: IslandWindowManager... FILE: free-todo-frontend/electron/island-window-manager.ts type IslandMode (line 13) | enum IslandMode { constant ISLAND_SIZES (line 23) | const ISLAND_SIZES: Record void): void { method notifyVisibilityChange (line 549) | private notifyVisibilityChange(visible: boolean): void { method isVisible (line 564) | isVisible(): boolean { method setSidebarPinned (line 572) | setSidebarPinned(isPinned: boolean): void { FILE: free-todo-frontend/electron/logger.ts type LogLevel (line 14) | type LogLevel = "INFO" | "WARN" | "ERROR" | "FATAL"; class Logger (line 20) | class Logger { method constructor (line 24) | constructor() { method ensureLogDir (line 34) | private ensureLogDir(): void { method getTodayDateString (line 47) | private getTodayDateString(): string { method generateLogFileName (line 59) | private generateLogFileName(): string { method writeStartMarker (line 90) | private writeStartMarker(): void { method write (line 106) | private write(level: LogLevel, message: string, source?: string): void { method getLogFilePath (line 120) | getLogFilePath(): string { method info (line 127) | info(message: string, source?: string): void { method warn (line 134) | warn(message: string, source?: string): void { method error (line 141) | error(message: string, source?: string): void { method fatal (line 148) | fatal(message: string, source?: string): void { method stdout (line 155) | stdout(source: string, data: string): void { method stderr (line 165) | stderr(source: string, data: string): void { method errorWithStack (line 175) | errorWithStack(message: string, error: Error, source?: string): void { method console (line 185) | console(message: string, source?: string): void { method consoleError (line 193) | consoleError(message: string, source?: string): void { method writeEndMarker (line 201) | writeEndMarker(): void { FILE: free-todo-frontend/electron/main.ts function setupGlobalErrorHandlers (line 240) | function setupGlobalErrorHandlers(): void { function attachBootstrapHandlers (line 253) | function attachBootstrapHandlers(): void { function confirmStopInstallation (line 300) | async function confirmStopInstallation(): Promise { function waitForBootstrapContinue (line 321) | function waitForBootstrapContinue(): Promise { function bootstrap (line 330) | async function bootstrap( function logStartupInfo (line 468) | function logStartupInfo(): void { function handleStartupError (line 481) | function handleStartupError(error: unknown): void { function cleanup (line 507) | function cleanup( FILE: free-todo-frontend/electron/next-server.ts function setNextProcessRef (line 21) | function setNextProcessRef(_proc: { killed: boolean } | null): void { function stopHealthCheck (line 25) | function stopHealthCheck(): void { function waitForServer (line 29) | function waitForServer(url: string, timeout: number): Promise { function getNextProcess (line 66) | function getNextProcess(): ChildProcess | null { function setNextProcess (line 73) | function setNextProcess(proc: ChildProcess | null): void { function getActualFrontendPort (line 84) | function getActualFrontendPort(): number { function setActualFrontendPort (line 91) | function setActualFrontendPort(port: number): void { function setBackendUrl (line 104) | function setBackendUrl(url: string): void { function getBackendUrl (line 111) | function getBackendUrl(): string { function startNextServer (line 119) | async function startNextServer(): Promise { function stopNextServer (line 454) | function stopNextServer(): void { function getServerUrl (line 474) | function getServerUrl(): string { function waitForServerPublic (line 481) | async function waitForServerPublic( FILE: free-todo-frontend/electron/notification.ts type NotificationData (line 13) | interface NotificationData { function requestNotificationPermission (line 30) | async function requestNotificationPermission(): Promise { function showSystemNotification (line 41) | function showSystemNotification( FILE: free-todo-frontend/electron/port-manager.ts class PortManager (line 14) | class PortManager { method isPortAvailable (line 20) | async isPortAvailable(port: number): Promise { method findAvailablePort (line 40) | async findAvailablePort( FILE: free-todo-frontend/electron/preload.ts type NotificationData (line 11) | interface NotificationData { function setTransparentBackground (line 21) | function setTransparentBackground() { FILE: free-todo-frontend/electron/process-manager.ts type ServerConfig (line 14) | interface ServerConfig { method constructor (line 47) | constructor(config: ServerConfig, defaultPort: number) { method getUrl (line 60) | getUrl(): string { method getPort (line 67) | getPort(): number { method isRunning (line 74) | isRunning(): boolean { method stop (line 83) | stop(waitForExit = false): Promise | void { method isIntentionallyStopping (line 122) | isIntentionallyStopping(): boolean { method waitForReady (line 131) | protected waitForReady(url: string, timeout: number): Promise { method startHealthCheck (line 189) | protected startHealthCheck(): void { method stopHealthCheck (line 237) | protected stopHealthCheck(): void { method setupProcessOutputListeners (line 248) | protected setupProcessOutputListeners(proc: ChildProcess): void { method getOutputBuffers (line 283) | getOutputBuffers(): { stdout: string; stderr: string } { method clearOutputBuffers (line 293) | clearOutputBuffers(): void { FILE: free-todo-frontend/electron/python-runtime-command.ts type CommandResult (line 13) | type CommandResult = { type CommandOptions (line 19) | type CommandOptions = { function runCommand (line 27) | async function runCommand( FILE: free-todo-frontend/electron/python-runtime-env.ts constant PIP_INDEX_CN (line 9) | const PIP_INDEX_CN = "https://pypi.tuna.tsinghua.edu.cn/simple"; constant PIP_INDEX_GLOBAL (line 10) | const PIP_INDEX_GLOBAL = "https://pypi.org/simple"; function isMainlandChina (line 15) | function isMainlandChina(): boolean { function getPipEnv (line 41) | function getPipEnv(): NodeJS.ProcessEnv { function getUvEnv (line 66) | function getUvEnv(): NodeJS.ProcessEnv { function configureCondaMirror (line 82) | async function configureCondaMirror(): Promise { FILE: free-todo-frontend/electron/python-runtime-installer.ts constant PYTHON_VERSION_FALLBACK (line 15) | const PYTHON_VERSION_FALLBACK = "3.12.9"; constant PYTHON_DOWNLOAD_BASE (line 16) | const PYTHON_DOWNLOAD_BASE = "https://www.python.org/ftp/python"; constant PYTHON_RELEASES_API (line 17) | const PYTHON_RELEASES_API = type PythonRelease (line 20) | type PythonRelease = { function fetchJson (line 25) | async function fetchJson(url: string): Promise { function compareSemver (line 56) | function compareSemver(a: string, b: string): number { function getLatestPython312Version (line 70) | async function getLatestPython312Version(): Promise { function downloadFile (line 92) | async function downloadFile( function installPythonWindows (line 136) | async function installPythonWindows(version: string): Promise { function installPythonMac (line 190) | async function installPythonMac(version: string): Promise { function installPythonLinux (line 213) | async function installPythonLinux(): Promise { function installPython312 (line 238) | async function installPython312(): Promise { FILE: free-todo-frontend/electron/python-runtime.ts constant REQUIRED_PYTHON_MAJOR (line 17) | const REQUIRED_PYTHON_MAJOR = 3; constant REQUIRED_PYTHON_MINOR (line 18) | const REQUIRED_PYTHON_MINOR = 12; constant PYTHON_VERSION_SHORT (line 19) | const PYTHON_VERSION_SHORT = `${REQUIRED_PYTHON_MAJOR}.${REQUIRED_PYTHON... constant DEP_MARKER_FILE (line 20) | const DEP_MARKER_FILE = ".freetodo-deps.json"; constant RUNTIME_MANIFEST_FILE (line 21) | const RUNTIME_MANIFEST_FILE = ".freetodo-runtime.json"; type PythonInfo (line 25) | type PythonInfo = { function setPreferredPythonPath (line 32) | function setPreferredPythonPath(value: string | null): void { function getVenvPythonPath (line 36) | function getVenvPythonPath(venvDir: string): string { function getVenvUvPath (line 43) | function getVenvUvPath(venvDir: string): string { function readFileHash (line 50) | function readFileHash(filePath: string): string { function readDepsMarker (line 55) | function readDepsMarker(venvDir: string): { requirementsHash?: string } ... type RuntimeManifest (line 68) | type RuntimeManifest = { function readRuntimeManifest (line 75) | function readRuntimeManifest(runtimeRoot: string): RuntimeManifest | null { function writeRuntimeManifest (line 88) | function writeRuntimeManifest(runtimeRoot: string, manifest: RuntimeMani... function writeDepsMarker (line 93) | function writeDepsMarker(venvDir: string, requirementsHash: string): void { function isRequiredPython (line 102) | function isRequiredPython(version: string): boolean { function normalizeOutput (line 106) | function normalizeOutput(value: string): string { function assertNotCancelled (line 110) | function assertNotCancelled(): void { function getVersionFromOutput (line 116) | function getVersionFromOutput(output: string): PythonInfo | null { function getPythonInfo (line 142) | async function getPythonInfo(command: string, args: string[]): Promise { function ensurePython312Installed (line 241) | async function ensurePython312Installed(): Promise { function ensureVenv (line 309) | async function ensureVenv( function ensureUvInVenv (line 333) | async function ensureUvInVenv( function ensureDependencies (line 358) | async function ensureDependencies( function ensureVenvPythonVersion (line 398) | async function ensureVenvPythonVersion(venvPython: string): Promise = RequestInit & { function normalizeTimestamps (line 11) | function normalizeTimestamps(obj: unknown): unknown { function customFetcher (line 71) | async function customFetcher( FILE: free-todo-frontend/lib/attachments.ts constant MAX_ATTACHMENT_SIZE_BYTES (line 6) | const MAX_ATTACHMENT_SIZE_BYTES = 50 * 1024 * 1024; function getApiBaseUrl (line 8) | function getApiBaseUrl(): string { function getAttachmentFileUrl (line 14) | function getAttachmentFileUrl(attachmentId: number): string { function uploadTodoAttachments (line 19) | async function uploadTodoAttachments( function removeTodoAttachment (line 43) | async function removeTodoAttachment( FILE: free-todo-frontend/lib/config/panel-config.ts type PanelPosition (line 22) | type PanelPosition = "panelA" | "panelB" | "panelC"; type PanelFeature (line 23) | type PanelFeature = constant DEV_IN_PROGRESS_FEATURES (line 41) | const DEV_IN_PROGRESS_FEATURES: PanelFeature[] = [ constant ALL_PANEL_FEATURES (line 52) | const ALL_PANEL_FEATURES: PanelFeature[] = [ constant FEATURE_ICON_MAP (line 69) | const FEATURE_ICON_MAP: Record = { FILE: free-todo-frontend/lib/dnd/context.tsx function useGlobalDnd (line 46) | function useGlobalDnd(): GlobalDndContextValue { function useGlobalDndSafe (line 57) | function useGlobalDndSafe(): GlobalDndContextValue | null { function usePendingUpdate (line 65) | function usePendingUpdate() { type GlobalDndProviderProps (line 99) | interface GlobalDndProviderProps { function GlobalDndProvider (line 103) | function GlobalDndProvider({ children }: GlobalDndProviderProps) { FILE: free-todo-frontend/lib/dnd/handlers.ts function registerHandler (line 117) | function registerHandler(key: HandlerKey, handler: DragDropHandler) { function getHandler (line 124) | function getHandler(key: HandlerKey): DragDropHandler | undefined { function dispatchDragDrop (line 530) | function dispatchDragDrop( FILE: free-todo-frontend/lib/dnd/overlays.tsx function getStatusColor (line 20) | function getStatusColor(status: TodoStatus) { function getPriorityBgColor (line 33) | function getPriorityBgColor(priority: TodoPriority) { function formatScheduleLabel (line 46) | function formatScheduleLabel(startTime?: string, endTime?: string) { type TodoCardOverlayProps (line 86) | interface TodoCardOverlayProps { function TodoCardOverlay (line 91) | function TodoCardOverlay({ todo, depth = 0 }: TodoCardOverlayProps) { type CalendarTodoOverlayProps (line 229) | interface CalendarTodoOverlayProps { function CalendarTodoOverlay (line 233) | function CalendarTodoOverlay({ todo }: CalendarTodoOverlayProps) { type DragOverlayContentProps (line 264) | interface DragOverlayContentProps { function DragOverlayContent (line 268) | function DragOverlayContent({ data }: DragOverlayContentProps) { type GlobalDragOverlayProps (line 309) | interface GlobalDragOverlayProps { function GlobalDragOverlay (line 313) | function GlobalDragOverlay({ activeDrag }: GlobalDragOverlayProps) { FILE: free-todo-frontend/lib/dnd/types.ts type DragSourceType (line 16) | type DragSourceType = "TODO_CARD" | "FILE" | "USER" | "PANEL_HEADER"; type DragData (line 22) | type DragData = type DropTargetType (line 59) | type DropTargetType = type DropData (line 72) | type DropData = type ActiveDragState (line 131) | interface ActiveDragState { type DragDropResult (line 143) | interface DragDropResult { type HandlerKey (line 152) | type HandlerKey = `${DragSourceType}->${DropTargetType}`; type DragDropHandler (line 157) | type DragDropHandler = ( type GlobalDndContextValue (line 169) | interface GlobalDndContextValue { function isTodoCardDragData (line 180) | function isTodoCardDragData( function isCalendarDateDropData (line 189) | function isCalendarDateDropData( function isTodoListDropData (line 198) | function isTodoListDropData( function isTodoDropZoneDropData (line 207) | function isTodoDropZoneDropData( FILE: free-todo-frontend/lib/generated/activity/activity.ts type SecondParameter (line 39) | type SecondParameter unknown> = Parameters... type listActivitiesApiActivitiesGetResponse200 (line 47) | type listActivitiesApiActivitiesGetResponse200 = { type listActivitiesApiActivitiesGetResponse422 (line 52) | type listActivitiesApiActivitiesGetResponse422 = { type listActivitiesApiActivitiesGetResponseSuccess (line 57) | type listActivitiesApiActivitiesGetResponseSuccess = (listActivitiesApiA... type listActivitiesApiActivitiesGetResponseError (line 60) | type listActivitiesApiActivitiesGetResponseError = (listActivitiesApiAct... type listActivitiesApiActivitiesGetResponse (line 64) | type listActivitiesApiActivitiesGetResponse = (listActivitiesApiActiviti... type ListActivitiesApiActivitiesGetQueryResult (line 121) | type ListActivitiesApiActivitiesGetQueryResult = NonNullable unknown> = Parameters... type getRecordingsApiAudioRecordingsGetResponse200 (line 49) | type getRecordingsApiAudioRecordingsGetResponse200 = { type getRecordingsApiAudioRecordingsGetResponse422 (line 54) | type getRecordingsApiAudioRecordingsGetResponse422 = { type getRecordingsApiAudioRecordingsGetResponseSuccess (line 59) | type getRecordingsApiAudioRecordingsGetResponseSuccess = (getRecordingsA... type getRecordingsApiAudioRecordingsGetResponseError (line 62) | type getRecordingsApiAudioRecordingsGetResponseError = (getRecordingsApi... type getRecordingsApiAudioRecordingsGetResponse (line 66) | type getRecordingsApiAudioRecordingsGetResponse = (getRecordingsApiAudio... type GetRecordingsApiAudioRecordingsGetQueryResult (line 123) | type GetRecordingsApiAudioRecordingsGetQueryResult = NonNullable( FILE: free-todo-frontend/lib/generated/chat/chat.ts type SecondParameter (line 46) | type SecondParameter unknown> = Parameters... type chatWithContextStreamApiChatStreamWithContextPostResponse200 (line 54) | type chatWithContextStreamApiChatStreamWithContextPostResponse200 = { type chatWithContextStreamApiChatStreamWithContextPostResponse422 (line 59) | type chatWithContextStreamApiChatStreamWithContextPostResponse422 = { type chatWithContextStreamApiChatStreamWithContextPostResponseSuccess (line 64) | type chatWithContextStreamApiChatStreamWithContextPostResponseSuccess = ... type chatWithContextStreamApiChatStreamWithContextPostResponseError (line 67) | type chatWithContextStreamApiChatStreamWithContextPostResponseError = (c... type chatWithContextStreamApiChatStreamWithContextPostResponse (line 71) | type chatWithContextStreamApiChatStreamWithContextPostResponse = (chatWi... type ChatWithContextStreamApiChatStreamWithContextPostMutationResult (line 123) | type ChatWithContextStreamApiChatStreamWithContextPostMutationResult = N... type ChatWithContextStreamApiChatStreamWithContextPostMutationBody (line 124) | type ChatWithContextStreamApiChatStreamWithContextPostMutationBody = Cha... type ChatWithContextStreamApiChatStreamWithContextPostMutationError (line 125) | type ChatWithContextStreamApiChatStreamWithContextPostMutationError = HT... type chatWithLlmApiChatPostResponse200 (line 144) | type chatWithLlmApiChatPostResponse200 = { type chatWithLlmApiChatPostResponse422 (line 149) | type chatWithLlmApiChatPostResponse422 = { type chatWithLlmApiChatPostResponseSuccess (line 154) | type chatWithLlmApiChatPostResponseSuccess = (chatWithLlmApiChatPostResp... type chatWithLlmApiChatPostResponseError (line 157) | type chatWithLlmApiChatPostResponseError = (chatWithLlmApiChatPostRespon... type chatWithLlmApiChatPostResponse (line 161) | type chatWithLlmApiChatPostResponse = (chatWithLlmApiChatPostResponseSuc... type ChatWithLlmApiChatPostMutationResult (line 213) | type ChatWithLlmApiChatPostMutationResult = NonNullable unknown> = Parameters... type testLlmConfigApiTestLlmConfigPostResponse200 (line 48) | type testLlmConfigApiTestLlmConfigPostResponse200 = { type testLlmConfigApiTestLlmConfigPostResponse422 (line 53) | type testLlmConfigApiTestLlmConfigPostResponse422 = { type testLlmConfigApiTestLlmConfigPostResponseSuccess (line 58) | type testLlmConfigApiTestLlmConfigPostResponseSuccess = (testLlmConfigAp... type testLlmConfigApiTestLlmConfigPostResponseError (line 61) | type testLlmConfigApiTestLlmConfigPostResponseError = (testLlmConfigApiT... type testLlmConfigApiTestLlmConfigPostResponse (line 65) | type testLlmConfigApiTestLlmConfigPostResponse = (testLlmConfigApiTestLl... type TestLlmConfigApiTestLlmConfigPostMutationResult (line 117) | type TestLlmConfigApiTestLlmConfigPostMutationResult = NonNullable unknown> = Parameters... type getCostStatsApiCostTrackingStatsGetResponse200 (line 42) | type getCostStatsApiCostTrackingStatsGetResponse200 = { type getCostStatsApiCostTrackingStatsGetResponse422 (line 47) | type getCostStatsApiCostTrackingStatsGetResponse422 = { type getCostStatsApiCostTrackingStatsGetResponseSuccess (line 52) | type getCostStatsApiCostTrackingStatsGetResponseSuccess = (getCostStatsA... type getCostStatsApiCostTrackingStatsGetResponseError (line 55) | type getCostStatsApiCostTrackingStatsGetResponseError = (getCostStatsApi... type getCostStatsApiCostTrackingStatsGetResponse (line 59) | type getCostStatsApiCostTrackingStatsGetResponse = (getCostStatsApiCostT... type GetCostStatsApiCostTrackingStatsGetQueryResult (line 116) | type GetCostStatsApiCostTrackingStatsGetQueryResult = NonNullable unknown> = Parameters... type healthCheckHealthGetResponse200 (line 34) | type healthCheckHealthGetResponse200 = { type healthCheckHealthGetResponseSuccess (line 39) | type healthCheckHealthGetResponseSuccess = (healthCheckHealthGetResponse... type healthCheckHealthGetResponse (line 44) | type healthCheckHealthGetResponse = (healthCheckHealthGetResponseSuccess) type HealthCheckHealthGetQueryResult (line 94) | type HealthCheckHealthGetQueryResult = NonNullable unknown> = Parameters... type listEventsApiEventsGetResponse200 (line 46) | type listEventsApiEventsGetResponse200 = { type listEventsApiEventsGetResponse422 (line 51) | type listEventsApiEventsGetResponse422 = { type listEventsApiEventsGetResponseSuccess (line 56) | type listEventsApiEventsGetResponseSuccess = (listEventsApiEventsGetResp... type listEventsApiEventsGetResponseError (line 59) | type listEventsApiEventsGetResponseError = (listEventsApiEventsGetRespon... type listEventsApiEventsGetResponse (line 63) | type listEventsApiEventsGetResponse = (listEventsApiEventsGetResponseSuc... type ListEventsApiEventsGetQueryResult (line 120) | type ListEventsApiEventsGetQueryResult = NonNullable unknown> = Parameters... type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponse200 (line 50) | type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponse20... type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponse422 (line 55) | type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponse42... type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponseSuccess (line 60) | type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponseSu... type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponseError (line 63) | type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponseEr... type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponse (line 67) | type extractTodosFromCaptureApiFloatingCaptureExtractTodosPostResponse =... type ExtractTodosFromCaptureApiFloatingCaptureExtractTodosPostMutationResult (line 119) | type ExtractTodosFromCaptureApiFloatingCaptureExtractTodosPostMutationRe... type ExtractTodosFromCaptureApiFloatingCaptureExtractTodosPostMutationBody (line 120) | type ExtractTodosFromCaptureApiFloatingCaptureExtractTodosPostMutationBo... type ExtractTodosFromCaptureApiFloatingCaptureExtractTodosPostMutationError (line 121) | type ExtractTodosFromCaptureApiFloatingCaptureExtractTodosPostMutationEr... type healthCheckApiFloatingCaptureHealthGetResponse200 (line 140) | type healthCheckApiFloatingCaptureHealthGetResponse200 = { type healthCheckApiFloatingCaptureHealthGetResponseSuccess (line 145) | type healthCheckApiFloatingCaptureHealthGetResponseSuccess = (healthChec... type healthCheckApiFloatingCaptureHealthGetResponse (line 150) | type healthCheckApiFloatingCaptureHealthGetResponse = (healthCheckApiFlo... type HealthCheckApiFloatingCaptureHealthGetQueryResult (line 200) | type HealthCheckApiFloatingCaptureHealthGetQueryResult = NonNullable unknown> = Parameters... type createJournalApiJournalsPostResponse201 (line 51) | type createJournalApiJournalsPostResponse201 = { type createJournalApiJournalsPostResponse422 (line 56) | type createJournalApiJournalsPostResponse422 = { type createJournalApiJournalsPostResponseSuccess (line 61) | type createJournalApiJournalsPostResponseSuccess = (createJournalApiJour... type createJournalApiJournalsPostResponseError (line 64) | type createJournalApiJournalsPostResponseError = (createJournalApiJourna... type createJournalApiJournalsPostResponse (line 68) | type createJournalApiJournalsPostResponse = (createJournalApiJournalsPos... type CreateJournalApiJournalsPostMutationResult (line 120) | type CreateJournalApiJournalsPostMutationResult = NonNullable unknown> = Parameters... type getLogFilesApiLogsFilesGetResponse200 (line 39) | type getLogFilesApiLogsFilesGetResponse200 = { type getLogFilesApiLogsFilesGetResponseSuccess (line 44) | type getLogFilesApiLogsFilesGetResponseSuccess = (getLogFilesApiLogsFile... type getLogFilesApiLogsFilesGetResponse (line 49) | type getLogFilesApiLogsFilesGetResponse = (getLogFilesApiLogsFilesGetRes... type GetLogFilesApiLogsFilesGetQueryResult (line 99) | type GetLogFilesApiLogsFilesGetQueryResult = NonNullable unknown> = Parameters... type getNotificationApiNotificationsGetResponse200 (line 53) | type getNotificationApiNotificationsGetResponse200 = { type getNotificationApiNotificationsGetResponseSuccess (line 58) | type getNotificationApiNotificationsGetResponseSuccess = (getNotificatio... type getNotificationApiNotificationsGetResponse (line 63) | type getNotificationApiNotificationsGetResponse = (getNotificationApiNot... type GetNotificationApiNotificationsGetQueryResult (line 113) | type GetNotificationApiNotificationsGetQueryResult = NonNullable unknown> = Parameters... type processOcrApiOcrProcessPostResponse200 (line 43) | type processOcrApiOcrProcessPostResponse200 = { type processOcrApiOcrProcessPostResponse422 (line 48) | type processOcrApiOcrProcessPostResponse422 = { type processOcrApiOcrProcessPostResponseSuccess (line 53) | type processOcrApiOcrProcessPostResponseSuccess = (processOcrApiOcrProce... type processOcrApiOcrProcessPostResponseError (line 56) | type processOcrApiOcrProcessPostResponseError = (processOcrApiOcrProcess... type processOcrApiOcrProcessPostResponse (line 60) | type processOcrApiOcrProcessPostResponse = (processOcrApiOcrProcessPostR... type ProcessOcrApiOcrProcessPostMutationResult (line 118) | type ProcessOcrApiOcrProcessPostMutationResult = NonNullable unknown> = Parameters... type startProactiveOcrApiProactiveOcrStartPostResponse200 (line 38) | type startProactiveOcrApiProactiveOcrStartPostResponse200 = { type startProactiveOcrApiProactiveOcrStartPostResponseSuccess (line 43) | type startProactiveOcrApiProactiveOcrStartPostResponseSuccess = (startPr... type startProactiveOcrApiProactiveOcrStartPostResponse (line 48) | type startProactiveOcrApiProactiveOcrStartPostResponse = (startProactive... type StartProactiveOcrApiProactiveOcrStartPostMutationResult (line 99) | type StartProactiveOcrApiProactiveOcrStartPostMutationResult = NonNullab... type StartProactiveOcrApiProactiveOcrStartPostMutationError (line 101) | type StartProactiveOcrApiProactiveOcrStartPostMutationError = unknown type stopProactiveOcrApiProactiveOcrStopPostResponse200 (line 120) | type stopProactiveOcrApiProactiveOcrStopPostResponse200 = { type stopProactiveOcrApiProactiveOcrStopPostResponseSuccess (line 125) | type stopProactiveOcrApiProactiveOcrStopPostResponseSuccess = (stopProac... type stopProactiveOcrApiProactiveOcrStopPostResponse (line 130) | type stopProactiveOcrApiProactiveOcrStopPostResponse = (stopProactiveOcr... type StopProactiveOcrApiProactiveOcrStopPostMutationResult (line 181) | type StopProactiveOcrApiProactiveOcrStopPostMutationResult = NonNullable... type StopProactiveOcrApiProactiveOcrStopPostMutationError (line 183) | type StopProactiveOcrApiProactiveOcrStopPostMutationError = unknown type captureOnceApiProactiveOcrCapturePostResponse200 (line 202) | type captureOnceApiProactiveOcrCapturePostResponse200 = { type captureOnceApiProactiveOcrCapturePostResponseSuccess (line 207) | type captureOnceApiProactiveOcrCapturePostResponseSuccess = (captureOnce... type captureOnceApiProactiveOcrCapturePostResponse (line 212) | type captureOnceApiProactiveOcrCapturePostResponse = (captureOnceApiProa... type CaptureOnceApiProactiveOcrCapturePostMutationResult (line 263) | type CaptureOnceApiProactiveOcrCapturePostMutationResult = NonNullable unknown> = Parameters... type ragHealthCheckApiRagHealthGetResponse200 (line 38) | type ragHealthCheckApiRagHealthGetResponse200 = { type ragHealthCheckApiRagHealthGetResponseSuccess (line 43) | type ragHealthCheckApiRagHealthGetResponseSuccess = (ragHealthCheckApiRa... type ragHealthCheckApiRagHealthGetResponse (line 48) | type ragHealthCheckApiRagHealthGetResponse = (ragHealthCheckApiRagHealth... type RagHealthCheckApiRagHealthGetQueryResult (line 98) | type RagHealthCheckApiRagHealthGetQueryResult = NonNullable unknown> = Parameters... type getAllJobsApiSchedulerJobsGetResponse200 (line 46) | type getAllJobsApiSchedulerJobsGetResponse200 = { type getAllJobsApiSchedulerJobsGetResponseSuccess (line 51) | type getAllJobsApiSchedulerJobsGetResponseSuccess = (getAllJobsApiSchedu... type getAllJobsApiSchedulerJobsGetResponse (line 56) | type getAllJobsApiSchedulerJobsGetResponse = (getAllJobsApiSchedulerJobs... type GetAllJobsApiSchedulerJobsGetQueryResult (line 106) | type GetAllJobsApiSchedulerJobsGetQueryResult = NonNullable unknown> = Parameters... type getScreenshotsApiScreenshotsGetResponse200 (line 40) | type getScreenshotsApiScreenshotsGetResponse200 = { type getScreenshotsApiScreenshotsGetResponse422 (line 45) | type getScreenshotsApiScreenshotsGetResponse422 = { type getScreenshotsApiScreenshotsGetResponseSuccess (line 50) | type getScreenshotsApiScreenshotsGetResponseSuccess = (getScreenshotsApi... type getScreenshotsApiScreenshotsGetResponseError (line 53) | type getScreenshotsApiScreenshotsGetResponseError = (getScreenshotsApiSc... type getScreenshotsApiScreenshotsGetResponse (line 57) | type getScreenshotsApiScreenshotsGetResponse = (getScreenshotsApiScreens... type GetScreenshotsApiScreenshotsGetQueryResult (line 114) | type GetScreenshotsApiScreenshotsGetQueryResult = NonNullable unknown> = Parameters... type searchScreenshotsApiSearchPostResponse200 (line 36) | type searchScreenshotsApiSearchPostResponse200 = { type searchScreenshotsApiSearchPostResponse422 (line 41) | type searchScreenshotsApiSearchPostResponse422 = { type searchScreenshotsApiSearchPostResponseSuccess (line 46) | type searchScreenshotsApiSearchPostResponseSuccess = (searchScreenshotsA... type searchScreenshotsApiSearchPostResponseError (line 49) | type searchScreenshotsApiSearchPostResponseError = (searchScreenshotsApi... type searchScreenshotsApiSearchPostResponse (line 53) | type searchScreenshotsApiSearchPostResponse = (searchScreenshotsApiSearc... type SearchScreenshotsApiSearchPostMutationResult (line 105) | type SearchScreenshotsApiSearchPostMutationResult = NonNullable unknown> = Parameters... type getStatisticsApiStatisticsGetResponse200 (line 46) | type getStatisticsApiStatisticsGetResponse200 = { type getStatisticsApiStatisticsGetResponseSuccess (line 51) | type getStatisticsApiStatisticsGetResponseSuccess = (getStatisticsApiSta... type getStatisticsApiStatisticsGetResponse (line 56) | type getStatisticsApiStatisticsGetResponse = (getStatisticsApiStatistics... type GetStatisticsApiStatisticsGetQueryResult (line 106) | type GetStatisticsApiStatisticsGetQueryResult = NonNullable unknown> = Parameters... type getTimeAllocationApiTimeAllocationGetResponse200 (line 40) | type getTimeAllocationApiTimeAllocationGetResponse200 = { type getTimeAllocationApiTimeAllocationGetResponse422 (line 45) | type getTimeAllocationApiTimeAllocationGetResponse422 = { type getTimeAllocationApiTimeAllocationGetResponseSuccess (line 50) | type getTimeAllocationApiTimeAllocationGetResponseSuccess = (getTimeAllo... type getTimeAllocationApiTimeAllocationGetResponseError (line 53) | type getTimeAllocationApiTimeAllocationGetResponseError = (getTimeAlloca... type getTimeAllocationApiTimeAllocationGetResponse (line 57) | type getTimeAllocationApiTimeAllocationGetResponse = (getTimeAllocationA... type GetTimeAllocationApiTimeAllocationGetQueryResult (line 114) | type GetTimeAllocationApiTimeAllocationGetQueryResult = NonNullable unknown> = Parameters... type extractTodosFromEventApiTodoExtractionExtractPostResponse200 (line 47) | type extractTodosFromEventApiTodoExtractionExtractPostResponse200 = { type extractTodosFromEventApiTodoExtractionExtractPostResponse422 (line 52) | type extractTodosFromEventApiTodoExtractionExtractPostResponse422 = { type extractTodosFromEventApiTodoExtractionExtractPostResponseSuccess (line 57) | type extractTodosFromEventApiTodoExtractionExtractPostResponseSuccess = ... type extractTodosFromEventApiTodoExtractionExtractPostResponseError (line 60) | type extractTodosFromEventApiTodoExtractionExtractPostResponseError = (e... type extractTodosFromEventApiTodoExtractionExtractPostResponse (line 64) | type extractTodosFromEventApiTodoExtractionExtractPostResponse = (extrac... type ExtractTodosFromEventApiTodoExtractionExtractPostMutationResult (line 116) | type ExtractTodosFromEventApiTodoExtractionExtractPostMutationResult = N... type ExtractTodosFromEventApiTodoExtractionExtractPostMutationBody (line 117) | type ExtractTodosFromEventApiTodoExtractionExtractPostMutationBody = Tod... type ExtractTodosFromEventApiTodoExtractionExtractPostMutationError (line 118) | type ExtractTodosFromEventApiTodoExtractionExtractPostMutationError = HT... FILE: free-todo-frontend/lib/generated/todos/todos.ts type SecondParameter (line 44) | type SecondParameter unknown> = Parameters... type listTodosApiTodosGetResponse200 (line 52) | type listTodosApiTodosGetResponse200 = { type listTodosApiTodosGetResponse422 (line 57) | type listTodosApiTodosGetResponse422 = { type listTodosApiTodosGetResponseSuccess (line 62) | type listTodosApiTodosGetResponseSuccess = (listTodosApiTodosGetResponse... type listTodosApiTodosGetResponseError (line 65) | type listTodosApiTodosGetResponseError = (listTodosApiTodosGetResponse42... type listTodosApiTodosGetResponse (line 69) | type listTodosApiTodosGetResponse = (listTodosApiTodosGetResponseSuccess... type ListTodosApiTodosGetQueryResult (line 126) | type ListTodosApiTodosGetQueryResult = NonNullable unknown> = Parameters... type semanticSearchApiSemanticSearchPostResponse200 (line 47) | type semanticSearchApiSemanticSearchPostResponse200 = { type semanticSearchApiSemanticSearchPostResponse422 (line 52) | type semanticSearchApiSemanticSearchPostResponse422 = { type semanticSearchApiSemanticSearchPostResponseSuccess (line 57) | type semanticSearchApiSemanticSearchPostResponseSuccess = (semanticSearc... type semanticSearchApiSemanticSearchPostResponseError (line 60) | type semanticSearchApiSemanticSearchPostResponseError = (semanticSearchA... type semanticSearchApiSemanticSearchPostResponse (line 64) | type semanticSearchApiSemanticSearchPostResponse = (semanticSearchApiSem... type SemanticSearchApiSemanticSearchPostMutationResult (line 116) | type SemanticSearchApiSemanticSearchPostMutationResult = NonNullable unknown> = Parameters... type visionChatApiVisionChatPostResponse200 (line 46) | type visionChatApiVisionChatPostResponse200 = { type visionChatApiVisionChatPostResponse422 (line 51) | type visionChatApiVisionChatPostResponse422 = { type visionChatApiVisionChatPostResponseSuccess (line 56) | type visionChatApiVisionChatPostResponseSuccess = (visionChatApiVisionCh... type visionChatApiVisionChatPostResponseError (line 59) | type visionChatApiVisionChatPostResponseError = (visionChatApiVisionChat... type visionChatApiVisionChatPostResponse (line 63) | type visionChatApiVisionChatPostResponse = (visionChatApiVisionChatPostR... type VisionChatApiVisionChatPostMutationResult (line 115) | type VisionChatApiVisionChatPostMutationResult = NonNullable { function selectSettingsCategory (line 29) | function selectSettingsCategory(category: string): void { function useOnboardingTour (line 39) | function useOnboardingTour() { FILE: free-todo-frontend/lib/hooks/useOpenSettings.ts function calculatePanelWidths (line 10) | function calculatePanelWidths( function useOpenSettings (line 84) | function useOpenSettings() { FILE: free-todo-frontend/lib/hooks/usePanelLayout.ts type UsePanelLayoutOptions (line 8) | interface UsePanelLayoutOptions { function usePanelLayout (line 16) | function usePanelLayout({ FILE: free-todo-frontend/lib/hooks/usePanelResize.ts type UsePanelResizeOptions (line 9) | interface UsePanelResizeOptions { function usePanelResize (line 21) | function usePanelResize({ FILE: free-todo-frontend/lib/hooks/usePanelWindowResize.ts type UsePanelWindowResizeOptions (line 9) | interface UsePanelWindowResizeOptions { function usePanelWindowResize (line 25) | function usePanelWindowResize({ FILE: free-todo-frontend/lib/hooks/usePanelWindowStyles.ts type UsePanelWindowStylesOptions (line 8) | interface UsePanelWindowStylesOptions { function usePanelWindowStyles (line 13) | function usePanelWindowStyles({ FILE: free-todo-frontend/lib/hooks/useTodoCapture.ts type ExtractedTodoResponse (line 9) | interface ExtractedTodoResponse { type CaptureExtractResult (line 17) | interface CaptureExtractResult { function useTodoCapture (line 28) | function useTodoCapture() { FILE: free-todo-frontend/lib/hooks/useWindowAdaptivePanels.ts constant MIN_PANEL_WIDTH_PX (line 7) | const MIN_PANEL_WIDTH_PX = 300; function useWindowAdaptivePanels (line 13) | function useWindowAdaptivePanels( FILE: free-todo-frontend/lib/i18n/request.ts constant SUPPORTED_LOCALES (line 6) | const SUPPORTED_LOCALES = ["zh", "en"] as const; type Locale (line 7) | type Locale = (typeof SUPPORTED_LOCALES)[number]; constant DEFAULT_LOCALE (line 10) | const DEFAULT_LOCALE: Locale = "en"; function parseAcceptLanguage (line 20) | function parseAcceptLanguage(acceptLanguage: string | null): Locale | nu... FILE: free-todo-frontend/lib/island/types.ts type IslandMode (line 8) | enum IslandMode { constant ISLAND_SIZES (line 22) | const ISLAND_SIZES: Record): Activity { function normalizeEvent (line 46) | function normalizeEvent(raw: Record): Event { type UseActivitiesParams (line 70) | interface UseActivitiesParams { function useActivities (line 81) | function useActivities(params?: UseActivitiesParams) { function useActivityEvents (line 109) | function useActivityEvents(activityId: number | null) { function useEvent (line 128) | function useEvent(eventId: number | null) { function useEvents (line 146) | function useEvents(eventIds: number[]) { type UseEventsListParams (line 177) | interface UseEventsListParams { function useEventsList (line 189) | function useEventsList(params?: UseEventsListParams) { function useActivityWithEvents (line 210) | function useActivityWithEvents( FILE: free-todo-frontend/lib/query/chat.ts type ChatHistoryResponse (line 8) | interface ChatHistoryResponse { function mapSessionToSummary (line 21) | function mapSessionToSummary(session: { function useChatSessions (line 42) | function useChatSessions(options?: { function mapHistoryItem (line 72) | function mapHistoryItem(item: { function useChatHistory (line 95) | function useChatHistory( FILE: free-todo-frontend/lib/query/config.ts type LlmStatusResponse (line 15) | interface LlmStatusResponse { function useLlmStatus (line 24) | function useLlmStatus() { type AppConfig (line 39) | interface AppConfig { function useConfig (line 66) | function useConfig() { function useSaveConfig (line 95) | function useSaveConfig() { function useConfigMutations (line 140) | function useConfigMutations() { FILE: free-todo-frontend/lib/query/cost.ts type CostStatsResponse (line 11) | interface CostStatsResponse { type CostConfigResponse (line 39) | interface CostConfigResponse { function useCostStats (line 51) | function useCostStats(days: number) { function useCostConfig (line 75) | function useCostConfig() { FILE: free-todo-frontend/lib/query/journals.ts type UseJournalsParams (line 26) | interface UseJournalsParams { type JournalView (line 73) | type JournalView = ReturnType; type JournalAutoLinkResult (line 74) | type JournalAutoLinkResult = ReturnType; function useJournals (line 76) | function useJournals(params?: UseJournalsParams) { function useJournalMutations (line 140) | function useJournalMutations() { FILE: free-todo-frontend/lib/query/keys.ts type QueryKeys (line 109) | type QueryKeys = typeof queryKeys; FILE: free-todo-frontend/lib/query/provider.tsx function makeQueryClient (line 10) | function makeQueryClient() { function getQueryClient (line 47) | function getQueryClient() { type QueryProviderProps (line 59) | interface QueryProviderProps { function QueryProvider (line 67) | function QueryProvider({ children }: QueryProviderProps) { FILE: free-todo-frontend/lib/query/todos.ts function normalizeDateTimeValue (line 38) | function normalizeDateTimeValue( function normalizeTodo (line 55) | function normalizeTodo(raw: Record): Todo { type UseTodosParams (line 109) | interface UseTodosParams { function useTodos (line 119) | function useTodos(params?: UseTodosParams) { function useCreateTodo (line 154) | function useCreateTodo() { type UpdateTodoParams (line 210) | interface UpdateTodoParams { function useUpdateTodo (line 219) | function useUpdateTodo() { function useDeleteTodo (line 362) | function useDeleteTodo() { function useToggleTodoStatus (line 428) | function useToggleTodoStatus() { type ReorderTodoItem (line 458) | interface ReorderTodoItem { function useReorderTodos (line 467) | function useReorderTodos() { function useTodoMutations (line 525) | function useTodoMutations() { FILE: free-todo-frontend/lib/reminders.ts constant REMINDER_PRESET_MINUTES (line 1) | const REMINDER_PRESET_MINUTES = [0, 5, 10, 30, 60, 1440]; type ReminderUnit (line 3) | type ReminderUnit = "minutes" | "hours" | "days"; FILE: free-todo-frontend/lib/services/notification-poller.ts type NotificationResponse (line 12) | interface NotificationResponse { class NotificationPoller (line 20) | class NotificationPoller { method constructor (line 24) | constructor() { method registerEndpoint (line 43) | registerEndpoint(endpoint: PollingEndpoint): void { method unregisterEndpoint (line 67) | unregisterEndpoint(id: string): void { method pollEndpoint (line 78) | private async pollEndpoint(endpoint: PollingEndpoint): Promise { method pollDraftTodos (line 125) | private async pollDraftTodos(endpoint: PollingEndpoint): Promise { method pauseAll (line 200) | private pauseAll(): void { method resumeAll (line 208) | private resumeAll(): void { method cleanup (line 222) | cleanup(): void { method updateEndpoint (line 232) | updateEndpoint(endpoint: PollingEndpoint): void { function getNotificationPoller (line 243) | function getNotificationPoller(): NotificationPoller { function cleanupNotificationPoller (line 251) | function cleanupNotificationPoller(): void { FILE: free-todo-frontend/lib/store/activity-store.ts type ActivityStoreState (line 4) | interface ActivityStoreState { FILE: free-todo-frontend/lib/store/audio-recording-store.ts type TodoItem (line 15) | interface TodoItem { type ScheduleItem (line 22) | interface ScheduleItem { type TranscriptionCallback (line 29) | type TranscriptionCallback = (text: string, isFinal: boolean) => void type RealtimeNlpCallback (line 31) | type RealtimeNlpCallback = (data: { type ErrorCallback (line 37) | type ErrorCallback = (error: Error) => void type AudioRecordingState (line 39) | interface AudioRecordingState { type AudioRecordingActions (line 70) | interface AudioRecordingActions { type AudioRecordingStore (line 107) | type AudioRecordingStore = AudioRecordingState & AudioRecordingActions; function getApiBaseUrl (line 134) | function getApiBaseUrl(): string { function cleanupRecordingResources (line 148) | function cleanupRecordingResources(segmentTimestamps?: number[], isRecon... type AudioContextCtor (line 269) | type AudioContextCtor = typeof AudioContext & { function getRecordingElapsedMs (line 573) | function getRecordingElapsedMs(): number { function getSegmentStartMs (line 583) | function getSegmentStartMs(): number { FILE: free-todo-frontend/lib/store/breakdown-store.ts type Question (line 10) | interface Question { type BreakdownStage (line 17) | type BreakdownStage = "idle" | "questionnaire" | "summary" | "completed"; type BreakdownStoreState (line 19) | interface BreakdownStoreState { FILE: free-todo-frontend/lib/store/chat-store.ts type ChatStoreState (line 4) | interface ChatStoreState { FILE: free-todo-frontend/lib/store/color-theme.ts type ColorTheme (line 4) | type ColorTheme = type ColorThemeState (line 9) | interface ColorThemeState { FILE: free-todo-frontend/lib/store/journal-store.ts type JournalRefreshMode (line 4) | type JournalRefreshMode = "fixed" | "workHours" | "custom"; type JournalSettingsState (line 6) | interface JournalSettingsState { FILE: free-todo-frontend/lib/store/locale.ts type Locale (line 6) | type Locale = "zh" | "en"; constant SUPPORTED_LOCALES (line 9) | const SUPPORTED_LOCALES: Locale[] = ["zh", "en"]; constant DEFAULT_LOCALE (line 12) | const DEFAULT_LOCALE: Locale = "en"; type LocaleState (line 14) | interface LocaleState { FILE: free-todo-frontend/lib/store/notification-store.ts type Notification (line 4) | interface Notification { type PollingEndpoint (line 13) | interface PollingEndpoint { type NotificationStoreState (line 20) | interface NotificationStoreState { function sortNotifications (line 42) | function sortNotifications(notifications: Notification[]): Notification[] { type TauriNotificationApi (line 52) | type TauriNotificationApi = { function notifySystem (line 125) | function notifySystem(notification: Notification): void { FILE: free-todo-frontend/lib/store/onboarding-store.ts type OnboardingState (line 8) | interface OnboardingState { constant STORAGE_KEY (line 21) | const STORAGE_KEY = "onboarding"; FILE: free-todo-frontend/lib/store/theme.ts type Theme (line 4) | type Theme = "light" | "dark" | "system"; type ThemeState (line 6) | interface ThemeState { FILE: free-todo-frontend/lib/store/todo-store.ts type TodoUIState (line 10) | interface TodoUIState { function validateTodoSelectionState (line 34) | function validateTodoSelectionState(state: { FILE: free-todo-frontend/lib/store/ui-store/layout-actions.ts type SetState (line 6) | type SetState = StoreApi["setState"]; type GetState (line 7) | type GetState = StoreApi["getState"]; FILE: free-todo-frontend/lib/store/ui-store/layout-presets.ts constant LAYOUT_PRESETS (line 4) | const LAYOUT_PRESETS: LayoutPreset[] = [ FILE: free-todo-frontend/lib/store/ui-store/storage.ts type PersistedState (line 7) | type PersistedState = Partial & { constant VALID_POSITIONS (line 13) | const VALID_POSITIONS: PanelPosition[] = ["panelA", "panelB", "panelC"]; constant VALID_DOCK_MODES (line 14) | const VALID_DOCK_MODES: DockDisplayMode[] = ["fixed", "auto-hide"]; constant VALID_EXTERNAL_TOOL_IDS (line 15) | const VALID_EXTERNAL_TOOL_IDS = new Set(DEFAULT_PANEL_STATE.selectedExte... FILE: free-todo-frontend/lib/store/ui-store/types.ts type DockDisplayMode (line 4) | type DockDisplayMode = "fixed" | "auto-hide"; type LayoutPreset (line 7) | interface LayoutPreset { type UiStoreState (line 19) | interface UiStoreState { FILE: free-todo-frontend/lib/store/ui-store/utils.ts constant MIN_PANEL_WIDTH (line 9) | const MIN_PANEL_WIDTH = 0.2; constant MAX_PANEL_WIDTH (line 10) | const MAX_PANEL_WIDTH = 0.8; function clampWidth (line 15) | function clampWidth(width: number): number { function getPositionByFeature (line 25) | function getPositionByFeature( constant DEFAULT_PANEL_STATE (line 41) | const DEFAULT_PANEL_STATE = { function validatePanelFeatureMap (line 88) | function validatePanelFeatureMap( FILE: free-todo-frontend/lib/toast.ts type ToastType (line 6) | type ToastType = "success" | "error" | "info" | "warning"; type ToastOptions (line 8) | interface ToastOptions { function getToastContainer (line 15) | function getToastContainer(): HTMLDivElement { function createToastElement (line 29) | function createToastElement(message: string, type: ToastType): HTMLDivEl... function toast (line 44) | function toast(message: string, options: ToastOptions = {}): void { FILE: free-todo-frontend/lib/types/index.ts type TodoStatus (line 11) | type TodoStatus = "active" | "completed" | "canceled" | "draft"; type TodoPriority (line 12) | type TodoPriority = "high" | "medium" | "low" | "none"; type TodoAttachment (line 14) | interface TodoAttachment { type Todo (line 23) | interface Todo { type CreateTodoInput (line 68) | interface CreateTodoInput { type UpdateTodoInput (line 109) | interface UpdateTodoInput { type Screenshot (line 154) | interface Screenshot { type Event (line 168) | interface Event { type Activity (line 185) | interface Activity { type ActivityWithEvents (line 196) | interface ActivityWithEvents extends Activity { type TodoListResponse (line 205) | interface TodoListResponse { type ActivityListResponse (line 210) | interface ActivityListResponse { type EventListResponse (line 215) | interface EventListResponse { type ActivityEventsResponse (line 220) | interface ActivityEventsResponse { type AutomationScheduleType (line 228) | type AutomationScheduleType = "interval" | "cron" | "once"; type AutomationSchedule (line 230) | interface AutomationSchedule { type AutomationAction (line 238) | interface AutomationAction { type AutomationTask (line 243) | interface AutomationTask { type AutomationTaskListResponse (line 258) | interface AutomationTaskListResponse { type AutomationTaskCreateInput (line 263) | interface AutomationTaskCreateInput { type AutomationTaskUpdateInput (line 271) | interface AutomationTaskUpdateInput { FILE: free-todo-frontend/lib/utils.ts function cn (line 9) | function cn(...inputs: ClassValue[]): string { function formatDateTime (line 14) | function formatDateTime( function calculateDuration (line 22) | function calculateDuration(startTime: string, endTime: string): number { function formatDuration (line 31) | function formatDuration( function sortTodosByOrder (line 75) | function sortTodosByOrder(todos: T[]): T[] { function sortTodosByOriginalOrder (line 94) | function sortTodosByOriginalOrder( type TranslationFunction (line 110) | type TranslationFunction = ( function getPriorityLabel (line 120) | function getPriorityLabel( function getStatusLabel (line 132) | function getStatusLabel( FILE: free-todo-frontend/lib/utils/electron-api.ts type ElectronAPI (line 5) | type ElectronAPI = typeof window & { function getElectronAPI (line 37) | function getElectronAPI(): ElectronAPI { FILE: free-todo-frontend/lib/utils/electron.ts type ElectronWindow (line 8) | interface ElectronWindow extends Window { function isElectronEnvironment (line 16) | function isElectronEnvironment(): boolean { FILE: free-todo-frontend/lib/utils/platform.ts type PlatformType (line 41) | type PlatformType = 'tauri' | 'electron' | 'web'; type OSType (line 52) | type OSType = 'windows' | 'macos' | 'linux' | 'unknown'; FILE: free-todo-frontend/lib/utils/time.ts function utcToLocalInput (line 11) | function utcToLocalInput(utcIso: string): string { function localToUtcIso (line 31) | function localToUtcIso(localInput: string): string { function utcToLocalDisplay (line 44) | function utcToLocalDisplay( FILE: free-todo-frontend/next.config.ts constant APP_VERSION (line 9) | const APP_VERSION = packageJson.version; constant GIT_COMMIT (line 12) | let GIT_COMMIT = "unknown"; constant BUILD_TYPE (line 20) | const BUILD_TYPE = process.env.NODE_ENV === "production" ? "build" : "dev"; constant API_BASE_URL (line 23) | const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || "http://localhos... method rewrites (line 47) | async rewrites() { FILE: free-todo-frontend/scripts/build-electron.js function build (line 16) | async function build() { FILE: free-todo-frontend/scripts/check_code_lines.js constant DEFAULT_INCLUDE (line 28) | const DEFAULT_INCLUDE = ["apps", "components", "electron", "lib"]; constant DEFAULT_EXCLUDE (line 29) | const DEFAULT_EXCLUDE = ["lib/generated"]; constant DEFAULT_MAX_LINES (line 30) | const DEFAULT_MAX_LINES = 500; function parseArgs (line 44) | function parseArgs() { function isCommentLine (line 85) | function isCommentLine(line) { function countCodeLines (line 100) | function countCodeLines(filePath) { function normalizePath (line 132) | function normalizePath(p) { function shouldCheckFile (line 143) | function shouldCheckFile(relPath, includeDirs, excludeDirs) { function getFilesToCheck (line 199) | function getFilesToCheck(config, rootDir) { function main (line 254) | function main() { FILE: free-todo-frontend/scripts/check_rust_code_lines.js constant DEFAULT_INCLUDE (line 17) | const DEFAULT_INCLUDE = ["src-tauri/src"]; constant DEFAULT_EXCLUDE (line 18) | const DEFAULT_EXCLUDE = ["src-tauri/target"]; constant DEFAULT_MAX_LINES (line 19) | const DEFAULT_MAX_LINES = 500; function parseArgs (line 21) | function parseArgs() { function isCommentLine (line 54) | function isCommentLine(line) { function countCodeLines (line 64) | function countCodeLines(filePath) { function normalizePath (line 88) | function normalizePath(p) { function shouldCheckFile (line 92) | function shouldCheckFile(relPath, includeDirs, excludeDirs) { function getFilesToCheck (line 133) | function getFilesToCheck(config, rootDir) { function main (line 174) | function main() { FILE: free-todo-frontend/scripts/collect-tauri-artifacts.js function parseArgs (line 4) | function parseArgs() { function ensureDir (line 18) | function ensureDir(dir) { function copyDir (line 24) | function copyDir(src, dest) { FILE: free-todo-frontend/scripts/copy-missing-deps.js function copyDirectory (line 9) | function copyDirectory(src, dest) { FILE: free-todo-frontend/scripts/dev-with-auto-port.js constant DEFAULT_FRONTEND_PORT (line 22) | const DEFAULT_FRONTEND_PORT = 3001; constant MAX_PORT_ATTEMPTS (line 24) | const MAX_PORT_ATTEMPTS = 100; function normalizePath (line 26) | function normalizePath(value) { function isSymlinkedNodeModules (line 31) | function isSymlinkedNodeModules() { function getGitCommit (line 52) | function getGitCommit() { constant FRONTEND_GIT_COMMIT (line 68) | const FRONTEND_GIT_COMMIT = getGitCommit(); function isPortAvailable (line 75) | function isPortAvailable(port) { function findAvailablePort (line 95) | async function findAvailablePort(startPort, maxAttempts = MAX_PORT_ATTEM... function isFreeTodoBackend (line 116) | async function isFreeTodoBackend(port) { function findRunningBackendPort (line 176) | async function findRunningBackendPort() { function main (line 193) | async function main() { FILE: free-todo-frontend/scripts/resolve-symlinks.js function resolveSymlinks (line 9) | function resolveSymlinks(dir) { function copyDirectory (line 49) | function copyDirectory(src, dest) { FILE: free-todo-frontend/scripts/tauri-copy-resources.js function parseArgs (line 4) | function parseArgs() { function copyDir (line 18) | function copyDir(src, dest) { function findLatestReleaseDir (line 28) | function findLatestReleaseDir(targetRoot) { FILE: free-todo-frontend/scripts/tauri-prebuild.js function copyDir (line 120) | function copyDir(src, dest) { FILE: free-todo-frontend/src-tauri/build.rs function main (line 1) | fn main() { FILE: free-todo-frontend/src-tauri/src/backend.rs type BackendState (line 29) | struct BackendState { function state (line 41) | fn state() -> &'static BackendState { type BackendRuntime (line 55) | enum BackendRuntime { function get_backend_runtime (line 62) | fn get_backend_runtime() -> BackendRuntime { function run_uv_sync_if_needed (line 91) | fn run_uv_sync_if_needed(backend_root: &Path) -> Result<(), String> { function server_mode (line 114) | fn server_mode() -> ServerMode { function mode_label (line 118) | fn mode_label(mode: ServerMode) -> &'static str { constant BACKEND_LOG_LABEL (line 125) | const BACKEND_LOG_LABEL: &str = "backend"; function get_backend_url (line 128) | pub fn get_backend_url() -> String { function check_backend_health (line 139) | pub async fn check_backend_health( function start_backend (line 146) | pub async fn start_backend( function backend_supervisor (line 185) | async fn backend_supervisor(app: AppHandle, mode: ServerMode) -> Result<... function start_backend_process (line 276) | async fn start_backend_process(app: &AppHandle, mode: ServerMode) -> Res... function stop_managed_backend (line 469) | fn stop_managed_backend() { function stop_backend (line 489) | pub fn stop_backend() { function cleanup (line 532) | pub fn cleanup() { FILE: free-todo-frontend/src-tauri/src/backend_log.rs function emit_backend_log (line 8) | pub fn emit_backend_log(app: &AppHandle, message: impl Into) { function spawn_log_reader (line 14) | pub fn spawn_log_reader( function format_download_progress (line 27) | pub fn format_download_progress(progress: &DownloadProgress) -> String { function format_bytes (line 42) | fn format_bytes(bytes: u64) -> String { FILE: free-todo-frontend/src-tauri/src/backend_paths.rs function get_backend_path (line 8) | pub fn get_backend_path(app: &AppHandle) -> Result { function get_backend_script_root (line 47) | pub fn get_backend_script_root(app: &AppHandle) -> Result PathBuf { function get_requirements_path (line 101) | pub fn get_requirements_path(root: &Path) -> PathBuf { function get_runtime_root (line 119) | pub fn get_runtime_root(app: &AppHandle) -> Result { function get_data_dir (line 133) | pub fn get_data_dir(app: &AppHandle, mode: ServerMode) -> Result, ready: Arc) -> Se... function start_proxy_server (line 40) | pub async fn start_proxy_server(port: u16, state: ProxyState) -> Result<... function proxy_handler (line 56) | async fn proxy_handler(State(state): State, req: Request Response { function should_skip_request_header (line 150) | fn should_skip_request_header(name: &header::HeaderName) -> bool { function should_skip_response_header (line 154) | fn should_skip_response_header(name: &header::HeaderName) -> bool { FILE: free-todo-frontend/src-tauri/src/backend_python.rs constant UV_PYTHON_VERSION (line 11) | const UV_PYTHON_VERSION: &str = "3.12"; type UvArchiveKind (line 13) | enum UvArchiveKind { type PythonInfo (line 19) | struct PythonInfo { function get_venv_python_path (line 24) | pub fn get_venv_python_path(venv_dir: &Path) -> PathBuf { function get_venv_uv_path (line 31) | fn get_venv_uv_path(venv_dir: &Path) -> PathBuf { function is_mainland_china (line 38) | fn is_mainland_china() -> bool { function build_uv_env (line 56) | fn build_uv_env() -> Vec<(String, String)> { function uv_env_pairs (line 90) | pub fn uv_env_pairs() -> Vec<(String, String)> { function get_runtime_uv_path (line 94) | pub fn get_runtime_uv_path(runtime_root: &Path) -> PathBuf { type DownloadProgress (line 101) | pub struct DownloadProgress { function uv_archive_kind (line 106) | fn uv_archive_kind() -> Result { function uv_download_url (line 116) | fn uv_download_url() -> Result<&'static str, String> { function extract_zip (line 159) | fn extract_zip(archive_path: &Path, dest_dir: &Path) -> Result<(), Strin... function extract_tar_gz (line 179) | fn extract_tar_gz(archive_path: &Path, dest_dir: &Path) -> Result<(), St... function find_uv_binary (line 187) | fn find_uv_binary(root: &Path) -> Option { function download_with_progress (line 207) | async fn download_with_progress( function ensure_uv_binary_with_progress (line 262) | pub async fn ensure_uv_binary_with_progress( function run_command (line 314) | fn run_command(command: &str, args: &[&str], envs: &[(&str, &str)]) -> R... function get_python_info (line 328) | fn get_python_info(command: &str, args: &[&str]) -> Option { function find_python312 (line 339) | pub fn find_python312() -> Option { function ensure_venv (line 361) | pub fn ensure_venv(python_path: &Path, venv_dir: &Path) -> Result Result Result<(), String> { function ensure_uv_venv (line 410) | pub fn ensure_uv_venv(uv_path: &Path, venv_dir: &Path) -> Result (u16, u16) { function is_lifetrace_backend (line 31) | pub async fn is_lifetrace_backend(port: u16) -> bool { function check_backend_health (line 51) | pub async fn check_backend_health( function detect_running_backend_port (line 66) | pub async fn detect_running_backend_port(mode: ServerMode) -> Option { function port_available (line 79) | fn port_available(port: u16) -> bool { function pick_backend_port (line 83) | pub fn pick_backend_port(mode: ServerMode) -> Result { function wait_for_backend (line 106) | pub async fn wait_for_backend( function verify_backend_mode (line 129) | pub async fn verify_backend_mode(port: u16, expected_mode: &str) -> Resu... FILE: free-todo-frontend/src-tauri/src/config.rs type ServerMode (line 15) | pub enum ServerMode { method current (line 22) | pub fn current() -> Self { constant DEV_FRONTEND_PORT (line 44) | pub const DEV_FRONTEND_PORT: u16 = 3001; constant DEV_BACKEND_PORT (line 45) | pub const DEV_BACKEND_PORT: u16 = 8001; constant DEV_BACKEND_RANGE_START (line 46) | pub const DEV_BACKEND_RANGE_START: u16 = 8002; constant DEV_BACKEND_RANGE_END (line 47) | pub const DEV_BACKEND_RANGE_END: u16 = 8099; constant BUILD_FRONTEND_PORT (line 50) | pub const BUILD_FRONTEND_PORT: u16 = 3100; constant BUILD_BACKEND_PORT (line 51) | pub const BUILD_BACKEND_PORT: u16 = 8100; constant BUILD_BACKEND_RANGE_START (line 52) | pub const BUILD_BACKEND_RANGE_START: u16 = 8101; constant BUILD_BACKEND_RANGE_END (line 53) | pub const BUILD_BACKEND_RANGE_END: u16 = 8199; function frontend_port (line 56) | pub fn frontend_port(mode: ServerMode) -> u16 { function backend_port (line 64) | pub fn backend_port(mode: ServerMode) -> u16 { constant BACKEND_READY (line 75) | pub const BACKEND_READY: u64 = 180_000; constant FRONTEND_READY (line 78) | pub const FRONTEND_READY: u64 = 30_000; constant HEALTH_CHECK (line 81) | pub const HEALTH_CHECK: u64 = 5_000; constant HEALTH_CHECK_RETRY (line 84) | pub const HEALTH_CHECK_RETRY: u64 = 500; constant FRONTEND_INTERVAL (line 90) | pub const FRONTEND_INTERVAL: u64 = 10_000; constant BACKEND_INTERVAL (line 93) | pub const BACKEND_INTERVAL: u64 = 30_000; constant BACKEND_EXEC_NAME (line 100) | pub const BACKEND_EXEC_NAME: &str = "lifetrace.exe"; constant BACKEND_EXEC_NAME (line 103) | pub const BACKEND_EXEC_NAME: &str = "lifetrace"; constant BACKEND_DATA_DIR (line 106) | pub const BACKEND_DATA_DIR: &str = "lifetrace-data"; function get_backend_port (line 110) | pub fn get_backend_port() -> u16 { function get_frontend_port (line 120) | pub fn get_frontend_port() -> u16 { function get_backend_url (line 130) | pub fn get_backend_url() -> String { function get_frontend_url (line 135) | pub fn get_frontend_url() -> String { FILE: free-todo-frontend/src-tauri/src/lib.rs type WindowMode (line 30) | pub enum WindowMode { function run (line 40) | pub fn run() { function get_backend_url (line 97) | fn get_backend_url() -> String { function get_backend_status (line 103) | async fn get_backend_status() -> Result { function toggle_window (line 111) | fn toggle_window(app: tauri::AppHandle) { function show_window (line 124) | fn show_window(app: tauri::AppHandle) { function hide_window (line 133) | fn hide_window(app: tauri::AppHandle) { FILE: free-todo-frontend/src-tauri/src/main.rs function main (line 11) | fn main() { FILE: free-todo-frontend/src-tauri/src/nextjs.rs function get_frontend_url (line 27) | pub fn get_frontend_url() -> String { function set_frontend_port (line 33) | pub fn set_frontend_port(port: u16) { function get_frontend_port (line 38) | pub fn get_frontend_port() -> u16 { function check_server_health (line 43) | async fn check_server_health(port: u16) -> bool { function wait_for_server (line 60) | async fn wait_for_server(url: &str, timeout_ms: u64) -> Result<(), Strin... function find_available_port (line 84) | async fn find_available_port(start_port: u16, max_attempts: u16) -> Resu... function get_server_path (line 99) | fn get_server_path(app: &AppHandle) -> Result { function start_nextjs (line 115) | pub async fn start_nextjs(app: &AppHandle) -> Result<(), Box Result { function start_health_check_loop (line 253) | fn start_health_check_loop(port: u16) { function stop_nextjs (line 272) | pub fn stop_nextjs() { function cleanup (line 313) | pub fn cleanup() { FILE: free-todo-frontend/src-tauri/src/shortcut.rs type ShortcutConfig (line 13) | pub struct ShortcutConfig { method default (line 19) | fn default() -> Self { function setup_shortcuts (line 27) | pub fn setup_shortcuts(app: &App) -> Result<(), Box bool { FILE: free-todo-frontend/src-tauri/src/tray.rs function setup_tray (line 17) | pub fn setup_tray(app: &App) -> Result<(), Box> { function create_recording_submenu (line 82) | fn create_recording_submenu( function create_screenshot_submenu (line 109) | fn create_screenshot_submenu( function get_tray_icon (line 136) | fn get_tray_icon(_app: &App) -> Result, Box bool: function _on_llm_api_key_change (line 163) | def _on_llm_api_key_change(_old_val: Any, _new_val: Any): function _on_llm_base_url_change (line 173) | def _on_llm_base_url_change(_old_val: Any, _new_val: Any): function _on_recorder_toggle (line 183) | def _on_recorder_toggle(_old_val: Any, new_val: Any): function _on_ocr_toggle (line 202) | def _on_ocr_toggle(_old_val: Any, new_val: Any): function _on_auto_todo_detection_toggle (line 221) | def _on_auto_todo_detection_toggle(_old_val: Any, new_val: Any): function _on_vector_db_toggle (line 240) | def _on_vector_db_toggle(_old_val: Any, new_val: Any): FILE: lifetrace/core/dependencies.py function get_db_base (line 40) | def get_db_base() -> DatabaseBase: function get_db_session (line 47) | def get_db_session( function get_todo_repository (line 67) | def get_todo_repository( function get_todo_service (line 74) | def get_todo_service( function get_journal_repository (line 84) | def get_journal_repository( function get_journal_service (line 91) | def get_journal_service( function get_event_repository (line 102) | def get_event_repository( function get_ocr_repository (line 109) | def get_ocr_repository( function get_event_service (line 116) | def get_event_service( function get_activity_repository (line 127) | def get_activity_repository( function get_activity_service (line 134) | def get_activity_service( function get_chat_repository (line 145) | def get_chat_repository( function get_chat_service (line 152) | def get_chat_service( function get_vector_service (line 162) | def get_vector_service(): function get_rag_service (line 167) | def get_rag_service(): function get_ocr_processor (line 176) | def get_ocr_processor(): function get_settings (line 186) | def get_settings(): FILE: lifetrace/core/lazy_services.py function get_vector_service (line 16) | def get_vector_service() -> "VectorService": function get_rag_service (line 24) | def get_rag_service() -> "RAGService": function reinit_vector_service (line 31) | def reinit_vector_service(): function reinit_rag_service (line 39) | def reinit_rag_service(): FILE: lifetrace/core/module_registry.py class ModuleDefinition (line 21) | class ModuleDefinition: class ModuleState (line 75) | class ModuleState: function _normalize_module_list (line 82) | def _normalize_module_list(value: object | None) -> set[str]: function _missing_dependencies (line 92) | def _missing_dependencies(dependencies: tuple[str, ...]) -> list[str]: function _get_enabled_module_ids (line 100) | def _get_enabled_module_ids() -> set[str]: function get_module_states (line 112) | def get_module_states() -> dict[str, ModuleState]: function log_module_summary (line 149) | def log_module_summary(states: dict[str, ModuleState]) -> None: function get_enabled_module_ids (line 167) | def get_enabled_module_ids(states: dict[str, ModuleState] | None = None)... function register_modules (line 173) | def register_modules( function register_enabled_modules (line 208) | def register_enabled_modules(app: FastAPI) -> list[str]: function get_capabilities_report (line 215) | def get_capabilities_report() -> dict[str, object]: FILE: lifetrace/jobs/activity_aggregator.py function is_long_event (line 22) | def is_long_event(event: Event) -> bool: function round_to_15_minutes (line 37) | def round_to_15_minutes(dt: datetime) -> datetime: function group_short_events_by_window (line 51) | def group_short_events_by_window( function create_activity_for_long_event (line 71) | def create_activity_for_long_event(event: Event) -> bool: function create_activity_for_window (line 132) | def create_activity_for_window(window_start: datetime, window_events: li... function _calculate_target_window (line 198) | def _calculate_target_window(now: datetime) -> tuple[datetime, datetime]... function _filter_events_in_window (line 218) | def _filter_events_in_window( function _separate_long_and_short_events (line 241) | def _separate_long_and_short_events( function _process_long_events (line 257) | def _process_long_events(long_events: list[Event]) -> int: function _process_short_events (line 278) | def _process_short_events(short_events: list[Event], window_start: datet... function execute_activity_aggregation_task (line 304) | def execute_activity_aggregation_task(): function get_aggregator_instance (line 360) | def get_aggregator_instance(): FILE: lifetrace/jobs/clean_data.py class CleanDataService (line 21) | class CleanDataService: method __init__ (line 24) | def __init__(self): method execute (line 31) | def execute(self) -> dict: method _clean_by_count (line 71) | def _clean_by_count(self) -> dict: method _clean_by_date (line 119) | def _clean_by_date(self) -> dict: method _delete_screenshot (line 161) | def _delete_screenshot(self, screenshot, session) -> dict: function get_clean_data_instance (line 213) | def get_clean_data_instance() -> CleanDataService: function execute_clean_data_task (line 218) | def execute_clean_data_task(): FILE: lifetrace/jobs/deadline_reminder.py function _normalize_offsets (line 29) | def _normalize_offsets(value: object | None) -> list[int]: function _get_field (line 36) | def _get_field(todo: object, name: str) -> Any: function _parse_datetime (line 42) | def _parse_datetime(value: str | None) -> datetime | None: function _coerce_datetime (line 52) | def _coerce_datetime(value: Any) -> datetime | None: function _resolve_schedule_time (line 60) | def _resolve_schedule_time(todo: object) -> datetime | None: function _format_remaining (line 78) | def _format_remaining(deadline: datetime, now: datetime) -> str: function _build_reminder_job_id (line 92) | def _build_reminder_job_id(todo_id: int, reminder_at: datetime) -> str: function _build_notification_id (line 96) | def _build_notification_id(todo_id: int, reminder_at: datetime) -> str: function execute_todo_reminder_job (line 100) | def execute_todo_reminder_job( function schedule_todo_reminders (line 173) | def schedule_todo_reminders(todo: object) -> list[str]: function remove_todo_reminder_jobs (line 229) | def remove_todo_reminder_jobs(todo_id: int) -> int: function refresh_todo_reminders (line 246) | def refresh_todo_reminders(todo: object) -> list[str]: function clear_all_todo_reminder_jobs (line 254) | def clear_all_todo_reminder_jobs() -> int: function sync_all_todo_reminders (line 270) | def sync_all_todo_reminders() -> int: function execute_deadline_reminder_task (line 306) | def execute_deadline_reminder_task() -> None: FILE: lifetrace/jobs/job_manager.py function _execute_capture_task (line 17) | def _execute_capture_task(): function _execute_todo_capture_task (line 23) | def _execute_todo_capture_task(): function _execute_ocr_task (line 29) | def _execute_ocr_task(): function _execute_activity_aggregation_task (line 35) | def _execute_activity_aggregation_task(): function _execute_clean_data_task (line 41) | def _execute_clean_data_task(): function _execute_deadline_reminder_task (line 47) | def _execute_deadline_reminder_task(): function _execute_proactive_ocr_task (line 53) | def _execute_proactive_ocr_task(): function execute_audio_recording_status_check (line 59) | def execute_audio_recording_status_check(): class JobManager (line 78) | class JobManager: method __init__ (line 81) | def __init__(self): method _get_scheduler (line 89) | def _get_scheduler(self) -> SchedulerManager | None: method _is_module_active (line 95) | def _is_module_active(self, *module_ids: str) -> bool: method start_all (line 106) | def start_all(self): method stop_all (line 151) | def stop_all(self): method _start_scheduler (line 160) | def _start_scheduler(self): method _stop_scheduler (line 169) | def _stop_scheduler(self): method _start_recorder_job (line 179) | def _start_recorder_job(self): method _start_todo_recorder_job (line 217) | def _start_todo_recorder_job(self): method _start_ocr_job (line 261) | def _start_ocr_job(self): method _start_activity_aggregator (line 292) | def _start_activity_aggregator(self): method _start_clean_data_job (line 330) | def _start_clean_data_job(self): method _start_deadline_reminder_job (line 365) | def _start_deadline_reminder_job(self): method _start_proactive_ocr_job (line 396) | def _start_proactive_ocr_job(self): method _start_automation_tasks (line 437) | def _start_automation_tasks(self): method _start_audio_recording_job (line 455) | def _start_audio_recording_job(self): function get_job_manager (line 496) | def get_job_manager() -> JobManager: FILE: lifetrace/jobs/ocr.py function get_unprocessed_screenshots (line 45) | def get_unprocessed_screenshots(logger_instance=None, limit=50): function process_screenshot_ocr (line 85) | def process_screenshot_ocr(screenshot_info, ocr_engine, vector_service): function _get_ocr_engine (line 121) | def _get_ocr_engine(): function _ensure_ocr_initialized (line 148) | def _ensure_ocr_initialized(): function execute_ocr_task (line 166) | def execute_ocr_task(): function ocr_service (line 197) | def ocr_service(): function _ensure_database_initialized (line 222) | def _ensure_database_initialized() -> None: function _initialize_ocr_and_vector_service (line 228) | def _initialize_ocr_and_vector_service(): function _run_ocr_loop (line 250) | def _run_ocr_loop(check_interval: float, ocr, vector_service) -> None: FILE: lifetrace/jobs/ocr_config.py function get_application_path (line 24) | def get_application_path() -> str: function get_rapidocr_config_path (line 29) | def get_rapidocr_config_path() -> str: function setup_rapidocr_config (line 34) | def setup_rapidocr_config(): function get_ocr_config (line 44) | def get_ocr_config() -> dict: function create_rapidocr_instance (line 64) | def create_rapidocr_instance(): function _get_rapidocr_cls (line 103) | def _get_rapidocr_cls(): function _create_default_rapidocr (line 112) | def _create_default_rapidocr(rapidocr_cls): function _create_default_rapidocr_with_cleanup (line 135) | def _create_default_rapidocr_with_cleanup(rapidocr_cls): function _create_rapidocr_with_external_models (line 148) | def _create_rapidocr_with_external_models(rapidocr_cls, config_data: dict): FILE: lifetrace/jobs/ocr_processor.py function _set_rapidocr_available (line 30) | def _set_rapidocr_available(value: bool) -> None: function _load_ocr_deps (line 35) | def _load_ocr_deps() -> bool: function preprocess_image (line 56) | def preprocess_image(image_path: str) -> "np.ndarray": function extract_text_from_ocr_result (line 76) | def extract_text_from_ocr_result(result, confidence_threshold: float | N... class SimpleOCRProcessor (line 104) | class SimpleOCRProcessor: method __init__ (line 107) | def __init__(self): method is_available (line 112) | def is_available(self): method start (line 116) | def start(self): method stop (line 120) | def stop(self): method get_statistics (line 124) | def get_statistics(self): method _ensure_ocr_initialized (line 143) | def _ensure_ocr_initialized(self): method process_image (line 148) | def process_image(self, image_path): function save_to_database (line 183) | def save_to_database(image_path: str, ocr_result: dict, vector_service=N... function _add_to_vector_database (line 213) | def _add_to_vector_database(ocr_result_id: int, screenshot_id: int, vect... function create_screenshot_record (line 236) | def create_screenshot_record(image_path: str): FILE: lifetrace/jobs/proactive_ocr/__init__.py function execute_proactive_ocr_task (line 11) | def execute_proactive_ocr_task(): FILE: lifetrace/jobs/proactive_ocr/capture.py function set_dpi_awareness (line 76) | def set_dpi_awareness(): class WindowCapture (line 103) | class WindowCapture: method __init__ (line 106) | def __init__(self, fps: float = 1.0): method _get_mss (line 119) | def _get_mss(self): method get_all_windows (line 127) | def get_all_windows(self) -> list[WindowMeta]: method get_foreground_window (line 179) | def get_foreground_window(self) -> WindowMeta | None: method _get_windows_foreground_window (line 191) | def _get_windows_foreground_window(self) -> WindowMeta | None: method _get_macos_foreground_window (line 234) | def _get_macos_foreground_window(self) -> WindowMeta | None: method _get_linux_foreground_window (line 279) | def _get_linux_foreground_window(self) -> WindowMeta | None: # noqa: ... method capture_window (line 364) | def capture_window(self, window: WindowMeta, use_printwindow: bool = T... method _capture_with_printwindow (line 380) | def _capture_with_printwindow(self, window: WindowMeta) -> ImageFrame ... method _capture_with_mss (line 458) | def _capture_with_mss(self, window: WindowMeta) -> ImageFrame | None: method capture_frame_event (line 506) | def capture_frame_event(self, window: WindowMeta) -> FrameEvent | None: method should_capture (line 526) | def should_capture(self) -> bool: method cleanup (line 534) | def cleanup(self): function get_capture (line 545) | def get_capture(fps: float = 1.0) -> WindowCapture: FILE: lifetrace/jobs/proactive_ocr/models.py class AppType (line 12) | class AppType(Enum): class BBox (line 21) | class BBox: method to_tuple (line 29) | def to_tuple(self) -> tuple: method from_tuple (line 34) | def from_tuple(cls, t: tuple) -> "BBox": class WindowMeta (line 40) | class WindowMeta: class ImageFrame (line 53) | class ImageFrame: class FrameEvent (line 64) | class FrameEvent: class RoutedFrame (line 73) | class RoutedFrame: class OcrLine (line 83) | class OcrLine: class OcrRawResult (line 92) | class OcrRawResult: FILE: lifetrace/jobs/proactive_ocr/ocr_engine.py class OcrEngine (line 36) | class OcrEngine: method __init__ (line 39) | def __init__( method _resize_image (line 82) | def _resize_image(self, image: np.ndarray, max_side: int) -> tuple: method ocr (line 111) | def ocr(self, image: np.ndarray) -> OcrRawResult: method ocr_simple (line 195) | def ocr_simple(self, image: np.ndarray) -> list[tuple[str, float]]: function get_ocr_engine (line 213) | def get_ocr_engine( FILE: lifetrace/jobs/proactive_ocr/priors/base.py class ThemeConfig (line 13) | class ThemeConfig: class ROIResult (line 22) | class ROIResult: class AppPrior (line 33) | class AppPrior(ABC): method app_name (line 38) | def app_name(self) -> str: method themes (line 44) | def themes(self) -> list[ThemeConfig]: method detect_theme (line 48) | def detect_theme(self, image: np.ndarray) -> ThemeConfig | None: method extract_chat_roi (line 80) | def extract_chat_roi(self, image: np.ndarray) -> ROIResult: method _find_bg_left_edge (line 92) | def _find_bg_left_edge( method _scan_row_left_edge (line 129) | def _scan_row_left_edge( FILE: lifetrace/jobs/proactive_ocr/priors/feishu.py class FeishuPrior (line 10) | class FeishuPrior(AppPrior): method app_name (line 14) | def app_name(self) -> str: method themes (line 18) | def themes(self) -> list[ThemeConfig]: method extract_chat_roi (line 32) | def extract_chat_roi(self, image: np.ndarray) -> ROIResult: FILE: lifetrace/jobs/proactive_ocr/priors/registry.py function _init_default_priors (line 15) | def _init_default_priors(): function register_prior (line 21) | def register_prior(app_type: AppType, prior: AppPrior): function get_prior (line 32) | def get_prior(app_type: AppType) -> AppPrior | None: function list_priors (line 49) | def list_priors() -> dict[AppType, AppPrior]: FILE: lifetrace/jobs/proactive_ocr/priors/wechat.py class WeChatPrior (line 10) | class WeChatPrior(AppPrior): method app_name (line 14) | def app_name(self) -> str: method themes (line 18) | def themes(self) -> list[ThemeConfig]: method extract_chat_roi (line 32) | def extract_chat_roi(self, image: np.ndarray) -> ROIResult: FILE: lifetrace/jobs/proactive_ocr/roi.py class ROIExtractor (line 15) | class ROIExtractor: method extract_chat_region (line 18) | def extract_chat_region(self, image: np.ndarray, app_type: AppType) ->... method extract_with_details (line 49) | def extract_with_details(self, image: np.ndarray, app_type: AppType) -... function get_roi_extractor (line 72) | def get_roi_extractor() -> ROIExtractor: FILE: lifetrace/jobs/proactive_ocr/router.py class AppRouter (line 54) | class AppRouter: method __init__ (line 57) | def __init__(self): method identify_app (line 64) | def identify_app(self, window: WindowMeta) -> tuple[AppType, str]: # ... method route (line 103) | def route(self, frame_event: FrameEvent) -> RoutedFrame | None: method is_target_window (line 126) | def is_target_window(self, window: WindowMeta) -> bool: method filter_target_windows (line 139) | def filter_target_windows(self, windows: list[WindowMeta]) -> list[tup... function get_router (line 161) | def get_router() -> AppRouter: FILE: lifetrace/jobs/proactive_ocr/service.py class ProactiveOCRService (line 31) | class ProactiveOCRService: method __init__ (line 34) | def __init__(self): method start (line 68) | def start(self): method stop (line 85) | def stop(self): method _monitor_loop (line 98) | def _monitor_loop(self): method run_once (line 109) | def run_once(self) -> dict[str, Any] | None: method _save_to_database (line 220) | def _save_to_database( method get_status (line 341) | def get_status(self) -> dict[str, Any]: function get_proactive_ocr_service (line 356) | def get_proactive_ocr_service() -> ProactiveOCRService: FILE: lifetrace/jobs/recorder.py class ScreenRecorder (line 34) | class ScreenRecorder: method __init__ (line 37) | def __init__(self): method _get_window_info (line 73) | def _get_window_info(self) -> tuple[str, str]: method _get_screen_list (line 92) | def _get_screen_list(self) -> list[int]: method _capture_screen (line 106) | def _capture_screen( method _ensure_window_info (line 152) | def _ensure_window_info( method _save_screenshot_metadata (line 162) | def _save_screenshot_metadata( method _close_active_event_on_blacklist (line 191) | def _close_active_event_on_blacklist(self): method capture_all_screens (line 199) | def capture_all_screens(self) -> list[str]: method execute_capture (line 239) | def execute_capture(self): method start_recording (line 256) | def start_recording(self): method _process_single_file (line 287) | def _process_single_file(self, file_path: str) -> bool: method _scan_unprocessed_files (line 334) | def _scan_unprocessed_files(self): method _print_final_stats (line 362) | def _print_final_stats(self): function get_recorder_instance (line 371) | def get_recorder_instance() -> ScreenRecorder: function execute_capture_task (line 380) | def execute_capture_task(): FILE: lifetrace/jobs/recorder_blacklist.py function check_window_title_patterns (line 20) | def check_window_title_patterns(window_title: str) -> bool: function is_browser_or_python_app (line 30) | def is_browser_or_python_app(app_name_lower: str) -> bool: function is_lifetrace_window (line 35) | def is_lifetrace_window(app_name: str, window_title: str) -> bool: function get_app_blacklist_reason (line 53) | def get_app_blacklist_reason(app_name: str) -> str: function get_window_blacklist_reason (line 76) | def get_window_blacklist_reason(window_title: str) -> str: function get_blacklist_reason (line 100) | def get_blacklist_reason(app_name: str, window_title: str) -> str: function log_blacklist_config (line 131) | def log_blacklist_config(): FILE: lifetrace/jobs/recorder_capture.py class ScreenshotCapture (line 30) | class ScreenshotCapture: method __init__ (line 33) | def __init__( method save_screenshot (line 48) | def save_screenshot(self, screenshot, file_path: str) -> bool: method get_image_size (line 63) | def get_image_size(self, file_path: str) -> tuple: method calculate_file_hash (line 78) | def calculate_file_hash(self, file_path: str) -> str: method calculate_image_hash (line 93) | def calculate_image_hash(self, image_path: str) -> str: method calculate_image_hash_from_memory (line 108) | def calculate_image_hash_from_memory(self, screenshot) -> str: method is_duplicate (line 123) | def is_duplicate(self, screen_id: int, image_hash: str) -> bool: method save_to_database (line 147) | def save_to_database( method grab_and_prepare_screenshot (line 182) | def grab_and_prepare_screenshot(self, screen_id: int) -> tuple[Any | N... function process_screenshot_event (line 197) | def process_screenshot_event( function get_unprocessed_files (line 233) | def get_unprocessed_files(screenshots_dir: str) -> list[str]: function extract_screen_id_from_path (line 249) | def extract_screen_id_from_path(file_path: str) -> int: function should_detect_todos (line 264) | def should_detect_todos(app_name: str) -> bool: function trigger_todo_detection_async (line 297) | def trigger_todo_detection_async(screenshot_id: int, _app_name: str): FILE: lifetrace/jobs/recorder_config.py function with_timeout (line 43) | def with_timeout(timeout_seconds: float = 5.0, operation_name: str = "操作"): FILE: lifetrace/jobs/scheduler.py class SchedulerManager (line 26) | class SchedulerManager: method __init__ (line 29) | def __init__(self): method _setup_scheduler (line 34) | def _setup_scheduler(self): method _job_executed_listener (line 75) | def _job_executed_listener(self, event): method _job_error_listener (line 82) | def _job_error_listener(self, event): method _job_added_listener (line 88) | def _job_added_listener(self, event): method _job_removed_listener (line 92) | def _job_removed_listener(self, event): method start (line 96) | def start(self): method shutdown (line 104) | def shutdown(self, wait: bool = True): method add_interval_job (line 116) | def add_interval_job( method add_date_job (line 174) | def add_date_job( method remove_job (line 204) | def remove_job(self, job_id: str): method pause_job (line 222) | def pause_job(self, job_id: str): method resume_job (line 240) | def resume_job(self, job_id: str): method get_job (line 258) | def get_job(self, job_id: str): method get_all_jobs (line 273) | def get_all_jobs(self): method modify_job_interval (line 285) | def modify_job_interval( method pause_all_jobs (line 327) | def pause_all_jobs(self): method resume_all_jobs (line 356) | def resume_all_jobs(self): function get_scheduler_manager (line 390) | def get_scheduler_manager() -> SchedulerManager: FILE: lifetrace/jobs/todo_recorder.py function with_timeout (line 42) | def with_timeout(timeout_seconds: float = 5.0, operation_name: str = "操作"): class TodoScreenRecorder (line 68) | class TodoScreenRecorder: method __init__ (line 75) | def __init__(self): method _get_window_info (line 95) | def _get_window_info(self) -> tuple[str, str]: method _is_whitelist_app (line 114) | def _is_whitelist_app(self, app_name: str) -> bool: method _calculate_image_hash_from_memory (line 130) | def _calculate_image_hash_from_memory(self, screenshot) -> str: method _is_duplicate (line 145) | def _is_duplicate(self, image_hash: str) -> bool: method _save_screenshot (line 165) | def _save_screenshot(self, screenshot, file_path: str) -> bool: method _get_image_size (line 180) | def _get_image_size(self, file_path: str) -> tuple: method _calculate_file_hash (line 195) | def _calculate_file_hash(self, file_path: str) -> str: method _save_to_database (line 210) | def _save_to_database( method _trigger_todo_detection (line 246) | def _trigger_todo_detection(self, screenshot_id: int, app_name: str): method _check_whitelist_and_screen (line 275) | def _check_whitelist_and_screen(self, app_name: str) -> tuple[int, str... method _capture_and_save (line 297) | def _capture_and_save( method _save_metadata_and_trigger (line 341) | def _save_metadata_and_trigger( method capture_whitelist_app (line 366) | def capture_whitelist_app(self) -> str | None: method execute_capture (line 388) | def execute_capture(self) -> str | None: function get_todo_recorder_instance (line 410) | def get_todo_recorder_instance() -> TodoScreenRecorder: function execute_todo_capture_task (line 419) | def execute_todo_capture_task() -> int: FILE: lifetrace/llm/activity_summary_service.py class ActivitySummaryService (line 23) | class ActivitySummaryService: method __init__ (line 26) | def __init__(self): method generate_activity_summary (line 30) | def generate_activity_summary( method _generate_summary_with_llm (line 96) | def _generate_summary_with_llm( method _extract_json_from_response (line 190) | def _extract_json_from_response(self, content: str) -> tuple[str, str]: method _parse_llm_response (line 207) | def _parse_llm_response(self, content: str, original_content: str) -> ... method _generate_fallback_summary (line 230) | def _generate_fallback_summary( FILE: lifetrace/llm/agent_service.py class AgentService (line 24) | class AgentService: method __init__ (line 30) | def __init__(self): method stream_agent_response (line 36) | def stream_agent_response( method _build_initial_messages (line 135) | def _build_initial_messages( method _decide_tool_usage (line 171) | def _decide_tool_usage( method _build_tool_decision_messages (line 232) | def _build_tool_decision_messages( method _call_llm_for_tool_selection (line 252) | def _call_llm_for_tool_selection(self, decision_messages: list[dict]) ... method _execute_tool (line 281) | def _execute_tool(self, tool_name: str, tool_params: dict) -> ToolResult: method _format_tool_result (line 301) | def _format_tool_result(self, tool_name: str, result: ToolResult) -> str: method _evaluate_task_completion (line 317) | def _evaluate_task_completion( method _generate_final_response (line 373) | def _generate_final_response( method _get_default_system_prompt (line 453) | def _get_default_system_prompt(self) -> str: method _get_default_tool_selection_prompt (line 462) | def _get_default_tool_selection_prompt( method _get_default_evaluation_prompt (line 484) | def _get_default_evaluation_prompt(self) -> str: FILE: lifetrace/llm/agno_agent.py function _try_register_tool (line 57) | def _try_register_tool(name: str, module_path: str, class_name: str, war... function _ensure_tool_dependency (line 68) | def _ensure_tool_dependency(tool_name: str, package_name: str) -> bool: function _register_external_tools (line 78) | def _register_external_tools(): function get_available_external_tools (line 101) | def get_available_external_tools() -> list[str]: function _create_file_tool (line 107) | def _create_file_tool(tool_class, **kwargs) -> Toolkit | None: function _safe_tool_init (line 127) | def _safe_tool_init(tool_class, **kwargs) -> Toolkit: function create_external_tool (line 144) | def create_external_tool(tool_name: str, **kwargs) -> Toolkit | None: #... function _build_instructions (line 187) | def _build_instructions( class AgnoAgentService (line 230) | class AgnoAgentService: method __init__ (line 240) | def __init__( method _initialize_tools (line 295) | def _initialize_tools( method _build_input_data (line 331) | def _build_input_data( method _format_tool_event (line 349) | def _format_tool_event(self, event_data: dict) -> str: method _handle_tool_call_started (line 353) | def _handle_tool_call_started(self, chunk) -> str | None: method _handle_tool_call_completed (line 366) | def _handle_tool_call_completed(self, chunk) -> str | None: method _handle_tool_call_error (line 388) | def _handle_tool_call_error(self, chunk) -> str | None: method _process_stream_chunk (line 409) | def _process_stream_chunk(self, chunk, include_tool_events: bool) -> s... method stream_response (line 432) | def stream_response( method is_available (line 478) | def is_available(self) -> bool: FILE: lifetrace/llm/agno_tools/base.py class AgnoToolsMessageLoader (line 19) | class AgnoToolsMessageLoader: method __new__ (line 29) | def __new__(cls, lang: str = "en"): method __init__ (line 36) | def __init__(self, lang: str = "en"): method _get_prompts_dir (line 46) | def _get_prompts_dir(self) -> Path: method _load_messages (line 60) | def _load_messages(self): method get (line 83) | def get(self, key: str, **kwargs) -> str: method reload (line 114) | def reload(self): function get_message (line 121) | def get_message(lang: str, key: str, **kwargs) -> str: FILE: lifetrace/llm/agno_tools/toolkit.py class FreeTodoToolkit (line 26) | class FreeTodoToolkit( method __init__ (line 49) | def __init__(self, lang: str = "en", selected_tools: list[str] | None ... FILE: lifetrace/llm/agno_tools/tools/breakdown_tools.py class BreakdownTools (line 15) | class BreakdownTools: method _msg (line 20) | def _msg(self, key: str, **kwargs) -> str: method breakdown_task (line 23) | def breakdown_task(self, task_description: str) -> str: FILE: lifetrace/llm/agno_tools/tools/conflict_tools.py function _parse_datetime (line 24) | def _parse_datetime(value: str | datetime) -> datetime: function _parse_duration_value (line 31) | def _parse_duration_value(value: str | None) -> timedelta | None: # noq... function _get_todo_range (line 72) | def _get_todo_range(todo: dict) -> tuple[datetime, datetime] | None: function _check_schedule_conflict (line 101) | def _check_schedule_conflict(todo: dict, start: datetime, end: datetime,... function _find_conflicts (line 116) | def _find_conflicts(todos: list, start: datetime, end: datetime) -> list: class ConflictTools (line 124) | class ConflictTools: method _msg (line 130) | def _msg(self, key: str, **kwargs) -> str: method _format_conflict_result (line 133) | def _format_conflict_result(self, conflicts: list, time_range: str) ->... method check_schedule_conflict (line 155) | def check_schedule_conflict(self, start_time: str, end_time: str | Non... FILE: lifetrace/llm/agno_tools/tools/stats_tools.py function _parse_datetime (line 21) | def _parse_datetime(value: str | datetime) -> datetime: function _get_schedule_time (line 28) | def _get_schedule_time(todo: dict) -> datetime | None: function _get_start_date (line 38) | def _get_start_date(date_range: str, now: datetime) -> datetime | None: function _filter_by_date (line 49) | def _filter_by_date(todos: list, start_date: datetime | None) -> list: function _count_overdue (line 58) | def _count_overdue(todos: list, now: datetime) -> int: function _count_by_priority (line 70) | def _count_by_priority(todos: list) -> dict: class StatsTools (line 80) | class StatsTools: method _msg (line 86) | def _msg(self, key: str, **kwargs) -> str: method get_todo_stats (line 89) | def get_todo_stats(self, date_range: str = "today") -> str: method get_overdue_todos (line 130) | def get_overdue_todos(self) -> str: FILE: lifetrace/llm/agno_tools/tools/tag_tools.py class TagTools (line 20) | class TagTools: method _msg (line 26) | def _msg(self, key: str, **kwargs) -> str: method list_tags (line 29) | def list_tags(self) -> str: method get_todos_by_tag (line 60) | def get_todos_by_tag(self, tag: str) -> str: method suggest_tags (line 95) | def suggest_tags(self, todo_name: str) -> str: FILE: lifetrace/llm/agno_tools/tools/time_tools.py function _parse_iso_format (line 64) | def _parse_iso_format(time_expression: str) -> tuple[datetime | None, bo... function _parse_date_formats (line 74) | def _parse_date_formats(time_expression: str) -> tuple[datetime | None, ... function _parse_relative_day (line 85) | def _parse_relative_day(expr: str, now: datetime) -> datetime | None: function _parse_days_offset (line 96) | def _parse_days_offset(expr: str, now: datetime) -> datetime | None: function _parse_chinese_weekday (line 105) | def _parse_chinese_weekday(expr: str, now: datetime) -> datetime | None: function _parse_english_weekday (line 118) | def _parse_english_weekday(expr: str, now: datetime) -> datetime | None: function _parse_relative_time (line 132) | def _parse_relative_time(expr: str, now: datetime) -> datetime | None: function _apply_chinese_time (line 149) | def _apply_chinese_time(time_expression: str, result: datetime) -> datet... function _apply_english_time (line 162) | def _apply_english_time(expr: str, result: datetime) -> datetime: function _extract_time_of_day (line 177) | def _extract_time_of_day(time_expression: str, expr: str, result: dateti... class TimeTools (line 183) | class TimeTools: method _msg (line 188) | def _msg(self, key: str, **kwargs) -> str: method parse_time (line 191) | def parse_time(self, time_expression: str) -> str: FILE: lifetrace/llm/agno_tools/tools/todo_tools.py class TodoTools (line 21) | class TodoTools: method _msg (line 27) | def _msg(self, key: str, **kwargs) -> str: method create_todo (line 30) | def create_todo( # noqa: PLR0913 method complete_todo (line 99) | def complete_todo(self, todo_id: int) -> str: method update_todo (line 123) | def update_todo( # noqa: PLR0913, C901 method list_todos (line 192) | def list_todos(self, status: str = "active", limit: int = 10) -> str: method search_todos (line 247) | def search_todos(self, keyword: str) -> str: method delete_todo (line 288) | def delete_todo(self, todo_id: int) -> str: FILE: lifetrace/llm/auto_todo_detection_service.py function get_whitelist_apps (line 24) | def get_whitelist_apps() -> list[str]: class AutoTodoDetectionService (line 45) | class AutoTodoDetectionService: method __init__ (line 48) | def __init__(self): method is_whitelist_app (line 52) | def is_whitelist_app(self, app_name: str) -> bool: method detect_and_create_todos_from_screenshot (line 68) | def detect_and_create_todos_from_screenshot(self, screenshot_id: int) ... method _call_vision_model (line 132) | def _call_vision_model( method _parse_llm_response (line 204) | def _parse_llm_response(self, response_text: str) -> dict[str, Any]: method _build_user_notes (line 238) | def _build_user_notes( method _calculate_todo_scheduled_time (line 263) | def _calculate_todo_scheduled_time(self, time_info: dict[str, Any]) ->... method _create_single_draft_todo (line 275) | def _create_single_draft_todo( method _create_draft_todos (line 322) | def _create_draft_todos( FILE: lifetrace/llm/context_builder.py class ContextBuilder (line 21) | class ContextBuilder: method __init__ (line 24) | def __init__(self, max_context_length: int = 8000): method build_context (line 34) | def build_context( method _format_timestamp (line 65) | def _format_timestamp(self, timestamp: str) -> str: method _format_record_for_summary (line 75) | def _format_record_for_summary( method build_summary_context (line 95) | def build_summary_context(self, query: str, retrieved_data: list[dict[... method build_search_context (line 144) | def build_search_context(self, query: str, retrieved_data: list[dict[s... method _build_app_distribution_context (line 205) | def _build_app_distribution_context( method _build_time_range_context (line 219) | def _build_time_range_context(self, time_range: dict[str, Any]) -> lis... method _build_query_conditions_context (line 233) | def _build_query_conditions_context(self, query_conditions: Any) -> li... method build_statistics_context (line 268) | def build_statistics_context( method _build_data_summary (line 313) | def _build_data_summary(self, retrieved_data: list[dict[str, Any]]) ->... method _build_detailed_records (line 342) | def _build_detailed_records(self, retrieved_data: list[dict[str, Any]]... method _build_metadata (line 359) | def _build_metadata(self, retrieved_data: list[dict[str, Any]]) -> dic... method _group_by_app (line 367) | def _group_by_app( method _truncate_context (line 382) | def _truncate_context(self, context: dict[str, Any]) -> dict[str, Any]: FILE: lifetrace/llm/event_summary_clustering.py function check_clustering_prerequisites (line 27) | def check_clustering_prerequisites(ocr_texts: list[str], vector_service)... function vectorize_texts (line 55) | def vectorize_texts(ocr_texts: list[str], vector_service) -> tuple[list[... function calculate_cluster_params (line 73) | def calculate_cluster_params(text_count: int) -> int: function select_representative_texts (line 90) | def select_representative_texts(cluster_labels: list[int], valid_texts: ... function cluster_ocr_texts_with_hdbscan (line 113) | def cluster_ocr_texts_with_hdbscan(ocr_texts: list[str], vector_service)... FILE: lifetrace/llm/event_summary_ocr.py function should_filter_line (line 25) | def should_filter_line(line: str, debug_info: dict[str, Any]) -> bool: function process_ocr_block (line 47) | def process_ocr_block( function get_event_ocr_texts (line 65) | def get_event_ocr_texts(event_id: int) -> tuple[list[str], dict[str, Any]]: function build_text_to_screenshots_map (line 134) | def build_text_to_screenshots_map(lines_with_meta: list[dict[str, Any]])... function identify_ui_candidates (line 149) | def identify_ui_candidates(text_to_screenshots: dict[str, set[int]]) -> ... function separate_ui_and_body_lines (line 158) | def separate_ui_and_body_lines( function select_representative_ui_texts (line 175) | def select_representative_ui_texts(ui_lines: list[str]) -> list[str]: function separate_ui_candidates (line 189) | def separate_ui_candidates( FILE: lifetrace/llm/event_summary_service.py class EventSummaryService (line 34) | class EventSummaryService: method __init__ (line 37) | def __init__(self, vector_service=None): method _get_vector_service (line 46) | def _get_vector_service(self): method _process_event_with_few_screenshots (line 71) | def _process_event_with_few_screenshots( method _process_event_with_sufficient_screenshots (line 89) | def _process_event_with_sufficient_screenshots( method _update_event_summary_in_db (line 135) | def _update_event_summary_in_db(self, event_id: int, result: dict[str,... method generate_event_summary (line 153) | def generate_event_summary(self, event_id: int) -> bool: method _get_event_info (line 190) | def _get_event_info(self, event_id: int) -> dict[str, Any] | None: method _prepare_ocr_text (line 209) | def _prepare_ocr_text(self, ocr_texts: list[str]) -> str | None: method _extract_json_from_response (line 219) | def _extract_json_from_response(self, content: str) -> tuple[str, str]: method _parse_llm_response (line 232) | def _parse_llm_response(self, content: str, original_content: str) -> ... method _generate_summary_with_llm (line 251) | def _generate_summary_with_llm( method _generate_fallback_summary (line 321) | def _generate_fallback_summary( function generate_event_summary_async (line 345) | def generate_event_summary_async(event_id: int): FILE: lifetrace/llm/journal_generation_service.py class JournalGenerationService (line 18) | class JournalGenerationService: method __init__ (line 21) | def __init__(self) -> None: method generate_objective (line 24) | def generate_objective( method generate_ai_view (line 46) | def generate_ai_view( method _call_llm (line 76) | def _call_llm(self, system_prompt: str, user_prompt: str, response_typ... method _build_objective_prompt (line 104) | def _build_objective_prompt( method _build_ai_prompt (line 122) | def _build_ai_prompt( method _format_activity_text (line 145) | def _format_activity_text(self, activities: list[dict[str, Any]]) -> str: method _format_todo_text (line 161) | def _format_todo_text(self, todos: list[dict[str, Any]]) -> str: method _format_time (line 177) | def _format_time(self, value: Any) -> str: method _fallback_objective (line 184) | def _fallback_objective( method _fallback_ai_view (line 206) | def _fallback_ai_view(self, content_original: str, language: str) -> str: FILE: lifetrace/llm/llm_client.py class LLMClient (line 33) | class LLMClient: method __new__ (line 39) | def __new__(cls): method __init__ (line 45) | def __init__(self): method _initialize_client (line 52) | def _initialize_client(self): method reinitialize (line 86) | def reinitialize(self): method is_available (line 103) | def is_available(self) -> bool: method _get_client (line 107) | def _get_client(self) -> OpenAI: method classify_intent (line 112) | def classify_intent(self, user_query: str) -> dict[str, Any]: method parse_query (line 120) | def parse_query(self, user_query: str) -> dict[str, Any]: method generate_summary (line 128) | def generate_summary(self, query: str, context_data: list[dict[str, An... method chat (line 136) | def chat( method stream_chat (line 161) | def stream_chat( method vision_chat (line 191) | def vision_chat( method _rule_based_intent_classification (line 214) | def _rule_based_intent_classification(self, user_query: str) -> dict[s... method _rule_based_parse (line 218) | def _rule_based_parse(self, user_query: str) -> dict[str, Any]: method _build_context_text (line 222) | def _build_context_text(self, context_data: list[dict[str, Any]]) -> str: method _fallback_summary (line 226) | def _fallback_summary(self, query: str, context_data: list[dict[str, A... FILE: lifetrace/llm/llm_client_intent.py function classify_intent_with_llm (line 16) | def classify_intent_with_llm(client, model: str, user_query: str) -> dic... function rule_based_intent_classification (line 104) | def rule_based_intent_classification(user_query: str) -> dict[str, Any]: FILE: lifetrace/llm/llm_client_query.py function parse_query_with_llm (line 18) | def parse_query_with_llm(client, model: str, user_query: str) -> dict[st... function rule_based_parse (line 84) | def rule_based_parse(user_query: str) -> dict[str, Any]: function build_context_text (line 150) | def build_context_text(context_data: list[dict[str, Any]]) -> str: function generate_summary_with_llm (line 190) | def generate_summary_with_llm( function fallback_summary (line 256) | def fallback_summary(query: str, context_data: list[dict[str, Any]]) -> ... function build_context (line 268) | def build_context(context_data: list[dict[str, Any]]) -> str: FILE: lifetrace/llm/llm_client_vision.py function get_vision_model (line 16) | def get_vision_model(model: str | None, default_model: str) -> str: function get_vision_temperature (line 21) | def get_vision_temperature(temperature: float | None) -> float: function get_vision_max_tokens (line 26) | def get_vision_max_tokens(max_tokens: int | None) -> int: function vision_chat (line 31) | def vision_chat( FILE: lifetrace/llm/ocr_todo_extractor.py function _compute_text_hash (line 24) | def _compute_text_hash(text_content: str) -> str | None: class OCRTodoExtractor (line 35) | class OCRTodoExtractor: method __init__ (line 38) | def __init__(self, llm_client: LLMClient): method extract_todos (line 51) | def extract_todos( # noqa: PLR0911, PLR0912, PLR0915, C901 FILE: lifetrace/llm/rag_fallback.py function summarize_retrieved_data (line 15) | def summarize_retrieved_data(retrieved_data: list[dict[str, Any]]) -> di... function fallback_response (line 43) | def fallback_response( function generate_direct_response (line 91) | def generate_direct_response(llm_client, user_query: str, intent_result:... function fallback_direct_response (line 133) | def fallback_direct_response(user_query: str, intent_result: dict[str, A... FILE: lifetrace/llm/rag_service.py class RAGService (line 37) | class RAGService: method __init__ (line 40) | def __init__(self): method _handle_direct_query (line 49) | def _handle_direct_query( method _get_statistics_if_needed (line 74) | def _get_statistics_if_needed( method _build_context_for_query (line 82) | def _build_context_for_query( method process_query (line 95) | async def process_query(self, user_query: str, max_results: int = 50) ... method process_query_sync (line 165) | def process_query_sync(self, user_query: str, max_results: int = 50) -... method post_stream_decision (line 169) | def post_stream_decision(self, user_query: str, output_text: str) -> N... method stream_query (line 184) | def stream_query( method get_query_suggestions (line 225) | def get_query_suggestions(self, partial_query: str = "") -> list[str]: method get_supported_query_types (line 248) | def get_supported_query_types(self) -> dict[str, Any]: method health_check (line 292) | def health_check(self) -> dict[str, Any]: method process_query_stream (line 306) | async def process_query_stream( FILE: lifetrace/llm/rag_stream.py class RAGStreamContext (line 18) | class RAGStreamContext: function stream_direct_response (line 30) | def stream_direct_response( function stream_with_retrieval (line 62) | def stream_with_retrieval( function _build_context_for_query (line 116) | def _build_context_for_query( function get_statistics_if_needed (line 128) | def get_statistics_if_needed( FILE: lifetrace/llm/retrieval_service.py class RetrievalService (line 22) | class RetrievalService: method __init__ (line 25) | def __init__(self): method _build_base_query (line 32) | def _build_base_query(self, session: Any, conditions: QueryConditions)... method _convert_screenshot_to_dict (line 60) | def _convert_screenshot_to_dict( method _log_query_results (line 81) | def _log_query_results(self, data_list: list[dict[str, Any]]) -> None: method search_by_conditions (line 112) | def search_by_conditions( method search_by_query (line 154) | def search_by_query(self, user_query: str, limit: int = 50) -> list[di... method search_recent (line 172) | def search_recent( method search_by_app (line 197) | def search_by_app(self, app_name: str, days: int = 7, limit: int = 50)... method search_by_keywords (line 220) | def search_by_keywords( method _apply_stats_conditions (line 241) | def _apply_stats_conditions(self, query: Any, conditions: QueryConditi... method _build_stats_result (line 258) | def _build_stats_result( method get_statistics (line 285) | def get_statistics(self, conditions: QueryConditions | None = None) ->... method _calculate_relevance (line 339) | def _calculate_relevance( FILE: lifetrace/llm/tavily_client.py class TavilyClientWrapper (line 13) | class TavilyClientWrapper: method __new__ (line 19) | def __new__(cls): method __init__ (line 25) | def __init__(self): method _initialize_client (line 31) | def _initialize_client(self): method is_available (line 58) | def is_available(self) -> bool: method _get_client (line 62) | def _get_client(self) -> TavilyClient: method search (line 67) | def search(self, query: str, **kwargs) -> dict[str, Any]: method research (line 141) | def research(self, query: str, **kwargs) -> dict[str, Any]: FILE: lifetrace/llm/todo_extraction_service.py class TodoExtractionService (line 31) | class TodoExtractionService: method __init__ (line 34) | def __init__(self): method is_whitelist_app (line 39) | def is_whitelist_app(self, app_name: str) -> bool: method sample_screenshots (line 56) | def sample_screenshots( method extract_todos_from_event (line 98) | def extract_todos_from_event( method _call_vision_model (line 185) | def _call_vision_model( method _parse_llm_response (line 264) | def _parse_llm_response(self, response_text: str) -> list[dict[str, An... method _parse_todo_time (line 298) | def _parse_todo_time( method extract_todos_from_ocr_text (line 332) | def extract_todos_from_ocr_text( FILE: lifetrace/llm/tools/base.py class ToolResult (line 9) | class ToolResult: class Tool (line 18) | class Tool(ABC): method name (line 23) | def name(self) -> str: method description (line 29) | def description(self) -> str: method parameters_schema (line 35) | def parameters_schema(self) -> dict: method execute (line 40) | def execute(self, **kwargs) -> ToolResult: method is_available (line 44) | def is_available(self) -> bool: FILE: lifetrace/llm/tools/registry.py class ToolRegistry (line 11) | class ToolRegistry: method __new__ (line 17) | def __new__(cls): method register (line 22) | def register(self, tool: Tool): method get_tool (line 27) | def get_tool(self, name: str) -> Tool | None: method get_available_tools (line 31) | def get_available_tools(self) -> list[Tool]: method get_tools_schema (line 35) | def get_tools_schema(self) -> list[dict]: FILE: lifetrace/llm/tools/web_search_tool.py class WebSearchTool (line 10) | class WebSearchTool(Tool): method __init__ (line 13) | def __init__(self): method name (line 18) | def name(self) -> str: method description (line 22) | def description(self) -> str: method parameters_schema (line 30) | def parameters_schema(self) -> dict: method execute (line 42) | def execute(self, **kwargs) -> ToolResult: method is_available (line 103) | def is_available(self) -> bool: FILE: lifetrace/llm/vector_db.py class VectorDatabase (line 32) | class VectorDatabase: method __init__ (line 39) | def __init__(self): method _check_dependencies (line 62) | def _check_dependencies(self) -> bool: method _initialize (line 74) | def _initialize(self): method _get_cross_encoder (line 113) | def _get_cross_encoder(self) -> Any: method embed_text (line 122) | def embed_text(self, text: str) -> list[float]: method add_document (line 145) | def add_document(self, doc_id: str, text: str, metadata: dict[str, Any... method add_document_with_embedding (line 196) | def add_document_with_embedding( method update_document (line 253) | def update_document( method delete_document (line 275) | def delete_document(self, doc_id: str) -> bool: method search (line 294) | def search( method _clean_where_clause (line 350) | def _clean_where_clause(self, where: dict[str, Any] | None) -> dict[st... method rerank (line 378) | def rerank( method search_and_rerank (line 418) | def search_and_rerank( method get_collection_stats (line 459) | def get_collection_stats(self) -> dict[str, Any]: method reset_collection (line 480) | def reset_collection(self) -> bool: function create_vector_db (line 501) | def create_vector_db() -> VectorDatabase | None: FILE: lifetrace/llm/vector_service.py class VectorService (line 19) | class VectorService: method __init__ (line 25) | def __init__(self): method is_enabled (line 38) | def is_enabled(self) -> bool: method _require_vector_db (line 42) | def _require_vector_db(self): method add_ocr_result (line 47) | def add_ocr_result(self, ocr_result: OCRResult, screenshot: Screenshot... method update_ocr_result (line 114) | def update_ocr_result( method delete_ocr_result (line 174) | def delete_ocr_result(self, ocr_result_id: int) -> bool: method _compute_score (line 202) | def _compute_score(self, result: dict[str, Any]) -> float: method _fetch_db_records (line 210) | def _fetch_db_records( method _enhance_result (line 250) | def _enhance_result(self, result: dict[str, Any]) -> dict[str, Any]: method semantic_search (line 266) | def semantic_search( method upsert_event_document (line 307) | def upsert_event_document(self, event_id: int) -> bool: method _aggregate_event_scores (line 327) | def _aggregate_event_scores(self, results: list[dict[str, Any]]) -> di... method _fetch_event_details (line 343) | def _fetch_event_details( method semantic_search_events (line 374) | def semantic_search_events(self, query: str, top_k: int = 10) -> list[... method _should_reset_vector_db (line 404) | def _should_reset_vector_db( method _sync_ocr_results (line 413) | def _sync_ocr_results(self, session, ocr_results: list) -> int: method sync_from_database (line 433) | def sync_from_database(self, limit: int | None = None, force_reset: bo... method get_stats (line 486) | def get_stats(self) -> dict[str, Any]: method reset (line 504) | def reset(self) -> bool: function create_vector_service (line 524) | def create_vector_service() -> VectorService: FILE: lifetrace/llm/web_search_service.py class WebSearchService (line 14) | class WebSearchService: method __init__ (line 17) | def __init__(self): method build_search_prompt (line 23) | def build_search_prompt( method _parse_message_with_context (line 77) | def _parse_message_with_context(self, message: str) -> tuple[str, str ... method stream_answer_with_sources (line 110) | def stream_answer_with_sources(self, query: str, lang: str = "zh") -> ... method _format_fallback_response (line 168) | def _format_fallback_response(self, query: str, tavily_result: dict) -... FILE: lifetrace/migrations/env.py function get_url (line 49) | def get_url(): function run_migrations_offline (line 54) | def run_migrations_offline() -> None: function run_migrations_online (line 77) | def run_migrations_online() -> None: FILE: lifetrace/migrations/re_extract_all_transcriptions.py function is_empty_extraction (line 42) | def is_empty_extraction(extracted: str | None) -> bool: function needs_extraction (line 58) | def needs_extraction(transcription: Transcription) -> tuple[bool, bool]: function re_extract_transcription (line 92) | async def re_extract_transcription( function parse_date (line 174) | def parse_date(date_str: str) -> datetime: function parse_ids (line 183) | def parse_ids(ids_str: str) -> list[int]: function setup_argument_parser (line 191) | def setup_argument_parser() -> argparse.ArgumentParser: function calculate_date_range (line 220) | def calculate_date_range(args: argparse.Namespace) -> tuple[datetime | N... function log_start_info (line 234) | def log_start_info( function find_transcriptions_needing_extraction (line 247) | def find_transcriptions_needing_extraction( function process_extractions (line 282) | async def process_extractions( function log_final_stats (line 326) | def log_final_stats(stats: dict[str, int]) -> None: function main (line 337) | async def main(): FILE: lifetrace/migrations/versions/034079ad387f_add_segment_timestamps.py function upgrade (line 22) | def upgrade() -> None: function downgrade (line 43) | def downgrade() -> None: FILE: lifetrace/migrations/versions/4ca5036ec7c8_add_context_to_chats.py function upgrade (line 23) | def upgrade() -> None: function downgrade (line 35) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_automation_tasks_001.py function upgrade (line 25) | def upgrade() -> None: function downgrade (line 53) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_file_path_to_audio_recordings.py function upgrade (line 24) | def upgrade() -> None: function _create_transcriptions_table_if_not_exists (line 119) | def _create_transcriptions_table_if_not_exists(existing_tables: list[str... function downgrade (line 142) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_icalendar_fields_v2_001.py function _add_missing_todo_columns (line 27) | def _add_missing_todo_columns(columns: set[str]) -> None: function _backfill_todo_ical_fields (line 57) | def _backfill_todo_ical_fields(connection: sa.Connection) -> None: function upgrade (line 83) | def upgrade() -> None: function downgrade (line 96) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_journal_panel_001.py function _add_column_if_missing (line 22) | def _add_column_if_missing(table: str, column: sa.Column, columns: set[s... function upgrade (line 27) | def upgrade() -> None: function downgrade (line 81) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_optimized_extraction_fields.py function upgrade (line 22) | def upgrade() -> None: function downgrade (line 50) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_text_hash_to_ocr_results.py function _normalize_text (line 23) | def _normalize_text(text: str | None) -> str: function upgrade (line 30) | def upgrade() -> None: function downgrade (line 65) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_todo_attachment_source_001.py function upgrade (line 22) | def upgrade() -> None: function downgrade (line 38) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_todo_end_time_001.py function upgrade (line 22) | def upgrade() -> None: function downgrade (line 35) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_todo_reminder_offsets_001.py function upgrade (line 22) | def upgrade() -> None: function downgrade (line 35) | def downgrade() -> None: FILE: lifetrace/migrations/versions/add_todo_timezone_all_day_001.py function upgrade (line 22) | def upgrade() -> None: function downgrade (line 40) | def downgrade() -> None: FILE: lifetrace/migrations/versions/b53d9b7c8e21_add_uid_to_journals.py function _add_missing_journal_columns (line 28) | def _add_missing_journal_columns(columns: set[str]) -> None: function _ensure_journal_uid_index (line 34) | def _ensure_journal_uid_index(inspector: sa.Inspector) -> None: function _backfill_journal_uids (line 40) | def _backfill_journal_uids(connection: sa.Connection) -> None: function upgrade (line 55) | def upgrade() -> None: function downgrade (line 67) | def downgrade() -> None: FILE: lifetrace/migrations/versions/cc25001eb19c_initial_schema.py function upgrade (line 20) | def upgrade() -> None: function downgrade (line 29) | def downgrade() -> None: FILE: lifetrace/migrations/versions/cff6e6d7a3cf_merge_heads_segment_timestamps_and_.py function upgrade (line 18) | def upgrade() -> None: function downgrade (line 22) | def downgrade() -> None: FILE: lifetrace/migrations/versions/d2f7a9c6b1a4_add_icalendar_fields_to_todos.py function _add_missing_todo_columns (line 29) | def _add_missing_todo_columns(columns: set[str]) -> None: function _ensure_todo_uid_index (line 42) | def _ensure_todo_uid_index(inspector: sa.Inspector) -> None: function _build_todo_updates (line 48) | def _build_todo_updates(row: dict[str, object]) -> dict[str, object]: function _backfill_todo_ical_fields (line 67) | def _backfill_todo_ical_fields(connection: sa.Connection) -> None: function upgrade (line 88) | def upgrade() -> None: function downgrade (line 98) | def downgrade() -> None: FILE: lifetrace/migrations/versions/merge_automation_ical_001.py function upgrade (line 24) | def upgrade() -> None: function downgrade (line 29) | def downgrade() -> None: FILE: lifetrace/migrations/versions/merge_heads_journal_todo_20260203.py function upgrade (line 22) | def upgrade() -> None: function downgrade (line 26) | def downgrade() -> None: FILE: lifetrace/migrations/versions/merge_heads_todos_20260131.py function upgrade (line 23) | def upgrade() -> None: function downgrade (line 27) | def downgrade() -> None: FILE: lifetrace/migrations/versions/merge_journal_uid_automation_20260204.py function upgrade (line 24) | def upgrade() -> None: function downgrade (line 29) | def downgrade() -> None: FILE: lifetrace/migrations/versions/remove_project_task_tables.py function upgrade (line 25) | def upgrade() -> None: function downgrade (line 61) | def downgrade() -> None: FILE: lifetrace/observability/config.py class LocalExporterConfig (line 15) | class LocalExporterConfig: class PhoenixConfig (line 24) | class PhoenixConfig: class TerminalConfig (line 35) | class TerminalConfig: class ObservabilityConfig (line 42) | class ObservabilityConfig: function get_observability_config (line 52) | def get_observability_config() -> ObservabilityConfig: function get_traces_directory (line 97) | def get_traces_directory() -> Path: FILE: lifetrace/observability/exporters/file_exporter.py function _get_current_session_id (line 36) | def _get_current_session_id() -> str | None: function _coerce_int (line 58) | def _coerce_int(value: Any) -> int: class LocalFileExporter (line 65) | class LocalFileExporter(SpanExporter): method __init__ (line 76) | def __init__( method _get_traces_path (line 103) | def _get_traces_path(self) -> Path: method _get_session_file_path (line 109) | def _get_session_file_path(self, session_id: str) -> Path: method _load_session_data (line 136) | def _load_session_data(self, filepath: Path) -> dict[str, Any]: method _save_session_data (line 147) | def _save_session_data(self, filepath: Path, data: dict[str, Any]) -> ... method _extract_span_kind (line 160) | def _extract_span_kind(self, span: ReadableSpan) -> str: method _extract_tool_call (line 165) | def _extract_tool_call(self, span: ReadableSpan) -> dict[str, Any] | N... method _extract_llm_call (line 198) | def _extract_llm_call(self, span: ReadableSpan) -> dict[str, Any] | None: method _aggregate_spans (line 222) | def _aggregate_spans(self, spans: Sequence[ReadableSpan]) -> dict[str,... method _write_to_file (line 292) | def _write_to_file( method _write_to_session_file (line 333) | def _write_to_session_file(self, trace_data: dict[str, Any], session_i... method _cleanup_old_files (line 387) | def _cleanup_old_files(self, traces_path: Path) -> None: method _print_summary (line 407) | def _print_summary( method export (line 467) | def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: method shutdown (line 514) | def shutdown(self) -> None: method force_flush (line 527) | def force_flush(self, timeout_millis: int = 30000) -> bool: FILE: lifetrace/observability/exporters/phoenix_exporter.py class PhoenixCircuitBreakerExporter (line 26) | class PhoenixCircuitBreakerExporter(SpanExporter): method __init__ (line 29) | def __init__( method _should_skip_export (line 46) | def _should_skip_export(self) -> bool: method _handle_success (line 76) | def _handle_success(self) -> None: method _handle_failure (line 85) | def _handle_failure(self, error: Exception | None) -> None: method _endpoint_is_reachable (line 114) | def _endpoint_is_reachable(self) -> bool: method export (line 128) | def export(self, spans: Sequence[ReadableSpan]) -> SpanExportResult: method shutdown (line 147) | def shutdown(self) -> None: method force_flush (line 153) | def force_flush(self, timeout_millis: int = 30000) -> bool: FILE: lifetrace/observability/setup.py function _suppress_otel_context_warnings (line 20) | def _suppress_otel_context_warnings(): function _try_create_phoenix_exporter (line 73) | def _try_create_phoenix_exporter(config): function _setup_phoenix_exporter (line 107) | def _setup_phoenix_exporter(tracer_provider, config) -> None: function _setup_agno_instrumentor (line 123) | def _setup_agno_instrumentor() -> None: function _setup_openai_instrumentor (line 136) | def _setup_openai_instrumentor() -> None: function setup_observability (line 155) | def setup_observability() -> bool: function is_observability_enabled (line 222) | def is_observability_enabled() -> bool: FILE: lifetrace/repositories/interfaces.py class IChatRepository (line 11) | class IChatRepository(ABC): method create_chat (line 15) | def create_chat( method get_chat_by_session_id (line 27) | def get_chat_by_session_id(self, session_id: str) -> dict[str, Any] | ... method list_chats (line 32) | def list_chats( method update_chat_title (line 42) | def update_chat_title(self, session_id: str, title: str) -> bool: method delete_chat (line 47) | def delete_chat(self, session_id: str) -> bool: method add_message (line 52) | def add_message( method get_messages (line 65) | def get_messages( method get_message_count (line 75) | def get_message_count(self, session_id: str) -> int: method get_chat_summaries (line 80) | def get_chat_summaries( method get_chat_context (line 89) | def get_chat_context(self, session_id: str) -> str | None: method update_chat_context (line 94) | def update_chat_context(self, session_id: str, context: str) -> bool: class ITodoRepository (line 107) | class ITodoRepository(ABC): method get_by_id (line 111) | def get_by_id(self, todo_id: int) -> dict[str, Any] | None: method get_by_uid (line 116) | def get_by_uid(self, uid: str) -> dict[str, Any] | None: method list_todos (line 121) | def list_todos(self, limit: int, offset: int, status: str | None) -> l... method count (line 126) | def count(self, status: str | None) -> int: method create (line 131) | def create(self, **kwargs) -> int | None: method update (line 136) | def update(self, todo_id: int, **kwargs) -> bool: method delete (line 141) | def delete(self, todo_id: int) -> bool: method reorder (line 146) | def reorder(self, items: list[dict[str, Any]]) -> bool: method add_attachment (line 151) | def add_attachment( method remove_attachment (line 166) | def remove_attachment(self, *, todo_id: int, attachment_id: int) -> bool: method get_attachment (line 171) | def get_attachment(self, attachment_id: int) -> dict[str, Any] | None: class IJournalRepository (line 176) | class IJournalRepository(ABC): method get_by_id (line 180) | def get_by_id(self, journal_id: int) -> dict[str, Any] | None: method list_journals (line 185) | def list_journals( method count (line 196) | def count(self, start_date: datetime | None, end_date: datetime | None... method create (line 201) | def create(self, payload: Any) -> int | None: method update (line 206) | def update(self, journal_id: int, payload: Any) -> bool: method delete (line 211) | def delete(self, journal_id: int) -> bool: class IEventRepository (line 216) | class IEventRepository(ABC): method get_summary (line 220) | def get_summary(self, event_id: int) -> dict[str, Any] | None: method list_events (line 225) | def list_events( method count_events (line 237) | def count_events( method get_screenshots (line 247) | def get_screenshots(self, event_id: int) -> list[dict[str, Any]]: method update_summary (line 252) | def update_summary(self, event_id: int, ai_title: str, ai_summary: str... method get_events_by_ids (line 257) | def get_events_by_ids(self, event_ids: list[int]) -> list[dict[str, An... class IOcrRepository (line 262) | class IOcrRepository(ABC): method get_results_by_screenshot (line 266) | def get_results_by_screenshot(self, screenshot_id: int) -> list[dict[s... class IActivityRepository (line 271) | class IActivityRepository(ABC): method get_by_id (line 275) | def get_by_id(self, activity_id: int) -> dict[str, Any] | None: method get_activities (line 280) | def get_activities( method count_activities (line 291) | def count_activities( method get_activity_events (line 300) | def get_activity_events(self, activity_id: int) -> list[int]: method create_activity (line 305) | def create_activity( method activity_exists_for_event_id (line 317) | def activity_exists_for_event_id(self, event_id: int) -> bool: FILE: lifetrace/repositories/sql_activity_repository.py class SqlActivityRepository (line 14) | class SqlActivityRepository(IActivityRepository): method __init__ (line 17) | def __init__(self, db_base: DatabaseBase): method get_by_id (line 20) | def get_by_id(self, activity_id: int) -> dict[str, Any] | None: method get_activities (line 23) | def get_activities( method count_activities (line 37) | def count_activities( method get_activity_events (line 47) | def get_activity_events(self, activity_id: int) -> list[int]: method create_activity (line 50) | def create_activity( method activity_exists_for_event_id (line 66) | def activity_exists_for_event_id(self, event_id: int) -> bool: FILE: lifetrace/repositories/sql_chat_repository.py class SqlChatRepository (line 13) | class SqlChatRepository(IChatRepository): method __init__ (line 16) | def __init__(self, db_base: DatabaseBase): method create_chat (line 20) | def create_chat( method get_chat_by_session_id (line 36) | def get_chat_by_session_id(self, session_id: str) -> dict[str, Any] | ... method list_chats (line 39) | def list_chats( method update_chat_title (line 51) | def update_chat_title(self, session_id: str, title: str) -> bool: method delete_chat (line 54) | def delete_chat(self, session_id: str) -> bool: method add_message (line 57) | def add_message( method get_messages (line 75) | def get_messages( method get_message_count (line 87) | def get_message_count(self, session_id: str) -> int: method get_chat_summaries (line 90) | def get_chat_summaries( method get_chat_context (line 100) | def get_chat_context(self, session_id: str) -> str | None: method update_chat_context (line 103) | def update_chat_context(self, session_id: str, context: str) -> bool: FILE: lifetrace/repositories/sql_event_repository.py class SqlEventRepository (line 15) | class SqlEventRepository(IEventRepository): method __init__ (line 18) | def __init__(self, db_base: DatabaseBase): method get_summary (line 21) | def get_summary(self, event_id: int) -> dict[str, Any] | None: method list_events (line 24) | def list_events( method count_events (line 40) | def count_events( method get_screenshots (line 52) | def get_screenshots(self, event_id: int) -> list[dict[str, Any]]: method update_summary (line 55) | def update_summary(self, event_id: int, ai_title: str, ai_summary: str... method get_events_by_ids (line 58) | def get_events_by_ids(self, event_ids: list[int]) -> list[dict[str, An... class SqlOcrRepository (line 62) | class SqlOcrRepository(IOcrRepository): method __init__ (line 65) | def __init__(self, db_base: DatabaseBase): method get_results_by_screenshot (line 68) | def get_results_by_screenshot(self, screenshot_id: int) -> list[dict[s... FILE: lifetrace/repositories/sql_journal_repository.py class SqlJournalRepository (line 14) | class SqlJournalRepository(IJournalRepository): method __init__ (line 17) | def __init__(self, db_base: DatabaseBase): method get_by_id (line 20) | def get_by_id(self, journal_id: int) -> dict[str, Any] | None: method list_journals (line 23) | def list_journals( method count (line 37) | def count(self, start_date: datetime | None, end_date: datetime | None... method create (line 40) | def create(self, payload: Any) -> int | None: method update (line 43) | def update(self, journal_id: int, payload: Any) -> bool: method delete (line 46) | def delete(self, journal_id: int) -> bool: FILE: lifetrace/repositories/sql_todo_repository.py class SqlTodoRepository (line 13) | class SqlTodoRepository(ITodoRepository): method __init__ (line 16) | def __init__(self, db_base: DatabaseBase): method get_by_id (line 20) | def get_by_id(self, todo_id: int) -> dict[str, Any] | None: method get_by_uid (line 23) | def get_by_uid(self, uid: str) -> dict[str, Any] | None: method list_todos (line 26) | def list_todos(self, limit: int, offset: int, status: str | None) -> l... method count (line 29) | def count(self, status: str | None) -> int: method create (line 32) | def create(self, **kwargs) -> int | None: method update (line 35) | def update(self, todo_id: int, **kwargs) -> bool: method delete (line 38) | def delete(self, todo_id: int) -> bool: method reorder (line 41) | def reorder(self, items: list[dict[str, Any]]) -> bool: method add_attachment (line 44) | def add_attachment( method remove_attachment (line 65) | def remove_attachment(self, *, todo_id: int, attachment_id: int) -> bool: method get_attachment (line 71) | def get_attachment(self, attachment_id: int) -> dict[str, Any] | None: FILE: lifetrace/routers/activity.py function list_activities (line 23) | async def list_activities( function get_activity_events (line 47) | async def get_activity_events( function create_activity_manual (line 60) | async def create_activity_manual( FILE: lifetrace/routers/audio.py function _to_local (line 36) | def _to_local(dt: datetime | None) -> datetime | None: function get_recordings (line 48) | async def get_recordings(date: str | None = Query(None)): function _parse_date_param (line 92) | def _parse_date_param(date: str | None) -> datetime: function _build_timeline_item (line 108) | def _build_timeline_item( function get_timeline (line 142) | async def get_timeline(date: str | None = Query(None), optimized: bool =... function get_recording_file (line 164) | async def get_recording_file(recording_id: int): function _load_extracted_json (line 185) | def _load_extracted_json(transcription: dict[str, Any], field: str) -> l... function _refresh_extracted_from_db (line 204) | def _refresh_extracted_from_db( function _parse_extracted (line 235) | def _parse_extracted( function get_transcription (line 266) | async def get_transcription(recording_id: int, optimized: bool = Query(F... class AudioLinkItem (line 293) | class AudioLinkItem(BaseModel): class AudioLinkRequest (line 299) | class AudioLinkRequest(BaseModel): function link_extracted_items (line 304) | async def link_extracted_items( function optimize_transcription (line 327) | async def optimize_transcription(recording_id: int): function extract_todos_and_schedules (line 362) | async def extract_todos_and_schedules(recording_id: int, optimized: bool... FILE: lifetrace/routers/audio_ws.py function _track_task (line 45) | def _track_task(task_set: set[asyncio.Task], coro) -> asyncio.Task: function _to_local (line 52) | def _to_local(dt: datetime | None) -> datetime | None: function _pcm16le_to_wav (line 63) | def _pcm16le_to_wav( function _create_result_callback (line 98) | def _create_result_callback( function _create_error_callback (line 151) | def _create_error_callback( function _create_realtime_nlp_handler (line 183) | def _create_realtime_nlp_handler( # noqa: C901 function _handle_websocket_text_message (line 288) | def _handle_websocket_text_message( function _audio_stream_generator (line 317) | async def _audio_stream_generator( function _parse_init_message (line 358) | def _parse_init_message(logger, init_message: dict[str, Any]) -> bool: function _apply_agc_to_pcm (line 363) | def _apply_agc_to_pcm(logger, pcm_bytes: bytes) -> bytes: function _detect_silence (line 398) | def _detect_silence( function _persist_recording (line 426) | def _persist_recording( function _save_transcription_if_any (line 457) | async def _save_transcription_if_any( function _get_segment_functions (line 475) | def _get_segment_functions(): function _get_transcribe_handler (line 482) | def _get_transcribe_handler(): function register_audio_ws_routes (line 488) | def register_audio_ws_routes(*, router: APIRouter, logger, asr_client, a... FILE: lifetrace/routers/audio_ws_handler.py function _handle_json_error (line 18) | async def _handle_json_error(websocket: WebSocket, logger, e: json.JSOND... function _handle_websocket_error (line 25) | async def _handle_websocket_error(websocket: WebSocket, logger, e: Excep... class _RunTranscriptionStreamContext (line 32) | class _RunTranscriptionStreamContext: method __init__ (line 35) | def __init__(self, **kwargs): function _run_transcription_stream (line 46) | async def _run_transcription_stream(*, ctx: _RunTranscriptionStreamConte... function _get_audio_ws_functions (line 63) | def _get_audio_ws_functions(): class _SaveFinalDataContext (line 81) | class _SaveFinalDataContext: method __init__ (line 84) | def __init__(self, **kwargs): function _save_final_data_internal (line 98) | async def _save_final_data_internal(*, ctx: _SaveFinalDataContext) -> None: function _initialize_handlers_internal (line 141) | async def _initialize_handlers_internal( class _StartSegmentMonitorContext (line 179) | class _StartSegmentMonitorContext: method __init__ (line 182) | def __init__(self, **kwargs): function _start_segment_monitor_internal (line 196) | async def _start_segment_monitor_internal( function _setup_websocket_state (line 221) | def _setup_websocket_state(): function _run_transcription_with_handlers (line 245) | async def _run_transcription_with_handlers( function _setup_websocket_connection (line 269) | async def _setup_websocket_connection(*, websocket: WebSocket, logger) -... function _create_handlers_and_monitor (line 278) | async def _create_handlers_and_monitor( function _run_main_transcription_flow (line 317) | async def _run_main_transcription_flow( function _handle_websocket_errors (line 351) | async def _handle_websocket_errors( function _create_nlp_handler (line 372) | async def _create_nlp_handler( function _create_save_final_data_func (line 387) | async def _create_save_final_data_func( function _cleanup_websocket (line 418) | async def _cleanup_websocket( function _handle_transcribe_ws (line 435) | async def _handle_transcribe_ws(*, websocket: WebSocket, logger, asr_cli... FILE: lifetrace/routers/audio_ws_segment.py function _track_task (line 27) | def _track_task(coro) -> asyncio.Task: class _SegmentMonitorContext (line 34) | class _SegmentMonitorContext: method __init__ (line 37) | def __init__(self, **kwargs): class _SegmentSaveContext (line 49) | class _SegmentSaveContext: method __init__ (line 52) | def __init__(self, **kwargs): function _notify_segment_saved (line 64) | async def _notify_segment_saved(ctx: _SegmentSaveContext) -> None: function _persist_segment_async (line 89) | async def _persist_segment_async( function _save_current_segment (line 123) | async def _save_current_segment(*, params: dict) -> None: function _check_time_segment (line 180) | async def _check_time_segment( function _check_silence_segment (line 204) | async def _check_silence_segment( function _check_manual_segment (line 247) | async def _check_manual_segment( function _segment_monitor_task (line 272) | async def _segment_monitor_task(*, params: dict, is_24x7: bool) -> None: FILE: lifetrace/routers/automation.py function list_tasks (line 17) | async def list_tasks(): function get_task (line 27) | async def get_task(task_id: int): function create_task (line 36) | async def create_task(request: AutomationTaskCreate): function update_task (line 51) | async def update_task(task_id: int, request: AutomationTaskUpdate): function delete_task (line 67) | async def delete_task(task_id: int): function run_task (line 75) | async def run_task(task_id: int): function pause_task (line 87) | async def pause_task(task_id: int): function resume_task (line 103) | async def resume_task(task_id: int): FILE: lifetrace/routers/chat/base.py class StreamMeta (line 16) | class StreamMeta(TypedDict, total=False): function _create_llm_stream_generator (line 26) | def _create_llm_stream_generator( function _log_stream_token_usage (line 91) | def _log_stream_token_usage( FILE: lifetrace/routers/chat/context.py function chat_with_context_stream (line 14) | async def chat_with_context_stream( function _ensure_context_stream_session (line 76) | def _ensure_context_stream_session( function _build_event_context_text (line 98) | def _build_event_context_text(event_context: list[dict[str, str]] | None... function _build_context_stream_messages_and_temperature (line 110) | async def _build_context_stream_messages_and_temperature( FILE: lifetrace/routers/chat/core.py function chat_with_llm (line 23) | async def chat_with_llm( function chat_with_llm_stream (line 72) | async def chat_with_llm_stream( FILE: lifetrace/routers/chat/helpers.py function ensure_stream_session (line 19) | def ensure_stream_session(message: ChatMessage, chat_service: ChatServic... function get_conversation_history (line 42) | def get_conversation_history( function validate_workspace_path (line 89) | def validate_workspace_path(workspace_path: str) -> tuple[bool, str]: function make_error_streaming_response (line 124) | def make_error_streaming_response(error_msg: str, session_id: str) -> St... function build_messages_from_new_schema (line 140) | def build_messages_from_new_schema( function build_messages_from_legacy_format (line 161) | def build_messages_from_legacy_format( function build_stream_messages_and_temperature (line 186) | async def build_stream_messages_and_temperature( FILE: lifetrace/routers/chat/message_todo_extraction.py function _get_llm_client (line 25) | def _get_llm_client() -> LLMClient: function extract_todos_from_messages (line 30) | async def extract_todos_from_messages( function _parse_llm_response (line 101) | def _parse_llm_response(response_text: str) -> list[ExtractedMessageTodo]: FILE: lifetrace/routers/chat/misc.py function create_new_chat (line 16) | async def create_new_chat( function add_message_to_session (line 43) | async def add_message_to_session( function clear_chat_session (line 71) | async def clear_chat_session( function get_chat_history (line 94) | async def get_chat_history( function get_query_suggestions (line 108) | async def get_query_suggestions( function get_supported_query_types (line 121) | async def get_supported_query_types(): function get_available_agno_tools (line 131) | async def get_available_agno_tools(): FILE: lifetrace/routers/chat/modes/agent.py function create_agent_streaming_response (line 13) | def create_agent_streaming_response( FILE: lifetrace/routers/chat/modes/agno.py function _strip_tool_events (line 27) | def _strip_tool_events( function _build_external_tools_config (line 64) | def _build_external_tools_config( function create_agno_streaming_response (line 94) | def create_agno_streaming_response( FILE: lifetrace/routers/chat/modes/dify.py function create_dify_streaming_response (line 13) | def create_dify_streaming_response( FILE: lifetrace/routers/chat/modes/web_search.py function create_web_search_streaming_response (line 13) | def create_web_search_streaming_response( FILE: lifetrace/routers/chat/plan.py function _format_todo_context (line 17) | def _format_todo_context(context: dict[str, Any]) -> str: # noqa: C901 function plan_questionnaire_stream (line 89) | async def plan_questionnaire_stream( function _ensure_plan_session (line 153) | def _ensure_plan_session( function _build_plan_questionnaire_prompts (line 178) | def _build_plan_questionnaire_prompts( function plan_summary_stream (line 216) | async def plan_summary_stream( function _build_plan_summary_prompts (line 278) | def _build_plan_summary_prompts( FILE: lifetrace/routers/config.py function verify_llm_connection_on_startup (line 41) | def verify_llm_connection_on_startup(): function _validate_aliyun_api_key (line 76) | def _validate_aliyun_api_key(llm_key: str) -> dict[str, Any] | None: function _handle_llm_test_error (line 93) | def _handle_llm_test_error(error_msg: str, model: str) -> dict[str, Any]: function _get_config_value (line 108) | def _get_config_value(config_data: dict[str, Any], camel_key: str, snake... function test_llm_config (line 123) | async def test_llm_config(config_data: dict[str, str]): function test_tavily_config (line 169) | async def test_tavily_config(config_data: dict[str, str]): function _parse_asr_config (line 216) | def _parse_asr_config(config_data: dict[str, Any]) -> dict[str, Any]: function _build_asr_run_task_message (line 245) | def _build_asr_run_task_message( function _build_asr_finish_task_message (line 278) | def _build_asr_finish_task_message(task_id: str) -> dict[str, Any]: function _handle_asr_websocket_response (line 290) | async def _handle_asr_websocket_response(ws, task_id: str) -> dict[str, ... function _test_asr_websocket_connection (line 318) | async def _test_asr_websocket_connection( function _handle_asr_test_error (line 345) | def _handle_asr_test_error(error_msg: str, model: str) -> dict[str, Any]: function test_asr_config (line 366) | async def test_asr_config(config_data: dict[str, Any]): function get_llm_status (line 411) | async def get_llm_status(): function get_config_detailed (line 427) | async def get_config_detailed(): function _validate_config_fields (line 442) | def _validate_config_fields(config_data: dict[str, str]) -> dict[str, An... function save_and_init_llm (line 478) | async def save_and_init_llm(config_data: dict[str, str]): function save_config (line 512) | async def save_config(settings: dict[str, Any]): function get_chat_prompts (line 530) | async def get_chat_prompts(locale: str = "zh"): FILE: lifetrace/routers/cost_tracking.py function get_cost_stats (line 17) | async def get_cost_stats(days: int = Query(30, description="统计天数")): function get_cost_config (line 103) | async def get_cost_config(): FILE: lifetrace/routers/event.py function list_events (line 18) | async def list_events( function count_events (line 44) | async def count_events( function get_event_detail (line 65) | async def get_event_detail( function get_event_context (line 80) | async def get_event_context( function generate_event_summary (line 95) | async def generate_event_summary( FILE: lifetrace/routers/floating_capture.py function get_llm_client (line 41) | def get_llm_client() -> LLMClient: function extract_todos_from_capture (line 47) | async def extract_todos_from_capture(request: FloatingCaptureRequest) ->... function _process_llm_response (line 158) | def _process_llm_response(response: Any, api_time: float) -> str | None: function _call_vision_model_with_base64 (line 218) | def _call_vision_model_with_base64( function _parse_llm_response (line 326) | def _parse_llm_response(response_text: str) -> list[dict[str, Any]]: function _create_draft_todo (line 372) | def _create_draft_todo(todo_data: dict[str, Any]) -> dict[str, Any] | None: function health_check (line 436) | async def health_check(): FILE: lifetrace/routers/health.py function get_git_commit (line 25) | def get_git_commit() -> str: function set_server_mode (line 45) | def set_server_mode(mode: str) -> None: function get_server_mode (line 51) | def get_server_mode() -> str: function health_check (line 57) | async def health_check(): function llm_health_check (line 75) | async def llm_health_check(): FILE: lifetrace/routers/journal.py function create_journal (line 27) | async def create_journal( function list_journals (line 42) | async def list_journals( function get_journal (line 58) | async def get_journal( function update_journal (line 73) | async def update_journal( function delete_journal (line 91) | async def delete_journal( function auto_link_journal (line 107) | async def auto_link_journal( function generate_objective_journal (line 122) | async def generate_objective_journal( function generate_ai_journal (line 137) | async def generate_ai_journal( FILE: lifetrace/routers/logs.py function get_log_files (line 19) | async def get_log_files(): function get_log_content (line 56) | async def get_log_content(file: str = Query(..., description="日志文件相对路径")): FILE: lifetrace/routers/notification.py function get_notification (line 14) | async def get_notification(): function delete_notification (line 40) | async def delete_notification(notification_id: str): FILE: lifetrace/routers/ocr.py function process_ocr (line 15) | async def process_ocr(screenshot_id: int): function get_ocr_statistics (line 57) | async def get_ocr_statistics(): FILE: lifetrace/routers/proactive_ocr.py function start_proactive_ocr (line 16) | async def start_proactive_ocr(): function stop_proactive_ocr (line 32) | async def stop_proactive_ocr(): function capture_once (line 48) | async def capture_once(): function get_proactive_ocr_status (line 71) | async def get_proactive_ocr_status(): function health_check (line 86) | async def health_check(): FILE: lifetrace/routers/rag.py function rag_health_check (line 18) | async def rag_health_check(): function get_app_icon (line 32) | async def get_app_icon(app_name: str): FILE: lifetrace/routers/scheduler.py class JobInfo (line 20) | class JobInfo(BaseModel): class JobListResponse (line 31) | class JobListResponse(BaseModel): class JobOperationRequest (line 38) | class JobOperationRequest(BaseModel): class JobIntervalUpdateRequest (line 44) | class JobIntervalUpdateRequest(BaseModel): class JobOperationResponse (line 53) | class JobOperationResponse(BaseModel): function get_all_jobs (line 61) | async def get_all_jobs(): function get_job_detail (line 86) | async def get_job_detail(job_id: str): function pause_job (line 111) | async def pause_job(job_id: str): function resume_job (line 131) | async def resume_job(job_id: str): function update_job_interval (line 151) | async def update_job_interval(job_id: str, request: JobIntervalUpdateReq... function remove_job (line 194) | async def remove_job(job_id: str): function get_scheduler_status (line 212) | async def get_scheduler_status(): function pause_all_jobs (line 235) | async def pause_all_jobs(): function resume_all_jobs (line 265) | async def resume_all_jobs(): function _sync_job_enabled_to_config (line 294) | def _sync_job_enabled_to_config(job_id: str, enabled: bool): function _sync_job_interval_to_config (line 337) | def _sync_job_interval_to_config( FILE: lifetrace/routers/screenshot.py function get_screenshots (line 20) | async def get_screenshots( function get_screenshot (line 55) | async def get_screenshot(screenshot_id: int): function get_screenshot_image (line 87) | async def get_screenshot_image(screenshot_id: int): function get_screenshot_path (line 121) | async def get_screenshot_path(screenshot_id: int): FILE: lifetrace/routers/search.py function search_screenshots (line 17) | async def search_screenshots(search_request: SearchRequest): function search_events (line 36) | async def search_events(search_request: SearchRequest): FILE: lifetrace/routers/system.py function _get_lifetrace_processes (line 42) | def _get_lifetrace_processes() -> tuple[list[ProcessInfo], float, float]: function _get_disk_usage (line 83) | def _get_disk_usage() -> dict: function _get_storage_info (line 100) | def _get_storage_info() -> dict: function get_statistics (line 124) | async def get_statistics(): function cleanup_old_data (line 133) | async def cleanup_old_data(days: int = Query(30, ge=1)): function get_system_resources (line 146) | async def get_system_resources(): function get_capabilities (line 187) | async def get_capabilities(): FILE: lifetrace/routers/time_allocation.py function _categorize_app (line 92) | def _categorize_app(app_name: str) -> str: function _build_daily_distribution (line 107) | def _build_daily_distribution(hourly_usage: dict[int, dict[str, float]])... function _build_app_details (line 119) | def _build_app_details(app_usage_summary: dict[str, dict]) -> list[dict]: function get_time_allocation (line 134) | async def get_time_allocation( FILE: lifetrace/routers/todo.py function _sanitize_filename (line 33) | def _sanitize_filename(name: str) -> str: function list_todos (line 38) | async def list_todos( function get_todo (line 49) | async def get_todo( function upload_attachments (line 62) | async def upload_attachments( function delete_attachment (line 109) | async def delete_attachment( function get_attachment_file (line 119) | async def get_attachment_file( function create_todo (line 137) | async def create_todo( function update_todo (line 146) | async def update_todo( function delete_todo (line 158) | async def delete_todo( function reorder_todos (line 167) | async def reorder_todos( function export_ics (line 184) | async def export_ics( function import_ics (line 203) | async def import_ics( FILE: lifetrace/routers/todo_extraction.py function extract_todos_from_event (line 22) | async def extract_todos_from_event(request: TodoExtractionRequest): FILE: lifetrace/routers/vector.py function semantic_search (line 21) | async def semantic_search(request: SemanticSearchRequest): function event_semantic_search (line 56) | async def event_semantic_search(request: SemanticSearchRequest): function get_vector_stats (line 92) | async def get_vector_stats(): function sync_vector_database (line 104) | async def sync_vector_database( function reset_vector_database (line 124) | async def reset_vector_database(): FILE: lifetrace/routers/vision.py function vision_chat (line 19) | async def vision_chat(request: VisionChatRequest): FILE: lifetrace/schemas/activity.py class ActivityResponse (line 6) | class ActivityResponse(BaseModel): class ActivityListResponse (line 17) | class ActivityListResponse(BaseModel): class ActivityEventsResponse (line 22) | class ActivityEventsResponse(BaseModel): class ManualActivityCreateRequest (line 26) | class ManualActivityCreateRequest(BaseModel): class ManualActivityCreateResponse (line 30) | class ManualActivityCreateResponse(BaseModel): FILE: lifetrace/schemas/automation.py class AutomationSchedule (line 10) | class AutomationSchedule(BaseModel): class AutomationAction (line 20) | class AutomationAction(BaseModel): class AutomationTaskCreate (line 27) | class AutomationTaskCreate(BaseModel): class AutomationTaskUpdate (line 37) | class AutomationTaskUpdate(BaseModel): class AutomationTaskResponse (line 47) | class AutomationTaskResponse(BaseModel): class AutomationTaskListResponse (line 64) | class AutomationTaskListResponse(BaseModel): FILE: lifetrace/schemas/chat.py class ChatMessage (line 9) | class ChatMessage(BaseModel): method get_user_input_for_storage (line 28) | def get_user_input_for_storage(self) -> str: class ChatMessageWithContext (line 36) | class ChatMessageWithContext(BaseModel): class ChatResponse (line 42) | class ChatResponse(BaseModel): class NewChatRequest (line 51) | class NewChatRequest(BaseModel): class NewChatResponse (line 55) | class NewChatResponse(BaseModel): class AddMessageRequest (line 61) | class AddMessageRequest(BaseModel): class PlanQuestionnaireRequest (line 66) | class PlanQuestionnaireRequest(BaseModel): class PlanSummaryRequest (line 72) | class PlanSummaryRequest(BaseModel): FILE: lifetrace/schemas/event.py class EventResponse (line 10) | class EventResponse(BaseModel): class EventDetailResponse (line 22) | class EventDetailResponse(BaseModel): class EventListResponse (line 33) | class EventListResponse(BaseModel): class Config (line 39) | class Config: FILE: lifetrace/schemas/floating_capture.py class FloatingCaptureRequest (line 9) | class FloatingCaptureRequest(BaseModel): class ExtractedTodo (line 18) | class ExtractedTodo(BaseModel): class CreatedTodo (line 28) | class CreatedTodo(BaseModel): class FloatingCaptureResponse (line 36) | class FloatingCaptureResponse(BaseModel): FILE: lifetrace/schemas/journal.py class JournalTag (line 8) | class JournalTag(BaseModel): class JournalCreate (line 15) | class JournalCreate(BaseModel): class JournalUpdate (line 35) | class JournalUpdate(BaseModel): class JournalResponse (line 54) | class JournalResponse(BaseModel): class Config (line 75) | class Config: class JournalListResponse (line 79) | class JournalListResponse(BaseModel): class JournalAutoLinkRequest (line 86) | class JournalAutoLinkRequest(BaseModel): class JournalAutoLinkCandidate (line 97) | class JournalAutoLinkCandidate(BaseModel): class JournalAutoLinkResponse (line 105) | class JournalAutoLinkResponse(BaseModel): class JournalGenerateRequest (line 118) | class JournalGenerateRequest(BaseModel): class JournalGenerateResponse (line 129) | class JournalGenerateResponse(BaseModel): FILE: lifetrace/schemas/message_todo_extraction.py class MessageTodoExtractionRequest (line 6) | class MessageTodoExtractionRequest(BaseModel): class ExtractedMessageTodo (line 23) | class ExtractedMessageTodo(BaseModel): class MessageTodoExtractionResponse (line 31) | class MessageTodoExtractionResponse(BaseModel): FILE: lifetrace/schemas/screenshot.py class ScreenshotResponse (line 8) | class ScreenshotResponse(BaseModel): FILE: lifetrace/schemas/search.py class SearchRequest (line 8) | class SearchRequest(BaseModel): FILE: lifetrace/schemas/stats.py class StatisticsResponse (line 8) | class StatisticsResponse(BaseModel): class TimeAllocationResponse (line 15) | class TimeAllocationResponse(BaseModel): class Config (line 26) | class Config: FILE: lifetrace/schemas/system.py class ProcessInfo (line 9) | class ProcessInfo(BaseModel): class SystemResourcesResponse (line 18) | class SystemResourcesResponse(BaseModel): class CapabilitiesResponse (line 28) | class CapabilitiesResponse(BaseModel): FILE: lifetrace/schemas/todo.py class TodoStatus (line 14) | class TodoStatus(str, Enum): class TodoPriority (line 23) | class TodoPriority(str, Enum): class TodoItemType (line 32) | class TodoItemType(str, Enum): class TodoAttachmentResponse (line 39) | class TodoAttachmentResponse(BaseModel): class Config (line 49) | class Config: class TodoCreate (line 53) | class TodoCreate(BaseModel): class TodoUpdate (line 99) | class TodoUpdate(BaseModel): class TodoResponse (line 154) | class TodoResponse(BaseModel): class Config (line 203) | class Config: class TodoListResponse (line 207) | class TodoListResponse(BaseModel): class TodoReorderItem (line 214) | class TodoReorderItem(BaseModel): class TodoReorderRequest (line 222) | class TodoReorderRequest(BaseModel): FILE: lifetrace/schemas/todo_extraction.py class TodoTimeInfo (line 9) | class TodoTimeInfo(BaseModel): class ExtractedTodo (line 30) | class ExtractedTodo(BaseModel): class TodoExtractionRequest (line 42) | class TodoExtractionRequest(BaseModel): class TodoExtractionResponse (line 51) | class TodoExtractionResponse(BaseModel): FILE: lifetrace/schemas/vector.py class SemanticSearchRequest (line 8) | class SemanticSearchRequest(BaseModel): class SemanticSearchResult (line 16) | class SemanticSearchResult(BaseModel): class VectorStatsResponse (line 24) | class VectorStatsResponse(BaseModel): FILE: lifetrace/schemas/vision.py class VisionChatRequest (line 9) | class VisionChatRequest(BaseModel): class VisionChatResponse (line 21) | class VisionChatResponse(BaseModel): FILE: lifetrace/scripts/add_file_path_column.py function add_file_path_column (line 8) | def add_file_path_column(): FILE: lifetrace/scripts/check_code_lines.py function parse_args (line 35) | def parse_args() -> argparse.Namespace: function count_code_lines (line 70) | def count_code_lines(file_path: Path) -> int: function should_check_file (line 98) | def should_check_file( function get_files_to_check (line 132) | def get_files_to_check( function main (line 171) | def main() -> int: FILE: lifetrace/scripts/fix_audio_recordings_table.py function fix_audio_recordings_table (line 8) | def fix_audio_recordings_table(): FILE: lifetrace/scripts/fix_transcriptions_table.py function ensure_transcriptions_table (line 13) | def ensure_transcriptions_table(db_path: Path) -> None: FILE: lifetrace/scripts/start_backend.py function setup_data_directory (line 47) | def setup_data_directory(data_dir: str) -> None: function main (line 111) | def main(): FILE: lifetrace/server.py function lifespan (line 34) | async def lifespan(app: FastAPI): function get_cors_origins (line 79) | def get_cors_origins() -> list[str]: function _order_modules (line 115) | def _order_modules(module_ids: list[str]) -> list[str]: function _register_priority_modules (line 120) | def _register_priority_modules(app: FastAPI) -> None: function _register_deferred_modules (line 139) | async def _register_deferred_modules(app: FastAPI) -> None: function _start_job_manager_async (line 153) | async def _start_job_manager_async(app: FastAPI) -> None: function _verify_llm_connection_async (line 160) | async def _verify_llm_connection_async() -> None: function find_available_port (line 175) | def find_available_port(host: str, start_port: int, max_attempts: int = ... function parse_args (line 207) | def parse_args(): FILE: lifetrace/services/activity_service.py class ActivityService (line 24) | class ActivityService: method __init__ (line 27) | def __init__( method list_activities (line 35) | def list_activities( method get_activity_events (line 68) | def get_activity_events(self, activity_id: int) -> ActivityEventsRespo... method create_activity_manual (line 74) | def create_activity_manual( method _validate_event_ids (line 94) | def _validate_event_ids(self, event_ids: list[int]) -> None: method _get_and_validate_events (line 99) | def _get_and_validate_events(self, event_ids: list[int]) -> list[dict]: method _validate_events_ended (line 114) | def _validate_events_ended(self, events: list[dict]) -> None: method _validate_events_not_linked (line 124) | def _validate_events_not_linked(self, events: list[dict]) -> None: method _calculate_activity_time_range (line 137) | def _calculate_activity_time_range(self, events: list[dict]) -> tuple[... method _prepare_events_data (line 147) | def _prepare_events_data(self, events: list[dict]) -> list[dict]: method _create_activity_with_summary (line 158) | def _create_activity_with_summary( FILE: lifetrace/services/asr_client.py class ASRClient (line 22) | class ASRClient: method __new__ (line 28) | def __new__(cls): method __init__ (line 34) | def __init__(self): method _initialize_client (line 40) | def _initialize_client(self): method reinitialize (line 67) | def reinitialize(self): method _build_run_task_message (line 72) | def _build_run_task_message(self, task_id: str) -> dict[str, Any]: method _build_finish_task_message (line 96) | def _build_finish_task_message(self, task_id: str) -> dict[str, Any]: method _handle_asr_event (line 107) | def _handle_asr_event( method _receive_messages (line 145) | async def _receive_messages( method _send_audio (line 169) | async def _send_audio( method transcribe_stream (line 204) | async def transcribe_stream( FILE: lifetrace/services/asr_client_dashscope.py class ASRDashScopeClient (line 17) | class ASRDashScopeClient: method __new__ (line 23) | def __new__(cls): method __init__ (line 29) | def __init__(self): method _initialize_client (line 35) | def _initialize_client(self): method reinitialize (line 66) | def reinitialize(self): method create_recognition_callback (line 71) | def create_recognition_callback( method create_recognition (line 113) | def create_recognition(self, callback: RecognitionCallback) -> Recogni... FILE: lifetrace/services/audio_extraction_service.py class AudioExtractionService (line 22) | class AudioExtractionService: method __init__ (line 25) | def __init__(self, llm_client: LLMClient): method _stable_extracted_id (line 33) | def _stable_extracted_id(self, prefix: str, item: dict) -> str: method _enrich_extracted_items (line 52) | def _enrich_extracted_items(self, prefix: str, items: list[dict]) -> l... method update_extraction (line 82) | def update_extraction( method _load_extraction_from_transcription (line 126) | def _load_extraction_from_transcription( method _build_item_lookup_maps (line 166) | def _build_item_lookup_maps( method _apply_links_to_items (line 192) | def _apply_links_to_items( method link_extracted_items (line 234) | def link_extracted_items( method _load_extraction_prompts (line 287) | def _load_extraction_prompts(self, text: str) -> tuple[str, str]: method _parse_llm_response (line 306) | def _parse_llm_response(self, result_text: str) -> dict[str, Any]: method _normalize_extraction_result (line 326) | def _normalize_extraction_result(self, result: dict[str, Any]) -> dict... method extract_todos_and_schedules (line 366) | async def extract_todos_and_schedules(self, text: str) -> dict[str, Any]: FILE: lifetrace/services/audio_service.py class AudioService (line 28) | class AudioService: method __init__ (line 31) | def __init__(self): method get_audio_dir_for_date (line 41) | def get_audio_dir_for_date(self, date: datetime) -> Path: method generate_audio_file_path (line 57) | def generate_audio_file_path(self, date: datetime, filename: str | Non... method create_recording (line 74) | def create_recording( method complete_recording (line 119) | def complete_recording(self, recording_id: int) -> AudioRecording | None: method get_recordings_by_date (line 139) | def get_recordings_by_date(self, date: datetime) -> list[dict[str, Any]]: method _check_has_extraction (line 181) | def _check_has_extraction(self, transcription: Transcription) -> bool: method _check_text_changes (line 213) | def _check_text_changes( method _cleanup_duplicate_transcriptions (line 232) | def _cleanup_duplicate_transcriptions( method _update_existing_transcription (line 264) | def _update_existing_transcription( method _prepare_transcription_data (line 316) | def _prepare_transcription_data( method _optimize_text_if_needed (line 343) | async def _optimize_text_if_needed(self, display_text: str, auto_optim... method _create_or_update_transcription (line 353) | def _create_or_update_transcription( method _update_recording_status (line 401) | def _update_recording_status(self, session: Any, recording_id: int) ->... method _trigger_auto_extraction (line 408) | def _trigger_auto_extraction( method save_transcription (line 429) | async def save_transcription( method _auto_extract_todos_and_schedules (line 475) | async def _auto_extract_todos_and_schedules( method optimize_transcription_text (line 496) | async def optimize_transcription_text(self, text: str) -> str: method extract_todos_and_schedules (line 548) | def extract_todos_and_schedules(self): method update_extraction (line 553) | def update_extraction(self): method link_extracted_items (line 558) | def link_extracted_items(self): method get_transcription (line 562) | def get_transcription(self, recording_id: int) -> dict[str, Any] | None: FILE: lifetrace/services/automation_task_service.py class AutomationTaskService (line 32) | class AutomationTaskService: method list_tasks (line 35) | def list_tasks(self) -> list[dict[str, Any]]: method get_task (line 39) | def get_task(self, task_id: int) -> dict[str, Any] | None: method create_task (line 45) | def create_task( method update_task (line 73) | def update_task( method delete_task (line 109) | def delete_task(self, task_id: int) -> bool: method run_task (line 115) | def run_task(self, task_id: int) -> bool: method sync_all_tasks (line 121) | def sync_all_tasks(self) -> None: method sync_task (line 126) | def sync_task(self, task: dict[str, Any]) -> None: method _execute_task (line 153) | def _execute_task(self, task: dict[str, Any]) -> bool: method _notify_task_result (line 187) | def _notify_task_result( method _run_action (line 209) | def _run_action(self, action_type: str, payload: dict[str, Any]) -> str: method _run_web_fetch (line 214) | def _run_web_fetch(self, payload: dict[str, Any]) -> str: method _serialize_schedule (line 244) | def _serialize_schedule(self, schedule: AutomationSchedule) -> tuple[s... method _serialize_action (line 254) | def _serialize_action(self, action: AutomationAction) -> tuple[str, str]: method _validate_schedule (line 259) | def _validate_schedule(self, schedule_type: str, config: dict[str, Any... method _build_trigger (line 274) | def _build_trigger(self, task: dict[str, Any]): method _remove_job (line 300) | def _remove_job(self, task_id: int) -> None: method _job_id (line 307) | def _job_id(task_id: int) -> str: method _parse_payload (line 311) | def _parse_payload(value: Any) -> dict[str, Any]: method _parse_datetime (line 326) | def _parse_datetime(value: Any) -> datetime | None: method _get_timezone (line 339) | def _get_timezone(value: Any): method _hydrate_task (line 347) | def _hydrate_task(self, task: dict[str, Any]) -> dict[str, Any]: function execute_automation_task (line 363) | def execute_automation_task(task_id: int) -> None: FILE: lifetrace/services/chat_service.py class ChatService (line 21) | class ChatService: method __init__ (line 24) | def __init__(self, repository: IChatRepository): method generate_session_id (line 30) | def generate_session_id() -> str: method create_new_session (line 36) | def create_new_session(self, session_id: str | None = None) -> str: method clear_session_context (line 57) | def clear_session_context(self, session_id: str) -> bool: method get_session_context (line 71) | def get_session_context(self, session_id: str) -> list[dict[str, Any]]: method add_to_session_context (line 89) | def add_to_session_context(self, session_id: str, role: str, content: ... method create_chat (line 118) | def create_chat( method get_chat_by_session_id (line 135) | def get_chat_by_session_id(self, session_id: str) -> dict[str, Any] | ... method ensure_chat_exists (line 139) | def ensure_chat_exists( method list_chats (line 158) | def list_chats( method update_chat_title (line 171) | def update_chat_title(self, session_id: str, title: str) -> bool: method delete_chat (line 175) | def delete_chat(self, session_id: str) -> bool: method add_message (line 181) | def add_message( method get_messages (line 200) | def get_messages( method get_message_count (line 213) | def get_message_count(self, session_id: str) -> int: method get_chat_summaries (line 217) | def get_chat_summaries( method get_chat_history (line 230) | def get_chat_history( FILE: lifetrace/services/config_service.py function _convert_jobs_key (line 107) | def _convert_jobs_key(parts: list[str]) -> str: function snake_to_dot_notation (line 134) | def snake_to_dot_notation(key: str) -> str: function dot_to_snake_notation (line 170) | def dot_to_snake_notation(key: str) -> str: function is_llm_configured (line 190) | def is_llm_configured() -> bool: class ConfigService (line 202) | class ConfigService: method __init__ (line 205) | def __init__(self): method compare_config_changes (line 209) | def compare_config_changes(self, new_settings: dict[str, Any]) -> tupl... method get_llm_config (line 248) | def get_llm_config(self) -> dict[str, Any]: method get_asr_config (line 260) | def get_asr_config(self) -> dict[str, Any]: method get_config_for_frontend (line 279) | def get_config_for_frontend(self) -> dict[str, Any]: method update_config_file (line 355) | def update_config_file(self, new_settings: dict[str, Any], config_path... method _collect_jobs_to_sync (line 387) | def _collect_jobs_to_sync( method _add_linked_jobs (line 404) | def _add_linked_jobs( method sync_job_states_if_needed (line 416) | def sync_job_states_if_needed(self, new_settings: dict[str, Any]) -> N... method reinitialize_llm_if_needed (line 448) | def reinitialize_llm_if_needed( method reinitialize_asr_if_needed (line 514) | def reinitialize_asr_if_needed( method save_config (line 563) | def save_config( method _init_config_file (line 621) | def _init_config_file(self) -> None: FILE: lifetrace/services/dify_client.py function _get_dify_config (line 27) | def _get_dify_config() -> dict[str, str]: function _parse_sse_event_block (line 52) | def _parse_sse_event_block(event_block: str) -> dict[str, Any] | None: function _extract_answer_from_sse_data (line 73) | def _extract_answer_from_sse_data(data_content: dict[str, Any]) -> str |... function _process_sse_event_block (line 86) | def _process_sse_event_block(event_block: str) -> Iterator[str]: function _parse_sse_stream (line 111) | def _parse_sse_stream(response: httpx.Response) -> Iterator[str]: function _handle_blocking_response (line 137) | def _handle_blocking_response(response: httpx.Response) -> Iterator[str]: function call_dify_chat (line 162) | def call_dify_chat( FILE: lifetrace/services/event_service.py class EventService (line 20) | class EventService: method __init__ (line 23) | def __init__(self, event_repository: IEventRepository, ocr_repository:... method list_events (line 27) | def list_events( method count_events (line 61) | def count_events( method get_event_detail (line 75) | def get_event_detail(self, event_id: int) -> EventDetailResponse: method get_event_context (line 107) | def get_event_context(self, event_id: int) -> dict[str, Any]: method generate_event_summary (line 135) | def generate_event_summary(self, event_id: int) -> dict[str, Any]: method get_events_by_ids (line 159) | def get_events_by_ids(self, event_ids: list[int]) -> list[dict[str, An... FILE: lifetrace/services/icalendar_service.py function _normalize_percent (line 25) | def _normalize_percent(value: Any) -> int: function _to_local_time (line 35) | def _to_local_time(value: datetime | None) -> datetime | None: function _from_ical_dt (line 43) | def _from_ical_dt(value: Any) -> datetime | None: function _build_calendar (line 55) | def _build_calendar() -> Calendar: function _add_optional_text (line 63) | def _add_optional_text(component: VTodo | VEvent, name: str, value: Any)... function _add_optional_dt (line 69) | def _add_optional_dt(component: VTodo | VEvent, name: str, value: Any) -... function _add_optional_value (line 75) | def _add_optional_value(component: VTodo | VEvent, name: str, value: Any... function _add_optional_categories (line 80) | def _add_optional_categories(component: VTodo | VEvent, tags: list[Any])... function _add_optional_rrule (line 85) | def _add_optional_rrule(component: VTodo | VEvent, rrule: str) -> None: class ICalendarService (line 94) | class ICalendarService: method export_todos (line 97) | def export_todos(self, todos: list[dict[str, Any]]) -> str: method import_todos (line 111) | def import_todos(self, ics_content: str) -> list[TodoCreate]: # noqa:... method _status_to_ical (line 218) | def _status_to_ical(self, status: str | None) -> str | None: method _status_from_ical (line 229) | def _status_from_ical(self, status: Any) -> TodoStatus | None: method _priority_to_ical (line 241) | def _priority_to_ical(self, priority: str | None) -> int | None: method _priority_from_ical (line 252) | def _priority_from_ical(self, priority: Any) -> TodoPriority: method _todo_to_vtodo (line 267) | def _todo_to_vtodo(self, todo: dict[str, Any]) -> VTodo: method _todo_to_vevent (line 309) | def _todo_to_vevent(self, todo: dict[str, Any]) -> VEvent: FILE: lifetrace/services/journal_service.py class JournalService (line 43) | class JournalService: method __init__ (line 46) | def __init__(self, repository: IJournalRepository, db_base: DatabaseBa... method _normalize_name (line 50) | def _normalize_name(self, name: str | None) -> str: method _resolve_day_bucket_range (line 54) | def _resolve_day_bucket_range( method _extract_keywords (line 67) | def _extract_keywords(self, text: str) -> list[str]: method _score_text (line 75) | def _score_text(self, text: str, keywords: list[str]) -> float: method _score_candidates (line 82) | def _score_candidates( method _list_todos_for_range (line 104) | def _list_todos_for_range(self, start: datetime, end: datetime) -> lis... method _list_activities_for_range (line 130) | def _list_activities_for_range(self, start: datetime, end: datetime) -... method _resolve_generation_context (line 150) | def _resolve_generation_context( method get_journal (line 175) | def get_journal(self, journal_id: int) -> JournalResponse: method list_journals (line 182) | def list_journals( method create_journal (line 197) | def create_journal(self, data: JournalCreate) -> JournalResponse: method _build_update_payload (line 221) | def _build_update_payload(self, data: JournalUpdate) -> JournalUpdateP... method update_journal (line 227) | def update_journal(self, journal_id: int, data: JournalUpdate) -> Jour... method delete_journal (line 240) | def delete_journal(self, journal_id: int) -> None: method auto_link (line 249) | def auto_link(self, payload: JournalAutoLinkRequest) -> JournalAutoLin... method generate_objective (line 301) | def generate_objective(self, payload: JournalGenerateRequest) -> Journ... method generate_ai_view (line 321) | def generate_ai_view(self, payload: JournalGenerateRequest) -> Journal... FILE: lifetrace/services/todo_service.py function _to_ical_status (line 23) | def _to_ical_status(status: str | None) -> str | None: function _normalize_item_type (line 35) | def _normalize_item_type(item_type: str | None) -> str: class TodoService (line 39) | class TodoService: method __init__ (line 42) | def __init__(self, repository: ITodoRepository): method get_todo (line 45) | def get_todo(self, todo_id: int) -> TodoResponse: method get_todo_by_uid (line 52) | def get_todo_by_uid(self, uid: str) -> TodoResponse | None: method list_todos (line 57) | def list_todos(self, limit: int, offset: int, status: str | None) -> d... method create_todo (line 63) | def create_todo(self, data: TodoCreate) -> TodoResponse: method update_todo (line 140) | def update_todo(self, todo_id: int, data: TodoUpdate) -> TodoResponse:... method delete_todo (line 253) | def delete_todo(self, todo_id: int) -> None: method reorder_todos (line 263) | def reorder_todos(self, items: list[dict[str, Any]]) -> dict[str, Any]: method add_attachment (line 269) | def add_attachment( method remove_attachment (line 297) | def remove_attachment(self, *, todo_id: int, attachment_id: int) -> None: method get_attachment (line 303) | def get_attachment(self, attachment_id: int) -> dict[str, Any]: FILE: lifetrace/storage/__init__.py function __getattr__ (line 51) | def __getattr__(name: str): function __dir__ (line 59) | def __dir__() -> list[str]: FILE: lifetrace/storage/activity_manager.py class ActivityManager (line 16) | class ActivityManager: method __init__ (line 19) | def __init__(self, db_base: DatabaseBase): method create_activity (line 22) | def create_activity( method get_activity (line 72) | def get_activity(self, activity_id: int) -> dict[str, Any] | None: method get_activities (line 105) | def get_activities( method count_activities (line 153) | def count_activities( method get_activity_events (line 171) | def get_activity_events(self, activity_id: int) -> list[int]: method get_unprocessed_events (line 195) | def get_unprocessed_events(self, query_start_time: datetime) -> list[E... method activity_exists_for_time_window (line 253) | def activity_exists_for_time_window(self, window_start: datetime, wind... method activity_exists_for_event (line 279) | def activity_exists_for_event(self, event: Event) -> bool: method activity_exists_for_event_id (line 303) | def activity_exists_for_event_id(self, event_id: int) -> bool: method activity_overlaps_with_event (line 327) | def activity_overlaps_with_event(self, event: Event, tolerance_seconds... FILE: lifetrace/storage/automation_task_manager.py class AutomationTaskManager (line 19) | class AutomationTaskManager: method __init__ (line 22) | def __init__(self, db_base): method list_tasks (line 25) | def list_tasks(self, *, enabled: bool | None = None) -> list[dict[str,... method get_task (line 38) | def get_task(self, task_id: int) -> dict[str, Any] | None: method create_task (line 56) | def create_task( method update_task (line 88) | def update_task( # noqa: PLR0913 method delete_task (line 143) | def delete_task(self, task_id: int) -> bool: method _to_dict (line 166) | def _to_dict(task: AutomationTask) -> dict[str, Any]: FILE: lifetrace/storage/chat_manager.py class ChatManager (line 19) | class ChatManager: method __init__ (line 22) | def __init__(self, db_base: DatabaseBase): method create_chat (line 25) | def create_chat( method get_chat_by_session_id (line 70) | def get_chat_by_session_id(self, session_id: str) -> dict[str, Any] | ... method list_chats (line 92) | def list_chats( method update_chat_title (line 140) | def update_chat_title(self, session_id: str, title: str) -> bool: method delete_chat (line 155) | def delete_chat(self, session_id: str) -> bool: method add_message (line 175) | def add_message( method get_messages (line 248) | def get_messages( method get_message_count (line 297) | def get_message_count(self, session_id: str) -> int: method get_chat_summaries (line 310) | def get_chat_summaries( method get_chat_context (line 359) | def get_chat_context(self, session_id: str) -> str | None: method update_chat_context (line 378) | def update_chat_context(self, session_id: str, context: str) -> bool: FILE: lifetrace/storage/database.py function get_session (line 38) | def get_session(): function get_db (line 44) | def get_db(): FILE: lifetrace/storage/database_base.py class DatabaseBase (line 28) | class DatabaseBase: method __init__ (line 31) | def __init__(self): method _init_database (line 36) | def _init_database(self): method _run_migrations (line 73) | def _run_migrations(self) -> None: method _create_performance_indexes (line 97) | def _create_performance_indexes(self): method get_session (line 399) | def get_session(self): method get_sqlalchemy_session (line 411) | def get_sqlalchemy_session(self): function get_db (line 428) | def get_db(db_base: DatabaseBase): FILE: lifetrace/storage/event_manager.py class EventManager (line 31) | class EventManager: method __init__ (line 34) | def __init__(self, db_base: DatabaseBase): method _get_last_open_event (line 37) | def _get_last_open_event(self, session: Session) -> Event | None: method _should_reuse_event (line 46) | def _should_reuse_event( method get_active_event (line 70) | def get_active_event(self) -> int | None: method get_or_create_event (line 82) | def get_or_create_event( method close_active_event (line 147) | def close_active_event(self, end_time: datetime | None = None) -> bool: method update_event_summary (line 170) | def update_event_summary(self, event_id: int, ai_title: str, ai_summar... method get_active_event_by_app (line 188) | def get_active_event_by_app(self, app_name: str) -> int | None: method create_event_for_screenshot (line 206) | def create_event_for_screenshot( method add_screenshot_to_event (line 238) | def add_screenshot_to_event(self, screenshot_id: int, event_id: int) -... method complete_event (line 268) | def complete_event(self, event_id: int, end_time: datetime) -> bool: method list_events (line 296) | def list_events( method count_events (line 307) | def count_events( method get_event_screenshots (line 316) | def get_event_screenshots(self, event_id: int) -> list[dict[str, Any]]: method search_events_simple (line 320) | def search_events_simple( method get_event_summary (line 331) | def get_event_summary(self, event_id: int) -> dict[str, Any] | None: method get_events_by_ids (line 335) | def get_events_by_ids(self, event_ids: list[int]) -> list[dict[str, An... method get_event_id_by_screenshot (line 339) | def get_event_id_by_screenshot(self, screenshot_id: int) -> int | None: method get_event_text (line 343) | def get_event_text(self, event_id: int) -> str: method get_app_usage_stats (line 348) | def get_app_usage_stats( FILE: lifetrace/storage/event_queries.py function list_events (line 20) | def list_events( function count_events (line 72) | def count_events( function get_event_screenshots (line 94) | def get_event_screenshots(db_base: DatabaseBase, event_id: int) -> list[... function search_events_simple (line 121) | def search_events_simple( function get_event_summary (line 197) | def get_event_summary(db_base: DatabaseBase, event_id: int) -> dict[str,... function get_events_by_ids (line 227) | def get_events_by_ids(db_base: DatabaseBase, event_ids: list[int]) -> li... function get_event_id_by_screenshot (line 276) | def get_event_id_by_screenshot(db_base: DatabaseBase, screenshot_id: int... function get_event_text (line 287) | def get_event_text(db_base: DatabaseBase, event_id: int) -> str: FILE: lifetrace/storage/event_stats.py function get_app_usage_stats (line 20) | def get_app_usage_stats( FILE: lifetrace/storage/journal_manager.py class JournalCreatePayload (line 28) | class JournalCreatePayload: class JournalUpdatePayload (line 47) | class JournalUpdatePayload: class JournalManager (line 64) | class JournalManager: method __init__ (line 67) | def __init__(self, db_base: DatabaseBase): method _serialize_journal (line 71) | def _serialize_journal( method _get_tags_for_journal (line 99) | def _get_tags_for_journal(self, session, journal_id: int) -> list[Tag]: method _get_related_todo_ids (line 109) | def _get_related_todo_ids(self, session, journal_id: int) -> list[int]: method _get_related_activity_ids (line 118) | def _get_related_activity_ids(self, session, journal_id: int) -> list[... method _replace_tags (line 127) | def _replace_tags(self, session, journal_id: int, tags: list[str] | No... method _replace_related_todos (line 155) | def _replace_related_todos(self, session, journal_id: int, todo_ids: l... method _replace_related_activities (line 166) | def _replace_related_activities( method _apply_journal_updates (line 179) | def _apply_journal_updates(self, journal: Journal, payload: JournalUpd... method create_journal (line 199) | def create_journal(self, payload: JournalCreatePayload) -> int | None: method get_journal (line 233) | def get_journal(self, journal_id: int) -> dict[str, Any] | None: method list_journals (line 259) | def list_journals( method count_journals (line 302) | def count_journals(self, start_date=None, end_date=None) -> int: method update_journal (line 316) | def update_journal(self, journal_id: int, payload: JournalUpdatePayloa... method delete_journal (line 351) | def delete_journal(self, journal_id: int) -> bool: FILE: lifetrace/storage/migrations/journal_migration.py function migrate (line 20) | def migrate(): FILE: lifetrace/storage/models.py function get_utc_time (line 17) | def get_utc_time(): class TimestampMixin (line 25) | class TimestampMixin(SQLModel): class Screenshot (line 36) | class Screenshot(TimestampMixin, table=True): method __repr__ (line 55) | def __repr__(self): class OCRResult (line 59) | class OCRResult(TimestampMixin, table=True): method __repr__ (line 76) | def __repr__(self): class Event (line 80) | class Event(TimestampMixin, table=True): method __repr__ (line 94) | def __repr__(self): class Todo (line 98) | class Todo(TimestampMixin, table=True): method __repr__ (line 151) | def __repr__(self): class AutomationTask (line 155) | class AutomationTask(TimestampMixin, table=True): method __repr__ (line 173) | def __repr__(self): class Attachment (line 177) | class Attachment(TimestampMixin, table=True): method __repr__ (line 189) | def __repr__(self): class TodoAttachmentRelation (line 193) | class TodoAttachmentRelation(SQLModel, table=True): method __repr__ (line 205) | def __repr__(self): class Tag (line 209) | class Tag(SQLModel, table=True): method __repr__ (line 219) | def __repr__(self): class TodoTagRelation (line 223) | class TodoTagRelation(SQLModel, table=True): method __repr__ (line 234) | def __repr__(self): class Journal (line 238) | class Journal(TimestampMixin, table=True): method __repr__ (line 257) | def __repr__(self): class JournalTagRelation (line 261) | class JournalTagRelation(SQLModel, table=True): method __repr__ (line 272) | def __repr__(self): class JournalTodoRelation (line 276) | class JournalTodoRelation(SQLModel, table=True): method __repr__ (line 287) | def __repr__(self): class JournalActivityRelation (line 291) | class JournalActivityRelation(SQLModel, table=True): method __repr__ (line 302) | def __repr__(self): class Chat (line 309) | class Chat(TimestampMixin, table=True): method __repr__ (line 323) | def __repr__(self): class Message (line 327) | class Message(TimestampMixin, table=True): method __repr__ (line 340) | def __repr__(self): class TokenUsage (line 344) | class TokenUsage(TimestampMixin, table=True): method __repr__ (line 363) | def __repr__(self): class Activity (line 367) | class Activity(TimestampMixin, table=True): method __repr__ (line 379) | def __repr__(self): class ActivityEventRelation (line 383) | class ActivityEventRelation(SQLModel, table=True): method __repr__ (line 394) | def __repr__(self): class AudioRecording (line 398) | class AudioRecording(TimestampMixin, table=True): method __repr__ (line 420) | def __repr__(self): class Transcription (line 424) | class Transcription(TimestampMixin, table=True): method __repr__ (line 452) | def __repr__(self): FILE: lifetrace/storage/notification_storage.py function _parse_iso_datetime (line 18) | def _parse_iso_datetime(value: str | None) -> datetime | None: function _build_reminder_key (line 28) | def _build_reminder_key(reminder_at: datetime) -> str: function add_notification (line 32) | def add_notification( # noqa: PLR0913 function get_latest_notification (line 91) | def get_latest_notification() -> dict[str, Any] | None: function get_notifications (line 102) | def get_notifications() -> list[dict[str, Any]]: function get_notification (line 113) | def get_notification(notification_id: str) -> dict[str, Any] | None: function clear_notification (line 126) | def clear_notification(notification_id: str) -> bool: function clear_all_notifications (line 163) | def clear_all_notifications() -> int: function get_notification_count (line 176) | def get_notification_count() -> int: function get_notifications_by_todo_id (line 186) | def get_notifications_by_todo_id(todo_id: int) -> list[dict[str, Any]]: function get_notification_by_todo_id (line 191) | def get_notification_by_todo_id(todo_id: int) -> dict[str, Any] | None: function clear_notification_by_todo_id (line 197) | def clear_notification_by_todo_id(todo_id: int) -> int: function is_notification_dismissed (line 208) | def is_notification_dismissed(todo_id: int, reminder_at: datetime) -> bool: function clear_dismissed_mark (line 216) | def clear_dismissed_mark(todo_id: int) -> None: FILE: lifetrace/storage/ocr_manager.py function _normalize_text (line 16) | def _normalize_text(text: str | None) -> str: class OCRManager (line 23) | class OCRManager: method __init__ (line 26) | def __init__(self, db_base: DatabaseBase): method add_ocr_result (line 29) | def add_ocr_result( method get_ocr_results_by_screenshot (line 72) | def get_ocr_results_by_screenshot(self, screenshot_id: int) -> list[di... method get_ocr_by_id (line 100) | def get_ocr_by_id(self, ocr_result_id: int) -> dict[str, Any] | None: method get_by_text_hash (line 122) | def get_by_text_hash(self, text_hash: str) -> dict[str, Any] | None: FILE: lifetrace/storage/screenshot_manager.py class ScreenshotManager (line 19) | class ScreenshotManager: method __init__ (line 22) | def __init__(self, db_base: DatabaseBase): method add_screenshot (line 25) | def add_screenshot( method get_screenshot_by_id (line 91) | def get_screenshot_by_id(self, screenshot_id: int) -> dict | None: method get_screenshot_by_path (line 118) | def get_screenshot_by_path(self, file_path: str) -> dict | None: method update_screenshot_processed (line 144) | def update_screenshot_processed(self, screenshot_id: int): method get_screenshot_count (line 158) | def get_screenshot_count(self, exclude_deleted: bool = False) -> int: method search_screenshots (line 179) | def search_screenshots( method get_unprocessed_screenshots (line 240) | def get_unprocessed_screenshots(self, limit: int = 100) -> list[dict[s... FILE: lifetrace/storage/sql_utils.py function col (line 10) | def col(expr: Any) -> ColumnElement[Any]: FILE: lifetrace/storage/stats_manager.py class StatsManager (line 18) | class StatsManager: method __init__ (line 21) | def __init__(self, db_base: DatabaseBase): method get_statistics (line 24) | def get_statistics(self) -> dict[str, Any]: method cleanup_old_data (line 53) | def cleanup_old_data(self, max_days: int): FILE: lifetrace/storage/todo_manager.py class TodoManager (line 23) | class TodoManager(TodoAttachmentMixin, TodoIcalMixin): method __init__ (line 26) | def __init__(self, db_base: DatabaseBase): method _get_todo_tags (line 30) | def _get_todo_tags(self, session, todo_id: int) -> list[str]: method get_todo_context (line 39) | def get_todo_context(self, todo_id: int) -> dict[str, Any] | None: method get_todo (line 102) | def get_todo(self, todo_id: int) -> dict[str, Any] | None: method get_todo_by_uid (line 113) | def get_todo_by_uid(self, uid: str) -> dict[str, Any] | None: method list_todos (line 126) | def list_todos( method count_todos (line 149) | def count_todos(self, *, status: str | None = None) -> int: method get_active_todos_for_prompt (line 162) | def get_active_todos_for_prompt(self, limit: int = 100) -> list[dict[s... method _delete_todo_recursive (line 196) | def _delete_todo_recursive(self, session, todo_id: int) -> None: method delete_todo (line 217) | def delete_todo(self, todo_id: int) -> bool: method reorder_todos (line 235) | def reorder_todos(self, items: list[dict[str, Any]]) -> bool: method _set_todo_tags (line 273) | def _set_todo_tags(self, session, todo_id: int, tags: list[str]) -> None: FILE: lifetrace/storage/todo_manager_attachments.py class TodoAttachmentMixin (line 19) | class TodoAttachmentMixin: method _get_todo_attachments (line 24) | def _get_todo_attachments(self, session, todo_id: int) -> list[dict[st... method add_todo_attachment (line 49) | def add_todo_attachment( method remove_todo_attachment (line 98) | def remove_todo_attachment(self, *, todo_id: int, attachment_id: int) ... method get_attachment (line 114) | def get_attachment(self, attachment_id: int) -> dict[str, Any] | None: FILE: lifetrace/storage/todo_manager_ical.py function _to_ical_status (line 30) | def _to_ical_status(status: str | None) -> str | None: class TodoIcalMixin (line 42) | class TodoIcalMixin: method _get_todo_tags (line 48) | def _get_todo_tags(self, session, todo_id: int) -> list[str]: ... method _get_todo_attachments (line 50) | def _get_todo_attachments(self, session, todo_id: int) -> list[dict[st... method _set_todo_tags (line 52) | def _set_todo_tags(self, session, todo_id: int, tags: list[str]) -> No... method _todo_to_dict (line 54) | def _todo_to_dict(self, session, todo: Todo) -> dict[str, Any]: method create_todo (line 123) | def create_todo( # noqa: PLR0913, C901, PLR0912 method _apply_todo_updates (line 262) | def _apply_todo_updates( # noqa: PLR0913 method update_todo (line 358) | def update_todo( # noqa: PLR0913, C901, PLR0912, PLR0915 FILE: lifetrace/storage/todo_manager_utils.py function _safe_int_list (line 10) | def _safe_int_list(value: Any) -> list[int]: function _normalize_reminder_offsets (line 29) | def _normalize_reminder_offsets(value: Any) -> list[int] | None: function _serialize_reminder_offsets (line 37) | def _serialize_reminder_offsets(value: Any) -> str | None: function _normalize_percent (line 44) | def _normalize_percent(value: Any) -> int: FILE: lifetrace/util/app_utils.py function get_icon_filename (line 114) | def get_icon_filename(app_name): function get_all_supported_apps (line 142) | def get_all_supported_apps(): class AppMapper (line 314) | class AppMapper: method __init__ (line 317) | def __init__(self): method get_process_names (line 320) | def get_process_names(self, app_name: str) -> list[str]: method expand_app_names (line 347) | def expand_app_names(self, app_names: list[str]) -> list[str]: method get_supported_apps (line 370) | def get_supported_apps(self) -> list[str]: method get_app_info (line 379) | def get_app_info(self, app_name: str) -> dict[str, list[str]]: method is_supported_app (line 391) | def is_supported_app(self, app_name: str) -> bool: function get_process_names_for_app (line 408) | def get_process_names_for_app(app_name: str) -> list[str]: function expand_blacklist_apps (line 421) | def expand_blacklist_apps(app_names: list[str]) -> list[str]: FILE: lifetrace/util/base_paths.py function get_app_root (line 13) | def get_app_root() -> Path: function get_internal_root (line 35) | def get_internal_root() -> Path: function get_config_dir (line 54) | def get_config_dir() -> Path: function get_models_dir (line 67) | def get_models_dir() -> Path: function get_data_directory (line 80) | def get_data_directory() -> Path | None: function get_user_config_dir (line 96) | def get_user_config_dir() -> Path: function get_user_data_dir (line 112) | def get_user_data_dir() -> Path: function get_user_logs_dir (line 128) | def get_user_logs_dir() -> Path: FILE: lifetrace/util/image_utils.py function get_screenshot_base64 (line 13) | def get_screenshot_base64(screenshot_id: int) -> str | None: function get_screenshots_base64 (line 67) | def get_screenshots_base64(screenshot_ids: list[int]) -> list[dict[str, ... function validate_image_format (line 95) | def validate_image_format(file_path: str) -> bool: FILE: lifetrace/util/language.py function get_request_language (line 23) | def get_request_language(request: Request) -> str: function get_language_instruction (line 42) | def get_language_instruction(lang: str) -> str: FILE: lifetrace/util/logging_config.py function _get_local_date_string (line 9) | def _get_local_date_string() -> str: function _generate_log_file_path (line 14) | def _generate_log_file_path(log_dir: str, suffix: str = "") -> str: class LoggerManager (line 49) | class LoggerManager: method __init__ (line 50) | def __init__(self): method _build_filter (line 53) | def _build_filter(self, quiet_modules: list[str] | None): method configure (line 75) | def configure(self, config: dict): method get_logger (line 133) | def get_logger(self): function setup_logging (line 137) | def setup_logging(config: dict): function get_logger (line 143) | def get_logger(): FILE: lifetrace/util/path_utils.py function get_database_path (line 19) | def get_database_path() -> Path: function get_screenshots_dir (line 31) | def get_screenshots_dir() -> Path: function get_attachments_dir (line 43) | def get_attachments_dir() -> Path: function get_scheduler_database_path (line 55) | def get_scheduler_database_path() -> Path: function get_vector_db_dir (line 67) | def get_vector_db_dir() -> Path: function get_log_dir (line 79) | def get_log_dir() -> Path: function get_app_root (line 93) | def get_app_root() -> Path: function get_config_dir (line 98) | def get_config_dir() -> Path: function get_models_dir (line 103) | def get_models_dir() -> Path: function get_user_config_dir (line 108) | def get_user_config_dir() -> Path: FILE: lifetrace/util/prompt_loader.py class PromptLoader (line 14) | class PromptLoader: method __new__ (line 20) | def __new__(cls): method __init__ (line 26) | def __init__(self): method _load_prompts (line 30) | def _load_prompts(self): method get_prompt (line 72) | def get_prompt(self, category: str, key: str, **kwargs) -> str: method reload (line 107) | def reload(self): function get_prompt (line 117) | def get_prompt(category: str, key: str, **kwargs) -> str: FILE: lifetrace/util/query_parser.py class QueryConditions (line 20) | class QueryConditions: method to_dict (line 39) | def to_dict(self) -> dict[str, Any]: class QueryParser (line 59) | class QueryParser: method __init__ (line 62) | def __init__(self, llm_client=None): method parse_query (line 96) | def parse_query(self, query: str) -> QueryConditions: method _parse_with_rules (line 139) | def _parse_with_rules(self, query: str) -> QueryConditions: method _extract_time_range (line 154) | def _extract_time_range(self, query: str) -> tuple[datetime | None, da... method _find_app_names_from_mappings (line 199) | def _find_app_names_from_mappings(self, query: str) -> list[str]: method _find_app_names_from_patterns (line 215) | def _find_app_names_from_patterns(self, query: str, existing: list[str... method _convert_to_process_names (line 233) | def _convert_to_process_names(self, friendly_names: list[str]) -> list... method _extract_app_names (line 244) | def _extract_app_names(self, query: str) -> list[str] | None: method _extract_keywords (line 254) | def _extract_keywords(self, query: str) -> list[str] | None: method _build_parsing_prompt (line 321) | def _build_parsing_prompt(self, query: str) -> str: method _parse_datetime_safe (line 348) | def _parse_datetime_safe(self, date_str: str | None) -> datetime | None: method _extract_time_from_parsed_data (line 357) | def _extract_time_from_parsed_data( method _build_query_conditions (line 372) | def _build_query_conditions(self, parsed_data: dict[str, Any]) -> Quer... FILE: lifetrace/util/settings.py function _get_config_dir (line 19) | def _get_config_dir() -> Path: function _get_default_config_dir (line 24) | def _get_default_config_dir() -> Path: function _init_config_files (line 29) | def _init_config_files() -> list[str]: function get_settings (line 153) | def get_settings() -> Dynaconf: function reload_settings (line 158) | def reload_settings() -> bool: FILE: lifetrace/util/time_parser.py function _parse_24h_time (line 16) | def _parse_24h_time(time_str: str) -> tuple[int, int] | None: function _parse_12h_time (line 28) | def _parse_12h_time(time_str: str) -> tuple[int, int] | None: function parse_time_string (line 60) | def parse_time_string(time_str: str) -> tuple[int, int] | None: function normalize_time_string (line 87) | def normalize_time_string(time_str: str) -> str: function parse_relative_time (line 104) | def parse_relative_time( function parse_absolute_time (line 148) | def parse_absolute_time(absolute_time_str: str | datetime) -> datetime |... function calculate_scheduled_time (line 180) | def calculate_scheduled_time(time_info: dict, reference_time: datetime) ... FILE: lifetrace/util/time_utils.py function get_utc_now (line 12) | def get_utc_now() -> datetime: function to_utc (line 21) | def to_utc(dt: datetime) -> datetime: function naive_as_utc (line 45) | def naive_as_utc(dt: datetime) -> datetime: function ensure_utc (line 67) | def ensure_utc(dt: datetime | None) -> datetime | None: function to_local (line 79) | def to_local(dt: datetime | None) -> datetime | None: FILE: lifetrace/util/token_usage_logger.py function _resolve_model_price (line 20) | def _resolve_model_price( class TokenUsageLogger (line 70) | class TokenUsageLogger: method __init__ (line 73) | def __init__(self): method _get_model_price (line 76) | def _get_model_price(self, model: str, input_tokens: int | None = None... method log_token_usage (line 113) | def log_token_usage( method get_usage_stats (line 191) | def get_usage_stats(self, days: int = 30) -> dict[str, Any]: function get_token_logger (line 314) | def get_token_logger() -> TokenUsageLogger: function setup_token_logger (line 319) | def setup_token_logger() -> TokenUsageLogger: function log_token_usage (line 324) | def log_token_usage(model: str, input_tokens: int, output_tokens: int, *... FILE: lifetrace/util/utils.py function _load_appkit (line 33) | def _load_appkit() -> Any | None: function _load_quartz (line 40) | def _load_quartz() -> Any | None: function get_file_hash (line 47) | def get_file_hash(file_path: str) -> str: function ensure_dir (line 59) | def ensure_dir(path: str): function get_active_window_info (line 64) | def get_active_window_info() -> tuple[str | None, str | None]: function _get_windows_active_window (line 82) | def _get_windows_active_window() -> tuple[str | None, str | None]: function _get_macos_active_window (line 107) | def _get_macos_active_window() -> tuple[str | None, str | None]: function get_active_window_screen (line 144) | def get_active_window_screen() -> int | None: function _get_macos_active_app_name (line 162) | def _get_macos_active_app_name() -> str | None: function _get_macos_active_window_bounds (line 174) | def _get_macos_active_window_bounds(app_name: str) -> dict | None: function _find_screen_for_window_center (line 198) | def _find_screen_for_window_center(window_center: tuple[float, float], s... function _get_macos_active_window_screen (line 222) | def _get_macos_active_window_screen() -> int | None: function _get_windows_active_window_screen (line 256) | def _get_windows_active_window_screen() -> int | None: function _parse_linux_window_position (line 301) | def _parse_linux_window_position(stdout: str) -> tuple[int, int] | None: function _find_linux_screen_for_position (line 311) | def _find_linux_screen_for_position(x: int, y: int, xrandr_stdout: str) ... function _get_linux_active_window_screen (line 338) | def _get_linux_active_window_screen() -> int | None: # noqa: PLR0911 function _get_linux_active_window (line 378) | def _get_linux_active_window() -> tuple[str | None, str | None]: function format_file_size (line 428) | def format_file_size(size_bytes: int) -> str: function get_screenshot_filename (line 443) | def get_screenshot_filename(screen_id: int = 0, timestamp: datetime | No... function cleanup_old_files (line 451) | def cleanup_old_files(directory: str, max_days: int): FILE: scripts/new_worktree.py function _get_git_path (line 12) | def _get_git_path() -> str: function run_git (line 19) | def run_git(root: Path, args: list[str], check: bool = True) -> subproce... function run_link_deps (line 29) | def run_link_deps(root: Path, worktree_path: Path, force: bool) -> int: function get_repo_root (line 69) | def get_repo_root() -> Path: function slugify (line 83) | def slugify(value: str) -> str: function branch_exists (line 88) | def branch_exists(root: Path, branch: str) -> bool: function get_git_user (line 93) | def get_git_user(root: Path) -> str: function summarize_task (line 105) | def summarize_task(task: str, max_words: int = 3) -> str: function normalize_type (line 113) | def normalize_type(value: str) -> str: function unique_branch_and_path (line 120) | def unique_branch_and_path(root: Path, base_branch: str, base_path: Path... function main (line 136) | def main() -> int: FILE: scripts/precommit_clippy.py function run (line 11) | def run() -> int: FILE: scripts/precommit_rustfmt.py function run (line 10) | def run() -> int: FILE: tests/test_icalendar_service.py function test_export_vtodo_fallbacks_due_to_dtstart (line 11) | def test_export_vtodo_fallbacks_due_to_dtstart() -> None: function test_import_vtodo_duration_keeps_due_none (line 32) | def test_import_vtodo_duration_keeps_due_none() -> None: FILE: tests/test_todo_serialization.py class StubTodoManager (line 7) | class StubTodoManager(TodoIcalMixin): method _get_todo_tags (line 8) | def _get_todo_tags(self, session, todo_id: int): method _get_todo_attachments (line 11) | def _get_todo_attachments(self, session, todo_id: int): method _set_todo_tags (line 14) | def _set_todo_tags(self, session, todo_id: int, tags): function test_todo_to_dict_coerces_is_all_day_none (line 18) | def test_todo_to_dict_coerces_is_all_day_none() -> None: function test_todo_to_dict_normalizes_reminder_offsets (line 29) | def test_todo_to_dict_normalizes_reminder_offsets() -> None: FILE: tests/test_todo_service_mapping.py class FakeTodoRepository (line 12) | class FakeTodoRepository: method __init__ (line 13) | def __init__(self) -> None: method get_by_id (line 28) | def get_by_id(self, todo_id: int): method get_by_uid (line 31) | def get_by_uid(self, uid: str): method list_todos (line 34) | def list_todos(self, limit: int, offset: int, status: str | None): method count (line 37) | def count(self, status: str | None): method create (line 40) | def create(self, **kwargs): method update (line 44) | def update(self, todo_id: int, **kwargs): method delete (line 48) | def delete(self, todo_id: int): method reorder (line 51) | def reorder(self, items): method add_attachment (line 54) | def add_attachment( method remove_attachment (line 67) | def remove_attachment(self, *, todo_id: int, attachment_id: int): method get_attachment (line 70) | def get_attachment(self, attachment_id: int): function test_update_todo_dtstart_does_not_touch_due (line 74) | def test_update_todo_dtstart_does_not_touch_due() -> None: function test_update_todo_duration_conflict_raises (line 87) | def test_update_todo_duration_conflict_raises() -> None: function test_create_todo_duration_conflict_raises (line 96) | def test_create_todo_duration_conflict_raises() -> None: function test_update_todo_time_zone_sets_tzid (line 105) | def test_update_todo_time_zone_sets_tzid() -> None: