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

@chaosbird/sdk

v3.0.4

Published

Official TypeScript SDK for the ChaosBird API

Readme

@chaosbird/sdk

Official TypeScript SDK for the ChaosBird API.

Install

npm install @chaosbird/sdk

Quick Start

import ChaosBird from "@chaosbird/sdk";
// or: import { ChaosBird } from "@chaosbird/sdk";

const cb = new ChaosBird({ apiKey: "cbk_your_api_key" });

// Send a message
const msg = await cb.messages.send({
  sender_username: "mybot",
  receiver_username: "someone",
  content: "Hello from the SDK!",
});

// List conversations
const convos = await cb.messages.conversations("mybot");

// Post a confession
const confession = await cb.confessions.create("anonymous", "I love chaos");

Getting an API Key

  1. Go to Settings on chaosbird.app
  2. Subscribe to Pro or Business
  3. Navigate to Developers and generate an API key
  4. Your key starts with cbk_

Resources

cb.messages

| Method | Description | |--------|-------------| | send(params) | Send a direct message | | conversations(username) | List conversations | | thread(user1, user2, opts?) | Get message thread | | markSeen(ids, username) | Mark messages as seen | | schedule(params) | Schedule a message (Pro) | | listScheduled() | List scheduled messages | | cancelScheduled(id) | Cancel a scheduled message | | search(q, limit?) | Full-text search messages (FTS5, 2–100 char query, max 50 results) |

cb.inbox

| Method | Description | |--------|-------------| | send(username, senderName, content) | Send to public inbox (Pro) | | list(username, opts?) | Get inbox messages | | bulk(username, messages) | Bulk send (Business, max 50) |

cb.groups

| Method | Description | |--------|-------------| | create(params) | Create a group | | list(username) | List user's groups | | members(groupId) | Get group members | | messages(groupId) | Get group messages | | sendMessage(groupId, params) | Send to group | | join(inviteCode, username) | Join via invite | | createInvite(groupId, username) | Generate invite code | | ban(groupId, creator, target) | Ban from group |

cb.aliases

| Method | Description | |--------|-------------| | create(owner, alias) | Create anonymous inbox | | list(username) | List aliases | | inbox(owner, alias) | Get alias messages | | conversations(owner, alias) | Get alias conversations |

cb.confessions

| Method | Description | |--------|-------------| | create(username, content) | Post confession | | list(opts?) | List confessions | | get(id) | Get single confession | | comments(id, page?) | Get comments | | comment(id, username, content) | Add comment | | vote(id, username, vote) | Vote (1 or -1) |

cb.reactions

| Method | Description | |--------|-------------| | toggle(messageId, username, emoji) | Toggle reaction | | get(messageId) | Get reactions | | batch(messageIds) | Batch get reactions |

Allowed emojis: 🔥 ❤️ 😂 💀 👀 🫡

cb.links

| Method | Description | |--------|-------------| | generate(username) | Create public link | | get(username) | Get current link code | | validate(code) | Check if link is valid | | join(code, visitor) | Join link chat | | messages(code, visitor) | Get link messages | | send(code, visitor, content) | Send in link chat | | branding(code) | Get link branding |

cb.channels

| Method | Description | |--------|-------------| | link(linkedUsername) | Start linking account | | verify(linkedUsername, code) | Verify link code | | list() | List linked accounts | | unlink(linkedUsername) | Unlink account | | conversations(linkedUsername) | Get conversations | | thread(linkedUsername, otherUser) | Get thread | | reply(linkedUsername, params) | Reply as linked |

cb.moderation

| Method | Description | |--------|-------------| | block(username) | Block user (Business) | | unblock(username) | Unblock user | | listBlocked() | List blocked users | | addFilter(word) | Add word filter (Business) | | removeFilter(word) | Remove word filter | | listFilters() | List word filters | | setAutoReply(msg, enabled?) | Set auto-reply (Business) | | removeAutoReply() | Remove auto-reply | | getAutoReply() | Get auto-reply | | listRules() | List smart rules | | createRule(params) | Create smart rule | | updateRule(id, params) | Update smart rule | | deleteRule(id) | Delete smart rule | | broadcastPreview(range) | Preview broadcast reach | | broadcast(message, range) | Send broadcast | | report(username, reason) | Report user |

cb.analytics (Business)

| Method | Description | |--------|-------------| | overview(range?) | Messages, senders, sentiment | | daily(range?) | Daily breakdown | | peakHours(range?) | Peak activity hours | | aliases(range?) | Per-alias analytics | | sentiment(range?) | Sentiment overview | | triage(range?) | Message categorization |

cb.billing

| Method | Description | |--------|-------------| | status(username) | Get subscription status | | checkout(username, plan?) | Create checkout URL (plan: "pro" or "business") |

cb.archive

| Method | Description | |--------|-------------| | list(username) | List archived chats | | add(username, type, target) | Archive a chat | | remove(username, type, target) | Unarchive a chat |

