- Card now shows vlm_description_localized directly (no 【ZH-TW】 label)
- Avoids incorrect language labels from Core API text_content field
- Japanese content now displays correctly without wrong prefix
- Added last_query field to SearchSession interface
- loadSessions now fetches last user message for each session
- Session list displays: mode badge, title, last query, message count, time
- Added .hs-query CSS style for query text
- Added VLM description sections (localized + English) to text detail modal
- Added VLM tags display with both local and English labels
- Styled with language labels, tag badges, and proper spacing
- Fixed onMounted to properly set currentSession after creating default
- startNewChat now creates a new session when called
- Ensure authToken before all session API calls
- Created useSearchSession composable for session management
- Added 7 API endpoints in api/index.ts
- Updated SearchView.vue to use sessions instead of history
- Session sidebar with create, rename, delete functionality
- Auto-save messages to current session after each search
- Auto-create default session on first load
- Updated CSS for session active state and new session button
- Removed thumbnail_url from VLM scene results (lines 901, 1312)
- Scene thumbnail files often don't exist for unprocessed videos
- Frontend now falls back to regular thumbnail loading mechanism
- Eliminates 404 errors in browser console
- Scene thumbnails often don't exist for unprocessed files
- Use regular thumbnail fallback instead of scene-specific URLs
- Eliminates 404 errors in browser console for scene_*.jpg requests
- Scene thumbnails may not exist for all files
- Added @error handler to hide broken images instead of showing 404
- Cleaner UI when scene data is incomplete
- Core API now returns both vlm_description (EN) and vlm_description_localized (JA)
- Removed duplicate API calls (was fetching EN + JA separately)
- Single API call with output_language param, uses both fields from response
- Load More also updated to use results array and correct field names
- Format: 【JA】localized text...【English】english text...
- Bilingual format: 【JA】... then 【English】...
- Summary uses localized language (vlm_description_lang) as primary
- Load More function now also supports bilingual format
- Fallback: only vlm_description shows single language without labels
- Use endFrame=999999 for full file playback (backend clips correctly)
- Add z-index:10 to card-file-info to prevent being obscured
- Full file now plays complete duration
- Add card-file-info bar at top of search result cards
- Click file name to play full file (startFrame: 0, endFrame: 0)
- Show video/document icon based on file extension
- Display file UUID badge
- Remove duplicate card-file section from bottom of card
- Save messages to localStorage when leaving search page
- Restore messages when returning to search page
- Clear session on newChat()
- Session includes: messages, conversationId, fileUuidCache, mode
- Add 'Face Group' mode to search modes
- Use search_identities API temporarily
- Update summary: 'Identity' → 'FS'
- Will replace with Core Team's search_tkg_node_face_trace_profile API
Core Principle: Frame is the ONLY standard
Changes:
- VideoPlayer: Remove startTime/endTime props
- VideoPlayer: Add mandatory startFrame/endFrame check
- VideoPlayer: UI shows F123 (51.2s) format
- All Views: Only set startFrame/endFrame
- All Views: Only pass :start-frame/:end-frame
- Remove all startTime/endTime from currentVideo refs
Time is only used for display (auxiliary).
Frame is the source of truth for all positioning.
Core Principle: Frame is the only standard
Changes:
- VideoPlayer: Add startFrame/endFrame props
- VideoPlayer: Use frame parameters in simple playback path
- SearchView: Remove frame/time conversion (stop using fps = 24)
- PeopleView: Pass frames directly instead of time
- PersonDetailView: Pass frames directly instead of time
All video streams now use startFrame/endFrame API parameters.
Time conversion only happens in VideoPlayer internals for UI display.
Ref: frame-based positioning standards research
Core Changes:
- Fix SearchView to use start_frame/end_frame directly (no time*fps conversion)
- Add hard_delete support to delete_trace API
- VideoPlayer: Main timeline + Mark system foundation
- Proxy: Add local routes for auth, media, identity-matches, cluster-results
- Add .gitignore to exclude build artifacts and dependencies
Design Documents:
- Multi-track Mark system design (.opencode/plans/)
- Video editing positioning standards research
Files Modified:
- src/views/SearchView.vue: Frame positioning, ensureMinDuration (240 frames)
- src/views/PeopleView.vue: batchDeleteGroups with hard_delete
- src/api/index.ts: delete_trace with hard_delete body
- src/components/VideoPlayer.vue: Timeline + Mark UI
- src-tauri/src/proxy.rs: New local routes
- AGENTS.md: Update documentation
- Core API: bind/unbind accept id (integer PK) when face_id is null
- Tauri proxy: stream video responses instead of buffering for seek bar
- VideoPlayer: remove muted attribute, unmute by default
- LibraryView: call invalidateFiles() before ensureFiles() on register/unregister
- PeopleView: close sort panel on click-outside, not just hamburger toggle
- bind_face: prefer face_id, fallback to id when face_id is null