Commit graph

412 commits

Author SHA1 Message Date
ByteAtATime
9913fb539f
feat(soulver): implement RaycastCurrencyProvider for real-time currency rates
This commit introduces the RaycastCurrencyProvider class, which fetches and updates currency rates from external APIs. It also uses EngineCustomization.standard, simply initializing the ResourceBundle instead of passing it in. This fixed a previous configuration error where something in the custom configuration wasn't set, causing it to not convert cryptocurrencies somehow.
2025-06-28 22:11:56 -07:00
ByteAtATime
5a5e609992
feat(calculator): replace mathjs with SoulverCore
This commit replaces the `mathjs` library with the native SoulverCore engine for all calculations within the command palette. It updates the Swift wrapper to expose SoulverCore's functionality and modified the frontend to use the `calculate_soulver` command for evaluating expressions.
2025-06-28 20:22:44 -07:00
ByteAtATime
5f1ad1c84a
feat(calculator): initialize basic SoulverCore library
This commit adds a native calculation engine by integrating the pre-compiled SoulverCore Swift library. A Swift package (`SoulverWrapper`) was created to act as a C-compatible FFI bridge, allowing the Rust backend to call into the library (because the library does not include de-mangled names). The build process was updated to compile this Swift wrapper and correctly bundle the necessary shared libraries and resources for both development and production environments. A new Tauri command, `calculate_soulver`, exposes this functionality to the Svelte frontend.

