Skip to main content

pi/
lib.rs

1//! Pi - High-performance AI coding agent CLI
2//!
3//! This library provides the core functionality for the Pi CLI tool,
4//! a Rust port of pi-mono (TypeScript) with emphasis on:
5//! - Performance: Sub-100ms startup, smooth TUI at 60fps
6//! - Reliability: No panics in normal operation
7//! - Efficiency: Single binary, minimal dependencies
8//!
9//! ## Public API policy
10//!
11//! The `pi` crate is primarily the implementation crate for the `pi` CLI binary.
12//! External consumers should treat non-`sdk` modules/types as **unstable**
13//! and subject to change. Use [`sdk`] as the stable library-facing surface.
14//!
15//! Currently intended stable exports:
16//! - [`Error`]
17//! - [`PiResult`]
18//! - [`sdk`] module
19
20#![forbid(unsafe_code)]
21// rch clippy probes without these allowances still expose broad, cross-module
22// dormant surfaces in extension/session/SDK paths. The no-allow inventory is
23// tracked in bd-63x3v.5.1; keep this crate-wide guard until the remaining
24// subsystems are narrowed in their own patches.
25// `unused_async_trait_impl` is the nightly-2026-07-05 successor of
26// `unused_async` for async-trait impl fns (new lint name, so the existing
27// allow does not cover it); same rationale as above.
28#![allow(dead_code, clippy::unused_async, clippy::unused_async_trait_impl)]
29#![cfg_attr(
30    test,
31    allow(
32        unused_variables,
33        clippy::assertions_on_constants,
34        clippy::match_same_arms,
35        clippy::uninlined_format_args,
36        clippy::missing_const_for_fn,
37        clippy::collapsible_if
38    )
39)]
40// Allow pedantic lints during early development - can tighten later
41#![allow(
42    clippy::must_use_candidate,
43    clippy::doc_markdown,
44    clippy::missing_errors_doc,
45    clippy::missing_panics_doc,
46    clippy::module_name_repetitions,
47    clippy::similar_names,
48    clippy::wildcard_imports
49)]
50
51// Allow in-crate tests that include integration test helpers to resolve `pi::...`
52// paths the same way integration tests do.
53extern crate self as pi;
54
55// Gap H: jemalloc allocator for allocation-heavy paths.
56// Declared in the library so all project binaries/tests share allocator behavior.
57// BSD-family targets stay on their platform allocator to avoid allocator-domain
58// mismatch across libc/pthread and C dependencies such as QuickJS.
59#[cfg(all(feature = "jemalloc", any(target_os = "linux", target_os = "macos")))]
60#[global_allocator]
61static GLOBAL_ALLOCATOR: tikv_jemallocator::Jemalloc = tikv_jemallocator::Jemalloc;
62
63#[doc(hidden)]
64pub mod acp;
65#[doc(hidden)]
66pub mod agent;
67#[doc(hidden)]
68pub mod agent_cx;
69#[doc(hidden)]
70pub mod app;
71#[doc(hidden)]
72pub mod auth;
73#[doc(hidden)]
74pub mod autocomplete;
75#[doc(hidden)]
76pub mod buffer_shim;
77#[doc(hidden)]
78pub mod cli;
79#[doc(hidden)]
80pub mod compaction;
81#[doc(hidden)]
82pub mod compaction_worker;
83#[doc(hidden)]
84pub mod config;
85#[doc(hidden)]
86pub mod conformance;
87#[doc(hidden)]
88pub mod conformance_shapes;
89#[doc(hidden)]
90pub mod connectors;
91#[doc(hidden)]
92pub mod crypto_shim;
93#[doc(hidden)]
94pub mod doctor;
95#[doc(hidden)]
96pub mod error;
97#[doc(hidden)]
98pub mod error_hints;
99#[doc(hidden)]
100pub mod extension_conformance_matrix;
101#[doc(hidden)]
102pub mod extension_dispatcher;
103#[doc(hidden)]
104pub mod extension_events;
105#[doc(hidden)]
106pub mod extension_inclusion;
107#[doc(hidden)]
108pub mod extension_index;
109#[doc(hidden)]
110pub mod extension_license;
111#[doc(hidden)]
112pub mod extension_popularity;
113#[doc(hidden)]
114pub mod extension_preflight;
115#[doc(hidden)]
116pub mod extension_replay;
117#[doc(hidden)]
118pub mod extension_scoring;
119#[doc(hidden)]
120pub mod extension_tools;
121#[doc(hidden)]
122pub mod extension_validation;
123#[doc(hidden)]
124pub mod extensions;
125#[doc(hidden)]
126pub mod extensions_js;
127#[doc(hidden)]
128pub mod file_lock;
129#[doc(hidden)]
130pub mod flake_classifier;
131#[doc(hidden)]
132pub mod hostcall_amac;
133#[doc(hidden)]
134pub mod hostcall_io_uring_lane;
135#[doc(hidden)]
136pub mod hostcall_queue;
137#[doc(hidden)]
138pub mod hostcall_rewrite;
139#[doc(hidden)]
140pub mod hostcall_s3_fifo;
141#[doc(hidden)]
142pub mod hostcall_superinstructions;
143#[doc(hidden)]
144pub mod hostcall_trace_jit;
145#[doc(hidden)]
146pub mod http;
147#[doc(hidden)]
148pub mod http_shim;
149#[cfg(feature = "tui")]
150#[doc(hidden)]
151pub mod interactive;
152#[doc(hidden)]
153pub mod keybindings;
154#[doc(hidden)]
155pub mod migrations;
156#[doc(hidden)]
157pub mod model;
158#[doc(hidden)]
159pub mod model_routing;
160#[doc(hidden)]
161pub mod model_selector;
162#[doc(hidden)]
163pub mod models;
164#[doc(hidden)]
165pub mod package_manager;
166#[doc(hidden)]
167pub mod perf_build;
168#[doc(hidden)]
169pub mod permissions;
170#[cfg(feature = "wasm-host")]
171#[doc(hidden)]
172pub mod pi_wasm;
173#[doc(hidden)]
174pub mod platform;
175#[doc(hidden)]
176pub mod provider;
177#[doc(hidden)]
178pub mod provider_metadata;
179#[doc(hidden)]
180pub mod providers;
181#[doc(hidden)]
182pub mod resource_governor;
183#[doc(hidden)]
184pub mod resources;
185#[doc(hidden)]
186pub mod rpc;
187#[doc(hidden)]
188pub mod scheduler;
189pub mod sdk;
190#[doc(hidden)]
191pub mod semantic_workspace_graph;
192#[doc(hidden)]
193pub mod session;
194#[doc(hidden)]
195pub mod session_index;
196#[doc(hidden)]
197pub mod session_metrics;
198#[cfg(feature = "tui")]
199#[doc(hidden)]
200pub mod session_picker;
201#[cfg(feature = "sqlite-sessions")]
202#[doc(hidden)]
203pub mod session_sqlite;
204#[doc(hidden)]
205pub mod session_store_v2;
206#[doc(hidden)]
207pub mod sse;
208#[doc(hidden)]
209pub mod swarm_activity_ledger;
210#[doc(hidden)]
211pub mod swarm_flight_recorder;
212#[doc(hidden)]
213pub mod swarm_progress_slo;
214#[doc(hidden)]
215pub mod swarm_replay;
216#[doc(hidden)]
217pub mod terminal_images;
218#[doc(hidden)]
219pub mod theme;
220#[doc(hidden)]
221pub mod tools;
222#[doc(hidden)]
223pub mod tui;
224#[doc(hidden)]
225pub mod validation_broker;
226#[doc(hidden)]
227pub mod vcr;
228#[doc(hidden)]
229pub mod version_check;
230
231pub use error::{Error, Result as PiResult};
232#[doc(hidden)]
233pub use extension_dispatcher::ExtensionDispatcher;
234
235// Conditional re-exports for fuzz harnesses.
236// These expose internal parsing functions that are normally private,
237// gated behind the `fuzzing` feature so they do not appear in the
238// public API during normal builds.
239#[cfg(feature = "fuzzing")]
240#[doc(hidden)]
241pub mod fuzz_exports {
242    //! Re-exports of internal parsing/deserialization functions for
243    //! `cargo-fuzz` / `libFuzzer` harnesses.
244    //!
245    //! Enabled only when the `fuzzing` Cargo feature is active.
246    //! The `fuzz/Cargo.toml` depends on this crate with
247    //! `features = ["fuzzing"]`.
248
249    pub use crate::config::Config;
250    pub use crate::model::{
251        AssistantMessage, ContentBlock, Message, StreamEvent, TextContent, ThinkingContent,
252        ToolCall, ToolResultMessage, Usage, UserContent, UserMessage,
253    };
254    pub use crate::session::{Session, SessionEntry, SessionHeader, SessionMessage};
255    pub use crate::sse::{SseEvent, SseParser};
256    pub use crate::tools::{fuzz_normalize_dot_segments, fuzz_resolve_path};
257
258    // Provider stream processor wrappers for coverage-guided fuzzing.
259    pub use crate::providers::anthropic::fuzz::Processor as AnthropicProcessor;
260    pub use crate::providers::azure::fuzz::Processor as AzureProcessor;
261    pub use crate::providers::cohere::fuzz::Processor as CohereProcessor;
262    pub use crate::providers::gemini::fuzz::Processor as GeminiProcessor;
263    pub use crate::providers::openai::fuzz::Processor as OpenAIProcessor;
264    pub use crate::providers::openai_responses::fuzz::Processor as OpenAIResponsesProcessor;
265    pub use crate::providers::vertex::fuzz::Processor as VertexProcessor;
266}