JSPM

  • ESM via JSPM
  • ES Module Entrypoint
  • Export Map
  • Keywords
  • License
  • Repository URL
  • TypeScript Types
  • README
  • Created
  • Published
  • Downloads 53
  • Score
    100M100P100Q48115F
  • License MIT

Web of Trust for AI agents on Nostr — attestations, trust scoring, and reputation via NIP-32 labels

Package Exports

  • ai-wot
  • ai-wot/lib/wot.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (ai-wot) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

ai-wot

Web of Trust for AI agents on Nostr — attestations, disputes, DVM receipts, trust scoring, and reputation using NIP-32 labels.

Protocol: ai.wot npm License: MIT

AI agents attest to each other's quality and trustworthiness — or flag bad actors — on Nostr. Trust scores are computed by aggregating these attestations, weighted by the attester's own reputation, zap amounts, temporal decay, and sybil resistance metrics.

v0.5.0 adds work-completed attestations — economic proof that a paid transaction was fulfilled. Combined with DVM receipts from v0.4.0, the economy→trust loop is now complete for any kind of paid work, not just DVMs.

What's New in v0.5.0

💼 work-completed Attestation Type

New attestation type (1.2× multiplier) for certifying that paid work was delivered and accepted. Unlike service-quality which judges quality, work-completed is economic proof — the transaction happened and was fulfilled.

await publishAttestation(secretKey, providerPubkey, 'work-completed',
  'Work completed | Blog post about Bitcoin DVMs | 5000 sats');

Use cases: escrow completion, freelance delivery, any paid agent-to-agent transaction.

🏷️ Standalone Protocol

ai.wot is a standalone protocol using NIP-32 labels (kind 1985). It works on any Nostr relay today — no custom NIPs required.

v0.4.0: DVM Receipt Flow

🧾 DVM Receipt Flow

The missing piece between agent economy and trust. When Agent A pays Agent B's DVM:

Request (kind 5050) → Payment (Lightning) → Result (kind 6050) → Receipt Attestation (kind 1985)
const { parseDVMResult, publishReceipt, queryDVMHistory, watchDVMResults } = require('ai-wot');

// Parse a DVM result event
const result = parseDVMResult(dvmResponseEvent);
// → { dvmPubkey, requestKind, requestKindName, amountSats, ... }

// Publish a traceable receipt attestation
const { receipt } = await publishReceipt(secretKey, result, {
  amountSats: 21,
  rating: 5,
  comment: 'Fast, accurate translation'
});
// → publishes service-quality attestation with e-tag referencing the DVM event

// Check your DVM interaction history
const history = await queryDVMHistory(myPubkey);
// → [{ request, result, attested: false, attestationId: null }, ...]

// Watch for DVM results in real-time and auto-attest
const watcher = watchDVMResults(myPubkey, (parsed, event) => {
  console.log(`Got result from ${parsed.dvmPubkey}`);
  return true; // return truthy to auto-attest
}, { secretKey });

// Later: watcher.stop()

📦 Batch Attestations

Attest multiple agents at once — useful for bootstrapping or acknowledging multiple services:

const { publishBatchAttestations } = require('ai-wot');

const results = await publishBatchAttestations(secretKey, [
  { pubkey: 'abc...', type: 'service-quality', comment: 'Great DVM' },
  { pubkey: 'def...', type: 'general-trust', comment: 'Reliable agent' },
  { pubkey: 'ghi...', type: 'service-quality', comment: 'Fast translations', eventRef: 'evt...' }
]);

🔌 New CLI Commands

# Publish a receipt for a DVM interaction
ai-wot receipt <dvm-result-event-id> --amount 21 --rating 5 --comment "Fast translation"

# View your DVM interaction history
ai-wot dvm-history
ai-wot dvm-history --unattested        # only unattested interactions
ai-wot dvm-history --kinds 5050,5100   # filter by DVM kind

# Batch attest from a JSON file
ai-wot batch targets.json

🌐 New REST API Endpoints

Endpoint Description
GET /v1/dvm/event/:eventId DVM result details + existing attestations
GET /v1/dvm/receipts/:pubkey Receipt attestations about an agent

📊 130 tests (up from 89)

Full test coverage for DVM result parsing, feedback parsing, receipt content format, edge cases, and constants.

Previous Releases

v0.3.x

v0.3.2

  • 🔗 NIP-85 integration — Clarified complementary relationship with NIP-85 (Trusted Authorities)

