Repository navigation
Releases: RusticStack/hydra-engine
Release list
Hydra Engine 12.3-hydra.2
Released 2026-10-26. Based on upstream Ghidra master (12.3 DEV) as of 2026-10-26,
commit 057a646233edfb21768a42a0aabc1d1a7709da19: the same upstream commit as 12.3-hydra.1
(upstream had no newer commit when this release was cut).
What's new for integrators
Several agents can now change things at the same time, each in the way that fits its work:
- A working copy of a project (
fork_project) while every other client keeps reading the
master: a block clone on ReFS (about 0.2 s and 3-5 MB for a 1.5 GB project), a full copy
elsewhere (8.5 s for the same project to NTFS), with the source
and base revision recorded next to the fork. - A private overlay of a program others read (
open_programwithoverlay,
apply_overlay): renames, labels, comments, signatures and data types only that client sees,
never saved unless promoted into a working copy (promote_overlay). - Several writers: several clients write one project (different programs in parallel), or
one program in shared mode ("share": true), with every change journalled with its author,
expectagainst lost updates, an atomiceditcommand anddiscard_edits. - Revisions and
refresh: answers say when another process saved a project a read-only
view serves (stale);refreshreopens it for all its clients at once. - Who holds it, and what to do:
busy,conflictandnot_ownername the holder
(holderInfo) and suggest the action (retry,fork_projectwith a ready request, an
overlay,share,reread,open_read_only). - Imports in parallel (
maxImports), with a visible, cancellable queue instatus.imports. - Per-request
client/harnesslabels, so one MCP server serving several agents can tell
them apart in holders,status, the import queue andcancel. - A versioned integration contract:
helloandstatuscarryprotocol,minClient,
hydraVersion,ghidraVersionandinstallId; the client ships as its own release asset,
hydra-client-12.3-hydra.2.zip, and refuses an engine it cannot drive. The export contract
of long scripts (artifact path, progress, cancel, partial files) is documented and tested.
Compatibility
- Protocol 2, unchanged. Everything above is new commands and new fields; nothing was
renamed or removed, except that thebusydetails of a program lock carry the program's key
inprogram(its project path moved topath). The engine answersminClient: "1.0.0". - Client 1.0.0 (
ghidra_session.py,CLIENT_VERSION) is the first versioned client;
pin it together with the engine. The unversioned client of 12.3-hydra.1 still speaks protocol
2 but does not check the engine. - Projects: a project saved by this build cannot be opened by Ghidra 12.2 or 12.1.4
(upstreammasterwrites data type databases at version 3). Projects analysed with 12.1.4
open read-only without being written, upgraded in memory and then served from the upgrade
cache;fork_projectmakes a writable copy that leaves the original as it was. The
legacy-12.1.4branch remains for projects that must stay on 12.1.4. - Platforms: built and tested on Windows 11 x64 only (locally and in the release
workflow). Linux and macOS are not released or tested routinely.
Downloads
hydra-engine-12.3-hydra.2-win_x86_64.zip: the headless install for Windows x64 (gradle zipHeadless); the release workflow ran the three test suites on it after unzipping it.hydra-client-12.3-hydra.2.zip:ghidra_session.py(standard library only) stamped with
this release,LICENSEand a shortREADME.txt.SHA256SUMSfor both.
You need a JDK 25 and Python 3.10 or later; the install has no JDK.
Known limits
- The data type database version 3 limit above, and a development snapshot as the base
(upstreammasteris Ghidra's next version under work, not a Ghidra release). - Overlays change only through their five operations (rename, label, comment, signature, data
type) and show the program as stored when they opened, not other writers' unsaved changes. - A fork is a block clone only on ReFS (Windows 11 24H2 and later); on NTFS it is a full copy,
whichautomode refuses aboveforkCopyLimitMb(default 2048). - The author journal lives in the daemon's memory while the program is open and keeps the last
200,000 entries;discard_editsreverts renames, labels and comments only. - Headless only: no window, help, javadoc or Python type stubs.
Added
-
Holder information in
busy,conflictandnot_owner(HeadlessSession). The error
details name who holds the project, program or lock:holderInfo(client,name,
harness,label,command,heldMs; for another process, the user, host and time from
Ghidra's project lock file and whether that process is alive), the project or program identity
(project,gpr,programkey,path,sha256), andsuggest:retry,
fork_project(with a readysuggestionrequest) where a working copy is the answer,
share(join a shared program),reread(a value changed since it was read), or
open_read_only.holderstays a string as before; everything else is new fields. -
fork_project(HeadlessSession): copies a project into a working copy for the caller
while the source and its read-only views stay open and in use. A block clone on ReFS (Windows
11 24H2 and later), else a full copy;modeauto(clone, or a full copy up to
forkCopyLimitMb, default 2048),copy-on-write(clone or refuse) orfull. The answer has
the new project id, the paths, the source's identity and base revision,method,cloned
(measured),bytes,filesand times. The fork records its source, base revision and lineage
in<name>.fork.jsonnext to its.gpr, shown asforkbyproject. A source another
client or process writes is refused, naming it. New launcher settingforkCopyLimitMb
(GHIDRA_SESSION_FORK_COPY_LIMIT_MB), daemon option-forkCopyLimitMb. -
Revisions and
refresh(HeadlessSession): every project and program has arevision
(a fingerprint of the saved files), shown byopen_project,project,projects,
open_program,info,saveandstatuswithdiskRevision,staleandgeneration.
Answers carrystale(a read-only view whose project another process saved) and, once,
refreshed(another client refreshed it). New commandrefresh(aliasreopen) reopens a
read-only view for all its clients at once, under the same keys. The Python client gains
call_rawandlast_response. -
Integration contract (
Ghidra/Features/HeadlessSession,support/ghidra_session.py):
hello,statusand the endpoint file now carryprotocol,minClient,hydraVersion,
ghidraVersion,installIdandstartedAt; the Python client has aCLIENT_VERSION
(1.0.0) and refuses, withIncompatibleError(exit code 4 on the command line), an engine of
another protocol or one whoseminClientis newer than itself;statusandstopstill work
on such an engine.ghidra_session.py versionprints the client's version. README: "Pinning
and upgrading", and a compatibility statement for projects analysed with Ghidra 12.1.4. -
Client release artifact: the release workflow also publishes
hydra-client-<version>.zip
(the standard-library-onlyghidra_session.pystamped with the release,LICENSE, a short
README.txt), listed inSHA256SUMS..github/scripts/package-client.shbuilds it and
checks the packaged file; CI runs it as a dry run. -
Status shows requests: each client in
statuslists its unanswered requests (id,cmd,
artifact,ms,message,progress,maximum) and itsclientVersion. -
Script exports:
scripttakes an optionalartifact(a path the script writes), echoed in
statusand in the result;examples/scripts/ExportJsonl.javais a sample export with
progress and an inspectable partial file; README "Scripts" states the export contract
(output outside the project, not capped bymaxChars, partial files after cancel and shutdown). -
Concurrency documentation: README "Who can do what at the same time": readers, writers,
projects, imports, and whatconflict,busyandnot_ownermean. -
Tests:
examples/contract_tests.py(identity fields, client compatibility, a 600,000-line
export with progress, cancel and shutdown), run by CI and the release workflow. -
The import queue is visible and cancellable. Imports that cannot run yet (one at a time
when this was added; up tomaxImportssince "Imports run in parallel" below) queue
first-come, first-served without holding a scheduler slot.status.importsshows the
holder (client label, project, file, running time), the queue with each entry's position and an
estimated wait (from the durations of earlier imports), and the history. A queuedimport
sendsprogressevents "waiting behind ..." and its answer reportsqueue(waitedMs,
positionAtEntry,behind). Cancelling a queued import removes it without touching the
running one; cancelling the running one starts the next. A numericwaitnow limits the queue
wait; without one a queued import waits until it runs or is cancelled. -
Per-request
clientandharnesslabels. Any request may carry them; they replace the
connection's name for that request inbusy/conflictholders (holderandholderInfo),status(requests, scheduler
lanes, owner of a writable program,youAre), the import queue and the log, and they scope
cancel(allreaches only that label's requests;targetrefuses another label's request).
Ownership is unchanged (still per connection). One MCP server serving several agents can now
tell which agent holds a program or an import.ghidra_session.py: labels on anycall, and
labelled(client=, harness=)views withcancel_all(). -
daemon_tests.py:...
Hydra Engine 12.3-hydra.1
Released 2026-10-26. The first release. Based on upstream Ghidra master (12.3 DEV) as of
2026-10-26, commit 057a646233edfb21768a42a0aabc1d1a7709da19.
Downloads
One zip, hydra-engine-12.3-hydra.1-win_x86_64.zip: the headless install for Windows x64
(gradle zipHeadless), on which the release workflow ran both test suites after unzipping it.
You need a JDK 25 and Python 3.10 or later; the install has no JDK.
Known limits
- Projects saved by this build cannot be opened by Ghidra 12.2 or 12.1.4. Upstream
master
writes data type databases at version 3; 12.2 and 12.1.4 read version 2. A project opened
read-only is not written; open older projects writable only from a copy. The
legacy-12.1.4branch serves projects that must stay on 12.1.4. - Based on a development snapshot. Upstream
masteris Ghidra's next version under work
(12.3 DEV), not a Ghidra release. - Windows only. CI and releases build and test on Windows. The module and launcher have no
Windows-only path, and a one-off dry run of the release workflow on 2026-10-26 built Linux x64
and macOS arm64 installs that passed both test suites, but neither is released or tested
routinely; build from source there (gradle buildHeadless). - Headless only. No window, help, javadoc or Python type stubs; the full Ghidra build is
stillgradle buildGhidra, from source.
Added
- HeadlessSession module (
Ghidra/Features/HeadlessSession): a shared, per-user headless
session daemon. One JVM serves many projects and many clients over JSON lines on an
authenticated loopback socket (or stdio), with protocol version 2.- Projects opened in place: read-only without a lock, or writable with one.
- Programs opened and switched without importing; imports with any Ghidra loader,
deduplicated by SHA-256. - Analysis, decompiling, renames, comments, saves, and GhidraScripts (Java or Python) with
arguments; scripts on programs a client does not own run contained and are rolled back. - Fair scheduling (quick and long lanes, round-robin by client), one writer and many readers
per program, per-client cancel, clean release when a client dies, idle shutdown, warm
programs kept open for the next client.
ghidra_session.py: a standard-library-only Python launcher, daemon manager and client
(connect()), with no.bator.shlauncher. Fast start with a class search cache and,
on JDK 25+, an AOT cache.- Tests:
examples/session_smoke.pyandexamples/daemon_tests.py. - Headless build (
gradle buildHeadless,gradle/hydra/headless.gradle): an install
without the window-only modules, the help, javadoc and Python stubs, and with a check that no
module of the install depends on one it leaves out. The full build is stillgradle buildGhidra. - Repository: this README (Ghidra's original is
README-GHIDRA.md),NOTICE-HYDRA, a
security policy and contributor guide in.github/, issue and pull request templates, and CI
(.github/workflows/ci.yml) that builds the headless install and runs both test suites. - Releases (
.github/workflows/release.yml): a tagv<version>builds the headless zip on
Windows, runs both test suites on the unzipped install, and publishes the zip,SHA256SUMS
and this file's section as a GitHub Release.
Branches
main: the above, on upstreammaster.legacy-12.1.4: the same module on Ghidra 12.1.4, kept for projects analysed with 12.1.4.
Download and testing
Built by the release workflow from 83b082ca9931f7d870a0a3372f775e96c8c8b2b7, then unzipped and tested there.
| File | Size | Built and tested on | Result |
|---|---|---|---|
hydra-engine-12.3-hydra.1-win_x86_64.zip |
361 MiB | windows-latest (Windows-2025Server, openjdk version "25.0.4.1" 2026-08-18 LTS) | built; session_smoke.py and daemon_tests.py passed on the unzipped install |
SHA-256 (also in SHA256SUMS):
4102c5dffbb7e26a90adfd20e025b4a0dd461ae147179082fb112562f3af6c47 hydra-engine-12.3-hydra.1-win_x86_64.zip