1mod provider_selection;
11
12pub use provider_selection::{
13 ProviderAssignmentPayload, ProviderRequestPayload, ProviderSelectionSuggestor,
14};
15
16pub mod formation {
17 pub use crate::{
25 ProviderAssignmentPayload, ProviderRequestPayload, ProviderSelectionSuggestor,
26 };
27 pub use converge_model::formation::{
28 DeliberatedFormationTemplate, FormationCatalog, FormationKind, FormationPlan,
29 FormationRequest, FormationTemplate, FormationTemplateMetadata, FormationTemplateQuery,
30 OpenClawFormationTemplate, ProfileSnapshot, RoleAssignment, ScoredFormationTemplate,
31 ScoringWeights, StaticFormationTemplate, SuggestorCapability, SuggestorProfile,
32 SuggestorRole,
33 };
34 pub use converge_optimization::suggestors::FormationAssemblySuggestor;
35 pub use converge_provider::{
36 Capability, CapabilityAssignment, CostClass, LatencyClass, ProviderAssignment,
37 ProviderRequest,
38 };
39}
40
41pub mod admission {
42 pub use converge_model::{
48 AdmissionActor, AdmissionActorKind, AdmissionContent, AdmissionError, AdmissionReceipt,
49 AdmissionRequest, AdmissionSource,
50 };
51
52 use crate::{ContextState, ConvergeError};
53
54 pub fn admit_observation(
56 context: &mut ContextState,
57 request: AdmissionRequest,
58 ) -> Result<AdmissionReceipt, ConvergeError> {
59 context.submit_observation(request)
60 }
61}
62
63pub use converge_core::gates::hitl::{
64 ContextItem, GateDecision, GateEvent, GateEventKind, GateRequest, GateVerdict, HitlPolicy,
65 TimeoutAction, TimeoutPolicy,
66};
67pub use converge_core::gates::{
68 AuthorityLevel, FlowAction, FlowGateAuthorizer, FlowGateContext, FlowGateInput,
69 FlowGateOutcome, FlowGatePrincipal, FlowGateResource, FlowPhase, StopReason,
70};
71pub use converge_core::recall::{
72 CandidateProvenance, CandidateSourceType, RecallCandidate, RecallPolicy, RecallQuery,
73 RecallUse, RelevanceLevel, recall_from_store,
74};
75pub use converge_core::{
76 AdmissionActor, AdmissionActorKind, AdmissionContent, AdmissionError, AdmissionReceipt,
77 AdmissionRequest, AdmissionSource, ApprovalPointId, BackendId, BoundaryKind, BoundaryTarget,
78 Budget, BudgetResource, ChainId, ConstraintName, ConstraintValue, ContextSnapshot,
79 ContextState, ConvergeError, ConvergeResult, CorrectionTarget, CorrelationId, Criterion,
80 CriterionEvaluator, CriterionId, CriterionOutcome, CriterionResult, DecisionStep, Engine,
81 EngineHitlPolicy, EventId, EventQuery, ExperienceEvent, ExperienceEventEnvelope,
82 ExperienceEventKind, ExperienceEventObserver, ExperienceRecord, ExperienceStore,
83 ExperienceStoreError, ExperienceStoreResult, FactContent, FactContentKind, HitlPause,
84 IntegrityProof, Invariant, InvariantClass, InvariantResult, LamportClock, MerkleRoot,
85 OverrideTarget, PackId, RunResult, StreamingCallback, SuggestorId, TenantId, TraceLinkId,
86 TruthId, TypesBudgets, TypesIntentId, TypesIntentKind, TypesRootIntent, TypesRunHooks,
87 UnitInterval, UserExperienceEvent, UserExperienceEventEnvelope,
88};
89pub use converge_pack::{
90 AgentEffect, ArtifactId, Context, ContextFact, ContextKey, FactPayload, ProposedFact,
91 ProvenanceSource, Suggestor, TextPayload, ValidationError,
92};
93
94pub use converge_core::experience_store::ArtifactKind;
98pub use converge_core::governed_artifact::LifecycleEvent;
99pub use converge_core::kernel_boundary::{LocalReplayTrace, RemoteReplayTrace, ReplayTrace};
100
101#[cfg(test)]
102mod tests {
103 use super::{
104 BudgetResource, ContextKey, ContextState, StopReason,
105 admission::{
106 AdmissionActor, AdmissionActorKind, AdmissionContent, AdmissionRequest,
107 AdmissionSource, admit_observation,
108 },
109 formation::{
110 Capability, FormationCatalog, FormationRequest, FormationTemplate,
111 FormationTemplateMetadata, ProviderRequest, StaticFormationTemplate, SuggestorRole,
112 },
113 };
114
115 #[test]
116 fn kernel_reexports_runtime_stop_and_budget_types() {
117 let stop = StopReason::converged();
118 assert!(matches!(stop, StopReason::Converged));
119 assert!(matches!(BudgetResource::Tokens, BudgetResource::Tokens));
120 }
121
122 #[test]
123 fn kernel_groups_formation_offering_api() {
124 let formation = FormationRequest {
125 id: "req-1".to_string(),
126 required_roles: vec![SuggestorRole::Analysis],
127 required_capabilities: vec![],
128 };
129 let provider = ProviderRequest {
130 id: "provider-1".to_string(),
131 required_capabilities: vec![Capability::Reasoning],
132 backend_requirements: None,
133 };
134
135 assert_eq!(formation.required_roles, vec![SuggestorRole::Analysis]);
136 assert_eq!(provider.required_capabilities, vec![Capability::Reasoning]);
137 }
138
139 #[test]
140 fn kernel_reexports_template_catalog_surface() {
141 let catalog = FormationCatalog::new().with_template(FormationTemplate::static_template(
142 StaticFormationTemplate::new(FormationTemplateMetadata::new(
143 "analysis-only",
144 "Single-role analysis formation",
145 [SuggestorRole::Analysis],
146 )),
147 ));
148
149 assert_eq!(catalog.len(), 1);
150 assert_eq!(
151 catalog.get("analysis-only").map(FormationTemplate::id),
152 Some("analysis-only")
153 );
154 }
155
156 #[test]
157 fn kernel_admission_stages_observation() {
158 let mut context = ContextState::new();
159 let request = AdmissionRequest::new(
160 AdmissionActor::new("organism-runtime", AdmissionActorKind::System).unwrap(),
161 AdmissionSource::new("truth-document").unwrap(),
162 ContextKey::Seeds,
163 "truth-doc-1",
164 AdmissionContent::new(r#"{"claim":"approved source"}"#).unwrap(),
165 )
166 .unwrap();
167
168 let receipt = admit_observation(&mut context, request).unwrap();
169
170 assert!(receipt.staged());
171 assert_eq!(receipt.proposal_id().as_str(), "truth-doc-1");
172 }
173}