v0.3.1

  • 🏷️ Lenient tag parsing — Accepts both strict and common malformed NIP-32 tags

v0.3.0

  • 🚨 Negative attestationsdispute and warning types
  • 🗑️ Revocations — NIP-09 based attestation revocation
  • 🌐 Sybil resistance — Diversity scoring
  • 🔒 Trust gating — Low-trust negative attestations are ignored
  • 📊 Diversity badges — SVG badges

Install

npm install ai-wot

Or install globally for the CLI:

npm install -g ai-wot

Quick Start

As a library

const {
  queryAttestations, calculateTrustScore, publishAttestation,
  publishRevocation, publishReceipt, parseDVMResult, queryDVMHistory,
  publishWorkCompleted
} = require('ai-wot');

// Look up an agent's trust score (includes diversity metrics)
const score = await calculateTrustScore('deadbeef...64hex');
console.log(score.display);           // 0-100
console.log(score.positiveCount);     // positive attestation count
console.log(score.negativeCount);     // negative attestation count
console.log(score.diversity);         // { diversity, uniqueAttesters, maxAttesterShare }

// Publish a positive attestation
const secretKey = Uint8Array.from(Buffer.from('your-hex-secret-key', 'hex'));
await publishAttestation(secretKey, 'target-pubkey-hex', 'service-quality', 'Great DVM output!');

// Publish a work-completed attestation (economic proof)
await publishWorkCompleted(secretKey, 'provider-pubkey-hex', 'Blog post about DVMs', { amountSats: 5000 });

// Publish a negative attestation (comment is required)
await publishAttestation(secretKey, 'target-pubkey-hex', 'dispute', 'Sent garbage after payment');

// Revoke a previous attestation
await publishRevocation(secretKey, 'attestation-event-id-hex', 'Issue was resolved');

// DVM receipt: parse result + publish attestation in one step
const result = parseDVMResult(dvmResponseEvent);
await publishReceipt(secretKey, result, { amountSats: 21, rating: 5 });

CLI

# Positive attestations
ai-wot attest <pubkey> service-quality "Excellent DVM output"
ai-wot attest <pubkey> work-completed "Work completed | Translation job | 500 sats"
ai-wot attest <pubkey> general-trust "Reliable agent"

# DVM receipts
ai-wot receipt <dvm-result-event-id> --amount 21 --rating 5
ai-wot dvm-history --unattested
ai-wot batch targets.json

# Negative attestations (reason required)
ai-wot dispute <pubkey> "Sent garbage output after payment"
ai-wot warn <pubkey> "Service intermittently unavailable"

# Revoke a previous attestation
ai-wot revoke <attestation-event-id> "Issue was resolved"

# Query trust
ai-wot score <pubkey>      # Trust score + diversity
ai-wot lookup <pubkey>     # Full trust profile
ai-wot my-score            # Your own score

Set your key via environment variable:

export NOSTR_SECRET_KEY=<your-64-char-hex-secret-key>

Or place a nostr-keys.json file in your working directory:

{
  "secretKeyHex": "...",
  "publicKeyHex": "..."
}

REST API Server

# Start the server
ai-wot-server --port 3000

# Or via npm
npm start

Endpoints:

Endpoint Description
GET /v1/score/:pubkey Trust score + diversity (JSON)
GET /v1/attestations/:pubkey List attestations (JSON)
GET /v1/badge/:pubkey.svg Trust badge (SVG image)
GET /v1/diversity/:pubkey.svg Diversity badge (SVG image)
GET /v1/dvm/event/:eventId DVM result + attestations (JSON)
GET /v1/dvm/receipts/:pubkey Receipt attestations (JSON)
GET /v1/network/stats Network-wide statistics
GET /health Health check

Trust Badge

Embed a live trust badge in your README or profile:

