Skip to content
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

Conversation

onyedikachi-david
Copy link
Contributor

/claim #366
Fixes: #366

Copy link

vercel bot commented Mar 16, 2025

@onyedikachi-david is attempting to deploy a commit to the Prologe Team on Vercel.

A member of the Team first needs to authorize it.

Copy link
Contributor

@greptile-apps greptile-apps bot left a 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 using streamVision 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

Comment on lines +29 to +31
} catch (error) {
console.error('Failed to open Obsidian:', error);
}
Copy link
Contributor

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

Comment on lines +11 to +15
useEffect(() => {
if (isInMeeting) {
setShowNotification(true);
}
}, [isInMeeting]);
Copy link
Contributor

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

Suggested change
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');
Copy link
Contributor

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

Comment on lines +21 to +25
<button
onClick={onDismiss}
className="text-gray-400 hover:text-gray-500"
aria-label="Close"
>
Copy link
Contributor

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

Suggested change
<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]);
Copy link
Contributor

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

Suggested change
}, [meetingState.isInMeeting]);
}, []); // Remove dependency on meetingState to prevent re-subscriptions

Comment on lines +31 to +33
const isMeetingApp = MEETING_APPS.some(app =>
url?.includes(app) || appName?.toLowerCase().includes(app.split('.')[0])
);
Copy link
Contributor

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')

Comment on lines +35 to +42
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) {
Copy link
Contributor

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

@benjaminshafii
Copy link
Member

Please show screen-recording of working workflow.

@benjaminshafii
Copy link
Member

closing because no follow up

@onyedikachi-david
Copy link
Contributor Author

onyedikachi-david commented Mar 22, 2025

Could you please reopen. I'm actually on it. Demoing in a bit. Apologies for the delay. @benjaminshafii

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Create Screenpipe Pipe for Meeting Detection
2 participants