Code Pluginsource linked

JACS Signing + HAI.AI Email & Trustv0.9.28

JACS cryptographic provenance plugin for OpenClaw - signing, verification, commitments, todos, agent state, conversations, and email templates

moltyjacs·runtime moltyjacs·by @hendler
Community code plugin. Review compatibility and verification before install.
openclaw plugins install clawhub:moltyjacs
Latest release: v0.9.28Download zip

Capabilities

configSchema
Yes
Executes code
Yes
HTTP routes
0
Runtime ID
moltyjacs

Compatibility

Built With Open Claw Version
2026.3.2
Plugin Api Range
>=2026.3.2
Plugin Sdk Version
2026.3.2
Security Scan
VirusTotalVirusTotal
Pending
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
The name/description (JACS signing, verification, discovery, HAI.ai integration) matches the code and SKILL.md: the plugin reads/writes a JACS config and key files under the user's OpenClaw home (~/.openclaw/jacs / jacs_keys), exposes signing/verification/A2A functions, and calls @hai.ai/jacs and @haiai/haiai. The required behaviors (key generation, registration with HAI, publishing public key, DNS/HAI lookups) are coherent with the stated purpose.
Instruction Scope
Runtime instructions and CLI handlers focus on initializing JACS, signing, verifying, generating DNS records, HAI registration, and A2A artifacts. The code reads local config and key files and uses HAI.ai client libraries for network operations — all within the expected scope. I did not find instructions that ask to read unrelated system files or to transmit private keys to unexpected endpoints; public keys and signed documents are published/fetched as expected for trust bootstrapping.
Install Mechanism
The registry record lists no install spec but the package includes full source/dist and a package.json; the SKILL.md documents installing via npm / openclaw plugins / ClawHub — a normal npm-based install. This is not inherently risky, but because the bundle contains compiled JS plus native-binding references (@hai.ai/jacs may include native bits), users should install from a trusted source (npm or the upstream repo) and review package.json scripts before running installs.
Credentials
The skill does not request unrelated cloud credentials; its operations are limited to a password for encrypting the private key (JACS_PRIVATE_KEY_PASSWORD or JACS_PASSWORD_FILE) and an optional HAI registration key supplied by the user during init. However, registry metadata lists 'required env vars: none' while the SKILL.md explicitly documents password env vars — a minor metadata/documentation mismatch to be aware of. No other unrelated SECRET/TOKEN environment variables are requested.
Persistence & Privilege
The skill does not request 'always: true' and does not try to alter other skills' configs. It reads/writes its own config and key files under the user's OpenClaw home directory, which is expected for a cryptographic identity plugin. The default ability for the agent to invoke tools autonomously is unchanged; this is normal for plugins.
Assessment
This plugin is internally consistent with its stated purpose: it manages local keys/config in ~/.openclaw/jacs, signs/verifies artifacts, and interacts with HAI.ai for registration and discovery. Before installing: 1) Confirm you trust the upstream source (npm or the GitHub repo) and inspect package.json scripts for any postinstall actions. 2) Keep your JACS_PRIVATE_KEY_PASSWORD or JACS_PASSWORD_FILE secret — these protect your private key; prefer a secrets mount or OS keychain when possible. 3) Registration with HAI.ai requires a registration key you obtain from your HAI dashboard — if you don't want network registration, use local-only init (the docs note --register=false). 4) The registry metadata doesn't list the documented password env var — expect to set that yourself during init. 5) If you need a tighter security posture, initialize locally without HAI registration and review the code paths that call @haiai/haiai to understand what data (public keys, agent documents) are sent to the HAI network.
dist/tools/index.js:2447
Environment variable access combined with network send.
src/tools/index.ts:2982
Environment variable access combined with network send.
!
dist/cli.js:84
File read combined with network send (possible exfiltration).
!
dist/tools/index.js:172
File read combined with network send (possible exfiltration).
!
src/cli.ts:81
File read combined with network send (possible exfiltration).
!
src/tools/index.ts:418
File read combined with network send (possible exfiltration).
Patterns worth reviewing
These patterns may indicate risky behavior. Check the VirusTotal and OpenClaw results above for context-aware analysis before installing.

Verification

Tier
source linked
Scope
artifact only
Summary
Validated package structure and linked the release to source metadata.
Commit
6634d77dc591
Tag
v0.9.28
Provenance
No
Scan status
pending

Tags

latest
0.9.28

moltyjacs

Sign it. Prove it. JACS cryptographic provenance plugin for OpenClaw.

Which integration should I use? | Full JACS documentation

Why use JACS?

