# openshell-core Shared types, constants, configuration, and helpers used across OpenShell crates. ## Object Metadata Top-level user-facing objects use a Kubernetes-style metadata convention. The metadata shape provides: - Stable server-generated ID. - Human-readable name. - Creation timestamp. - Optional labels for filtering and automation. Code that works with object metadata should use the traits in `openshell_core::metadata` instead of reaching into protobuf fields directly: ```rust use openshell_core::{ObjectId, ObjectLabels, ObjectName}; let id = sandbox.object_id(); let name = sandbox.object_name(); let labels = sandbox.object_labels(); ``` Trait methods must tolerate missing metadata and return safe empty values rather than panicking. ## Label Rules Labels follow Kubernetes-style key and value conventions: - Keys may include an optional DNS-prefix followed by `/`. - Names are limited to alphanumeric characters plus `-`, `_`, and `.`. - Values use the same character set and may be empty. - Selectors use comma-separated `key=value` pairs with AND semantics. Validate labels at API ingress before persisting objects. ## Inference Profiles Provider inference profiles live in this crate so the gateway, sandbox, and router agree on provider defaults. Profiles define: - Auth header style. - Default upstream headers. - Client-supplied passthrough headers. - Supported inference protocol shapes. Do not duplicate provider-specific inference behavior in callers. Add shared behavior here, then consume it from the gateway, sandbox, and router. ## Middleware Contracts Built-in supervisor middleware identifiers, host-selector matching, and pure configuration validation live in `openshell_core::middleware`. Policy admission and the supervisor runtime consume the same contract without introducing a dependency from the policy crate to the supervisor implementation. ## Extension Capabilities Extensions advertise namespaced string capabilities through `PeerMetadata`. Use shared constants in `extension_protocol` and pass optional capabilities to `extension_metadata`; do not add per-driver booleans for policy features. Negotiation validates and retains the extension's supported capability list. `POLICY_UI_V1` (`openshell.policy.ui.v1`) declares complete startup UI-policy support. The gateway checks the effective policy before driver validation or creation and rejects any explicit UI section when the capability is absent. Supporting drivers validate and enforce the concrete settings. Omitted UI preserves existing driver behavior; changing UI requires sandbox recreation. ## Protobuf Struct Conversion Use `openshell_core::proto_struct` when crossing between `serde_json` values and `prost_types::{Struct, Value}`. Both conversion directions live in this module; JSON-to-protobuf conversion is fallible so callers cannot silently replace an unrepresentable number.