Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
<script lang="ts">
|
2026-02-26 15:53:09 -08:00
|
|
|
import { invoke } from '@tauri-apps/api/core';
|
2026-02-26 16:02:27 -08:00
|
|
|
import { open } from '@tauri-apps/plugin-dialog';
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
import WaveformPlayer from '$lib/components/WaveformPlayer.svelte';
|
|
|
|
|
import TranscriptEditor from '$lib/components/TranscriptEditor.svelte';
|
|
|
|
|
import SpeakerManager from '$lib/components/SpeakerManager.svelte';
|
|
|
|
|
import AIChatPanel from '$lib/components/AIChatPanel.svelte';
|
2026-02-26 15:53:09 -08:00
|
|
|
import ProgressOverlay from '$lib/components/ProgressOverlay.svelte';
|
|
|
|
|
import { segments, speakers } from '$lib/stores/transcript';
|
2026-02-26 16:09:48 -08:00
|
|
|
import type { Segment, Speaker } from '$lib/types/transcript';
|
2026-02-26 15:53:09 -08:00
|
|
|
|
|
|
|
|
let waveformPlayer: WaveformPlayer;
|
|
|
|
|
let audioUrl = $state('');
|
|
|
|
|
let isTranscribing = $state(false);
|
|
|
|
|
let transcriptionProgress = $state(0);
|
|
|
|
|
let transcriptionStage = $state('');
|
|
|
|
|
let transcriptionMessage = $state('');
|
|
|
|
|
|
2026-02-26 16:09:48 -08:00
|
|
|
// Speaker color palette for auto-assignment
|
|
|
|
|
const speakerColors = ['#e94560', '#4ecdc4', '#ffe66d', '#a8e6cf', '#ff8b94', '#c7ceea', '#ffd93d', '#6bcb77'];
|
|
|
|
|
|
2026-02-26 15:53:09 -08:00
|
|
|
function handleWordClick(timeMs: number) {
|
|
|
|
|
waveformPlayer?.seekTo(timeMs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function handleFileImport() {
|
2026-02-26 16:02:27 -08:00
|
|
|
const filePath = await open({
|
|
|
|
|
multiple: false,
|
|
|
|
|
filters: [{
|
|
|
|
|
name: 'Audio/Video',
|
|
|
|
|
extensions: ['mp3', 'wav', 'flac', 'ogg', 'm4a', 'aac', 'wma',
|
|
|
|
|
'mp4', 'mkv', 'avi', 'mov', 'webm'],
|
|
|
|
|
}],
|
|
|
|
|
});
|
2026-02-26 15:53:09 -08:00
|
|
|
if (!filePath) return;
|
|
|
|
|
|
|
|
|
|
// Convert file path to URL for wavesurfer
|
|
|
|
|
audioUrl = `asset://localhost/${encodeURIComponent(filePath)}`;
|
|
|
|
|
waveformPlayer?.loadAudio(audioUrl);
|
|
|
|
|
|
2026-02-26 16:09:48 -08:00
|
|
|
// Start pipeline (transcription + diarization)
|
2026-02-26 15:53:09 -08:00
|
|
|
isTranscribing = true;
|
|
|
|
|
transcriptionProgress = 0;
|
|
|
|
|
transcriptionStage = 'Starting...';
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const result = await invoke<{
|
|
|
|
|
segments: Array<{
|
|
|
|
|
text: string;
|
|
|
|
|
start_ms: number;
|
|
|
|
|
end_ms: number;
|
2026-02-26 16:09:48 -08:00
|
|
|
speaker: string | null;
|
2026-02-26 15:53:09 -08:00
|
|
|
words: Array<{
|
|
|
|
|
word: string;
|
|
|
|
|
start_ms: number;
|
|
|
|
|
end_ms: number;
|
|
|
|
|
confidence: number;
|
|
|
|
|
}>;
|
|
|
|
|
}>;
|
|
|
|
|
language: string;
|
|
|
|
|
duration_ms: number;
|
2026-02-26 16:09:48 -08:00
|
|
|
speakers: string[];
|
|
|
|
|
num_speakers: number;
|
|
|
|
|
}>('run_pipeline', { filePath });
|
|
|
|
|
|
|
|
|
|
// Create speaker entries from pipeline result
|
|
|
|
|
const newSpeakers: Speaker[] = (result.speakers || []).map((label, idx) => ({
|
|
|
|
|
id: `speaker-${idx}`,
|
|
|
|
|
project_id: '',
|
|
|
|
|
label,
|
|
|
|
|
display_name: null,
|
|
|
|
|
color: speakerColors[idx % speakerColors.length],
|
|
|
|
|
}));
|
|
|
|
|
speakers.set(newSpeakers);
|
|
|
|
|
|
|
|
|
|
// Build speaker label → id lookup
|
|
|
|
|
const speakerLookup = new Map(newSpeakers.map(s => [s.label, s.id]));
|
2026-02-26 15:53:09 -08:00
|
|
|
|
|
|
|
|
// Convert result to our store format
|
|
|
|
|
const newSegments: Segment[] = result.segments.map((seg, idx) => ({
|
|
|
|
|
id: `seg-${idx}`,
|
|
|
|
|
project_id: '',
|
|
|
|
|
media_file_id: '',
|
2026-02-26 16:09:48 -08:00
|
|
|
speaker_id: seg.speaker ? (speakerLookup.get(seg.speaker) ?? null) : null,
|
2026-02-26 15:53:09 -08:00
|
|
|
start_ms: seg.start_ms,
|
|
|
|
|
end_ms: seg.end_ms,
|
|
|
|
|
text: seg.text,
|
|
|
|
|
original_text: null,
|
|
|
|
|
confidence: null,
|
|
|
|
|
is_edited: false,
|
|
|
|
|
edited_at: null,
|
|
|
|
|
segment_index: idx,
|
|
|
|
|
words: seg.words.map((w, widx) => ({
|
|
|
|
|
id: `word-${idx}-${widx}`,
|
|
|
|
|
segment_id: `seg-${idx}`,
|
|
|
|
|
word: w.word,
|
|
|
|
|
start_ms: w.start_ms,
|
|
|
|
|
end_ms: w.end_ms,
|
|
|
|
|
confidence: w.confidence,
|
|
|
|
|
word_index: widx,
|
|
|
|
|
})),
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
segments.set(newSegments);
|
|
|
|
|
} catch (err) {
|
2026-02-26 16:09:48 -08:00
|
|
|
console.error('Pipeline failed:', err);
|
|
|
|
|
alert(`Pipeline failed: ${err}`);
|
2026-02-26 15:53:09 -08:00
|
|
|
} finally {
|
|
|
|
|
isTranscribing = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
</script>
|
|
|
|
|
|
2026-02-26 15:53:09 -08:00
|
|
|
<div class="app-header">
|
|
|
|
|
<h1>Voice to Notes</h1>
|
|
|
|
|
<div class="header-actions">
|
|
|
|
|
<button class="import-btn" onclick={handleFileImport}>
|
|
|
|
|
Import Audio/Video
|
|
|
|
|
</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
<div class="workspace">
|
|
|
|
|
<div class="main-content">
|
2026-02-26 15:53:09 -08:00
|
|
|
<WaveformPlayer bind:this={waveformPlayer} {audioUrl} />
|
|
|
|
|
<TranscriptEditor onWordClick={handleWordClick} />
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
</div>
|
|
|
|
|
<div class="sidebar-right">
|
|
|
|
|
<SpeakerManager />
|
|
|
|
|
<AIChatPanel />
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-02-26 15:53:09 -08:00
|
|
|
<ProgressOverlay
|
|
|
|
|
visible={isTranscribing}
|
|
|
|
|
percent={transcriptionProgress}
|
|
|
|
|
stage={transcriptionStage}
|
|
|
|
|
message={transcriptionMessage}
|
|
|
|
|
/>
|
|
|
|
|
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
<style>
|
2026-02-26 15:53:09 -08:00
|
|
|
.app-header {
|
|
|
|
|
display: flex;
|
|
|
|
|
align-items: center;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
padding: 0.5rem 1rem;
|
|
|
|
|
background: #0f3460;
|
|
|
|
|
color: #e0e0e0;
|
|
|
|
|
}
|
|
|
|
|
h1 {
|
|
|
|
|
font-size: 1.25rem;
|
|
|
|
|
margin: 0;
|
|
|
|
|
}
|
|
|
|
|
.import-btn {
|
|
|
|
|
background: #e94560;
|
|
|
|
|
border: none;
|
|
|
|
|
color: white;
|
|
|
|
|
padding: 0.5rem 1rem;
|
|
|
|
|
border-radius: 6px;
|
|
|
|
|
cursor: pointer;
|
|
|
|
|
font-size: 0.875rem;
|
|
|
|
|
font-weight: 500;
|
|
|
|
|
}
|
|
|
|
|
.import-btn:hover {
|
|
|
|
|
background: #d63851;
|
|
|
|
|
}
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
.workspace {
|
|
|
|
|
display: flex;
|
|
|
|
|
gap: 1rem;
|
|
|
|
|
padding: 1rem;
|
2026-02-26 15:53:09 -08:00
|
|
|
height: calc(100vh - 3.5rem);
|
|
|
|
|
background: #0a0a23;
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
}
|
|
|
|
|
.main-content {
|
|
|
|
|
flex: 1;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
gap: 1rem;
|
2026-02-26 15:53:09 -08:00
|
|
|
min-width: 0;
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
}
|
|
|
|
|
.sidebar-right {
|
|
|
|
|
width: 300px;
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
gap: 1rem;
|
2026-02-26 15:53:09 -08:00
|
|
|
flex-shrink: 0;
|
Phase 1 foundation: Tauri shell, Python sidecar, SQLite database
Tauri v2 + Svelte + TypeScript frontend:
- App shell with workspace layout (waveform, transcript, speakers, AI chat)
- Placeholder components for all major UI areas
- Typed stores (project, transcript, playback, AI)
- TypeScript interfaces matching the database schema
- Tauri bridge service with typed invoke wrappers
- svelte-check passes with 0 errors
Rust backend:
- Tauri v2 app entry point with command registration
- SQLite database layer (rusqlite with bundled SQLite)
- Full schema: projects, media_files, speakers, segments, words,
ai_outputs, annotations (with indexes)
- Model structs with serde serialization
- CRUD queries for projects, speakers, segments, words
- Segment text editing preserves original text
- Schema versioning for future migrations
- 6 tests passing
- Command stubs for project, transcribe, export, AI, settings, system
- App state management
Python sidecar:
- JSON-line IPC protocol (stdin/stdout)
- Message types: IPCMessage, progress, error, ready
- Handler registry with routing and error handling
- Ping/pong handler for connectivity testing
- Service stubs: transcribe, diarize, pipeline, AI, export
- Provider stubs: local (llama-server), OpenAI, Anthropic, LiteLLM
- Hardware detection stubs
- 14 tests passing, ruff clean
Also adds:
- Testing strategy document (docs/TESTING.md)
- Validation script (scripts/validate.sh)
- Updated .gitignore for Svelte, Rust, Python artifacts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 15:16:06 -08:00
|
|
|
}
|
|
|
|
|
</style>
|