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

@network-harness/protocol-joint-search

v0.2.0

Published

Part of the network harness: @network-harness/protocol-joint-search.

Readme

@network-harness/protocol-joint-search

Two humans have a question neither one's data can answer alone, and neither will hand their data to the other.

This is the protocol the rest of the harness exists for, and it negotiates twice.

First over what to compute. Each side sees only the other's descriptor -- source names and a sentence each, never contents -- and the two agents write objectives into a shared versioned resource: one suggests, the other reads the diff and suggests back, until one agrees. An objective names, per node, exactly which sources it may read, what the terms in it mean, the rules a program must follow, and what may and may not come out.

Then over how. The same machinery produces program.py -- real Python defining run(parties), which is what the box's runner executes -- and both sides approve those exact bytes. The instructions carry the box's own execution contract: the party order, the shape each party's input arrives in, the modules that may be imported, the bounds, and the rule that nothing may depend on the clock or randomness. Only then does anything private move, and it moves into a box both sides verified, carrying exactly the sources the agreed objective named.

Everything hard here belongs to a component: the versioned resource and its bundles are the artifact store's, the runs and their output contract the loop's, the sessions and delivery the adapter's, and every step that touches material is an apply. What is left is the state machine -- who initiates, what each side owes next, and when a negotiation has gone on long enough.

| | | | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | routes | POST /queries, GET /queries, GET /tasks, GET /works, GET /descriptor | | payloads | probe.* (triage), plan.* (objectives), program.*, work.* (the box) | | schedules | publish 30s, triage 5s, pair 5s, advance 2s, sweep 30s | | needs | any source -- which ones is the negotiation's own answer, and policy decides what may actually be applied -- the jc.* operations, with jc.submit gated | | intents | search, declared fallback: publishing a query needs nobody to have offered anything first |

Roles are elected from the two node ids, so both sides derive the same initiator without being told. descriptor.ts is what a peer may learn, prompts.ts what each run is asked (and the box contract), state.ts the durable records.

Running it live needs a real box, because the in-process double cannot join two processes: see devtools/README.md. The scripted path is services/daemon/tests/joint-search.spec.ts, which is also the reference for what a negotiation script looks like.