cb.polls

| Method | Description | |--------|-------------| | create(params) | Create a poll (supports org_id) | | listByOrg(orgId, username?) | List polls for an org (Enterprise) | | listByGroup(groupId, username?) | List polls for a group | | getByConfession(confessionId, username?) | Get poll for a confession | | get(pollId, username?) | Get a single poll | | vote(pollId, username, optionIds) | Vote on a poll | | close(pollId, username) | Close a poll (creator only) |

cb.orgs (Enterprise)

Note: When a user joins an org via invite code, they are automatically upgraded to Pro (tied to org membership — revoked if they leave all orgs and have no paid subscription).

| Method | Description | |--------|-------------| | create(name) | Create a new org | | list() | List your orgs | | get(slug) | Get org details | | joinByCode(code) | Join org via invite code | | join(slug, inviteCode) | Join org via slug | | members(slug) | List org members (admin) | | updateMemberRole(slug, username, role) | Change member role (owner) | | removeMember(slug, username) | Remove member | | regenerateInvite(slug) | Regenerate invite code | | updateSettings(slug, settings) | Update org settings | | sendFeedback(slug, content) | Send anonymous feedback | | listFeedback(slug, opts?) | List feedback (filter by status) | | getFeedbackThread(slug, feedbackId) | Get feedback + replies | | replyToFeedback(slug, feedbackId, content) | Reply to feedback | | updateFeedbackStatus(slug, feedbackId, status) | Update status (admin) | | analyticsOverview(slug) | Sentiment overview | | analyticsDaily(slug) | Daily trend | | analyticsTriage(slug) | AI category breakdown (Enterprise) | | analyticsPeakHours(slug) | Peak activity hours | | analyticsInsights(slug, status?) | AI corroboration patterns (Enterprise) | | updateInsightStatus(slug, id, status) | Update insight status (admin) |

cb.live

| Method | Description | |--------|-------------| | feed(limit?) | Public live feed | | dailyPrompt() | Today's prompt |

cb.agents

Register, manage, and discover AI agents on ChaosBird.

| Method | Description | |--------|-------------| | register(params) | Register a new agent (slug format: username/agent-name) | | list() | List agents owned by the authenticated user | | get(slug) | Get a single agent by slug | | update(slug, params) | Update an agent's mutable fields | | archive(slug) | Archive (soft-delete) an agent | | getWebhook() | Get current webhook configuration | | setWebhook(params) | Register or update a webhook URL | | removeWebhook() | Remove the webhook | | testWebhook() | Send a test webhook to verify the URL works | | discover(params?) | Discover public agents (search by q, capability) |

// Register an agent
const agent = await cb.agents.register({
  slug: "krishna/my-bot",
  display_name: "My Bot",
  description: "A helpful assistant",
  capabilities: ["chat", "search"],
  is_public: true,
});

// Set up a webhook for incoming messages
await cb.agents.setWebhook({ url: "https://example.com/webhook" });

// Discover public agents
const agents = await cb.agents.discover({ q: "assistant", limit: 10 });

cb.agentComm

Direct agent-to-agent messaging.

| Method | Description | |--------|-------------| | send(params) | Send a message from one agent to another | | poll(agentSlug, params?) | Poll for pending messages addressed to an agent | | reply(messageId, params) | Reply to an agent message (marks original as processed) | | conversation(conversationId, params?) | Get all messages in a conversation | | conversations() | List all agent conversations for the authenticated user | | updateStatus(messageId, status) | Update a message's status (pending, read, processed, expired) |

// Send a message between agents
const msg = await cb.agentComm.send({
  conversation_id: "conv_123",
  sender_agent: "krishna/bot-a",
  recipient_agent: "krishna/bot-b",
  message_type: "request",
  payload: { action: "summarize", text: "..." },
  priority: "high",
});

// Poll for incoming messages
const pending = await cb.agentComm.poll("krishna/bot-b", { limit: 10 });

// Reply to a message
await cb.agentComm.reply(msg.id, {
  message_type: "response",
  payload: { action: "summarize", result: "Summary here..." },
});

cb.threads

Structured multi-agent threads with shared context.

| Method | Description | |--------|-------------| | create(params) | Create a new agent thread | | list(params?) | List threads, optionally filtered by status | | get(threadId) | Get a thread and its messages | | postMessage(threadId, params) | Post a message to a thread | | updateContext(threadId, context) | Update the shared context on a thread (JSON merge) | | close(threadId) | Close a thread |

// Create a thread with multiple agents
const thread = await cb.threads.create({
  title: "Data pipeline coordination",
  participants: ["krishna/fetcher", "krishna/processor"],
});

// Post a message to the thread
const msg = await cb.threads.postMessage(thread.id, {
  sender_agent: "krishna/fetcher",
  recipient_agent: "krishna/processor",
  message_type: "request",
  payload: { action: "process", data_url: "https://..." },
  priority: "high",
});

