-
Notifications
You must be signed in to change notification settings - Fork 25
Feat/asr progress #308
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: dev
Are you sure you want to change the base?
Feat/asr progress #308
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -162,6 +162,7 @@ const Queue: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||
| const [expandedJobs, setExpandedJobs] = useState<Set<string>>(new Set()); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| const [conversationJobs, setConversationJobs] = useState<{[conversationId: string]: any[]}>({}); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| const [lastUpdate, setLastUpdate] = useState<number>(Date.now()); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| const [selectedEvent, setSelectedEvent] = useState<EventRecord | null>(null); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| const [autoRefreshEnabled, setAutoRefreshEnabled] = useState<boolean>(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| // Load from localStorage, default to true | ||||||||||||||||||||||||||||||||||||||||||||||||||
| const saved = localStorage.getItem('queue_auto_refresh'); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -371,7 +372,9 @@ const Queue: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||
| useEffect(() => { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| const handleEscape = (e: KeyboardEvent) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| if (e.key === 'Escape') { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| if (selectedJob) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| if (selectedEvent) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| setSelectedEvent(null); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| } else if (selectedJob) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| setSelectedJob(null); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| } else if (showFlushModal) { | ||||||||||||||||||||||||||||||||||||||||||||||||||
| setShowFlushModal(false); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -381,7 +384,7 @@ const Queue: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| document.addEventListener('keydown', handleEscape); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| return () => document.removeEventListener('keydown', handleEscape); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| }, [selectedJob, showFlushModal]); | ||||||||||||||||||||||||||||||||||||||||||||||||||
| }, [selectedJob, showFlushModal, selectedEvent]); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| // Commented out - keeping for future use | ||||||||||||||||||||||||||||||||||||||||||||||||||
| // const retryJob = async (jobId: string) => { | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -1398,6 +1401,19 @@ const Queue: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||
| </> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* transcribe_full_audio_job batch progress */} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {job.job_type === 'transcribe_full_audio_job' && job.status === 'started' && job.meta?.batch_progress && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="mt-1"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="flex items-center justify-between text-xs mb-1"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-blue-700">{job.meta.batch_progress.message}</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-blue-600 font-medium">{job.meta.batch_progress.percent}%</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="w-full bg-blue-200 rounded-full h-1.5"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="bg-blue-600 h-1.5 rounded-full transition-all duration-300" style={{ width: `${job.meta.batch_progress.percent}%` }} /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1404
to
+1415
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Clamp
🛡️ Proposed fix-<div className="bg-blue-600 h-1.5 rounded-full transition-all duration-300" style={{ width: `${job.meta.batch_progress.percent}%` }} />
+<div className="bg-blue-600 h-1.5 rounded-full transition-all duration-300" style={{ width: `${Math.min(100, Math.max(0, job.meta.batch_progress.percent))}%` }} />📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* transcribe_full_audio_job metadata */} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {job.job_type === 'transcribe_full_audio_job' && job.result && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -1829,10 +1845,12 @@ const Queue: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||
| left: `${startPercent}%`, | ||||||||||||||||||||||||||||||||||||||||||||||||||
| width: `${widthPercent}%` | ||||||||||||||||||||||||||||||||||||||||||||||||||
| }} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| title={`Started: ${new Date(startTime).toLocaleTimeString()}\nDuration: ${formatDuration(duration)}`} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| title={`Started: ${new Date(startTime).toLocaleTimeString()}\nDuration: ${formatDuration(duration)}${job.meta?.batch_progress ? `\n${job.meta.batch_progress.message}` : ''}`} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-xs text-white font-medium px-2 truncate"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {formatDuration(duration)} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {job.status === 'started' && job.meta?.batch_progress | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ? `${job.meta.batch_progress.current}/${job.meta.batch_progress.total}` | ||||||||||||||||||||||||||||||||||||||||||||||||||
| : formatDuration(duration)} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1848
to
+1853
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Batch-progress bar content is dead code here — it belongs in the active-conversations timeline. The completed-conversations section filters conversations where all jobs have The active-conversations timeline (lines 1310–1320) is the correct placement because 🐛 Proposed fix — move changes to the active-conversations timelineIn the active-conversations timeline bar (around line 1316), apply the same two changes: - title={`Started: ${new Date(startTime).toLocaleTimeString()}\nDuration: ${formatDuration(duration)}`}
+ title={`Started: ${new Date(startTime).toLocaleTimeString()}\nDuration: ${formatDuration(duration)}${job.meta?.batch_progress ? `\n${job.meta.batch_progress.message}` : ''}`}- {formatDuration(duration)}
+ {job.status === 'started' && job.meta?.batch_progress
+ ? `${job.meta.batch_progress.current ?? '?'}/${job.meta.batch_progress.total ?? '?'}`
+ : formatDuration(duration)}And revert the completed-conversations timeline bar (lines 1848–1853) to the original (no batch_progress logic), unless the tooltip hint for historical context is intentional. Additionally, 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||
| </span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -2160,21 +2178,32 @@ const Queue: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </td> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <td className="px-4 py-2"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {evt.plugins_executed.length === 0 ? ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-xs text-gray-400">no plugins ran</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ) : allSuccess ? ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="flex items-center space-x-1 text-xs text-green-600"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <CheckCircle className="w-3.5 h-3.5" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span>OK</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ) : anyFailure ? ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="flex items-center space-x-1 text-xs text-red-600" title={evt.plugins_executed.filter(p => !p.success).map(p => `${p.plugin_id}: ${p.message}`).join('; ')}> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <XCircle className="w-3.5 h-3.5" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span>Error</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ) : ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-xs text-gray-500">partial</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="flex items-center space-x-2"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {evt.plugins_executed.length === 0 ? ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-xs text-gray-400">no plugins ran</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ) : allSuccess ? ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="flex items-center space-x-1 text-xs text-green-600"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <CheckCircle className="w-3.5 h-3.5" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span>OK</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ) : anyFailure ? ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="flex items-center space-x-1 text-xs text-red-600"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <XCircle className="w-3.5 h-3.5" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span>Error</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ) : ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-xs text-gray-500">partial</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {evt.plugins_executed.length > 0 && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <button | ||||||||||||||||||||||||||||||||||||||||||||||||||
| onClick={() => setSelectedEvent(evt)} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| className="text-gray-400 hover:text-gray-600 p-0.5 rounded hover:bg-gray-100" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| title="View details" | ||||||||||||||||||||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <Eye className="w-3.5 h-3.5" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </button> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+2197
to
+2205
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Eye button is inaccessible for events that carry metadata but no plugin results. The button is guarded by ✨ Proposed fix — show Eye button whenever there is anything to inspect-{evt.plugins_executed.length > 0 && (
+{(evt.plugins_executed.length > 0 || Object.keys(evt.metadata).length > 0) && (
<button
onClick={() => setSelectedEvent(evt)}
className="text-gray-400 hover:text-gray-600 p-0.5 rounded hover:bg-gray-100"
title="View details"
>
<Eye className="w-3.5 h-3.5" />
</button>
)}📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </td> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </tr> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ); | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -2631,6 +2660,84 @@ const Queue: React.FC = () => { | |||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* Event Detail Modal */} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {selectedEvent && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="relative top-20 mx-auto p-5 border w-11/12 md:w-2/3 lg:w-1/2 shadow-lg rounded-md bg-white"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="flex justify-between items-center mb-4"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <h3 className="text-lg font-medium text-gray-900">Event Details</h3> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <button onClick={() => setSelectedEvent(null)} className="text-gray-400 hover:text-gray-600"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <X className="w-5 h-5" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </button> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="space-y-4"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="grid grid-cols-2 gap-4"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <label className="block text-sm font-medium text-gray-700">Time</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <p className="text-sm text-gray-900">{new Date(selectedEvent.timestamp * 1000).toLocaleString()}</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <label className="block text-sm font-medium text-gray-700">Event</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className={`text-xs px-2 py-0.5 rounded-full font-medium ${getEventColor(selectedEvent.event)}`}> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {selectedEvent.event} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <label className="block text-sm font-medium text-gray-700">User</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <p className="text-sm text-gray-900 font-mono">{selectedEvent.user_id}</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+2686
to
+2689
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
The events table truncates Apply the same truncation (or at minimum the same display logic) as the table: -<p className="text-sm text-gray-900 font-mono">{selectedEvent.user_id}</p>
+<p className="text-sm text-gray-900 font-mono" title={selectedEvent.user_id}>
+ {selectedEvent.user_id.length > 12 ? `...${selectedEvent.user_id.slice(-8)}` : selectedEvent.user_id}
+</p>📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||
| {selectedEvent.metadata?.client_id && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <label className="block text-sm font-medium text-gray-700">Client</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <p className="text-sm text-gray-900 font-mono">{selectedEvent.metadata.client_id}</p> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| <div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <label className="block text-sm font-medium text-gray-700 mb-2">Plugin Results</label> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="space-y-2"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {selectedEvent.plugins_executed.map((p, i) => ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div | ||||||||||||||||||||||||||||||||||||||||||||||||||
| key={i} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| className={`p-3 rounded-lg border ${p.success ? 'bg-green-50 border-green-200' : 'bg-red-50 border-red-200'}`} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="flex items-center space-x-2 mb-1"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {p.success | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ? <CheckCircle className="w-4 h-4 text-green-600" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| : <XCircle className="w-4 h-4 text-red-600" /> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className="text-sm font-medium">{p.plugin_id}</span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <span className={`text-xs px-1.5 py-0.5 rounded ${p.success ? 'bg-green-100 text-green-700' : 'bg-red-100 text-red-700'}`}> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {p.success ? 'OK' : 'Error'} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </span> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {p.message && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <p className={`text-sm ml-6 ${p.success ? 'text-green-800' : 'text-red-800'}`}> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {p.message} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </p> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| ))} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| {Object.keys(selectedEvent.metadata).length > 0 && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <details> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <summary className="text-sm font-medium text-gray-700 cursor-pointer hover:text-gray-900"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Raw Metadata | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </summary> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <pre className="text-xs text-gray-900 bg-gray-50 p-2 rounded overflow-auto max-h-40 mt-2 whitespace-pre-wrap break-words"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {JSON.stringify(selectedEvent.metadata, null, 2)} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </pre> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </details> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| </div> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| )} | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* Flush Jobs Modal */} | ||||||||||||||||||||||||||||||||||||||||||||||||||
| {showFlushModal && ( | ||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50"> | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
fd --type f "menu-bar-client.png"Repository: SimpleOpenSoftware/chronicle
Length of output: 54
The asset
.assets/menu-bar-client.pngdoes not exist in the repository. The image reference on line 27 is broken and will render as a broken image in the README. Either add the image file to the.assets/directory or remove/update the reference.🤖 Prompt for AI Agents