//! kei-router — NL query to canonical tool-call dispatcher.
//!
//! Constructor Pattern: one cube = one file. Public API:
//!   - [`Router::new`] — build with default rules
//!   - [`Router::route`] — parse query, return [`RouteResult`]
//!   - [`Router::add_dynamic`] — append runtime keyword rules
//!
//! Ported behavior (no ML fallback — upstream ML predictor dropped per task spec):
//!   * regex-based param extraction (path / limit / depth / id / URI / KV)
//!   * keyword-table dispatch, `require` predicate, first-match wins
//!   * fallback to `search_code` (if path seen) else `search_knowledge`

pub mod extract;
pub mod keywords;
pub mod kw_tables;
pub mod router;
pub mod rules;

pub use extract::{extract_params, Extracted};
pub use router::{Method, RouteResult, Router};
pub use rules::{DynRule, KeywordRule};
