HexaEight.Activate
1.0.15
Prefix Reserved
dotnet tool install --global HexaEight.Activate --version 1.0.15
dotnet new tool-manifest
dotnet tool install --local HexaEight.Activate --version 1.0.15
#tool dotnet:?package=HexaEight.Activate&version=1.0.15
nuke :add-package HexaEight.Activate --version 1.0.15
HexaEight.Activate
One tool for HexaEight identities: install the agent and the router, activate a machine token, verify what is installed, lock an agent down, and control which builds it will accept messages from.
dotnet tool install --global HexaEight.Activate
Command name is hexaeight-activate. Requires .NET 8 or later.
Start to finish
dotnet tool install --global HexaEight.Activate
mkdir my-agent && cd my-agent
hexaeight-activate cpucores # how many cores must the licence cover?
hexaeight-activate newtoken # INTERACTIVE - activate the identity FIRST
hexaeight-activate install-agent # download + verify the binary for this platform
hexaeight-activate install-examples # a local model + examples - no API key needed
hexaeight-activate init-policy # deny everyone, admit one owner, gate on this build
./hexaeight-agent-linux-x64
The identity comes before the binary. An agent with no identity cannot start, so installing it first only produces something that will not run — and the folder you activate in is the folder the agent must live in.
install-examples is what makes the first run worth doing: it downloads a small model that runs on
CPU, points the agent at it, and writes runnable examples beside it. Nothing to sign up for. It is
for seeing the wiring work - production wants a real provider key.
The router is a separate product, installed the same way:
hexaeight-activate install-router
./hexaeight-router-linux-x64 --setup
newtoken cannot be automated: it prompts for a resource name, password and licence code, and
requires scanning a QR code in the HexaEight Authenticator app. Everything else here can run
unattended.
Commands
| command | what it does | exit codes |
|---|---|---|
install-agent |
Download the official agent for this platform and verify it before it can run | 0 ok / 1 failed / 2 no build for this platform |
install-router |
Download the official LLM router and verify it | 0 ok / 1 failed / 2 no build for this platform |
install-examples |
Local model plus runnable examples. No API key needed | 0 ok / 1 failed |
init-policy |
Lock the agent down: deny everyone, admit one owner, gate on the installed build | 0 ok / 1 failed |
add-policy |
Admit one more identity later | 0 ok / 1 failed |
newtoken |
Activate a new identity (default when no command given). Interactive. | 0 ok / 1 failed |
renewtoken |
Apply a new licence code to an existing identity. Interactive. | 0 ok / 1 failed |
verify-env |
Verify the licence, refresh the approved-build list, then check libraries | 0 all good / 1 a problem |
verify-libs |
Check the agent's libraries against nuget.org. No licence call, cheap to schedule | 0 match / 1 mismatch / 2 nothing found |
approve-builds |
Show or change which agent builds this identity accepts | 0 ok / 1 failed |
cpucores |
Print CPU/core count - a licence must cover at least this many | 0 ok / 1 failed |
help |
Usage | 0 |
Every command runs in the current working directory, which must be the folder holding env-file
and hexaeight.mac. Running elsewhere fails with "no identity in this folder" - the single most
common mistake.
Installing
hexaeight-activate install-agent # into the current folder
hexaeight-activate install-agent --dir /opt/hbia
hexaeight-activate install-agent --force # replace a different file at that path
The expected hash ships inside this package, not alongside the download. A checksum published next to the file it describes proves only that the two were produced together - whoever can replace one can replace the other. Because the value arrives through nuget.org, the release server only has to serve bytes; a substituted file fails the comparison and is deleted before it can run.
Behaviour worth relying on:
- A failed hash check deletes the download and exits 1. Nothing unverified is left on disk.
- Re-running on a good install prints "Already installed and verified" and exits 0 without re-downloading. Safe in a provisioning script.
- A different file already at the target path is refused rather than overwritten (
--forceoverrides). - Downloads to
<name>.partialfirst, so an interrupted run never leaves a half file in place.
Published builds: win-x64, linux-x64, osx-arm64. Intel macOS and arm64 Linux are not
published - those exit 2 and tell you to email support@hexaeight.com, who will build one.
No near-match is installed: the attestation hash is per architecture, so no other build can stand in,
including the arm64 build under Rosetta.
The router is fetched and verified the same way. It is not gated on an approved-build list yet - deliberate and deferred, so nobody mistakes its absence for a gate that is protecting them.
Locking an agent down
hexaeight-activate init-policy # asks who
hexaeight-activate init-policy --kind personal --owner you@co.com
hexaeight-activate init-policy --kind business --owner '*@co.com'
hexaeight-activate add-policy --owner colleague@co.com # widen it later
A fresh agent is reachable and accepts anyone who can authenticate, from any build. init-policy
closes both halves, which are different questions:
- Who is calling - identity. Everything is denied; the owner is the single exception. That
covers
/api/incomingand/external/incomingtoo. - What is calling - origin. The build installed here is approved, along with every officially published build, and the permissive wildcard is dropped.
Personal admits one email. Business takes an email or a whole domain as *@company.com.
Either way you can widen it afterwards with add-policy, and a running agent picks up both the
policy and the build list without a restart.
It writes owner into hexaeight-agent.json as well as the encrypted policy. Both are required:
with the policy alone the agent starts in developer mode and admits anyone, which looks locked and
is not.
Verifying an installation
./hexaeight-agent --probe ; echo $? # 0 = the platform trusts this build, 2 = it does not
hexaeight-activate verify-libs # every library matches what we published to nuget.org
Run --probe before verify-libs: a single-file agent only writes its assemblies to disk when
it first runs, and there is nothing to check until then.
verify-libs finding nothing is itself a finding. Official releases place their assemblies on
disk precisely so they can be checked; a build with nothing to check was not packaged the way we
publish, and should be treated as suspect rather than convenient.
verify-env does the licence check first, then everything verify-libs does, and refreshes the
approved-build list as a side effect - which is why it is the right thing to run on a schedule.
Approved builds
Every envelope carries a PROTECTION HASH: the hash of the executable that sent it, derived by the library rather than claimed by the caller. An identity can be told which builds it accepts, making "only official builds may call our service" enforceable rather than a policy document.
hexaeight-activate approve-builds --list # current rules, and the list this tool carries
hexaeight-activate approve-builds --tighten # ENFORCE: refuse anything not listed
hexaeight-activate approve-builds --allow-any # back to accepting any build
hexaeight-activate approve-builds --add-hash <128-hex> # approve a build you trust
hexaeight-activate approve-builds --add-file <path> # ...by hashing a file
Until --tighten runs, everything is accepted - a fresh identity is not gated.
Prefer --add-hash. Which file a build attests depends on how it was published:
| publish shape | attests |
|---|---|
| single-file, self-extracting (official releases) | the extracted entry dll, not the downloaded file |
| framework-dependent with apphost | the .exe |
launched as dotnet foo.dll |
neither - use --add-hash |
--add-file has to infer this, and a wrong guess writes a rule that silently never matches: the peer
is refused forever with nothing in the log to explain it. A value read from the peer's own
PROTECTIONHASH cannot be wrong.
The official hashes ship inside this package and are applied by verify-env, so keeping a machine
current means updating the tool - no hash is ever copied by hand. Older releases stay approved
deliberately: dropping a build would refuse every peer still running it.
Writing your own engine
You do not need to modify or rebuild the agent, and that is not the supported path. Write an engine and let the agent enclose it - the contract is one function:
invoke(sessionId, message) -> reply
The agent supplies identity, encrypted transport, sessions and policy. You supply the capability.
install-examples writes a complete working engine to examples/my_engine.py in about thirty lines.
If you genuinely need a custom agent rather than an engine, the only supported SDK is .NET and the libraries are published - contact support@hexaeight.com and we will show you how.
For automation
Safe to run unattended, in this order:
hexaeight-activate install-agent --dir "$DIR" || exit 1
cd "$DIR" && ./hexaeight-agent --probe || echo "unblessed build"
hexaeight-activate verify-libs || echo "library mismatch"
hexaeight-activate init-policy --kind personal --owner "$OWNER" --no-prompt
Not automatable: newtoken and renewtoken (QR approval in the Authenticator app).
Notes for scripted use:
- Never copy
hexaeight.macbetween machines. It is machine-bound and copying it breaks the identity. To share one licence between programs on the same machine, hardlink it. env-fileandhexaeight.macare credentials. Keep them out of version control and images.--probecaches its verdict for 60 seconds in.probe.state; delete that file when retrying.- Exit codes are meaningful - branch on them rather than parsing output.
Diagnosing
| symptom | cause |
|---|---|
no identity in this folder |
wrong working directory - cd to where env-file lives |
agent says authz: DEV allow-all |
no owner in hexaeight-agent.json - run init-policy |
--probe returns 2 but verify-libs says everything matches |
the platform does not recognise this build; usually older or newer than the registered set |
| approving a build changes nothing | wrong hash - --add-file guessed the wrong file for that publish shape. Use --add-hash |
a peer is refused after --tighten |
its build is not listed. verify-env to refresh, or --add-hash to admit it |
Links
- Agent releases: https://github.com/HexaEightTeam/hbia-agent/releases
- Router releases: https://github.com/HexaEightTeam/hbia-router/releases
- HexaEight.Bridge: https://www.nuget.org/packages/HexaEight.Bridge
- Docs: https://hexaeight.com/docs
Apache-2.0. The cryptographic libraries it links against are governed by the HexaEight identity licence.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.15 | 0 | 8/14/2026 |
| 1.0.14 | 0 | 8/13/2026 |
| 1.0.13 | 0 | 8/13/2026 |
| 1.0.12 | 100 | 8/5/2026 |
| 1.0.11 | 108 | 8/5/2026 |
| 1.0.10 | 102 | 8/5/2026 |
| 1.0.9 | 96 | 8/5/2026 |
| 1.0.8 | 97 | 8/5/2026 |
| 1.0.7 | 114 | 7/17/2026 |
| 1.0.6 | 115 | 7/14/2026 |
| 1.0.5 | 109 | 7/13/2026 |
| 1.0.4 | 108 | 7/12/2026 |
| 1.0.3 | 120 | 6/27/2026 |
| 1.0.2 | 116 | 6/12/2026 |
| 1.0.1 | 109 | 6/12/2026 |
| 1.0.0 | 116 | 6/12/2026 |
| 1.0.0-preview3 | 106 | 6/12/2026 |