Commit Graph

94 Commits

Author SHA1 Message Date
042bb45574 fix: update Pending Faces display to FS# format
- Line 102: Pending Faces name display
- Changed from F# to FS# (Face Sequence)
- Consistent with other Face Trace displays
2026-07-25 13:55:18 +08:00
e6b9b7b4b8 refactor: add # separator to display format
Display format with # separator:
- Frame: F#{number} (e.g., F#333)
- Face Trace: FS#{number} (e.g., FS#233)

Changes:
- Line 105: Frame range display (F#2219–F#2225)
- Line 143: Face Detail Modal (file_uuid:FS#233)
- Line 262: Cluster strip fallback (FS#233)
- Line 264: Cluster strip label (FS#233)

Benefits:
- # separator makes ID clearer
- Consistent format across all displays
- Visual distinction between type and number
2026-07-25 13:55:01 +08:00
98534bebfb refactor: change Face Trace display from 'Face{id}' to 'FS{id}'
Display format clarification:
- Frame: F{number} (e.g., F333)
- Face Trace: FS{number} (e.g., FS233)

Internal data remains: trace_id = 233 (integer)
Display text: FS233 (Face Sequence)

Changes:
- Line 143: Face Detail Modal display
- Line 262: Cluster strip fallback display
- Line 264: Cluster strip label

Reason:
- FS = Face Sequence (clear meaning)
- Avoid confusion with Frame (F)
- Separation of concerns: internal ID vs display text
2026-07-25 13:54:01 +08:00
389b3c8ba3 feat: add BuildVersion component to App.vue template
- Add BuildVersion at root level of template
- Shows build version in top-right corner on all views
2026-07-25 13:36:47 +08:00
9de4910aa0 feat: add BuildVersion component to App.vue
- Import BuildVersion component
- Add to template (top-right corner fixed)
- Visible on all views

Build version format: 20260725133504-gitHash
Shows in top-right corner with monospace font
2026-07-25 13:36:14 +08:00
baa42fa625 feat: add build version display to all views
Add build version indicator to verify code updates:

1. Create BuildVersion.vue component:
   - Displays in top-right corner (fixed position)
   - Format: YYYYMMDDHHMMSS-gitHash
   - Example: 20260725133504-39ce37e

2. Update vite.config.ts:
   - Inject __BUILD_VERSION__ global variable
   - Generated from build time + git commit hash

3. Add to App.vue:
   - Shown on all views automatically
   - Z-index: 9999 (always visible)

4. Add vite-env.d.ts:
   - TypeScript declarations for __BUILD_VERSION__

Purpose:
- User can verify if browser loaded latest code
- Easy to confirm updates are deployed
- No need to check source code

Location: Top-right corner, fixed position
Format: Monospace font, small text, subtle styling
2026-07-25 13:35:41 +08:00
39ce37e69c fix: remove premature updateClusterAfterMerge call in merge loop
Critical bug fix:
- updateClusterAfterMerge() was called after EACH trace merge
- This caused source group to be deleted after first trace
- Remaining traces had no group to merge into

Problem flow:
1. Merge trace #1 from Group B → Group A
2. updateClusterAfterMerge(B, A) deletes Group B
3. Try to merge trace #2 from Group B → Group B is gone!
4. Result: All source groups deleted after first trace

Solution:
- Remove updateClusterAfterMerge() from loop
- Let all traces merge successfully
- Reload cluster data at the end (Line 1813)
- Core API handles the merge, we just refresh UI

Impact:
- Merge now works correctly for all traces in a group
- No premature deletion of source groups
- UI refreshes after all operations complete
2026-07-25 13:29:47 +08:00
7b5650d098 fix: correct updateClusterAfterMerge to trigger computed update
Problem:
- Previous commit tried to splice computed property (clusterAsPending)
- Computed properties cannot be modified directly
- Need to update underlying data (clusterResultsCache)

Solution:
- Remove incorrect clusterAsPending.value.splice()
- Trigger reactive update via clusterResultsCache reassignment
- clusterAsPending computed will auto-update

Technical details:
- Vue computed properties are read-only
- Must modify underlying reactive data
- Reassignment triggers computed recalculation
2026-07-25 13:25:41 +08:00
c235d11d03 fix: handle empty groups after merge operation
Problem:
- After merge, source groups become empty
- Empty groups stay in UI as garbage data
- User sees empty groups with 0 faces

Solution:
- updateClusterAfterMerge() now removes source groups after merge
- Added removal from clusterAsPending computed property
- Ensures clean UI after merge operation

Behavior:
- Source group is deleted after all members merged to target
- Target group receives all members
- No empty groups left in UI

Related: merge functionality debug logging added in previous commit
2026-07-25 13:25:16 +08:00
361a01a025 debug: add comprehensive logging for merge groups functionality
Add debug logs to diagnose merge not working issue:

1. batchMergeGroups():
   - Log selected groupIds
   - Log mergeCandidateGroups count

2. executeMerge():
   - Log targetGroupId and targetGroup
   - Log targetTraceId type and value
   - Log targetTrace data
   - Log sourceGroups count
   - Log totalTraces and validTraces
   - Log each merge_trace API call params
   - Log success/fail counts

Purpose: Identify why merge fails when move works
Next: Check browser console for specific errors
2026-07-25 13:24:45 +08:00
69601fe512 docs: add Face Move/Merge diagnosis report
Complete documentation for face move functionality:

1. Display text improvements (completed):
   - Changed 'F13' to 'Face13' (3 locations)
   - Preserved frame display 'F2219-2225'

2. Data flow analysis:
   - Ideal flow: Core API → clusterTracesMap → selectedFaces → merge_trace API
   - 3 key checkpoints identified

3. Browser verification commands:
   - Check selectedFaces format
   - Check clusterTracesMap data
   - Test Move functionality

4. Potential issues:
   - Data source errors
   - Display text pollution
   - Frontend transformation errors

5. Core API specifications confirmed:
   - merge_trace: POST /file/:uuid/trace/:id/merge/:target_id
   - face-groups: GET /file/:uuid/face-groups

Status: Display improved, awaiting data flow verification
2026-07-25 13:13:19 +08:00
c0832f32f9 refactor: complete face trace display migration to 'Face{id}'
Additional changes:
- Line 143: Face detail modal trace ID display
- Line 262: Cluster strip fallback display

All trace_id displays now use 'Face{id}' format:
- F13 → Face13
- F142 → Face142

Frame displays remain with 'F' prefix:
- F2219-2225 (frame range) - unchanged

Total changes: 3 locations in PeopleView.vue
2026-07-25 13:12:10 +08:00
e7f9740e72 refactor: change face trace display from 'F{id}' to 'Face{id}'
Problem:
- 'F13' display text confused with Frame numbers
- Users cannot distinguish between Trace ID and Frame Number

Solution:
- Change display format from 'F{trace_id}' to 'Face{trace_id}'
- Example: F13 → Face13, F142 → Face142

Changes:
- src/views/PeopleView.vue:264 - Cluster Detail Modal label

Benefits:
- Clear semantic meaning (Face vs Frame)
- No ambiguity for users
- Display layer only, data layer unchanged (still trace_id)
2026-07-25 13:11:47 +08:00
70889b25d1 docs: update Core Team response - deployment complete
Core Team has deployed all fixes:
- src/worker/job_worker.rs: 6 running status updates
- src/api/files.rs:866: Initialize stages at registration
- src/api/files.rs:1762: sync-status TKG + chunks check
- src/api/files.rs:16: New imports

Status:  Production (3002) running
Build: 2026-07-24T18:43:52Z

Studio team ready to test
2026-07-25 03:35:28 +08:00
8cf7196c86 docs: add Core Team response for pipeline fixes
Core Team has implemented all 3 backend fixes:
1.  Add running stage tracking
2.  Initialize stages at registration
3.  sync-status TKG check

New API response fields:
- tkg_nodes: TKG node count
- tkg_edges: TKG edge count
- sentence_chunks: Rule 1 sentence chunk count
- is_music_only: Music-only file flag

Deployment: Production (3002) restarted
Build: 2026-07-24T18:43:52Z
2026-07-25 03:34:38 +08:00
ec67e749d7 fix: correct pipeline stage weights to match Core API
Problem:
- rule1_ingestion weight was 0.10 (should be 0.05)
- face_tracing weight was 0.10 (should be 0.05)
- identity_agent was filtered out (should be included with 0.10)
- Progress percentage calculation was incorrect

Solution:
1. Correct weights based on Core team specifications
2. Remove identity_agent filter (now part of pipeline)
3. Use correct weights:
   - processors: 0.30
   - rule1_ingestion: 0.05
   - face_tracing: 0.05
   - identity_agent: 0.10
   - tkg_nodes: 0.20
   - tkg_edges: 0.15
   - rule2_ingestion: 0.15

Impact:
- Progress percentage now accurately reflects pipeline completion
- All stages properly tracked and weighted

Thanks Core team for the correct weight configuration!
2026-07-25 02:20:50 +08:00
a096bb645c docs: update Core Team action items with Studio fixes
Studio Team 已完成修复:
1.  权重配置修正(rule1_ingestion: 0.05, face_tracing: 0.05, identity_agent: 0.10)
2.  移除 identity_agent 过滤
3.  API 端点已验证正确(无需修改)
4.  syncFileStatus() 加载进度数据
5.  LibraryView 启动轮询(处理边缘情况)

Core Team 后端问题:
- 🟡 Pipeline 进度计算逻辑
- 🟡 Pipeline stages 初始化
- 🟡 文件处理异常处理
2026-07-25 02:20:21 +08:00
36074b1017 docs: add Core Team action items document
Document 5 key issues that Core team needs to diagnose:

1. get_pipeline_stats API data accuracy (HIGH)
2. sync_file_status API state updates (HIGH)
3. Pipeline progress calculation logic (MEDIUM)
4. Pipeline stages initialization (MEDIUM)
5. File processing error handling (MEDIUM)

Includes:
- Test commands for API diagnosis
- Expected response formats
- Verification checklist
- Diagnostic steps

Related: Studio team fixes in previous commit
2026-07-25 01:36:32 +08:00
c347c200b2 fix: load pipeline stats in syncFileStatus and handle missing pipeline data
Problem:
- syncFileStatus() doesn't load pipeline progress data
- Files stuck in 'processing' without percentage display
- pollPipelineProgress() not started when pipeline data missing

Solution:
1. Add loadPipelineStats() call in syncFileStatus() for processing files
2. Start pollPipelineProgress() even when pipeline data is missing
3. Ensure progress bar always has data to display

Impact:
- Progress bar now shows percentage during deep scan
- Files no longer stuck in 'processing' state indefinitely
- Better handling of edge cases when API data is missing

Related: Core team needs to verify get_pipeline_stats API accuracy
2026-07-25 01:36:28 +08:00
58e614cb5c fix: unify status text to 'Scanning...' in LibraryView
Problem:
- Status badge showed 'Scanning'
- Progress bar showed 'Processing...'
- Two different texts displayed simultaneously

Solution:
- Change progress bar text to 'Scanning...'
- Now both badge and progress bar use consistent terminology
2026-07-25 01:27:16 +08:00
a3b45e12c5 refactor: rename Face Cluster to Face Deduplication in LibraryView
- Update processor label from 'Face Cluster' to 'Face Deduplication'
- More accurate description of face_cluster processor functionality
2026-07-25 00:46:13 +08:00
9f667cf174 fix: correct CSS syntax error in VideoPlayer
Fixed PostCSS parse error:
- Line 1452: Missing class selector before CSS rule
- Added .ms-mark-btn-wrap class selector
- Properly formatted CSS rule blocks
2026-07-24 23:35:05 +08:00
cb7e1ba0ba fix: resolve TypeScript compilation errors
Fixes:
- VideoPlayer.vue: restore allTags, filteredMarks, marksByTag (removed by mistake)
- PeopleView.vue: fix frameTime scope in playFaceDetailVideo catch block
- Both errors caused white screen on build failure

Root cause:
1. visibleTags duplicate declaration (old + new logic)
2. frameTime undefined in catch block (scope issue)

Solution:
1. Keep allTags/filteredMarks/marksByTag (needed in template)
2. Keep visibleTags (new logic for processor toggles)
3. Move frameTime calculation to correct scope in catch block
2026-07-24 23:33:40 +08:00
48975ef247 feat: add smart responsive design for VideoPlayer
Responsive Design:
- Mobile (<768px): 98% width, 50vh video height
- Tablet (769-1024px): 900px max, 65vh video
- Desktop (1025-1440px): 1000px max, 70vh video
- Large (1441px+): 1200px max, 75vh video (advanced)
- Ultra-wide (21:9 aspect): 60vh video height

Features:
- min() for max-width to prevent overflow
- min() for max-height to respect viewport
- calc() for dynamic height calculation
- Aspect ratio media query for ultra-wide screens
- Flexible toggle wrap on mobile
2026-07-24 23:27:51 +08:00
16fb1fd1ed feat: add processor toggles and enlarge video in advanced mode
Advanced Mode Enhancements:
- Processor visibility toggles (ASRX/OCR/Face/Pose)
- Toggle switches to show/hide each processor type
- Larger video size in advanced mode (1200px vs 720px)
- Video max-height increased to 75vh

Features:
- showAsrxInPlayer/showOcrInPlayer/showFaceInPlayer/showPoseInPlayer refs
- visibleTags computed respects toggle state
- ms-proc-toggles UI with colored labels
- ms-modal-video-advanced CSS class
2026-07-24 23:27:00 +08:00
38b993938b feat: integrate ASRX/OCR/Face display into VideoPlayer callers
SearchView:
- Enable ASRX subtitle + OCR bbox
- show-asrx='true', show-ocr='true'

PeopleView/PersonDetailView:
- Enable Face bbox (existing allTraces)
- show-face='true'

LibraryView:
- Keep simple mode (no processor overlays)
2026-07-24 23:24:13 +08:00
6a34a862f4 feat: add Face bbox and Pose indicator to VideoPlayer
Features:
- Face bbox overlay with identity label
- Pose indicator (top-right corner)
- Extended loadProcessorMarks for all processors
- ASRX speaker:text format

Overlays:
- OCR: orange bbox + text label
- Face: blue bbox + identity name
- Pose: purple indicator badge

New props:
- showFace: boolean
- showPose: boolean

Data formats:
- Face: { frames: [{ frame, faces: [{ bbox, identity_name }] }] }
- Pose: { frames: [{ frame, pose }] }
- ASRX: { segments: [{ start_frame, end_frame, speaker, text }] }
2026-07-24 23:17:31 +08:00
b1a9c44778 feat: add ASRX subtitle and OCR bbox overlay to VideoPlayer
Features:
- ASRX subtitle bar (below video)
- OCR bbox overlay (on video frame)
- Multi-track timeline for asrx/ocr/face/pose
- Real-time mark matching (frame-based)

Implementation:
- Add showAsrx/showOcr props
- Add loadProcessorMarks() to fetch processor JSON
- Add currentAsrxMark/currentOcrMarks computed
- Add OCR bbox overlay with text label
- Add ASRX subtitle bar with frame range

Data format (expected):
- ASRX: { segments: [{ start_frame, end_frame, text }] }
- OCR: { frames: [{ frame, text, bbox }] }

Colors:
- face: #4285f4 (blue)
- asrx: #34a853 (green)
- ocr: #fbbc04 (orange)
- pose: #9c27b0 (purple)
2026-07-24 23:11:05 +08:00
ab1399b853 fix: show frame and time in video titles (frame primary, time auxiliary)
Format: F123-F456 (5.1s-18.9s)
- Frame range is primary (left)
- Time range is auxiliary (right in parentheses)
2026-07-24 22:57:41 +08:00
717e2deb6a fix: remove hardcoded frame range from LibraryView title
When playing full video, only show filename.
Don't show F0-F99999 which is misleading.
2026-07-24 22:56:04 +08:00
c2901338e1 feat: enforce 100% frame-based positioning (no time)
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.
2026-07-24 22:49:35 +08:00
76c6ec183d fix: handle missing frame params in simple playback path
Problem: LibraryView calls VideoPlayer without frame params, causing:
- startFrame=0, endFrame=undefined passed to API
- Backend returns error or malformed stream
- Video playback error: MEDIA_ELEMENT_ERROR: Format error

Solution: Only pass frame params when both startFrame and endFrame are defined.
If missing, play full video (no frame params to API).

Fixes regression from commit 1fd6312 (frame-based positioning)
2026-07-24 22:00:35 +08:00
55d0216083 feat: add real-time files watch for LibraryView
Implement comprehensive monitoring system:
- Watch for new registered files (5s interval)
- Detect file status changes (registered → processing → completed)
- Monitor file additions/removals

Functions added:
- startFilesWatch(): Poll get_files API every 5s
- stopFilesWatch(): Clean up interval

LibraryView integration:
- Enable on mount
- Disable on unmount

Enables cross-machine monitoring: one operates, another watches changes
2026-07-24 21:49:06 +08:00
1fd6312f7e fix: enforce frame-based positioning across all video playback
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
2026-07-24 21:17:11 +08:00
2af8ffaf93 feat: add face_cluster processor support to LibraryView
Core Changes (P0):
- Add 'face_cluster' to processors array (2 locations)
- Add data.clusters branch to getJsonCount()
- Add FACE_CLUSTER to QC Pipeline Stage 2 filter

Additional Changes (P1):
- Add Face Cluster UI to context menu
- Add procFaceCluster ref and selectedProcessors()

Backend: Always-Produce rule ensures face_cluster.json always exists
Ref: /Users/accusys/momentry_core/docs_v1.0/GUIDES/QC_FaceCluster_Support.md
2026-07-24 20:52:27 +08:00
5951aca086 feat: frame-based positioning and mark system foundation
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
2026-07-24 20:19:47 +08:00
299f58e883 docs: update cluster-agent implementation status 2026-07-20 21:49:25 +08:00
13924965f7 fix: extract results array from search_smart API response 2026-07-02 21:52:46 +08:00
22e24b13b7 feat: show text_content in search results for keyword search 2026-07-02 21:24:24 +08:00
bf7fbce458 fix: remove Identity processor option and deprecated trace_chunks
- Removed Identity checkbox from processor selection in context menu
- Removed trace_chunks from PostgreSQL section (deprecated)
- Added relationship_chunks to PostgreSQL section
2026-07-02 16:22:48 +08:00
98a3d79701 feat: add ASR status display in search results, fix unassigned traces param name 2026-06-27 11:41:03 +08:00
691b38fe96 fix: m4mini deployment issues - duplicate script setup, auth redirect, Tauri bypass 2026-06-26 20:33:35 +08:00
f915aaf794 feat: pending identity sorting, face detail modal, video player fps, processor counts 2026-06-24 02:02:33 +08:00
7855983dc1 feat: bind/unbind by id, video streaming proxy, unmute default, library refresh, hamburger click-outside
- 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
2026-06-18 22:24:03 +08:00
97af4da331 fix: use identityUuid (camelCase) for person data 2026-06-15 12:25:48 +08:00
c9964ce4fb fix: use snake_case invoke commands 2026-06-15 11:56:55 +08:00
edab5158f0 fix: check __TAURI_INTERNALS__ for Tauri availability 2026-06-15 10:34:39 +08:00
f597db23cc fix: check for Tauri availability before invoke 2026-06-15 09:20:23 +08:00
68d459dc83 debug: detailed console logging for getPeople 2026-06-15 09:11:37 +08:00
88f07895d2 debug: add alert to onMounted 2026-06-15 09:08:52 +08:00