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

@emotion-machine/em-voice

v0.3.5

Published

Emotion Machine workspace + hot_context integration for OpenClaw

Readme

Emotion Machine Voice Plugin for OpenClaw

This plugin connects OpenClaw to Emotion Machine’s voice workspace API so long‑running tasks can update hot_context and be spoken by the Fast Brain.

What It Does

  • Provides an em_voice_task tool for logging task lifecycle events to EM /voice/workspace
  • Exposes gateway RPC methods (em-voice.start, em-voice.done, etc.)
  • Optionally syncs contacts from USER.md into EM relationships

Install

# From npm
openclaw plugins install @emotion-machine/em-voice

# From local folder (development)
openclaw plugins install ./openclaw-plugin

Restart the OpenClaw gateway after install or config changes.

Publish

cd openclaw-plugin
npm run clean
npm run build
npm publish

Notes:

  • Package includes compiled dist/ output via prepare/prepublishOnly.
  • Scoped package is configured for public publish (publishConfig.access=public).

Configure

Add to your OpenClaw config:

{
  plugins: {
    entries: {
      "em-voice": {
        enabled: true,
        config: {
          em: {
            apiKey: "em_live_...",
            companionId: "comp_abc123...",
            workspaceApiToken: "voice_ws_...",
            // baseUrl: "https://api.emotionmachine.ai"
          },
          workspace: {
            path: "~/.openclaw/workspace"
          }
        }
      }
    }
  }
}

Notes:

  • workspaceApiToken must match VOICE_WORKSPACE_API_TOKEN on the EM server.
  • relationshipId is required in production when calling em_voice_task.
  • If you want a single global hot_context for non‑phone tasks, set em.defaultRelationshipId and omit relationshipId in those tool calls.

Usage

Tool call from the agent

{
  "action": "done",
  "taskId": "abc123",
  "relationshipId": "rel_...",
  "result": "Email draft ready."
}

Gateway RPC (manual / debugging)

openclaw rpc em-voice.start --params '{"relationshipId":"rel_...","taskId":"abc123","query":"Draft email"}'
openclaw rpc em-voice.done --params '{"relationshipId":"rel_...","taskId":"abc123","result":"Draft ready"}'
openclaw rpc em-voice.status --params '{"relationshipId":"rel_...","taskId":"abc123"}'

One-Command Setup

openclaw em-voice init

This will:

  • Open a browser to authorize Emotion Machine (OAuth + PKCE)
  • Derive a fast-brain prompt (and pick a voice) from your local SOUL.md / IDENTITY.md
  • Create a default global relationship
  • Print a single openclaw config set ... command to apply
  • Print the Twilio inbound webhook URL for this companion

The init is idempotent: it will reuse an existing companion if found in config or workspace. Use --reinstall to force a new companion. You will be prompted to apply the config and restart the gateway automatically.

The companion/relationship IDs are also stored in: ~/.openclaw/workspace/.em/em-voice.json

If the browser cannot reach your CLI, you can copy the code from the page and paste it back into the terminal.

For local dev:

openclaw em-voice init --base-url http://localhost:8100 --auth-url http://localhost:3000

Flags:

  • --auth-url to override the dashboard origin.
  • --manual to skip the localhost callback and paste the code manually.
  • --base-url is only needed for dev/staging; default is production (https://api.emotionmachine.ai).
  • --companion-id to reuse an existing companion.
  • --reinstall to force re-create the companion.
  • --voice-name, --preset, --stt-provider, --tts-provider to control the voice pipeline.
  • --caller-phone to create phone:<digits> relationship for your own phone.
  • --twilio-account-sid, --twilio-auth-token, --twilio-phone-number to enable BYO Twilio.

What Gets Synced

| OpenClaw File | → | EM Entity | |---------------|---|-----------| | SOUL.md / IDENTITY.md | → | companion.config.system_prompt | | USER.md (contacts) | → | relationship.profile | | memory/contacts.md | → | relationship.profile |

Profile Structure in EM

{
  "user": {
    "name": "Sample User",
    "email": "[email protected]",
    "phone": "+1 555 010 0000",
    "timezone": "America/Los_Angeles"
  },
  "relationship": {
    "role": "employee_1",
    "trust_level": "full",
    "source": "USER.md",
    "synced_at": "2026-02-06T10:00:00Z"
  }
}

How It Works

  1. Webhook received → Task logged to hot_context.md
  2. Fast brain → Reads context, generates immediate acknowledgment (~200ms)
  3. Response sent → User hears "Got it, checking..." via TTS
  4. Slow brain → OpenClaw agent processes the full request (async)
  5. Callback → Full result POSTed back to your voice app
  6. TTS → Your app speaks the complete answer

Race Condition Safety

The hot_context.md file uses an append-only event log pattern:

  • No locking required (POSIX atomic appends)
  • Fast brain can read while slow brain writes
  • System naturally converges on next read

Inspired by Cursor's self-driving codebase research.

License

MIT © Emotion Machine, Inc.