pub mod formation {
pub use converge_model::formation::{
DeliberatedFormationTemplate, FormationCatalog, FormationKind, FormationPlan,
FormationRequest, FormationTemplate, FormationTemplateMetadata, FormationTemplateQuery,
OpenClawFormationTemplate, ProfileSnapshot, RoleAssignment, ScoredFormationTemplate,
ScoringWeights, StaticFormationTemplate, SuggestorCapability, SuggestorProfile,
SuggestorRole,
};
pub use converge_optimization::suggestors::FormationAssemblySuggestor;
pub use converge_provider::ProviderSelectionSuggestor;
pub use converge_provider_api::{
Capability, CapabilityAssignment, CostClass, LatencyClass, ProviderAssignment,
ProviderRequest,
};
}
pub use converge_core::gates::hitl::{
ContextItem, GateDecision, GateEvent, GateEventKind, GateRequest, GateVerdict, HitlPolicy,
TimeoutAction, TimeoutPolicy,
};
pub use converge_core::gates::{
AuthorityLevel, FlowAction, FlowGateAuthorizer, FlowGateContext, FlowGateInput,
FlowGateOutcome, FlowGatePrincipal, FlowGateResource, FlowPhase, StopReason,
};
pub use converge_core::{
ApprovalPointId, BackendId, Budget, BudgetResource, ChainId, ConstraintName, ConstraintValue,
ContextState, ConvergeError, ConvergeResult, CorrelationId, Criterion, CriterionEvaluator,
CriterionId, CriterionOutcome, CriterionResult, DecisionStep, Engine, EngineHitlPolicy,
EventId, EventQuery, ExperienceEvent, ExperienceEventEnvelope, ExperienceEventKind,
ExperienceEventObserver, ExperienceStore, HitlPause, IntegrityProof, Invariant, InvariantClass,
InvariantResult, LamportClock, MerkleRoot, PackId, RunResult, StreamingCallback, SuggestorId,
TenantId, TraceLinkId, TruthId, TypesBudgets, TypesIntentId, TypesIntentKind, TypesRootIntent,
TypesRunHooks,
};
pub use converge_pack::{
AgentEffect, Context, ContextKey, Fact, ProposedFact, Suggestor, ValidationError,
};
#[cfg(test)]
mod tests {
use super::{
BudgetResource, StopReason,
formation::{
Capability, FormationCatalog, FormationRequest, FormationTemplate,
FormationTemplateMetadata, ProviderRequest, StaticFormationTemplate, SuggestorRole,
},
};
#[test]
fn kernel_reexports_runtime_stop_and_budget_types() {
let stop = StopReason::converged();
assert!(matches!(stop, StopReason::Converged));
assert!(matches!(BudgetResource::Tokens, BudgetResource::Tokens));
}
#[test]
fn kernel_groups_formation_offering_api() {
let formation = FormationRequest {
id: "req-1".to_string(),
required_roles: vec![SuggestorRole::Analysis],
required_capabilities: vec![],
};
let provider = ProviderRequest {
id: "provider-1".to_string(),
required_capabilities: vec![Capability::Reasoning],
backend_requirements: None,
};
assert_eq!(formation.required_roles, vec![SuggestorRole::Analysis]);
assert_eq!(provider.required_capabilities, vec![Capability::Reasoning]);
}
#[test]
fn kernel_reexports_template_catalog_surface() {
let catalog = FormationCatalog::new().with_template(FormationTemplate::static_template(
StaticFormationTemplate::new(FormationTemplateMetadata::new(
"analysis-only",
"Single-role analysis formation",
[SuggestorRole::Analysis],
)),
));
assert_eq!(catalog.len(), 1);
assert_eq!(
catalog.get("analysis-only").map(FormationTemplate::id),
Some("analysis-only")
);
}
}