-
Notifications
You must be signed in to change notification settings - Fork 3.6k
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
Add limtless-ai extension #17939
base: main
Are you sure you want to change the base?
Add limtless-ai extension #17939
Conversation
- Fix linting issues and prepare for publishing - feat: Add transcript viewing functionality and API key management - Initial commit
Congratulations on your new Raycast extension! 🚀 Due to our current reduced availability, the initial review may take up to 10-15 business days Once the PR is approved and merged, the extension will be available on our Store. |
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
This PR adds a new Limitless AI extension for managing and analyzing Limitless Pendant's lifelog transcripts, with features for viewing transcripts, AI analysis, and API key management.
- Extension name has a typo ('limtless-ai' instead of 'limitless-ai') across all files - this needs to be corrected as it's the unique identifier
- README.md is too minimal for a new extension with 'view' commands - needs screenshots in metadata folder and more comprehensive documentation
- Remove debug console.log in
src/view-transcripts.tsx
and consider fixing the duplicate cmd+. shortcut for copy actions - Remove unnecessary Swift-related patterns (.raycast-swift-build, .swiftpm, compiled_raycast_swift) from .gitignore since this is a TypeScript extension
- Error handling in loadMore could be simplified using showFailureToast from @raycast/utils
💡 (2/5) Greptile learns from your feedback when you react with 👍/👎!
11 file(s) reviewed, 22 comment(s)
Edit PR Review Bot Settings | Greptile
.raycast-swift-build | ||
.swiftpm | ||
compiled_raycast_swift |
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: Remove Swift-related ignore patterns as this is a TypeScript extension that doesn't use Swift
.raycast-swift-build | |
.swiftpm | |
compiled_raycast_swift |
{ | ||
"printWidth": 120, | ||
"singleQuote": false | ||
} |
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: Raycast's code style already includes these settings by default. No need to specify them in a custom .prettierrc
@@ -0,0 +1,64 @@ | |||
{ | |||
"$schema": "https://www.raycast.com/schemas/extension.json", | |||
"name": "limtless-ai", |
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: Extension name has a typo: 'limtless-ai' should be 'limitless-ai'
"name": "limtless-ai", | |
"name": "limitless-ai", |
}, | ||
{ | ||
"name": "manage-api-key", | ||
"title": "Manage Api Key", |
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: 'Manage Api Key' should be 'Manage API Key' for consistency with other API mentions
"title": "Manage Api Key", | |
"title": "Manage API Key", |
"name": "ai-assistant", | ||
"title": "AI Assistant", | ||
"description": "Ask questions about your Limitless AI Pendant's lifelogs using AI.", | ||
"mode": "view" |
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: Since this command uses AI, should include 'ai' with 'evals' in package.json
// Find a content with startTime for debugging | ||
const firstLifelog = response.data.lifelogs[0]; | ||
const blockquote = firstLifelog?.contents?.find((c) => c.type === "blockquote" && c.startTime); | ||
console.log("First blockquote with startTime:", blockquote); |
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: Remove debug console.log statement before production
console.log("First blockquote with startTime:", blockquote); |
showToast({ | ||
style: Toast.Style.Failure, | ||
title: "Failed to load more transcripts", | ||
message: err instanceof Error ? err.message : "Unknown error occurred", | ||
}); | ||
} |
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: Can be simplified with showFailureToast from @raycast/utils
showToast({ | |
style: Toast.Style.Failure, | |
title: "Failed to load more transcripts", | |
message: err instanceof Error ? err.message : "Unknown error occurred", | |
}); | |
} | |
showFailureToast(err instanceof Error ? err.message : "Failed to load more transcripts"); | |
} |
|
||
setTranscripts((prev) => [...prev, ...response.data.lifelogs]); | ||
setNextCursor(response.meta.lifelogs.nextCursor); | ||
setHasMore(response.meta.lifelogs.count > transcripts.length + response.data.lifelogs.length); |
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: hasMore calculation uses stale transcripts.length - should use prev.length + response.data.lifelogs.length
setHasMore(response.meta.lifelogs.count > transcripts.length + response.data.lifelogs.length); | |
setHasMore(response.meta.lifelogs.count > prev.length + response.data.lifelogs.length); |
shortcut={{ modifiers: ["cmd"], key: "." }} | ||
/> |
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: Same shortcut (cmd+.) used for two different copy actions - consider using different shortcuts
subtitle={error} | ||
actions={ | ||
<ActionPanel> | ||
<Action.OpenInBrowser title="Manage API Key" url="raycast://extensions/limtless-ai/manage-api-key" /> |
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: Use Action.OpenPreferences instead of Action.OpenInBrowser for preferences
<Action.OpenInBrowser title="Manage API Key" url="raycast://extensions/limtless-ai/manage-api-key" /> | |
<Action.OpenPreferences title="Manage Api Key" /> |
Description
Screencast
Checklist
npm run build
and tested this distribution build in Raycastassets
folder are used by the extension itselfREADME
are placed outside of themetadata
folder