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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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 ¯\_(ツ)_/¯
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.
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.
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.
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.
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.
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.
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.
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.
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.
This commit refactors the `inject_text` method in both `RdevInputManager` and `EvdevInputManager` to utilize a new `with_clipboard_text` function for clipboard operations.
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. ⌘)
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.
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.
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.
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.
delete keyword after triggering snippet
This commit improves the `inject_text` method to handle backspace characters correctly by buffering text input.
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.
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.
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.
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.
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.
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.
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.
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.