1use pyo3::prelude::*;
40use std::ffi::CString;
41
42mod client;
44mod cost;
45mod drift;
46mod models;
47mod replay;
48mod runtime;
49mod sanitization;
50mod storage;
51
52use cost::*;
53use drift::*;
54use models::*;
55use replay::*;
56use runtime::{init_runtime, RuntimeConfig};
57use sanitization::*;
58use storage::*;
59
60#[pyfunction]
62fn init(py: Python) -> PyResult<()> {
63 let config = RuntimeConfig::default();
64 init_runtime(config)?;
65 let import_code = CString::new("import atexit")?;
66 let register_code = CString::new("atexit.register(_shutdown_runtime)")?;
67 py.run(&import_code, None, None)?;
68 py.run(®ister_code, None, None)?;
69 Ok(())
70}
71
72#[pyfunction]
74#[pyo3(signature = (worker_threads = 2))]
75fn init_with_config(worker_threads: usize) -> PyResult<()> {
76 let config = RuntimeConfig { worker_threads };
77 init_runtime(config)
78}
79
80#[pyfunction]
82fn is_initialized() -> bool {
83 runtime::is_initialized()
84}
85
86#[pyfunction]
88fn _shutdown_runtime() -> PyResult<()> {
89 runtime::shutdown_runtime()
90}
91
92#[pymodule]
94fn _core(_py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
95 m.add_class::<PyInput>()?;
97 m.add_class::<PyOutput>()?;
98 m.add_class::<PyModelParameters>()?;
99 m.add_class::<PyExecutionContext>()?;
100 m.add_class::<PyDecisionSnapshot>()?;
101 m.add_class::<PySnapshot>()?;
102
103 m.add_class::<PySqliteBackend>()?;
105 m.add_class::<PyLakeFSBackend>()?;
106
107 m.add_class::<PyDriftCalculator>()?;
109 m.add_class::<PyCostCalculator>()?;
110 m.add_class::<PySanitizer>()?;
111 m.add_class::<PyReplayEngine>()?;
112
113 m.add_class::<PySnapshotQuery>()?;
115
116 m.add_class::<client::PyBriefcaseClient>()?;
118 m.add_class::<client::PyValidatedClient>()?;
119
120 m.add_function(wrap_pyfunction!(init, m)?)?;
122 m.add_function(wrap_pyfunction!(init_with_config, m)?)?;
123 m.add_function(wrap_pyfunction!(is_initialized, m)?)?;
124 m.add_function(wrap_pyfunction!(_shutdown_runtime, m)?)?;
125
126 m.add("__version__", "2.1.27")?;
128 m.add("__author__", "Briefcase AI Team")?;
129
130 Ok(())
131}