Every module's event names were converted from the old bus's routing keys to local names, and this client maps them back. If that mapping is wrong anywhere a live mesh's events stop being delivered — silently, because a binding that matches nothing is not an error. So the mapping is pinned against the literal routing keys the mesh published before, taken from the manifests as they were: what each module now emits, what each now binds, and that a handler still matches what the bus delivers. Including the audit logger's "everything", which must stay `#` on this bus. And a key already in the old form is left alone, so a module built from an older manifest keeps working beside one built from a current manifest — which is the state the mesh will actually be in between deployments.
mesh-tools
The Novox Mesh tool runtime — the per-node process that makes a module's tools actually serve.
A module ships its tools (built on @novox/mesh-sdk); this
runtime is what loads them and puts them on the mesh. It:
- connects the mesh broker (novox/hq ADR 0001) — a concrete AMQP implementation of the sdk's
Brokercontract; - imports the assigned modules' compiled tool entrypoints, each of which registers its tools as it loads;
- serves them through the sdk's
serveToolsharness, answeringtools.invokeover the broker.
Everything hard — dispatch, collection, duplicate-name safety — is the sdk's. This is the thin wrapper that binds the broker and loads the modules. Keeping the AMQP client here, out of the sdk, is deliberate: a broker-client change never rebuilds a module (ADR 0039).
Running it
MESH_BROKER_URL amqp://… the mesh broker
MESH_TOOL_MODULES /a/tools/index.js,… the assigned modules' compiled tool entrypoints
node dist/main.js, or the container (Dockerfile). On a node the host resolves both variables
and starts it like any other supervised workload.
Verified
npm test stands up LavinMQ (the mesh's broker) and proves the whole path over real AMQP: the
runtime serves a registered tool, a separate connection invokes it by name and gets the result, and
an unknown tool is refused over the wire.