crates/dwarves-embed/Cargo.toml
[package]
name = "dwarves-embed"
version = "0.1.0"
edition = "2021"
description = "Backend-(2) native embed adapter: a THIN tonic gRPC client for dwarves-server's read-only `GetRunReport` RPC that reconstructs a `dwarves` `RunReport` (parent RunRow + per-step BuildRows with `needs` edges) + its build DAG client-side and renders it on the shared `facett-pipeline` viewer via `ForgePipelineAdapter::from_report`. Exposes `fn panel(endpoint) -> Box<dyn Panel>` so any egui host (dwarves-gui) can drop the LIVE forge run into a tab — WITHOUT linking the `dwarves` server feature and WITHOUT a `nornir` dep (that would be a dependency cycle). The reusable `<guest>-embed` shape (nornir-funnel-embed is the template)."
license = "MIT OR Apache-2.0"
repository = "https://git.gunnar.rs/nordisk/dwarves"
# publish = true (2026-08-23) — required by `dwarves-gui`, which now publishes so the
# `dwarves-ui-gpu` binary can ship. The `false` here named no condition either.
publish = true
[features]
# Record the pane's functional-status cells into the nornir test-matrix (via
# facett-core → edda nornir-testmatrix). OFF by default (emit is a no-op).
testmatrix = ["facett-core/testmatrix"]
# Wire the CI/CD wizard pane's Run to the REAL encrypted vault (`dwarves::vault`):
# once the vault is UNLOCKED (Settings' passphrase gate / a live `Session`), a Run pulls
# the declared credential(s) BY NAME into the runner env via `dwarves::vault::inject_secret_env`
# (fails closed when locked — the run refuses rather than dispatch a blank). OFF by
# default: the shipped demo + robot tests keep the vault-free wizard (declared injections
# are recorded but no secret is pulled). Enables `dwarves/vault`; unified with the demo's
# `vault` feature. Native-only.
vault = ["dwarves/vault"]
[dependencies]
# The forge domain types + the pipeline adapter. Pulled LEAN (no CLI/server/tonic):
# only the `facett-adapter` feature, exactly like the demo's in-process Pipeline tab.
# dwarves-embed → dwarves is a clean one-way edge (dwarves never depends back).
dwarves = { path = "../dwarves", version = "0.2.0", default-features = false, features = ["facett-adapter"] }
# The engine-agnostic pipeline viewer the report reconstructs onto (the REUSED DAG
# viewer — "show another engine's pipeline = a new ADAPTER, not a new viewer"). The
# `runa-adapter` feature adds `RunaPipelineAdapter` so the CI/CD wizard pane lights a
# GENERATED `dwarves_runa::Pipeline`'s stage DAG live (reuse, never a new viewer).
facett-pipeline = { path = "../../../facett/facett-pipeline", version = "0.2.0", features = ["runa-adapter"] }
# The typed CI/CD pipeline schema — the wizard pane builds a `dwarves_runa::Pipeline` from the
# human's picks (via `dwarves::pipeline_wizard`) and renders it. runa owns the schema.
dwarves-runa = { path = "../../../edda/crates/dwarves-runa", version = "0.3.0" }
# The engine-agnostic RELEASE-CONVERGENCE viewer (the 3-plane LOCAL·SPARRING·CRATES_IO
# render). The dwarves UI Release pane REUSES it verbatim (L5) — it takes the neutral
# `ReleaseConvergence` model (a fixture, or one the release run wrote via dwarves'
# `convergence_adapter`) and wraps `ReleaseView` as a `Box<dyn Panel>`. No new viewer.
facett-releaseview = { path = "../../../facett/facett-releaseview", version = "0.2.0" }
# The SHARED test-matrix GRID (`MatrixView` — repo×aspect coloured cell grid + health).
# The Testmatrix|Benches pane REUSES it verbatim (L5) for the testmatrix half; it takes
# `nornir_testmatrix::TestResultRow`s (which facett-matrix re-exports) and paints the
# grid — no twinned matrix renderer.
facett-matrix = { path = "../../../facett/facett-matrix", version = "0.2.0" }
# The project-agnostic BENCH read/history API (edda; egui-free). The Benches half of the
# pane CONSUMES its `history::read_all` → `Vec<BenchRun>` (the 105 `nornir.mimir.<populate|
# search>.<op>_<size>` runs) as DATA over the file seam, exactly as the Release pane reads
# the convergence file. No bench viewer exists to reuse (nornir-bench carries no egui), so
# the trend render is dwarves-owned, fed by this read API — not a twinned harness.
nornir-bench = { path = "../../../edda/crates/nornir-bench", version = "0.2.0" }
# The lean saga engine (edda leaf) — the Saga tape-recorder pane REUSES its
# `ui::Player` transport (step/seek/seek_ms/speed), the `ui::saga_to_ui` event→
# movement bridge, `summarize_sessions`/`SagaSessionSummary` (painful-first rail),
# `ReplayPlan`, and `SessionFrustration` (the RED stuck-step marker). Pure serde/
# anyhow (no egui/iceberg); the tape it reads is the `.jsonl` the `dwarves saga
# import` verb lands (via `dwarves::saga::workspace_saga_tape_path`). No twin — the
# replay math lives once in the crate. Same path as the dwarves crate uses (unifies).
nornir-saga = { path = "../../../edda/crates/nornir-saga", version = "0.2.0" }
# The shared test-result row SCHEMA + the durable `JsonFileSink::read_all` reader — the
# testmatrix half reads a workspace's persisted matrix JSONL through it (the same sink a
# leaf `nornir test` run writes). facett-matrix re-exports the row type; this direct edge
# is only for the file reader. Pulled from the REGISTRY (not the path) so it UNIFIES with
# the exact `nornir-testmatrix` facett-matrix compiles against — one `TestResultRow` type,
# no duplicate-crate mismatch (local edda 0.2.7 == the published 0.2.7).
nornir-testmatrix = "0.2"
# The Panel/Facet seam (`panel()` returns `Box<dyn Panel>`).
facett-core = { path = "../../../facett/facett-core", version = "0.3.0" }
# The SHARED job/task-list widget (task-manager tree — sort/fold/kind-filter,
# agent-aware) — the Live Jobs pane REUSES it (L5, do NOT hand-roll a jobs list),
# fed live from the jera ledger instead of a fixture.
facett-jobview = { path = "../../../facett/facett-jobview", version = "0.2.0" }
# The SHARED generic data-table (columns + string rows, striped grid, sort/select) —
# the holger build-MATRIX pane REUSES it to render the 3-tier table (L5, do NOT twin a
# table renderer); the pane just formats each tier row to strings.
facett-table = { path = "../../../facett/facett-table", version = "0.2.0" }
# The canonical, shared job LEDGER (edda). `default-features = false` drops jera's
# bollard/KVM backends — the Live Jobs pane needs only `jera::jobs` (the redb ledger
# read: `JobStore::open_read_only` + `list`), the single source of "what ran where".
jera = { path = "../../../edda/crates/jera", version = "0.2.0", default-features = false }
egui = "0.36"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
anyhow = "1"
# Thin gRPC client to dwarves-server (client-only; no server/router feature).
tonic = { version = "0.14", default-features = false, features = ["transport", "codegen"] }
prost = "0.14"
tonic-prost = "0.14"
tokio = { version = "1", features = ["rt", "time"] }
# The ONE client-side `authorization: Bearer <token>` builder (Law #1) — consumed,
# never twinned as a per-site `format!("Bearer …").parse()` stamp.
nornir-service = { path = "../../../edda/crates/nornir-service", version = "0.1.12" }
[build-dependencies]
tonic-prost-build = { version = "0.14" }
protox = "0.9"
[dev-dependencies]
# The ledger-lifecycle test writes a REAL jera ledger into a real temp dir and then
# unlinks it, so the three states (absent / empty / rows) are asserted against files
# on disk rather than against a mocked reader. Already in the lock (workspace-wide).
tempfile = "3"