pub use nika_core::ast::analyzed;
pub use nika_core::ast::analyzer;
pub mod lower;
pub use nika_core::ast::raw;
pub mod schema {
pub use nika_core::ast::schema::*;
}
pub mod budget {
pub use nika_core::ast::budget::*;
}
pub mod content {
pub use nika_core::ast::content::*;
}
pub mod agent_def {
pub use nika_core::ast::agent_def::*;
}
pub mod artifact {
pub use nika_core::ast::artifact::*;
}
pub mod context {
pub use nika_core::ast::context::*;
}
pub mod decompose {
pub use nika_core::ast::decompose::*;
}
pub mod logging {
pub use nika_core::ast::logging::*;
}
pub mod output {
pub use nika_core::ast::output::*;
}
pub mod structured {
pub use nika_core::ast::structured::*;
}
#[cfg(test)]
mod tests_200_workflows;
pub mod completion {
pub use nika_core::ast::completion::*;
}
pub mod guardrails {
pub use nika_core::ast::guardrails::*;
}
pub mod include {
pub use nika_core::ast::include::*;
}
pub mod limits {
pub use nika_core::ast::limits::*;
}
mod action;
mod agent;
pub mod import_loader;
pub mod include_loader;
mod invoke;
pub mod loader;
pub mod pkg_resolver;
pub mod schema_validator;
pub mod skill_def;
mod workflow;
pub use action::{ExecParams, FetchParams, InferParams, ResponseFormat, TaskAction};
pub use agent::{AgentParams, ToolChoice};
pub use agent_def::AgentDef;
pub use invoke::InvokeParams;
pub use context::ContextConfig;
pub use include::IncludeSpec;
pub use output::{OutputFormat, OutputPolicy, SchemaRef};
pub use skill_def::{SkillDef, SkillRef};
pub use pkg_resolver::PkgUri;
pub use workflow::{McpConfigInline, Task, Workflow};
pub use decompose::{DecomposeSpec, DecomposeStrategy};
pub use loader::{discover_definitions, load_definition, DefinitionKind, LoadedDefinition};
pub use import_loader::expand_imports;
pub use include_loader::expand_includes;
pub use structured::StructuredOutputSpec;
pub use completion::{
CompletionConfig, CompletionMode, ConfidenceConfig, InstructionConfig, LowConfidenceAction,
PatternConfig, PatternType, SignalConfig, SignalFields,
};
pub use limits::{LimitAction, LimitStatus, LimitType, LimitsConfig, OnLimitReachedConfig};
pub use lower::{lower, unlower};
use crate::ast::analyzed::AnalyzedWorkflow;
use crate::error::NikaError;
use crate::source::FileId;
pub fn parse_workflow(yaml: &str) -> Result<Workflow, NikaError> {
let raw = raw::parse(yaml, FileId(0)).map_err(|e| NikaError::ParseError {
details: format!("[{}] {}", e.kind.code(), e.message),
})?;
let analyzed = analyzer::analyze(raw).into_result().map_err(|errors| {
let messages: Vec<String> = errors
.iter()
.map(|e| format!("[{}] {}", e.kind.code(), e))
.collect();
NikaError::ValidationError {
reason: messages.join("; "),
}
})?;
lower(analyzed)
}
pub fn parse_analyzed(yaml: &str) -> Result<AnalyzedWorkflow, NikaError> {
let raw = raw::parse(yaml, FileId(0)).map_err(|e| NikaError::ParseError {
details: format!("[{}] {}", e.kind.code(), e.message),
})?;
analyzer::analyze(raw).into_result().map_err(|errors| {
let messages: Vec<String> = errors
.iter()
.map(|e| format!("[{}] {}", e.kind.code(), e))
.collect();
NikaError::ValidationError {
reason: messages.join("; "),
}
})
}