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

@projectpac/source-llm

v0.6.0

Published

Part of PAC: @projectpac/source-llm.

Downloads

197

Readme

@projectpac/source-llm

The principal's model access: the right to spend their money at a provider, offered to a peer the way anything else they hold is.

{
  "models": [
    {
      "name": "openrouter",
      "host": "openrouter.ai",
      "model": "anthropic/claude-sonnet-4.5",
      "key": "openrouter-key"
    }
  ]
}

key names a file in this plugin's own folder (keys/openrouter-key). url is optional -- a known host has one, anything else declares its own. note is optional and composed from the host when absent.

Why it is its own plugin

This used to be three fields of a skill document -- provider, model, and a key file its front matter named. Two consequences, both wrong for the same reason:

  • a credential was not something a peer could be offered, and
  • only the skill's owner could ever pay for running it.

Who supplies the model is a term of the computation. A term belongs in the negotiation, not inside one party's private arrangement. So a design names a model access beside whatever else the program reads, and it may come from either principal.

What a peer sees, and what it does not

{
  "name": "openrouter",
  "note": "a model this principal pays for, at openrouter.ai",
  "discloses": ["openrouter.ai"]
}

The host, because that is the disclosure a peer consents to, and it is the same word the box session's declared egress speaks: one name carries from this config through the descriptor to the cage the program runs in. Not the model, which is what this principal chose to pay for; not the url; never the key.

No shape, because a credential is not read as data. A program spends it.

The two verbs

inventory() answers the rows whose key file is actually there. stake() copies the key into the caller's folder and answers what a program needs to make the call:

{ url, model, apiKey: { $line: "models/openrouter.key" } }

The url and the model are literals -- neither is material. The key crosses as a file and comes back as a marker only a box resolves, so no flow on either side ever holds its value.

That the url is staked rather than written into the program is deliberate. What a reviewer approves is the host, bound into the box's approval message alongside the program hash; the path a provider uses is nobody's business. It also means two nodes no longer have to agree on an endpoint table before they can agree on bytes -- the program is the same program whoever is paying.