Releases: tumourlove/monolith
Release list
v0.22.0 - Correctness release
A correctness release. Most of it came from your reports — several of which were sharp enough to reproduce from directly, and two of which turned out to be the tip of something larger.
Downloads
| Engine | Asset |
|---|---|
| UE 5.7 | Monolith-v0.22.0-UE5.7.zip |
| UE 5.8 | Monolith-v0.22.0-UE5.8.zip |
| legacy updaters | Monolith-v0.22.0.zip (a copy of the 5.7 build) |
Blueprint-only users: unzip into your project's Plugins/ folder. Nothing else to do.
Monolith was reporting values that were not your project's
get_component_details read the C++ parent's class-default object for any component inherited from native code, so it returned Epic's constructor defaults dressed up as your settings. A Character Blueprint overriding its capsule half-height to 96 read back 88. It returned null rather than an error, so the result looked deliberately empty rather than unresolved — which is exactly why it survived scrutiny.
There were five independent component resolvers in the Blueprint module and three disagreed about which CDO to read; the write path had it right and the read path did not. That divergence was the bug. There is now one resolver, used by both, reporting how it resolved (scs, cdo_native, ich_override, inherited_scs, parent_cdo_fallback).
Thanks @DanaFo (#116) — the 96-vs-88 comparison isolated it precisely, and picking a float rather than a null was what made it undeniable.
Also in this area: set_component_property can now write to components inherited from a parent Blueprint via an Inheritable Component Handler override, which is the scriptable equivalent of ticking that property in the child's Details panel. Thanks @Thomasbehan (#102) for the approach. The "Mesh" alias resolving to the capsule is fixed, and get_inherited_component_override's ich source could never actually fire — it compared handler records against a CDO component's name.
Enum variables were compiling to int
Type tokens like enum:EStreamlineDLSSGMode built a pin with PC_Enum, which is a picker-only category and never a valid pin category — so the variable compiled through the generic FIntProperty fallback while the API still reported the correct enum type. That produced the memorable error EStreamline DLSSGMode Enum is not compatible with EStreamlineDLSSGMode Enum: the spaced name is the broken pin rendered through a display-name path, the raw one is a correct pin.
Half of this shipped in v0.21.2 for the blueprint path. The Widget path was still broken, which is exactly where a graphics-settings menu lives. Both now build PC_Byte + subcategory through one shared grammar, and an unresolvable enum is a hard error instead of a silent plain byte.
An interrupted index no longer throws away its work
A full index wiped the database at the start and wrote its completion marker only at the end. Any crash, kill or power loss left no marker — and the next launch started another full index, which immediately erased every batch the previous run had finished. On a large project one crash cost hours; repeated crashes meant the index might never complete.
It now checkpoints and resumes. Assets already indexed at their current content hash are not redone. An asset that repeatedly kills the editor mid-index is detected, skipped, and surfaced through project get_stats rather than retried forever — the attempt marker is committed outside the batch transaction specifically so a crash cannot roll away the evidence that the crash happened.
bDeferFirstTimeIndex is honoured when resuming, and a monolith_reindex without force now resumes instead of resetting.
Thanks @Hvizeu (#117), whose diagnosis and lifecycle design this follows (#120).
Risk mining worked only on my machine
risk_query mined git history from a hardcoded list of plugin folders and never probed the project root — so for anyone whose project root is the git repository, which is most people, every root was skipped and the whole namespace returned empty data forever with no explanation. Roots are now discovered at runtime, configurable via GitRepoRoots, and an empty result tells you why it is empty.
Thanks @nanbarada (#119) — including the observation that the configured roots have to participate in stale detection, or changing the setting silently does nothing.
Discovery and search
monolith_discover(filter="…")with no namespace now searches every namespace instead of silently ignoring the filter and handing back the namespace inventory. Rows carry their owning namespace; absentlimitcaps at 50, explicitlimit=0still means all.- A pagination overflow:
offset=1withlimit=2147483647overflowed to an empty result and a negativenext_offset. project searchno longer reports genuine errors as zero results — invalid query syntax is now a caller error, storage and schema failures are internal errors, and column-qualified searches keep working.
Thanks @kunkunGames (#112, #113).
Monolith was disabling other plugins' HTTP routes
Stopping or restarting the server called a process-wide "stop all listeners", which took down every other plugin's HTTP listener in the editor as a side effect. Now only Monolith's own routes are unbound.
Alongside it: three use-after-frees on the indexing worker's game-thread callbacks, live asset-registry callbacks never re-armed after a failed run (so the index silently went stale until an editor restart), two paths that latched "indexing already in progress" until you restarted the editor, honest reindex results instead of unconditional success, and a blocking port probe that stalled the game thread during startup.
Thanks @kunkunGames (#114) for the report the fixes came out of.
Animation
set_anim_graph_node_property treated graph_name / state_name as advisory: an unresolved scope fell through to a global search by node id, and node ids repeat across graphs — so the write landed in an unrelated animation layer, compiled fine, validated fine, and played the wrong animation. A supplied scope is now authoritative, nested state machines resolve at any depth, and the response reports where the write actually landed.
Verification
Each per-engine zip is built with optional dependencies forced off, checked under both -DisableUnity and full unity, and its DLL imports are inspected for hard links to plugins you may not have installed. The offline CLI is rebuilt and byte-compared against its Python sibling (27/27 identical this release).
Monolith-SHA256-v2-UE5.7: 3bd87472f50c87f2259e573bf253c5f6d10a69a10fe1e08c0ed9ea9cf196cd51
Monolith-SHA256-v2-UE5.8: 92d65d2f070e2f89589f25303335a91dd44575bc2b65004b415f8e301e780e6e
Monolith-SHA256-v2: 3bd87472f50c87f2259e573bf253c5f6d10a69a10fe1e08c0ed9ea9cf196cd51
The in-editor updater verifies the download against the marker for your engine before installing.
Not taken this release
UE 5.6 support (#103, @Puche) — declined, and I owe you a proper reply on the PR rather than silence. The short version: I cannot compile-verify 5.6 here, there is no CI, and I would rather not advertise support I cannot test. Your pose-search analysis was correct about what changed between versions.
MCP Toplist badge (#118, @chrstphe) — thanks, but I keep the README badges to facts about the repo itself.
Generic graph-node property writes (#102 part 2) — deferred rather than rejected; the need is real, but as submitted it writes any property on any object by path, and that wants a narrower design first.
v0.21.3 - PR queue closeout
Closes out the open pull-request queue. Every fix below came from a contributor report — thanks to @Thomasbehan, @whalemenace, and @kunkunGames for write-ups detailed enough to reproduce from directly.
Downloads
Pick the zip matching your engine. The auto-updater selects it for you.
| Engine | Asset |
|---|---|
| UE 5.7 | Monolith-v0.21.3-UE5.7.zip |
| UE 5.8 | Monolith-v0.21.3-UE5.8.zip |
| legacy updaters | Monolith-v0.21.3.zip (copy of the UE 5.7 build) |
Added
niagara get_module_graphcan emit link topology. Passlinks: trueand the response gains a top-leveledgesarray plus apin_idon every pin, so you can trace branches through static switches or find dead ones without exporting to T3D and parsingLinkedToyourself. Output is unchanged when the flag is absent. Edges are keyed by the(node_guid, pin_id)pair, because pin IDs alone are not unique within a graph — copy-paste duplicates them. Thanks @whalemenace (#109).
Fixed
ui set_widget_propertycan now set Margin and Vector4 properties. Thevalueparameter was declared as a string, so every documented shape —[22,14,22,14],{"left":26,...}, or a bare20for a uniform margin — arrived as text and was rejected, while the error message listed those exact shapes as valid.valueis now typedany, and both parsers additionally accept string-encoded and comma-separated forms. Thanks @Thomasbehan (#110).- Malformed destination paths are rejected before anything is created. Seventeen asset-creation actions across
blueprint,material, andniagaranow validate the destination up front instead of passing input such as//Game/Footo low-level package APIs. Nothing is created, loaded, or left dirty on a rejected call. In the compound PBR workflow, an invalid option or an existing-material collision now fails before the first texture is imported. Thanks @kunkunGames (#106, #107, #108). - Material creation no longer risks overwriting an unindexed asset. The collision probe is an Asset Registry query, which cannot see a
.uassetthat is on disk but not yet indexed — during a startup scan, or copied in out of band. Creation now forces the package load that makes the check authoritative, so existing content is merged rather than clobbered. - A spurious error log on every successful asset creation is gone. Destination probes previously attempted a load that was expected to fail, emitting
LogEditorAssetSubsystem: Erroron the normal path.
Changed
Three user-visible changes, all in the direction of failing loudly rather than quietly producing something broken.
- Destination paths containing characters Unreal forbids in a package name are now errors. That set is
\ : * ? " < > | ' <space> , . & ! ~ @ #. Previously such input passed a much weaker check and produced a mangled asset. If a path you rely on is rejected and you believe it is legitimate, please open an issue rather than working around it. - Object-path destinations are accepted and normalised. Because the forbidden set includes
., the stricter validation above would otherwise reject/Game/Foo/M_Bar.M_Bar— which is exactly what you get copying a path out of a search result. The redundant suffix is stripped when it unambiguously names the same asset; a mismatched leaf, a dot inside a folder segment, or more than one dot is still rejected. blueprint seed_data_assetwithdry_run: truereports a malformed path as an error rather than returning a dry-run report, since validation runs before the dry-run branch.
Notes for contributors
CONTRIBUTING.md now states that UE 5.7 is the compile floor and that changes must build on both 5.7 and 5.8, with any newer API behind an ENGINE_MINOR_VERSION gate. A pull-request template checks for it. A .gitattributes also normalises line endings, so contributions no longer arrive as whole-file CRLF rewrites that bury a small change.
Verification
Both engines built clean with MONOLITH_RELEASE_BUILD=1, -DisableUnity, the full-unity collision gate, and the dumpbin import smoke.
Monolith-SHA256-v2-UE5.7: f67cb132c9868a72c80059ccb2fe76c7586c8094116c939e1fbaa1e0dde16f63
Monolith-SHA256-v2-UE5.8: 8654acb0abd0b81ea24ea60486b447a5d22e5d12ff6e529d6df15ce26d3cc1df
Monolith-SHA256-v2: f67cb132c9868a72c80059ccb2fe76c7586c8094116c939e1fbaa1e0dde16f63
v0.21.2 - Blueprint fixes & UE 5.8 compatibility
Bug-fix release: Blueprint authoring fixes and UE 5.8 / Linux source-build compatibility. Ships for UE 5.7 & UE 5.8.
Fixed
- Blueprint wildcard array pins now resolve. Tool-created
Array_*nodes spawn the palette-correctUK2Node_CallFunctionsubclass, so their wildcard pins take a concrete type from the connections you make; the schema-mediated disconnect path resets them when you unhook. Thanks @Alexbeav (#95). - Blueprint reference-audit blind spots closed.
list_graphs,search_nodes,find_variable_references, andget_graph_datanow see inside collapsed-composite subgraphs, read input-pin default values, catch string-bound timer callers (SetTimerByFunctionName), and account for inherited-scope variables. Thanks @Alexbeav (#96). - Local-variable
VariableGet/VariableSetnodes now materialize their data pins (bound viaSetLocalMemberwhen the graph declares a matching local). Thanks @Alexbeav (#97). - Enum member variables are now enum-typed.
VariableGet/VariableSetpins carry the enum type and connect to enum consumers (switches, comparisons) directly. Thanks @Alexbeav (#98). - UE 5.8 / Linux source-build compatibility. Build fixes for the 5.8
FJsonObjectshared-string keys and new-Werrorsites, plus Reflection Intelligence support for the 5.8 UHT codegen format — replicated properties, RPCs,OnRephandlers, interfaces, and parent chains parse again on 5.8. Thanks @gregorygmwhite (#99). - MetaSound build error on UE 5.8 fixed, plus broader cross-version hardening of
FJsonObjectkey iteration (GAS, LogicDriver, and ComboGraph bulk-fill, and MetaSound) so the same source builds on both 5.7 and 5.8. Reported by @Matt-Makes (#100).
Changed
find_variable_references.include_inheritednow defaults totrue(wasfalse). A deletion-safety audit should over-report rather than return a false zero for a variable declared on a parent class. Passinclude_inherited: falsefor the strict own-class-only view. (#96)
Assets — UE 5.7 & UE 5.8
Monolith-v0.21.2-UE5.7.zip— for Unreal Engine 5.7Monolith-v0.21.2-UE5.8.zip— for Unreal Engine 5.8Monolith-v0.21.2.zip— legacy bridge (identical to the UE 5.7 build) so pre-cross-engine auto-updaters keep working
The auto-updater selects the asset matching your running engine and verifies its checksum against the marker below.
Monolith-SHA256-v2-UE5.7: dbd6b1a794293f0dd9196f1d63917fd5b9a878301e443162718210b9584eecc6
Monolith-SHA256-v2-UE5.8: 7af48939637169d5d294ddaf1c4d0e795b9c707dcb2080d6136c805e50070dac
Monolith-SHA256-v2: dbd6b1a794293f0dd9196f1d63917fd5b9a878301e443162718210b9584eecc6
Closes #100.
v0.21.1 — auto-updater crash hotfix + community PR batch
Hotfix for yesterday's v0.21.0 — most importantly for the auto-updater crash some of you hit within hours of the release (#90, #94). Sorry about that one; it was as bad as bugs get, and the reports were superb. Details below, but the short version: install this release manually (download the zip for your engine, close the editor, replace Plugins/Monolith/ in your project). Building from source? Just pull master.
Important
If you're on v0.20.3 or v0.21.0 you may see a "Monolith auto-update aborted: missing integrity marker" notification instead of an update prompt — that is deliberate. Your installed version's updater has a Windows bug that crashes the editor during install verification, so this release publishes its checksums under new names your version doesn't recognize, making it fail safe instead of crash. Update manually this one time; from v0.21.1 onward the updater verifies and installs normally. (Versions before 0.20.3 will auto-update to this release, skipping the integrity check.)
Fixed
- CRITICAL — clicking "Install" on the update notification no longer crashes the editor on Windows (#90, #94). Since v0.14.7 the updater's integrity check called
FPlatformMisc::GetSHA256Signature, which has no Windows implementation — the engine's generic fallback is a fatal assert, so the check killed the editor the moment it ran. It now uses a portable, NIST-vector-tested SHA-256 built into the plugin, and release checksums moved toMonolith-SHA256-v2-*marker names so older (broken) updaters can never trip over them again. Thanks @Alexbeav for the minidump-verified root cause (#90) and the fix (#91), and @SilkroadLabs for the parallel report (#94). blueprintadd_event_dispatchernow creates the multicast delegate member variable (mirroring the Blueprint editor's own flow), soCallDelegate/AddDelegate/RemoveDelegatecan actually bind the dispatcher;remove_event_dispatchercleans it up too. Thanks @Alexbeav (#84).blueprintadd_node/resolve_nodewithnode_type: "SpawnActor"no longer crash the editor — the bare name aliases toSpawnActorFromClassinstead of instantiating the legacy node whose title code null-derefs, and generic-fallback nodes report a safe title. Thanks @Alexbeav (#85).blueprintadd_timeline_track— the new track's output pin now actually appears on the timeline node and is connectable (display-track registration + node reconstruction, mirroring the timeline editor). Thanks @Alexbeav (#86).blueprintbatch_executehonors a top-levelgraph_nameas the default for every op (per-op values still win) instead of silently editing the EventGraph. Thanks @Alexbeav (#87).blueprintresolve_nodedry-runs of delegate nodes now resolve the real signature pins instead of just execute/then/self. Thanks @Alexbeav (#92).- Array/object params sent as JSON-encoded strings now work everywhere — some MCP clients (Claude Code included) stringify complex tool arguments; the registry now recovers them centrally, so flat calls to
delete_assets,save_packages,set_function_params,set_event_dispatcher_params, etc. stop failing with "array is required". Thanks @Alexbeav (#93).
Added
editorload_levelfail-closed guards — refuses when the current map has unsaved changes that the unattended load would silently discard (override withdirty_policy:"discard"), and refuses when a stale in-memory copy of the target world would trip the engine's fatal "World Memory Leaks" assert. Thanks @Alexbeav (#89).- Paired
MODAL_OPEN/MODAL_CLOSEeditor-log telemetry with window identity and slow-task flag on UE 5.8+, so log consumers can tell a healthy modal from one still blocking the game thread. Thanks @Alexbeav (#88).
Huge thanks to @Alexbeav for an exceptional batch of contributions — nine merged PRs in this release, every one tested and documented to a standard that made review a pleasure.
Monolith-SHA256-v2-UE5.7: cce5ad20f43e466af8d54f5ef6a80b57c1fed5e689984ddb76f739daf11db3c4
Monolith-SHA256-v2-UE5.8: 75d1ec92d73fe6142827da8f157e433ae90b2e7596947a990406440247c64b1a
Monolith-SHA256-v2: cce5ad20f43e466af8d54f5ef6a80b57c1fed5e689984ddb76f739daf11db3c4
v0.21.0 — source-build fixes, indexer data-loss fix, ui/blueprint ergonomics
Hey everyone — sorry for the quiet stretch. I've been buried in my own projects for a while and Monolith updates took a back seat longer than I meant them to. Thanks for the patience, the bug reports, and the pull requests while I was heads-down. This release clears out the backlog that piled up: the source-build breakages, a nasty indexer bug, and a batch of ui/blueprint ergonomics from the Ideas board.
As always, Monolith runs on both UE 5.7 and 5.8 — grab the zip that matches your engine (the plugin is Blueprint-only, no compiler needed). Building from source? Just pull master.
Important
Please install this release manually — don't click "Install" in the in-editor update popup. The auto-updater shipped in v0.14.7 through v0.21.0 has a Windows bug that hard-crashes the editor during the install step's integrity check (#90, #94). I've removed the integrity markers from these notes so older versions fail safely instead of crashing — if you're on v0.20.3 and see an "auto-update aborted: missing integrity marker" notification, that's this safeguard working, not a broken release. To update: close the editor, delete Plugins/Monolith/ in your project, and unzip the release for your engine in its place. The updater itself is fixed in the next release.
Fixed
- Source builds on UE 5.8 (CL 55116800).
FJsonObjectkeys becameFSharedStringin newer 5.8; twoMonolithAnimationsites now go through theMonolithKeyToStringshim so the same source compiles on 5.7 and 5.8. Thanks @Baba-Ramsi for the pinpoint report (#80), and @dulanw for the parallel fix in #79. - Source builds on Linux / clang. Four doc comments contained a literal
/*glob pattern that tripped-Werror,-Wcomment. Thanks @daschatten-tb (#83). - BlueprintAssist bridge vs BA 4.9.0+. BA 4.9 moved its formatting API, which caused a
C2039for anyone on the newer BlueprintAssist. Now detected with__has_includeso both pre-4.9 and 4.9+ build. Thanks @tc-imba for the thorough PR (#78), and @mewliks for the parallel diagnosis (#76). - GeometryScripting delay-load gated to Win64. The delay-load DLLs weren't platform-gated, breaking
BuildEnvironment.Uniqueand the macOS link. Thanks @itismyfield (#77). - Indexer no longer strips
RF_Standalonefrom live assets. The source indexer could clearRF_Standaloneon assets that were already loaded and referenced, which then blockedFile → Savewith a data-loss guard (0x10000002). It now only unloads packages it actually brought in — across all seven call sites plus the landscape teardown path. Thanks @Alexbeav for the excellent root-cause writeup (#81). - Optional-plugin detection no longer false-positives on plugins that share a name prefix (e.g.
BlueprintRetargetread as BlueprintAssist). Thanks @k-s-s (#66).
Added — ui and blueprint ergonomics
All from the Ideas board (Discussion #74) — thanks @k-s-s for the detailed, reproducible requests. No new actions; existing ones just got smarter.
ui add_widgetacceptsparentas an alias forparent_name— target a non-root panel directly.ui set_widget_propertyallowlists the commonUWidgetproperties (Visibility, RenderOpacity, ToolTipText, bIsEnabled, RenderTransform Angle/Scale/Translation) by default — no moreraw_modefor the basics.ui set_brushmakesproperty_nameoptional (auto-resolves Image → Brush, Border → Background);coloraliasestint_color.ui set_slot_propertynow writes grid slots —row,column,row_span,column_spanonUUniformGridSlotandUGridSlot.blueprint describe_cdo_schemaemits the correct positionalTMapImportText hint, struct values included.blueprint add_variable/set_variable_typeaccept prefixed key and value types in map strings (map:enum:E:struct:S), so enum-keyed and struct-valued maps are authorable.blueprint connect_pinsdisambiguates a node ID that lives in more than one graph instead of connecting the wrong one.blueprint add_node/resolve_noderesolve user-definedUENUMs forK2Node_SwitchEnumand Blueprint-defined functions forK2Node_CallFunction— not just native/engine ones.
Note
On the "deferred / skill-based MCP loading" idea (#82) — thanks @aggitti: that's already how it works as of v0.20.3. monolith_discover is terse by default, describe_query fetches a single action's schema on demand, and your MCP client only loads a namespace's tool schema when you actually reach for it. Appreciate you flagging the direction.
v0.20.3 - Leaner discovery + UE 5.8 support
v0.20.3 — Leaner discovery + UE 5.8 support
Two headline changes this release: discovery got a lot lighter, and Monolith now runs on UE 5.8 as well as 5.7.
Discovery is ~70-80% lighter
monolith_discover("<namespace>") used to hand back the full JSON-Schema for every action's params. That was the single biggest context hog in the whole MCP surface — discover("blueprint") alone was ~24,500 tokens, more than the entire top-level discover().
Now the per-namespace listing returns just the action name + a one-line description. When you actually need the full schema for one action, describe_query action_schema gives you that (~50 tokens), or pass detail=true to get the old full-schema response back verbatim. Measured drops:
| namespace | before | after | saved |
|---|---|---|---|
| blueprint | 24,521 | 4,027 | 84% |
| animation | 36,236 | 6,682 | 82% |
| ui | 20,590 | 4,944 | 76% |
| ai | 20,157 | 5,588 | 72% |
The full action list is still returned by default — nothing is hidden behind pagination. There is also a new filter (substring match on name or description) and opt-in offset/limit if you want them.
UE 5.8 support
Monolith builds and runs on UE 5.8 now, from the same source tree as 5.7 — no separate branch, no #if soup.
If you build from source, that is all you need to know: one tree, both engines. If you use the prebuilt (Blueprint-only) binaries there is a wrinkle — a compiled plugin DLL is locked to one engine version's ABI, so one set of binaries cannot load on both 5.7 and 5.8. So this release ships two zips; grab the one for your engine:
Monolith-v0.20.3-UE5.7.zipfor UE 5.7Monolith-v0.20.3-UE5.8.zipfor UE 5.8
The in-editor auto-updater detects which engine you are running and pulls the right one automatically, so after this you do not have to think about it. (There is also a plain Monolith-v0.20.3.zip — the 5.7 build under the old name, so auto-updaters from before this release keep working.)
Also in this release
A big batch of animation authoring landed: 8 IK-Retargeter pose + op-stack tuning actions, locomotion-variable scaffolding, IK Rig bone settings, FK bone-transform inspection, and a pile of smaller animation read/write improvements (retarget op introspection, anim-modifier properties/persist, blend-space root-motion reporting, wire-linked pin bindings, foot-sync derived from bone tracks). Plus set_property_at_path — a surgical writer that sets one value deep inside a CDO/DataAsset by a dotted+bracket path (Standing.Gaits[Jog].Starts.Forward) without rebuilding the whole array/map around it.
Widget animations created through the MCP UI actions now actually play at runtime — they were a silent no-op before because the generated member bound on the wrong FName. Thanks @mewliks for the fix and a really clean root-cause writeup (#72).
Upgrading
Grab the zip for your engine below, or let the in-editor auto-updater pull it.
Monolith-SHA256-UE5.7: 7669c30bfb9d1fc7af1dec58becfde637c66d46523bafb1fe95328fbe473b13e
Monolith-SHA256-UE5.8: eb91e8005762ff19b90231e1e0526e3e8597df04ad44922978702b81a3e66f30
Monolith-SHA256: 7669c30bfb9d1fc7af1dec58becfde637c66d46523bafb1fe95328fbe473b13e
v0.20.2 - Source-rebuild plugin loading fix (#71)
v0.20.2 — Source-rebuild plugin loading fix (#71)
A follow-up to v0.20.1. If you use the prebuilt binaries (Blueprint-only, or a project that doesn't recompile the plugin), v0.20.1 already loads cleanly and this update is optional. This release fixes the remaining case: projects that rebuild Monolith from source.
What was wrong
The optional-plugin gates in five modules (MonolithAI, MonolithMesh, MonolithIndex, MonolithAudio, MonolithAnimation) decided whether to link an optional engine plugin by checking whether that plugin's folder existed on disk. Engine plugins like MassGameplay and ZoneGraph ship with the engine and are always on disk, so a from-source build linked them in even when they weren't enabled in the project. On a stock engine those plugins aren't loaded, so MonolithAI.dll failed to load with GetLastError=126 (missing MassSpawner.dll / ZoneGraph.dll). v0.20.1 rebuilt the shipped binaries clean but did not change this source-side logic, so source builders kept hitting it.
The fix
Those five Build.cs files now read the project's .uproject and gate each optional plugin on whether it is actually enabled in the project, not merely present on disk. A from-source build with those plugins disabled now produces a clean MonolithAI.dll with no missing imports; projects that do enable the plugins keep the corresponding features.
Upgrading
Grab the zip below, or let the in-editor auto-updater pull it. If you previously enabled MassGameplay / ZoneGraph only to work around the load failure, you can disable them again after updating.
Thanks to @aggitti for the detailed logs that pinned both the original binary leak and this source-side follow-up.
Monolith-SHA256: 352b3e9c0b86689cb8d2ca4d4aef68fefdc4956be75cbf7818d6e00b5d923cb1
v0.20.1 - MonolithAI load fix
What's New
This is a hotfix for v0.20.0. If you're on a stock UE 5.7.4 install from the Epic Launcher, v0.20.0 may have failed to load with a GetLastError 126 error — this release fixes that.
Fixed
- MonolithAI now loads on a stock UE 5.7.4 install. The v0.20.0 binary accidentally hard-linked two optional experimental plugins —
MassSpawner(MassEntity / MassGameplay) andZoneGraph— that aren't enabled in a stock engine build. On a clean install those DLLs aren't present, so Windows refused to load MonolithAI withGetLastError 126and the whole plugin failed to come up. The release binary is now correctly gated, so MonolithAI loads cleanly without those plugins. (#71)
Behind the scenes, the release build's import-leak check is now mandatory and a lot stricter, so this class of "hard-linked an optional plugin" bug can't slip into a release again.
Upgrade Notes
Drop-in replacement for v0.20.0. Nothing to do beyond updating — no config changes, no migration steps. If you use the in-editor auto-updater it'll pull this for you; otherwise replace the plugin folder with this zip as usual.
Thanks
Monolith-SHA256: d07fb28e03aafb7556c0dbf8ee85fe251eff920106c890f04c971684cd6ef72e
v0.20.0 - Animation authoring
An animation-authoring release: a pack of AnimGraph node-authoring actions for building Anim Blueprints from scratch over MCP, full state-machine editing, blend-space baking, and two correctness fixes.
Action count is approximate. Monolith exposes ~1,500+ actions across 25+ in-tree namespaces (public, in-tree only). Query monolith_discover() (its total_actions field) for the exact live figure — docs are kept in the right ballpark, not pinned to an integer.
Added — animation
- AnimGraph-authoring pack (14 actions).
add_apply_additive,add_apply_mesh_space_additive,add_slot_node(validates the slot name against the skeleton),add_save_cached_pose/add_use_cached_pose(paired by name),set_output_pose_source,set_state_result_source,add_blend_by_int,add_blend_by_enum(one pose pin per exposed enumerator),set_sync_group,set_layered_blend_bones,add_anim_control_rig_node,add_linked_anim_layer,add_conduit— composing with the existingadd_anim_graph_node/connect_anim_graph_pinswrite surface. - State-machine editing.
remove_anim_state,set_anim_entry_state,remove_anim_transition— edit a state machine after creation, not just at build time. - Blend-space baking + interpolation control.
bake_blend_spacerebuilds a blend space's triangulation (ResampleData);set_blend_space_interpolationsets the grid/triangulation mode + edge direction. remove_ik_solver. Remove an IK Rig solver by index (validated).- Compound transition conditions.
set_transition_rulegains anexpressionkind: multi-termterms[]combined withand/or, per-termabs/negate, folded into the transition result. set_anim_node_pin_bindingbootstraps the binding object — works on previously-unbound AnimGraph nodes.auto_layoutbuilt-in formatter —formatter:"builtin"lays out anim graphs without Blueprint Assist, so layout works in release builds.
Fixed — animation
- MCP-authored blend spaces played bind/A-pose at runtime. The four blend-space mutators (
add_blendspace_sample,edit_blendspace_sample,delete_blendspace_sample,set_blend_space_axis) now rebuild the triangulation after each edit, so a blend space authored over MCP no longer ships with empty triangulation. Existing broken blend spaces can be repaired withbake_blend_space. add_ik_solverfailed to add solvers (Full Body IK especially).solver_typenow resolves against the live solver-struct table (friendly aliases or the exact struct name, with ambiguity/unknown errors listing the candidates) instead of a hardcoded reflected path that does not resolve in UE 5.7.
Monolith-SHA256: 9bf317b0a4a5f3d29553a76a0f06d61fb7046acdcb05a9ba9310a30c464d104f
Monolith v0.19.0 — LLM C++ ergonomics + live-PIE introspection
Monolith v0.19.0 — LLM C++ ergonomics + live-PIE introspection
An LLM-C++-ergonomics release: an eight-action source pack so your AI can resolve an include, signature, deprecation, Build.cs deps, header lint, or a UCLASS stub in one round-trip, plus a parser fix that tripled the engine source index. Layered on top: live-PIE introspection + driving (editor), anim-node binding read/write and time-series PIE sampling (animation), Blueprint variable census + contract reconciliation (blueprint), and T3D asset-text export (project). Two first-launch crash/load fixes (issue #70) and a ~40% smaller tools/list manifest round it out.
Monolith now exposes ~1,400+ actions across 25+ in-tree namespaces. Query
monolith_discover()for the exact live figure.
⚠️ Re-run a full engine source index after upgrading
This release's index gains only populate after one full engine source re-index (monolith_reindex, or the editor's Reindex Engine Source / source.trigger_reindex). Until you reindex, the new source ergonomics actions run against the old, smaller symbol table:
- ~3× larger engine symbol table — allman-brace class/struct indexing (
symbolsrows301,590 → 967,491);FCollisionShape,FSceneView,FScopeLock,FPathsand ~19.6K other engine types that previously had no row now resolve. - New deprecation index (
EngineSource.dbschema v2) —check_deprecationsreturnsindex_state: "empty"until the first full pass. build_cs_pathbackfill — populated on the same full pass.
Existing EngineSource.db files enrich in place on the next full pass — a project-only reindex does not cover engine symbols. A full pass takes ~25–30 min; the offline monolith_query.exe / monolith_offline.py tools pick up the richer results automatically once it completes.
Added
- LLM C++ authoring ergonomics (
source) — eight new read-only, offline-served actions across three phases:get_include_path,get_signature,check_deprecations,verify_symbols,find_example_usage,suggest_build_cs_deps,lint_header,generate_class_stub. Resolve an include, exact overload signature, deprecation status, required Build.cs modules, UHT header lint, or a UCLASS.h/.cppstub in one round-trip. Plus a deprecation index (schema v2) andbuild_cs_pathbackfill. - Live-PIE object read/call (
editor) —pie_get_object_properties(dotted UPROPERTY reads, UserDefinedStruct friendly-name traversal) andpie_call_function(BlueprintCallable invoke with JSON arg marshalling). - Deterministic PIE input driving (
editor) —pie_set_control_rotation,pie_inject_input_action(Enhanced Input injection),pie_possess_spectator_free. - Stat-group counter readout (
editor) —get_stat_group_values(#if STATS-gated). - Anim-node binding read/write (
animation) — function-slot and pin property-access binding read/write;get_nodesnow emits compactbindings/pin_bindings. Plus time-series PIE sampling (sample_pie_timeseries) and lockstep AnimInstance parity comparison. - Blueprint variable census + contract reconciliation (
blueprint) —find_variable_references,compare_class_variable_contract,promote_variables_to_parentfor Blueprint→C++ nativization. - T3D asset-text export (
project) —export_asset_text, the universal escape hatch for surfaces no typed read exposes.
Changed
tools/listmanifest trimmed ~41% (~16k tokens) — duplicated action lists removed from dispatcher descriptions; theactionenum (the authoritative list) is unchanged, so no dispatch behaviour changes. Usemonolith_discover("<namespace>")for the action list.- PropertyAccess node paths, friendly-name struct sampling, chooser column bindings, and interface-implementation graphs are now visible to the relevant read actions.
Fixed
- First-launch load failure (
mesh, #70) — GeometryScripting DLLs are now delay-loaded inMonolithMesh.Build.cs, fixing theCouldNotBeLoadedByOSrace on a clean source-tree build. The full Tier-5 mesh-op surface is preserved; the.upluginPlugins array is unchanged (no new mandatory dependency). - Deep indexer crash on unresolved UDS field types (
source, #70) —FUserDefinedStructIndexerno longer asserts on a UserDefinedStruct field whose class/struct/enum type can no longer resolve (e.g. aTSubclassOfpointing at a deleted Blueprint); such fields index as<unresolved>. - Plain-class indexing gap (
source) — allman-style (next-line-brace) classes/structs are now indexed, the root cause of the ~3× symbol-table growth above.
Thanks to @aggitti for reporting issue #70.
Install
Blueprint-only users: drop the unzipped Monolith/ into your project's Plugins/ folder (binaries are bundled, Installed: true). Source users: clone into Plugins/ and rebuild — Build.cs auto-detects optional dependencies at compile time.
After installing/upgrading, run a full engine source re-index (see the callout above) to populate the new index features.
Monolith-SHA256: e9f580c6fb7a83213905f965d9374018916b3777fd2f35f1310f7a2dfdf63320