# 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:

| Module | Source | What's in it |
|---|---|---|
| `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.
