Skip to main content

codineer_runtime/
lib.rs

1mod bash;
2mod compact;
3mod config;
4mod conversation;
5mod file_ops;
6mod hooks;
7mod json;
8mod mcp;
9mod mcp_client;
10mod mcp_remote;
11mod mcp_stdio;
12mod oauth;
13mod permissions;
14mod prompt;
15mod remote;
16pub mod sandbox;
17mod session;
18mod usage;
19
20pub use bash::{execute_bash, BashCommandInput, BashCommandOutput};
21pub use compact::{
22    compact_session, estimate_session_tokens, format_compact_summary,
23    get_compact_continuation_message, should_compact, CompactionConfig, CompactionResult,
24};
25pub use config::{
26    ConfigEntry, ConfigError, ConfigLoader, ConfigSource, McpConfigCollection,
27    McpManagedProxyServerConfig, McpOAuthConfig, McpRemoteServerConfig, McpSdkServerConfig,
28    McpServerConfig, McpStdioServerConfig, McpTransport, McpWebSocketServerConfig, OAuthConfig,
29    ResolvedPermissionMode, RuntimeConfig, RuntimeFeatureConfig, RuntimeHookConfig,
30    RuntimePluginConfig, ScopedMcpServerConfig, CODINEER_SETTINGS_SCHEMA_NAME,
31};
32pub use conversation::{
33    ApiClient, ApiRequest, AssistantEvent, ConversationRuntime, RuntimeError, StaticToolExecutor,
34    ToolError, ToolExecutor, TurnSummary,
35};
36pub use file_ops::{
37    edit_file, glob_search, grep_search, read_file, write_file, EditFileOutput, GlobSearchOutput,
38    GrepOutputMode, GrepSearchInput, GrepSearchOutput, ReadFileOutput, StructuredPatchHunk,
39    TextFilePayload, WriteFileOutput,
40};
41pub use hooks::{HookCommandSource, HookEvent, HookRunResult, HookRunner};
42pub use lsp::{
43    FileDiagnostics, LspContextEnrichment, LspError, LspManager, LspServerConfig, SymbolLocation,
44    WorkspaceDiagnostics,
45};
46pub use mcp::{
47    mcp_server_signature, mcp_tool_name, mcp_tool_prefix, normalize_name_for_mcp,
48    scoped_mcp_config_hash, unwrap_mcp_proxy_url,
49};
50pub use mcp_client::McpClientBootstrap;
51pub use mcp_stdio::{
52    ManagedMcpTool, McpServerManager, McpServerManagerError, McpStdioProcess, McpTool,
53    McpToolCallContent, McpToolCallResult, UnsupportedMcpServer,
54};
55pub use oauth::{
56    clear_oauth_credentials, generate_pkce_pair, generate_state, load_oauth_credentials,
57    loopback_redirect_uri, parse_oauth_callback_query, parse_oauth_callback_request_target,
58    save_oauth_credentials, OAuthAuthorizationRequest, OAuthCallbackParams, OAuthRefreshRequest,
59    OAuthTokenExchangeRequest, OAuthTokenSet, PkceCodePair,
60};
61pub use permissions::{
62    PermissionMode, PermissionOutcome, PermissionPolicy, PermissionPromptDecision,
63    PermissionPrompter, PermissionRequest,
64};
65pub use prompt::{
66    load_system_prompt, load_system_prompt_with_lsp, ContextFile, ProjectContext,
67    SystemPromptBuilder,
68};
69pub use remote::{
70    inherited_upstream_proxy_env, RemoteSessionContext, UpstreamProxyBootstrap, UpstreamProxyState,
71};
72pub use session::{ContentBlock, ConversationMessage, MessageRole, Session, SessionError};
73pub use usage::{format_usd, pricing_for_model, TokenUsage, UsageCostEstimate, UsageTracker};
74
75/// Cross-platform home directory: tries `HOME` first (Unix + WSL), falls back to `USERPROFILE` (Windows).
76#[must_use]
77pub fn home_dir() -> Option<std::path::PathBuf> {
78    std::env::var_os("HOME")
79        .or_else(|| std::env::var_os("USERPROFILE"))
80        .map(std::path::PathBuf::from)
81}
82
83#[cfg(test)]
84fn test_env_lock() -> std::sync::MutexGuard<'static, ()> {
85    use std::sync::Mutex;
86    static ENV_LOCK: Mutex<()> = Mutex::new(());
87    ENV_LOCK
88        .lock()
89        .unwrap_or_else(|poisoned| poisoned.into_inner())
90}