//! The client's RPC surface: every command, as one registry. //! //! Each command has a request struct (the wire payload), an adapter that calls //! the underlying implementation, and an entry in `rpc_commands!` below, which //! builds the router and emits the `RpcSchema` TypeScript definition. The //! single `rpc` Tauri command is the only way the frontend reaches any of //! this — one envelope, `{ cmd, payload }`, exactly like the proxy app. //! //! Adapters exist so command implementations keep their natural Tauri //! signatures (window, app handle, managed state) while the wire format stays //! transport-agnostic: a future WebSocket host dispatches into the same router //! with a different `ClientCtx` construction and nothing else changes. use crate::error::Result; use crate::git_watcher::GitWatchResult; use crate::notifications::YaakNotifier; use crate::sync_ext::WatchResult; use crate::updates::YaakUpdater; use crate::AppMetaData; use log::warn; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::PathBuf; use tauri::{Manager, Runtime, State, WebviewWindow}; use tokio::sync::Mutex; use ts_rs::TS; use yaak_crypto::manager::EncryptionManager; use yaak_git::{ BranchDeleteResult, CloneResult, GitBranchInfo, GitCommit, GitFileDiff, GitRemote, GitStatusSummary, GitWorktreeStatus, PullResult, PushResult, }; use yaak_grpc::manager::GrpcHandle; use yaak_grpc::ServiceDefinition; use yaak_models::models::{ AnyModel, GraphQlIntrospection, GrpcEvent, HttpRequest, HttpRequestHeader, HttpResponse, HttpResponseEvent, Plugin, Settings, WebsocketConnection, WebsocketEvent, WorkspaceMeta, }; use yaak_models::util::BatchUpsertResult; use yaak_plugins::events::{ CallFolderActionRequest, CallGrpcRequestActionRequest, CallHttpRequestActionRequest, CallWebsocketRequestActionRequest, CallWorkspaceActionRequest, FilterResponse, GetFolderActionsResponse, GetGrpcRequestActionsResponse, GetHttpAuthenticationConfigResponse, GetHttpAuthenticationSummaryResponse, GetHttpRequestActionsResponse, GetTemplateFunctionConfigResponse, GetTemplateFunctionSummaryResponse, GetThemesResponse, GetWebsocketRequestActionsResponse, GetWorkspaceActionsResponse, JsonPrimitive, RenderPurpose, }; use yaak_plugins::api::{PluginNameVersion, PluginSearchResponse, PluginUpdatesResponse}; use yaak_plugins::manager::PluginManager; use yaak_plugins::plugin_meta::PluginMetadata; use yaak_rpc::RpcRouter; use yaak_sse::sse::ServerSentEvent; use yaak_sync::sync::SyncOp; use yaak_templates::Tokens; use yaak_ws::WebsocketManager; /// Per-call context: the window a command was invoked from. /// /// Window identity is load-bearing — model writes carry it for echo /// suppression, and plugin events and toasts are routed back through it — so it /// rides along with every dispatch rather than living in shared state. pub(crate) struct ClientCtx { pub window: WebviewWindow, } // Derived Clone would demand `R: Clone`, which `Runtime` types don't provide; // the window handle itself is always cloneable. impl Clone for ClientCtx { fn clone(&self) -> Self { Self { window: self.window.clone() } } } /// The one Tauri command. The payload is the yaak-rpc envelope's payload; /// a missing payload means an empty one. #[tauri::command] pub(crate) async fn rpc( window: WebviewWindow, router: State<'_, RpcRouter>>, cmd: String, payload: Option, ) -> std::result::Result { let ctx = ClientCtx { window }; let payload = payload.unwrap_or_else(|| serde_json::Value::Object(Default::default())); log::debug!("RPC {cmd}"); router.dispatch(&cmd, payload, &ctx).await.map_err(|e| { log::warn!("RPC {cmd} failed: {}", e.message); e.message }) } /// A callback that forwards a stream of messages to the calling window as /// `stream_{id}` events. The stream id is minted by the caller so it can /// subscribe before the command starts and never miss a message. fn stream_emitter( ctx: &ClientCtx, stream_id: &str, ) -> impl Fn(T) + Send + Sync + 'static { use tauri::Emitter; let window = ctx.window.clone(); let event = format!("stream_{stream_id}"); move |payload: T| { let value = match serde_json::to_value(payload) { Ok(value) => value, Err(e) => { warn!("Failed to serialize stream event: {e}"); return; } }; if let Err(e) = window.emit_to(window.label(), &event, value) { warn!("Failed to emit stream event: {e}"); } } } // -- Streaming commands (hand-written: they push events while they run) -- #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitWatchWorktreeStatusReq { pub dir: PathBuf, pub stream_id: String, } async fn cmd_git_watch_worktree_status( ctx: ClientCtx, req: CmdGitWatchWorktreeStatusReq, ) -> Result { let on_status = stream_emitter(&ctx, &req.stream_id); crate::git_watcher::watch_git_worktree_status( ctx.window.app_handle().clone(), &req.dir, on_status, ) .await } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSyncWatchReq { pub sync_dir: PathBuf, pub workspace_id: String, pub stream_id: String, } async fn cmd_sync_watch( ctx: ClientCtx, req: CmdSyncWatchReq, ) -> Result { let on_event = stream_emitter(&ctx, &req.stream_id); Ok(crate::sync_ext::sync_watch( ctx.window.app_handle().clone(), &req.sync_dir, &req.workspace_id, on_event, ) .await?) } macro_rules! rpc_commands { ( $( $name:ident ( $req:ty ) -> $res:ty ),* $(,)? ) => { /// Build the router with every command registered. Generic over the /// runtime so the same registry serves Wry and CEF builds. pub(crate) fn build_rpc_router() -> RpcRouter> { let mut router = RpcRouter::new(); $( router.register(stringify!($name), yaak_rpc::rpc_handler_async!($name)); )* router } /// The wire schema, exported to TypeScript. Field name = command name, /// tuple = (request payload, response payload). #[derive(TS)] #[ts(export, export_to = "gen_rpc.ts")] #[allow(non_snake_case, unused)] pub(crate) struct RpcSchema { $( pub $name: ($req, $res), )* } }; } // -- Request payloads and adapters (generated from the original command signatures) -- #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdMetadataReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdTemplateTokensToStringReq { pub tokens: Tokens, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdRenderTemplateReq { pub template: String, pub workspace_id: String, pub environment_id: Option, pub purpose: Option, pub ignore_error: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSendFeedbackReq { pub feature: String, pub text: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdDismissNotificationReq { pub notification_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGrpcReflectReq { pub request_id: String, pub environment_id: Option, pub proto_files: Vec, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGrpcGoReq { pub request_id: String, pub environment_id: Option, pub proto_files: Vec, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdRestartReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSendEphemeralRequestReq { pub request: HttpRequest, pub environment_id: Option, pub cookie_jar_id: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdFormatJsonReq { pub text: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdFormatGraphqlReq { pub text: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdHttpResponseBodyReq { pub response_id: String, pub filter: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdHttpResponseBodyPathReq { pub response_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdHttpRequestBodyReq { pub response_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGetSseEventsReq { pub response_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGetHttpResponseEventsReq { pub response_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdImportDataReq { pub file_path: String, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdHttpRequestActionsReq {} #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdWebsocketRequestActionsReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCallWebsocketRequestActionReq { pub req: CallWebsocketRequestActionRequest, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdWorkspaceActionsReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCallWorkspaceActionReq { pub req: CallWorkspaceActionRequest, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdFolderActionsReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCallFolderActionReq { pub req: CallFolderActionRequest, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGrpcRequestActionsReq {} #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdTemplateFunctionSummariesReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdTemplateFunctionConfigReq { pub function_name: String, pub values: HashMap, pub model: AnyModel, pub environment_id: Option, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGetHttpAuthenticationSummariesReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGetHttpAuthenticationConfigReq { pub auth_name: String, pub values: HashMap, pub model: AnyModel, pub environment_id: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCallHttpRequestActionReq { pub req: CallHttpRequestActionRequest, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCallGrpcRequestActionReq { pub req: CallGrpcRequestActionRequest, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCallHttpAuthenticationActionReq { pub auth_name: String, pub action_index: i32, pub values: HashMap, pub model: AnyModel, pub environment_id: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCurlToRequestReq { pub command: String, pub workspace_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdExportDataReq { pub export_path: String, pub workspace_ids: Vec, pub include_private_environments: bool, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSaveBase64ToBinaryReq { pub filepath: String, pub data: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSaveResponseReq { pub response_id: String, pub filepath: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSendHttpRequestReq { pub environment_id: Option, pub cookie_jar_id: Option, pub request_id: String, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdReloadPluginsReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginInfoReq { pub id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdDeleteAllGrpcConnectionsReq { pub request_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdDeleteSendHistoryReq { pub workspace_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdDeleteAllHttpResponsesReq { pub request_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGetWorkspaceMetaReq { pub workspace_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdNewChildWindowReq { pub url: String, pub label: String, pub title: String, pub inner_size: (f64, f64), } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdNewMainWindowReq { pub url: String, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdCheckForUpdatesReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdDecryptTemplateReq { pub template: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSecureTemplateReq { pub template: String, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGetThemesReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdEnableEncryptionReq { pub workspace_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdRevealWorkspaceKeyReq { pub workspace_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSetWorkspaceKeyReq { pub workspace_id: String, pub key: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdDisableEncryptionReq { pub workspace_id: String, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdDefaultHeadersReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsUpsertReq { pub model: AnyModel, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsDeleteReq { pub model: AnyModel, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsDuplicateReq { pub model_type: String, pub model_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsWebsocketEventsReq { pub connection_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsGrpcEventsReq { pub connection_id: String, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsGetSettingsReq {} #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsGetGraphqlIntrospectionReq { pub request_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsUpsertGraphqlIntrospectionReq { pub request_id: String, pub workspace_id: String, pub content: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct ModelsWorkspaceModelsReq { pub workspace_id: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitCheckoutReq { pub dir: PathBuf, pub branch: String, pub force: bool, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitBranchReq { pub dir: PathBuf, pub branch: String, pub base: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitDeleteBranchReq { pub dir: PathBuf, pub branch: String, pub force: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitDeleteRemoteBranchReq { pub dir: PathBuf, pub branch: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitMergeBranchReq { pub dir: PathBuf, pub branch: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitRenameBranchReq { pub dir: PathBuf, pub old_name: String, pub new_name: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitStatusReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitBranchInfoReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitWorktreeStatusReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitLogReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitLogForFileReq { pub dir: PathBuf, pub rela_path: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitFileDiffForCommitReq { pub dir: PathBuf, pub commit_oid: String, pub rela_path: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitInitializeReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitCloneReq { pub url: String, pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitCommitReq { pub dir: PathBuf, pub message: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitFetchAllReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitPushReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitPullReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitPullForceResetReq { pub dir: PathBuf, pub remote: String, pub branch: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitPullMergeReq { pub dir: PathBuf, pub remote: String, pub branch: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitAddReq { pub dir: PathBuf, pub rela_paths: Vec, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitUnstageReq { pub dir: PathBuf, pub rela_paths: Vec, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitResetChangesReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitRestoreFilesReq { pub dir: PathBuf, pub rela_paths: Vec, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitRestoreFileFromCommitReq { pub dir: PathBuf, pub commit_oid: String, pub rela_path: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitAddCredentialReq { pub remote_url: String, pub username: String, pub password: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitRemotesReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitAddRemoteReq { pub dir: PathBuf, pub name: String, pub url: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdGitRmRemoteReq { pub dir: PathBuf, pub name: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSyncCalculateReq { pub workspace_id: String, pub sync_dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSyncCalculateFsReq { pub dir: PathBuf, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdSyncApplyReq { pub sync_ops: Vec, pub sync_dir: PathBuf, pub workspace_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdWsDeleteConnectionsReq { pub request_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdWsSendReq { pub connection_id: String, pub environment_id: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdWsCloseReq { pub connection_id: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdWsConnectReq { pub request_id: String, pub environment_id: Option, pub cookie_jar_id: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginsSearchReq { pub query: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginsInstallReq { pub name: String, pub version: Option, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginsInstallFromDirectoryReq { pub directory: String, } #[derive(Debug, Deserialize, TS)] #[serde(rename_all = "camelCase")] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginsUninstallReq { pub plugin_id: String, } #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginInitErrorsReq {} #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginsUpdatesReq {} #[derive(Debug, Deserialize, TS)] #[ts(export, export_to = "gen_rpc.ts")] pub(crate) struct CmdPluginsUpdateAllReq {} async fn cmd_metadata(ctx: ClientCtx, _req: CmdMetadataReq) -> Result { Ok(crate::cmd_metadata(ctx.window.app_handle().clone()).await?) } async fn cmd_template_tokens_to_string(ctx: ClientCtx, req: CmdTemplateTokensToStringReq) -> Result { Ok(crate::cmd_template_tokens_to_string(ctx.window.clone(), ctx.window.app_handle().clone(), req.tokens).await?) } async fn cmd_render_template(ctx: ClientCtx, req: CmdRenderTemplateReq) -> Result { Ok(crate::cmd_render_template(ctx.window.clone(), ctx.window.app_handle().clone(), &req.template, &req.workspace_id, req.environment_id.as_deref(), req.purpose, req.ignore_error).await?) } async fn cmd_send_feedback(ctx: ClientCtx, req: CmdSendFeedbackReq) -> Result<()> { Ok(crate::cmd_send_feedback(ctx.window.app_handle().clone(), req.feature, req.text).await?) } async fn cmd_dismiss_notification(ctx: ClientCtx, req: CmdDismissNotificationReq) -> Result<()> { Ok(crate::cmd_dismiss_notification(ctx.window.clone(), &req.notification_id, ctx.window.app_handle().state::>()).await?) } async fn cmd_grpc_reflect(ctx: ClientCtx, req: CmdGrpcReflectReq) -> Result> { Ok(crate::cmd_grpc_reflect(&req.request_id, req.environment_id.as_deref(), req.proto_files, ctx.window.clone(), ctx.window.app_handle().clone(), ctx.window.app_handle().state::>()).await?) } async fn cmd_grpc_go(ctx: ClientCtx, req: CmdGrpcGoReq) -> Result { Ok(crate::cmd_grpc_go(&req.request_id, req.environment_id.as_deref(), req.proto_files, ctx.window.app_handle().clone(), ctx.window.clone(), ctx.window.app_handle().state::>()).await?) } async fn cmd_restart(ctx: ClientCtx, _req: CmdRestartReq) -> Result<()> { Ok(crate::cmd_restart(ctx.window.app_handle().clone()).await?) } async fn cmd_send_ephemeral_request(ctx: ClientCtx, req: CmdSendEphemeralRequestReq) -> Result { Ok(crate::cmd_send_ephemeral_request(req.request, req.environment_id.as_deref(), req.cookie_jar_id.as_deref(), ctx.window.clone(), ctx.window.app_handle().clone()).await?) } async fn cmd_format_json(_ctx: ClientCtx, req: CmdFormatJsonReq) -> Result { Ok(crate::cmd_format_json(&req.text).await?) } async fn cmd_format_graphql(_ctx: ClientCtx, req: CmdFormatGraphqlReq) -> Result { Ok(crate::cmd_format_graphql(&req.text).await?) } async fn cmd_http_response_body(ctx: ClientCtx, req: CmdHttpResponseBodyReq) -> Result { Ok(crate::cmd_http_response_body(ctx.window.clone(), ctx.window.app_handle().state::(), &req.response_id, req.filter.as_deref()).await?) } async fn cmd_http_response_body_path(ctx: ClientCtx, req: CmdHttpResponseBodyPathReq) -> Result> { Ok(crate::cmd_http_response_body_path(ctx.window.app_handle().clone(), &req.response_id).await?) } async fn cmd_http_request_body(ctx: ClientCtx, req: CmdHttpRequestBodyReq) -> Result>> { Ok(crate::cmd_http_request_body(ctx.window.app_handle().clone(), &req.response_id).await?) } async fn cmd_get_sse_events(ctx: ClientCtx, req: CmdGetSseEventsReq) -> Result> { Ok(crate::cmd_get_sse_events(ctx.window.app_handle().clone(), &req.response_id).await?) } async fn cmd_get_http_response_events(ctx: ClientCtx, req: CmdGetHttpResponseEventsReq) -> Result> { Ok(crate::cmd_get_http_response_events(ctx.window.app_handle().clone(), &req.response_id).await?) } async fn cmd_import_data(ctx: ClientCtx, req: CmdImportDataReq) -> Result { Ok(crate::cmd_import_data(ctx.window.clone(), &req.file_path).await?) } async fn cmd_http_request_actions(ctx: ClientCtx, _req: CmdHttpRequestActionsReq) -> Result> { Ok(crate::cmd_http_request_actions(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_websocket_request_actions(ctx: ClientCtx, _req: CmdWebsocketRequestActionsReq) -> Result> { Ok(crate::cmd_websocket_request_actions(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_call_websocket_request_action(ctx: ClientCtx, req: CmdCallWebsocketRequestActionReq) -> Result<()> { Ok(crate::cmd_call_websocket_request_action(ctx.window.clone(), req.req, ctx.window.app_handle().state::()).await?) } async fn cmd_workspace_actions(ctx: ClientCtx, _req: CmdWorkspaceActionsReq) -> Result> { Ok(crate::cmd_workspace_actions(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_call_workspace_action(ctx: ClientCtx, req: CmdCallWorkspaceActionReq) -> Result<()> { Ok(crate::cmd_call_workspace_action(ctx.window.clone(), req.req, ctx.window.app_handle().state::()).await?) } async fn cmd_folder_actions(ctx: ClientCtx, _req: CmdFolderActionsReq) -> Result> { Ok(crate::cmd_folder_actions(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_call_folder_action(ctx: ClientCtx, req: CmdCallFolderActionReq) -> Result<()> { Ok(crate::cmd_call_folder_action(ctx.window.clone(), req.req, ctx.window.app_handle().state::()).await?) } async fn cmd_grpc_request_actions(ctx: ClientCtx, _req: CmdGrpcRequestActionsReq) -> Result> { Ok(crate::cmd_grpc_request_actions(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_template_function_summaries(ctx: ClientCtx, _req: CmdTemplateFunctionSummariesReq) -> Result> { Ok(crate::cmd_template_function_summaries(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_template_function_config(ctx: ClientCtx, req: CmdTemplateFunctionConfigReq) -> Result { Ok(crate::cmd_template_function_config(ctx.window.clone(), ctx.window.app_handle().state::(), &req.function_name, req.values, req.model, req.environment_id.as_deref()).await?) } async fn cmd_get_http_authentication_summaries(ctx: ClientCtx, _req: CmdGetHttpAuthenticationSummariesReq) -> Result> { Ok(crate::cmd_get_http_authentication_summaries(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_get_http_authentication_config(ctx: ClientCtx, req: CmdGetHttpAuthenticationConfigReq) -> Result { Ok(crate::cmd_get_http_authentication_config(ctx.window.clone(), ctx.window.app_handle().clone(), ctx.window.app_handle().state::(), ctx.window.app_handle().state::(), &req.auth_name, req.values, req.model, req.environment_id.as_deref()).await?) } async fn cmd_call_http_request_action(ctx: ClientCtx, req: CmdCallHttpRequestActionReq) -> Result<()> { Ok(crate::cmd_call_http_request_action(ctx.window.clone(), req.req, ctx.window.app_handle().state::()).await?) } async fn cmd_call_grpc_request_action(ctx: ClientCtx, req: CmdCallGrpcRequestActionReq) -> Result<()> { Ok(crate::cmd_call_grpc_request_action(ctx.window.clone(), req.req, ctx.window.app_handle().state::()).await?) } async fn cmd_call_http_authentication_action(ctx: ClientCtx, req: CmdCallHttpAuthenticationActionReq) -> Result<()> { Ok(crate::cmd_call_http_authentication_action(ctx.window.clone(), ctx.window.app_handle().clone(), ctx.window.app_handle().state::(), ctx.window.app_handle().state::(), &req.auth_name, req.action_index, req.values, req.model, req.environment_id.as_deref()).await?) } async fn cmd_curl_to_request(ctx: ClientCtx, req: CmdCurlToRequestReq) -> Result { Ok(crate::cmd_curl_to_request(ctx.window.clone(), &req.command, ctx.window.app_handle().state::(), &req.workspace_id).await?) } async fn cmd_export_data(ctx: ClientCtx, req: CmdExportDataReq) -> Result<()> { Ok(crate::cmd_export_data(ctx.window.app_handle().clone(), &req.export_path, req.workspace_ids.iter().map(|s| s.as_str()).collect(), req.include_private_environments).await?) } async fn cmd_save_base64_to_binary(ctx: ClientCtx, req: CmdSaveBase64ToBinaryReq) -> Result<()> { Ok(crate::cmd_save_base64_to_binary(ctx.window.app_handle().clone(), &req.filepath, &req.data).await?) } async fn cmd_save_response(ctx: ClientCtx, req: CmdSaveResponseReq) -> Result<()> { Ok(crate::cmd_save_response(ctx.window.app_handle().clone(), &req.response_id, &req.filepath).await?) } async fn cmd_send_http_request(ctx: ClientCtx, req: CmdSendHttpRequestReq) -> Result { Ok(crate::cmd_send_http_request(ctx.window.app_handle().clone(), ctx.window.clone(), req.environment_id.as_deref(), req.cookie_jar_id.as_deref(), req.request_id).await?) } async fn cmd_reload_plugins(ctx: ClientCtx, _req: CmdReloadPluginsReq) -> Result> { Ok(crate::cmd_reload_plugins(ctx.window.app_handle().clone(), ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_plugin_info(ctx: ClientCtx, req: CmdPluginInfoReq) -> Result { Ok(crate::cmd_plugin_info(&req.id, ctx.window.app_handle().clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_delete_all_grpc_connections(ctx: ClientCtx, req: CmdDeleteAllGrpcConnectionsReq) -> Result<()> { Ok(crate::cmd_delete_all_grpc_connections(&req.request_id, ctx.window.app_handle().clone(), ctx.window.clone()).await?) } async fn cmd_delete_send_history(ctx: ClientCtx, req: CmdDeleteSendHistoryReq) -> Result<()> { Ok(crate::cmd_delete_send_history(&req.workspace_id, ctx.window.app_handle().clone(), ctx.window.clone()).await?) } async fn cmd_delete_all_http_responses(ctx: ClientCtx, req: CmdDeleteAllHttpResponsesReq) -> Result<()> { Ok(crate::cmd_delete_all_http_responses(&req.request_id, ctx.window.app_handle().clone(), ctx.window.clone()).await?) } async fn cmd_get_workspace_meta(ctx: ClientCtx, req: CmdGetWorkspaceMetaReq) -> Result { Ok(crate::cmd_get_workspace_meta(ctx.window.app_handle().clone(), &req.workspace_id).await?) } async fn cmd_new_child_window(ctx: ClientCtx, req: CmdNewChildWindowReq) -> Result<()> { Ok(crate::cmd_new_child_window(ctx.window.clone(), &req.url, &req.label, &req.title, req.inner_size).await?) } async fn cmd_new_main_window(ctx: ClientCtx, req: CmdNewMainWindowReq) -> Result<()> { Ok(crate::cmd_new_main_window(ctx.window.app_handle().clone(), &req.url).await?) } async fn cmd_check_for_updates(ctx: ClientCtx, _req: CmdCheckForUpdatesReq) -> Result { Ok(crate::cmd_check_for_updates(ctx.window.clone(), ctx.window.app_handle().state::>()).await?) } async fn cmd_decrypt_template(ctx: ClientCtx, req: CmdDecryptTemplateReq) -> Result { Ok(crate::commands::cmd_decrypt_template(ctx.window.clone(), &req.template).await?) } async fn cmd_secure_template(ctx: ClientCtx, req: CmdSecureTemplateReq) -> Result { Ok(crate::commands::cmd_secure_template(ctx.window.app_handle().clone(), ctx.window.clone(), &req.template).await?) } async fn cmd_get_themes(ctx: ClientCtx, _req: CmdGetThemesReq) -> Result> { Ok(crate::commands::cmd_get_themes(ctx.window.clone(), ctx.window.app_handle().state::()).await?) } async fn cmd_enable_encryption(ctx: ClientCtx, req: CmdEnableEncryptionReq) -> Result<()> { Ok(crate::commands::cmd_enable_encryption(ctx.window.clone(), &req.workspace_id).await?) } async fn cmd_reveal_workspace_key(ctx: ClientCtx, req: CmdRevealWorkspaceKeyReq) -> Result { Ok(crate::commands::cmd_reveal_workspace_key(ctx.window.clone(), &req.workspace_id).await?) } async fn cmd_set_workspace_key(ctx: ClientCtx, req: CmdSetWorkspaceKeyReq) -> Result<()> { Ok(crate::commands::cmd_set_workspace_key(ctx.window.clone(), &req.workspace_id, &req.key).await?) } async fn cmd_disable_encryption(ctx: ClientCtx, req: CmdDisableEncryptionReq) -> Result<()> { Ok(crate::commands::cmd_disable_encryption(ctx.window.clone(), &req.workspace_id).await?) } async fn cmd_default_headers(_ctx: ClientCtx, _req: CmdDefaultHeadersReq) -> Result> { Ok(crate::commands::cmd_default_headers()) } async fn models_upsert(ctx: ClientCtx, req: ModelsUpsertReq) -> Result { Ok(crate::models_ext::models_upsert(ctx.window.clone(), req.model)?) } async fn models_delete(ctx: ClientCtx, req: ModelsDeleteReq) -> Result { Ok(crate::models_ext::models_delete(ctx.window.clone(), req.model).await?) } async fn models_duplicate(ctx: ClientCtx, req: ModelsDuplicateReq) -> Result { Ok(crate::models_ext::models_duplicate(ctx.window.clone(), req.model_type, req.model_id)?) } async fn models_websocket_events(ctx: ClientCtx, req: ModelsWebsocketEventsReq) -> Result> { Ok(crate::models_ext::models_websocket_events(ctx.window.app_handle().clone(), &req.connection_id)?) } async fn models_grpc_events(ctx: ClientCtx, req: ModelsGrpcEventsReq) -> Result> { Ok(crate::models_ext::models_grpc_events(ctx.window.app_handle().clone(), &req.connection_id)?) } async fn models_get_settings(ctx: ClientCtx, _req: ModelsGetSettingsReq) -> Result { Ok(crate::models_ext::models_get_settings(ctx.window.app_handle().clone())?) } async fn models_get_graphql_introspection(ctx: ClientCtx, req: ModelsGetGraphqlIntrospectionReq) -> Result> { Ok(crate::models_ext::models_get_graphql_introspection(ctx.window.app_handle().clone(), &req.request_id)?) } async fn models_upsert_graphql_introspection(ctx: ClientCtx, req: ModelsUpsertGraphqlIntrospectionReq) -> Result { Ok(crate::models_ext::models_upsert_graphql_introspection(ctx.window.app_handle().clone(), &req.request_id, &req.workspace_id, req.content, ctx.window.clone())?) } async fn models_workspace_models(ctx: ClientCtx, req: ModelsWorkspaceModelsReq) -> Result { Ok(crate::models_ext::models_workspace_models(ctx.window.clone(), req.workspace_id.as_deref(), ctx.window.app_handle().state::()).await?) } async fn cmd_git_checkout(_ctx: ClientCtx, req: CmdGitCheckoutReq) -> Result { Ok(crate::git_ext::cmd_git_checkout(&req.dir, &req.branch, req.force).await?) } async fn cmd_git_branch(_ctx: ClientCtx, req: CmdGitBranchReq) -> Result<()> { Ok(crate::git_ext::cmd_git_branch(&req.dir, &req.branch, req.base.as_deref()).await?) } async fn cmd_git_delete_branch(_ctx: ClientCtx, req: CmdGitDeleteBranchReq) -> Result { Ok(crate::git_ext::cmd_git_delete_branch(&req.dir, &req.branch, req.force).await?) } async fn cmd_git_delete_remote_branch(_ctx: ClientCtx, req: CmdGitDeleteRemoteBranchReq) -> Result<()> { Ok(crate::git_ext::cmd_git_delete_remote_branch(&req.dir, &req.branch).await?) } async fn cmd_git_merge_branch(_ctx: ClientCtx, req: CmdGitMergeBranchReq) -> Result<()> { Ok(crate::git_ext::cmd_git_merge_branch(&req.dir, &req.branch).await?) } async fn cmd_git_rename_branch(_ctx: ClientCtx, req: CmdGitRenameBranchReq) -> Result<()> { Ok(crate::git_ext::cmd_git_rename_branch(&req.dir, &req.old_name, &req.new_name).await?) } async fn cmd_git_status(_ctx: ClientCtx, req: CmdGitStatusReq) -> Result { Ok(crate::git_ext::cmd_git_status(&req.dir).await?) } async fn cmd_git_branch_info(_ctx: ClientCtx, req: CmdGitBranchInfoReq) -> Result { Ok(crate::git_ext::cmd_git_branch_info(&req.dir).await?) } async fn cmd_git_worktree_status(_ctx: ClientCtx, req: CmdGitWorktreeStatusReq) -> Result { Ok(crate::git_ext::cmd_git_worktree_status(&req.dir).await?) } async fn cmd_git_log(_ctx: ClientCtx, req: CmdGitLogReq) -> Result> { Ok(crate::git_ext::cmd_git_log(&req.dir).await?) } async fn cmd_git_log_for_file(_ctx: ClientCtx, req: CmdGitLogForFileReq) -> Result> { Ok(crate::git_ext::cmd_git_log_for_file(&req.dir, req.rela_path).await?) } async fn cmd_git_file_diff_for_commit(_ctx: ClientCtx, req: CmdGitFileDiffForCommitReq) -> Result { Ok(crate::git_ext::cmd_git_file_diff_for_commit(&req.dir, &req.commit_oid, req.rela_path).await?) } async fn cmd_git_initialize(_ctx: ClientCtx, req: CmdGitInitializeReq) -> Result<()> { Ok(crate::git_ext::cmd_git_initialize(&req.dir).await?) } async fn cmd_git_clone(_ctx: ClientCtx, req: CmdGitCloneReq) -> Result { Ok(crate::git_ext::cmd_git_clone(&req.url, &req.dir).await?) } async fn cmd_git_commit(_ctx: ClientCtx, req: CmdGitCommitReq) -> Result<()> { Ok(crate::git_ext::cmd_git_commit(&req.dir, &req.message).await?) } async fn cmd_git_fetch_all(_ctx: ClientCtx, req: CmdGitFetchAllReq) -> Result<()> { Ok(crate::git_ext::cmd_git_fetch_all(&req.dir).await?) } async fn cmd_git_push(_ctx: ClientCtx, req: CmdGitPushReq) -> Result { Ok(crate::git_ext::cmd_git_push(&req.dir).await?) } async fn cmd_git_pull(_ctx: ClientCtx, req: CmdGitPullReq) -> Result { Ok(crate::git_ext::cmd_git_pull(&req.dir).await?) } async fn cmd_git_pull_force_reset(_ctx: ClientCtx, req: CmdGitPullForceResetReq) -> Result { Ok(crate::git_ext::cmd_git_pull_force_reset(&req.dir, &req.remote, &req.branch).await?) } async fn cmd_git_pull_merge(_ctx: ClientCtx, req: CmdGitPullMergeReq) -> Result { Ok(crate::git_ext::cmd_git_pull_merge(&req.dir, &req.remote, &req.branch).await?) } async fn cmd_git_add(_ctx: ClientCtx, req: CmdGitAddReq) -> Result<()> { Ok(crate::git_ext::cmd_git_add(&req.dir, req.rela_paths).await?) } async fn cmd_git_unstage(_ctx: ClientCtx, req: CmdGitUnstageReq) -> Result<()> { Ok(crate::git_ext::cmd_git_unstage(&req.dir, req.rela_paths).await?) } async fn cmd_git_reset_changes(_ctx: ClientCtx, req: CmdGitResetChangesReq) -> Result<()> { Ok(crate::git_ext::cmd_git_reset_changes(&req.dir).await?) } async fn cmd_git_restore_files(_ctx: ClientCtx, req: CmdGitRestoreFilesReq) -> Result<()> { Ok(crate::git_ext::cmd_git_restore_files(&req.dir, req.rela_paths).await?) } async fn cmd_git_restore_file_from_commit(_ctx: ClientCtx, req: CmdGitRestoreFileFromCommitReq) -> Result<()> { Ok(crate::git_ext::cmd_git_restore_file_from_commit(&req.dir, &req.commit_oid, req.rela_path).await?) } async fn cmd_git_add_credential(_ctx: ClientCtx, req: CmdGitAddCredentialReq) -> Result<()> { Ok(crate::git_ext::cmd_git_add_credential(&req.remote_url, &req.username, &req.password).await?) } async fn cmd_git_remotes(_ctx: ClientCtx, req: CmdGitRemotesReq) -> Result> { Ok(crate::git_ext::cmd_git_remotes(&req.dir).await?) } async fn cmd_git_add_remote(_ctx: ClientCtx, req: CmdGitAddRemoteReq) -> Result { Ok(crate::git_ext::cmd_git_add_remote(&req.dir, &req.name, &req.url).await?) } async fn cmd_git_rm_remote(_ctx: ClientCtx, req: CmdGitRmRemoteReq) -> Result<()> { Ok(crate::git_ext::cmd_git_rm_remote(&req.dir, &req.name).await?) } async fn cmd_sync_calculate(ctx: ClientCtx, req: CmdSyncCalculateReq) -> Result> { Ok(crate::sync_ext::cmd_sync_calculate(ctx.window.app_handle().clone(), &req.workspace_id, &req.sync_dir).await?) } async fn cmd_sync_calculate_fs(_ctx: ClientCtx, req: CmdSyncCalculateFsReq) -> Result> { Ok(crate::sync_ext::cmd_sync_calculate_fs(&req.dir).await?) } async fn cmd_sync_apply(ctx: ClientCtx, req: CmdSyncApplyReq) -> Result<()> { Ok(crate::sync_ext::cmd_sync_apply(ctx.window.app_handle().clone(), req.sync_ops, &req.sync_dir, &req.workspace_id).await?) } async fn cmd_ws_delete_connections(ctx: ClientCtx, req: CmdWsDeleteConnectionsReq) -> Result<()> { Ok(crate::ws_ext::cmd_ws_delete_connections(&req.request_id, ctx.window.app_handle().clone(), ctx.window.clone()).await?) } async fn cmd_ws_send(ctx: ClientCtx, req: CmdWsSendReq) -> Result { Ok(crate::ws_ext::cmd_ws_send(&req.connection_id, req.environment_id.as_deref(), ctx.window.app_handle().clone(), ctx.window.clone(), ctx.window.app_handle().state::>()).await?) } async fn cmd_ws_close(ctx: ClientCtx, req: CmdWsCloseReq) -> Result { Ok(crate::ws_ext::cmd_ws_close(&req.connection_id, ctx.window.app_handle().clone(), ctx.window.clone(), ctx.window.app_handle().state::>()).await?) } async fn cmd_ws_connect(ctx: ClientCtx, req: CmdWsConnectReq) -> Result { Ok(crate::ws_ext::cmd_ws_connect(&req.request_id, req.environment_id.as_deref(), req.cookie_jar_id.as_deref(), ctx.window.app_handle().clone(), ctx.window.clone(), ctx.window.app_handle().state::(), ctx.window.app_handle().state::>()).await?) } async fn cmd_plugins_search(ctx: ClientCtx, req: CmdPluginsSearchReq) -> Result { Ok(crate::plugins_ext::cmd_plugins_search(ctx.window.app_handle().clone(), &req.query).await?) } async fn cmd_plugins_install(ctx: ClientCtx, req: CmdPluginsInstallReq) -> Result<()> { Ok(crate::plugins_ext::cmd_plugins_install(ctx.window.clone(), &req.name, req.version).await?) } async fn cmd_plugins_install_from_directory(ctx: ClientCtx, req: CmdPluginsInstallFromDirectoryReq) -> Result { Ok(crate::plugins_ext::cmd_plugins_install_from_directory(ctx.window.clone(), &req.directory).await?) } async fn cmd_plugins_uninstall(ctx: ClientCtx, req: CmdPluginsUninstallReq) -> Result { Ok(crate::plugins_ext::cmd_plugins_uninstall(&req.plugin_id, ctx.window.clone()).await?) } async fn cmd_plugin_init_errors(ctx: ClientCtx, _req: CmdPluginInitErrorsReq) -> Result> { Ok(crate::plugins_ext::cmd_plugin_init_errors(ctx.window.app_handle().state::()).await?) } async fn cmd_plugins_updates(ctx: ClientCtx, _req: CmdPluginsUpdatesReq) -> Result { Ok(crate::plugins_ext::cmd_plugins_updates(ctx.window.app_handle().clone()).await?) } async fn cmd_plugins_update_all(ctx: ClientCtx, _req: CmdPluginsUpdateAllReq) -> Result> { Ok(crate::plugins_ext::cmd_plugins_update_all(ctx.window.clone()).await?) } rpc_commands! { cmd_metadata(CmdMetadataReq) -> AppMetaData, cmd_template_tokens_to_string(CmdTemplateTokensToStringReq) -> String, cmd_render_template(CmdRenderTemplateReq) -> String, cmd_send_feedback(CmdSendFeedbackReq) -> (), cmd_dismiss_notification(CmdDismissNotificationReq) -> (), cmd_grpc_reflect(CmdGrpcReflectReq) -> Vec, cmd_grpc_go(CmdGrpcGoReq) -> String, cmd_restart(CmdRestartReq) -> (), cmd_send_ephemeral_request(CmdSendEphemeralRequestReq) -> HttpResponse, cmd_format_json(CmdFormatJsonReq) -> String, cmd_format_graphql(CmdFormatGraphqlReq) -> String, cmd_http_response_body(CmdHttpResponseBodyReq) -> FilterResponse, cmd_http_response_body_path(CmdHttpResponseBodyPathReq) -> Option, cmd_http_request_body(CmdHttpRequestBodyReq) -> Option>, cmd_get_sse_events(CmdGetSseEventsReq) -> Vec, cmd_get_http_response_events(CmdGetHttpResponseEventsReq) -> Vec, cmd_import_data(CmdImportDataReq) -> BatchUpsertResult, cmd_http_request_actions(CmdHttpRequestActionsReq) -> Vec, cmd_websocket_request_actions(CmdWebsocketRequestActionsReq) -> Vec, cmd_call_websocket_request_action(CmdCallWebsocketRequestActionReq) -> (), cmd_workspace_actions(CmdWorkspaceActionsReq) -> Vec, cmd_call_workspace_action(CmdCallWorkspaceActionReq) -> (), cmd_folder_actions(CmdFolderActionsReq) -> Vec, cmd_call_folder_action(CmdCallFolderActionReq) -> (), cmd_grpc_request_actions(CmdGrpcRequestActionsReq) -> Vec, cmd_template_function_summaries(CmdTemplateFunctionSummariesReq) -> Vec, cmd_template_function_config(CmdTemplateFunctionConfigReq) -> GetTemplateFunctionConfigResponse, cmd_get_http_authentication_summaries(CmdGetHttpAuthenticationSummariesReq) -> Vec, cmd_get_http_authentication_config(CmdGetHttpAuthenticationConfigReq) -> GetHttpAuthenticationConfigResponse, cmd_call_http_request_action(CmdCallHttpRequestActionReq) -> (), cmd_call_grpc_request_action(CmdCallGrpcRequestActionReq) -> (), cmd_call_http_authentication_action(CmdCallHttpAuthenticationActionReq) -> (), cmd_curl_to_request(CmdCurlToRequestReq) -> HttpRequest, cmd_export_data(CmdExportDataReq) -> (), cmd_save_base64_to_binary(CmdSaveBase64ToBinaryReq) -> (), cmd_save_response(CmdSaveResponseReq) -> (), cmd_send_http_request(CmdSendHttpRequestReq) -> HttpResponse, cmd_reload_plugins(CmdReloadPluginsReq) -> Vec<(String, String)>, cmd_plugin_info(CmdPluginInfoReq) -> PluginMetadata, cmd_delete_all_grpc_connections(CmdDeleteAllGrpcConnectionsReq) -> (), cmd_delete_send_history(CmdDeleteSendHistoryReq) -> (), cmd_delete_all_http_responses(CmdDeleteAllHttpResponsesReq) -> (), cmd_get_workspace_meta(CmdGetWorkspaceMetaReq) -> WorkspaceMeta, cmd_new_child_window(CmdNewChildWindowReq) -> (), cmd_new_main_window(CmdNewMainWindowReq) -> (), cmd_check_for_updates(CmdCheckForUpdatesReq) -> bool, cmd_decrypt_template(CmdDecryptTemplateReq) -> String, cmd_secure_template(CmdSecureTemplateReq) -> String, cmd_get_themes(CmdGetThemesReq) -> Vec, cmd_enable_encryption(CmdEnableEncryptionReq) -> (), cmd_reveal_workspace_key(CmdRevealWorkspaceKeyReq) -> String, cmd_set_workspace_key(CmdSetWorkspaceKeyReq) -> (), cmd_disable_encryption(CmdDisableEncryptionReq) -> (), cmd_default_headers(CmdDefaultHeadersReq) -> Vec, models_upsert(ModelsUpsertReq) -> String, models_delete(ModelsDeleteReq) -> String, models_duplicate(ModelsDuplicateReq) -> String, models_websocket_events(ModelsWebsocketEventsReq) -> Vec, models_grpc_events(ModelsGrpcEventsReq) -> Vec, models_get_settings(ModelsGetSettingsReq) -> Settings, models_get_graphql_introspection(ModelsGetGraphqlIntrospectionReq) -> Option, models_upsert_graphql_introspection(ModelsUpsertGraphqlIntrospectionReq) -> GraphQlIntrospection, models_workspace_models(ModelsWorkspaceModelsReq) -> String, cmd_git_checkout(CmdGitCheckoutReq) -> String, cmd_git_branch(CmdGitBranchReq) -> (), cmd_git_delete_branch(CmdGitDeleteBranchReq) -> BranchDeleteResult, cmd_git_delete_remote_branch(CmdGitDeleteRemoteBranchReq) -> (), cmd_git_merge_branch(CmdGitMergeBranchReq) -> (), cmd_git_rename_branch(CmdGitRenameBranchReq) -> (), cmd_git_status(CmdGitStatusReq) -> GitStatusSummary, cmd_git_branch_info(CmdGitBranchInfoReq) -> GitBranchInfo, cmd_git_worktree_status(CmdGitWorktreeStatusReq) -> GitWorktreeStatus, cmd_git_log(CmdGitLogReq) -> Vec, cmd_git_log_for_file(CmdGitLogForFileReq) -> Vec, cmd_git_file_diff_for_commit(CmdGitFileDiffForCommitReq) -> GitFileDiff, cmd_git_initialize(CmdGitInitializeReq) -> (), cmd_git_clone(CmdGitCloneReq) -> CloneResult, cmd_git_commit(CmdGitCommitReq) -> (), cmd_git_fetch_all(CmdGitFetchAllReq) -> (), cmd_git_push(CmdGitPushReq) -> PushResult, cmd_git_pull(CmdGitPullReq) -> PullResult, cmd_git_pull_force_reset(CmdGitPullForceResetReq) -> PullResult, cmd_git_pull_merge(CmdGitPullMergeReq) -> PullResult, cmd_git_add(CmdGitAddReq) -> (), cmd_git_unstage(CmdGitUnstageReq) -> (), cmd_git_reset_changes(CmdGitResetChangesReq) -> (), cmd_git_restore_files(CmdGitRestoreFilesReq) -> (), cmd_git_restore_file_from_commit(CmdGitRestoreFileFromCommitReq) -> (), cmd_git_add_credential(CmdGitAddCredentialReq) -> (), cmd_git_remotes(CmdGitRemotesReq) -> Vec, cmd_git_add_remote(CmdGitAddRemoteReq) -> GitRemote, cmd_git_rm_remote(CmdGitRmRemoteReq) -> (), cmd_sync_calculate(CmdSyncCalculateReq) -> Vec, cmd_sync_calculate_fs(CmdSyncCalculateFsReq) -> Vec, cmd_sync_apply(CmdSyncApplyReq) -> (), cmd_ws_delete_connections(CmdWsDeleteConnectionsReq) -> (), cmd_ws_send(CmdWsSendReq) -> WebsocketConnection, cmd_ws_close(CmdWsCloseReq) -> WebsocketConnection, cmd_ws_connect(CmdWsConnectReq) -> WebsocketConnection, cmd_plugins_search(CmdPluginsSearchReq) -> PluginSearchResponse, cmd_plugins_install(CmdPluginsInstallReq) -> (), cmd_plugins_install_from_directory(CmdPluginsInstallFromDirectoryReq) -> Plugin, cmd_plugins_uninstall(CmdPluginsUninstallReq) -> Plugin, cmd_plugin_init_errors(CmdPluginInitErrorsReq) -> Vec<(String, String)>, cmd_plugins_updates(CmdPluginsUpdatesReq) -> PluginUpdatesResponse, cmd_plugins_update_all(CmdPluginsUpdateAllReq) -> Vec, cmd_git_watch_worktree_status(CmdGitWatchWorktreeStatusReq) -> GitWatchResult, cmd_sync_watch(CmdSyncWatchReq) -> WatchResult, }