So your OpenClaw agent can be trusted -- and can trust others. JACS is like DKIM for agents: you sign what you send; recipients verify the signature against your public key. It is decentralized -- no single authority. You publish your key (DNS, optional HAI.ai); others fetch and verify. Without it, nothing you say or do can be proven. With JACS you sign messages, commitments, and state; anyone with your public key can verify they came from you and were not altered. You get proof of origin, integrity, and accountability. Other agents can discover your key via DNS or HAI.ai and verify your documents; you verify theirs with jacs_verify_auto and optional trust levels (domain, attested). Keys and signed payloads stay local; you send the same signed JSON over any channel (WhatsApp, HTTP, MCP). Use it whenever another agent or human needs to trust that you said or agreed to something.

Overview

moltyjacs adds post-quantum cryptographic signatures to your OpenClaw agent communications. It enables:

  • Document signing - Sign any document with your agent's cryptographic identity
  • Verification - Verify documents from other agents
  • Agent discovery - Publish and discover agents via well-known endpoints and DNS
  • A2A interoperability - Export Agent Cards, wrap A2A artifacts with JACS provenance, and assess remote A2A trust
  • Multi-party agreements - Create and manage agreements requiring multiple signatures
  • Agent state - Sign and track memory, skills, plans, configs, and hooks
  • Commitments - Track agreements and obligations between agents with lifecycle management
  • Todo lists - Private, signed work tracking with goals and tasks
  • Conversations - Signed message threads between agents
  • HAI platform features - Hello/auth checks, username lifecycle, mailbox/email workflow, key registry lookups, and benchmark orchestration

Installation

From npm

npm install moltyjacs

From ClawHub

npx clawhub@latest install moltyjacs

As OpenClaw Plugin

openclaw plugins install moltyjacs

From GitHub

openclaw plugins install https://github.com/HumanAssisted/moltyjacs

Quick Start

1. Set a password for key generation

You need a password once — during jacs init — to encrypt your new private key. Pick whichever method fits your setup:

# Local dev / headless — set an env var
export JACS_PRIVATE_KEY_PASSWORD='use-a-strong-password'

# Containers / CI — point to a secrets-mounted file
export JACS_PASSWORD_FILE=/run/secrets/jacs_password

After init, the password is only needed to decrypt your private key for signing. On macOS the OS Keychain stores it automatically, so you can skip the env var for day-to-day use. On Linux/CI, keep one of the env vars above set.

2. Reserve a username and initialize

Reserve your username at https://hai.ai/dashboard and copy the registration key.

openclaw jacs init --name myagent --key YOUR_REGISTRATION_KEY

This generates a key pair, creates jacs.config.json, registers with HAI, and assigns myagent@hai.ai. Your agent now has a cryptographic identity and is registered.

For local-only init (no registration): openclaw jacs init --name myagent --register=false

3. Sign and verify

openclaw jacs sign document.json
openclaw jacs verify signed-document.json

4. Bootstrap trust with another agent

When your agent needs to trust (or be trusted by) another agent:

  1. Sender shares credentials via tools: jacs_share_public_key + jacs_share_agent
  2. Receiver imports them: jacs_trust_agent_with_key with the shared agentJson and publicKeyPem

Once trust is established, use jacs_verify_auto to verify any document from that agent (keys are fetched automatically).

Direct JACS SDK Quick Start (outside this plugin)

For direct @hai.ai/jacs/client or @hai.ai/jacs/simple usage:

import { JacsClient } from "@hai.ai/jacs/client";

const client = await JacsClient.quickstart({
  name: "my-agent",
  domain: "agent.example.com",
  algorithm: "pq2025", // optional, this is the default
});

JACS Workspace Compatibility

For coordinated local development, moltyjacs now resolves @hai.ai/jacs from the sibling ../JACS/jacsnpm workspace so its A2A surface matches the current haiai wrapper contract. The JACS Node API remains async-first. All NAPI operations return Promises by default; sync variants use a Sync suffix (e.g. loadSync vs load). moltyjacs uses the async API for setup (agent.load(), createAgent()) and the sync API for hot-path operations (signRequest, verifyResponse) that must run on the V8 thread.

Recent JACS updates relevant to moltyjacs:

  • Direct quickstart() usage in @hai.ai/jacs/client and @hai.ai/jacs/simple now requires identity inputs (name and domain) for first-time agent creation.
  • Default algorithm across JACS is pq2025.
  • Trust/bootstrap surfaces now include trustAgentWithKey / trust_agent_with_key, sharePublicKey / share_public_key, and shareAgent / share_agent.
  • A2A surfaces now include Agent Card export, wrapped-artifact signing/verification, and generated well-known discovery documents.

CLI Commands

CommandDescription
openclaw jacs init --name <name> [--key <key>]Initialize JACS with key generation and optional HAI registration
openclaw jacs statusShow agent status and configuration
openclaw jacs sign <file>Sign a document file
openclaw jacs verify <file>Verify a signed document
openclaw jacs hash <string>Hash a string
openclaw jacs dns-record <domain>Generate DNS TXT record for discovery
openclaw jacs lookup <domain>Look up another agent's info
openclaw jacs attestation [domain]Check attestation status for this agent or another by domain
openclaw jacs claim [level]Set or view verification claim (includes DNS/HAI proof details)

