diff --git a/Cargo.lock b/Cargo.lock index 22b3584894..8e2b84cd92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6435,6 +6435,7 @@ dependencies = [ "tracedecay-configuration", "tracedecay-contracts", "tracedecay-daemon-control", + "tracedecay-daemon-identity", "tracedecay-daemon-protocol", "tracedecay-dashboard-api", "tracedecay-domain", @@ -6448,12 +6449,15 @@ dependencies = [ "tracedecay-query", "tracedecay-runtime-core", "tracedecay-rusqlite-runtime", + "tracedecay-search-eval", "tracedecay-semantic", "tracedecay-semantic-contracts", "tracedecay-session-memory", + "tracedecay-session-temporal-store", "tracedecay-sessions", "tracedecay-source-edit", "tracedecay-store", + "tracedecay-store-runtime", "tracedecay-tool-catalog", "tracing", "tracing-subscriber", diff --git a/crates/tracedecay-daemon-service/Cargo.toml b/crates/tracedecay-daemon-service/Cargo.toml index 42d56bc045..bd2ecf1876 100644 --- a/crates/tracedecay-daemon-service/Cargo.toml +++ b/crates/tracedecay-daemon-service/Cargo.toml @@ -50,6 +50,7 @@ tracedecay-contracts = { path = "../tracedecay-contracts", version = "0.1.0" } tracedecay-code-index = { path = "../tracedecay-code-index", version = "0.1.0", default-features = false } tracedecay-code-index-runtime = { path = "../tracedecay-code-index-runtime", version = "0.1.0", default-features = false } tracedecay-configuration = { path = "../tracedecay-configuration", version = "0.1.0" } +tracedecay-daemon-identity = { path = "../tracedecay-daemon-identity", version = "0.1.0" } tracedecay-daemon-protocol = { path = "../tracedecay-daemon-protocol", version = "0.1.0" } tracedecay-dashboard-api = { path = "../tracedecay-dashboard-api", version = "0.1.0" } tracedecay-domain = { path = "../tracedecay-domain", version = "0.1.0" } @@ -65,16 +66,20 @@ tracedecay-rusqlite-runtime = { path = "../tracedecay-rusqlite-runtime", version tracedecay-semantic = { path = "../tracedecay-semantic", version = "0.1.0" } tracedecay-semantic-contracts.workspace = true tracedecay-session-memory = { path = "../tracedecay-session-memory", version = "0.1.0" } +tracedecay-session-temporal-store = { path = "../tracedecay-session-temporal-store", version = "0.1.0" } tracedecay-sessions = { path = "../tracedecay-sessions", version = "0.1.0" } tracedecay-source-edit = { path = "../tracedecay-source-edit", version = "0.1.0" } tracedecay-store = { path = "../tracedecay-store", version = "0.1.0" } +tracedecay-store-runtime = { path = "../tracedecay-store-runtime", version = "0.1.0" } tracedecay-tool-catalog = { path = "../tracedecay-tool-catalog", version = "0.1.0" } tracedecay-application = { path = "../tracedecay-application", version = "0.1.0" } url = "2" [dev-dependencies] tempfile = "3" +tracedecay-search-eval = { path = "../tracedecay-search-eval", version = "0.1.0" } tokio = { version = "1", features = ["full", "test-util"] } tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] } +tracedecay-code-index-runtime = { path = "../tracedecay-code-index-runtime", version = "0.1.0", default-features = false, features = ["test-helpers"] } tracedecay-global-db = { path = "../tracedecay-global-db", version = "0.1.0", features = ["test-helpers"] } tracedecay-runtime-core = { path = "../tracedecay-runtime-core", version = "0.1.0", features = ["test-helpers"] } diff --git a/crates/tracedecay/src/daemon/callable_code_authorization.rs b/crates/tracedecay-daemon-service/src/callable_code_authorization.rs similarity index 92% rename from crates/tracedecay/src/daemon/callable_code_authorization.rs rename to crates/tracedecay-daemon-service/src/callable_code_authorization.rs index 3aaae43ff2..1b8785788d 100644 --- a/crates/tracedecay/src/daemon/callable_code_authorization.rs +++ b/crates/tracedecay-daemon-service/src/callable_code_authorization.rs @@ -1,19 +1,20 @@ -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::sync::Arc; use tracedecay_contracts::{ - ApplicationOperation, ApplicationProblem, ApplicationProblemKind, AuthorityReceipt, - CallableCodeAuthorizationAdmission, CallableCodeAuthorizationFuture, + ApplicationContractError, ApplicationOperation, ApplicationProblem, ApplicationProblemKind, + AuthorityReceipt, CallableCodeAuthorizationAdmission, CallableCodeAuthorizationFuture, CallableCodeAuthorizationPort, RequestAdmission, RequestContext, ResolvedScope, RetryDirective, SafeDiagnostic, }; -use tracedecay_daemon_service::callable_code_request_context; use tracedecay_domain::{ComponentVersion, UtcMicros}; +use crate::callable_code_request_context; use tracedecay_application::{ CallableCodeAuthorizationSourcePort, CurrentCallableCodeAccessFuture, ProjectSourceAccessSnapshot, }; +use tracedecay_configuration::config::PinnedRuntimeConfiguration; use tracedecay_configuration::{ ConfigurationControlStore, ConfigurationError, ProjectConfigurationRuntime, }; @@ -23,12 +24,12 @@ type CurrentCallableCodeAccess = dyn Fn(UtcMicros) -> CurrentCallableCodeAccessFuture<'static> + Send + Sync; #[derive(Clone)] -pub(super) struct DaemonCallableCodeAuthorizationSource { +pub struct DaemonCallableCodeAuthorizationSource { access: Arc, } impl DaemonCallableCodeAuthorizationSource { - fn new( + pub fn new( access: impl Fn(UtcMicros) -> CurrentCallableCodeAccessFuture<'static> + Send + Sync + 'static, ) -> Self { Self { @@ -36,50 +37,56 @@ impl DaemonCallableCodeAuthorizationSource { } } - pub(super) fn production( + pub fn production( project_root: PathBuf, scope: ResolvedScope, configuration: Arc, + source_access_at: impl Fn( + &ResolvedScope, + &Path, + &PinnedRuntimeConfiguration, + UtcMicros, + ) + -> Result + + Send + + Sync + + 'static, ) -> Self { let project_root = Arc::new(project_root); let scope = Arc::new(scope); + let source_access_at = Arc::new(source_access_at); Self::new(move |observed_at| { let project_root = Arc::clone(&project_root); let scope = Arc::clone(&scope); let configuration = Arc::clone(&configuration); + let source_access_at = Arc::clone(&source_access_at); Box::pin(async move { let current = configuration .configuration_store() .current() .await .map_err(configuration_current_problem)?; - let configuration = - tracedecay_configuration::config::PinnedRuntimeConfiguration::new( - configuration.configuration_target().clone(), - current.revision_id, - current.snapshot, - ) - .map_err(|_| concealed())?; - crate::daemon::project_open_owners::daemon_owned_project_source_access_at( - &scope, - &project_root, - &configuration, - observed_at, + let configuration = PinnedRuntimeConfiguration::new( + configuration.configuration_target().clone(), + current.revision_id, + current.snapshot, ) - .map_err(|_| concealed()) + .map_err(|_| concealed())?; + source_access_at(&scope, &project_root, &configuration, observed_at) + .map_err(|_| concealed()) }) }) } #[hotpath::skip] - pub(super) async fn current( + pub async fn current( &self, observed_at: UtcMicros, ) -> Result { (self.access)(observed_at).await } - pub(super) fn authorize( + pub fn authorize( &self, admitted_access: ProjectSourceAccessSnapshot, ) -> DaemonCallableCodeAuthorization { @@ -107,20 +114,35 @@ impl CallableCodeAuthorizationSourcePort for DaemonCallableCodeAuthorizationSour } #[derive(Clone)] -pub(crate) struct DaemonCodeGraphReadAdmission { +pub struct DaemonCodeGraphReadAdmission { scope: ResolvedScope, authorization: DaemonCallableCodeAuthorizationSource, } impl DaemonCodeGraphReadAdmission { - pub(crate) fn production( + pub fn production( project_root: PathBuf, scope: ResolvedScope, configuration: Arc, + source_access_at: impl Fn( + &ResolvedScope, + &Path, + &PinnedRuntimeConfiguration, + UtcMicros, + ) + -> Result + + Send + + Sync + + 'static, ) -> Self { Self::new( scope.clone(), - DaemonCallableCodeAuthorizationSource::production(project_root, scope, configuration), + DaemonCallableCodeAuthorizationSource::production( + project_root, + scope, + configuration, + source_access_at, + ), ) } @@ -246,7 +268,7 @@ fn map_graph_admission_problem(problem: ApplicationProblem) -> CodeGraphReadErro } } -pub(super) struct DaemonCallableCodeAuthorization { +pub struct DaemonCallableCodeAuthorization { source: DaemonCallableCodeAuthorizationSource, admitted_access: ProjectSourceAccessSnapshot, } diff --git a/crates/tracedecay-daemon-service/src/lib.rs b/crates/tracedecay-daemon-service/src/lib.rs index 1e8646ce0f..3767747aa1 100644 --- a/crates/tracedecay-daemon-service/src/lib.rs +++ b/crates/tracedecay-daemon-service/src/lib.rs @@ -57,17 +57,24 @@ pub use tracedecay_runtime_core::DAEMON_TASK_ABORT_DEADLINE as TASK_ABORT_DEADLINE; pub mod application_surface; +pub mod callable_code_authorization; pub mod invocation; mod mcp_project_registry; mod mcp_workflow_index; pub mod project_owner_registration; pub mod project_runtime; +pub mod query_authority_provider; +pub mod query_mcp_admission; pub mod remote_http_transport; +pub mod remote_protocol; pub mod request_cancellation; mod shutdown_coordination; mod multi_root; +pub use callable_code_authorization::{ + DaemonCallableCodeAuthorizationSource, DaemonCodeGraphReadAdmission, +}; pub use invocation::semantic_evaluation::SemanticInvocationControlV1; #[cfg(any(test, feature = "test-helpers"))] pub use invocation::{ @@ -111,6 +118,15 @@ pub use project_runtime::{ SemanticOwnerRegistrationSignalsV1, StoreObservabilityMountErrorV1, StoreObservabilityMountV1, StoreObservabilityRegistryV1, }; +pub use query_authority_provider::{ + DaemonQueryActivationRegistrarV1, DaemonQueryAuthorityProviderV1, + QueryAuthorityProviderStatusV1, QueryAuthorityUpdateErrorV1, +}; +pub use query_mcp_admission::{ + QUERY_MCP_READ_CAPABILITY_V1, QueryMcpAdmissionUnavailableV1, QueryMcpReadAdmissionProviderV1, + QueryMcpReadAdmissionV1, admit_query_mcp_read, +}; +pub use remote_protocol::build_daemon_remote_protocol_router; pub use request_cancellation::{Lease, RequestCancellationRegistryV1}; pub use shutdown_coordination::{ShutdownCoordinatorV1, ShutdownStatus}; pub use tracedecay_daemon_protocol::{ diff --git a/crates/tracedecay/src/daemon/query_authority_provider.rs b/crates/tracedecay-daemon-service/src/query_authority_provider.rs similarity index 97% rename from crates/tracedecay/src/daemon/query_authority_provider.rs rename to crates/tracedecay-daemon-service/src/query_authority_provider.rs index 8196dab7fa..6d13e7aa04 100644 --- a/crates/tracedecay/src/daemon/query_authority_provider.rs +++ b/crates/tracedecay-daemon-service/src/query_authority_provider.rs @@ -16,7 +16,7 @@ use tracedecay_domain::{ configuration::UserProfileId, }; -use crate::config::retrieval::{ +use tracedecay_application::config::retrieval::{ AcceptedRetrievalProfileV1, RetrievalProfileAuditOperationV1, RetrievalProfileStateV1, }; use tracedecay_application::semantic_runtime::{ @@ -36,7 +36,7 @@ use tracedecay_query::retrieval::QueryAuthorityV1; const SUPERSEDED_COMMITTED_ACTIVATION: &str = "superseded_committed_activation"; #[derive(Clone, Copy, Debug, PartialEq, Eq)] -pub(crate) enum QueryAuthorityUnavailableReasonV1 { +pub enum QueryAuthorityUnavailableReasonV1 { ActivationUnavailable, ActivationNotCurrent, #[cfg(test)] @@ -63,7 +63,7 @@ impl QueryAuthorityUnavailableReasonV1 { } #[derive(Clone, Debug, PartialEq, Eq)] -pub(crate) enum QueryAuthorityProviderStatusV1 { +pub enum QueryAuthorityProviderStatusV1 { Available { scope_digest: ManifestDigest, profile_id: tracedecay_domain::FusionProfileId, @@ -75,7 +75,7 @@ pub(crate) enum QueryAuthorityProviderStatusV1 { } #[derive(Debug, Error, PartialEq, Eq)] -pub(crate) enum QueryAuthorityUpdateErrorV1 { +pub enum QueryAuthorityUpdateErrorV1 { #[error("query activated scope is invalid")] InvalidScope, #[error("query initial profile state is not the exact evaluated fallback")] @@ -110,7 +110,7 @@ struct QueryAuthorityKeyV1 { scope_digest: ManifestDigest, } -pub(crate) struct PreparedQueryActivationV1 { +pub struct PreparedQueryActivationV1 { profile_id: UserProfileId, scope: ResolvedScope, activated: RetrievalProfileStateV1, @@ -120,17 +120,17 @@ pub(crate) struct PreparedQueryActivationV1 { } impl PreparedQueryActivationV1 { - pub(crate) fn scope(&self) -> &ResolvedScope { + pub fn scope(&self) -> &ResolvedScope { &self.scope } - pub(crate) fn configuration_revision( + pub fn configuration_revision( &self, ) -> &tracedecay_domain::configuration::ConfigurationRevisionId { self.activated.configuration_revision() } - pub(crate) fn query_authority(&self) -> &Arc { + pub fn query_authority(&self) -> &Arc { &self.query_authority } } @@ -138,17 +138,17 @@ impl PreparedQueryActivationV1 { /// Daemon owner for the current accepted query profile and the /// durable project cursor-key authority loaded from its registered store. #[derive(Clone)] -pub(crate) struct DaemonQueryAuthorityProviderV1 { +pub struct DaemonQueryAuthorityProviderV1 { activated: Arc>>, } -pub(super) struct DaemonProfileQueryAuthorityProviderV1 { +pub struct DaemonProfileQueryAuthorityProviderV1 { provider: DaemonQueryAuthorityProviderV1, profile_id: UserProfileId, } #[derive(Clone)] -pub(crate) struct DaemonQueryActivationRegistrarV1 { +pub struct DaemonQueryActivationRegistrarV1 { provider: DaemonQueryAuthorityProviderV1, registry: tracedecay_code_index_runtime::code_index_scheduler::CodeIndexSchedulerRegistryV1, project_root: std::path::PathBuf, @@ -156,7 +156,7 @@ pub(crate) struct DaemonQueryActivationRegistrarV1 { } impl DaemonQueryActivationRegistrarV1 { - pub(crate) fn new( + pub fn new( provider: DaemonQueryAuthorityProviderV1, registry: tracedecay_code_index_runtime::code_index_scheduler::CodeIndexSchedulerRegistryV1, project_root: std::path::PathBuf, @@ -526,17 +526,14 @@ impl DaemonQueryAuthorityProviderV1 { } } - pub(super) fn for_profile( - &self, - profile_id: UserProfileId, - ) -> DaemonProfileQueryAuthorityProviderV1 { + pub fn for_profile(&self, profile_id: UserProfileId) -> DaemonProfileQueryAuthorityProviderV1 { DaemonProfileQueryAuthorityProviderV1 { provider: self.clone(), profile_id, } } - pub(crate) fn retire_project( + pub fn retire_project( &self, profile_id: &UserProfileId, project_id: &tracedecay_domain::ProjectId, @@ -551,7 +548,7 @@ impl DaemonQueryAuthorityProviderV1 { } #[hotpath::measure(label = "daemon.query.prepare_activation")] - pub(crate) fn prepare_after_successful_activation( + pub fn prepare_after_successful_activation( &self, profile_id: UserProfileId, scope: ResolvedScope, @@ -611,7 +608,7 @@ impl DaemonQueryAuthorityProviderV1 { } #[hotpath::measure(label = "daemon.query.commit_activation")] - pub(crate) fn commit_prepared_activation( + pub fn commit_prepared_activation( &self, prepared: &PreparedQueryActivationV1, ) -> Result<(), QueryAuthorityUpdateErrorV1> { @@ -651,7 +648,7 @@ impl DaemonQueryAuthorityProviderV1 { /// is admitted only while the exact query profile is active with no rollback /// slot or audit history. #[hotpath::measure(label = "daemon.query.install_initial")] - pub(crate) fn install_evaluated_initial_state( + pub fn install_evaluated_initial_state( &self, profile_id: UserProfileId, scope: ResolvedScope, @@ -711,7 +708,7 @@ impl DaemonQueryAuthorityProviderV1 { } #[cfg(test)] - pub(crate) fn status(&self, scope: Option<&ResolvedScope>) -> QueryAuthorityProviderStatusV1 { + pub fn status(&self, scope: Option<&ResolvedScope>) -> QueryAuthorityProviderStatusV1 { let current = self .activated .read() @@ -813,7 +810,7 @@ impl DaemonQueryAuthorityProviderV1 { } #[hotpath::measure(label = "daemon.query.federated_authority")] - pub(crate) fn federated_authority_for( + pub fn federated_authority_for( &self, scope: &ResolvedScope, privacy_domain: &PrivacyDomainId, @@ -1012,7 +1009,7 @@ impl QueryAuthorityProviderV1 for DaemonProfileQueryAuthorityProviderV1 { fn current_transition( state: &RetrievalProfileStateV1, -) -> Option<&crate::config::retrieval::RetrievalProfileAuditEventV1> { +) -> Option<&tracedecay_application::config::retrieval::RetrievalProfileAuditEventV1> { let event = state.audit().last()?; if !matches!( &event.operation, @@ -1120,4 +1117,4 @@ fn map_update_observer_error( #[cfg(test)] #[path = "query_authority_provider_tests.rs"] -pub(crate) mod tests; +pub mod tests; diff --git a/crates/tracedecay/src/daemon/query_authority_provider_activation_tests.rs b/crates/tracedecay-daemon-service/src/query_authority_provider_activation_tests.rs similarity index 100% rename from crates/tracedecay/src/daemon/query_authority_provider_activation_tests.rs rename to crates/tracedecay-daemon-service/src/query_authority_provider_activation_tests.rs diff --git a/crates/tracedecay/src/daemon/query_authority_provider_tests.rs b/crates/tracedecay-daemon-service/src/query_authority_provider_tests.rs similarity index 99% rename from crates/tracedecay/src/daemon/query_authority_provider_tests.rs rename to crates/tracedecay-daemon-service/src/query_authority_provider_tests.rs index 7d10fbbd98..61c14062cc 100644 --- a/crates/tracedecay/src/daemon/query_authority_provider_tests.rs +++ b/crates/tracedecay-daemon-service/src/query_authority_provider_tests.rs @@ -1,11 +1,11 @@ use super::*; -use crate::config::retrieval::{ +use std::{collections::BTreeMap, path::Path, process::Command, time::Duration}; +use tempfile::TempDir; +use tracedecay_application::config::retrieval::{ PassingRetrievalEvaluationV1, RetrievalCompatibilityPinsV1, RetrievalProfileAuditEventV1, RetrievalProfileStateSnapshotV1, RetrievalRuntimeCompatibilityV1, SemanticCompatibilityPinsV1, SemanticResourceRequirementV1, }; -use std::{collections::BTreeMap, path::Path, process::Command, time::Duration}; -use tempfile::TempDir; use tracedecay_application::semantic_runtime::{ CommittedRetrievalProfileStateV1, SemanticActivationCommandV1, SemanticActivationReceiptV1, SemanticActivationRequestV1, SemanticConfigurationPinV1, SemanticCurrentLinkedActivationV1, diff --git a/crates/tracedecay/src/daemon/query_mcp_admission.rs b/crates/tracedecay-daemon-service/src/query_mcp_admission.rs similarity index 97% rename from crates/tracedecay/src/daemon/query_mcp_admission.rs rename to crates/tracedecay-daemon-service/src/query_mcp_admission.rs index 2ae3085c38..50fa816b23 100644 --- a/crates/tracedecay/src/daemon/query_mcp_admission.rs +++ b/crates/tracedecay-daemon-service/src/query_mcp_admission.rs @@ -22,14 +22,13 @@ use tracedecay_code_index_runtime::mcp_admission::{ }; use tracedecay_daemon_identity::profile_identity::LocalProfileIdentityAuthorityV1; -pub(crate) const QUERY_MCP_READ_CAPABILITY_V1: &str = - "capability.application.code-index.search-read"; +pub const QUERY_MCP_READ_CAPABILITY_V1: &str = "capability.application.code-index.search-read"; const QUERY_MCP_GRANT_HORIZON: Duration = Duration::from_hours(24); const AUTHORIZATION_REVISION_DOMAIN_V1: &str = "tracedecay.query-read-authorization.v1"; const PRINCIPAL_DOMAIN_V1: &str = "tracedecay.query-profile-principal.v1"; #[derive(Clone)] -pub(crate) struct QueryMcpReadAdmissionV1 { +pub struct QueryMcpReadAdmissionV1 { project_id: ProjectId, scope: ResolvedScope, principal: PrincipalId, @@ -41,14 +40,14 @@ pub(crate) struct QueryMcpReadAdmissionV1 { } #[derive(Clone)] -pub(crate) struct QueryMcpReadAdmissionProviderV1 { +pub struct QueryMcpReadAdmissionProviderV1 { identity: LocalProfileIdentityAuthorityV1, project_id: ProjectId, route_registered: Arc, } #[derive(Clone, Copy, Debug, Error, PartialEq, Eq)] -pub(crate) enum QueryMcpAdmissionUnavailableV1 { +pub enum QueryMcpAdmissionUnavailableV1 { #[error("the MCP route has no daemon-authenticated profile actor")] Unauthenticated, #[error("the MCP read grant is invalid")] @@ -94,7 +93,7 @@ fn record_query_admission_refusal(reason: QueryMcpAdmissionUnavailableV1) { } } -pub(crate) fn admit_query_mcp_read( +pub fn admit_query_mcp_read( identity: Option<&LocalProfileIdentityAuthorityV1>, project_id: &ProjectId, scope: &ResolvedScope, @@ -121,7 +120,7 @@ pub(crate) fn admit_query_mcp_read( } impl QueryMcpReadAdmissionProviderV1 { - pub(crate) fn new( + pub fn new( identity: LocalProfileIdentityAuthorityV1, project_id: ProjectId, route_registered: Arc, @@ -133,7 +132,7 @@ impl QueryMcpReadAdmissionProviderV1 { } } - pub(crate) fn admit_current( + pub fn admit_current( &self, scope: &ResolvedScope, ) -> Result { @@ -145,7 +144,7 @@ impl QueryMcpReadAdmissionProviderV1 { ) } - pub(crate) fn route_is_registered(&self) -> bool { + pub fn route_is_registered(&self) -> bool { self.route_registered.load(Ordering::Acquire) } } @@ -253,14 +252,14 @@ impl CodeIndexMcpReadAdmissionV1 for QueryMcpReadAdmissionProviderV1 { } impl QueryMcpReadAdmissionV1 { - pub(crate) fn search_authority(&self) -> code_search::CodeIndexSearchAuthorityV1 { + pub fn search_authority(&self) -> code_search::CodeIndexSearchAuthorityV1 { code_search::CodeIndexSearchAuthorityV1 { principal: self.principal.clone(), authorization_revision: self.authorization_revision.clone(), } } - pub(crate) fn authorize( + pub fn authorize( &self, scope: &ResolvedScope, supplied: Option<&code_search::CodeIndexSearchAuthorityV1>, diff --git a/crates/tracedecay/src/daemon/remote_protocol.rs b/crates/tracedecay-daemon-service/src/remote_protocol.rs similarity index 96% rename from crates/tracedecay/src/daemon/remote_protocol.rs rename to crates/tracedecay-daemon-service/src/remote_protocol.rs index b8c7cf2ebe..1ddef26dfa 100644 --- a/crates/tracedecay/src/daemon/remote_protocol.rs +++ b/crates/tracedecay-daemon-service/src/remote_protocol.rs @@ -41,7 +41,7 @@ use tracedecay_contracts::{ use tracedecay_domain::{EnrollmentCredentialRecordV1, UtcMicros}; use tracedecay_tool_catalog::SchemaId; -use tracedecay_daemon_service::DaemonInvocationService; +use crate::DaemonInvocationService; use tracedecay_domain::errors::{Result, TraceDecayError}; use tracedecay_store_runtime::remote_credentials::{ presented_spool_keyring, remote_authority_unavailable_response, @@ -52,20 +52,7 @@ use tracedecay_store_runtime::{ mod observability; -#[cfg(test)] -pub(super) fn remote_query_result_observation( - operation_ref: &str, - expected_shards: usize, - result: &tracedecay_contracts::remote::query::RemoteQueryResultV1, - terminal_succeeded: tracedecay_domain::ObservedTernaryV1, -) -> tracedecay_domain::RemoteCoverageObservedV1 { - observability::remote_query_result_observation( - operation_ref, - expected_shards, - result, - terminal_succeeded, - ) -} +pub use observability::remote_query_result_observation; use tracedecay_store_runtime::{DaemonRemoteCredentialAuthorityV1, DaemonRemoteCredentialLookupV1}; @@ -350,7 +337,7 @@ macro_rules! impl_daemon_remote_recovery_protocol { } #[hotpath::measure(label = "daemon.remote.router_build")] -pub(crate) fn build_daemon_remote_protocol_router( +pub fn build_daemon_remote_protocol_router( credentials: Arc, transaction: Arc, invocation: DaemonInvocationService, diff --git a/crates/tracedecay/src/daemon/remote_protocol/observability.rs b/crates/tracedecay-daemon-service/src/remote_protocol/observability.rs similarity index 99% rename from crates/tracedecay/src/daemon/remote_protocol/observability.rs rename to crates/tracedecay-daemon-service/src/remote_protocol/observability.rs index 91d51c8729..2fc4649919 100644 --- a/crates/tracedecay/src/daemon/remote_protocol/observability.rs +++ b/crates/tracedecay-daemon-service/src/remote_protocol/observability.rs @@ -21,7 +21,7 @@ use tracedecay_domain::{ RemoteAuthorityUnavailableReasonV1, RemoteCoverageObservedV1, RemoteOperationV1, UtcMicros, }; -use tracedecay_daemon_service::DaemonInvocationService; +use crate::DaemonInvocationService; use tracedecay_store_runtime::remote_credentials::remote_authority_unavailable_response; use tracedecay_store_runtime::{ DaemonRemoteCredentialAuthorityV1, DaemonRemoteExactObservationQueryPortV1, @@ -115,7 +115,7 @@ pub(super) fn record_remote_query_response( ); } -pub(super) fn remote_query_result_observation( +pub fn remote_query_result_observation( operation_ref: &str, expected_shards: usize, result: &RemoteQueryResultV1, diff --git a/crates/tracedecay/src/daemon.rs b/crates/tracedecay/src/daemon.rs index 9335f785dc..0c25711c1a 100644 --- a/crates/tracedecay/src/daemon.rs +++ b/crates/tracedecay/src/daemon.rs @@ -196,7 +196,6 @@ use bootstrap_route::{ }; mod branch_add; mod branch_admin; -mod callable_code_authorization; use tracedecay_code_index_runtime::code_index_branch_diff::code_index_branch_diff_executor; use tracedecay_code_index_runtime::code_index_executor::code_index_search_executor; #[cfg(test)] @@ -256,7 +255,6 @@ pub(crate) mod project_open_owners; pub(crate) use dashboard_configuration_test_runtime::{ dashboard_configuration_authorities_for_test, register_dashboard_test_retained_runtime, }; -pub(crate) mod query_authority_provider; #[cfg(any(test, feature = "test-transport"))] pub(crate) mod retained_test_support; mod shutdown_coordination; @@ -280,7 +278,6 @@ use graph_resolution::retained_project_server_resolver; mod http_application; pub use http_application::live_remote_operational_status; mod http_application_router; -pub(crate) mod remote_protocol; pub(crate) mod retained_owner; use http_application_router::{ install_http_application_cold_resolver, install_remote_http_application_router, @@ -392,7 +389,6 @@ use project_server_lifecycle::{ schedule_project_server_retirement, schedule_user_profile_host_admission_replay_for_identity, shutdown_project_servers, }; -mod query_mcp_admission; #[cfg(unix)] mod scheduler; #[cfg(test)] diff --git a/crates/tracedecay/src/daemon/http_application_router.rs b/crates/tracedecay/src/daemon/http_application_router.rs index bb24fa3f72..ea6d3bec04 100644 --- a/crates/tracedecay/src/daemon/http_application_router.rs +++ b/crates/tracedecay/src/daemon/http_application_router.rs @@ -103,7 +103,7 @@ pub(super) async fn install_remote_http_application_router( ) -> Result<()> { let runtime = store_administration.registered_runtime_registry().await?; let credentials = runtime.remote_credential_authority(); - let router = super::remote_protocol::build_daemon_remote_protocol_router( + let router = tracedecay_daemon_service::build_daemon_remote_protocol_router( Arc::clone(&credentials), runtime.remote_replay_transaction(), invocation.service.clone(), diff --git a/crates/tracedecay/src/daemon/http_application_tests.rs b/crates/tracedecay/src/daemon/http_application_tests.rs index 075258330c..5f4d6b4afc 100644 --- a/crates/tracedecay/src/daemon/http_application_tests.rs +++ b/crates/tracedecay/src/daemon/http_application_tests.rs @@ -1104,7 +1104,7 @@ async fn authenticated_remote_node_provisioning_creates_and_registers_first_stor }) .to_string(); let credentials = runtime.remote_credential_authority(); - let remote = super::remote_protocol::build_daemon_remote_protocol_router( + let remote = tracedecay_daemon_service::build_daemon_remote_protocol_router( Arc::clone(&credentials), runtime.remote_replay_transaction(), DaemonInvocationService::default(), @@ -1161,7 +1161,7 @@ async fn remote_protocol_mount_authenticates_before_json_and_outside_local_admis ) .expect("remote replay transaction authority"), ); - let router = super::remote_protocol::build_daemon_remote_protocol_router( + let router = tracedecay_daemon_service::build_daemon_remote_protocol_router( Arc::clone(&credentials), transaction, DaemonInvocationService::default(), @@ -1236,7 +1236,7 @@ async fn local_remote_status_reads_the_mounted_runtime() { ); let credentials = runtime.remote_credential_authority(); credentials.publish_listener_serving(); - let remote = super::remote_protocol::build_daemon_remote_protocol_router( + let remote = tracedecay_daemon_service::build_daemon_remote_protocol_router( Arc::clone(&credentials), runtime.remote_replay_transaction(), DaemonInvocationService::default(), diff --git a/crates/tracedecay/src/daemon/http_application_tests/remote_tls.rs b/crates/tracedecay/src/daemon/http_application_tests/remote_tls.rs index e706376696..cc23b001cf 100644 --- a/crates/tracedecay/src/daemon/http_application_tests/remote_tls.rs +++ b/crates/tracedecay/src/daemon/http_application_tests/remote_tls.rs @@ -85,7 +85,7 @@ fn unprovisioned_remote_registry(identity: &str) -> DaemonHttpApplicationRegistr ) .expect("remote replay transaction authority"), ); - let router = crate::daemon::remote_protocol::build_daemon_remote_protocol_router( + let router = tracedecay_daemon_service::build_daemon_remote_protocol_router( Arc::clone(&credentials), transaction, DaemonInvocationService::default(), @@ -824,7 +824,7 @@ async fn remote_tls_listener_serves_only_remote_routes_and_isolates_credential_a .expect("provision first TLS authority enrollment"); let first_credentials = runtime.remote_credential_authority(); - let first_router = crate::daemon::remote_protocol::build_daemon_remote_protocol_router( + let first_router = tracedecay_daemon_service::build_daemon_remote_protocol_router( Arc::clone(&first_credentials), runtime.remote_replay_transaction(), DaemonInvocationService::default(), @@ -950,7 +950,7 @@ async fn remote_tls_listener_bounds_connections_and_expires_incomplete_headers() .await .expect("provision TLS admission credential"); let credentials = runtime.remote_credential_authority(); - let router = crate::daemon::remote_protocol::build_daemon_remote_protocol_router( + let router = tracedecay_daemon_service::build_daemon_remote_protocol_router( Arc::clone(&credentials), runtime.remote_replay_transaction(), DaemonInvocationService::default(), diff --git a/crates/tracedecay/src/daemon/invocation_state.rs b/crates/tracedecay/src/daemon/invocation_state.rs index 5266beca9f..3f9b13a7b1 100644 --- a/crates/tracedecay/src/daemon/invocation_state.rs +++ b/crates/tracedecay/src/daemon/invocation_state.rs @@ -47,7 +47,7 @@ pub(crate) struct DaemonInvocationState { pub(super) github_credential_lifecycle: github_credential_lifecycle::DaemonGitHubReadOnlyCredentialLifecycleV1, pub(super) code_index_schedulers: code_index_scheduler::CodeIndexSchedulerRegistryV1, - query_authority_provider: query_authority_provider::DaemonQueryAuthorityProviderV1, + query_authority_provider: tracedecay_daemon_service::DaemonQueryAuthorityProviderV1, work_federated_query_authority: Arc, semantic_projection_scheduler: tracedecay_application::semantic_runtime::DaemonGlobalSemanticProjectionSchedulerV1, @@ -74,7 +74,7 @@ impl DaemonInvocationState { let service = DaemonInvocationService::with_code_index_schedulers(code_index_schedulers.clone()); let query_authority_provider = - query_authority_provider::DaemonQueryAuthorityProviderV1::default(); + tracedecay_daemon_service::DaemonQueryAuthorityProviderV1::default(); let work_federated_query_authority = Arc::new(DaemonWorkFederatedQueryAuthorityV1 { schedulers: code_index_schedulers.clone(), provider: query_authority_provider.clone(), @@ -446,8 +446,8 @@ impl DaemonInvocationState { state: crate::config::retrieval::RetrievalProfileStateV1, cursor_keys: Arc, ) -> std::result::Result< - query_authority_provider::QueryAuthorityProviderStatusV1, - query_authority_provider::QueryAuthorityUpdateErrorV1, + tracedecay_daemon_service::QueryAuthorityProviderStatusV1, + tracedecay_daemon_service::QueryAuthorityUpdateErrorV1, > { let status = self .query_authority_provider @@ -457,7 +457,7 @@ impl DaemonInvocationState { &state, ) { return Err( - query_authority_provider::QueryAuthorityUpdateErrorV1::ActivationNotCurrent, + tracedecay_daemon_service::QueryAuthorityUpdateErrorV1::ActivationNotCurrent, ); } Ok(status) @@ -470,7 +470,7 @@ impl DaemonInvocationState { ) -> Arc { Arc::new( - query_authority_provider::DaemonQueryActivationRegistrarV1::new( + tracedecay_daemon_service::DaemonQueryActivationRegistrarV1::new( self.query_authority_provider.clone(), self.code_index_schedulers.clone(), project_root.to_path_buf(), @@ -1171,7 +1171,7 @@ fn parse_multi_root_operation( #[derive(Clone)] struct DaemonWorkFederatedQueryAuthorityV1 { schedulers: code_index_scheduler::CodeIndexSchedulerRegistryV1, - provider: query_authority_provider::DaemonQueryAuthorityProviderV1, + provider: tracedecay_daemon_service::DaemonQueryAuthorityProviderV1, } impl WorkFederatedQueryAuthorityPortV1 for DaemonWorkFederatedQueryAuthorityV1 { diff --git a/crates/tracedecay/src/daemon/invocation_tests/types_tests.rs b/crates/tracedecay/src/daemon/invocation_tests/types_tests.rs index 881089125d..cb0c391a03 100644 --- a/crates/tracedecay/src/daemon/invocation_tests/types_tests.rs +++ b/crates/tracedecay/src/daemon/invocation_tests/types_tests.rs @@ -2,9 +2,9 @@ use super::*; use std::any::Any; use std::sync::atomic::Ordering; -use crate::daemon::callable_code_authorization::DaemonCallableCodeAuthorizationSource; use tracedecay_application::ProjectSourceAccessSnapshot; use tracedecay_application::feedback::concrete::open_feedback_runtime; +use tracedecay_daemon_service::DaemonCallableCodeAuthorizationSource; use tracedecay_daemon_service::{DaemonInvocationService, *}; use tracedecay_domain::{ActorId, ConfigurationRevisionId, canonical_sha256}; use tracedecay_hooks::HookBoundaryV1; @@ -995,6 +995,7 @@ async fn feedback_admission_conflicts_construct_zero_losing_producers() { project.path().to_path_buf(), scope.clone(), Arc::clone(graph.configuration_runtime()), + crate::daemon::project_open_owners::daemon_owned_project_source_access_at, )), ), ) @@ -1041,6 +1042,7 @@ async fn feedback_admission_conflicts_construct_zero_losing_producers() { project.path().to_path_buf(), scope.clone(), Arc::clone(graph.configuration_runtime()), + crate::daemon::project_open_owners::daemon_owned_project_source_access_at, )), ) .await; @@ -1128,6 +1130,7 @@ async fn feedback_admission_conflicts_construct_zero_losing_producers() { publisher_root, publisher_scope, publisher_configuration, + crate::daemon::project_open_owners::daemon_owned_project_source_access_at, )), ) .await diff --git a/crates/tracedecay/src/daemon/project_composition.rs b/crates/tracedecay/src/daemon/project_composition.rs index 8ab675787a..5eca72f5b7 100644 --- a/crates/tracedecay/src/daemon/project_composition.rs +++ b/crates/tracedecay/src/daemon/project_composition.rs @@ -1896,13 +1896,14 @@ fn project_code_index_authorities( scope.clone(), ); let graph_read_admission_port: crate::mcp::server::CodeGraphReadAdmissionPort = Arc::new( - crate::daemon::callable_code_authorization::DaemonCodeGraphReadAdmission::production( + tracedecay_daemon_service::DaemonCodeGraphReadAdmission::production( canonical_project_path.to_path_buf(), scope.clone(), Arc::clone(cg.configuration_runtime()), + crate::daemon::project_open_owners::daemon_owned_project_source_access_at, ), ); - let search_admission = query_mcp_admission::admit_query_mcp_read( + let search_admission = tracedecay_daemon_service::admit_query_mcp_read( Some(profile_identity), &project_id, &scope, @@ -1912,7 +1913,7 @@ fn project_code_index_authorities( message: format!("project search admission is unavailable: {error}"), })?; let search_authority = search_admission.search_authority(); - let read_admission_provider = query_mcp_admission::QueryMcpReadAdmissionProviderV1::new( + let read_admission_provider = tracedecay_daemon_service::QueryMcpReadAdmissionProviderV1::new( profile_identity.clone(), project_id.clone(), Arc::clone(route_registered), diff --git a/crates/tracedecay/src/daemon/project_open_owners.rs b/crates/tracedecay/src/daemon/project_open_owners.rs index 205cb15eb2..1baa18c820 100644 --- a/crates/tracedecay/src/daemon/project_open_owners.rs +++ b/crates/tracedecay/src/daemon/project_open_owners.rs @@ -19,7 +19,6 @@ use tracedecay_domain::feedback::GitHubPullRequestIdV1; use tracedecay_domain::{ActorId, ProjectId, UtcMicros, canonical_sha256}; use super::DaemonInvocationState; -use crate::daemon::callable_code_authorization::DaemonCallableCodeAuthorizationSource; use crate::mcp::McpServer; use tracedecay_application::lsp_runtime::DaemonLspSessionFactory; use tracedecay_application::primitives::admitted_root_uri_for_project; @@ -31,6 +30,7 @@ use tracedecay_application::source_authorization::{ ProjectSourceAccessSnapshot, ProjectSourceAccessSnapshotPort, }; use tracedecay_code_index_runtime::git_transactions::DaemonGitIndexTransactionServiceRegistry; +use tracedecay_daemon_service::DaemonCallableCodeAuthorizationSource; use tracedecay_daemon_service::{ DaemonContextScoutRuntimeRegistrationError, DaemonFeedbackRuntimeRegistrationError, DaemonNativeIntegrationRuntimeRegistrar, DaemonWorkProposalRoutingAuthorityV1, @@ -591,6 +591,7 @@ pub(super) async fn register_project_open_production_owners( project_root.to_path_buf(), scope.clone(), Arc::clone(graph.configuration_runtime()), + crate::daemon::project_open_owners::daemon_owned_project_source_access_at, )), ), label = "daemon.project.open.owners.feedback" @@ -1311,7 +1312,7 @@ fn github_repository_from_remote(remote: &str) -> Option<(String, String)> { .then_some((target.owner, target.repository)) } -pub(super) fn daemon_owned_project_source_access_at( +pub(crate) fn daemon_owned_project_source_access_at( scope: &ResolvedScope, project_root: &Path, configuration: &tracedecay_configuration::config::PinnedRuntimeConfiguration, diff --git a/crates/tracedecay/src/daemon/remote_protocol_tests.rs b/crates/tracedecay/src/daemon/remote_protocol_tests.rs index ab21416bed..2a08ade061 100644 --- a/crates/tracedecay/src/daemon/remote_protocol_tests.rs +++ b/crates/tracedecay/src/daemon/remote_protocol_tests.rs @@ -97,7 +97,7 @@ fn remote_query_coverage_preserves_real_shard_and_pending_counts() { ); result.validate().expect("valid stale remote query result"); - let observation = super::remote_protocol::remote_query_result_observation( + let observation = tracedecay_daemon_service::remote_protocol::remote_query_result_observation( "request.remote-coverage", 1, &result, @@ -127,7 +127,7 @@ fn remote_query_coverage_does_not_fabricate_unavailable_pending_count() { .validate() .expect("valid unavailable remote query result"); - let observation = super::remote_protocol::remote_query_result_observation( + let observation = tracedecay_daemon_service::remote_protocol::remote_query_result_observation( "request.remote-coverage-unavailable", 1, &result,