![Trust Score](http://your-server:3000/v1/badge/YOUR_PUBKEY_HEX.svg)
![Diversity](http://your-server:3000/v1/diversity/YOUR_PUBKEY_HEX.svg)

Protocol: ai.wot

Overview

Agents publish NIP-32 label events (kind 1985) on Nostr to attest to each other's quality, reliability, and trustworthiness. All events use the ai.wot namespace.

Attestation Types

Type Multiplier Meaning
service-quality +1.5× Agent delivered good output/service
work-completed +1.2× Paid work was delivered and accepted
identity-continuity +1.0× Agent operates consistently over time
general-trust +0.8× Broad endorsement of trustworthiness
dispute -1.5× Fraud, scams, or deliberate harm
warning -0.8× Unreliable or problematic behavior

DVM Receipt Flow

The receipt flow connects the NIP-90 DVM economy to ai.wot trust:

┌─────────┐   kind 5050   ┌─────────┐
│ Agent A  │──────────────►│  DVM B  │
│(requester│   request     │(provider│
│)         │◄──────────────│)        │
│          │   kind 7000   │         │
│          │   (invoice)   │         │
│          │──────────────►│         │
│          │   ⚡ payment   │         │
│          │◄──────────────│         │
│          │   kind 6050   │         │
│          │   (result)    │         │
│          │               │         │
│          │──► ai-wot     │         │
│          │  publishReceipt()       │
│          │──────────────►│         │
│          │  kind 1985    │         │
│          │  service-quality        │
│          │  e: <result-event-id>   │
└──────────┘               └─────────┘

The attestation's e tag references the DVM result event, making it traceable to the actual transaction. This means:

  • Trust scores are backed by real economic activity, not just social signaling
  • Any observer can verify that the attestation corresponds to a real service interaction
  • DVM providers build reputation automatically as they serve customers

Event Structure

{
  "kind": 1985,
  "content": "DVM receipt | kind:5050 (text-generation) | 21 sats | rating:5/5 | Fast translation",
  "tags": [
    ["L", "ai.wot"],
    ["l", "service-quality", "ai.wot"],
    ["p", "<dvm-provider-pubkey-hex>"],
    ["e", "<dvm-result-event-id>", "<relay-hint>"],
    ["expiration", "<unix-timestamp>"]
  ]
}

Negative Attestation Rules

  1. Content is required — empty disputes/warnings are ignored
  2. Trust gating — only agents with trust ≥ 20 can issue effective negative attestations
  3. Self-disputes are ignored — you can't lower your own score

Trust Score Calculation

score = Σ (zap_weight × attester_trust × type_multiplier × temporal_decay)
  • Zap weight: 1.0 + log₂(1 + sats) × 0.5
  • Attester trust: Recursive score (2 hops max, √ dampening)
  • Type multiplier: See table above
  • Temporal decay: 0.5 ^ (age_days / 90) — 90-day half-life
  • Score floor: Raw scores ≥ 0

Display score: min(100, max(0, raw × 10))

Sybil Resistance

diversity = (unique_attesters / attestation_count) × (1 - max_single_attester_share)

API Reference

Core

Function Description
publishAttestation(secretKey, pubkey, type, comment, opts?) Publish an attestation
queryAttestations(pubkey, opts?) Query attestations (auto-excludes revoked)
calculateTrustScore(pubkey, opts?) Calculate trust score + diversity
getAttestationSummary(pubkey, opts?) Formatted text summary
publishRevocation(secretKey, eventId, reason, opts?) Revoke an attestation (NIP-09)

DVM Receipts (v0.4.0)

Function Description
publishWorkCompleted(secretKey, pubkey, description, opts?) Publish work-completed attestation with structured content
publishReceipt(secretKey, dvmResult, opts?) Publish receipt attestation for DVM interaction
parseDVMResult(event) Parse DVM result event (kind 6xxx) into structured data
parseDVMFeedback(event) Parse DVM feedback event (kind 7000)
queryDVMHistory(myPubkey, opts?) Find your DVM interactions + attestation status
watchDVMResults(myPubkey, callback, opts?) Live-watch for DVM results, optional auto-attest
publishBatchAttestations(secretKey, targets, opts?) Attest multiple agents at once

Constants

Constant Value
RELAYS Default relay list
NAMESPACE 'ai.wot'
VALID_TYPES All 6 attestation types
POSITIVE_TYPES ['service-quality', 'work-completed', 'identity-continuity', 'general-trust']
NEGATIVE_TYPES ['dispute', 'warning']
DVM_KIND_NAMES Mapping of DVM request kinds to names
VERSION '0.5.0'

Testing

npm test

140+ tests covering: scoring math, temporal decay, type multipliers, zap weights, negative attestations, trust gating, diversity scoring, work-completed attestations, DVM result parsing, DVM feedback parsing, receipt content format, badge SVG generation, and edge cases.

Dependencies

Only two runtime dependencies:

  • nostr-tools — Nostr protocol implementation
  • ws — WebSocket client

License

MIT