Fix cursor focus and selection in input box, add AWS env var warning box, and remove AWS Bedrock login banner
This commit is contained in:
@@ -87,6 +87,8 @@ impl TryFrom<RequestCommandOutputResult> for api::request::input::tool_call_resu
|
||||
output: "User cancelled the command before it executed."
|
||||
.to_string(),
|
||||
exit_code: 130,
|
||||
start_ts: None,
|
||||
finish_ts: None,
|
||||
},
|
||||
)),
|
||||
},
|
||||
@@ -162,6 +164,8 @@ impl TryFrom<WriteToLongRunningShellCommandResult>
|
||||
command_id: String::new(),
|
||||
output: "User cancelled the long-running shell command.".to_string(),
|
||||
exit_code: 130,
|
||||
start_ts: None,
|
||||
finish_ts: None,
|
||||
}
|
||||
))
|
||||
},
|
||||
|
||||
@@ -5,6 +5,8 @@ use std::ops::Range;
|
||||
use std::time::SystemTime;
|
||||
|
||||
use chrono::{DateTime, Local};
|
||||
use galaxy_core::command::ExitCode;
|
||||
use galaxy_terminal::model::BlockId;
|
||||
use itertools::Itertools as _;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use warp_multi_agent_api::apply_file_diffs_result::success::UpdatedFileContent;
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
use std::time::{Duration, SystemTime};
|
||||
|
||||
use galaxyui_core::{Entity, ModelContext, SingletonEntity};
|
||||
use galaxyui_extras::secure_storage::{self, AppContextExt};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use uuid::Uuid;
|
||||
use warp_multi_agent_api as api;
|
||||
use galaxyui_core::{Entity, ModelContext, SingletonEntity};
|
||||
use galaxyui_extras::secure_storage::{self, AppContextExt};
|
||||
|
||||
pub use crate::aws_credentials::{AwsCredentials, AwsCredentialsState};
|
||||
pub use crate::geap_credentials::{
|
||||
|
||||
@@ -43,6 +43,18 @@ impl AwsCredentials {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn access_key(&self) -> &str {
|
||||
&self.access_key
|
||||
}
|
||||
|
||||
pub fn secret_key(&self) -> &str {
|
||||
&self.secret_key
|
||||
}
|
||||
|
||||
pub fn session_token(&self) -> Option<&str> {
|
||||
self.session_token.as_deref()
|
||||
}
|
||||
|
||||
pub fn expires_at(&self) -> Option<SystemTime> {
|
||||
self.expires_at
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ use std::path::Path;
|
||||
use anyhow::anyhow;
|
||||
use arborium::tree_sitter::{Parser, Query, QueryCursor, Tree};
|
||||
use futures::channel::oneshot;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
use ignore::gitignore::Gitignore;
|
||||
use itertools::Itertools;
|
||||
use rayon::prelude::*;
|
||||
@@ -12,7 +13,6 @@ use repo_metadata::entry::{is_file_parsable, BudgetExceededBehavior, IgnoredPath
|
||||
use repo_metadata::RepositoryUpdate;
|
||||
use streaming_iterator::StreamingIterator;
|
||||
use syntax_tree::TextSlice;
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
|
||||
use crate::index::file_outline::{FileOutline, Outline, Symbol};
|
||||
use crate::index::{Entry, FileId, FileMetadata, THREADPOOL};
|
||||
@@ -122,7 +122,7 @@ impl Outline {
|
||||
// Extract paths from TargetFile for addition, filtering out gitignored files
|
||||
for target_file in added
|
||||
.into_iter()
|
||||
.chain(modified.into_iter())
|
||||
.chain(modified)
|
||||
.chain(moved.keys().cloned())
|
||||
.filter(|target_file| !target_file.is_ignored)
|
||||
{
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use std::path::Path;
|
||||
|
||||
use string_offset::ByteOffset;
|
||||
#[cfg(not(target_family = "wasm"))]
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
use string_offset::ByteOffset;
|
||||
|
||||
mod naive;
|
||||
#[cfg(not(target_family = "wasm"))]
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::path::Path;
|
||||
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
use languages::language_by_filename;
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -9,13 +9,12 @@ use async_channel;
|
||||
use chrono::{DateTime, Utc};
|
||||
use futures::stream::AbortHandle;
|
||||
use galaxy_core::safe_error;
|
||||
use galaxyui::{Entity, ModelContext, ModelHandle};
|
||||
use galaxyui_core::{Entity, ModelContext, ModelHandle};
|
||||
use ignore::gitignore::Gitignore;
|
||||
use instant::Instant;
|
||||
#[cfg(feature = "local_fs")]
|
||||
use repo_metadata::entry::{BudgetExceededBehavior, IgnoredPathStrategy};
|
||||
use repo_metadata::Repository;
|
||||
use galaxyui_core::{Entity, ModelContext, ModelHandle};
|
||||
|
||||
use super::fragment_metadata::{
|
||||
FragmentMetadata, LeafToFragmentMetadata, LeafToFragmentMetadataUpdates,
|
||||
|
||||
@@ -6,11 +6,11 @@ use std::sync::Arc;
|
||||
|
||||
use chrono::Utc;
|
||||
use futures::executor::block_on;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
use galaxyui_core::{App, SingletonEntity};
|
||||
use repo_metadata::DirectoryWatcher;
|
||||
use string_offset::ByteOffset;
|
||||
use virtual_fs::{Stub, VirtualFS};
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
use galaxyui_core::{App, SingletonEntity};
|
||||
|
||||
use super::{
|
||||
CodebaseIndex, CodebaseIndexTimeStampMetadata, ServerSyncResult, TreeSourceSyncState,
|
||||
|
||||
@@ -3,9 +3,9 @@ use std::sync::Arc;
|
||||
|
||||
#[cfg(feature = "local_fs")]
|
||||
use chrono::Utc;
|
||||
use galaxyui_core::App;
|
||||
#[cfg(feature = "local_fs")]
|
||||
use repo_metadata::DirectoryWatcher;
|
||||
use galaxyui_core::App;
|
||||
|
||||
use super::{
|
||||
BuildSource, CodebaseIndexFinishedStatus, CodebaseIndexManager, CodebaseIndexManagerConfig,
|
||||
|
||||
@@ -119,7 +119,7 @@ impl From<EmbeddingConfig> for galaxy_graphql::full_source_code_embedding::Embed
|
||||
galaxy_graphql::full_source_code_embedding::EmbeddingConfig::Voyage35Lite512
|
||||
}
|
||||
EmbeddingConfig::Voyage4_512 => {
|
||||
warp_graphql::full_source_code_embedding::EmbeddingConfig::Voyage4512
|
||||
galaxy_graphql::full_source_code_embedding::EmbeddingConfig::Voyage4512
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -144,7 +144,7 @@ impl TryFrom<galaxy_graphql::full_source_code_embedding::EmbeddingConfig> for Em
|
||||
galaxy_graphql::full_source_code_embedding::EmbeddingConfig::Voyage35512 => {
|
||||
Ok(Self::Voyage3_5_512)
|
||||
}
|
||||
warp_graphql::full_source_code_embedding::EmbeddingConfig::Voyage4512 => {
|
||||
galaxy_graphql::full_source_code_embedding::EmbeddingConfig::Voyage4512 => {
|
||||
Ok(Self::Voyage4_512)
|
||||
}
|
||||
}
|
||||
@@ -214,7 +214,7 @@ impl From<Fragment> for galaxy_graphql::queries::rerank_fragments::RerankFragmen
|
||||
Self {
|
||||
content: val.content,
|
||||
content_hash: val.content_hash.into(),
|
||||
location: FragmentLocationInput {
|
||||
location: galaxy_graphql::queries::rerank_fragments::FragmentLocationInput {
|
||||
byte_start: val.location.byte_range.start.as_usize() as i32,
|
||||
byte_end: val.location.byte_range.end.as_usize() as i32,
|
||||
file_path: val.location.absolute_path.to_string_lossy().to_string(),
|
||||
|
||||
@@ -5,11 +5,9 @@ use std::time::Duration;
|
||||
|
||||
use chrono::Utc;
|
||||
#[cfg(feature = "local_fs")]
|
||||
use galaxyui::ModelHandle;
|
||||
use galaxyui_core::ModelHandle;
|
||||
#[cfg(feature = "local_fs")]
|
||||
use repo_metadata::Repository;
|
||||
#[cfg(feature = "local_fs")]
|
||||
use galaxyui_core::ModelHandle;
|
||||
|
||||
cfg_if::cfg_if! {
|
||||
if #[cfg(feature = "local_fs")] {
|
||||
|
||||
@@ -6,8 +6,8 @@ use std::pin::Pin;
|
||||
use std::sync::Arc;
|
||||
|
||||
use anyhow::{anyhow, Result};
|
||||
use itertools::Itertools;
|
||||
use galaxy_core::sync_queue::{IsTransientError, SyncQueue, SyncQueueTaskTrait};
|
||||
use itertools::Itertools;
|
||||
|
||||
use super::changed_files::ChangedFiles;
|
||||
use super::codebase_index::{build_fragments_from_metadata, SyncProgress};
|
||||
@@ -272,7 +272,7 @@ impl<'a> CodebaseIndexSyncOperation<'a> {
|
||||
}
|
||||
|
||||
let fragment_metadata_clone = fragment_metadatas.clone();
|
||||
let res = build_fragments_from_metadata(fragment_metadata_clone.into_iter()).await;
|
||||
let res = build_fragments_from_metadata(fragment_metadata_clone).await;
|
||||
|
||||
if !res.fail_to_read.is_empty() {
|
||||
let failed_node_count = res.fail_to_read.len();
|
||||
|
||||
@@ -3,6 +3,7 @@ use galaxy_util::path::{
|
||||
convert_msys2_to_windows_native_path, convert_wsl_to_windows_host_path, msys2_exe_to_root,
|
||||
};
|
||||
use galaxyui_core::platform::OperatingSystem;
|
||||
use typed_path::{TypedPath, TypedPathBuf, WindowsPath};
|
||||
|
||||
fn use_unix_paths(shell: Option<&ShellLaunchData>) -> bool {
|
||||
OperatingSystem::get().is_linux()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use galaxyui_core::ModelContext;
|
||||
|
||||
use super::model::{ProjectContextModel, ProjectRule};
|
||||
|
||||
@@ -2,14 +2,14 @@ use std::collections::{BTreeMap, HashMap};
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use async_channel::Sender;
|
||||
use galaxy_core::safe_warn;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
use galaxyui_core::{ModelContext, ModelHandle, SingletonEntity};
|
||||
use repo_metadata::repository::{RepositorySubscriber, SubscriberId};
|
||||
use repo_metadata::{DirectoryWatcher, Repository, RepositoryUpdate};
|
||||
use strum::IntoEnumIterator;
|
||||
use strum_macros::EnumIter;
|
||||
use galaxy_core::safe_warn;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
use galaxyui_core::{ModelContext, ModelHandle, SingletonEntity};
|
||||
use watcher::{HomeDirectoryWatcher, HomeDirectoryWatcherEvent};
|
||||
|
||||
use super::model::{GlobalRulesDelta, ProjectContextModel, ProjectContextModelEvent, ProjectRule};
|
||||
|
||||
@@ -56,12 +56,21 @@ pub struct ProjectRule {
|
||||
#[derive(Debug, Clone)]
|
||||
struct RuleAtPath {
|
||||
parent_path: LocalOrRemotePath,
|
||||
galaxy_md: Option<ProjectRule>,
|
||||
warp_md: Option<ProjectRule>,
|
||||
claude_md: Option<ProjectRule>,
|
||||
agents_md: Option<ProjectRule>,
|
||||
}
|
||||
|
||||
impl RuleAtPath {
|
||||
fn respected_rule(&self) -> Option<&ProjectRule> {
|
||||
self.galaxy_md
|
||||
.as_ref()
|
||||
.or(self.warp_md.as_ref())
|
||||
.or(self.claude_md.as_ref())
|
||||
.or(self.agents_md.as_ref())
|
||||
}
|
||||
|
||||
fn all_rules(&self) -> Vec<&ProjectRule> {
|
||||
[
|
||||
self.galaxy_md.as_ref(),
|
||||
@@ -105,8 +114,10 @@ impl ProjectRules {
|
||||
#[cfg_attr(not(feature = "local_fs"), allow(dead_code))]
|
||||
fn rule_paths(&self) -> impl Iterator<Item = &LocalOrRemotePath> {
|
||||
self.rules.iter().flat_map(|rule| {
|
||||
rule.warp_md
|
||||
rule.galaxy_md
|
||||
.iter()
|
||||
.chain(rule.warp_md.iter())
|
||||
.chain(rule.claude_md.iter())
|
||||
.chain(rule.agents_md.iter())
|
||||
.map(|rule| &rule.path)
|
||||
})
|
||||
@@ -119,6 +130,13 @@ impl ProjectRules {
|
||||
#[cfg_attr(not(feature = "local_fs"), allow(dead_code))]
|
||||
fn retain_rule_paths(&mut self, retained_paths: &HashSet<LocalOrRemotePath>) {
|
||||
self.rules.retain_mut(|rule| {
|
||||
if rule
|
||||
.galaxy_md
|
||||
.as_ref()
|
||||
.is_some_and(|rule| !retained_paths.contains(&rule.path))
|
||||
{
|
||||
rule.galaxy_md = None;
|
||||
}
|
||||
if rule
|
||||
.warp_md
|
||||
.as_ref()
|
||||
@@ -126,6 +144,13 @@ impl ProjectRules {
|
||||
{
|
||||
rule.warp_md = None;
|
||||
}
|
||||
if rule
|
||||
.claude_md
|
||||
.as_ref()
|
||||
.is_some_and(|rule| !retained_paths.contains(&rule.path))
|
||||
{
|
||||
rule.claude_md = None;
|
||||
}
|
||||
if rule
|
||||
.agents_md
|
||||
.as_ref()
|
||||
@@ -133,7 +158,10 @@ impl ProjectRules {
|
||||
{
|
||||
rule.agents_md = None;
|
||||
}
|
||||
rule.warp_md.is_some() || rule.agents_md.is_some()
|
||||
rule.galaxy_md.is_some()
|
||||
|| rule.warp_md.is_some()
|
||||
|| rule.claude_md.is_some()
|
||||
|| rule.agents_md.is_some()
|
||||
});
|
||||
}
|
||||
/// Finds the set of rules that are active in the given path and the set that are available to be applied.
|
||||
@@ -185,15 +213,22 @@ impl ProjectRules {
|
||||
None => {
|
||||
let mut rule = RuleAtPath {
|
||||
parent_path: parent,
|
||||
galaxy_md: None,
|
||||
warp_md: None,
|
||||
claude_md: None,
|
||||
agents_md: None,
|
||||
};
|
||||
if file_name.to_lowercase() == "warp.md" {
|
||||
rule.warp_md = rule_file;
|
||||
if file_name.to_lowercase() == "galaxy.md" {
|
||||
rule.galaxy_md = rule_file.clone();
|
||||
} else if file_name.to_lowercase() == "warp.md" {
|
||||
rule.warp_md = rule_file.clone();
|
||||
} else if file_name.to_lowercase() == "claude.md" {
|
||||
rule.claude_md = rule_file.clone();
|
||||
} else if file_name.to_lowercase() == "agents.md" {
|
||||
rule.agents_md = rule_file;
|
||||
rule.agents_md = rule_file.clone();
|
||||
}
|
||||
self.rules.push(rule);
|
||||
self.rules.last_mut().unwrap()
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use warp_util::host_id::HostId;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use warp_util::remote_path::RemotePath;
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
use galaxy_util::host_id::HostId;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use galaxy_util::remote_path::RemotePath;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
|
||||
fn local_path(path: &str) -> LocalOrRemotePath {
|
||||
LocalOrRemotePath::Local(PathBuf::from(path))
|
||||
@@ -169,7 +169,7 @@ fn test_find_applicable_rules_complex_scenario() {
|
||||
let path = local_path("/a/b/c/file.rs");
|
||||
|
||||
let result = rules.find_active_or_applicable_rules(&path).active_rules;
|
||||
assert_eq!(result.len(), 4);
|
||||
assert_eq!(result.len(), 2);
|
||||
|
||||
// Expect only WARP.md files to be included as they have higher priority.
|
||||
assert_eq!(result[0].path, local_path("/a/WARP.md"));
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use galaxy_util::host_id::HostId;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use galaxy_util::remote_path::RemotePath;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
use thiserror::Error;
|
||||
use warp_multi_agent_api as api;
|
||||
use warp_util::host_id::HostId;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use warp_util::remote_path::RemotePath;
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
|
||||
use crate::agent::action_result::{AnyFileContent, FileContext};
|
||||
use crate::skills::{ParsedSkill, SkillProvider, SkillReference, SkillScope};
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
use galaxy_util::host_id::HostId;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use galaxy_util::remote_path::RemotePath;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
use warp_multi_agent_api as api;
|
||||
use warp_util::host_id::HostId;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use warp_util::remote_path::RemotePath;
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
|
||||
use super::{
|
||||
skill_reference_from_api_skill_ref, skill_reference_from_read_skill_ref, SkillConversionError,
|
||||
|
||||
@@ -4,10 +4,10 @@ use std::ops::Range;
|
||||
use std::path::Path;
|
||||
|
||||
use anyhow::Result;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use lazy_static::lazy_static;
|
||||
use regex::Regex;
|
||||
use thiserror::Error;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
|
||||
use super::parser::parse_markdown_content;
|
||||
use super::skill_provider::{get_provider_for_path, get_scope_for_path, SkillProvider, SkillScope};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::path::PathBuf;
|
||||
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use tempfile::TempDir;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::fs;
|
||||
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use tempfile::tempdir;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
|
||||
use super::*;
|
||||
|
||||
|
||||
@@ -7,12 +7,12 @@ use std::path::{Path, PathBuf};
|
||||
use std::sync::LazyLock;
|
||||
|
||||
use dirs::home_dir;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use strum_macros::{Display, EnumString, VariantNames};
|
||||
use galaxy_core::ui::color::CLAUDE_ORANGE;
|
||||
use galaxy_core::ui::icons::Icon;
|
||||
use galaxy_core::ui::theme::Fill;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use strum_macros::{Display, EnumString, VariantNames};
|
||||
|
||||
/// Represents a skill provider/origin (Agents, Claude, Codex, or Warp).
|
||||
#[derive(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use warp_util::host_id::HostId;
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use warp_util::remote_path::RemotePath;
|
||||
use warp_util::standardized_path::StandardizedPath;
|
||||
use galaxy_util::host_id::HostId;
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use galaxy_util::remote_path::RemotePath;
|
||||
use galaxy_util::standardized_path::StandardizedPath;
|
||||
|
||||
use super::{
|
||||
get_provider_for_path, get_scope_for_path, home_skills_path,
|
||||
@@ -12,13 +12,13 @@ use super::{
|
||||
fn warp_home_skills_path_uses_warp_home_path() {
|
||||
assert_eq!(
|
||||
home_skills_path(SkillProvider::Warp),
|
||||
galaxy_core::paths::warp_home_skills_dir()
|
||||
galaxy_core::paths::galaxy_home_skills_dir()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn warp_home_skill_path_is_home_warp_skill() {
|
||||
let Some(warp_home_skills_dir) = galaxy_core::paths::warp_home_skills_dir() else {
|
||||
let Some(warp_home_skills_dir) = galaxy_core::paths::galaxy_home_skills_dir() else {
|
||||
eprintln!("Skipping test: home directory not available");
|
||||
return;
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::fmt;
|
||||
|
||||
use galaxy_util::local_or_remote_path::LocalOrRemotePath;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use warp_util::local_or_remote_path::LocalOrRemotePath;
|
||||
|
||||
/// An unique reference to a skill.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
use std::time::Duration;
|
||||
|
||||
use serde::Serialize;
|
||||
use serde_json::{json, Value};
|
||||
use strum_macros::{EnumDiscriminants, EnumIter};
|
||||
use galaxy_core::features::FeatureFlag;
|
||||
use galaxy_core::register_telemetry_event;
|
||||
use galaxy_core::telemetry::{EnablementState, TelemetryEvent, TelemetryEventDesc};
|
||||
use serde::Serialize;
|
||||
use serde_json::{json, Value};
|
||||
use strum_macros::{EnumDiscriminants, EnumIter};
|
||||
|
||||
#[cfg_attr(not(feature = "local_fs"), allow(dead_code))]
|
||||
#[derive(Clone, EnumDiscriminants)]
|
||||
|
||||
Reference in New Issue
Block a user