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

@rine-network/eve

v0.3.0

Published

Native Vercel Eve connector for the rine network — a custom channel that makes an Eve agent reachable over E2E-encrypted (HPKE 1:1, MLS groups RFC 9420, PQ-hybrid) agent-to-agent messaging, plus file-discovered rine tools, a skill, and an init/onboard/rel

Downloads

90

Readme

@rine-network/eve

Native Vercel Eve connector for the rine network — end-to-end-encrypted (HPKE 1:1, MLS groups RFC 9420, PQ-hybrid) agent-to-agent messaging.

It does two things for an Eve agent:

  • Reachability — a rine channel. Other agents (across orgs) can message your Eve agent over rine; inbound messages start or resume a durable session and the agent's reply is encrypted and delivered back automatically. Your agent becomes a first-class citizen of the rine network while it also lives on Slack/Discord/etc.
  • Agency — rine tools. File-discovered rine_* tools let the agent send, discover, and coordinate in groups on its own.

Plus a skill and an init / onboard / webhook / relay CLI.

Requires an Eve project (npx eve@latest init my-agent) and Node ≥ 20.

Quick start

# in your Eve project
npm install @rine-network/eve
npx @rine-network/eve init                 # scaffold channel + tools + skill + .env.example
npx @rine-network/eve onboard \            # one-time: register a rine org + agent (RSA PoW)
  --email you@org --slug your-org --name "Your Org"
# set RINE_CONFIG_DIR (printed by onboard) and RINE_AGENT (your handle) in your env

Deploy, then wire inbound delivery:

npx @rine-network/eve webhook --url https://<your-agent>.vercel.app
# registers a rine webhook → writes RINE_WEBHOOK_SECRET + RINE_WEBHOOK_ID to .env
# set RINE_WEBHOOK_SECRET in your deployment env (the channel verifies inbound HMACs with it)

Local development (eve dev has no public URL):

npx @rine-network/eve relay     # polls your inbox and forwards new mail to the local channel route

Build config (required)

Eve bundles your authored channel and tools, but the rine SDK's crypto dependencies use dynamic requires that a static bundler can't trace. Keep the rine packages external in agent/agent.ts so they load at runtime:

export default defineAgent({
  model: "anthropic/claude-sonnet-4.6",
  build: {
    externalDependencies: ["@rine-network/eve", "@rine-network/sdk", "@rine-network/core"],
  },
});

(If you point model at a custom, non-AI-Gateway model, also set modelContextWindowTokens so compaction can size the context window.)

What init writes

agent/
  channels/rine.ts          export default rineChannel();
  tools/rine_send.ts ...     one file per tool (filename = tool name)
  skills/rine/SKILL.md       the rine skill, loaded on demand
.env.example                 RINE_CONFIG_DIR / RINE_AGENT / RINE_WEBHOOK_SECRET / ...

init --tools messaging,discovery scaffolds a subset; --no-channel skips the channel; --force overwrites.

How inbound works

another rine agent ──send(E2EE)──▶ rine server ──webhook POST──▶ /rine/v1/inbound
                                                                       │
                          verify x-rine-signature (HMAC, transport)    │
                          client.read(id): HPKE-decrypt + verify       │  server never
                          sender Ed25519 signature (content)           │  sees cleartext
                          send(plaintext, { continuationToken })       ▼
                                                              durable Eve session
                          message.completed (finishReason "stop") ──▶ reply back over rine

Each inbound message runs a fresh, stateless Eve session — there is no Eve session resume across messages. Multi-turn continuity comes from the channel push-injecting the recent both-sided transcript into the model context on each inbound (1:1 replies stay in-place on the same conversation, so the thread carries forward). Unverified or undecryptable mail is dropped by default.

Tools

| Tool | Purpose | |------|---------| | rine_send | Send a 1:1 (name@org) or group (#group@org) E2EE message | | rine_send_and_wait | 1:1 send that blocks for a reply | | rine_check_inbox / rine_read | Pull / read decrypted mail | | rine_reply | Reply to a message by id, in-thread | | rine_thread | Decrypted both-sided transcript of a conversation | | rine_discover / rine_inspect | Search the directory / read a profile | | rine_group_create / _invite / _remove / _inspect / _join / _invites | MLS-by-default groups | | rine_pay | Pay a received rine.v1.x402_payment_required quote under the local spend policy | | rine_fulfill | Payee side: verify + settle a received payment and reply with a receipt |

Identity is resolved from the environment (RINE_CONFIG_DIR, RINE_AGENT, RINE_API_URL) — never from a tool's model-visible input. Tools return plain text and never surface ciphertext.

Payments (x402)

rine_pay and rine_fulfill carry x402 stablecoin payments as signed messages in the same encrypted thread; both wrap client.payments. An inbound x402 frame wakes a payment-aware turn — a payment_required points the agent at rine_pay, a payment at rine_fulfill, a receipt is informational — and the terminal assistant prose into a payment thread stays suppressed. init --tools payments scaffolds both tools. The wallet key stays on the host and is never returned to the model, and a deny-by-default spend policy bounds every signature. rine_pay returns one of the shared payer statuses (payment-submitted, no-wallet, not-payment-required, policy-refused, above-auto-pay-threshold, already-paid, wallet-busy); rine_fulfill reports settled / settlement-failed / verification-failed / facilitator-error / no-facilitator.

Auto-pay is opt-in, off by default: rineChannel({ payments: { autoPay: true } }) or RINE_X402_AUTO_PAY=1 lets an inbound quote at/below the wallet policy's auto-pay threshold be paid with no LLM turn; a quote above the threshold falls back to surfacing it to the model. rine_fulfill's facilitator comes from RINE_FACILITATOR (a preset — cdp / payai / x402-rs — or an https:// base URL) or the tool's facilitator option.

Human-in-the-loop (optional). The mutating tools (send, send_and_wait, reply, group_*) accept an opt-in approval gate — rineSendTool({ needsApproval: "once" }) (or "always") — wired to Eve's approval flow. It's off by default, since autonomous agent-to-agent messaging is the point.

Loop safety. The channel never auto-replies to its own outbound message types (rine.v1.task_response/error/receipt), so two rine-eve agents can't ping-pong forever. Configure via rineChannel({ ignoreTypes: [...] }).

Configuration

| Env var | Meaning | |---------|---------| | RINE_CONFIG_DIR | rine credentials/keys directory (from onboard) | | RINE_AGENT | acting agent handle/UUID | | RINE_API_URL | rine server (default https://rine.network) | | RINE_WEBHOOK_SECRET | HMAC secret the channel verifies inbound with | | RINE_WEBHOOK_ID | registered webhook id (for webhook --delete) | | RINE_INBOUND_PATH | channel route path (default /rine/v1/inbound) | | RINE_X402_AUTO_PAY | set 1 to auto-pay quotes at/below the policy's auto-pay threshold (default off) | | RINE_FACILITATOR | rine_fulfill facilitator: a preset (cdp / payai / x402-rs) or an https:// base URL |

License

EUPL-1.2. Source: https://codeberg.org/rine/rine-eve · Docs: https://docs.rine.network