tawasuyu/llimphi
Sovereign retained-mode GPU UI framework in Rust (wgpu+vello+taffy+parley), Elm loop, 40+ widgets.
1# Cargo.toml raíz STANDALONE de Llimphi — repo público (GitHub + Gitea).
2# GENERADO por scripts/actualizar-standalone.py --llimphi desde el monorepo:
3# el árbol 02_ruway/llimphi/* se aplana y `shared/{app-bus,foreign-vox}` se
4# vendoriza. `exclude` = crates acoplados al resto del workspace madre.
5[workspace]
6resolver = "2"
7
8# ============================================================
9# Cuadrantes — agregar a medida que se migran
10# ============================================================
11members = [
12 "llimphi",
13 "llimphi-3d",
14 "llimphi-anim",
15 "llimphi-anim-studio",
16 "llimphi-compositor",
17 "llimphi-gallery",
18 "llimphi-gpu-bench",
19 "llimphi-hal",
20 "llimphi-icons",
21 "llimphi-image",
22 "llimphi-layer",
23 "llimphi-layout",
24 "llimphi-lottie",
25 "llimphi-mesh",
26 "llimphi-motion",
27 "llimphi-raster",
28 "llimphi-surface",
29 "llimphi-svg",
30 "llimphi-term-graphics",
31 "llimphi-test",
32 "llimphi-text",
33 "llimphi-theme",
34 "llimphi-ui",
35 "llimphi-voxel",
36 "llimphi-wasm-app-sdk",
37 "llimphi-wasm-demo-counter",
38 "llimphi-wasm-demo-form",
39 "llimphi-wasm-wasi",
40 "llimphi-wire-view",
41 "llimphi-workspace",
42 "modules/bookmarks",
43 "modules/command-palette",
44 "modules/diff-viewer",
45 "modules/fif",
46 "modules/file-picker",
47 "modules/mini-map",
48 "modules/selector",
49 "modules/symbol-outline",
50 "shared/app-bus",
51 "shared/foreign-lottie",
52 "shared/foreign-vox",
53 "shared/grafo",
54 "widgets/app-header",
55 "widgets/avatar",
56 "widgets/badge",
57 "widgets/banner",
58 "widgets/breadcrumb",
59 "widgets/button",
60 "widgets/calendar",
61 "widgets/card",
62 "widgets/carousel",
63 "widgets/chip",
64 "widgets/clipboard",
65 "widgets/color-picker",
66 "widgets/context-menu",
67 "widgets/detail-table",
68 "widgets/dock-rail",
69 "widgets/edit-menu",
70 "widgets/empty",
71 "widgets/fab",
72 "widgets/field",
73 "widgets/fitted-box",
74 "widgets/gallery",
75 "widgets/gauge",
76 "widgets/grid",
77 "widgets/hero",
78 "widgets/lazy-list",
79 "widgets/list",
80 "widgets/menubar",
81 "widgets/modal",
82 "widgets/navigator",
83 "widgets/nodegraph",
84 "widgets/panel",
85 "widgets/panes",
86 "widgets/progress",
87 "widgets/rag-sidebar",
88 "widgets/range-slider",
89 "widgets/rating",
90 "widgets/rive-button",
91 "widgets/router",
92 "widgets/scaffold",
93 "widgets/scroll",
94 "widgets/segmented",
95 "widgets/select",
96 "widgets/shortcuts-help",
97 "widgets/skeleton",
98 "widgets/slider",
99 "widgets/spinner",
100 "widgets/splash",
101 "widgets/splitter",
102 "widgets/stat-card",
103 "widgets/status-bar",
104 "widgets/switch",
105 "widgets/table",
106 "widgets/tabs",
107 "widgets/terminal",
108 "widgets/text-area",
109 "widgets/text-editor",
110 "widgets/text-editor-core",
111 "widgets/text-editor-lsp",
112 "widgets/text-input",
113 "widgets/theme-switcher",
114 "widgets/tiled",
115 "widgets/timeline",
116 "widgets/toast",
117 "widgets/toolbar",
118 "widgets/tooltip",
119 "widgets/transport",
120 "widgets/tree",
121 "widgets/waveform",
122 "widgets/wawa-mark",
123 "widgets/wrap",
124]
125
126# `wawa/` se excluye del workspace global porque corre en target
127# `x86_64-unknown-none` y `panic = "abort"`, incompatibles con los
128# perfiles globales. Los crates compartidos se referencian por `path`
129# cruzando la frontera.
130exclude = [
131 "android",
132 "demo",
133 "llimphi-video-plane",
134 "llimphi-voxel-app",
135 "llimphi-voxel-studio",
136 "llimphi-wasm-core",
137 "llimphi-wasm-dist",
138 "llimphi-wasm-net",
139 "llimphi-wasm-open",
140 "llimphi-wasm-registry",
141 "llimphi-wasm-runner",
142 "modules/allichay",
143 "modules/plugin-host",
144 "modules/shuma-term",
145]
146
147[workspace.package]
148version = "0.1.0"
149edition = "2021"
150rust-version = "1.80"
151license = "MIT"
152authors = ["Sergio <gerencia@jlsoltech.com>"]
153publish = true
154repository = "https://git.tawasuyu.net/tawasuyu/llimphi"
155
156[workspace.dependencies]
157# === Configuración declarativa (vocabulario de esquemas) ===
158# Telemetría local de desarrollo (stderr+panics+tracing → $XDG_STATE_HOME/tawasuyu/<dominio>/<bin>.log)
159# default = [] (núcleo liviano sin vello); `bake` es opt-in. Declaramos
160# default-features = false aquí para que el `default-features = false` de los
161# consumidores (splash/greeter/compositor) se honre y no quede el warning.
162# === Registro de apps / menú global ===
163app-bus = { path = "shared/app-bus", version = "0.1.0" }
164# === Centro de eventos (notificaciones + capturas + clipboard + …) ===
165# === Puente de drag-and-drop compositor → app (suple winit en Wayland) ===
166# === Serialización ===
167serde = { version = "1", features = ["derive"] }
168serde_json = "1"
169lsp-types = "0.97"
170serde-big-array = "0.5"
171postcard = { version = "1", features = ["use-std"] }
172toml = "0.8"
173ron = "0.8"
174bincode = "1"
175base64 = "0.22"
176
177# === Errores ===
178thiserror = "2" # bump uniforme; arje (era 1) puede requerir ajustes menores
179anyhow = "1"
180
181# === Async ===
182tokio = { version = "1", features = ["full"] }
183tokio-util = { version = "0.7", features = ["compat"] }
184async-trait = "0.1"
185futures = "0.3"
186
187# === Observabilidad ===
188tracing = "0.1"
189tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
190
191# === Linux primitives (arje) ===
192nix = { version = "0.29", features = ["signal", "process", "sched", "mount", "fs", "socket", "net", "user", "reboot"] }
193libc = "0.2"
194# DRM/KMS legacy (dumb buffer) para el splash nativo del arranque sin parpadeo.
195# Misma versión que reexporta smithay (mirada-compositor) — el lock ya la fija.
196drm = "0.14"
197font8x8 = { version = "0.3", default-features = false }
198
199# === IDs / Hash / Crypto ===
200ulid = { version = "1", features = ["serde"] }
201uuid = { version = "1", features = ["v4", "rng-getrandom"] }
202sha2 = "0.10"
203blake3 = "1.5"
204ed25519-dalek = "2"
205aes-gcm = "0.10"
206chacha20poly1305 = "0.10"
207argon2 = "0.5"
208rand = "0.8"
209
210# === WASM (arje) ===
211# wasmi 1.0: unifica la versión con wawa (su kernel ya corre 1.0), para
212# que el ABI WASM del host sea idéntico en Linux y en bare-metal.
213wasmi = "1.0"
214wat = "1"
215# wasmtime 46 (Fase 1 del pipeline JS): tier 0 de puriy-js pasa de wasmi
216# (intérprete) a Wasmtime AOT (Cranelift → nativo) en Linux — quita la doble
217# interpretación de QuickJS.wasm. En wawa bare-metal el runtime es Pulley (spike
218# Q1 cerrado); mismo crate, distinto backend.
219wasmtime = "46"
220
221# === Storage / DB ===
222sled = "0.34"
223rusqlite = { version = "0.31", features = ["bundled", "blob"] }
224
225# === Ingesta de documentos (iniy-ingest: PDF / EPUB) ===
226pdf-extract = "0.7"
227epub = "2.1"
228
229# === Bulk import Wikipedia (iniy-wiki dump) ===
230bzip2 = "0.4"
231
232# === Compresión (minga multi-bundle) ===
233zstd = "0.13"
234xz2 = "0.1"
235# Contenedores adicionales del visor Archive de nahual (sólo listado).
236sevenz-rust = "0.6"
237unrar = "0.5"
238
239# === HTTP server (iniy-server) ===
240axum = "0.7"
241tower = "0.5"
242
243# === ANN sobre embeddings (iniy nli --ann) ===
244instant-distance = "0.6"
245
246# === P2P (minga) ===
247libp2p = { version = "0.56", features = ["tokio", "tcp", "dns", "noise", "yamux", "macros", "kad", "identify", "relay", "dcutr", "autonat", "mdns"] }
248libp2p-stream = "=0.4.0-alpha"
249libp2p-allow-block-list = "0.6"
250
251# === SSH (ssh, sandokan RemoteEngine, matilda) ===
252russh = "0.54"
253
254# === Math determinista cross-platform (dominium) ===
255libm = "0.2"
256
257# === SMF (takiy-midi) ===
258# midly: parser/emitter SMF tipo 0/1, no_std-friendly, sin allocs en hot path.
259midly = "0.5"
260
261# === Code parsing (minga) ===
262# `wayland-data-control` trae el backend wl-clipboard-rs: bajo mirada (Wayland
263# propio, sin Xwayland para apps nativas) arboard-x11 fallaba a no-op silencioso
264# y el clipboard de los text-editor quedaba muerto. Con la feature habla
265# zwlr_data_control_manager_v1 (que mirada expone) y cae a X11 si no hay Wayland.
266arboard = { version = "3", features = ["wayland-data-control"] }
267ropey = "1.6"
268tree-sitter = "0.24"
269tree-sitter-rust = "0.23"
270tree-sitter-python = "0.23"
271tree-sitter-typescript = "0.23"
272tree-sitter-javascript = "0.23"
273tree-sitter-go = "0.23"
274
275# === FS notify ===
276notify = "6.1"
277
278# === Grafos (iniy, nakui-core ya lo usa directo en 0.6) ===
279petgraph = "0.6"
280
281# === Image decoding (nahual-image-viewer-llimphi) ===
282# default-features = false: nos quedamos con PNG + JPEG + WebP (lossless).
283# tullpu-render exporta a las tres; AVIF/TIFF/… los habilitamos si una app
284# los pide específicamente.
285# Decoders puro-Rust baratos; avif queda fuera (arrastra dav1d/rav1e).
286image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "gif", "bmp", "ico", "tiff", "tga", "qoi"] }
287# ONNX Runtime para los proveedores de píxel reales (pixel-verbo-onnx: segmentación
288# u2net/isnet, inpaint, restyle…). `download-binaries` (default) baja el runtime nativo
289# solo; ya lo arrastraba fastembed (rimay-verbo) transitivo — aquí lo declaramos directo.
290ort = "2.0.0-rc.9"
291
292# Rasterizador vectorial CPU (relleno/trazo anti-aliased) para capas vectoriales de tullpu.
293tiny-skia = "0.11"
294# Booleanos de polígonos robustos (union/intersection/difference/xor) para el
295# clipper vectorial de tullpu — restar/intersecar paths que se solapan
296# parcialmente, que la regla de relleno no expresa. Ya estaba en el lock.
297geo = "0.28"
298
299# === FUSE (minga-vfs) ===
300# default-features = false: prescinde de pkg-config/libfuse-dev en build.
301# El montaje pasa a ser Rust puro (vía el helper `fusermount3` en runtime).
302fuser = { version = "0.15", default-features = false }
303
304# === CLI / auth (minga) ===
305clap = { version = "4", features = ["derive"] }
306rpassword = "7"
307
308# === PAM (auth-core) ===
309pam = "0.8"
310
311# === D-Bus (arje compat) ===
312zbus = { version = "4", default-features = false, features = ["tokio"] }
313
314# === Tests ===
315tempfile = "3"
316
317# === Llimphi (motor gráfico soberano) ===
318# wgpu sobre Vulkan/Metal/DX12, winit para ventana en dev Linux.
319# raw-window-handle 0.6 alinea winit 0.30 con wgpu 27.
320# vello 0.7 = rasterizador vectorial sobre wgpu 27 (renderer GPU "wgpu" + opt-in "hybrid" CPU+GPU).
321# taffy 0.9 = motor Flexbox/Grid puro Rust (ya pulled por transitivos, lo alineamos).
322# parley 0.6 = shaping/layout de texto compatible con peniko 0.6 (que vello 0.7 expone).
323wgpu = "27"
324winit = "0.30"
325raw-window-handle = "0.6"
326pollster = "0.4"
327vello = "0.7"
328# Renderer hybrid CPU+GPU sin compute shaders (mejor compat WebGL2/Adreno viejas).
329# Opt-in; el renderer "wgpu" sigue siendo el default.
330vello_hybrid = "0.0.9"
331# foreign-lottie = fork vendorizado de velato 0.9 (Lottie → vello::Scene),
332# completado para no paniquear ante features no soportadas. Lo consume
333# llimphi-lottie. Ver shared/foreign-lottie.
334foreign-lottie = { path = "shared/foreign-lottie", version = "0.1.0" }
335# Árbol de accesibilidad para lectores de pantalla (NVDA/VoiceOver/Orca/TalkBack).
336# Lo consume el runtime de Llimphi (iter 2/3 del plan AccessKit); el modelo
337# `SemanticsSpec` del compositor es independiente de estas crates.
338accesskit = "0.24"
339accesskit_winit = "0.33"
340taffy = "0.9"
341# parley = shaping completo (bidi, ligatures, fallback CJK/emoji vía fontique, line break).
342parley = "0.6"
343# Bucle Elm (input→update→view→layout→raster→present). Lo consumen las apps.
344llimphi-ui = { path = "llimphi-ui", version = "0.1.0" }
345# Tier 3 — apps WASM con UI Llimphi real. El guest pinta un WireNode (IR
346# serializable), el host (runner) lo materializa en View<Msg> y rebota los
347# eventos al update del guest. SDK = lado guest, runner = lado host.
348llimphi-wire-view = { path = "llimphi-wire-view", version = "0.1.0" }
349llimphi-wasm-app-sdk = { path = "llimphi-wasm-app-sdk", version = "0.1.0" }
350# Núcleo puro de distribución (CAS + verificación + resolve), SIN runner/GPU.
351# Cara con baterías: re-exporta core + puente al runner para correr la app.
352llimphi-wasm-wasi = { path = "llimphi-wasm-wasi", version = "0.1.0" }
353# Transporte P2P del bytecode por hash sobre BrahmanNet (card-net).
354llimphi-3d = { path = "llimphi-3d", version = "0.1.0" }
355# Runner wlr-layer-shell: corre un `App` de Llimphi como barra anclada a un
356# borde (no como ventana), reusando la plumbing sctk+wgpu que pata probó.
357llimphi-layer = { path = "llimphi-layer", version = "0.1.0" }
358# Paleta semántica compartida por las apps y los widgets.
359llimphi-theme = { path = "llimphi-theme", version = "0.1.0" }
360# Tweens y helpers de animación sobre el bucle Elm.
361llimphi-motion = { path = "llimphi-motion", version = "0.1.0" }
362# Máquina de estados de animación (estilo Rive) clip-agnóstica. Núcleo puro;
363# el render lo cablea el consumidor (llimphi-lottie). Escalón sobre el playback.
364llimphi-anim = { path = "llimphi-anim", version = "0.1.0" }
365# Studio de animación «rive»: además del editor (bin), expone como lib los
366# documentos serializables (Doc + RigDoc + Project) que carga mirada-fondo.
367llimphi-anim-studio = { path = "llimphi-anim-studio", version = "0.1.0" }
368# Render de mallas deformables (skel::Mesh) a vello Scene: vectorial y texturizada.
369llimphi-mesh = { path = "llimphi-mesh", version = "0.1.0" }
370# Iconos vectoriales (BezPath en grid 24×24) compartidos por todas las apps.
371llimphi-icons = { path = "llimphi-icons", version = "0.1.0" }
372# Puente fino vello_svg → Llimphi para SVG arbitrario (íconos .desktop, logos).
373llimphi-svg = { path = "llimphi-svg", version = "0.1.0" }
374# Puente fino velato (Lottie) → Llimphi para animación vectorial autorada (.json).
375llimphi-lottie = { path = "llimphi-lottie", version = "0.1.0" }
376llimphi-image = { path = "llimphi-image", version = "0.1.0" }
377# Decodificador de protocolos de gráficos de terminal (kitty/sixel) → RGBA.
378llimphi-term-graphics = { path = "llimphi-term-graphics", version = "0.1.0" }
379# Widgets reusables sobre llimphi-ui — uno por crate.
380llimphi-widget-app-header = { path = "widgets/app-header", version = "0.1.0" }
381llimphi-widget-banner = { path = "widgets/banner", version = "0.1.0" }
382llimphi-widget-button = { path = "widgets/button", version = "0.1.0" }
383llimphi-widget-rive-button = { path = "widgets/rive-button", version = "0.1.0" }
384llimphi-widget-card = { path = "widgets/card", version = "0.1.0" }
385llimphi-clipboard = { path = "widgets/clipboard", version = "0.1.0" }
386llimphi-widget-context-menu = { path = "widgets/context-menu", version = "0.1.0" }
387llimphi-widget-edit-menu = { path = "widgets/edit-menu", version = "0.1.0" }
388llimphi-widget-menubar = { path = "widgets/menubar", version = "0.1.0" }
389llimphi-widget-list = { path = "widgets/list", version = "0.1.0" }
390llimphi-widget-grid = { path = "widgets/grid", version = "0.1.0" }
391llimphi-widget-table = { path = "widgets/table", version = "0.1.0" }
392llimphi-widget-color-picker = { path = "widgets/color-picker", version = "0.1.0" }
393llimphi-widget-slider = { path = "widgets/slider", version = "0.1.0" }
394llimphi-widget-scroll = { path = "widgets/scroll", version = "0.1.0" }
395llimphi-widget-lazy-list = { path = "widgets/lazy-list", version = "0.1.0" }
396llimphi-widget-splitter = { path = "widgets/splitter", version = "0.1.0" }
397llimphi-widget-stat-card = { path = "widgets/stat-card", version = "0.1.0" }
398llimphi-widget-tabs = { path = "widgets/tabs", version = "0.1.0" }
399llimphi-module-command-palette = { path = "modules/command-palette", version = "0.1.0" }
400llimphi-module-diff-viewer = { path = "modules/diff-viewer", version = "0.1.0" }
401llimphi-module-fif = { path = "modules/fif", version = "0.1.0" }
402llimphi-module-file-picker = { path = "modules/file-picker", version = "0.1.0" }
403llimphi-module-bookmarks = { path = "modules/bookmarks", version = "0.1.0" }
404llimphi-module-mini-map = { path = "modules/mini-map", version = "0.1.0" }
405llimphi-module-symbol-outline = { path = "modules/symbol-outline", version = "0.1.0" }
406llimphi-widget-theme-switcher = { path = "widgets/theme-switcher", version = "0.1.0" }
407llimphi-widget-text-area = { path = "widgets/text-area", version = "0.1.0" }
408llimphi-widget-text-editor-core = { path = "widgets/text-editor-core", version = "0.1.0" }
409llimphi-widget-text-editor = { path = "widgets/text-editor", version = "0.1.0" }
410llimphi-widget-text-editor-lsp = { path = "widgets/text-editor-lsp", version = "0.1.0" }
411llimphi-widget-text-input = { path = "widgets/text-input", version = "0.1.0" }
412llimphi-widget-tiled = { path = "widgets/tiled", version = "0.1.0" }
413llimphi-widget-nodegraph = { path = "widgets/nodegraph", version = "0.1.0" }
414llimphi-widget-tree = { path = "widgets/tree", version = "0.1.0" }
415grafo-nav = { path = "shared/grafo", version = "0.1.0" }
416llimphi-widget-navigator = { path = "widgets/navigator", version = "0.1.0" }
417llimphi-widget-detail-table = { path = "widgets/detail-table", version = "0.1.0" }
418llimphi-widget-select = { path = "widgets/select", version = "0.1.0" }
419llimphi-widget-terminal = { path = "widgets/terminal", version = "0.1.0" }
420# Sello vectorial wawa (rombo + W implícita + Merkle Core).
421llimphi-widget-wawa-mark = { path = "widgets/wawa-mark", version = "0.1.0" }
422# Widgets de elegancia transversal (tooltip, spinner, progress, toast,
423# modal, empty, status-bar, shortcuts-help, splash).
424llimphi-widget-tooltip = { path = "widgets/tooltip", version = "0.1.0" }
425llimphi-widget-spinner = { path = "widgets/spinner", version = "0.1.0" }
426llimphi-widget-progress = { path = "widgets/progress", version = "0.1.0" }
427llimphi-widget-toast = { path = "widgets/toast", version = "0.1.0" }
428llimphi-widget-modal = { path = "widgets/modal", version = "0.1.0" }
429llimphi-widget-empty = { path = "widgets/empty", version = "0.1.0" }
430llimphi-widget-status-bar = { path = "widgets/status-bar", version = "0.1.0" }
431llimphi-widget-shortcuts-help = { path = "widgets/shortcuts-help", version = "0.1.0" }
432llimphi-widget-timeline = { path = "widgets/timeline", version = "0.1.0" }
433llimphi-widget-transport = { path = "widgets/transport", version = "0.1.0" }
434llimphi-widget-waveform = { path = "widgets/waveform", version = "0.1.0" }
435llimphi-widget-splash = { path = "widgets/splash", version = "0.1.0" }
436# Controles de formulario y signaling (switch, segmented, breadcrumb,
437# badge, avatar, skeleton, field).
438llimphi-widget-switch = { path = "widgets/switch", version = "0.1.0" }
439llimphi-widget-segmented = { path = "widgets/segmented", version = "0.1.0" }
440llimphi-widget-rag-sidebar = { path = "widgets/rag-sidebar", version = "0.1.0" }
441llimphi-widget-dock-rail = { path = "widgets/dock-rail", version = "0.1.0" }
442llimphi-widget-toolbar = { path = "widgets/toolbar", version = "0.1.0" }
443llimphi-widget-breadcrumb = { path = "widgets/breadcrumb", version = "0.1.0" }
444llimphi-widget-badge = { path = "widgets/badge", version = "0.1.0" }
445llimphi-widget-avatar = { path = "widgets/avatar", version = "0.1.0" }
446llimphi-widget-skeleton = { path = "widgets/skeleton", version = "0.1.0" }
447llimphi-widget-field = { path = "widgets/field", version = "0.1.0" }
448# Firma visual transversal (gradient sutil + hairline accent).
449llimphi-widget-panel = { path = "widgets/panel", version = "0.1.0" }
450llimphi-widget-panes = { path = "widgets/panes", version = "0.1.0" }
451# Widgets Flutter-like — composición sobre primitivas Tier 1/3 ya
452# expuestas (sombra, gradient, animated, ripple).
453llimphi-widget-chip = { path = "widgets/chip", version = "0.1.0" }
454llimphi-widget-fab = { path = "widgets/fab", version = "0.1.0" }
455llimphi-widget-wrap = { path = "widgets/wrap", version = "0.1.0" }
456llimphi-widget-range-slider = { path = "widgets/range-slider", version = "0.1.0" }
457llimphi-widget-calendar = { path = "widgets/calendar", version = "0.1.0" }
458llimphi-widget-fitted-box = { path = "widgets/fitted-box", version = "0.1.0" }
459llimphi-widget-carousel = { path = "widgets/carousel", version = "0.1.0" }
460llimphi-widget-rating = { path = "widgets/rating", version = "0.1.0" }
461llimphi-widget-gauge = { path = "widgets/gauge", version = "0.1.0" }
462llimphi-widget-scaffold = { path = "widgets/scaffold", version = "0.1.0" }
463llimphi-widget-hero = { path = "widgets/hero", version = "0.1.0" }
464llimphi-widget-router = { path = "widgets/router", version = "0.1.0" }
465llimphi-workspace = { path = "llimphi-workspace", version = "0.1.0" }
466# Abstracción Selector — host (paths) + wawa (khipus).
467llimphi-module-selector = { path = "modules/selector", version = "0.1.0" }
468
469# === Filesystem helpers ===
470directories = "5"
471
472# === Diff line-based (llimphi-module-diff-viewer) ===
473# `similar` es la crate de facto: implementa Myers + Patience + LCS,
474# expone `TextDiff` con ChangeTag por línea (Equal/Insert/Delete),
475# zero deps fuera de std. La 2.x es estable hace años.
476similar = "2"
477
478# === Fuzzy matching (shuma-history) ===
479# nucleo-matcher = mismo matcher que helix-editor: rápido, Unicode-correct,
480# bonus por prefijos, ranking estable. La versión 0.3 expone el API simple
481# que necesitamos (Matcher + Pattern + score).
482nucleo-matcher = "0.3"
483
484# === Transporte autenticado (shuma-link) ===
485# snow = framework Noise pure-rust. Lo usamos en modo Noise_XK (cliente
486# conoce la pubkey del servidor, server descubre la del cliente y la
487# valida contra una allowlist). ChaCha20-Poly1305 + X25519 + BLAKE2s.
488# La versión 0.9 viene pinneada por libp2p, así nos alineamos.
489snow = "0.9"
490hex = "0.4"
491
492# === PTY + emulador de terminal (shuma-exec, módulos REPL) ===
493# portable-pty aloja un PTY cross-platform; lo usamos para los
494# comandos TUI tipo vim/htop/less que necesitan un terminal de verdad.
495# vt100 parsea la secuencia de bytes que el PTY emite (ANSI + cursor
496# movement + erase + screen state) y mantiene un buffer de pantalla
497# renderizable como grid.
498portable-pty = "0.9"
499vt100 = "0.16"
500
501# === WASM web (tawasuyu) ===
502wasm-bindgen = "0.2"
503wasm-bindgen-futures = "0.4"
504js-sys = "0.3"
505web-sys = "0.3"
506glam = "0.30"
507
508# === Markdown (pluma) ===
509pulldown-cmark = { version = "0.12", default-features = false, features = ["html"] }
510
511# === Archivos comprimidos (nahual archive viewer) ===
512# Sólo listamos el directorio central (nombres/tamaños); no descomprimimos,
513# por eso default-features=false alcanza para ZIP. Para tar.gz sí
514# descomprimimos en streaming con flate2 (ya declarado arriba), saltando
515# los datos de cada entrada — sólo leemos headers.
516zip = { version = "2.4", default-features = false }
517tar = { version = "0.4", default-features = false }
518
519# === Fuentes (nahual font viewer) ===
520# Parseo de TTF/OTF/TTC y extracción de contornos de glifo a paths.
521ttf-parser = "0.25"
522
523# ============================================================
524# Intra-workspace deps de nahual (referenciadas por workspace = true)
525# ============================================================
526
527# ============================================================
528# Intra-workspace deps de pineal (módulo de gráficos)
529# ============================================================
530
531# ============================================================
532# Intra-workspace deps de iniy (laboratorio semántico de creencias)
533# ============================================================
534# la física de decaimiento de khipu la importa iniy-derive (SDD iniy §3)
535
536# === auto: declarados por crates internos faltantes ===
537
538# === auto: externas de eternal ===
539celestial-eop-data = { version = "0.1"}
540approx = "0.5"
541byteorder = "1.5"
542cc = "1.0"
543chrono = "0.4"
544chrono-tz = "0.10"
545crc32fast = "1.4"
546criterion = "0.5"
547csv = "1.4"
548flate2 = "1.0"
549glob = "0.3"
550indicatif = "0.18"
551lz4_flex = "0.11"
552memmap2 = "0.9"
553# Cliente Wayland (lado cliente) — lo usa hapiy para hablar zwlr_screencopy
554# contra mirada (u otro compositor wlroots) y capturar la pantalla.
555wayland-client = "0.31"
556wayland-protocols-wlr = { version = "0.3", features = ["client"] }
557wayland-protocols-misc = { version = "0.3", features = ["client"] }
558mockito = "1.0"
559ndarray = "0.15"
560num-traits = "0.2"
561once_cell = "1.19"
562parking_lot = "0.12"
563png = "0.18"
564proptest = "1.4"
565quick-xml = "0.31"
566rayon = "1.8"
567regex = "1.11"
568reqwest = "0.12"
569tiff = "0.11"
570wide = "0.7"
571wiremock = "0.6"
572
573# === i18n (rimay-localize) ===
574fluent-bundle = "0.15"
575unic-langid = { version = "0.9", features = ["macros"] }
576sys-locale = "0.3"
577
578# === Servo (puriy-engine) ===
579# Crates publicados de Servo embebibles individualmente. html5ever/markup5ever
580# ya entran via ammonia→surrealdb→nakui, así que alineamos versión para no
581# duplicar el árbol. markup5ever_rcdom es el DOM Rc-based simple (suficiente
582# para Fase 2: parsear y renderizar, sin scripting). cssparser es el tokenizer
583# CSS de Stylo, sirve para inline styles. ureq = HTTP síncrono minimalista,
584# evita pull de tokio en el engine.
585html5ever = "0.39"
586markup5ever = "0.39"
587markup5ever_rcdom = "0.39"
588cssparser = "0.35"
589url = "2"
590ureq = { version = "2", default-features = false, features = ["tls"] }
591# Charset de la web real: no todo es UTF-8 (google.com sirve ISO-8859-1).
592# Ya venía transitivo por el stack de Servo — aquí se hace explícito.
593encoding_rs = "0.8"
594
595# === takiy-synth (SoundFont MIDI) ===
596# rustysynth = sintetizador SF2 puro Rust, MIT. Reemplaza el oscilador
597# feo de takiy-synth por muestras reales (FluidR3, GeneralUser GS, etc).
598rustysynth = "1.3"
599
600# === takiy-playback (audio device output) ===
601# cpal = backend de audio cross-platform (ALSA/PulseAudio/Pipewire en
602# Linux, WASAPI en Windows, CoreAudio en macOS). Lo usamos sólo para
603# abrir el device default y empujar muestras f32 — nada de mezclado
604# ni efectos en el callback.
605cpal = "0.15"
606
607# === media-source-wav (decoder PCM en disco) ===
608# hound = lector/escritor WAV puro-Rust, sin deps nativas. Soporta PCM
609# entero (8/16/24/32) y float (32). Suficiente para abrir samples y
610# stems de prueba sin meter ffmpeg/symphonia.
611hound = "3.5"
612
613# === media-source-{mp3,flac,vorbis} (decoders vía symphonia) ===
614# symphonia es una colección de decoders puro-Rust mantenida. `mp3` cubre
615# media-source-mp3; `flac` (decoder + demuxer FLAC nativo) cubre
616# media-source-flac (lossless); `vorbis` + `ogg` (codec + demuxer Ogg)
617# cubren media-source-vorbis (lossy clásico, libre de patentes). Sin aac:
618# ese tier patentado entra por shared/foreign-av.
619symphonia = { version = "0.5", default-features = false, features = ["mp3", "flac", "vorbis", "ogg"] }
620
621# === media-source-opus (decoder Opus NATIVO puro-Rust) ===
622# Opus es el formato de audio nativo de tawasuyu (par del video AV1). ogg
623# demuxea las páginas Ogg; opus-wave es un port puro-Rust de libopus
624# (SILK+CELT, sin C ni FFI) — par del rav1d del lado video.
625ogg = "0.9"
626opus-wave = "3"
627
628# === media-source-webm (demux nativo Matroska/WebM) ===
629# matroska-demuxer es un demuxer puro-Rust de MKV/WebM (EBML). Saca los
630# paquetes de los tracks V_AV1 y A_OPUS para alimentar a media-source-av1
631# y media-source-opus — un .webm AV1+Opus se reproduce 100% nativo.
632matroska-demuxer = "0.7"
633
634# === Perfil `dist`: binarios de reparto livianos (equipos chicos / poca RAM) ===
635# Hereda de `release` pero prioriza HUELLA sobre tiempo de compilación: LTO thin
636# (poda código muerto entre crates), un solo codegen-unit (mejor inlining/DCE) y
637# `strip` de símbolos. Reduce el tamaño en disco Y el segmento de código mapeado
638# en RAM de cada binario (mirada, pata, apps Llimphi). No toca `cargo build
639# --release` de iteración diaria; se usa sólo al empaquetar:
640# cargo build --profile dist -p mirada-compositor -p pata-host …
641# `panic = "unwind"` se mantiene a propósito: mirada-plugin-host aísla plugins
642# con `catch_unwind`, así que `abort` rompería el sandbox.
643
644[profile.dist]
645inherits = "release"
646lto = "thin"
647codegen-units = 1
648strip = "symbols"
649panic = "unwind"
650
651