npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@weave_protocol/witan

v1.0.1

Published

Council Protocol - Multi-agent consensus, communication, and governance for AI systems

Readme

🏛️ Witan - Council Protocol

npm version license

Multi-agent consensus, communication, governance, and recovery for AI orchestration systems.

Part of the Weave Protocol Security Suite.

Witan = Old English for "council of advisors" (the Witenagemot advised Anglo-Saxon kings)

✨ Features

| Module | Capabilities | |--------|--------------| | Consensus Engine | Proposals, voting, quorum, weighted votes, veto | | Communication Bus | Direct messaging, pub/sub channels, broadcast | | Policy Engine | Rate limits, quotas, governance rules | | Recovery Manager | Checkpoints, transactions, rollback, disaster recovery |

Built on Dōmere orchestration primitives (TaskScheduler, AgentRegistry, StateManager).

📦 Installation

npm install @weave_protocol/witan

🚀 Quick Start

import { WitanCouncil } from '@weave_protocol/witan';

// Create council
const council = new WitanCouncil({
  signing_key: 'your-secret-key',
  max_agents: 10,
  default_quorum: 0.6,
  enable_auto_recovery: true
});

await council.start();

// Register agents
for (let i = 0; i < 10; i++) {
  await council.registerAgent({
    name: `agent-${i}`,
    capabilities: ['research', 'analysis'],
    voting_weight: 1
  });
}

// Submit tasks
await council.submitTask({
  intent: 'Analyze market data',
  priority: 'high'
});

// Propose decisions for vote
const proposal = await council.propose({
  title: 'Increase compute budget',
  description: 'Proposal to increase daily compute quota by 50%',
  type: 'resource',
  proposer_id: 'agent-0',
  payload: { new_quota: 150 }
});

// Agents vote
await council.vote(proposal.id, 'agent-1', 'approve', 'Needed for scaling');
await council.vote(proposal.id, 'agent-2', 'approve');
await council.vote(proposal.id, 'agent-3', 'reject', 'Cost concerns');

🗳️ Consensus Engine

Multi-agent voting with quorum, thresholds, and weighted votes.

import { ConsensusEngine } from '@weave_protocol/witan';

const consensus = new ConsensusEngine('signing-key', {
  default_quorum: 0.5,      // 50% must vote
  default_threshold: 0.6,   // 60% approval needed
  default_voting_duration_ms: 300000  // 5 minutes
});

// Create proposal
const proposal = await consensus.createProposal({
  title: 'Deploy new model',
  description: 'Replace GPT-4 with Claude for all tasks',
  proposal_type: 'action',
  proposer_id: 'orchestrator',
  eligible_voters: ['agent-1', 'agent-2', 'agent-3', 'agent-4', 'agent-5'],
  voting_config: {
    quorum: 0.6,
    threshold: 0.7,
    weighted_voting: true,
    weights: new Map([
      ['agent-1', 2],  // Lead agent gets double weight
      ['agent-2', 1],
      ['agent-3', 1],
      ['agent-4', 1],
      ['agent-5', 1]
    ]),
    veto_enabled: true,
    veto_holders: ['orchestrator']
  }
});

// Cast votes
await consensus.vote(proposal.id, 'agent-1', 'approve', 'Better reasoning');
await consensus.vote(proposal.id, 'agent-2', 'approve');
await consensus.vote(proposal.id, 'agent-3', 'reject', 'Cost increase');
await consensus.vote(proposal.id, 'agent-4', 'abstain');

// Check result
const result = await consensus.finalizeProposal(proposal.id);
console.log(result.decision);        // 'approved' | 'rejected' | 'no_quorum'
console.log(result.participation_rate);
console.log(result.approve_weight);

// Subscribe to events
consensus.onEvent((event) => {
  if (event.type === 'passed') {
    console.log(`Proposal ${event.proposal_id} passed!`);
  }
});

📨 Communication Bus

Agent-to-agent messaging with channels and pub/sub.

import { CommunicationBus } from '@weave_protocol/witan';

const bus = new CommunicationBus('signing-key', {
  default_ttl_ms: 300000,
  max_pending_messages: 1000
});

// Register agents
await bus.registerAgent('agent-1');
await bus.registerAgent('agent-2');

// Direct message
await bus.send({
  from: 'agent-1',
  to: 'agent-2',
  type: 'data-handoff',
  payload: { dataset_id: 'ds_123', format: 'json' },
  priority: 'high',
  require_ack: true
});

// Create topic channel
const channel = await bus.createChannel({
  name: 'research-updates',
  type: 'topic',
  owner: 'orchestrator',
  initial_members: ['agent-1', 'agent-2', 'agent-3']
});

// Publish to channel
await bus.publish({
  from: 'agent-1',
  channel: 'research-updates',
  type: 'finding',
  payload: { insight: 'Market trending upward' }
});

// Broadcast to all
await bus.broadcast({
  from: 'orchestrator',
  type: 'priority-change',
  payload: { all_tasks: 'high' },
  priority: 'critical'
});

// Receive messages (in agent loop)
const messages = await bus.receive('agent-2', { limit: 10 });
for (const msg of messages) {
  console.log(`From ${msg.from}: ${msg.type}`);
  await bus.acknowledge(msg.id, 'agent-2');
}

// Subscribe with handler
const unsubscribe = bus.subscribe('agent-3', async (message) => {
  console.log('Received:', message.type);
}, { types: ['finding', 'alert'] });

📜 Policy Engine

Governance rules, rate limits, quotas, and constraints.

import { PolicyEngine } from '@weave_protocol/witan';

const policy = new PolicyEngine();

// Rate limit: 100 requests per minute per agent
await policy.createRateLimit({
  name: 'api-rate-limit',
  targets: [{ type: 'all' }],
  max_requests: 100,
  window_ms: 60000,
  action: 'throttle'
});

// Quota: Max 1000 tokens per agent per day
await policy.createQuota({
  name: 'daily-token-quota',
  targets: [{ type: 'agent', ids: ['agent-1', 'agent-2'] }],
  resource: 'tokens',
  max_value: 1000
});

// Schedule: Only allow actions during business hours
await policy.createSchedulePolicy({
  name: 'business-hours-only',
  targets: [{ type: 'all' }],
  allowed_hours: { start: 9, end: 17 },
  allowed_days: [1, 2, 3, 4, 5],  // Mon-Fri
  action: 'deny'
});

// Concurrency limit
await policy.createConcurrencyLimit({
  name: 'max-parallel-tasks',
  targets: [{ type: 'agent', pattern: 'agent-.*' }],
  max_concurrent: 5
});

// Enforce policy
const decision = await policy.enforce({
  agent_id: 'agent-1',
  action: 'api_call',
  resource: 'openai',
  timestamp: new Date()
});

if (!decision.allowed) {
  console.log(`Denied: ${decision.message}`);
  if (decision.retry_after_ms) {
    console.log(`Retry in ${decision.retry_after_ms}ms`);
  }
}

// Track violations
policy.onViolation((violation) => {
  console.log(`Policy violation: ${violation.policy_id} by ${violation.agent_id}`);
});

🔄 Recovery Manager

Checkpoints, transactions, and disaster recovery.

import { RecoveryManager } from '@weave_protocol/witan';

const recovery = new RecoveryManager('signing-key', {
  max_checkpoints: 100,
  auto_checkpoint_interval_ms: 300000,  // Every 5 min
  enable_auto_recovery: true
});

// Create checkpoint
const checkpoint = await recovery.checkpoint({
  name: 'Pre-deployment',
  created_by: 'orchestrator',
  tags: ['deployment', 'critical']
});

// Begin transaction
const txn = await recovery.beginTransaction({
  initiator: 'agent-1',
  description: 'Update configuration',
  auto_checkpoint: true
});

// Record operations
await recovery.recordOperation(txn.id, {
  type: 'state_change',
  target_type: 'state',
  target_id: 'config',
  action: 'update',
  before: { version: 1 },
  after: { version: 2 },
  success: true,
  reversible: true,
  rollback_action: 'restore'
});

// Commit or rollback
try {
  // ... do work ...
  await recovery.commitTransaction(txn.id);
} catch (error) {
  await recovery.rollbackTransaction(txn.id);
}

// Restore from checkpoint
await recovery.restore(checkpoint.id, 'admin');

// Create recovery plan
await recovery.createRecoveryPlan({
  name: 'Agent failure recovery',
  trigger: {
    type: 'agent_failure',
    failure_count: 3,
    failure_window_ms: 60000
  },
  actions: [
    { type: 'restore_checkpoint', checkpoint_age_ms: 300000, order: 1, continue_on_failure: false },
    { type: 'notify', notify_targets: ['admin'], order: 2, continue_on_failure: true }
  ],
  auto_execute: true
});

