diff --git a/apps/desktop/src-tauri/DEEPLINKS.md b/apps/desktop/src-tauri/DEEPLINKS.md new file mode 100644 index 00000000000..c730ff3193b --- /dev/null +++ b/apps/desktop/src-tauri/DEEPLINKS.md @@ -0,0 +1,71 @@ +# Cap Desktop Deeplinks + +Cap registers the `cap-desktop://` scheme in [`tauri.conf.json`](./tauri.conf.json). + +## Existing Links + +| URL | Behavior | Notes | +| --- | --- | --- | +| `cap-desktop://signin?` | Completes desktop auth from the web flow | Handled by the frontend deep-link listener in `apps/desktop/src/utils/auth.ts` | +| `cap-desktop://action?value=` | Executes the legacy JSON action payload | Handled by `apps/desktop/src-tauri/src/deeplink_actions.rs` | +| `file:///path/to/project.cap` | Opens a `.cap` project file | macOS only | + +The legacy `action` payload still deserializes the snake_case `DeepLinkAction` enum. Example: + +```text +cap-desktop://action?value=%7B%22open_settings%22%3A%7B%22page%22%3A%22general%22%7D%7D +``` + +## Recording Control + +| URL | Behavior | +| --- | --- | +| `cap-desktop://record/start` | Starts recording with the saved recording mode from `RecordingSettingsStore`; falls back to Cap's default mode when none is saved | +| `cap-desktop://record/start?mode=studio` | Starts studio recording with the saved target and saved device selections | +| `cap-desktop://record/start?mode=instant` | Starts instant recording with the saved target and saved device selections | +| `cap-desktop://record/start?mode=screenshot` | Passes screenshot mode through to the existing start path and will return the same error Cap already emits for screenshot mode | +| `cap-desktop://record/stop` | Stops the active recording | +| `cap-desktop://record/pause` | Pauses the active recording | +| `cap-desktop://record/resume` | Resumes the active recording | +| `cap-desktop://record/toggle-pause` | Toggles pause/resume on the active recording | + +These routes reuse the same recording command paths that the desktop app already uses, so `RecordingEvent::Paused`, `RecordingEvent::Resumed`, and `RecordingEvent::Stopped` stay in sync with the in-app recording UI. + +## Device Switching + +Cap pauses an active recording before switching microphone or camera inputs, matching the existing in-progress recording UI flow. + +### Microphone + +| URL | Behavior | +| --- | --- | +| `cap-desktop://device/microphone?label=` | Selects the microphone with the matching label | +| `cap-desktop://device/microphone?off=true` | Disables the microphone | + +Microphones are selected by the same label string returned by `list_audio_devices`. + +### Camera + +| URL | Behavior | +| --- | --- | +| `cap-desktop://device/camera?model_id=` | Selects the camera whose model ID matches `` | +| `cap-desktop://device/camera?device_id=` | Selects the camera whose device ID matches `` | +| `cap-desktop://device/camera?id=` | Alias for `device_id` | +| `cap-desktop://device/camera?label=` | Selects the first camera whose display name matches `` | +| `cap-desktop://device/camera?off=true` | Disables the camera | + +Internally, the Tauri command expects `DeviceOrModelID`, which serializes as: + +```text +{"DeviceID":""} +{"ModelID":""} +``` + +The deeplink parser accepts the query-string forms above and resolves them back to the same `DeviceOrModelID` variants before calling Cap's existing camera input command. + +## Errors + +- Unknown routes return an invalid-deeplink error and are ignored by the Rust action handler. +- Unknown microphone labels surface the existing `set_mic_input` error. +- Unknown camera labels, model IDs, and device IDs are rejected before Cap calls the camera input command. +- `signin` links are intentionally ignored by the Rust action handler so the frontend auth flow continues to work unchanged. diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index a1170284877..5b967a287c6 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -8,14 +8,14 @@ use tracing::trace; use crate::{App, ArcLock, recording::StartRecordingInputs, windows::ShowCapWindow}; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] #[serde(rename_all = "snake_case")] pub enum CaptureMode { Screen(String), Window(String), } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] #[serde(rename_all = "snake_case")] pub enum DeepLinkAction { StartRecording { @@ -25,7 +25,19 @@ pub enum DeepLinkAction { capture_system_audio: bool, mode: RecordingMode, }, + StartSavedRecording { + mode: Option, + }, StopRecording, + PauseRecording, + ResumeRecording, + TogglePauseRecording, + SetMicrophone { + label: Option, + }, + SetCamera { + selector: Option, + }, OpenEditor { project_path: PathBuf, }, @@ -34,6 +46,14 @@ pub enum DeepLinkAction { }, } +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)] +#[serde(rename_all = "snake_case")] +pub enum CameraSelector { + DeviceId(String), + ModelId(String), + Label(String), +} + pub fn handle(app_handle: &AppHandle, urls: Vec) { trace!("Handling deep actions for: {:?}", &urls); @@ -41,7 +61,7 @@ pub fn handle(app_handle: &AppHandle, urls: Vec) { .into_iter() .filter(|url| !url.as_str().is_empty()) .filter_map(|url| { - DeepLinkAction::try_from(&url) + parse_deeplink(url.as_str()) .map_err(|e| match e { ActionParseFromUrlError::ParseFailed(msg) => { eprintln!("Failed to parse deep link \"{}\": {}", &url, msg) @@ -70,39 +90,227 @@ pub fn handle(app_handle: &AppHandle, urls: Vec) { }); } +#[derive(Debug, PartialEq, Eq)] pub enum ActionParseFromUrlError { ParseFailed(String), Invalid, NotAction, } -impl TryFrom<&Url> for DeepLinkAction { - type Error = ActionParseFromUrlError; +#[derive(Debug, Clone, PartialEq, Eq)] +struct CameraIdentity { + display_name: String, + device_id: String, + model_id: Option, +} + +impl CameraIdentity { + fn current() -> Vec { + crate::recording::list_cameras() + .into_iter() + .map(|camera| Self { + display_name: camera.display_name().to_string(), + device_id: camera.device_id().to_string(), + model_id: camera.model_id().map(ToString::to_string), + }) + .collect() + } + + fn device_or_model_id(&self) -> Result { + match &self.model_id { + Some(model_id) => cap_camera::ModelID::try_from(model_id.clone()) + .map(DeviceOrModelID::ModelID) + .map_err(|_| format!("Invalid camera model ID \"{model_id}\"")), + None => Ok(DeviceOrModelID::DeviceID(self.device_id.clone())), + } + } +} + +pub fn parse_deeplink(url: &str) -> Result { + let url = + Url::parse(url).map_err(|err| ActionParseFromUrlError::ParseFailed(err.to_string()))?; + parse_url(&url) +} + +fn parse_url(url: &Url) -> Result { + #[cfg(target_os = "macos")] + if url.scheme() == "file" { + return url + .to_file_path() + .map(|project_path| DeepLinkAction::OpenEditor { project_path }) + .map_err(|_| ActionParseFromUrlError::Invalid); + } + + let host = url.host_str().ok_or(ActionParseFromUrlError::Invalid)?; + + match host { + "action" => parse_action_url(url), + "record" => parse_record_url(url), + "device" => parse_device_url(url), + _ => Err(ActionParseFromUrlError::NotAction), + } +} + +fn parse_action_url(url: &Url) -> Result { + let json_value = query_param(url, "value").ok_or(ActionParseFromUrlError::Invalid)?; + serde_json::from_str(&json_value) + .map_err(|e| ActionParseFromUrlError::ParseFailed(e.to_string())) +} + +fn parse_record_url(url: &Url) -> Result { + match path_segments(url)?.as_slice() { + ["start"] => Ok(DeepLinkAction::StartSavedRecording { + mode: query_param(url, "mode") + .map(parse_recording_mode) + .transpose()?, + }), + ["stop"] => Ok(DeepLinkAction::StopRecording), + ["pause"] => Ok(DeepLinkAction::PauseRecording), + ["resume"] => Ok(DeepLinkAction::ResumeRecording), + ["toggle-pause"] => Ok(DeepLinkAction::TogglePauseRecording), + _ => Err(ActionParseFromUrlError::Invalid), + } +} + +fn parse_device_url(url: &Url) -> Result { + match path_segments(url)?.as_slice() { + ["microphone"] => { + if parse_bool_flag(url, "off")? { + return Ok(DeepLinkAction::SetMicrophone { label: None }); + } + + Ok(DeepLinkAction::SetMicrophone { + label: Some(non_empty_query_param(url, "label")?), + }) + } + ["camera"] => { + if parse_bool_flag(url, "off")? { + return Ok(DeepLinkAction::SetCamera { selector: None }); + } + + let selector = + if let Some(device_id) = optional_non_empty_query_param(url, "device_id")? { + CameraSelector::DeviceId(device_id) + } else if let Some(device_id) = optional_non_empty_query_param(url, "id")? { + CameraSelector::DeviceId(device_id) + } else if let Some(model_id) = optional_non_empty_query_param(url, "model_id")? { + CameraSelector::ModelId(model_id) + } else if let Some(label) = optional_non_empty_query_param(url, "label")? { + CameraSelector::Label(label) + } else { + return Err(ActionParseFromUrlError::Invalid); + }; + + Ok(DeepLinkAction::SetCamera { + selector: Some(selector), + }) + } + _ => Err(ActionParseFromUrlError::Invalid), + } +} + +fn parse_recording_mode(value: String) -> Result { + let json = serde_json::to_string(&value) + .map_err(|e| ActionParseFromUrlError::ParseFailed(e.to_string()))?; + serde_json::from_str::(&json) + .map_err(|e| ActionParseFromUrlError::ParseFailed(e.to_string())) +} + +fn parse_bool_flag(url: &Url, name: &str) -> Result { + let Some(value) = query_param(url, name) else { + return Ok(false); + }; + + match value.to_ascii_lowercase().as_str() { + "true" | "1" => Ok(true), + "false" | "0" => Ok(false), + _ => Err(ActionParseFromUrlError::ParseFailed(format!( + "Invalid boolean value for \"{name}\": {value}" + ))), + } +} + +fn optional_non_empty_query_param( + url: &Url, + name: &str, +) -> Result, ActionParseFromUrlError> { + match query_param(url, name) { + Some(value) if value.is_empty() => Err(ActionParseFromUrlError::Invalid), + Some(value) => Ok(Some(value)), + None => Ok(None), + } +} + +fn non_empty_query_param(url: &Url, name: &str) -> Result { + optional_non_empty_query_param(url, name)?.ok_or(ActionParseFromUrlError::Invalid) +} + +fn path_segments(url: &Url) -> Result, ActionParseFromUrlError> { + let segments: Vec<_> = url + .path_segments() + .ok_or(ActionParseFromUrlError::Invalid)? + .filter(|segment| !segment.is_empty()) + .collect(); + + if segments.is_empty() { + return Err(ActionParseFromUrlError::Invalid); + } + + Ok(segments) +} + +fn query_param(url: &Url, name: &str) -> Option { + url.query_pairs() + .find(|(key, _)| key == name) + .map(|(_, value)| value.into_owned()) +} - fn try_from(url: &Url) -> Result { - #[cfg(target_os = "macos")] - if url.scheme() == "file" { - return url - .to_file_path() - .map(|project_path| Self::OpenEditor { project_path }) - .map_err(|_| ActionParseFromUrlError::Invalid); +fn resolve_camera_selector( + selector: &CameraSelector, + cameras: &[CameraIdentity], +) -> Result { + match selector { + CameraSelector::DeviceId(device_id) => cameras + .iter() + .find(|camera| camera.device_id.eq_ignore_ascii_case(device_id)) + .map(|_| DeviceOrModelID::DeviceID(device_id.clone())) + .ok_or_else(|| format!("No camera with device ID \"{device_id}\"")), + CameraSelector::ModelId(model_id) => { + let Some(camera) = cameras.iter().find(|camera| { + camera + .model_id + .as_deref() + .is_some_and(|value| value.eq_ignore_ascii_case(model_id)) + }) else { + return Err(format!("No camera with model ID \"{model_id}\"")); + }; + + camera.device_or_model_id() } + CameraSelector::Label(label) => cameras + .iter() + .find(|camera| camera.display_name.eq_ignore_ascii_case(label)) + .ok_or_else(|| format!("No camera with label \"{label}\""))? + .device_or_model_id(), + } +} - match url.domain() { - Some(v) if v != "action" => Err(ActionParseFromUrlError::NotAction), - _ => Err(ActionParseFromUrlError::Invalid), - }?; +async fn pause_for_input_change(app: &AppHandle) -> Result<(), String> { + let should_pause = { + let state = app.state::>(); + let state = state.read().await; + let Some(recording) = state.current_recording() else { + return Ok(()); + }; - let params = url - .query_pairs() - .collect::>(); - let json_value = params - .get("value") - .ok_or(ActionParseFromUrlError::Invalid)?; - let action: Self = serde_json::from_str(json_value) - .map_err(|e| ActionParseFromUrlError::ParseFailed(e.to_string()))?; - Ok(action) + !recording.is_paused().await.map_err(|e| e.to_string())? + }; + + if should_pause { + crate::recording::pause_recording(app.clone(), app.state()).await?; } + + Ok(()) } impl DeepLinkAction { @@ -144,9 +352,35 @@ impl DeepLinkAction { .await .map(|_| ()) } + DeepLinkAction::StartSavedRecording { mode } => { + crate::start_recording_from_saved_settings(app.clone(), mode) + .await + .map(|_| ()) + } DeepLinkAction::StopRecording => { crate::recording::stop_recording(app.clone(), app.state()).await } + DeepLinkAction::PauseRecording => { + crate::recording::pause_recording(app.clone(), app.state()).await + } + DeepLinkAction::ResumeRecording => { + crate::recording::resume_recording(app.clone(), app.state()).await + } + DeepLinkAction::TogglePauseRecording => { + crate::recording::toggle_pause_recording(app.clone(), app.state()).await + } + DeepLinkAction::SetMicrophone { label } => { + pause_for_input_change(app).await?; + crate::set_mic_input(app.state(), label).await + } + DeepLinkAction::SetCamera { selector } => { + pause_for_input_change(app).await?; + let camera_id = selector + .as_ref() + .map(|selector| resolve_camera_selector(selector, &CameraIdentity::current())) + .transpose()?; + crate::set_camera_input(app.clone(), app.state(), camera_id, None).await + } DeepLinkAction::OpenEditor { project_path } => { crate::open_project_from_path(Path::new(&project_path), app.clone()) } @@ -156,3 +390,171 @@ impl DeepLinkAction { } } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn parses_existing_action_link() { + let action = serde_json::json!({ + "open_settings": { + "page": "general" + } + }) + .to_string(); + let url = Url::parse_with_params("cap-desktop://action", [("value", action)]).unwrap(); + + assert_eq!( + parse_deeplink(url.as_str()).unwrap(), + DeepLinkAction::OpenSettings { + page: Some("general".to_string()), + } + ); + } + + #[test] + fn auth_link_is_not_handled_by_rust_actions() { + assert_eq!( + parse_deeplink("cap-desktop://signin?token=abc&user_id=123&expires=456"), + Err(ActionParseFromUrlError::NotAction) + ); + } + + #[test] + fn url_host_and_path_shapes_are_pinned() { + let action = Url::parse("cap-desktop://action?value=%7B%7D").unwrap(); + assert_eq!(action.host_str(), Some("action")); + assert_eq!(action.path(), ""); + + let record = Url::parse("cap-desktop://record/start?mode=studio").unwrap(); + assert_eq!(record.host_str(), Some("record")); + assert_eq!(record.path(), "/start"); + assert_eq!( + record.path_segments().unwrap().collect::>(), + vec!["start"] + ); + } + + #[test] + fn parses_record_control_links() { + assert_eq!( + parse_deeplink("cap-desktop://record/start?mode=studio").unwrap(), + DeepLinkAction::StartSavedRecording { + mode: Some(RecordingMode::Studio), + } + ); + assert_eq!( + parse_deeplink("cap-desktop://record/start").unwrap(), + DeepLinkAction::StartSavedRecording { mode: None } + ); + assert_eq!( + parse_deeplink("cap-desktop://record/stop").unwrap(), + DeepLinkAction::StopRecording + ); + assert_eq!( + parse_deeplink("cap-desktop://record/pause").unwrap(), + DeepLinkAction::PauseRecording + ); + assert_eq!( + parse_deeplink("cap-desktop://record/resume").unwrap(), + DeepLinkAction::ResumeRecording + ); + assert_eq!( + parse_deeplink("cap-desktop://record/toggle-pause").unwrap(), + DeepLinkAction::TogglePauseRecording + ); + } + + #[test] + fn parses_microphone_links() { + assert_eq!( + parse_deeplink("cap-desktop://device/microphone?label=Built-in%20Microphone").unwrap(), + DeepLinkAction::SetMicrophone { + label: Some("Built-in Microphone".to_string()), + } + ); + assert_eq!( + parse_deeplink("cap-desktop://device/microphone?off=true").unwrap(), + DeepLinkAction::SetMicrophone { label: None } + ); + } + + #[test] + fn parses_camera_links() { + assert_eq!( + parse_deeplink("cap-desktop://device/camera?device_id=device-123").unwrap(), + DeepLinkAction::SetCamera { + selector: Some(CameraSelector::DeviceId("device-123".to_string())), + } + ); + assert_eq!( + parse_deeplink("cap-desktop://device/camera?model_id=1a2b:3c4d").unwrap(), + DeepLinkAction::SetCamera { + selector: Some(CameraSelector::ModelId("1a2b:3c4d".to_string())), + } + ); + assert_eq!( + parse_deeplink("cap-desktop://device/camera?label=FaceTime%20HD%20Camera").unwrap(), + DeepLinkAction::SetCamera { + selector: Some(CameraSelector::Label("FaceTime HD Camera".to_string())), + } + ); + assert_eq!( + parse_deeplink("cap-desktop://device/camera?off=true").unwrap(), + DeepLinkAction::SetCamera { selector: None } + ); + } + + #[test] + fn rejects_malformed_or_missing_params() { + assert!(matches!( + parse_deeplink("cap-desktop://record/start?mode=bogus"), + Err(ActionParseFromUrlError::ParseFailed(_)) + )); + assert_eq!( + parse_deeplink("cap-desktop://device/microphone"), + Err(ActionParseFromUrlError::Invalid) + ); + assert_eq!( + parse_deeplink("cap-desktop://device/microphone?label="), + Err(ActionParseFromUrlError::Invalid) + ); + assert_eq!( + parse_deeplink("cap-desktop://device/camera"), + Err(ActionParseFromUrlError::Invalid) + ); + assert_eq!( + parse_deeplink("cap-desktop://device/camera?id="), + Err(ActionParseFromUrlError::Invalid) + ); + assert!(matches!( + parse_deeplink("cap-desktop://device/camera?off=maybe"), + Err(ActionParseFromUrlError::ParseFailed(_)) + )); + } + + #[test] + fn camera_resolution_surfaces_unknown_device() { + let cameras = vec![CameraIdentity { + display_name: "FaceTime HD Camera".to_string(), + device_id: "known-device".to_string(), + model_id: Some("1a2b:3c4d".to_string()), + }]; + + assert_eq!( + resolve_camera_selector( + &CameraSelector::DeviceId("missing-device".to_string()), + &cameras, + ), + Err("No camera with device ID \"missing-device\"".to_string()) + ); + assert_eq!( + resolve_camera_selector( + &CameraSelector::Label("Missing Camera".to_string()), + &cameras, + ), + Err("No camera with label \"Missing Camera\"".to_string()) + ); + } +} diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 0f51d4fa72b..b470b20d900 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -1944,6 +1944,36 @@ pub struct RequestScreenCapturePrewarm { pub force: bool, } +pub(crate) async fn start_recording_from_saved_settings( + app: AppHandle, + mode: Option, +) -> Result { + let settings = RecordingSettingsStore::get(&app) + .ok() + .flatten() + .unwrap_or_default(); + let recording_mode = mode.or(settings.mode).unwrap_or_default(); + + let _ = set_mic_input(app.state(), settings.mic_name).await; + let _ = set_camera_input(app.clone(), app.state(), settings.camera_id, None).await; + + start_recording( + app.clone(), + app.state(), + recording::StartRecordingInputs { + capture_target: settings + .target + .unwrap_or_else(|| ScreenCaptureTarget::Display { + id: Display::primary().id(), + }), + mode: recording_mode, + capture_system_audio: settings.system_audio, + organization_id: settings.organization_id, + }, + ) + .await +} + #[derive(Deserialize, specta::Type, Serialize, tauri_specta::Event, Debug, Clone)] pub struct NewNotification { title: String, @@ -4399,27 +4429,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { } RequestStartRecording::listen_any_spawn(&app, async |event, app| { - let settings = RecordingSettingsStore::get(&app) - .ok() - .flatten() - .unwrap_or_default(); - - let _ = set_mic_input(app.state(), settings.mic_name).await; - let _ = set_camera_input(app.clone(), app.state(), settings.camera_id, None).await; - - let _ = start_recording(app.clone(), app.state(), { - recording::StartRecordingInputs { - capture_target: settings.target.unwrap_or_else(|| { - ScreenCaptureTarget::Display { - id: Display::primary().id(), - } - }), - mode: event.mode, - capture_system_audio: settings.system_audio, - organization_id: settings.organization_id, - } - }) - .await; + let _ = start_recording_from_saved_settings(app.clone(), Some(event.mode)).await; }); RequestOpenRecordingPicker::listen_any_spawn(&app, async |event, app| { diff --git a/apps/raycast/README.md b/apps/raycast/README.md new file mode 100644 index 00000000000..ab69b4c165c --- /dev/null +++ b/apps/raycast/README.md @@ -0,0 +1,38 @@ +# Cap Raycast Extension + +This workspace package adds two Raycast commands for Cap: + +- `Cap Control`: start studio or instant recordings, stop, pause, resume, and toggle pause. +- `Switch Device`: enumerate macOS microphones and cameras from `system_profiler`, then send the matching Cap deeplink. + +## Commands + +### Cap Control + +- Start Studio Recording +- Start Instant Recording +- Stop Recording +- Pause Recording +- Resume Recording +- Toggle Pause Recording + +### Switch Device + +- Disable microphone +- Switch microphone by label +- Disable camera +- Switch camera by model ID when available +- Fall back to camera device ID or label when macOS metadata does not expose a model ID + +## Deeplinks + +The extension uses the desktop app deeplinks documented in [`apps/desktop/src-tauri/DEEPLINKS.md`](../desktop/src-tauri/DEEPLINKS.md). + +## Validation + +```bash +pnpm --dir apps/raycast exec tsc --noEmit +npx @raycast/api@latest lint +``` + +`system_profiler` output varies across macOS versions and hardware. The camera picker prefers `model_id`, then `device_id`, then `label` so the extension can still trigger a usable Cap deeplink when one identifier is missing. diff --git a/apps/raycast/assets/icon.png b/apps/raycast/assets/icon.png new file mode 100644 index 00000000000..718226caf20 Binary files /dev/null and b/apps/raycast/assets/icon.png differ diff --git a/apps/raycast/package.json b/apps/raycast/package.json new file mode 100644 index 00000000000..e0bb8284c2d --- /dev/null +++ b/apps/raycast/package.json @@ -0,0 +1,45 @@ +{ + "name": "cap-raycast", + "private": true, + "type": "module", + "title": "Cap", + "description": "Control Cap recordings and switch devices through deeplinks.", + "icon": "icon.png", + "author": "CapSoftware", + "license": "MIT", + "categories": [ + "Productivity", + "Developer Tools" + ], + "commands": [ + { + "name": "cap-control", + "title": "Cap Control", + "subtitle": "Cap", + "description": "Start, stop, pause, and resume Cap recordings.", + "mode": "view", + "icon": "icon.png" + }, + { + "name": "switch-device", + "title": "Switch Device", + "subtitle": "Cap", + "description": "Switch Cap microphone and camera inputs.", + "mode": "view", + "icon": "icon.png" + } + ], + "scripts": { + "typecheck": "tsc --noEmit", + "lint": "npx @raycast/api@latest lint" + }, + "dependencies": { + "@raycast/api": "1.104.17", + "react": "^19.2.0" + }, + "devDependencies": { + "@types/node": "22.19.17", + "@types/react": "19.0.10", + "typescript": "^5.8.3" + } +} diff --git a/apps/raycast/src/cap-control.tsx b/apps/raycast/src/cap-control.tsx new file mode 100644 index 00000000000..4d4a4b794a2 --- /dev/null +++ b/apps/raycast/src/cap-control.tsx @@ -0,0 +1,30 @@ +import { Action, ActionPanel, List } from "@raycast/api"; +import { capControlActions, openCapDeeplink } from "./lib/deeplinks"; + +export default function Command() { + return ( + + {capControlActions.map((action) => ( + + + void openCapDeeplink(action.url, action.successTitle) + } + /> + + + } + /> + ))} + + ); +} diff --git a/apps/raycast/src/lib/deeplinks.ts b/apps/raycast/src/lib/deeplinks.ts new file mode 100644 index 00000000000..5ff6b414f9b --- /dev/null +++ b/apps/raycast/src/lib/deeplinks.ts @@ -0,0 +1,77 @@ +import { open, showHUD, showToast, Toast } from "@raycast/api"; + +export type CapControlAction = { + key: string; + title: string; + subtitle: string; + url: string; + successTitle: string; + icon: "record" | "stop" | "pause" | "resume" | "toggle"; +}; + +export const capControlActions: CapControlAction[] = [ + { + key: "start-studio", + title: "Start Studio Recording", + subtitle: "Uses cap-desktop://record/start?mode=studio", + url: "cap-desktop://record/start?mode=studio", + successTitle: "Sent studio start to Cap", + icon: "record", + }, + { + key: "start-instant", + title: "Start Instant Recording", + subtitle: "Uses cap-desktop://record/start?mode=instant", + url: "cap-desktop://record/start?mode=instant", + successTitle: "Sent instant start to Cap", + icon: "record", + }, + { + key: "stop", + title: "Stop Recording", + subtitle: "Uses cap-desktop://record/stop", + url: "cap-desktop://record/stop", + successTitle: "Sent stop to Cap", + icon: "stop", + }, + { + key: "pause", + title: "Pause Recording", + subtitle: "Uses cap-desktop://record/pause", + url: "cap-desktop://record/pause", + successTitle: "Sent pause to Cap", + icon: "pause", + }, + { + key: "resume", + title: "Resume Recording", + subtitle: "Uses cap-desktop://record/resume", + url: "cap-desktop://record/resume", + successTitle: "Sent resume to Cap", + icon: "resume", + }, + { + key: "toggle-pause", + title: "Toggle Pause", + subtitle: "Uses cap-desktop://record/toggle-pause", + url: "cap-desktop://record/toggle-pause", + successTitle: "Sent toggle pause to Cap", + icon: "toggle", + }, +]; + +export async function openCapDeeplink( + url: string, + successTitle: string, +): Promise { + try { + await open(url); + await showHUD(successTitle); + } catch (error) { + await showToast({ + style: Toast.Style.Failure, + title: "Failed to open Cap deeplink", + message: error instanceof Error ? error.message : String(error), + }); + } +} diff --git a/apps/raycast/src/lib/devices.ts b/apps/raycast/src/lib/devices.ts new file mode 100644 index 00000000000..f1a5f3cb6e9 --- /dev/null +++ b/apps/raycast/src/lib/devices.ts @@ -0,0 +1,276 @@ +import { execFile } from "node:child_process"; +import { promisify } from "node:util"; + +const execFileAsync = promisify(execFile); + +type JsonValue = + | boolean + | number + | string + | null + | JsonValue[] + | { [key: string]: JsonValue }; + +type JsonObject = { [key: string]: JsonValue }; + +export type DeviceItem = { + key: string; + title: string; + subtitle: string; + url: string; + section: "Microphones" | "Cameras"; + kind: "microphone" | "camera"; +}; + +export async function loadDeviceItems(): Promise { + const [microphones, cameras] = await Promise.all([ + loadMicrophones(), + loadCameras(), + ]); + + return [ + { + key: "microphone-off", + title: "Disable Microphone", + subtitle: "cap-desktop://device/microphone?off=true", + url: "cap-desktop://device/microphone?off=true", + section: "Microphones", + kind: "microphone", + }, + ...microphones, + { + key: "camera-off", + title: "Disable Camera", + subtitle: "cap-desktop://device/camera?off=true", + url: "cap-desktop://device/camera?off=true", + section: "Cameras", + kind: "camera", + }, + ...cameras, + ]; +} + +async function loadMicrophones(): Promise { + const json = await readSystemProfilerJson("SPAudioDataType"); + const seen = new Set(); + const items: DeviceItem[] = []; + + for (const object of collectObjects(json)) { + const title = readName(object); + if (!title) continue; + if (hasChildObjects(object)) continue; + if (!looksLikeMicrophone(object, title)) continue; + if (seen.has(title)) continue; + seen.add(title); + + items.push({ + key: `microphone:${title}`, + title, + subtitle: `cap-desktop://device/microphone?label=${encodeURIComponent(title)}`, + url: `cap-desktop://device/microphone?label=${encodeURIComponent(title)}`, + section: "Microphones", + kind: "microphone", + }); + } + + return items.sort((left, right) => left.title.localeCompare(right.title)); +} + +async function loadCameras(): Promise { + const json = await readSystemProfilerJson("SPCameraDataType"); + const seen = new Set(); + const items: DeviceItem[] = []; + + for (const object of collectObjects(json)) { + const title = readName(object); + if (!title) continue; + if (hasChildObjects(object)) continue; + + const modelId = readModelId(object); + const deviceId = readDeviceId(object); + if (!looksLikeCamera(object, title, modelId, deviceId)) continue; + + const url = buildCameraUrl(title, modelId, deviceId); + if (!url) continue; + if (seen.has(url)) continue; + seen.add(url); + + items.push({ + key: `camera:${url}`, + title, + subtitle: url, + url, + section: "Cameras", + kind: "camera", + }); + } + + return items.sort((left, right) => left.title.localeCompare(right.title)); +} + +async function readSystemProfilerJson(dataType: string): Promise { + const { stdout } = await execFileAsync( + "system_profiler", + ["-json", dataType], + { maxBuffer: 16 * 1024 * 1024 }, + ); + + return JSON.parse(stdout) as JsonValue; +} + +function collectObjects( + value: JsonValue, + objects: JsonObject[] = [], +): JsonObject[] { + if (Array.isArray(value)) { + for (const item of value) collectObjects(item, objects); + return objects; + } + + if (!isObject(value)) return objects; + + objects.push(value); + + for (const child of Object.values(value)) { + collectObjects(child, objects); + } + + return objects; +} + +function isObject(value: JsonValue): value is JsonObject { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function hasChildObjects(object: JsonObject): boolean { + return Object.values(object).some( + (value) => + isObject(value) || + (Array.isArray(value) && value.some((item) => isObject(item))), + ); +} + +function readName(object: JsonObject): string | undefined { + const name = readString(object, ["_name", "name", "display_name"]); + if (!name) return undefined; + const trimmed = name.trim(); + return trimmed.length > 0 ? trimmed : undefined; +} + +function looksLikeMicrophone(object: JsonObject, title: string): boolean { + const lowerTitle = title.toLowerCase(); + if (lowerTitle.includes("microphone")) return true; + + return Object.entries(object).some( + ([key, value]) => + key.toLowerCase().includes("input") && + typeof value === "string" && + isTruthyFlag(value), + ); +} + +function looksLikeCamera( + object: JsonObject, + title: string, + modelId: string | undefined, + deviceId: string | undefined, +): boolean { + if (modelId || deviceId) return true; + if (title.toLowerCase().includes("camera")) return true; + + return Object.keys(object).some((key) => + key.toLowerCase().includes("camera"), + ); +} + +function buildCameraUrl( + title: string, + modelId: string | undefined, + deviceId: string | undefined, +): string | undefined { + if (modelId) { + return `cap-desktop://device/camera?model_id=${encodeURIComponent(modelId)}`; + } + + if (deviceId) { + return `cap-desktop://device/camera?device_id=${encodeURIComponent(deviceId)}`; + } + + if (title.length > 0) { + return `cap-desktop://device/camera?label=${encodeURIComponent(title)}`; + } + + return undefined; +} + +function readModelId(object: JsonObject): string | undefined { + const MODEL_ID_KEYS = ["model", "vendor", "product", "usb"]; + for (const [key, value] of Object.entries(object)) { + if (typeof value !== "string") continue; + if (!MODEL_ID_KEYS.some((k) => key.toLowerCase().includes(k))) continue; + const directMatch = value.match(/\b[0-9a-fA-F]{4}:[0-9a-fA-F]{4}\b/); + if (directMatch) return directMatch[0].toLowerCase(); + } + + const vendor = readHexId(object, ["vendor", "vid"]); + const product = readHexId(object, ["product", "pid"]); + if (vendor && product) { + return `${vendor}:${product}`.toLowerCase(); + } + + return undefined; +} + +function readDeviceId(object: JsonObject): string | undefined { + for (const [key, value] of Object.entries(object)) { + if (typeof value !== "string") continue; + const lowerKey = key.toLowerCase(); + if (!lowerKey.includes("id")) continue; + if (lowerKey.includes("model")) continue; + if (lowerKey.includes("vendor")) continue; + if (lowerKey.includes("product")) continue; + if (!lowerKey.includes("unique") && !lowerKey.includes("device")) continue; + const trimmed = value.trim(); + if (trimmed.length > 0) return trimmed; + } + + return undefined; +} + +function readHexId( + object: JsonObject, + fragments: string[], +): string | undefined { + for (const [key, value] of Object.entries(object)) { + if (typeof value !== "string") continue; + const lowerKey = key.toLowerCase(); + if (!fragments.some((fragment) => lowerKey.includes(fragment))) continue; + if (!lowerKey.includes("id")) continue; + + const match = value.match(/[0-9a-fA-F]{4}\b/g); + if (match && match.length > 0) { + return match[match.length - 1]; + } + } + + return undefined; +} + +function readString(object: JsonObject, keys: string[]): string | undefined { + for (const key of keys) { + const value = object[key]; + if (typeof value === "string") return value; + } + + const loweredKeys = keys.map((key) => key.toLowerCase()); + for (const [key, value] of Object.entries(object)) { + if (typeof value !== "string") continue; + if (loweredKeys.includes(key.toLowerCase())) return value; + } + + return undefined; +} + +function isTruthyFlag(value: string): boolean { + return ["true", "yes", "1", "spaudio_yes"].includes(value.toLowerCase()); +} diff --git a/apps/raycast/src/switch-device.tsx b/apps/raycast/src/switch-device.tsx new file mode 100644 index 00000000000..62bb67dfb43 --- /dev/null +++ b/apps/raycast/src/switch-device.tsx @@ -0,0 +1,106 @@ +import { Action, ActionPanel, List, showToast, Toast } from "@raycast/api"; +import { useEffect, useState } from "react"; +import { openCapDeeplink } from "./lib/deeplinks"; +import { type DeviceItem, loadDeviceItems } from "./lib/devices"; + +export default function Command() { + const [items, setItems] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(null); + + useEffect(() => { + let cancelled = false; + + async function load() { + try { + const nextItems = await loadDeviceItems(); + if (!cancelled) { + setItems(nextItems); + setError(null); + } + } catch (loadError) { + const message = + loadError instanceof Error ? loadError.message : String(loadError); + if (!cancelled) { + setItems([]); + setError(message); + } + await showToast({ + style: Toast.Style.Failure, + title: "Failed to enumerate devices", + message, + }); + } finally { + if (!cancelled) { + setIsLoading(false); + } + } + } + + void load(); + + return () => { + cancelled = true; + }; + }, []); + + const microphones = items.filter((item) => item.section === "Microphones"); + const cameras = items.filter((item) => item.section === "Cameras"); + + return ( + + {error ? ( + + ) : null} + + {microphones.map((item) => ( + + + void openCapDeeplink(item.url, `Sent ${item.title} to Cap`) + } + /> + + + } + /> + ))} + + + {cameras.map((item) => ( + + + void openCapDeeplink(item.url, `Sent ${item.title} to Cap`) + } + /> + + + } + /> + ))} + + + ); +} diff --git a/apps/raycast/tsconfig.json b/apps/raycast/tsconfig.json new file mode 100644 index 00000000000..d2ca0291cd7 --- /dev/null +++ b/apps/raycast/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "es2022", + "lib": ["es2022"], + "jsx": "react-jsx", + "module": "es2022", + "moduleResolution": "Bundler", + "noEmit": true, + "strict": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "types": ["node"] + }, + "include": ["src/**/*.ts", "src/**/*.tsx"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1003cb70eb..92ef092dde4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -115,7 +115,7 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@25.9.0)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) @@ -160,7 +160,7 @@ importers: version: 2.9.0 '@ts-rest/core': specifier: ^3.52.1 - version: 3.52.1(@types/node@22.15.17)(zod@3.25.76) + version: 3.52.1(@types/node@25.9.0)(zod@3.25.76) '@types/react-tooltip': specifier: ^4.2.4 version: 4.2.4(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -205,7 +205,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -242,19 +242,19 @@ importers: version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-top-level-await: specifier: ^1.4.4 - version: 1.6.0(@swc/helpers@0.5.17)(rollup@4.40.2)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + version: 1.6.0(@swc/helpers@0.5.17)(rollup@4.40.2)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) vite-plugin-wasm: specifier: ^3.4.1 - version: 3.5.0(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + version: 3.5.0(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + version: 5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) vitest: specifier: ~2.1.9 - version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) + version: 2.1.9(@types/node@25.9.0)(jsdom@26.1.0)(terser@5.44.0) apps/discord-bot: dependencies: @@ -285,7 +285,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.6.4 - version: 0.6.16(@cloudflare/workers-types@4.20250507.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0)) + version: 0.6.16(@cloudflare/workers-types@4.20250507.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@2.1.9(@types/node@25.9.0)(jsdom@26.1.0)(terser@5.44.0)) '@cloudflare/workers-types': specifier: ^4.20250214.0 version: 4.20250507.0 @@ -294,7 +294,7 @@ importers: version: 5.8.3 vitest: specifier: ~2.1.9 - version: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) + version: 2.1.9(@types/node@25.9.0)(jsdom@26.1.0)(terser@5.44.0) wrangler: specifier: ^3.109.1 version: 3.114.8(@cloudflare/workers-types@4.20250507.0) @@ -321,6 +321,25 @@ importers: specifier: latest version: 1.3.14 + apps/raycast: + dependencies: + '@raycast/api': + specifier: 1.104.17 + version: 1.104.17(@types/node@22.19.17)(@types/react@19.0.10) + react: + specifier: ^19.2.0 + version: 19.2.4 + devDependencies: + '@types/node': + specifier: 22.19.17 + version: 22.19.17 + '@types/react': + specifier: 19.0.10 + version: 19.0.10 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + apps/storybook: dependencies: '@cap/ui-solid': @@ -365,16 +384,16 @@ importers: version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4)) storybook-solidjs-vite: specifier: ^1.0.0-beta.2 - version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(esbuild@0.25.12)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.12)) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + version: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-plugin-solid: specifier: ^2.10.2 - version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + version: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) apps/web: dependencies: @@ -895,13 +914,13 @@ importers: dependencies: '@pulumi/github': specifier: ^6.7.0 - version: 6.7.2(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + version: 6.7.2(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3) '@pulumi/pulumi': specifier: ^3.201.0 - version: 3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + version: 3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3) '@pulumiverse/vercel': specifier: ^1.14.3 - version: 1.14.3(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + version: 1.14.3(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3) zod: specifier: ^3 version: 3.25.76 @@ -1251,7 +1270,7 @@ importers: version: 1.9.6 tailwindcss: specifier: ^3.4.10 - version: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)) zod: specifier: ^3 version: 3.25.76 @@ -1264,10 +1283,10 @@ importers: version: 2.2.336 '@kobalte/tailwindcss': specifier: ^0.9.0 - version: 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))) + version: 0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))) '@tailwindcss/typography': specifier: ^0.5.9 - version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))) + version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))) autoprefixer: specifier: ^10.4.20 version: 10.4.21(postcss@8.5.3) @@ -1279,16 +1298,16 @@ importers: version: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4)) tailwind-scrollbar: specifier: ^3.1.0 - version: 3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))) + version: 3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))) tailwindcss-animate: specifier: ^1.0.6 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))) unplugin-auto-import: specifier: ^0.18.2 version: 0.18.6(rollup@4.40.2) unplugin-fonts: specifier: ^1.1.1 - version: 1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + version: 1.3.1(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) unplugin-icons: specifier: ^0.19.2 version: 0.19.3 @@ -1337,7 +1356,7 @@ importers: dependencies: '@ts-rest/core': specifier: ^3.52.1 - version: 3.52.1(@types/node@22.15.17)(zod@3.25.76) + version: 3.52.1(@types/node@25.9.0)(zod@3.25.76) zod: specifier: ^3.25.76 version: 3.25.76 @@ -2345,9 +2364,6 @@ packages: '@emnapi/core@1.5.0': resolution: {integrity: sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg==} - '@emnapi/core@1.9.1': - resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==} - '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} @@ -2360,15 +2376,9 @@ packages: '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} - '@emnapi/runtime@1.9.1': - resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==} - '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@emnapi/wasi-threads@1.2.0': - resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} - '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -3996,6 +4006,140 @@ packages: cpu: [x64] os: [win32] + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@internationalized/date@3.8.0': resolution: {integrity: sha512-J51AJ0fEL68hE4CwGPa6E0PO6JDaVLd8aln48xFCSy7CZkZc96dGEGmLs2OEEbBxcsVZtfrqkXJwI2/MSG8yKw==} @@ -4573,14 +4717,26 @@ packages: engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} hasBin: true + '@oclif/core@4.11.3': + resolution: {integrity: sha512-gQCSYAtUhJilGKaSaZhqejH9X1dDu+jWQjLmtGOgN/XcKaAEPPSeT2mu1UvlvtPox1/NNRdlBcUa8KRKo2HnJQ==} + engines: {node: '>=18.0.0'} + '@oclif/core@4.8.1': resolution: {integrity: sha512-07mq0vKCWNsB85ZHeBMlTAiO0KLFqHyAeRK3bD2K8CI1tX3tiwkWw1lZQZkiw8MUBrhxdROhMkYMY4Q0l7JHqA==} engines: {node: '>=18.0.0'} + '@oclif/plugin-autocomplete@3.2.49': + resolution: {integrity: sha512-+rrAZ468bW/B9uVrn6sEnFYepy3M1N/BWht8mHzhFIFCIduPSoE+8MweROxZLOGBZrXGWt0iavuPQmy0eaXRfQ==} + engines: {node: '>=18.0.0'} + '@oclif/plugin-help@6.2.37': resolution: {integrity: sha512-5N/X/FzlJaYfpaHwDC0YHzOzKDWa41s9t+4FpCDu4f9OMReds4JeNBaaWk9rlIzdKjh2M6AC5Q18ORfECRkHGA==} engines: {node: '>=18.0.0'} + '@oclif/plugin-not-found@3.2.86': + resolution: {integrity: sha512-BJhJSahwsYayZpo18f0fPTg8tKb9dIvydaz03NCK3eMfmcsT1MmXhXqh1KEV8J7mz0sQ6f0qFEb6BXy490/iUg==} + engines: {node: '>=18.0.0'} + '@octokit/app@15.1.6': resolution: {integrity: sha512-WELCamoCJo9SN0lf3SWZccf68CF0sBNPQuLYmZ/n87p5qvBJDe9aBtr5dHkh7T9nxWZ608pizwsUbypSzZAiUw==} engines: {node: '>= 18'} @@ -5734,97 +5890,129 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@raycast/api@1.104.17': + resolution: {integrity: sha512-31yGTbb0HMHKWqxwZZl2rzaUau/Yf+FX6pO1DK6mobpjUMqDb0h0FGkDSwr0MNwsujT4K3DbAYgh3sHhGkxWfw==} + engines: {node: '>=22.22.2'} + hasBin: true + peerDependencies: + '@types/node': 22.19.17 + '@types/react': 19.0.10 + react-devtools: 6.1.1 + peerDependenciesMeta: + '@types/node': + optional: true + '@types/react': + optional: true + react-devtools: + optional: true + '@react-email/body@0.0.11': resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/button@0.1.0': resolution: {integrity: sha512-fg4LtgTu5zXxaRSly9cuv6sHVF/hi1lElbRaIA8EPx5coWOBhCto6rCPfawcXpaN2oER7rNHUrcNBkI+lz5F9A==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-block@0.1.0': resolution: {integrity: sha512-jSpHFsgqnQXxDIssE4gvmdtFncaFQz5D6e22BnVjcCPk/udK+0A9jRwGFEG8JD2si9ZXBmU4WsuqQEczuZn4ww==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/code-inline@0.0.5': resolution: {integrity: sha512-MmAsOzdJpzsnY2cZoPHFPk6uDO/Ncpb4Kh1hAt9UZc1xOW3fIzpe1Pi9y9p6wwUmpaeeDalJxAxH6/fnTquinA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/column@0.0.13': resolution: {integrity: sha512-Lqq17l7ShzJG/d3b1w/+lVO+gp2FM05ZUo/nW0rjxB8xBICXOVv6PqjDnn3FXKssvhO5qAV20lHM6S+spRhEwQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/components@0.1.0': resolution: {integrity: sha512-Rx0eZk0XuzLKXC5NoMm8xuH72ALVsPYNb/BvcdCJx4EZAoVpQISb4sCqpo9blVYVIazNr4MqWroqFb3ZNrCLMQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/container@0.0.15': resolution: {integrity: sha512-Qo2IQo0ru2kZq47REmHW3iXjAQaKu4tpeq/M8m1zHIVwKduL2vYOBQWbC2oDnMtWPmkBjej6XxgtZByxM6cCFg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/font@0.0.9': resolution: {integrity: sha512-4zjq23oT9APXkerqeslPH3OZWuh5X4crHK6nx82mVHV2SrLba8+8dPEnWbaACWTNjOCbcLIzaC9unk7Wq2MIXw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/head@0.0.12': resolution: {integrity: sha512-X2Ii6dDFMF+D4niNwMAHbTkeCjlYYnMsd7edXOsi0JByxt9wNyZ9EnhFiBoQdqkE+SMDcu8TlNNttMrf5sJeMA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/heading@0.0.15': resolution: {integrity: sha512-xF2GqsvBrp/HbRHWEfOgSfRFX+Q8I5KBEIG5+Lv3Vb2R/NYr0s8A5JhHHGf2pWBMJdbP4B2WHgj/VUrhy8dkIg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/hr@0.0.11': resolution: {integrity: sha512-S1gZHVhwOsd1Iad5IFhpfICwNPMGPJidG/Uysy1AwmspyoAP5a4Iw3OWEpINFdgh9MHladbxcLKO2AJO+cA9Lw==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/html@0.0.11': resolution: {integrity: sha512-qJhbOQy5VW5qzU74AimjAR9FRFQfrMa7dn4gkEXKMB/S9xZN8e1yC1uA9C15jkXI/PzmJ0muDIWmFwatm5/+VA==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/img@0.0.11': resolution: {integrity: sha512-aGc8Y6U5C3igoMaqAJKsCpkbm1XjguQ09Acd+YcTKwjnC2+0w3yGUJkjWB2vTx4tN8dCqQCXO8FmdJpMfOA9EQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/link@0.0.12': resolution: {integrity: sha512-vF+xxQk2fGS1CN7UPQDbzvcBGfffr+GjTPNiWM38fhBfsLv6A/YUfaqxWlmL7zLzVmo0K2cvvV9wxlSyNba1aQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/markdown@0.0.15': resolution: {integrity: sha512-UQA9pVm5sbflgtg3EX3FquUP4aMBzmLReLbGJ6DZQZnAskBF36aI56cRykDq1o+1jT+CKIK1CducPYziaXliag==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/preview@0.0.13': resolution: {integrity: sha512-F7j9FJ0JN/A4d7yr+aw28p4uX7VLWs7hTHtLo7WRyw4G+Lit6Zucq4UWKRxJC8lpsUdzVmG7aBJnKOT+urqs/w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -5838,24 +6026,28 @@ packages: '@react-email/row@0.0.12': resolution: {integrity: sha512-HkCdnEjvK3o+n0y0tZKXYhIXUNPDx+2vq1dJTmqappVHXS5tXS6W5JOPZr5j+eoZ8gY3PShI2LWj5rWF7ZEtIQ==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/section@0.0.16': resolution: {integrity: sha512-FjqF9xQ8FoeUZYKSdt8sMIKvoT9XF8BrzhT3xiFKdEMwYNbsDflcjfErJe3jb7Wj/es/lKTbV5QR1dnLzGpL3w==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/tailwind@1.0.5': resolution: {integrity: sha512-BH00cZSeFfP9HiDASl+sPHi7Hh77W5nzDgdnxtsVr/m3uQD9g180UwxcE3PhOfx0vRdLzQUU8PtmvvDfbztKQg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc '@react-email/text@0.1.5': resolution: {integrity: sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg==} engines: {node: '>=18.0.0'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -8045,8 +8237,11 @@ packages: '@types/node@22.15.14': resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} - '@types/node@22.15.17': - resolution: {integrity: sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==} + '@types/node@22.19.17': + resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} + + '@types/node@25.9.0': + resolution: {integrity: sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -8074,6 +8269,9 @@ packages: resolution: {integrity: sha512-UzjzmgY/VH3Str6DcAGTLMA1mVVhGOyARNTANExrirtp+JgxhaIOVDxq4TIRmpSi4voLv+w4HA9CC5GvhhCA0A==} deprecated: This is a stub types definition. react-tooltip provides its own type definitions, so you do not need this installed. + '@types/react@19.0.10': + resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + '@types/react@19.1.13': resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} @@ -9074,6 +9272,7 @@ packages: aws-sdk@2.1692.0: resolution: {integrity: sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw==} engines: {node: '>= 10.0.0'} + deprecated: The AWS SDK for JavaScript (v2) has reached end-of-support, and no longer receives updates. Please migrate your code to use AWS SDK for JavaScript (v3). More info https://a.co/cUPnyil aws-ssl-profiles@1.1.2: resolution: {integrity: sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==} @@ -9412,6 +9611,9 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -9484,6 +9686,10 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -10929,6 +11135,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-levenshtein@3.0.0: + resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==} + fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -10950,6 +11159,10 @@ packages: resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} hasBin: true + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -12692,8 +12905,8 @@ packages: resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} engines: {node: 20 || >=22} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minimatch@3.1.2: @@ -12845,6 +13058,10 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mux-embed@5.9.0: resolution: {integrity: sha512-wmunL3uoPhma/tWy8PrDPZkvJpXvSFBwbD3KkC4PG8Ztjfb1X3hRJwGUAQyRz7z99b/ovLm2UTTitrkvStjH4w==} @@ -13471,6 +13688,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -13956,6 +14177,10 @@ packages: react: '>=16.14.0' react-dom: '>=16.14.0' + react@19.0.0: + resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + engines: {node: '>=0.10.0'} + react@19.1.1: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} @@ -14353,6 +14578,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.8.0: + resolution: {integrity: sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==} + engines: {node: '>=10'} + hasBin: true + send@0.19.0: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} @@ -15049,6 +15279,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -15412,6 +15646,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -16223,6 +16460,10 @@ packages: '@cloudflare/workers-types': optional: true + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -16372,6 +16613,10 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} @@ -17871,7 +18116,7 @@ snapshots: optionalDependencies: workerd: 1.20250408.0 - '@cloudflare/vitest-pool-workers@0.6.16(@cloudflare/workers-types@4.20250507.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0))': + '@cloudflare/vitest-pool-workers@0.6.16(@cloudflare/workers-types@4.20250507.0)(@vitest/runner@3.2.4)(@vitest/snapshot@3.2.4)(vitest@2.1.9(@types/node@25.9.0)(jsdom@26.1.0)(terser@5.44.0))': dependencies: '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -17881,7 +18126,7 @@ snapshots: esbuild: 0.17.19 miniflare: 3.20250204.1 semver: 7.7.1 - vitest: 2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0) + vitest: 2.1.9(@types/node@25.9.0)(jsdom@26.1.0)(terser@5.44.0) wrangler: 3.109.1(@cloudflare/workers-types@4.20250507.0) zod: 3.25.76 transitivePeerDependencies: @@ -18143,12 +18388,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/core@1.9.1': - dependencies: - '@emnapi/wasi-threads': 1.2.0 - tslib: 2.8.1 - optional: true - '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -18169,21 +18408,11 @@ snapshots: tslib: 2.8.1 optional: true - '@emnapi/runtime@1.9.1': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.1.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.0': - dependencies: - tslib: 2.8.1 - optional: true - '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -19189,6 +19418,131 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@22.19.17)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.17) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/confirm@5.1.21(@types/node@22.19.17)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.17) + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/core@10.3.2(@types/node@22.19.17)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.17) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/editor@4.2.23(@types/node@22.19.17)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.17) + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/expand@4.0.23(@types/node@22.19.17)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.17) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/external-editor@1.0.3(@types/node@22.19.17)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.0 + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@22.19.17)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.17) + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/number@3.0.23(@types/node@22.19.17)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.17) + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/password@4.0.23(@types/node@22.19.17)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.17) + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/prompts@7.10.1(@types/node@22.19.17)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.17) + '@inquirer/confirm': 5.1.21(@types/node@22.19.17) + '@inquirer/editor': 4.2.23(@types/node@22.19.17) + '@inquirer/expand': 4.0.23(@types/node@22.19.17) + '@inquirer/input': 4.3.1(@types/node@22.19.17) + '@inquirer/number': 3.0.23(@types/node@22.19.17) + '@inquirer/password': 4.0.23(@types/node@22.19.17) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.17) + '@inquirer/search': 3.2.2(@types/node@22.19.17) + '@inquirer/select': 4.4.2(@types/node@22.19.17) + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/rawlist@4.1.11(@types/node@22.19.17)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/type': 3.0.10(@types/node@22.19.17) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/search@3.2.2(@types/node@22.19.17)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.17) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/select@4.4.2(@types/node@22.19.17)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.17) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.17) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.17 + + '@inquirer/type@3.0.10(@types/node@22.19.17)': + optionalDependencies: + '@types/node': 22.19.17 + '@internationalized/date@3.8.0': dependencies: '@swc/helpers': 0.5.17 @@ -19279,9 +19633,9 @@ snapshots: dependencies: tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3)) - '@kobalte/tailwindcss@0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)))': + '@kobalte/tailwindcss@0.9.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)))': dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)) '@kobalte/utils@0.9.1(solid-js@1.9.6)': dependencies: @@ -19314,7 +19668,7 @@ snapshots: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.7.4 + semver: 7.8.0 tar: 6.2.1 transitivePeerDependencies: - encoding @@ -19327,7 +19681,7 @@ snapshots: https-proxy-agent: 7.0.6 node-fetch: 2.7.0(encoding@0.1.13) nopt: 8.1.0 - semver: 7.7.4 + semver: 7.8.0 tar: 7.4.3 transitivePeerDependencies: - encoding @@ -19537,8 +19891,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.9': dependencies: - '@emnapi/core': 1.9.1 - '@emnapi/runtime': 1.9.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.9.0 optional: true @@ -19657,7 +20011,7 @@ snapshots: precinct: 11.0.5 require-package-name: 2.0.1 resolve: 2.0.0-next.5 - semver: 7.7.4 + semver: 7.8.0 tmp-promise: 3.0.3 toml: 3.0.0 unixify: 1.0.0 @@ -19802,7 +20156,7 @@ snapshots: '@npmcli/fs@3.1.1': dependencies: - semver: 7.7.3 + semver: 7.7.4 '@npmcli/git@5.0.8': dependencies: @@ -19813,7 +20167,7 @@ snapshots: proc-log: 4.2.0 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.7.4 + semver: 7.8.0 which: 4.0.0 transitivePeerDependencies: - bluebird @@ -19836,7 +20190,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 pacote: 18.0.6 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - bluebird - supports-color @@ -19853,7 +20207,7 @@ snapshots: json-parse-even-better-errors: 3.0.2 normalize-package-data: 6.0.2 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - bluebird @@ -19903,8 +20257,8 @@ snapshots: pkg-types: 2.3.0 rc9: 3.0.0 scule: 1.3.0 - semver: 7.7.4 - tinyglobby: 0.2.15 + semver: 7.8.0 + tinyglobby: 0.2.16 ufo: 1.6.3 unctx: 2.5.0 untyped: 2.0.0 @@ -19915,6 +20269,27 @@ snapshots: dependencies: consola: 3.4.2 + '@oclif/core@4.11.3': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + get-package-type: 0.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lilconfig: 3.1.3 + minimatch: 10.2.5 + semver: 7.8.0 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.16 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + '@oclif/core@4.8.1': dependencies: ansi-escapes: 4.3.2 @@ -19927,18 +20302,36 @@ snapshots: indent-string: 4.0.0 is-wsl: 2.2.0 lilconfig: 3.1.3 - minimatch: 10.2.4 - semver: 7.7.4 + minimatch: 10.2.5 + semver: 7.8.0 string-width: 4.2.3 supports-color: 8.1.1 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 widest-line: 3.1.0 wordwrap: 1.0.0 wrap-ansi: 7.0.0 + '@oclif/plugin-autocomplete@3.2.49': + dependencies: + '@oclif/core': 4.11.3 + ansis: 3.17.0 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + transitivePeerDependencies: + - supports-color + '@oclif/plugin-help@6.2.37': dependencies: - '@oclif/core': 4.8.1 + '@oclif/core': 4.11.3 + + '@oclif/plugin-not-found@3.2.86(@types/node@22.19.17)': + dependencies: + '@inquirer/prompts': 7.10.1(@types/node@22.19.17) + '@oclif/core': 4.11.3 + ansis: 3.17.0 + fast-levenshtein: 3.0.0 + transitivePeerDependencies: + - '@types/node' '@octokit/app@15.1.6': dependencies: @@ -20570,16 +20963,16 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@pulumi/github@6.7.2(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': + '@pulumi/github@6.7.2(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - bluebird - supports-color - ts-node - typescript - '@pulumi/pulumi@3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': + '@pulumi/pulumi@3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3)': dependencies: '@grpc/grpc-js': 1.13.3 '@logdna/tail-file': 2.2.0 @@ -20610,15 +21003,15 @@ snapshots: tmp: 0.2.5 upath: 1.2.0 optionalDependencies: - ts-node: 10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - bluebird - supports-color - '@pulumiverse/vercel@1.14.3(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3)': + '@pulumiverse/vercel@1.14.3(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))(typescript@5.8.3) + '@pulumi/pulumi': 3.201.0(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))(typescript@5.8.3) transitivePeerDependencies: - bluebird - supports-color @@ -21262,6 +21655,20 @@ snapshots: '@radix-ui/rect@1.1.1': {} + '@raycast/api@1.104.17(@types/node@22.19.17)(@types/react@19.0.10)': + dependencies: + '@oclif/core': 4.11.3 + '@oclif/plugin-autocomplete': 3.2.49 + '@oclif/plugin-help': 6.2.37 + '@oclif/plugin-not-found': 3.2.86(@types/node@22.19.17) + esbuild: 0.27.4 + react: 19.0.0 + optionalDependencies: + '@types/node': 22.19.17 + '@types/react': 19.0.10 + transitivePeerDependencies: + - supports-color + '@react-email/body@0.0.11(react@19.1.1)': dependencies: react: 19.1.1 @@ -22921,11 +23328,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@25.9.0)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: - '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@tanstack/server-functions-plugin': 1.119.2(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -22936,8 +23343,8 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' - '@types/node' @@ -23066,12 +23473,12 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@storybook/builder-vite@10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': + '@storybook/builder-vite@10.5.0-alpha.0(esbuild@0.25.12)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.12))': dependencies: - '@storybook/csf-plugin': 10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + '@storybook/csf-plugin': 10.5.0-alpha.0(esbuild@0.25.12)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.12)) storybook: 8.6.12(prettier@3.7.4) ts-dedent: 2.2.0 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - esbuild - rollup @@ -23082,8 +23489,8 @@ snapshots: '@storybook/theming': 8.6.12(storybook@8.6.12(prettier@3.7.4)) better-opn: 3.0.2 browser-assert: 1.2.1 - esbuild: 0.25.5 - esbuild-register: 3.6.0(esbuild@0.25.5) + esbuild: 0.25.12 + esbuild-register: 3.6.0(esbuild@0.25.12) jsdoc-type-pratt-parser: 4.1.0 process: 0.11.10 recast: 0.23.11 @@ -23098,15 +23505,15 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': + '@storybook/csf-plugin@10.5.0-alpha.0(esbuild@0.25.12)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.12))': dependencies: storybook: 8.6.12(prettier@3.7.4) unplugin: 2.3.11 optionalDependencies: - esbuild: 0.25.5 + esbuild: 0.25.12 rollup: 4.40.2 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - webpack: 5.101.3(esbuild@0.25.5) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + webpack: 5.101.3(esbuild@0.25.12) '@storybook/csf-plugin@8.6.12(storybook@8.6.12(prettier@3.7.4))': dependencies: @@ -23179,10 +23586,10 @@ snapshots: commander: 8.3.0 minimatch: 9.0.5 piscina: 4.9.2 - semver: 7.7.4 + semver: 7.8.0 slash: 3.0.0 source-map: 0.7.4 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 optionalDependencies: chokidar: 5.0.0 transitivePeerDependencies: @@ -23328,13 +23735,13 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3)) - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)) '@tanstack/devtools-event-bus@0.3.2': dependencies: @@ -23364,7 +23771,7 @@ snapshots: - csstype - utf-8-validate - '@tanstack/directive-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': + '@tanstack/directive-functions-plugin@1.119.2(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.1 @@ -23377,7 +23784,7 @@ snapshots: babel-dead-code-elimination: 1.0.10 dedent: 1.6.0 tiny-invariant: 1.3.3 - vite: 6.1.4(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.1.4(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -23449,7 +23856,7 @@ snapshots: ansis: 3.17.0 diff: 7.0.0 - '@tanstack/server-functions-plugin@1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': + '@tanstack/server-functions-plugin@1.119.2(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)': dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.27.1 @@ -23458,7 +23865,7 @@ snapshots: '@babel/template': 7.27.2 '@babel/traverse': 7.27.1 '@babel/types': 7.27.1 - '@tanstack/directive-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + '@tanstack/directive-functions-plugin': 1.119.2(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) babel-dead-code-elimination: 1.0.10 dedent: 1.6.0 tiny-invariant: 1.3.3 @@ -23696,9 +24103,9 @@ snapshots: '@types/node': 20.17.43 zod: 3.25.76 - '@ts-rest/core@3.52.1(@types/node@22.15.17)(zod@3.25.76)': + '@ts-rest/core@3.52.1(@types/node@25.9.0)(zod@3.25.76)': optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 25.9.0 zod: 3.25.76 '@tsconfig/bun@1.0.7': {} @@ -23897,7 +24304,7 @@ snapshots: '@types/jsdom@21.1.7': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.21 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -23944,7 +24351,7 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.21 form-data: 4.0.2 '@types/node@10.17.60': {} @@ -23967,9 +24374,13 @@ snapshots: dependencies: undici-types: 6.21.0 - '@types/node@22.15.17': + '@types/node@22.19.17': dependencies: undici-types: 6.21.0 + + '@types/node@25.9.0': + dependencies: + undici-types: 7.24.6 optional: true '@types/normalize-package-data@2.4.4': {} @@ -23997,6 +24408,10 @@ snapshots: - react - react-dom + '@types/react@19.0.10': + dependencies: + csstype: 3.2.3 + '@types/react@19.1.13': dependencies: csstype: 3.2.3 @@ -24181,9 +24596,9 @@ snapshots: '@typescript-eslint/types': 8.57.2 '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3(supports-color@8.1.1) - minimatch: 10.2.4 - semver: 7.7.4 - tinyglobby: 0.2.15 + minimatch: 10.2.5 + semver: 7.8.0 + tinyglobby: 0.2.16 ts-api-utils: 2.5.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -24318,8 +24733,8 @@ snapshots: dependencies: '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) + acorn: 8.16.0 + acorn-import-attributes: 1.9.5(acorn@8.16.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -24372,7 +24787,7 @@ snapshots: '@vercel/queue@0.1.4': dependencies: '@vercel/oidc': 3.2.0 - minimatch: 10.2.4 + minimatch: 10.2.5 mixpart: 0.0.5 picocolors: 1.1.1 @@ -24396,7 +24811,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -24407,18 +24822,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -24488,13 +24903,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@22.15.17)(terser@5.44.0))': + '@vitest/mocker@2.1.9(vite@5.4.19(@types/node@25.9.0)(terser@5.44.0))': dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.19(@types/node@22.15.17)(terser@5.44.0) + vite: 5.4.19(@types/node@25.9.0)(terser@5.44.0) '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))': dependencies: @@ -25075,6 +25490,10 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-import-attributes@1.9.5(acorn@8.16.0): + dependencies: + acorn: 8.16.0 + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -25527,7 +25946,7 @@ snapshots: bin-version-check@5.1.0: dependencies: bin-version: 6.0.0 - semver: 7.7.4 + semver: 7.8.0 semver-truncate: 3.0.0 bin-version@6.0.0: @@ -25850,6 +26269,8 @@ snapshots: character-reference-invalid@2.0.1: {} + chardet@2.1.1: {} + check-error@2.1.1: {} chokidar@3.6.0: @@ -25907,6 +26328,8 @@ snapshots: cli-spinners@2.9.2: {} + cli-width@4.1.0: {} + client-only@0.0.1: {} clipboardy@4.0.0: @@ -26821,21 +27244,21 @@ snapshots: esast-util-from-js@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 - acorn: 8.15.0 + acorn: 8.16.0 esast-util-from-estree: 2.0.0 vfile-message: 4.0.2 - esbuild-register@3.6.0(esbuild@0.25.4): + esbuild-register@3.6.0(esbuild@0.25.12): dependencies: debug: 4.4.3(supports-color@8.1.1) - esbuild: 0.25.4 + esbuild: 0.25.12 transitivePeerDependencies: - supports-color - esbuild-register@3.6.0(esbuild@0.25.5): + esbuild-register@3.6.0(esbuild@0.25.4): dependencies: debug: 4.4.3(supports-color@8.1.1) - esbuild: 0.25.5 + esbuild: 0.25.4 transitivePeerDependencies: - supports-color @@ -27787,6 +28210,10 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-levenshtein@3.0.0: + dependencies: + fastest-levenshtein: 1.0.16 + fast-safe-stringify@2.1.1: {} fast-uri@3.0.6: {} @@ -27809,6 +28236,8 @@ snapshots: path-expression-matcher: 1.2.0 strnum: 2.2.2 + fastest-levenshtein@1.0.16: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -27833,6 +28262,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + fecha@4.2.3: {} fetch-blob@3.2.0: @@ -29317,7 +29750,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.8.0 make-error@1.3.6: optional: true @@ -29909,7 +30342,7 @@ snapshots: dependencies: '@isaacs/brace-expansion': 5.0.0 - minimatch@10.2.4: + minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 @@ -30059,6 +30492,8 @@ snapshots: mustache@4.2.0: {} + mute-stream@2.0.0: {} + mux-embed@5.9.0: {} mysql2@3.15.2: @@ -30263,7 +30698,7 @@ snapshots: defu: 6.1.4 destr: 2.0.5 dot-prop: 9.0.0 - esbuild: 0.25.5 + esbuild: 0.25.12 escape-string-regexp: 5.0.0 etag: 1.8.1 exsolve: 1.0.5 @@ -30396,7 +30831,7 @@ snapshots: make-fetch-happen: 13.0.1 nopt: 7.2.1 proc-log: 4.2.0 - semver: 7.7.4 + semver: 7.8.0 tar: 6.2.1 which: 4.0.0 transitivePeerDependencies: @@ -30452,7 +30887,7 @@ snapshots: npm-install-checks@6.3.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 npm-normalize-package-bin@3.0.1: {} @@ -30460,7 +30895,7 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-name: 5.0.1 npm-packlist@8.0.2: @@ -30472,7 +30907,7 @@ snapshots: npm-install-checks: 6.3.0 npm-normalize-package-bin: 3.0.1 npm-package-arg: 11.0.3 - semver: 7.7.3 + semver: 7.7.4 npm-registry-fetch@17.1.0: dependencies: @@ -30882,6 +31317,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.4: {} + pify@2.3.0: {} pirates@4.0.7: {} @@ -30956,13 +31393,13 @@ snapshots: postcss: 8.5.3 ts-node: 10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3) - postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)): + postcss-load-config@4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.1 optionalDependencies: postcss: 8.5.3 - ts-node: 10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3) postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.3)(yaml@2.8.1): dependencies: @@ -31420,6 +31857,8 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + react@19.0.0: {} + react@19.1.1: {} react@19.2.4: {} @@ -31942,7 +32381,7 @@ snapshots: semver-truncate@3.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.0 semver@6.3.1: {} @@ -31954,6 +32393,8 @@ snapshots: semver@7.7.4: {} + semver@7.8.0: {} + send@0.19.0: dependencies: debug: 2.6.9 @@ -32450,16 +32891,16 @@ snapshots: stoppable@1.1.0: {} - storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)): + storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(esbuild@0.25.12)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.12)): dependencies: - '@storybook/builder-vite': 10.5.0-alpha.0(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + '@storybook/builder-vite': 10.5.0-alpha.0(esbuild@0.25.12)(rollup@4.40.2)(storybook@8.6.12(prettier@3.7.4))(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.12)) '@storybook/types': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.7.4)) magic-string: 0.30.17 solid-js: 1.9.6 storybook: 8.6.12(prettier@3.7.4) storybook-solidjs: 1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.7.4)))(solid-js@1.9.6)(storybook@8.6.12(prettier@3.7.4)) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@storybook/test' - esbuild @@ -32613,7 +33054,7 @@ snapshots: stripe@14.25.0: dependencies: - '@types/node': 20.17.43 + '@types/node': 20.19.21 qs: 6.14.0 strnum@1.1.2: {} @@ -32701,9 +33142,9 @@ snapshots: dependencies: tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3)) - tailwind-scrollbar@3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))): + tailwind-scrollbar@3.1.0(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)) tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3))): dependencies: @@ -32713,9 +33154,9 @@ snapshots: dependencies: tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3)) - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)) tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@20.17.43)(typescript@5.8.3)): dependencies: @@ -32771,7 +33212,7 @@ snapshots: transitivePeerDependencies: - ts-node - tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)): + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -32790,7 +33231,7 @@ snapshots: postcss: 8.5.3 postcss-import: 15.1.0(postcss@8.5.3) postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3)) + postcss-load-config: 4.0.2(postcss@8.5.3)(ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3)) postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -32850,16 +33291,16 @@ snapshots: solid-js: 1.9.6 solid-use: 0.9.1(solid-js@1.9.6) - terser-webpack-plugin@5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)): + terser-webpack-plugin@5.3.14(esbuild@0.25.12)(webpack@5.101.3(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 terser: 5.44.0 - webpack: 5.101.3(esbuild@0.25.5) + webpack: 5.101.3(esbuild@0.25.12) optionalDependencies: - esbuild: 0.25.5 + esbuild: 0.25.12 optional: true terser@5.39.0: @@ -32921,6 +33362,11 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinypool@1.0.2: {} tinypool@1.1.1: {} @@ -33047,14 +33493,14 @@ snapshots: '@swc/wasm': 1.15.5 optional: true - ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@22.15.17)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.5(@swc/helpers@0.5.17))(@swc/wasm@1.15.5)(@types/node@25.9.0)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 22.15.17 + '@types/node': 25.9.0 acorn: 8.16.0 acorn-walk: 8.3.4 arg: 4.1.3 @@ -33322,6 +33768,9 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.24.6: + optional: true + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -33412,7 +33861,7 @@ snapshots: pkg-types: 2.1.0 scule: 1.3.0 strip-literal: 3.0.0 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 unplugin: 2.3.10 unplugin-utils: 0.2.4 @@ -33505,11 +33954,11 @@ snapshots: transitivePeerDependencies: - rollup - unplugin-fonts@1.3.1(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): + unplugin-fonts@1.3.1(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: fast-glob: 3.3.3 unplugin: 2.0.0-beta.1 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) unplugin-icons@0.19.3: dependencies: @@ -33542,14 +33991,14 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.15.0 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.16.0 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 unplugin@2.3.2: @@ -33766,7 +34215,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@25.9.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.1)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -33800,7 +34249,7 @@ snapshots: unctx: 2.4.1 unenv: 1.10.0 unstorage: 1.16.0(@planetscale/database@1.19.0)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(bun-types@1.3.14)(mysql2@3.15.2))(mysql2@3.15.2))(ioredis@5.6.1) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -33844,13 +34293,13 @@ snapshots: - xml2js - yaml - vite-node@2.1.9(@types/node@22.15.17)(terser@5.44.0): + vite-node@2.1.9(@types/node@25.9.0)(terser@5.44.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 1.1.2 - vite: 5.4.19(@types/node@22.15.17)(terser@5.44.0) + vite: 5.4.19(@types/node@25.9.0)(terser@5.44.0) transitivePeerDependencies: - '@types/node' - less @@ -33883,7 +34332,7 @@ snapshots: - tsx - yaml - vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): + vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: '@babel/core': 7.27.1 '@types/babel__core': 7.20.5 @@ -33891,27 +34340,27 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.6 solid-refresh: 0.6.3(solid-js@1.9.6) - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - vitefu: 1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vitefu: 1.0.6(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) optionalDependencies: '@testing-library/jest-dom': 6.5.0 transitivePeerDependencies: - supports-color - vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.17)(rollup@4.40.2)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): + vite-plugin-top-level-await@1.6.0(@swc/helpers@0.5.17)(rollup@4.40.2)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: '@rollup/plugin-virtual': 3.0.2(rollup@4.40.2) '@swc/core': 1.15.5(@swc/helpers@0.5.17) '@swc/wasm': 1.15.5 uuid: 10.0.0 - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - '@swc/helpers' - rollup - vite-plugin-wasm@3.5.0(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): + vite-plugin-wasm@3.5.0(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) vite-tsconfig-paths@4.3.2(typescript@5.8.3)(vite@6.3.5(@types/node@20.17.43)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: @@ -33924,34 +34373,34 @@ snapshots: - supports-color - typescript - vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): + vite-tsconfig-paths@5.1.4(typescript@5.8.3)(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.3) optionalDependencies: - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) transitivePeerDependencies: - supports-color - typescript - vite@5.4.19(@types/node@22.15.17)(terser@5.44.0): + vite@5.4.19(@types/node@25.9.0)(terser@5.44.0): dependencies: esbuild: 0.21.5 postcss: 8.5.3 rollup: 4.40.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 25.9.0 fsevents: 2.3.3 terser: 5.44.0 - vite@6.1.4(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): + vite@6.1.4(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.24.2 postcss: 8.5.3 rollup: 4.40.2 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 25.9.0 fsevents: 2.3.3 jiti: 2.6.1 terser: 5.44.0 @@ -33972,7 +34421,7 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 - vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): + vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.4 fdir: 6.4.4(picomatch@4.0.2) @@ -33981,20 +34430,20 @@ snapshots: rollup: 4.40.2 tinyglobby: 0.2.13 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 25.9.0 fsevents: 2.3.3 jiti: 2.6.1 terser: 5.44.0 yaml: 2.8.1 - vitefu@1.0.6(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): + vitefu@1.0.6(vite@6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)): optionalDependencies: - vite: 6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) + vite: 6.3.5(@types/node@25.9.0)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - vitest@2.1.9(@types/node@22.15.17)(jsdom@26.1.0)(terser@5.44.0): + vitest@2.1.9(@types/node@25.9.0)(jsdom@26.1.0)(terser@5.44.0): dependencies: '@vitest/expect': 2.1.9 - '@vitest/mocker': 2.1.9(vite@5.4.19(@types/node@22.15.17)(terser@5.44.0)) + '@vitest/mocker': 2.1.9(vite@5.4.19(@types/node@25.9.0)(terser@5.44.0)) '@vitest/pretty-format': 2.1.9 '@vitest/runner': 2.1.9 '@vitest/snapshot': 2.1.9 @@ -34010,11 +34459,11 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.19(@types/node@22.15.17)(terser@5.44.0) - vite-node: 2.1.9(@types/node@22.15.17)(terser@5.44.0) + vite: 5.4.19(@types/node@25.9.0)(terser@5.44.0) + vite-node: 2.1.9(@types/node@25.9.0)(terser@5.44.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.15.17 + '@types/node': 25.9.0 jsdom: 26.1.0 transitivePeerDependencies: - less @@ -34116,7 +34565,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.101.3(esbuild@0.25.5): + webpack@5.101.3(esbuild@0.25.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -34140,7 +34589,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(esbuild@0.25.5)(webpack@5.101.3(esbuild@0.25.5)) + terser-webpack-plugin: 5.3.14(esbuild@0.25.12)(webpack@5.101.3(esbuild@0.25.12)) watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -34414,6 +34863,12 @@ snapshots: - bufferutil - utf-8-validate + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -34516,6 +34971,8 @@ snapshots: yocto-queue@1.2.1: {} + yoctocolors-cjs@2.1.3: {} + yoctocolors@2.1.1: {} youch-core@0.3.2: