Wrapping up bedrock implementation

This commit is contained in:
Ryan Ward
2026-05-13 10:04:59 -05:00
parent ed53aa99eb
commit cee61e2af0
1144 changed files with 2954 additions and 2660 deletions
+1 -1
View File
@@ -4,8 +4,8 @@ use crate::terminal::model::{
ObfuscateSecrets,
};
use chrono::{DateTime, FixedOffset, Utc};
use serde::{Deserialize, Serialize};
use galaxy_graphql::mutations::share_block::DisplaySetting as GqlDisplaySetting;
use serde::{Deserialize, Serialize};
// These are pixel heights of various parts of an embedded block.
pub const TITLE_HEIGHT: u32 = 34;
+2 -2
View File
@@ -21,13 +21,13 @@ use super::update_manager::UpdateManager;
use chrono::{DateTime, Utc};
use futures_util::stream::AbortHandle;
use std::time::Duration;
use galaxyui::r#async::Timer;
use std::time::Duration;
use async_channel::Sender;
use std::sync::Arc;
use galaxyui::{Entity, ModelContext, RequestState, SingletonEntity};
use std::sync::Arc;
use instant::Instant;
+1 -1
View File
@@ -6,9 +6,9 @@ use std::{
},
};
use settings::manager::SettingsManager;
use galaxy_core::execution_mode::{AppExecutionMode, ExecutionMode};
use galaxyui::{App, ModelHandle, SingletonEntity};
use settings::manager::SettingsManager;
use crate::{
auth::{auth_manager::AuthManager, AuthStateProvider},
@@ -72,13 +72,6 @@ use crate::{
use chrono::{DateTime, Utc};
use futures::channel::oneshot::{self, Receiver};
use futures::stream::AbortHandle;
use itertools::Itertools;
use lazy_static::lazy_static;
use regex::Regex;
use std::collections::{HashMap, HashSet};
use std::future::Future;
use std::sync::{mpsc::SyncSender, Arc};
use std::time::Duration;
use galaxy_core::features::FeatureFlag;
use galaxy_graphql::mcp_gallery_template::MCPGalleryTemplate;
use galaxy_graphql::object_permissions::AccessLevel;
@@ -86,6 +79,13 @@ use galaxy_graphql::scalars::time::ServerTimestamp;
use galaxyui::r#async::{FutureId, Timer};
use galaxyui::{duration_with_jitter, AppContext};
use galaxyui::{Entity, ModelContext, RequestState, RetryOption, SingletonEntity};
use itertools::Itertools;
use lazy_static::lazy_static;
use regex::Regex;
use std::collections::{HashMap, HashSet};
use std::future::Future;
use std::sync::{mpsc::SyncSender, Arc};
use std::time::Duration;
use super::listener::ObjectUpdateMessage;
@@ -2,10 +2,10 @@ use std::{collections::HashMap, sync::Arc, time::Duration};
use chrono::{DateTime, Utc};
use futures_lite::future;
use settings::{RespectUserSyncSetting, SyncToCloud};
use galaxy_core::features::FeatureFlag;
use galaxy_graphql::{object_permissions::AccessLevel, scalars::time::ServerTimestamp};
use galaxyui::{App, ModelHandle, SingletonEntity};
use settings::{RespectUserSyncSetting, SyncToCloud};
#[cfg(test)]
use crate::server::server_api::object::MockObjectClient;
+3 -1
View File
@@ -1,7 +1,9 @@
pub mod schema;
use galaxy_graphql::client::RequestOptions;
pub use galaxy_graphql::client::{get_request_context, get_user_facing_error_message, GraphQLError};
pub use galaxy_graphql::client::{
get_request_context, get_user_facing_error_message, GraphQLError,
};
/// Returns the default [`RequestOptions`] that should be used for a GraphQL request.
pub fn default_request_options() -> RequestOptions {
+1 -1
View File
@@ -1,5 +1,5 @@
use std::time::Duration;
use galaxyui::RetryOption;
use std::time::Duration;
use crate::server::server_api::presigned_upload::HttpStatusError;
+8 -9
View File
@@ -31,15 +31,15 @@ use base64::Engine;
use block::BlockClient;
use channel_versions::ChannelVersions;
use futures::StreamExt;
use galaxy_core::context_flag::ContextFlag;
use galaxy_core::errors::{register_error, AnyhowErrorExt, ErrorExt};
use galaxy_managed_secrets::client::ManagedSecretsClient;
use galaxyui::{r#async::BoxFuture, ModelContext};
use object::ObjectClient;
use prost::Message;
use referral::ReferralsClient;
use team::TeamClient;
use url::Url;
use galaxy_core::context_flag::ContextFlag;
use galaxy_core::errors::{register_error, AnyhowErrorExt, ErrorExt};
use galaxy_managed_secrets::client::ManagedSecretsClient;
use galaxyui::{r#async::BoxFuture, ModelContext};
use workspace::WorkspaceClient;
use crate::server::telemetry::TelemetryApi;
@@ -51,6 +51,9 @@ use crate::ChannelState;
use ::http::header::CONTENT_LENGTH;
use anyhow::{anyhow, Context, Result};
use chrono::{DateTime, FixedOffset};
use galaxy_core::telemetry::TelemetryEvent;
use galaxyui::Entity;
use galaxyui::SingletonEntity;
use instant::Instant;
use parking_lot::{Mutex, RwLock};
use reqwest::StatusCode;
@@ -60,9 +63,6 @@ use std::fmt;
use std::path::Path;
use std::sync::Arc;
use std::time::Duration;
use galaxy_core::telemetry::TelemetryEvent;
use galaxyui::Entity;
use galaxyui::SingletonEntity;
use super::experiments::ServerExperiment;
use super::experiments::ServerExperiments;
@@ -1327,8 +1327,7 @@ impl ServerApiProvider {
// to events; it's prone to these sorts of circular reference issues.
ctx.dispatch_global_action("app:log_out", ());
}
ServerApiEvent::NeedsReauth => {
}
ServerApiEvent::NeedsReauth => {}
// Re-emit the event for subscribers.
// TODO: we probably want a different type for the event emitted to subscribers
// from the one that's used for the async channel.
+16 -7
View File
@@ -3,6 +3,8 @@ use async_trait::async_trait;
use base64::Engine;
use chrono::{DateTime, Utc};
use cynic::{MutationBuilder, QueryBuilder};
use galaxy_core::channel::ChannelState;
use galaxy_core::{features::FeatureFlag, report_error};
use itertools::Itertools;
#[cfg(test)]
use mockall::automock;
@@ -11,8 +13,6 @@ use std::{
collections::{HashMap, HashSet},
time::Duration,
};
use galaxy_core::channel::ChannelState;
use galaxy_core::{features::FeatureFlag, report_error};
use warp_multi_agent_api::ConversationData;
use super::auth::AuthClient;
@@ -1122,7 +1122,9 @@ impl AIClient for ServerApi {
let response = self.send_graphql_request(operation, None).await?;
match response.user {
galaxy_graphql::queries::get_request_limit_info::UserResult::UserOutput(user_output) => {
galaxy_graphql::queries::get_request_limit_info::UserResult::UserOutput(
user_output,
) => {
let request_limit_info = user_output.user.request_limit_info.into();
let workspace_bonus_grants = user_output
@@ -1177,7 +1179,8 @@ impl AIClient for ServerApi {
match response.user {
galaxy_graphql::queries::get_feature_model_choices::UserResult::UserOutput(
galaxy_graphql::queries::get_feature_model_choices::UserOutput {
user: galaxy_graphql::queries::get_feature_model_choices::User { mut workspaces },
user:
galaxy_graphql::queries::get_feature_model_choices::User { mut workspaces },
},
) if !workspaces.is_empty() => {
// This is safe (`remove()` can panic) because we ensure workspaces is non-empty
@@ -2131,7 +2134,9 @@ impl From<galaxy_graphql::queries::get_feature_model_choices::LlmProvider> for L
galaxy_graphql::queries::get_feature_model_choices::LlmProvider::Google => {
LLMProvider::Google
}
galaxy_graphql::queries::get_feature_model_choices::LlmProvider::Xai => LLMProvider::Xai,
galaxy_graphql::queries::get_feature_model_choices::LlmProvider::Xai => {
LLMProvider::Xai
}
galaxy_graphql::queries::get_feature_model_choices::LlmProvider::Unknown => {
LLMProvider::Unknown
}
@@ -2183,7 +2188,9 @@ impl From<galaxy_graphql::workspace::LlmSpec> for LLMSpec {
}
}
impl From<galaxy_graphql::queries::get_feature_model_choices::LlmUsageMetadata> for LLMUsageMetadata {
impl From<galaxy_graphql::queries::get_feature_model_choices::LlmUsageMetadata>
for LLMUsageMetadata
{
fn from(value: galaxy_graphql::queries::get_feature_model_choices::LlmUsageMetadata) -> Self {
Self {
request_multiplier: value.request_multiplier.max(1) as usize,
@@ -2228,7 +2235,9 @@ impl From<galaxy_graphql::workspace::DisableReason> for DisableReason {
match value {
galaxy_graphql::workspace::DisableReason::AdminDisabled => DisableReason::AdminDisabled,
galaxy_graphql::workspace::DisableReason::OutOfRequests => DisableReason::OutOfRequests,
galaxy_graphql::workspace::DisableReason::ProviderOutage => DisableReason::ProviderOutage,
galaxy_graphql::workspace::DisableReason::ProviderOutage => {
DisableReason::ProviderOutage
}
galaxy_graphql::workspace::DisableReason::RequiresUpgrade => {
DisableReason::RequiresUpgrade
}
+20 -12
View File
@@ -3,13 +3,13 @@ use std::result::Result as StdResult;
use anyhow::{anyhow, bail, Result};
use async_trait::async_trait;
use firebase::FirebaseError;
use galaxy_core::errors::{AnyhowErrorExt, ErrorExt};
use galaxy_graphql::mutations::expire_api_key::ExpireApiKeyResult;
use galaxy_graphql::queries::get_conversation_usage::ConversationUsage;
use instant::Duration;
#[cfg(test)]
use mockall::{automock, predicate::*};
use thiserror::Error;
use galaxy_core::errors::{AnyhowErrorExt, ErrorExt};
use galaxy_graphql::mutations::expire_api_key::ExpireApiKeyResult;
use galaxy_graphql::queries::get_conversation_usage::ConversationUsage;
use galaxy_graphql::mutations::create_anonymous_user::{
AnonymousUserType, CreateAnonymousUserResult,
@@ -19,12 +19,12 @@ use galaxy_graphql::mutations::mint_custom_token::MintCustomTokenResult;
use galaxy_graphql::queries::api_keys::ApiKeyProperties;
use galaxy_graphql::queries::get_user::UserOutput as GqlUserOutput;
use crate::server::ids::ApiKeyUid;
use crate::server::server_api::register_error;
use crate::settings::PrivacySettingsSnapshot;
use crate::auth::credentials::{AuthToken, Credentials, FirebaseToken, LoginToken};
use crate::auth::user::User;
use crate::server::experiments::ServerExperiment;
use crate::server::ids::ApiKeyUid;
use crate::server::server_api::register_error;
use crate::settings::PrivacySettingsSnapshot;
use super::ServerApi;
@@ -173,7 +173,9 @@ impl AuthClient for ServerApi {
_token: LoginToken,
_for_refresh: bool,
) -> StdResult<FetchUserResult, UserAuthenticationError> {
Err(UserAuthenticationError::Unexpected(anyhow!("Server auth disabled")))
Err(UserAuthenticationError::Unexpected(anyhow!(
"Server auth disabled"
)))
}
async fn fetch_new_custom_token(&self) -> Result<MintCustomTokenResult> {
@@ -219,7 +221,10 @@ impl AuthClient for ServerApi {
Ok(())
}
async fn update_user_settings(&self, _settings_snapshot: PrivacySettingsSnapshot) -> Result<()> {
async fn update_user_settings(
&self,
_settings_snapshot: PrivacySettingsSnapshot,
) -> Result<()> {
Ok(())
}
@@ -230,7 +235,9 @@ impl AuthClient for ServerApi {
async fn request_device_code(
&self,
) -> StdResult<oauth2::StandardDeviceAuthorizationResponse, UserAuthenticationError> {
Err(UserAuthenticationError::Unexpected(anyhow!("Server auth disabled")))
Err(UserAuthenticationError::Unexpected(anyhow!(
"Server auth disabled"
)))
}
async fn exchange_device_access_token(
@@ -238,7 +245,9 @@ impl AuthClient for ServerApi {
_details: &oauth2::StandardDeviceAuthorizationResponse,
_timeout: Duration,
) -> StdResult<FirebaseToken, UserAuthenticationError> {
Err(UserAuthenticationError::Unexpected(anyhow!("Server auth disabled")))
Err(UserAuthenticationError::Unexpected(anyhow!(
"Server auth disabled"
)))
}
async fn list_api_keys(&self) -> Result<Vec<ApiKeyProperties>> {
@@ -325,8 +334,7 @@ register_error!(UserAuthenticationError);
impl From<FirebaseError> for UserAuthenticationError {
fn from(error: FirebaseError) -> Self {
UserAuthenticationError::Unexpected(
anyhow::Error::from(error)
.context("Firebase error (server auth disabled)"),
anyhow::Error::from(error).context("Firebase error (server auth disabled)"),
)
}
}
+3 -3
View File
@@ -9,9 +9,6 @@ use anyhow::anyhow;
use async_trait::async_trait;
use chrono::Utc;
use cynic::{MutationBuilder, QueryBuilder};
#[cfg(test)]
use mockall::automock;
use std::convert::TryFrom;
use galaxy_core::channel::{Channel, ChannelState};
use galaxy_graphql::{
mutations::{
@@ -24,6 +21,9 @@ use galaxy_graphql::{
Block as GqlBlock, GetBlocksForUser, GetBlocksForUserVariables,
},
};
#[cfg(test)]
use mockall::automock;
use std::convert::TryFrom;
#[cfg_attr(test, automock)]
#[cfg_attr(not(target_family = "wasm"), async_trait)]
+3 -3
View File
@@ -46,9 +46,6 @@ use async_channel::Sender;
use async_trait::async_trait;
use chrono::{DateTime, Utc};
use cynic::{MutationBuilder, QueryBuilder, SubscriptionBuilder};
#[cfg(test)]
use mockall::{automock, predicate::*};
use std::collections::HashMap;
use galaxy_core::report_error;
use galaxy_graphql::{
error::UserFacingErrorInterface,
@@ -154,6 +151,9 @@ use galaxy_graphql::{
get_warp_drive_updates::GetWarpDriveUpdates, start_graphql_streaming_operation,
},
};
#[cfg(test)]
use mockall::{automock, predicate::*};
use std::collections::HashMap;
/// Identifies a guest to remove from an object.
#[derive(Clone, Debug)]
+2 -2
View File
@@ -3,8 +3,6 @@ use crate::server::graphql::{get_request_context, get_user_facing_error_message}
use anyhow::{anyhow, Result};
use async_trait::async_trait;
use cynic::{MutationBuilder, QueryBuilder};
#[cfg(test)]
use mockall::{automock, predicate::*};
use galaxy_core::channel::ChannelState;
use galaxy_graphql::{
mutations::send_referral_invite_emails::{
@@ -12,6 +10,8 @@ use galaxy_graphql::{
},
queries::get_referral_info::{GetReferralInfo, GetReferralInfoVariables},
};
#[cfg(test)]
use mockall::{automock, predicate::*};
/// Referral information for the logged-in user
pub struct ReferralInfo {
+8 -8
View File
@@ -502,14 +502,14 @@ impl TeamClient for ServerApi {
let result = self.send_graphql_request(operation, None).await?;
match result.user {
galaxy_graphql::queries::get_discoverable_teams::UserResult::UserOutput(user_output) => {
Ok(user_output
.user
.discoverable_teams
.into_iter()
.map(|gql_team_data| Ok(gql_team_data.into()))
.collect::<Result<Vec<DiscoverableTeam>>>()?)
}
galaxy_graphql::queries::get_discoverable_teams::UserResult::UserOutput(
user_output,
) => Ok(user_output
.user
.discoverable_teams
.into_iter()
.map(|gql_team_data| Ok(gql_team_data.into()))
.collect::<Result<Vec<DiscoverableTeam>>>()?),
galaxy_graphql::queries::get_discoverable_teams::UserResult::UserFacingError(
user_facing_error,
) => Err(anyhow!(get_user_facing_error_message(user_facing_error))),
+4 -2
View File
@@ -1,5 +1,9 @@
use chrono::{DateTime, Utc};
use derivative::Derivative;
use galaxy_graphql::scalars::time::ServerTimestamp;
use galaxyui::{
r#async::FutureId, Entity, ModelContext, RequestState, RetryOption, SingletonEntity,
};
use http::StatusCode;
use std::borrow::Cow;
use std::{
@@ -7,8 +11,6 @@ use std::{
sync::Arc,
time::Duration,
};
use galaxy_graphql::scalars::time::ServerTimestamp;
use galaxyui::{r#async::FutureId, Entity, ModelContext, RequestState, RetryOption, SingletonEntity};
use lazy_static::lazy_static;
use uuid::Uuid;
+2 -2
View File
@@ -25,10 +25,10 @@ use crate::{NetworkStatus, QueueItem, SyncQueue};
use anyhow::anyhow;
use chrono::{DateTime, Duration, Utc};
use firebase::FirebaseError;
use itertools::Itertools;
use std::sync::Arc;
use galaxy_server_client::cloud_object::ServerPermissions;
use galaxyui::{r#async::Timer, App, Entity, ModelHandle, SingletonEntity};
use itertools::Itertools;
use std::sync::Arc;
#[cfg(test)]
use crate::server::server_api::object::MockObjectClient;
+9 -9
View File
@@ -1,6 +1,14 @@
use std::collections::HashSet;
use std::time::Duration;
use galaxy_completer::completer::MatchType;
use galaxy_core::command::ExitCode;
use galaxy_core::telemetry::EnablementState;
use galaxy_core::telemetry::TelemetryEvent as TelemetryEventTrait;
use galaxy_core::telemetry::TelemetryEventDesc;
use galaxyui::keymap::Keystroke;
use galaxyui::notification::{NotificationSendError, RequestPermissionsOutcome};
use galaxyui::rendering::ThinStrokes;
use serde::{Deserialize, Serialize};
use serde_json::json;
use serde_json::Value;
@@ -10,14 +18,6 @@ use session_sharing_protocol::common::SessionId as SharedSessionId;
use session_sharing_protocol::sharer::SessionEndedReason;
use strum_macros::EnumDiscriminants;
use strum_macros::EnumIter;
use galaxy_completer::completer::MatchType;
use galaxy_core::command::ExitCode;
use galaxy_core::telemetry::EnablementState;
use galaxy_core::telemetry::TelemetryEvent as TelemetryEventTrait;
use galaxy_core::telemetry::TelemetryEventDesc;
use galaxyui::keymap::Keystroke;
use galaxyui::notification::{NotificationSendError, RequestPermissionsOutcome};
use galaxyui::rendering::ThinStrokes;
use crate::ai::agent::api::ServerConversationToken;
use crate::ai::agent::conversation::AIConversationId;
@@ -104,8 +104,8 @@ use crate::workflows::WorkflowSource;
use crate::workspace::tab_settings::TabCloseButtonPosition;
use crate::workspace::tab_settings::WorkspaceDecorationVisibility;
use crate::workspace::TabMovement;
use session_sharing_protocol::sharer::SessionSourceType;
use galaxy_core::interval_timer::TimingDataPoint;
use session_sharing_protocol::sharer::SessionSourceType;
#[derive(Clone, Serialize, Deserialize)]
pub struct BootstrappingInfo {
+2 -2
View File
@@ -19,6 +19,8 @@ use crate::settings::PrivacySettingsSnapshot;
use crate::ChannelState;
use anyhow::Result;
use futures::FutureExt;
use galaxy_core::channel::RudderStackDestination;
use galaxyui::telemetry::Event;
use rudder_message::{
Batch as RudderBatch, BatchMessage as RudderBatchMessageWithMetadata,
BatchMessageItem as RudderBatchMessage, Message as RudderMessage,
@@ -28,8 +30,6 @@ use std::fs::File;
use std::fs::OpenOptions;
use std::future::Future;
use std::path::{Path, PathBuf};
use galaxy_core::channel::RudderStackDestination;
use galaxyui::telemetry::Event;
/// Filename for file where telemetry events are written on app quit.
const RUDDER_TELEMETRY_EVENTS_FILE_NAME: &str = "rudder_telemetry_events.json";
+1 -1
View File
@@ -5,12 +5,12 @@ use super::telemetry::rudder_message::{
use super::telemetry::secret_redaction::redact_secrets_in_value;
use crate::auth::UserUid;
use chrono::{DateTime, Utc};
use serde_json::{json, Value};
use galaxy_core::{
channel::{Channel, ChannelState},
execution_mode,
};
use galaxyui::telemetry::EventPayload;
use serde_json::{json, Value};
use super::telemetry::telemetry_context;
+1 -1
View File
@@ -1,6 +1,6 @@
use chrono::Utc;
use serde_json::json;
use galaxyui::telemetry::{Event, EventPayload};
use serde_json::json;
use super::*;