In the future, we will be using this functionality to improve the built-in calculator.
2025-06-28 20:08:43 -07:00
ByteAtATime
c75383b714
fix(command-palette): fix reactivity in command palette filtering 2025-06-28 16:05:00 -07:00
ByteAtATime
d3e615de7e
refactor(command-palette): extract logic into state and action bar
This commit refactors the main `CommandPalette.svelte` component by extracting its complex logic into hooks. Additionally, the footer UI has been moved into a new `ActionBar.svelte` component.
2025-06-28 14:58:53 -07:00
ByteAtATime
398ed86c40
feat(command-palette): add action bar to command palette
This commit introduces functionality to manage hidden items in the frecency store, including fetching hidden item IDs, hiding items, and deleting frecency entries. Additionally, the apps store is updated to filter out hidden applications based on the new frecency store logic.
2025-06-28 14:44:05 -07:00
ByteAtATime
7c14ea6c15
refactor(actions): consolidate action components and update handling logic
This commit removes the individual action components in favor for a single Action component. The action handling logic is updated to manage different action types within the same component.
2025-06-28 13:38:01 -07:00
ByteAtATime
640ef53118
feat(ai): implement environment.canAccess(AI)
This commit replaces the stub in `environment.canAccess(AI)`. The access status is now determined by the backend when a command is launched and is passed to the sidecar process. This allows the `canAccess` function within the plugin's environment to synchronously return the correct access status. In the future, we should probably avoid hardcoding it in the parameter somehow.
2025-06-27 18:52:58 -07:00
ByteAtATime
5c4218ab4a
fix(ai): expose model enum 2025-06-27 18:33:44 -07:00
ByteAtATime
5dafd76912
fix(ai): refactor AI model settings and fallback logic
This commit moves default model mappings into the backend, making it the single source of truth. The `get_ai_settings` command now merges user-defined settings with these defaults, so the UI always receives a complete and correct configuration. The model selection logic in `ai_ask_stream` was also simplified to use the merged settings, which fixes a bug where the system would use a global fallback instead of the correct model-specific default. Additionally, the `set_ai_settings` command now only persists user overrides, keeping the configuration file clean.
2025-06-27 18:27:53 -07:00
ByteAtATime
9b7b29d720
feat(settings): add tab in settings for AI
This commit introduces a new AI settings view component, allowing users to manage AI features, API keys, and model associations.
2025-06-27 17:41:24 -07:00
ByteAtATime
87751b30ca
feat(ai): implement AI API
This commit introduces a new AI module that includes schemas for AI requests and responses, as well as event handling for streaming AI responses. It adds functions to manage AI API keys, log usage, and handle streaming data from the AI service.
2025-06-27 15:58:05 -07:00
ByteAtATime
99f6319a7e
feat(deeplink): implement command deeplinks
This commit adds support for deeplinks starting with `raycast://extension`, which run a specific command in an extension. It adds the `author` and `owner` fields in the PluginInfo schema, updates the plugin discovery process to include these fields, and implements a new CommandDeeplinkConfirm component for confirming command execution from deep links. Additionally, it modifies the builtin command names, titles, as well as their plugin names and titles to correctly reflect Raycast's implementation. This means that the deeplinks should be interoperable.
2025-06-26 20:33:54 -07:00
ByteAtATime
2437ad7d61
feat(snippets): implement dynamic placeholders and modifiers
This commit implements a system for dynamic snippet placeholders, including support for date/time manipulation, clipboard history, and nested snippets. It also adds a flexible modifier system (`uppercase`, `trim`, `percent-encode`, `json-stringify`) that can be chained and applied to any placeholder.
2025-06-26 15:34:33 -07:00
ByteAtATime
e2316cf949
feat(file-search): implement file and folder search with indexing
This commit adds a basic file search feature, allowing users to find files and folders within their home directory. The backend consists of a Rust module that builds and maintains a SQLite index of the file system. It performs an initial scan and then uses the `notify` crate to watch for real-time changes.
On the frontend, a new Svelte view provides a dedicated UI for searching. It displays results, file details, and an action bar with options to open the file/folder, show it in the native file manager, copy its path, or move it to the trash.
2025-06-26 14:27:30 -07:00
ByteAtATime
a561534075
fix(preferences): pass all command preferences to setCurrentPlugin
Previously, we were passing in only the plugin preferences. This means that when calling `getPreferenceValues`, none of the command preferences would be returned. This commit changes it to return *all* command preferences -- I do not think it will cause any problems, but we'll see I guess ¯\_(ツ)_/¯
2025-06-25 22:01:54 -07:00
ByteAtATime
2d40fee318
refactor(protocol): extract protocol into multiple files 2025-06-25 21:45:00 -07:00
ByteAtATime
e9dbcf3a57
feat(preferences): update checkbox schema and UI handling
This commit updates the preference handling to align with the documentation for preferences. The `PreferenceSchema` now mandates a `label` property for all preferences of type `checkbox`. In the `SettingsView`, the rendering logic has been adjusted to use the `title` as an optional section header, enabling the grouping of related checkboxes. The `label` is now used for the text directly next to the checkbox input.
2025-06-25 21:28:10 -07:00
ByteAtATime
1bdb0f534e
feat(settings): Implement remaining preference types
This commit introduces support for all remaining preference types as specified in the API, including password, checkbox, appPicker, file, and directory. Eventually, we will probably have to somehow make the password preferences encrypted.
2025-06-25 20:14:21 -07:00
ByteAtATime
f2191cbdb4
chore: remove placeholder preference values 2025-06-25 15:31:55 -07:00
ByteAtATime
58e48213bd
feat: Implement hide on escape and focus loss
This commit adds two ways that hides the main window. First, when the user presses escape in the command palette, the window hides; second, when the focus is lost (i.e. the user's cursor goes outside the window), it also hides itself.
2025-06-25 14:31:21 -07:00
ByteAtATime
9d73ac0a23
feat(app): hide window instead of closing
Instead of closing the window, this commit changes the event listener so that it simply hides the window instead. This allows for near-instant re-opening of the window, as well as state preservation.
2025-06-25 14:18:06 -07:00
ByteAtATime
3cb7f984b2
feat(client): implement loading indicator component
This commit introduces a new LoadingIndicator component to enhance the user experience during loading states. The component replaces the previous loading visual in the Extensions and Header components, directly copying the loading indicator from Raycast's website.
2025-06-25 13:59:39 -07:00
ByteAtATime
e32cc6223d
feat(snippets): implement Search Snippets command
This commit implements the "Search Snippets" feature, providing a dedicated user interface accessible from the main command palette. The new view allows users to search their snippets by name, keyword, or content and see details like usage statistics. This change adds the necessary backend logic for searching and tracking usage, and a new frontend component.
2025-06-25 11:32:02 -07:00
ByteAtATime
59174dddca
feat(snippets): reduce delay before typing
Previously, we had a 50ms delay between deleting and pasting, as well as a 10ms delay between each keypress. This was intended to be on the safe side and sure the contents get resolved before pasting. However, the delay was a bit overkill, and this commit changes it to 5ms/2ms.
2025-06-25 11:03:52 -07:00
ByteAtATime
84438402e3
feat(snippets): add deep link for adding snippets
This commit introduces a new state management for snippets to import in the ViewManager, allowing for dynamic snippet imports via URL parameters. The ImportSnippets component is updated to handle incoming snippets and manage the import process, improving user experience during snippet imports.
2025-06-25 11:01:04 -07:00
ByteAtATime
b1c4693998
refactor(snippets): simplify key mapping and state management
This commit replaces the large, brittle `match` statements for key mapping with `lazy_static` `HashMap`s, making the logic declarative and much easier to update.
2025-06-25 10:34:15 -07:00
ByteAtATime
3054b5bfb1
refactor(snippets): extract clipboard handling into a separate function
This commit refactors the `inject_text` method in both `RdevInputManager` and `EvdevInputManager` to utilize a new `with_clipboard_text` function for clipboard operations.
2025-06-25 10:15:07 -07:00
ByteAtATime
a34968f851
feat(snippets): use clipboard to type text
This commit changes the `inject_text` method in both `RdevInputManager` and `EvdevInputManager` to utilize clipboard functionality for text input. This allows for both instantaneous snippet resolving as well as the ability to type symbols not on the keyboard (e.g. ⌘)
2025-06-25 10:07:49 -07:00
ByteAtATime
9667dd62fb
feat(clipboard-history): add internal clipboard change tracking and expose manager module
This commit introduces an `AtomicBool` to track internal clipboard changes. This way, we can safely use the clipboard to "type" text without it getting tracked by the clipboard history.
2025-06-25 10:06:58 -07:00
ByteAtATime
6365d18cdb
style(backend): formatting 2025-06-25 08:38:24 -07:00
ByteAtATime
56813684e1
feat(snippets): add import snippet feature
Currently, our application does not support snippets without keywords. We will have to figure out why it's possible to have a text replacement item without the text to replace.
2025-06-25 08:38:14 -07:00
ByteAtATime
15dbf0692a
feat(command-palette): update input placeholder to show selected quicklink name 2025-06-24 21:27:55 -07:00
ByteAtATime
c4ec5efe40
feat(snippets): add dynamic placeholder highlighting support to SnippetForm
This commit adds functionality to the SnippetForm component to parse and highlight placeholders in the snippet content, including support for cursor positioning and validation of specific placeholders.
2025-06-24 21:19:49 -07:00
ByteAtATime
b68c4ccb6e
feat(snippets): implement snippet placeholder resolution
This commit introduces a new method to parse and resolve placeholders in snippet content, allowing for dynamic content insertion such as clipboard text, current date, and time. Additionally, it implements cursor positioning for better user experience during snippet expansion.
2025-06-24 20:50:55 -07:00
ByteAtATime
77f7f8c113
fix(snippets): adjust evdev keycode offset for input handling 2025-06-24 20:35:57 -07:00
ByteAtATime
61c804235c
chore(snippets): remove unused code 2025-06-24 20:28:29 -07:00
ByteAtATime
bf6d9a960a
feat(snippets):
delete keyword after triggering snippet

This commit improves the `inject_text` method to handle backspace characters correctly by buffering text input.
2025-06-24 20:26:44 -07:00
ByteAtATime
de0b26e8ae
feat(snippets): add create snippet form
This commit introduces a new `SnippetForm` component for creating snippets, updates the `ViewManager` to handle the new 'create-snippet-form' view, and integrates the form into the main page routing.
2025-06-24 20:00:15 -07:00
ByteAtATime
7088cb17fd
feat(snippets): Implement core expansion engine
This commit implements implements the `inject_text` method using the `enigo` crate for input simulation. A new `ExpansionEngine` is created to listen for keyboard input, maintain a buffer of recent characters, and check against the database for a matching keyword to trigger an expansion.
2025-06-24 18:59:10 -07:00
ByteAtATime
d72b4dd450
feat(snippets): implement backend crud operations
This commit creates the basic CRUD functions (`create`, `list`, `update`, `delete`) as Tauri commands.
2025-06-24 18:50:13 -07:00
ByteAtATime
1a2fa36a79
feat(snippets): initialize snippet db
This commit creates the initial backend infrastructure for the snippets feature. It sets up the core data model, a dedicated `SnippetManager` for database interactions using `rusqlite`, and integrates it into the Tauri application state.
2025-06-24 18:46:47 -07:00
ByteAtATime
21cd217a26
feat(snippets): implement keyboard event handling
This commit sets up the codebase for the Snippets feature. Specifically, it implements an InputManager trait, which listens for, well, inputs. In the future, we will be using this to keep track of the user's keypresses, triggering the text expansion when the trigger word is entered.
2025-06-24 18:44:22 -07:00
ByteAtATime
28e8ce3e99
refactor(client): extract stores for main page 2025-06-24 10:53:54 -07:00
ByteAtATime
bd5c660b71
refactor(clipboard-history): split clipboard_history.rs into separate module
This commit refactors the monolithic `src-tauri/src/clipboard_history.rs` file into a dedicated Rust module with a clear separation of concerns. The original 350+ line file has been broken down into smaller, single-responsibility files for types, encryption, business logic (manager), and the background monitor.
2025-06-24 10:02:36 -07:00
ByteAtATime
8218e39ae7
refactor(sidecar): create shared RPC module for async requests
This commit introduces a new `rpc.ts` module to centralize the asynchronous request/response logic between the sidecar and the main Tauri process. Previously, files like `clipboard.ts`, `environment.ts`, and `browserExtension.ts` each had their own duplicate implementation for managing pending requests and timeouts. By abstracting this boilerplate into a single RPC utility, we eliminate redundant code, reduce the surface area for bugs, and simplify the creation of future native API bridges.
2025-06-24 09:52:41 -07:00
ByteAtATime
06f823873c
feat(command-palette): implement frecency ranking for command palette
This commit adds a "frecency" (frequency + recency) based ranking algorithm to the command palette. By tracking the usage of commands, applications, and quicklinks, we can provide more useful results when paired with the search score. It prioritizes recently used items, which are likely more relevant for the user. A new `FrecencyManager` was added to the Rust backend to handle usage tracking in a dedicated SQLite database. The `CommandPalette.svelte` component now fetches this data and computes a dynamic score for each item to determine its rank in the list.
2025-06-24 09:25:16 -07:00
ByteAtATime
fe4ce3c5be
feat(client): improve extensions search loading experience
This commit fixes the "flash of no results" that occurred during debounced searches by keeping the previous results visible until new ones are ready to be displayed. Additionally, the loading indicator now uses the Raycast bouncing gradient, improving the consistency of the UI/UX.
2025-06-23 20:50:49 -07:00
ByteAtATime
9dea67a0f8
fix(Icon): correct type argument in getContext for assetsPath 2025-06-23 19:14:26 -07:00
ByteAtATime
bda11b7ddc
feat: add image mask options and update related schemas and styles 2025-06-23 18:47:40 -07:00