Skip to main content

oino_settings/
lib.rs

1//! `oino-settings`: settings for Oino — global/project layering, migrations, typed
2//! getters, locked atomic writes, and the filesystem layout of the agent and project dirs.
3//!
4//! Boundary: synchronous std I/O only (no async runtime); `oino-core` owns one
5//! [`SettingsManager`] per cwd and hands [`Settings`] snapshots to blocking tasks.
6//!
7//! # API map
8//!
9//! | Module | Contents |
10//! |---|---|
11//! | [`manager`] | [`SettingsManager`]: create / in-memory, trust gating, reload, scoped writes, typed setters |
12//! | [`view`] | [`Settings`]: typed getters with defaults, layer access, extension settings layering |
13//! | [`types`] | [`QueueMode`], [`CacheWarmingMode`], [`ProjectTrustDefault`], [`UiDensity`], resolved setting structs, [`PackageSource`], [`ResourceKind`], [`defaults`] |
14//! | [`error`] | [`SettingsScope`], [`SettingsError`], [`SettingsErrorKind`], [`InvalidSettingError`] |
15//! | [`json`] | merge/migrate/path helpers over [`JsonObject`] |
16//! | [`tools`] | [`tools::resolve_default_tools`], [`tools::apply_tool_modifiers`], [`tools::tool_list_error`] |
17//! | [`paths`] | [`paths::agent_dir`], [`paths::project_dir`], file-name constants, [`paths::env`] names, tilde/`file://` resolution |
18//! | [`storage`] | [`storage::FileLock`] (`<file>.lock`), [`storage::write_atomic`] (shared with other agent-dir files) |
19//! | [`secrets`] | [`SecretStore`]: `<agent>/secrets.json` (0600, locked), extension secrets and secret settings fields |
20//!
21//! # Semantics
22//!
23//! - Project settings (`<cwd>/.oino/settings.json`) load only when the project is trusted and
24//!   override global ones (`<agent>/settings.json`); nested objects deep-merge, arrays replace.
25//! - Resource arrays are read per layer with [`Settings::resource_entries`]; resolution
26//!   (in `oino-resources`) combines both layers, project entries first.
27//! - `httpProxy`, `cacheWarming`, `defaultProjectTrust` and `deviceId` read the global layer only.
28//! - Unknown keys are preserved on write; legacy keys are migrated on load and on write.
29//!
30//! Oino keys: `extensionSettings`, `disabledExtensions`, `serve.*`, `ui.density`.
31
32#![forbid(unsafe_code)]
33#![cfg_attr(
34    test,
35    allow(
36        clippy::unwrap_used,
37        clippy::expect_used,
38        clippy::panic,
39        reason = "tests assert by unwrapping"
40    )
41)]
42
43pub mod error;
44pub mod json;
45pub mod manager;
46pub mod paths;
47pub mod secrets;
48pub mod storage;
49pub mod tools;
50pub mod types;
51pub mod view;
52
53pub use error::{InvalidSettingError, SettingsError, SettingsErrorKind, SettingsScope};
54pub use json::JsonObject;
55pub use manager::SettingsManager;
56pub use secrets::SecretStore;
57pub use types::{
58    BranchSummarySettings, CacheWarmingMode, CompactionSettings, FilteredPackageSource,
59    ImageSettings, PackageSource, ProjectTrustDefault, ProviderRetrySettings, QueueMode,
60    ResourceKind, RetrySettings, ServeSettings, UiDensity, defaults,
61};
62pub use view::{CompactionTokenField, Settings};