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

@jetty/eve

v0.3.1

Published

Jetty × eve — an eve extension that live-grades an agent's turns with Jetty, steers a reply-style bandit from the grades, and reports eve evals into Jetty

Readme

@jetty/eve

Jetty × eve: mount live Jetty grading into any eve agent as an extension, and report eve eval results into Jetty as durable trajectories.

Two independent pieces, use either or both:

  1. The extension (the package's default export) — mounted under agent/extensions/, it contributes, under your mount's namespace:
    • hooks/ingest — every finished turn lands in Jetty as a durable, labelled trajectory (eval.config, eval.source, cost_est_usd), ungraded for an out-of-band grader — or judged inline by a native Jetty simple_judge task (judgeMode: "simple_judge"), which also writes eval.grade / eval.pass / eval.dim.* / eval.policy_violation.
    • instructions/arm — a per-turn dynamic-instructions resolver running an episodic Thompson-sampling bandit over your configured reply-style arms, rewarded by the pass-rates read back from Jetty labels. Jetty's grades are the signal the agent optimizes, not a dashboard.
    • tools/experiment — a tool the model can call to report the experiment (per-arm judged runs, pass rates, leader). Composes as <namespace>__experiment.
  2. The Jetty() eval reporter (@jetty/eve/reporter) — drops into evals.config.ts where eve's Braintrust(...) goes; every eve eval result is pushed to Jetty with one ingestTrajectory call. (Reporters are eval-runner config, not an agent capability, so this is a plain export, not a contribution.)

Mount

// agent/extensions/jetty.ts   ← the file name is the namespace
import jetty from "@jetty/eve";

export default jetty({
  collection: process.env.JETTY_COLLECTION ?? "",   // empty → extension no-ops
  task: "triage-live",
  judgeMode: "simple_judge",
  arms: {
    warm: "write the reply as a warm, specific first response…",
    terse: "write the reply as a single terse sentence…",
  },
  contract: "Respond with ONLY the JSON object { … } — no prose.",
});

Config is validated (zod) and binds once at mount; every knob has a sensible default — see extension/extension.ts for the full schema (bandit pacing, pass bar, token prices). With an empty collection every contribution degrades to a no-op or a fair coin, so the agent runs without Jetty credentials.

Cross-contribution bookkeeping (which arm a turn played, the turn's captured input/reply/usage) uses eve's defineState, auto-scoped to this package — no globals, no collisions with the consuming agent.

Typed tool results & overrides

Narrow the experiment tool's result in your own hook:

import { toolResultFrom } from "eve/tools";
import { experiment } from "@jetty/eve/tools";

const match = toolResultFrom(event.data.result, experiment); // typed output or undefined

To gate or replace a contribution, author your mount as a directory (agent/extensions/jetty/extension.ts) and add override slots beside it — e.g. tools/experiment.ts re-defining the tool with an approval, or disableTool() to drop it. See the extensions docs.

Reporter

// evals/evals.config.ts
import { defineEvalConfig } from "eve/evals";
import { Jetty } from "@jetty/eve/reporter";

export default defineEvalConfig({ reporters: [Jetty()] });

Needs JETTY_API_TOKEN + JETTY_COLLECTION (or pass collection/project in code). The reporter never fails an eval run: unreachable Jetty logs a warning and the run continues; with no collection set it no-ops, so the config is safe to commit.

Worked example

examples/eve-jetty in this repo mounts the extension over a support-triage agent and runs the full loop live: answer → grade → traffic shifts → release gate. It's the end-to-end demo of everything above.

Requirements

  • eve ≥ 0.25 (peer dependency — your app provides it; the extension ships a compiled dist/ + compatibility manifest that eve validates at mount), Node ≥ 24
  • A Jetty API token (JETTY_API_TOKEN); the ingest endpoint (POST /api/v1/trajectories/{collection}/{task}/ingest) on the target mise