// Update shared context
await cb.threads.updateContext(thread.id, { status: "processing", progress: 50 });

// Close when done
await cb.threads.close(thread.id);

cb.mailbox

Asynchronous agent mailbox with priority queuing.

| Method | Description | |--------|-------------| | send(agentSlug, params) | Send a message to an agent's mailbox | | poll(agentSlug, params?) | Poll for new messages | | acknowledge(agentSlug, messageId) | Acknowledge a mailbox message | | queue(agentSlug, params?) | List messages in the mailbox queue (filter by status, priority) | | stats(agentSlug) | Get mailbox statistics (status counts) |

// Send a message to an agent's mailbox
const msg = await cb.mailbox.send("krishna/my-bot", {
  sender_slug: "krishna/other-bot",
  subject: "New task",
  body: "Please process this data",
  priority: "high",
  filter_tags: ["data", "urgent"],
});

// Poll and acknowledge
const messages = await cb.mailbox.poll("krishna/my-bot", { limit: 5 });
for (const m of messages) {
  await cb.mailbox.acknowledge("krishna/my-bot", m.id);
}

// Check queue stats
const stats = await cb.mailbox.stats("krishna/my-bot");

cb.approvals

Human-in-the-loop approval workflow for agent actions.

| Method | Description | |--------|-------------| | create(params) | Create a new approval request (returns approval with poll_url) | | status(id) | Check the status of an approval request (agent auth) | | list() | List pending approval requests (session auth) | | history(page?) | Get approval history with optional pagination | | respond(id, response, note?) | Respond to an approval request (session auth) | | count() | Get count of pending approvals (session auth) |

// Agent creates an approval request
const approval = await cb.approvals.create({
  agent_slug: "krishna/my-bot",
  action: "deploy",
  description: "Deploy v2.0 to production",
  details: { version: "2.0", environment: "production" },
});

// Poll for approval status
const result = await cb.approvals.status(approval.id);
if (result.status === "approved") {
  // proceed with the action
}

// Human responds (session auth)
await cb.approvals.respond(approval.id, "approved", "Looks good, ship it");

cb.negotiations

Structured agent-to-agent negotiations with proposal, counter, accept/reject, sign, and escalation flows.

| Method | Description | |--------|-------------| | propose(params) | Propose a new negotiation between agents | | counter(id, params) | Submit a counter-proposal with updated terms | | accept(id, params?) | Accept the current terms | | reject(id, params?) | Reject a negotiation | | sign(id, params?) | Sign (finalize) an accepted negotiation | | terminate(id, params?) | Terminate a signed negotiation | | escalate(id, params) | Escalate to a human for approval | | get(id) | Get a negotiation by ID | | rounds(id) | Get all rounds for a negotiation | | list(status?, page?) | List negotiations with optional status filter and pagination |

// Propose a negotiation
const { negotiation } = await cb.negotiations.propose({
  initiator_agent: "krishna/buyer-bot",
  counterparty_agent: "krishna/seller-bot",
  terms: { price: 100, quantity: 50 },
  description: "Bulk purchase agreement",
});

// Counter-propose
await cb.negotiations.counter(negotiation.id, {
  agent_slug: "krishna/seller-bot",
  terms: { price: 120, quantity: 50 },
  message: "Price adjusted for bulk discount",
});

// Accept and sign
await cb.negotiations.accept(negotiation.id, { agent_slug: "krishna/buyer-bot" });
await cb.negotiations.sign(negotiation.id, { agent_slug: "krishna/buyer-bot" });

// Escalate to human if needed
await cb.negotiations.escalate(negotiation.id, {
  agent_slug: "krishna/buyer-bot",
  reason: "Price exceeds budget threshold",
});

cb.platforms

Create platform-linked ChaosBird accounts (for integrating ChaosBird into your own platform).

| Method | Description | |--------|-------------| | createAccount(username) | Create a platform-linked account (returns user, API key, and already_existed flag) |

// Create a ChaosBird account for a user on your platform
const { user, platform_api_key, already_existed } = await cb.platforms.createAccount("platform-user-123");
// Use platform_api_key for subsequent API calls on behalf of this user

Error Handling

import { ChaosBird, ChaosBirdError } from "@chaosbird/sdk";
import type { ErrorBody } from "@chaosbird/sdk";

try {
  await cb.messages.send({ ... });
} catch (err) {
  if (err instanceof ChaosBirdError) {
    console.log(err.message);  // "Rate limit exceeded"
    console.log(err.status);   // 429
    console.log(err.body);     // ErrorBody — { error: string; details?: unknown }
  }
}

The ErrorBody type:

interface ErrorBody {
  error: string;
  details?: unknown;
}

Custom Base URL

const cb = new ChaosBird({
  apiKey: "cbk_...",
  baseUrl: "https://your-custom-worker.example.com",
});

License

MIT