-
-
Notifications
You must be signed in to change notification settings - Fork 83
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
feat: implement meeting detection and Obsidian note creation #370
feat: implement meeting detection and Obsidian note creation #370
Conversation
@onyedikachi-david is attempting to deploy a commit to the Prologe Team on Vercel. A member of the Team first needs to authorize it. |
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.
PR Summary
Implemented comprehensive meeting detection and Obsidian note integration system with real-time screen/audio activity analysis and AI-powered relationship intelligence.
- Added
use-meeting-detection.ts
hook to monitor Zoom/Meet/Teams activity usingstreamVision
API with configurable app detection - Implemented
/api/intelligence/route.ts
for relationship analysis using Ollama LLM, generating contact insights and Mermaid graphs - Created
/api/log/route.ts
for automated work log generation with customizable prompts and Obsidian table format sync - Added
MeetingNotification
component with proper accessibility and responsive design for meeting alerts - Improved error handling and deep linking in
ObsidianSettings
component with vault path validation and intelligence analysis UI
💡 (3/5) Reply to the bot's comments like "Can you suggest a fix for this @greptileai?" or ask follow-up questions!
54 file(s) reviewed, 7 comment(s)
Edit PR Review Bot Settings | Greptile
} catch (error) { | ||
console.error('Failed to open Obsidian:', error); | ||
} |
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.
style: Error handling only logs to console. Should show error to user via toast/notification
useEffect(() => { | ||
if (isInMeeting) { | ||
setShowNotification(true); | ||
} | ||
}, [isInMeeting]); |
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.
logic: No logic to handle when meeting ends - notification could stay visible if state updates fail
useEffect(() => { | |
if (isInMeeting) { | |
setShowNotification(true); | |
} | |
}, [isInMeeting]); | |
useEffect(() => { | |
setShowNotification(isInMeeting); | |
}, [isInMeeting]); |
const obsidianUrl = `obsidian://new?vault=YourVault&name=${encodedTitle}`; | ||
|
||
// Open the URL | ||
window.open(obsidianUrl, '_blank'); |
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.
style: Check if window.open() returned null (blocked by popup blocker) and handle that case
<button | ||
onClick={onDismiss} | ||
className="text-gray-400 hover:text-gray-500" | ||
aria-label="Close" | ||
> |
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.
syntax: Close button should have type='button' to prevent form submission in parent forms
<button | |
onClick={onDismiss} | |
className="text-gray-400 hover:text-gray-500" | |
aria-label="Close" | |
> | |
<button | |
onClick={onDismiss} | |
className="text-gray-400 hover:text-gray-500" | |
aria-label="Close" | |
type="button" | |
> |
return () => { | ||
abortController.abort(); | ||
}; | ||
}, [meetingState.isInMeeting]); |
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.
logic: dependency on meetingState.isInMeeting will cause effect to re-run and create new streamVision subscription on every state change
}, [meetingState.isInMeeting]); | |
}, []); // Remove dependency on meetingState to prevent re-subscriptions |
const isMeetingApp = MEETING_APPS.some(app => | ||
url?.includes(app) || appName?.toLowerCase().includes(app.split('.')[0]) | ||
); |
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.
style: meeting detection logic may trigger false positives if app/URL contains meeting app name as substring (e.g. 'zoom' in 'zoomable')
if (isMeetingApp && !meetingState.isInMeeting) { | ||
// User just entered a meeting | ||
setMeetingState({ | ||
isInMeeting: true, | ||
appName: appName || url || 'Unknown Meeting App', | ||
startTime: new Date(), | ||
}); | ||
} else if (!isMeetingApp && meetingState.isInMeeting) { |
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.
style: consider debouncing state updates to prevent rapid changes when switching between windows
Please show screen-recording of working workflow. |
closing because no follow up |
Could you please reopen. I'm actually on it. Demoing in a bit. Apologies for the delay. @benjaminshafii |
/claim #366
Fixes: #366