1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
[]
= "BREP_app"
= "0.4.0"
= "2021"
= "LICENSE.md"
= "https://github.com/mmiscool/NURBS_BREP_kernel"
= "README.md"
= ["cad", "brep", "egui", "wasm", "parametric"]
= ["graphics", "gui", "wasm"]
# eframe/egui/egui_tiles/egui_extras 0.35 each declare rust-version = "1.92",
# so 1.92 is this crate's real floor, not a guess — and it is the exact
# compiler rust-toolchain.toml pins, so it is also the only one it is built on.
= "1.92"
# assets/ ships because build.rs compiles assets/glyphs/*.svg into the
# inline-icon catalog (src/icons.rs) — which is why build.rs ships too. This
# repo ships NO font file: eframe's `default_fonts` compiles in four faces and
# UI text uses the OS monospace font. See THIRD-PARTY-NOTICES.md for the
# notice obligations those four carry.
= ["src/**", "assets/glyphs/*.svg", "/build.rs", "/Cargo.toml", "/LICENSE.md", "/THIRD-PARTY-NOTICES.md", "/README.md"]
= "The BREP CAD application: an eframe (egui + wgpu) host that draws the brep-render 3D engine into an egui frame — native + wasm from one codebase."
# cdylib for the wasm (wasm-bindgen) browser build; rlib so the native binary
# links the crate directly. Mirrors brep-render's crate-type. The package
# publishes as BREP_app; the library keeps the historical brep_app symbol so
# the wasm-pack artifact names (pkg/brep_app.js) stay stable.
[]
= "brep_app"
= ["cdylib", "rlib"]
# Standalone crate (NOT a workspace member) — the same reasoning as BREP_render:
# the kernel's Cargo profile settings must not be overridden by a workspace root.
# Plain path deps link the engine rlibs.
# BREP private manifest: 0
[]
# Use the SVG loader's parser to measure artwork without font-era canvas padding.
= { = "0.45.1", = false }
[]
# The automation layer's command registry, queue and virtual pointer (the
# state registry is always compiled). What a host — the embedded server below,
# or BREP_mcp's headless harness — drives the app through.
= ["dep:schemars"]
# The embedded MCP server behind `brep-app --mcp` (src/mcp.rs): the window
# becomes a session an agent drives over loopback HTTP. Native only — the
# server crates are non-wasm dependencies, so the web build takes `automation`
# from this feature and nothing else. On by default so the plain
# `cargo build --release` the release lane runs ships the flag.
= ["automation", "dep:brep-mcp-core", "dep:tokio"]
= ["mcp"]
[]
# The windowing-agnostic viewer brain + wgpu-29 render core we are hosting.
= { = "BREP_render", = "0.4.0", = "../BREP_render" }
# wgpu named directly so we can spell the types the render core hands back /
# takes (TextureView, Device, ...). Resolves to the SAME wgpu 29.x as
# brep-render and eframe's egui-wgpu (all constrain ^29), so the handle types
# are one and the same crate instance.
= { = "29", = ["webgl"] }
# eframe 0.35 → egui 0.35 → egui-wgpu 0.35 → wgpu ^29.0. This is the ONLY eframe
# line whose egui-wgpu is on wgpu 29 (0.34.x is also 29; 0.36 jumps to wgpu 30).
# `wgpu` renderer (NOT glow) so the paint callback shares eframe's wgpu device
# with the render core. default_fonts for a usable UI; x11/wayland for the
# native window backend. eframe re-exports egui / egui_wgpu / wgpu.
= { = "0.35", = false, = [
"wgpu",
"default_fonts",
"x11",
"wayland",
] }
= "0.35"
# Tiling / docking layout engine (drag-and-drop, resizable, tabbed) for the
# side panels. 0.16.0 is the line that targets egui ^0.35 (0.17.x jumps to
# egui 0.36 → wgpu 30, which would ripple through brep-render — deliberately
# NOT taken). `serde` so the user's dock layout persists via the Store seam.
= { = "0.16", = ["serde"] }
# egui's BUILT-IN syntax highlighting for the expressions code editor, plus the
# SVG image loader. `svg` adds the resvg-backed loader, which is how the
# inline-icon catalog (src/icons.rs) gets drawn — see src/icon_text.rs.
# resvg/usvg are `Apache-2.0 OR MIT` since 0.45, so this keeps the "zero
# copyleft-only" finding in THIRD-PARTY-NOTICES.md intact; egui_extras already
# pins resvg with default-features off, so no system-font machinery is pulled
# in for wasm.
#
# We deliberately do NOT take `syntect`. egui_extras ships a fallback
# highlighter behind `#[cfg(not(feature = "syntect"))]` with the SAME
# `highlight()` / `CodeTheme` API — comments, strings, keywords, literals,
# punctuation — which is everything the `name = expr;` expressions sheet has.
# `syntect` costs 16 crates natively and 20 on wasm (syntect, fancy-regex,
# plist, quick-xml, yaml-rust, bincode, walkdir, time, …) for one `layouter`
# closure. See panels/expressions.rs for the language string the fallback needs.
= { = "0.35", = false, = [
"svg",
] }
= { = "1", = ["derive"] } # PaneKind (de)serialize for dock-layout persistence
= "1"
= { = "1.2", = true } # derived JSON Schemas for the automation registries
= "0.4"
# HTTP for the step.parts online model library (Assembly workbench) AND the
# in-app "Submit Bug" report POST. ONE crate, both targets: native spawns a
# background request thread; wasm uses the browser `fetch` (pulling its own
# web-sys fetch features), so no manual Request/Response wiring. Results marshal
# into the egui frame via std::sync::mpsc + request_repaint. NOTE: we DON'T enable
# ehttp's `multipart` feature — it pulls `rand`→`getrandom 0.2`, which needs the
# `js` feature to compile for wasm; the bug report builds its small multipart body
# by hand instead (bug_report.rs) with zero new deps.
= "0.5"
# PNG decode for the library's result thumbnails (decoded on the UI thread, then
# uploaded with ctx.load_texture). PNG-only + default-features off keeps it lean
# and pure-Rust (wasm-safe) — the step.parts thumbnails are all PNG.
= { = "0.25", = false, = ["png"] }
[]
= "0.2"
# The #[wasm_bindgen] macro on the async start fn (lib.rs) expands to code that
# names this crate, AND store.rs `spawn_local`s the model store's write-behind
# pushes onto the browser microtask queue.
= "0.4"
= "0.3"
= { = "0.3", = [
"HtmlCanvasElement",
"Window",
"Document",
# The browser model store (store.rs `web_model`): IndexedDB, which replaced
# localStorage because its ~5-10 MB origin quota cannot hold ONE native BREP
# payload (a measured STEP import: ~35 MB). `DomException` is how a failed
# request/transaction reports WHY, which the app surfaces to the user.
"IdbFactory",
"IdbOpenDbRequest",
"IdbDatabase",
"IdbTransaction",
"IdbTransactionMode",
"IdbObjectStore",
"IdbRequest",
"DomException",
# Read `?loadModel=<url>` at boot so an external link (e.g. the cadDev admin
# "Launch model in CAD app" button) opens the app with a specific model.
"Location",
"UrlSearchParams",
# Model file interchange (download blob + file-input upload) — the browser
# half of the model-store seam (see store.rs `web_model`).
"Element",
"Node",
"HtmlElement",
"HtmlAnchorElement",
"HtmlInputElement",
"Blob",
"BlobPropertyBag",
"Url",
"File",
"FileList",
"FileReader",
"Event",
# Off-main-thread history runner (M3b): a dedicated MODULE web worker so a
# history run never freezes the single-threaded wasm UI. `Worker` +
# `WorkerOptions`/`WorkerType` spawn it; `DedicatedWorkerGlobalScope` is the
# worker-side global (`worker_entry`); `MessageEvent` carries the JSON payloads.
"Worker",
"WorkerOptions",
"WorkerType",
"DedicatedWorkerGlobalScope",
"MessageEvent",
] }
[]
# The MCP server core (feature `mcp`): the same server `brep-mcp` hosts
# headlessly, embedded here over the app's own automation queue.
= { = "BREP_mcp_core", = "0.3.0", = "../BREP_mcp_core", = true }
= { = "1", = ["rt-multi-thread", "sync", "net", "time"], = true }
[[]]
= "brep-app"
= "src/main.rs"
[]
= 3