- JavaScript 95.1%
- PowerShell 4.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Hermodr is the Eve browser lowering. It was an organ of Odin: Node inside a Rust repository, sharing a common module directory with Odin's coordinator, and until recently running its own provider-session ingress and accepting publications into a private store. The ingress was removed first, deliberately. An extraction that carried it would have moved a second acceptance authority into a repository of its own and called that progress. What moved here is a bridge: it resolves providers through Odin's catalog, reads those providers directly, and relays operator intent to provider-advertised command routes. Contents: the daemon, the provider subscription source and its lifecycle tests, the state stream registry, the browser catalog tests, the four lifecycle scripts, and the persona avatar. Three dependencies on Odin were resolved rather than carried. The swarm document catalog now comes from CultLib's cultcache-ts alongside defineDocumentType. Idunn's health contract is declared locally in idunn-health.cjs, over the generic transport that also moved to CultLib, with sourceRuntimeId "hermodr" rather than Odin's. parseArgs is seventeen lines in args.cjs, because Hermodr used one of that utility module's six functions and carrying the other five would have been carrying a library nobody here reads. MIT, matching CultLib, Odin, Idunn, Eve and Erycina, so the deployment chain is one a creator may lawfully run end to end. Verified: 17 tests pass, every module loads with CultLib resolving from the new location, and no import references Odin. Not verified: behaviour against a live provider over RUDP, which needs a running Verse. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
| assets | ||
| scripts | ||
| src | ||
| test | ||
| .gitignore | ||
| LICENSE | ||
| package.json | ||
| README.md | ||
Hermodr
Hermodr is the Eve browser lowering. It resolves providers through Odin's catalog, reads those providers for their state, renders their surfaces to browsers, and relays operator intent back as typed CultMesh command documents.
It owns the browser edge. It does not own truth.
Authority
- Providers own their state and serve it. Hermodr reads; it never accepts.
- Odin owns discovery: what exists, what schema speaks it, where to reach it. Odin is not in the data path, and nothing here reads state from Odin.
- Hermodr owns session, transport, lowering, and the relay of intent. Everything it holds about provider state is a projection carrying a sequence number. Its staleness marks are display facts, not withdrawal decisions.
A lowering runtime cannot make something true by rendering it.
The round trip
Intent leaves by POST /hermodr/commands/eve, which resolves a cultmesh://
target from the request or the provider catalog, wraps the body as
gamecult.eve.command.v1, stamps publishedBy: "hermodr-browser-lowering", and
publishes to the provider's own advertised route. The provider decides whether
to act. Eve's client refuses any response that is not a correlated
gamecult.eve.command_receipt.v1 in state reconciled.
Consequence returns as newly published provider state, by the same subscription as every other change. That is the whole point of the split: intent and consequence travel the same road in opposite directions, and neither passes through a store Hermodr owns.
Running it
npm start -- --host 127.0.0.1 --port 8798
Needs a reachable Odin catalog and CULTLIB_ROOT pointing at a CultLib
checkout. Provider read cadence is --provider-poll-interval-ms, default 2000.
npm test # unit tests, no live Verse required
npm run check
Known shape
Provider state is read by polling, wrapped in lifecycle semantics that emit
snapshot, update, and withdrawn events with sequence numbers. Polling is a first
cut: CultMesh ships cultMeshPollingDocumentWatcher for exactly this shape, and
a push subscription belongs here eventually. It does not change the authority,
which is why the swap was made before the move.
One invariant is easy to get wrong and quiet when you do: a failed read is not a withdrawal. A provider restart or a dropped packet must not render as the provider retracting state it still holds. Read errors are reported and the previous value stands; only genuine absence withdraws. Both paths are tested.
History
Hermodr was an organ of Odin, and until recently it ran its own provider-session ingress and accepted publications into a private store. A surface reached a browser only if its provider bound to Hermodr specifically, so a provider had to publish twice: once where the Verse expected it, and once into Hermodr so an operator could watch their own command land.
That ingress is gone. The extraction happened after it was removed, so what moved here was a bridge rather than a second acceptance authority wearing one's name.
GameCult/Odin holds the coordinator and the Rust organs. GameCult/CultLib
holds the swarm document catalog and the CultNet transports this depends on.