HAI.ai registration

To get an attested trust level, register your agent with HAI.ai during init: run openclaw jacs init --name <name> --key <key> with a registration key from your HAI dashboard. Registration uses JACS-signed authentication (no API key needed). Alternatively, use the jacs_hai_register tool with a registrationKey after init. After registration, use openclaw jacs attestation to check your (or another agent's) attestation status, and openclaw jacs claim <level> to set or view your verification claim. verified now requires DNS TXT hash verification (domain configured + published hash matches your public key). See Configuration and Security for related options.

Agent Tools

When used with an AI agent, these tools are available:

Core signing and verification

ToolPurpose
jacs_signSign a document (returns signed doc; when small enough, includes verification_url for sharing)
jacs_verify_linkGet a shareable verification URL for a signed document (for https://hai.ai/jacs/verify)
jacs_verifyVerify a self-signed document
jacs_verify_standaloneVerify any signed document without JACS init (no agent required)
jacs_verify_autoVerify any document (auto-fetches keys, supports trust levels)
jacs_verify_dnsVerify agent identity via DNS TXT record
jacs_fetch_pubkeyFetch another agent's public key
jacs_verify_with_keyVerify with a specific public key
jacs_hashHash content
jacs_identityGet your identity info
jacs_share_public_keyShare your current public key PEM for trust bootstrap
jacs_share_agentShare your self-signed agent document for trust establishment
jacs_trust_agent_with_keyTrust an agent document using an explicit public key PEM
jacs_auditRun read-only JACS security audit

A2A interoperability

ToolPurpose
jacs_a2a_export_agent_cardExport this agent as an A2A Agent Card
jacs_a2a_sign_artifactWrap an A2A task/message/result with JACS provenance
jacs_a2a_verify_artifactVerify a wrapped A2A artifact
jacs_a2a_assess_remote_agentApply A2A trust policy to a remote Agent Card
jacs_a2a_trust_agentAdd a remote Agent Card to the local trust store
jacs_a2a_generate_well_knownGenerate A2A discovery documents for /.well-known serving

Discovery and trust

ToolPurpose
jacs_dns_lookupLook up DNS TXT record
jacs_lookup_agentGet complete agent info (well-known + DNS + HAI.ai)
jacs_verify_hai_registrationVerify HAI.ai registration for an agent
jacs_get_attestationGet full attestation status for an agent
jacs_set_verification_claimSet verification claim level

HAI platform integration

ToolPurpose
jacs_hai_helloCall HAI hello endpoint with JACS auth
jacs_hai_test_connectionTest HAI connectivity without mutating state
jacs_hai_registerRegister this agent with HAI (accepts optional registrationKey)
jacs_hai_update_usernameRename claimed username
jacs_hai_delete_usernameRelease claimed username
jacs_hai_verify_documentVerify signed document via HAI public verifier
jacs_hai_get_verificationGet advanced verification/badge by agent ID
jacs_hai_verify_agent_documentRun advanced verification using an agent document
jacs_hai_fetch_remote_keyFetch remote key from HAI key registry
jacs_hai_verify_agentMulti-level agent verification (signature + DNS + HAI)
jacs_hai_send_emailSend email from this agent mailbox
jacs_hai_list_messagesList mailbox messages
jacs_hai_get_messageRetrieve one mailbox message by ID
jacs_hai_mark_message_readMark message as read
jacs_hai_mark_message_unreadMark message as unread
jacs_hai_delete_messageDelete mailbox message
jacs_hai_search_messagesSearch mailbox with filters
jacs_hai_get_unread_countGet unread mailbox count
jacs_hai_replyReply to a message ID
jacs_hai_get_email_statusGet mailbox status/limits
jacs_hai_free_chaotic_runRun free benchmark tier
jacs_hai_dns_certified_runRun DNS-certified benchmark flow (returns checkout URL when pending)
jacs_hai_submit_responseSubmit benchmark job response
jacs_hai_benchmark_runRun legacy benchmark endpoint by name/tier

Agreements

ToolPurpose
jacs_create_agreementCreate multi-party agreement
jacs_sign_agreementSign an agreement
jacs_check_agreementCheck agreement status

Agent state

ToolPurpose
jacs_create_agentstateCreate signed agent state (memory, skill, plan, config, hook)
jacs_sign_file_as_stateSign a file as agent state with path reference and hash
jacs_verify_agentstateVerify an agent state document

Commitments

ToolPurpose
jacs_create_commitmentCreate a signed commitment
jacs_update_commitmentUpdate commitment status or fields
jacs_dispute_commitmentDispute a commitment with a reason
jacs_revoke_commitmentRevoke a commitment with a reason

Todo lists

ToolPurpose
jacs_create_todoCreate a signed todo list
jacs_add_todo_itemAdd an item to a todo list
jacs_update_todo_itemUpdate a todo item

Conversations

ToolPurpose
jacs_start_conversationCreate the first signed message payload in a new thread
jacs_send_messageCreate a signed message payload in an existing thread

MCP and Message Transport

jacs_start_conversation and jacs_send_message create signed JACS message payloads. They do not perform delivery/transport by themselves.

Use this pattern for agent-to-agent messaging:

  1. Create/sign payload (jacs_start_conversation or jacs_send_message)
  2. Deliver the returned signed JSON over your chosen channel (MCP, HTTP, queue, chat bridge, etc.)
  3. Verify on receipt (jacs_verify_auto, jacs_verify_standalone, or jacs_verify_with_key)

For custom Node MCP servers, JACS supports transport-level integration via @hai.ai/jacs/mcp:

  • createJACSTransportProxy(...) for automatic signing/verification at transport boundaries
  • registerJacsTools(...) to expose JACS operations as MCP tools
  • Expanded trust/bootstrap MCP/LangChain tools include jacs_share_public_key, jacs_share_agent, and jacs_trust_agent_with_key

This OpenClaw plugin does not automatically intercept all host MCP traffic; use explicit JACS tools or host transport middleware/adapters.

Well-Known Endpoints

Your agent exposes these endpoints:

  • GET /.well-known/agent-card.json - A2A Agent Card for discovery
  • GET /.well-known/jwks.json - A2A/JACS JWKS for verifier interoperability
  • GET /.well-known/jacs-agent.json - JACS agent descriptor
  • GET /.well-known/jacs-extension.json - JACS A2A extension descriptor
  • GET /.well-known/jacs-pubkey.json - Your public key
  • GET /jacs/agent - Current self-signed JACS agent document
  • GET /jacs/status - Health check
  • POST /jacs/verify - Public verification (this agent)
  • GET /jacs/attestation - Full attestation status (trust level, HAI registration, DNS verification)

Recipients can verify any JACS document at https://hai.ai/jacs/verify (paste a link with ?s= or the base64). Use jacs_verify_link or the verification_url from jacs_sign when sharing signed content with humans.

Signing is internal only; no external sign endpoint is exposed (to protect the agent's identity).

Configuration

Configure via openclaw.plugin.json:

{
  "keyAlgorithm": "pq2025",
  "agentName": "My Agent",
  "agentDescription": "Description",
  "agentDomain": "agent.example.com"
}

autoSign and autoVerify are accepted for backward compatibility but are deprecated no-ops in moltyjacs.

agentId is set automatically when you run openclaw jacs init and is not edited in the config file.

JACS key filenames are read from jacs.config.json:

  • jacs_agent_public_key_filename (default: jacs.public.pem)
  • jacs_agent_private_key_filename (default: jacs.private.pem.enc)

Environment variables

VariablePurpose
JACS_PRIVATE_KEY_PASSWORDPassword for the encrypted private key. Required for init; optional at runtime on macOS (OS Keychain).
JACS_PASSWORD_FILEPath to a file containing the password (trailing newline is stripped).

Set one of these for init and for Linux/CI signing. On macOS the OS Keychain is used automatically at runtime when neither is set. If both are set, initialization fails to avoid ambiguity.

Password files must be owner-only on Unix (chmod 600).

Key Algorithms

  • pq2025 (default) - Post-quantum ML-DSA-87
  • ring-Ed25519 - Ed25519
  • RSA-PSS - RSA with PSS padding

Cross-Language Compatibility

Documents signed by moltyjacs (Node.js) can be verified by Rust or Python agents, and vice versa. Cross-language interop is tested on every commit with Ed25519 and post-quantum (ML-DSA-87) algorithms. See the JACS cross-language tests for details.

Security

  • Private keys are encrypted with AES-256-GCM
  • Key derivation uses PBKDF2
  • Default algorithm (pq2025) provides quantum resistance
  • DNS records enable DNSSEC-backed identity verification

Development

# Install dependencies
npm install

# Build
npm run build

# Watch mode
npm run watch

# Run unit tests (uses mocked JACS module)
npm test

# Run integration tests (requires real @hai.ai/jacs native binary)
npm run test:integration

# Test local installation
openclaw plugins install . --link
openclaw plugins list

Publishing

CI publishes on push of a tag v* (e.g. v0.8.0). Publish @hai.ai/jacs from the JACS repo first (tag npm/v*), then tag and push moltyjacs so the build can resolve the dependency.

To npm

npm run build
npm publish

To ClawHub

npm run clawhub:publish

Or publish to both npm and ClawHub:

npm run publish:all

License

MIT License - see LICENSE

Links