Files
Sergio d251eb32b6 chore: refresco desde el monorepo — vello 0.9 / wgpu 29, 120 miembros
El repo publico se habia quedado en julio: el README anunciaba vello 0.7 +
wgpu 27 (dos bumps atras) y faltaban los crates del ultimo mes.

- refresco con scripts/actualizar-standalone.py --llimphi (cargo check OK)
- llegan llimphi-cpu, llimphi-hybrid, llimphi-glifos y llimphi-wire-escena:
  los cuatro caminos a pixeles con un solo compositor
- MANUAL.md / SDD.md / LEEME.md sincronizados con el monorepo
- README: versiones al dia, install por crates.io (cargo add llimphi),
  seccion "beyond the 2D widget kit" y el indice de crates que apuntaba
  al propio README ahora apunta a MANUAL.md §19
2026-08-06 17:26:11 +00:00

741 lines
32 KiB
TOML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Cargo.toml raíz STANDALONE de Llimphi — repo público (GitHub + Gitea).
# GENERADO por scripts/actualizar-standalone.py --llimphi desde el monorepo:
# el árbol 02_ruway/llimphi/* se aplana y `shared/{app-bus,foreign-vox}` se
# vendoriza. `exclude` = crates acoplados al resto del workspace madre.
[workspace]
resolver = "2"
# ============================================================
# Cuadrantes — agregar a medida que se migran
# ============================================================
members = [
"llimphi",
"llimphi-3d",
"llimphi-anim",
"llimphi-anim-studio",
"llimphi-compositor",
"llimphi-cpu",
"llimphi-gallery",
"llimphi-glifos",
"llimphi-gpu-bench",
"llimphi-hal",
"llimphi-hybrid",
"llimphi-icons",
"llimphi-image",
"llimphi-layer",
"llimphi-layout",
"llimphi-lottie",
"llimphi-mesh",
"llimphi-motion",
"llimphi-raster",
"llimphi-surface",
"llimphi-svg",
"llimphi-term-graphics",
"llimphi-test",
"llimphi-text",
"llimphi-theme",
"llimphi-ui",
"llimphi-voxel",
"llimphi-wasm-app-sdk",
"llimphi-wasm-demo-counter",
"llimphi-wasm-demo-form",
"llimphi-wasm-wasi",
"llimphi-wire-escena",
"llimphi-wire-view",
"llimphi-workspace",
"modules/bookmarks",
"modules/command-palette",
"modules/diff-viewer",
"modules/fif",
"modules/file-picker",
"modules/mini-map",
"modules/selector",
"modules/symbol-outline",
"shared/app-bus",
"shared/foreign-lottie",
"shared/foreign-vox",
"shared/grafo",
"widgets/accordion",
"widgets/app-header",
"widgets/avatar",
"widgets/badge",
"widgets/banner",
"widgets/breadcrumb",
"widgets/button",
"widgets/calendar",
"widgets/card",
"widgets/carousel",
"widgets/chip",
"widgets/clipboard",
"widgets/color-picker",
"widgets/context-menu",
"widgets/datetime-picker",
"widgets/detail-table",
"widgets/dock-rail",
"widgets/edit-menu",
"widgets/empty",
"widgets/fab",
"widgets/field",
"widgets/fitted-box",
"widgets/form",
"widgets/gallery",
"widgets/gauge",
"widgets/grid",
"widgets/hero",
"widgets/lazy-list",
"widgets/list",
"widgets/menubar",
"widgets/modal",
"widgets/navigator",
"widgets/nodegraph",
"widgets/panel",
"widgets/panes",
"widgets/progress",
"widgets/rag-sidebar",
"widgets/range-slider",
"widgets/rating",
"widgets/rive-button",
"widgets/router",
"widgets/scaffold",
"widgets/scroll",
"widgets/segmented",
"widgets/select",
"widgets/shortcuts-help",
"widgets/skeleton",
"widgets/slider",
"widgets/spinner",
"widgets/splash",
"widgets/splitter",
"widgets/stat-card",
"widgets/status-bar",
"widgets/stepper",
"widgets/switch",
"widgets/table",
"widgets/tabs",
"widgets/terminal",
"widgets/text-area",
"widgets/text-editor",
"widgets/text-editor-core",
"widgets/text-editor-lsp",
"widgets/text-input",
"widgets/theme-switcher",
"widgets/tiled",
"widgets/timeline",
"widgets/toast",
"widgets/toolbar",
"widgets/tooltip",
"widgets/transport",
"widgets/tree",
"widgets/waveform",
"widgets/wawa-mark",
"widgets/wrap",
]
# `wawa/` se excluye del workspace global porque corre en target
# `x86_64-unknown-none` y `panic = "abort"`, incompatibles con los
# perfiles globales. Los crates compartidos se referencian por `path`
# cruzando la frontera.
# `llimphi-wawa` está EXCLUIDA, no ausente por olvido. Enciende
# `llimphi-text/cpu`, que es el backend EXCLUYENTE del `vello` que todo el resto
# del workspace usa por default — y la unificación de features de cargo los
# junta, disparando el `compile_error!` que llimphi-text tiene justo para
# delatarlo. Vive en el mismo mundo que el kernel: se compila aparte, con su
# propio lock. Sus tests se corren así:
# cargo test --manifest-path llimphi-wawa/Cargo.toml \
# --no-default-features --features std
#
# `llimphi-jaula` está excluida por lo MISMO, del otro lado: enciende
# `llimphi-text/wire`, el tercer backend excluyente (W4). Es la cáscara de una
# app dentro de la jaula WASM — el gemelo de `llimphi-wawa`—, y que las dos estén
# afuera del workspace no es una molestia sino el diseño: son dos procesos en dos
# lados de una frontera, y forzarlos a compartir un lock sería fingir lo
# contrario. Sus tests:
# cargo test --manifest-path llimphi-jaula/Cargo.toml \
# --no-default-features --features std
#
# `llimphi-hybrid-android` está excluida **por contagio**: consume `llimphi-wawa`
# y por lo tanto arrastra el mismo `llimphi-text/cpu`. Es la tercera cáscara de
# la familia —kernel, jaula, teléfono— y cae del mismo lado de la frontera por
# el mismo motivo. Se compila así:
# cargo check --manifest-path \
# android/llimphi-hybrid-android/Cargo.toml
# y se empaca con `android/scripts/build-android.sh`.
exclude = [
"android",
"demo",
"llimphi-jaula",
"llimphi-video-plane",
"llimphi-voxel-app",
"llimphi-voxel-studio",
"llimphi-wasm-core",
"llimphi-wasm-dist",
"llimphi-wasm-net",
"llimphi-wasm-open",
"llimphi-wasm-registry",
"llimphi-wasm-runner",
"llimphi-wawa",
"modules/allichay",
"modules/plugin-host",
"modules/shuma-term",
]
[workspace.package]
version = "0.1.0"
edition = "2021"
rust-version = "1.80"
license = "MIT"
authors = ["Sergio <gerencia@jlsoltech.com>"]
publish = true
repository = "https://git.tawasuyu.net/tawasuyu/llimphi"
[workspace.dependencies]
# === Configuración declarativa (vocabulario de esquemas) ===
# Escala única de `nice` de la sesión (compositor · marco · app · segundo plano
# · lote) + las tres formas de aplicarla (propia / pid vivo / pre_exec).
# Telemetría local de desarrollo (stderr+panics+tracing → $XDG_STATE_HOME/tawasuyu/<dominio>/<bin>.log)
# default = [] (núcleo liviano sin vello); `bake` es opt-in. Declaramos
# default-features = false aquí para que el `default-features = false` de los
# consumidores (splash/greeter/compositor) se honre y no quede el warning.
# === Registro de apps / menú global ===
app-bus = { path = "shared/app-bus", version = "0.1.0" }
# === Centro de eventos (notificaciones + capturas + clipboard + …) ===
# === Puente de drag-and-drop compositor → app (suple winit en Wayland) ===
# === Serialización ===
serde = { version = "1", features = ["derive"] }
serde_json = "1"
lsp-types = "0.97"
serde-big-array = "0.5"
postcard = { version = "1", features = ["use-std"] }
toml = "0.8"
ron = "0.8"
bincode = "1"
base64 = "0.22"
# === Errores ===
thiserror = "2" # bump uniforme; arje (era 1) puede requerir ajustes menores
anyhow = "1"
# === Async ===
tokio = { version = "1", features = ["full"] }
tokio-util = { version = "0.7", features = ["compat"] }
async-trait = "0.1"
futures = "0.3"
# === Observabilidad ===
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
# === Linux primitives (arje) ===
nix = { version = "0.29", features = ["signal", "process", "sched", "mount", "fs", "socket", "net", "user", "reboot"] }
libc = "0.2"
# DRM/KMS legacy (dumb buffer) para el splash nativo del arranque sin parpadeo.
# Misma versión que reexporta smithay (mirada-compositor) — el lock ya la fija.
drm = "0.14"
font8x8 = { version = "0.3", default-features = false }
# === IDs / Hash / Crypto ===
ulid = { version = "1", features = ["serde"] }
uuid = { version = "1", features = ["v4", "rng-getrandom"] }
sha2 = "0.10"
blake3 = "1.5"
ed25519-dalek = "2"
aes-gcm = "0.10"
chacha20poly1305 = "0.10"
argon2 = "0.5"
rand = "0.8"
# TOTP (RFC 6238) del segundo factor de nakui: HMAC-SHA1 es lo que hablan
# Google Authenticator, Aegis y los tokens de hardware — no es elección
# nuestra, es el formato del ecosistema. base32 para el secreto del QR.
hmac = "0.12"
sha1 = "0.10"
data-encoding = "2"
# === WASM (arje) ===
# wasmi 1.0: unifica la versión con wawa (su kernel ya corre 1.0), para
# que el ABI WASM del host sea idéntico en Linux y en bare-metal.
wasmi = "1.0"
wat = "1"
# wasmtime 46 (Fase 1 del pipeline JS): tier 0 de puriy-js pasa de wasmi
# (intérprete) a Wasmtime AOT (Cranelift → nativo) en Linux — quita la doble
# interpretación de QuickJS.wasm. En wawa bare-metal el runtime es Pulley (spike
# Q1 cerrado); mismo crate, distinto backend.
wasmtime = "46"
# === Storage / DB ===
sled = "0.34"
rusqlite = { version = "0.31", features = ["bundled", "blob"] }
# === Ingesta de documentos (iniy-ingest: PDF / EPUB) ===
pdf-extract = "0.7"
epub = "2.1"
# === Bulk import Wikipedia (iniy-wiki dump) ===
bzip2 = "0.4"
# === Compresión (minga multi-bundle) ===
zstd = "0.13"
xz2 = "0.1"
# Contenedores adicionales del visor Archive de nahual (sólo listado).
sevenz-rust = "0.6"
unrar = "0.5"
# === HTTP server (iniy-server) ===
axum = "0.7"
tower = "0.5"
# === ANN sobre embeddings (iniy nli --ann) ===
instant-distance = "0.6"
# === P2P (minga) ===
libp2p = { version = "0.56", features = ["tokio", "tcp", "dns", "noise", "yamux", "macros", "kad", "identify", "relay", "dcutr", "autonat", "mdns"] }
libp2p-stream = "=0.4.0-alpha"
libp2p-allow-block-list = "0.6"
# === SSH (ssh, sandokan RemoteEngine, matilda) ===
russh = "0.54"
# === Math determinista cross-platform (dominium) ===
libm = "0.2"
# === SMF (takiy-midi) ===
# midly: parser/emitter SMF tipo 0/1, no_std-friendly, sin allocs en hot path.
midly = "0.5"
# === Code parsing (minga) ===
# `wayland-data-control` trae el backend wl-clipboard-rs: bajo mirada (Wayland
# propio, sin Xwayland para apps nativas) arboard-x11 fallaba a no-op silencioso
# y el clipboard de los text-editor quedaba muerto. Con la feature habla
# zwlr_data_control_manager_v1 (que mirada expone) y cae a X11 si no hay Wayland.
arboard = { version = "3", features = ["wayland-data-control"] }
ropey = "1.6"
tree-sitter = "0.24"
tree-sitter-rust = "0.23"
tree-sitter-python = "0.23"
tree-sitter-typescript = "0.23"
tree-sitter-javascript = "0.23"
tree-sitter-go = "0.23"
# === FS notify ===
notify = "6.1"
# === Grafos (iniy, nakui-core ya lo usa directo en 0.6) ===
petgraph = "0.6"
# === Image decoding (nahual-image-viewer-llimphi) ===
# default-features = false: nos quedamos con PNG + JPEG + WebP (lossless).
# tullpu-render exporta a las tres; AVIF/TIFF/… los habilitamos si una app
# los pide específicamente.
# Decoders puro-Rust baratos; avif queda fuera (arrastra dav1d/rav1e).
image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "gif", "bmp", "ico", "tiff", "tga", "qoi"] }
# ONNX Runtime para los proveedores de píxel reales (pixel-verbo-onnx: segmentación
# u2net/isnet, inpaint, restyle…). `download-binaries` (default) baja el runtime nativo
# solo; ya lo arrastraba fastembed (rimay-verbo) transitivo — aquí lo declaramos directo.
ort = "2.0.0-rc.9"
# Rasterizador vectorial CPU (relleno/trazo anti-aliased) para capas vectoriales de tullpu.
tiny-skia = "0.11"
# Booleanos de polígonos robustos (union/intersection/difference/xor) para el
# clipper vectorial de tullpu — restar/intersecar paths que se solapan
# parcialmente, que la regla de relleno no expresa. Ya estaba en el lock.
geo = "0.28"
# === FUSE (minga-vfs) ===
# default-features = false: prescinde de pkg-config/libfuse-dev en build.
# El montaje pasa a ser Rust puro (vía el helper `fusermount3` en runtime).
fuser = { version = "0.15", default-features = false }
# === CLI / auth (minga) ===
clap = { version = "4", features = ["derive"] }
rpassword = "7"
# === PAM (auth-core) ===
pam = "0.8"
# === D-Bus (arje compat) ===
zbus = { version = "4", default-features = false, features = ["tokio"] }
# === Tests ===
tempfile = "3"
# === Llimphi (motor gráfico soberano) ===
# wgpu sobre Vulkan/Metal/DX12, winit para ventana en dev Linux.
# raw-window-handle 0.6 alinea winit 0.30 con wgpu 29.
# vello 0.9 = rasterizador vectorial sobre wgpu 29 (renderer GPU "wgpu" + opt-in "hybrid" CPU+GPU).
#
# **El 27→29 no fue por gusto** (2026-07-28): `vello_hybrid 0.0.9` —el ÚNICO
# rasterizador que el driver Mali del teléfono digiere, ver
# `02_ruway/llimphi/android/DIAGNOSTICO.md`— vive en wgpu 29, y dos versiones de
# wgpu no comparten un `Device`. La migración salió barata porque `vello 0.9`
# usa el mismo peniko 0.6.1 y no movió su API de `Scene`: el bump de vello dio
# CERO errores; todos los que hubo fueron deriva de wgpu, y concentrada en los
# cuatro crates que tienen código wgpu propio.
# taffy 0.12 = motor Flexbox/Grid puro Rust (0.9→0.12 en 2026-07-27: arregla el percent de ítem de grid en track sizing).
# parley 0.6 = shaping/layout de texto compatible con peniko 0.6 (que vello 0.7 expone).
wgpu = "29"
# El compilador de shaders que wgpu lleva adentro. Se declara acá para que los
# tests que validan WGSL headless (llimphi-3d, supay-render-llimphi) usen la
# MISMA versión que después compila esos shaders en la GPU. Con dos versiones,
# un test puede dar verde sobre un shader que el runtime rechaza — o al revés.
naga = "29"
winit = "0.30"
raw-window-handle = "0.6"
pollster = "0.4"
# `default-features = false` acá arriba y no en cada consumidor: el default de
# vello es ["wgpu","wgpu_default"], y `llimphi-text`/`llimphi-compositor` sólo
# quieren sus TIPOS (Scene, peniko), no el motor de GPU. Declararlo abajo no
# alcanza — cargo IGNORA `default-features` en un dep heredado si la raíz no lo
# fijó, y lo avisa con un warning fácil de pasar por alto. Quien necesita el
# motor lo pide por feature (ver llimphi-raster).
vello = { version = "0.9", default-features = false }
# Renderer hybrid CPU+GPU sin compute shaders (mejor compat WebGL2/Adreno viejas).
# Opt-in; el renderer "wgpu" sigue siendo el default.
vello_hybrid = "0.0.9"
# foreign-lottie = fork vendorizado de velato 0.9 (Lottie → vello::Scene),
# completado para no paniquear ante features no soportadas. Lo consume
# llimphi-lottie. Ver shared/foreign-lottie.
foreign-lottie = { path = "shared/foreign-lottie", version = "0.1.0" }
# Árbol de accesibilidad para lectores de pantalla (NVDA/VoiceOver/Orca/TalkBack).
# Lo consume el runtime de Llimphi (iter 2/3 del plan AccessKit); el modelo
# `SemanticsSpec` del compositor es independiente de estas crates.
accesskit = "0.24"
accesskit_winit = "0.33"
taffy = "0.12"
# parley = shaping completo (bidi, ligatures, fallback CJK/emoji vía fontique, line break).
parley = "0.6"
# Bucle Elm (input→update→view→layout→raster→present). Lo consumen las apps.
llimphi-ui = { path = "llimphi-ui", version = "0.1.0" }
# El compositor DIRECTO, para que el catálogo de widgets cuelgue de él y no del
# shell de escritorio (W4.6). Un widget que dependa de `llimphi-ui` arrastra
# winit + accesskit + arboard + vello, y con eso queda fuera del alcance de una
# app enjaulada; colgando de acá sirve igual en Linux, en el kernel y en la jaula.
#
# `default-features = false` VA ACÁ Y NO EN CADA WIDGET. Es la trampa recurrente
# de cargo: apagar los defaults desde un miembro NO HACE NADA si el workspace
# declaró la dep sin ellos (cargo lo avisa y lo ignora). Ya pasó con taffy, vello
# y peniko. Sin esto, cada widget encendería el backend `vello` del compositor y
# volvería a quedar fuera del alcance de una app enjaulada — que es justamente lo
# que W4.6 vino a arreglar. Quien ensambla la app elige el backend: `llimphi-ui`
# en Linux, `llimphi-jaula` en la jaula, `llimphi-wawa` en el kernel.
llimphi-compositor = { path = "llimphi-compositor", version = "0.1.0" }
# Tier 3 — apps WASM con UI Llimphi real. El guest pinta un WireNode (IR
# serializable), el host (runner) lo materializa en View<Msg> y rebota los
# eventos al update del guest. SDK = lado guest, runner = lado host.
llimphi-wire-view = { path = "llimphi-wire-view", version = "0.1.0" }
llimphi-wire-escena = { path = "llimphi-wire-escena", version = "0.1.0" }
llimphi-wasm-app-sdk = { path = "llimphi-wasm-app-sdk", version = "0.1.0" }
# Núcleo puro de distribución (CAS + verificación + resolve), SIN runner/GPU.
# Cara con baterías: re-exporta core + puente al runner para correr la app.
llimphi-wasm-wasi = { path = "llimphi-wasm-wasi", version = "0.1.0" }
# Transporte P2P del bytecode por hash sobre BrahmanNet (card-net).
llimphi-3d = { path = "llimphi-3d", version = "0.1.0" }
# Runner wlr-layer-shell: corre un `App` de Llimphi como barra anclada a un
# borde (no como ventana), reusando la plumbing sctk+wgpu que pata probó.
llimphi-layer = { path = "llimphi-layer", version = "0.1.0" }
# Paleta semántica compartida por las apps y los widgets.
llimphi-theme = { path = "llimphi-theme", version = "0.1.0" }
# Tweens y helpers de animación sobre el bucle Elm.
llimphi-motion = { path = "llimphi-motion", version = "0.1.0" }
# Máquina de estados de animación (estilo Rive) clip-agnóstica. Núcleo puro;
# el render lo cablea el consumidor (llimphi-lottie). Escalón sobre el playback.
llimphi-anim = { path = "llimphi-anim", version = "0.1.0" }
# Studio de animación «rive»: además del editor (bin), expone como lib los
# documentos serializables (Doc + RigDoc + Project) que carga mirada-fondo.
llimphi-anim-studio = { path = "llimphi-anim-studio", version = "0.1.0" }
# Render de mallas deformables (skel::Mesh) a vello Scene: vectorial y texturizada.
llimphi-mesh = { path = "llimphi-mesh", version = "0.1.0" }
# Iconos vectoriales (BezPath en grid 24×24) compartidos por todas las apps.
llimphi-icons = { path = "llimphi-icons", version = "0.1.0" }
# Puente fino vello_svg → Llimphi para SVG arbitrario (íconos .desktop, logos).
llimphi-svg = { path = "llimphi-svg", version = "0.1.0" }
# Puente fino velato (Lottie) → Llimphi para animación vectorial autorada (.json).
llimphi-lottie = { path = "llimphi-lottie", version = "0.1.0" }
llimphi-image = { path = "llimphi-image", version = "0.1.0" }
# Decodificador de protocolos de gráficos de terminal (kitty/sixel) → RGBA.
llimphi-term-graphics = { path = "llimphi-term-graphics", version = "0.1.0" }
# Widgets reusables sobre llimphi-ui — uno por crate.
llimphi-widget-app-header = { path = "widgets/app-header", version = "0.1.0" }
llimphi-widget-banner = { path = "widgets/banner", version = "0.1.0" }
llimphi-widget-button = { path = "widgets/button", version = "0.1.0" }
llimphi-widget-rive-button = { path = "widgets/rive-button", version = "0.1.0" }
llimphi-widget-card = { path = "widgets/card", version = "0.1.0" }
llimphi-clipboard = { path = "widgets/clipboard", version = "0.1.0" }
llimphi-widget-context-menu = { path = "widgets/context-menu", version = "0.1.0" }
llimphi-widget-edit-menu = { path = "widgets/edit-menu", version = "0.1.0" }
llimphi-widget-menubar = { path = "widgets/menubar", version = "0.1.0" }
llimphi-widget-list = { path = "widgets/list", version = "0.1.0" }
llimphi-widget-grid = { path = "widgets/grid", version = "0.1.0" }
llimphi-widget-table = { path = "widgets/table", version = "0.1.0" }
llimphi-widget-color-picker = { path = "widgets/color-picker", version = "0.1.0" }
llimphi-widget-slider = { path = "widgets/slider", version = "0.1.0" }
llimphi-widget-scroll = { path = "widgets/scroll", version = "0.1.0" }
llimphi-widget-lazy-list = { path = "widgets/lazy-list", version = "0.1.0" }
llimphi-widget-splitter = { path = "widgets/splitter", version = "0.1.0" }
llimphi-widget-stat-card = { path = "widgets/stat-card", version = "0.1.0" }
llimphi-widget-tabs = { path = "widgets/tabs", version = "0.1.0" }
llimphi-module-command-palette = { path = "modules/command-palette", version = "0.1.0" }
llimphi-module-diff-viewer = { path = "modules/diff-viewer", version = "0.1.0" }
llimphi-module-fif = { path = "modules/fif", version = "0.1.0" }
llimphi-module-file-picker = { path = "modules/file-picker", version = "0.1.0" }
llimphi-module-bookmarks = { path = "modules/bookmarks", version = "0.1.0" }
llimphi-module-mini-map = { path = "modules/mini-map", version = "0.1.0" }
llimphi-module-symbol-outline = { path = "modules/symbol-outline", version = "0.1.0" }
llimphi-widget-theme-switcher = { path = "widgets/theme-switcher", version = "0.1.0" }
llimphi-widget-text-area = { path = "widgets/text-area", version = "0.1.0" }
llimphi-widget-text-editor-core = { path = "widgets/text-editor-core", version = "0.1.0" }
llimphi-widget-text-editor = { path = "widgets/text-editor", version = "0.1.0" }
llimphi-widget-text-editor-lsp = { path = "widgets/text-editor-lsp", version = "0.1.0" }
llimphi-widget-text-input = { path = "widgets/text-input", version = "0.1.0" }
llimphi-widget-tiled = { path = "widgets/tiled", version = "0.1.0" }
llimphi-widget-nodegraph = { path = "widgets/nodegraph", version = "0.1.0" }
llimphi-widget-tree = { path = "widgets/tree", version = "0.1.0" }
grafo-nav = { path = "shared/grafo", version = "0.1.0" }
llimphi-widget-navigator = { path = "widgets/navigator", version = "0.1.0" }
llimphi-widget-detail-table = { path = "widgets/detail-table", version = "0.1.0" }
llimphi-widget-select = { path = "widgets/select", version = "0.1.0" }
llimphi-widget-terminal = { path = "widgets/terminal", version = "0.1.0" }
# Sello vectorial wawa (rombo + W implícita + Merkle Core).
llimphi-widget-wawa-mark = { path = "widgets/wawa-mark", version = "0.1.0" }
# Widgets de elegancia transversal (tooltip, spinner, progress, toast,
# modal, empty, status-bar, shortcuts-help, splash).
llimphi-widget-tooltip = { path = "widgets/tooltip", version = "0.1.0" }
llimphi-widget-spinner = { path = "widgets/spinner", version = "0.1.0" }
llimphi-widget-progress = { path = "widgets/progress", version = "0.1.0" }
llimphi-widget-toast = { path = "widgets/toast", version = "0.1.0" }
llimphi-widget-modal = { path = "widgets/modal", version = "0.1.0" }
llimphi-widget-empty = { path = "widgets/empty", version = "0.1.0" }
llimphi-widget-status-bar = { path = "widgets/status-bar", version = "0.1.0" }
llimphi-widget-shortcuts-help = { path = "widgets/shortcuts-help", version = "0.1.0" }
llimphi-widget-timeline = { path = "widgets/timeline", version = "0.1.0" }
llimphi-widget-transport = { path = "widgets/transport", version = "0.1.0" }
llimphi-widget-waveform = { path = "widgets/waveform", version = "0.1.0" }
llimphi-widget-splash = { path = "widgets/splash", version = "0.1.0" }
# Controles de formulario y signaling (switch, segmented, breadcrumb,
# badge, avatar, skeleton, field).
llimphi-widget-switch = { path = "widgets/switch", version = "0.1.0" }
llimphi-widget-segmented = { path = "widgets/segmented", version = "0.1.0" }
llimphi-widget-rag-sidebar = { path = "widgets/rag-sidebar", version = "0.1.0" }
llimphi-widget-dock-rail = { path = "widgets/dock-rail", version = "0.1.0" }
llimphi-widget-toolbar = { path = "widgets/toolbar", version = "0.1.0" }
llimphi-widget-breadcrumb = { path = "widgets/breadcrumb", version = "0.1.0" }
llimphi-widget-badge = { path = "widgets/badge", version = "0.1.0" }
llimphi-widget-avatar = { path = "widgets/avatar", version = "0.1.0" }
llimphi-widget-skeleton = { path = "widgets/skeleton", version = "0.1.0" }
llimphi-widget-field = { path = "widgets/field", version = "0.1.0" }
# Firma visual transversal (gradient sutil + hairline accent).
# `default-features = false` acá y no en `card`: los defaults de un widget sólo
# se pueden apagar desde la declaración del WORKSPACE (la trampa recurrente de
# cargo). Sin esto, `card` arrastraría a `panel` con backend `vello` y volvería a
# quedar fuera de una jaula, aunque `card` pidiera `wire`.
llimphi-widget-panel = { path = "widgets/panel", version = "0.1.0" }
llimphi-widget-panes = { path = "widgets/panes", version = "0.1.0" }
# Widgets Flutter-like — composición sobre primitivas Tier 1/3 ya
# expuestas (sombra, gradient, animated, ripple).
llimphi-widget-chip = { path = "widgets/chip", version = "0.1.0" }
llimphi-widget-fab = { path = "widgets/fab", version = "0.1.0" }
llimphi-widget-wrap = { path = "widgets/wrap", version = "0.1.0" }
llimphi-widget-range-slider = { path = "widgets/range-slider", version = "0.1.0" }
llimphi-widget-calendar = { path = "widgets/calendar", version = "0.1.0" }
llimphi-widget-datetime-picker = { path = "widgets/datetime-picker", version = "0.1.0" }
llimphi-widget-form = { path = "widgets/form", version = "0.1.0" }
llimphi-widget-accordion = { path = "widgets/accordion", version = "0.1.0" }
llimphi-widget-stepper = { path = "widgets/stepper", version = "0.1.0" }
llimphi-widget-fitted-box = { path = "widgets/fitted-box", version = "0.1.0" }
llimphi-widget-carousel = { path = "widgets/carousel", version = "0.1.0" }
llimphi-widget-rating = { path = "widgets/rating", version = "0.1.0" }
llimphi-widget-gauge = { path = "widgets/gauge", version = "0.1.0" }
llimphi-widget-scaffold = { path = "widgets/scaffold", version = "0.1.0" }
llimphi-widget-hero = { path = "widgets/hero", version = "0.1.0" }
llimphi-widget-router = { path = "widgets/router", version = "0.1.0" }
llimphi-workspace = { path = "llimphi-workspace", version = "0.1.0" }
# Abstracción Selector — host (paths) + wawa (khipus).
llimphi-module-selector = { path = "modules/selector", version = "0.1.0" }
# === Filesystem helpers ===
directories = "5"
# === Diff line-based (llimphi-module-diff-viewer) ===
# `similar` es la crate de facto: implementa Myers + Patience + LCS,
# expone `TextDiff` con ChangeTag por línea (Equal/Insert/Delete),
# zero deps fuera de std. La 2.x es estable hace años.
similar = "2"
# === Fuzzy matching (shuma-history) ===
# nucleo-matcher = mismo matcher que helix-editor: rápido, Unicode-correct,
# bonus por prefijos, ranking estable. La versión 0.3 expone el API simple
# que necesitamos (Matcher + Pattern + score).
nucleo-matcher = "0.3"
# === Transporte autenticado (shuma-link) ===
# snow = framework Noise pure-rust. Lo usamos en modo Noise_XK (cliente
# conoce la pubkey del servidor, server descubre la del cliente y la
# valida contra una allowlist). ChaCha20-Poly1305 + X25519 + BLAKE2s.
# La versión 0.9 viene pinneada por libp2p, así nos alineamos.
snow = "0.9"
hex = "0.4"
# === PTY + emulador de terminal (shuma-exec, módulos REPL) ===
# portable-pty aloja un PTY cross-platform; lo usamos para los
# comandos TUI tipo vim/htop/less que necesitan un terminal de verdad.
# vt100 parsea la secuencia de bytes que el PTY emite (ANSI + cursor
# movement + erase + screen state) y mantiene un buffer de pantalla
# renderizable como grid.
portable-pty = "0.9"
vt100 = "0.16"
# === WASM web (tawasuyu) ===
wasm-bindgen = "0.2"
wasm-bindgen-futures = "0.4"
js-sys = "0.3"
web-sys = "0.3"
glam = "0.30"
# === Markdown (pluma) ===
pulldown-cmark = { version = "0.12", default-features = false, features = ["html"] }
# === Archivos comprimidos (nahual archive viewer) ===
# Sólo listamos el directorio central (nombres/tamaños); no descomprimimos,
# por eso default-features=false alcanza para ZIP. Para tar.gz sí
# descomprimimos en streaming con flate2 (ya declarado arriba), saltando
# los datos de cada entrada — sólo leemos headers.
zip = { version = "2.4", default-features = false }
tar = { version = "0.4", default-features = false }
# === Fuentes (nahual font viewer) ===
# Parseo de TTF/OTF/TTC y extracción de contornos de glifo a paths.
ttf-parser = "0.25"
# ============================================================
# Intra-workspace deps de nahual (referenciadas por workspace = true)
# ============================================================
# ============================================================
# Intra-workspace deps de pineal (módulo de gráficos)
# ============================================================
# ============================================================
# Intra-workspace deps de iniy (laboratorio semántico de creencias)
# ============================================================
# la física de decaimiento de khipu la importa iniy-derive (SDD iniy §3)
# === auto: declarados por crates internos faltantes ===
# === auto: externas de eternal ===
celestial-eop-data = { version = "0.1"}
approx = "0.5"
byteorder = "1.5"
cc = "1.0"
chrono = "0.4"
chrono-tz = "0.10"
crc32fast = "1.4"
criterion = "0.5"
csv = "1.4"
flate2 = "1.0"
glob = "0.3"
indicatif = "0.18"
lz4_flex = "0.11"
memmap2 = "0.9"
# Cliente Wayland (lado cliente) — lo usa hapiy para hablar zwlr_screencopy
# contra mirada (u otro compositor wlroots) y capturar la pantalla.
wayland-client = "0.31"
wayland-protocols-wlr = { version = "0.3", features = ["client"] }
wayland-protocols-misc = { version = "0.3", features = ["client"] }
mockito = "1.0"
ndarray = "0.15"
num-traits = "0.2"
once_cell = "1.19"
parking_lot = "0.12"
png = "0.18"
proptest = "1.4"
quick-xml = "0.31"
rayon = "1.8"
regex = "1.11"
reqwest = "0.12"
tiff = "0.11"
wide = "0.7"
wiremock = "0.6"
# === i18n (rimay-localize) ===
fluent-bundle = "0.15"
unic-langid = { version = "0.9", features = ["macros"] }
sys-locale = "0.3"
# === Servo (puriy-engine) ===
# Crates publicados de Servo embebibles individualmente. html5ever/markup5ever
# ya entran via ammonia→surrealdb→nakui, así que alineamos versión para no
# duplicar el árbol. markup5ever_rcdom es el DOM Rc-based simple (suficiente
# para Fase 2: parsear y renderizar, sin scripting). cssparser es el tokenizer
# CSS de Stylo, sirve para inline styles. ureq = HTTP síncrono minimalista,
# evita pull de tokio en el engine.
html5ever = "0.39"
markup5ever = "0.39"
markup5ever_rcdom = "0.39"
cssparser = "0.35"
url = "2"
# `gzip`: sin ella ureq ni anuncia `Accept-Encoding` ni decodifica la respuesta.
# python.org (detrás de Fastly) devuelve `content-encoding: gzip` AUNQUE no se lo
# pidan, y el cuerpo comprimido se decodificaba como UTF-8: 3.911 caracteres
# U+FFFD y una página de 16 cajas en vez de 1.489. Además baja lo que se
# descarga en todo el resto.
ureq = { version = "2", default-features = false, features = ["tls", "gzip"] }
# Charset de la web real: no todo es UTF-8 (google.com sirve ISO-8859-1).
# Ya venía transitivo por el stack de Servo — aquí se hace explícito.
encoding_rs = "0.8"
# === takiy-synth (SoundFont MIDI) ===
# rustysynth = sintetizador SF2 puro Rust, MIT. Reemplaza el oscilador
# feo de takiy-synth por muestras reales (FluidR3, GeneralUser GS, etc).
rustysynth = "1.3"
# === takiy-playback (audio device output) ===
# cpal = backend de audio cross-platform (ALSA/PulseAudio/Pipewire en
# Linux, WASAPI en Windows, CoreAudio en macOS). Lo usamos sólo para
# abrir el device default y empujar muestras f32 — nada de mezclado
# ni efectos en el callback.
cpal = "0.15"
# === media-source-wav (decoder PCM en disco) ===
# hound = lector/escritor WAV puro-Rust, sin deps nativas. Soporta PCM
# entero (8/16/24/32) y float (32). Suficiente para abrir samples y
# stems de prueba sin meter ffmpeg/symphonia.
hound = "3.5"
# === media-source-{mp3,flac,vorbis} (decoders vía symphonia) ===
# symphonia es una colección de decoders puro-Rust mantenida. `mp3` cubre
# media-source-mp3; `flac` (decoder + demuxer FLAC nativo) cubre
# media-source-flac (lossless); `vorbis` + `ogg` (codec + demuxer Ogg)
# cubren media-source-vorbis (lossy clásico, libre de patentes). Sin aac:
# ese tier patentado entra por shared/foreign-av.
symphonia = { version = "0.5", default-features = false, features = ["mp3", "flac", "vorbis", "ogg"] }
# === media-source-opus (decoder Opus NATIVO puro-Rust) ===
# Opus es el formato de audio nativo de tawasuyu (par del video AV1). ogg
# demuxea las páginas Ogg; opus-wave es un port puro-Rust de libopus
# (SILK+CELT, sin C ni FFI) — par del rav1d del lado video.
ogg = "0.9"
opus-wave = "3"
# === media-source-webm (demux nativo Matroska/WebM) ===
# matroska-demuxer es un demuxer puro-Rust de MKV/WebM (EBML). Saca los
# paquetes de los tracks V_AV1 y A_OPUS para alimentar a media-source-av1
# y media-source-opus — un .webm AV1+Opus se reproduce 100% nativo.
matroska-demuxer = "0.7"
# === Perfil `dist`: binarios de reparto livianos (equipos chicos / poca RAM) ===
# Hereda de `release` pero prioriza HUELLA sobre tiempo de compilación: LTO thin
# (poda código muerto entre crates), un solo codegen-unit (mejor inlining/DCE) y
# `strip` de símbolos. Reduce el tamaño en disco Y el segmento de código mapeado
# en RAM de cada binario (mirada, pata, apps Llimphi). No toca `cargo build
# --release` de iteración diaria; se usa sólo al empaquetar:
# cargo build --profile dist -p mirada-compositor -p pata-host …
# `panic = "unwind"` se mantiene a propósito: mirada-plugin-host aísla plugins
# con `catch_unwind`, así que `abort` rompería el sandbox.
[profile.dist]
inherits = "release"
lto = "thin"
codegen-units = 1
strip = "symbols"
panic = "unwind"