refactor(monorepo): reorganización lógica + renames + SDDs + split CHANGELOG
1//! Yahweh — bootstrap GPUI.
2//!
3//! Fase 6: además del LayoutModel, la Shell crea un `AppBus` (Entity) y se
4//! lo pasa al LayoutHost. El bus circula a viewers (TextViewer,
5//! ImageViewer) que se subscriben directo, y el LayoutHost forwardea los
6//! eventos tipados de los explorers (FileExplorer, DatabaseExplorer)
7//! traducidos a AppEvent.
8
9mod brahman_client;
10mod hot_reload;
11mod layout_host;
12mod layout_model;
13mod managed_tree;
14mod persister;
15mod status_panel;
16
17use gpui::{App, Application, Bounds, WindowBounds, WindowOptions, prelude::*, px, size};
18
19use nahual_bus::AppBus;
20use nahual_core::LayerConfig;
21use nahual_theme::Theme;
22
23use crate::layout_host::LayoutHost;
24use crate::layout_model::LayoutModel;
25use crate::persister::Persister;
26
27const LAYOUT_PATH: &str = "layout.json";
28
29fn main() {
30 // Sidecar brahman: nahual se presenta al Init antes de levantar GPUI.
31 // No bloquea: si el Init no está, el thread loggea y termina.
32 brahman_client::spawn();
33
34 Application::new().run(|cx: &mut App| {
35 Theme::install_default(cx);
36
37 let config = LayerConfig::load_or_default(LAYOUT_PATH);
38 let bounds = Bounds::centered(None, size(px(1300.), px(800.)), cx);
39
40 cx.open_window(
41 WindowOptions {
42 window_bounds: Some(WindowBounds::Windowed(bounds)),
43 ..Default::default()
44 },
45 |_w, cx| {
46 let model = cx.new(|_| LayoutModel::new(config.clone()));
47 let bus = cx.new(|_| AppBus);
48 let persister = cx.new(|cx| {
49 Persister::new(LAYOUT_PATH.into(), model.clone(), cx)
50 });
51 // Hot-reload: notify watcher en el dir del JSON. El
52 // watcher debe mantenerse vivo (drop ⇒ stop), así que lo
53 // movemos a una static atómica vía Box::leak.
54 match hot_reload::spawn_watch(LAYOUT_PATH.into(), model.clone(), cx) {
55 Ok(watcher) => {
56 Box::leak(Box::new(watcher));
57 }
58 Err(e) => {
59 eprintln!("[hot_reload] no se pudo iniciar watcher: {}", e);
60 }
61 }
62 cx.new(|cx| LayoutHost::new(model, bus, persister, cx))
63 },
64 )
65 .unwrap();
66 cx.activate(true);
67 });
68}