// Report failure (may trigger recovery)
const result = await recovery.reportFailure({
  type: 'agent',
  id: 'agent-5',
  error: 'Connection timeout'
});
if (result.recovered) {
  console.log(`Auto-recovered using plan ${result.plan_id}`);
}

🎛️ Witan Council (Unified Interface)

Single entry point combining all components.

import { WitanCouncil } from '@weave_protocol/witan';

const council = new WitanCouncil({
  signing_key: process.env.WITAN_KEY!,
  max_agents: 10,
  default_quorum: 0.5,
  default_threshold: 0.6,
  enable_auto_recovery: true,
  auto_checkpoint_interval_ms: 300000
});

await council.start();

// Register agents
const agentId = await council.registerAgent({
  name: 'researcher',
  capabilities: ['search', 'summarize'],
  voting_weight: 2
});

// Submit tasks (uses Dōmere scheduler)
await council.submitTask({
  intent: 'Research competitor analysis',
  priority: 'high',
  required_capabilities: ['search']
});

// Create proposals
const proposal = await council.propose({
  title: 'Add new data source',
  description: 'Integrate Bloomberg API',
  type: 'resource',
  proposer_id: agentId
});

// Send messages
await council.sendMessage({
  from: agentId,
  to: 'agent-2',
  type: 'collaboration-request',
  payload: { task: 'joint-analysis' }
});

// Set policies
await council.setRateLimit({
  name: 'inference-limit',
  max_requests: 60,
  window_ms: 60000
});

// Checkpoint
await council.checkpoint('Before risky operation', agentId);

// Transactions
const txn = await council.beginTransaction(agentId, 'Config update');
// ... operations ...
await council.commitTransaction(txn.id);

// Agent heartbeat loop
setInterval(async () => {
  const { ok, tasks_to_run, messages } = await council.heartbeat(agentId, []);
  
  // Process tasks
  for (const task of tasks_to_run || []) {
    await council.orchestrator.taskStarted(agentId, task.id);
    // ... do work ...
    await council.orchestrator.taskCompleted(agentId, task.id, result);
  }
  
  // Process messages
  for (const msg of messages || []) {
    console.log(`Message from ${msg.from}: ${msg.type}`);
  }
}, 5000);

// Get stats
const stats = council.getStats();
console.log(`${stats.orchestration.agents_ready} agents ready`);
console.log(`${stats.consensus.proposals_open} proposals open`);

// Subscribe to events
council.onEvent((event) => {
  console.log(`[${event.source}] ${event.event.type}`);
});

await council.stop();

🏗️ Architecture

┌─────────────────────────────────────────────────────────────────────────────┐
│                           WITAN COUNCIL                                     │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐  ┌─────────────┐  │
│  │   Consensus   │  │     Comms     │  │    Policy     │  │  Recovery   │  │
│  │    Engine     │  │      Bus      │  │    Engine     │  │   Manager   │  │
│  ├───────────────┤  ├───────────────┤  ├───────────────┤  ├─────────────┤  │
│  │ • Proposals   │  │ • Direct      │  │ • Rate Limits │  │ • Checkpts  │  │
│  │ • Voting      │  │ • Channels    │  │ • Quotas      │  │ • Txns      │  │
│  │ • Quorum      │  │ • Broadcast   │  │ • Schedules   │  │ • Rollback  │  │
│  │ • Veto        │  │ • Pub/Sub     │  │ • Constraints │  │ • Plans     │  │
│  └───────────────┘  └───────────────┘  └───────────────┘  └─────────────┘  │
│                                                                             │
├─────────────────────────────────────────────────────────────────────────────┤
│                         DŌMERE PRIMITIVES                                   │
│  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐  ┌─────────────┐  │
│  │    Task       │  │    Agent      │  │    State      │  │   Exec      │  │
│  │  Scheduler    │  │   Registry    │  │   Manager     │  │  Replay     │  │
│  └───────────────┘  └───────────────┘  └───────────────┘  └─────────────┘  │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

🔗 Related Packages

| Package | Description | |---------|-------------| | @weave_protocol/domere | Judge Protocol - Orchestration & verification | | @weave_protocol/mund | Guardian Protocol - Threat scanning | | @weave_protocol/hord | Vault Protocol - Secure storage |

📄 License

Apache 2.0


Made with ❤️ for AI Safety