Skip to content

Releases: tumourlove/monolith

v0.22.0 - Correctness release

Choose a tag to compare

@tumourlove tumourlove released this 01 Aug 12:26

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.

Thanks @aggitti (#115).

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; absent limit caps at 50, explicit limit=0 still means all.
  • A pagination overflow: offset=1 with limit=2147483647 overflowed to an empty result and a negative next_offset.
  • project search no 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

Choose a tag to compare

@tumourlove tumourlove released this 26 Jul 09:02

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_graph can emit link topology. Pass links: true and the response gains a top-level edges array plus a pin_id on every pin, so you can trace branches through static switches or find dead ones without exporting to T3D and parsing LinkedTo yourself. 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_property can now set Margin and Vector4 properties. The value parameter was declared as a string, so every documented shape — [22,14,22,14], {"left":26,...}, or a bare 20 for a uniform margin — arrived as text and was rejected, while the error message listed those exact shapes as valid. value is now typed any, 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, and niagara now validate the destination up front instead of passing input such as //Game/Foo to 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 .uasset that 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: Error on 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_asset with dry_run: true reports 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

Choose a tag to compare

@tumourlove tumourlove released this 22 Jul 05:10

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-correct UK2Node_CallFunction subclass, 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, and get_graph_data now 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 / VariableSet nodes now materialize their data pins (bound via SetLocalMember when the graph declares a matching local). Thanks @Alexbeav (#97).
  • Enum member variables are now enum-typed. VariableGet / VariableSet pins 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 FJsonObject shared-string keys and new -Werror sites, plus Reflection Intelligence support for the 5.8 UHT codegen format — replicated properties, RPCs, OnRep handlers, 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 FJsonObject key 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_inherited now defaults to true (was false). A deletion-safety audit should over-report rather than return a false zero for a variable declared on a parent class. Pass include_inherited: false for 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.7
  • Monolith-v0.21.2-UE5.8.zip — for Unreal Engine 5.8
  • Monolith-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

Choose a tag to compare

@tumourlove tumourlove released this 20 Jul 06:17

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 to Monolith-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).
  • blueprint add_event_dispatcher now creates the multicast delegate member variable (mirroring the Blueprint editor's own flow), so CallDelegate / AddDelegate / RemoveDelegate can actually bind the dispatcher; remove_event_dispatcher cleans it up too. Thanks @Alexbeav (#84).
  • blueprint add_node / resolve_node with node_type: "SpawnActor" no longer crash the editor — the bare name aliases to SpawnActorFromClass instead of instantiating the legacy node whose title code null-derefs, and generic-fallback nodes report a safe title. Thanks @Alexbeav (#85).
  • blueprint add_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).
  • blueprint batch_execute honors a top-level graph_name as the default for every op (per-op values still win) instead of silently editing the EventGraph. Thanks @Alexbeav (#87).
  • blueprint resolve_node dry-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

  • editor load_level fail-closed guards — refuses when the current map has unsaved changes that the unattended load would silently discard (override with dirty_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_CLOSE editor-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

Choose a tag to compare

@tumourlove tumourlove released this 19 Jul 12:10

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). FJsonObject keys became FSharedString in newer 5.8; two MonolithAnimation sites now go through the MonolithKeyToString shim 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 C2039 for anyone on the newer BlueprintAssist. Now detected with __has_include so 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.Unique and the macOS link. Thanks @itismyfield (#77).
  • Indexer no longer strips RF_Standalone from live assets. The source indexer could clear RF_Standalone on assets that were already loaded and referenced, which then blocked File → Save with 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. BlueprintRetarget read 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_widget accepts parent as an alias for parent_name — target a non-root panel directly.
  • ui set_widget_property allowlists the common UWidget properties (Visibility, RenderOpacity, ToolTipText, bIsEnabled, RenderTransform Angle/Scale/Translation) by default — no more raw_mode for the basics.
  • ui set_brush makes property_name optional (auto-resolves Image → Brush, Border → Background); color aliases tint_color.
  • ui set_slot_property now writes grid slots — row, column, row_span, column_span on UUniformGridSlot and UGridSlot.
  • blueprint describe_cdo_schema emits the correct positional TMap ImportText hint, struct values included.
  • blueprint add_variable / set_variable_type accept prefixed key and value types in map strings (map:enum:E:struct:S), so enum-keyed and struct-valued maps are authorable.
  • blueprint connect_pins disambiguates a node ID that lives in more than one graph instead of connecting the wrong one.
  • blueprint add_node / resolve_node resolve user-defined UENUMs for K2Node_SwitchEnum and Blueprint-defined functions for K2Node_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

Choose a tag to compare

@tumourlove tumourlove released this 20 Jun 05:30

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.zip for UE 5.7
  • Monolith-v0.20.3-UE5.8.zip for 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)

Choose a tag to compare

@tumourlove tumourlove released this 15 Jun 09:31

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

Choose a tag to compare

@tumourlove tumourlove released this 15 Jun 07:47

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) and ZoneGraph — that aren't enabled in a stock engine build. On a clean install those DLLs aren't present, so Windows refused to load MonolithAI with GetLastError 126 and 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

  • @aggitti for reporting #71 with enough detail to pin it down fast.

Monolith-SHA256: d07fb28e03aafb7556c0dbf8ee85fe251eff920106c890f04c971684cd6ef72e

v0.20.0 - Animation authoring

Choose a tag to compare

@tumourlove tumourlove released this 14 Jun 08:14

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 existing add_anim_graph_node / connect_anim_graph_pins write 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_space rebuilds a blend space's triangulation (ResampleData); set_blend_space_interpolation sets the grid/triangulation mode + edge direction.
  • remove_ik_solver. Remove an IK Rig solver by index (validated).
  • Compound transition conditions. set_transition_rule gains an expression kind: multi-term terms[] combined with and/or, per-term abs/negate, folded into the transition result.
  • set_anim_node_pin_binding bootstraps the binding object — works on previously-unbound AnimGraph nodes.
  • auto_layout built-in formatterformatter:"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 with bake_blend_space.
  • add_ik_solver failed to add solvers (Full Body IK especially). solver_type now 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

Choose a tag to compare

@tumourlove tumourlove released this 13 Jun 10:54

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 (symbols rows 301,590 → 967,491); FCollisionShape, FSceneView, FScopeLock, FPaths and ~19.6K other engine types that previously had no row now resolve.
  • New deprecation index (EngineSource.db schema v2) — check_deprecations returns index_state: "empty" until the first full pass.
  • build_cs_path backfill — 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/.cpp stub in one round-trip. Plus a deprecation index (schema v2) and build_cs_path backfill.
  • Live-PIE object read/call (editor)pie_get_object_properties (dotted UPROPERTY reads, UserDefinedStruct friendly-name traversal) and pie_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_nodes now emits compact bindings / 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_parent for Blueprint→C++ nativization.
  • T3D asset-text export (project)export_asset_text, the universal escape hatch for surfaces no typed read exposes.

Changed

  • tools/list manifest trimmed ~41% (~16k tokens) — duplicated action lists removed from dispatcher descriptions; the action enum (the authoritative list) is unchanged, so no dispatch behaviour changes. Use monolith_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 in MonolithMesh.Build.cs, fixing the CouldNotBeLoadedByOS race on a clean source-tree build. The full Tier-5 mesh-op surface is preserved; the .uplugin Plugins array is unchanged (no new mandatory dependency).
  • Deep indexer crash on unresolved UDS field types (source, #70)FUserDefinedStructIndexer no longer asserts on a UserDefinedStruct field whose class/struct/enum type can no longer resolve (e.g. a TSubclassOf pointing 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