| <!-- Copyright 2026 The Fuchsia Authors. All rights reserved. --> |
| <!-- Use of this source code is governed by a BSD-style license that can be --> |
| <!-- found in the LICENSE file. --> |
| |
| # The Toolbox Capability Routing Mechanism |
| |
| This document blueprints the architectural layout and operational principles of the Fuchsia **Toolbox** component mechanism used by host developer utilities (`ffx`) to communicate with low-level protocols running on target devices. |
| |
| ## Architectural Overview |
| |
| Fuchsia utilizes a component topology model where capabilities (FIDL protocols) are encapsulated and tightly controlled. Host developer tools connected via the **Remote Control Service (RCS)** frequently need to communicate with internal target protocols that reside outside the direct scope of RCS. |
| |
| The **Toolbox** component (`/core/toolbox` or similar product configurations) acts as a centralized capability aggregator and namespace registry. It serves as a dynamic bridge, aggregating developer-centric capabilities exposed by diverse system sub-components and offering them collectively to the Remote Control Service. |
| |
| ```mermaid |
| graph TD |
| Host["Host Terminal (ffx plugin)"] -- Overnet Transport --> RCS["Remote Control Service (RCS)"] |
| RCS -- Namespace Capability Query --> Toolbox["Toolbox Component (/core/toolbox)"] |
| Toolbox -- Route Protocol --> Archivist["Archivist (Logs Engine)"] |
| Toolbox -- Route Protocol --> Lifecycle["Component Manager (Lifecycle)"] |
| ``` |
| |
| ## The Problem It Resolves |
| |
| Without a dedicated toolbox aggregation layer, routing developer tools capabilities would induce significant maintenance costs: |
| 1. **Topology pollution**: Every system component declaration file (`.cml`) would need complex, manual `offer` and `expose` capability blocks linking them directly to RCS. |
| 2. **Security Violations**: Exposing high-privilege debugging capabilities directly to a broad transport service increases attack vectors. The toolbox acts as a local gateway that encapsulates these tools. |
| |
| ## How It Operates |
| |
| 1. **Capability Exposure**: Components that provide debugging or diagnostic hooks (such as the Archivist emitting `fuchsia.diagnostics.ArchiveAccessor`) expose their service protocols up to their parent realms. |
| 2. **Toolbox Collection**: The product configuration offers these specific capability channels into the `toolbox` instance sandbox space. |
| 3. **RCS Binding**: When an `ffx` host plugin initiates an operation (e.g. requesting logs streaming), the host client maps the query to a target protocol type marker. |
| 4. **Moniker Scoped Connect**: RCS intercepts the host request, targets the `/core/toolbox` namespace, and maps the lookup connection using a moniker-scoped path pointer to bind the server socket channel to the client tool. |
| |
| ## Plugin Implementation Code Pattern |
| |
| Host plugin authors do not need to manage raw socket routing manually. The `rcs` and `fho` core developer framework libraries provide high-level convenience wrappers targeting the toolbox namespace layout. |
| |
| Example pattern from the `ffx log` sub-command implementation core: |
| |
| ```rust |
| // Connect to the ArchiveAccessor protocol exposed by the Archivist component via the toolbox namespace |
| let diagnostics_client = rcs_fdomain::toolbox::connect_with_timeout::<ArchiveAccessorMarker>( |
| &rcs_client, |
| Some("bootstrap/archivist"), // Path relative to the toolbox component's capability offers, not the absolute system moniker |
| TIMEOUT, |
| ) |
| .await |
| .map_err(anyhow::Error::from)?; |
| ``` |
| |
| By leveraging the `toolbox` proxy layout modules, host utilities can execute transparent protocol discovery across the full Fuchsia component ecosystem topology safely. |