# car-runtime
Umbrella entry point for external Rust consumers of Common Agent
Runtime. Bundles the runtime execution layer plus the perception
cluster under a single dependency so consumers don't have to track
which internal workspace crate exposes which type.
## What it bundles
Re-exports as namespaced sub-modules:
| `engine` | [`car-engine`](../car-engine) | `Runtime`, IR types (`Action`, `ActionProposal`, `Evidence`, …), `StateStore`, `EventLog`, `PolicyEngine`, `Planner`, `VerifyIssue`, capability + authz + rate-limit machinery |
| `sandbox` | [`car-sandbox`](../car-sandbox) | `SandboxPolicy`, `preflight`, `filter_sensitive_env`, `SENSITIVE_ENV_VARS` |
| `active_planner` | [`car-active-planner`](../car-active-planner) | `ActivePlannerConfig`, `ActiveReplanAdapter`, `Strategy`, `generate_candidates` |
| `browser` | [`car-browser`](../car-browser) | `BrowserToolExecutor`, `ChromiumBackend`, perception pipeline |
| `desktop` | [`car-desktop`](../car-desktop) | `DesktopBackend`, mouse/keyboard/window models, permission probes |
| `ast` | [`car-ast`](../car-ast) | `Language`, `ProjectIndex`, tree-sitter symbol extraction |
| `voice` | [`car-voice`](../car-voice) | `Listener`, `Speaker`, voice mixer, speaker enrollment, narration |
## Sibling published crates (NOT in this umbrella)
Each is a distinct subsystem and many apps consume only one of
them — so they ship as their own published crates rather than
folding into `car-runtime`:
- [`car-memgine`](../car-memgine) — graph memory + skill distillation
- [`car-inference`](../car-inference) — model gateway
- [`car-multi`](../car-multi) — multi-agent coordination + built-in agents
- [`car-server-core`](../car-server-core) — daemon protocol types
## Usage
```toml
[dependencies]
car-runtime = "0.8"
```
```rust
use car_runtime::engine::{Runtime, RuntimeOptions};
use car_runtime::sandbox::SandboxPolicy;
use car_runtime::desktop::models::Frame;
```
The module-renaming `pub use car_X as X` preserves all nested
module access, so `car_runtime::desktop::models::*` reads
identically to `car_desktop::models::*`.
## Migrating from per-crate deps
Mechanical sed across consumers:
```
use car_engine:: → use car_runtime::engine::
use car_sandbox:: → use car_runtime::sandbox::
use car_active_planner:: → use car_runtime::active_planner::
use car_browser:: → use car_runtime::browser::
use car_desktop:: → use car_runtime::desktop::
use car_ast:: → use car_runtime::ast::
use car_voice:: → use car_runtime::voice::
```
Plus the `Cargo.toml` trim — replace those seven direct deps with
the single `car-runtime` dep.
## Why
Originally raised as
[`Parslee-ai/car#205`](https://github.com/Parslee-ai/car/issues/205)
after the v0.9.0 release postmortem flagged the 41-crate publish
surface as the primary release-loop friction point. This crate
is the "Path A" deliverable from that issue's discussion —
external API cleanup without workspace consolidation. The publish
surface itself doesn't shrink (the underlying workspace crates
still ship to crates.io because cargo's publish rules require it)
but consumer ergonomics do.