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

@thsky-21/thskyshield-demo

v0.1.1

Published

Zero-login demo: watch a runaway AI agent repeat itself and get killed at its loop gate. Runs locally — no signup, no API key, no network. npx @thsky-21/thskyshield-demo

Readme

@thsky-21/thskyshield-demo

Watch an AI agent get stuck in a retry loop and killed at its loop gate — in one command.

npx @thsky-21/thskyshield-demo

No signup. No API key. No network. Takes about 4 seconds.

What you'll see

An agent gets stuck retrying the same failing prompt. The loop detector counts the repeats climbing toward the gate, and on the 20th identical prompt the step is denied before the model is called:

  step 19  allowed  ████████████ 100% of loop gate
           ↳ loop detector: identical prompt ×19 of 19

  KILLED  step 20  —  loop threshold reached
  The step was denied before the model was called. 19 identical prompts in a row — the gate held.

  Steps allowed    19 of 50
  Loop gate        19 of 19 identical prompts
  Killed by        loop
  Time to kill     4394 ms from run start
  Prevented        an unbounded retry loop — the same prompt, forever

How honest is this?

Worth being precise, because a demo that flatters itself isn't worth running:

  • The decisions are real. The kill order, the off-by-one semantics, and the fact that a killed step is denied rather than logged after the fact all match production and are pinned by tests.
  • The gate lands exactly on the threshold. Nineteen identical prompts are allowed; the twentieth is not. That off-by-one is production's, not the demo's.
  • The LLM call is simulated. The demo doesn't need an OpenAI key. The governance decision around the call is the real thing either way.
  • The engine is a local port, not the engine. In production the decision logic runs as Lua inside Redis — atomic and distributed. Here it runs in your process so the demo works with no account. Same decisions, different substrate.
  • "Prevented: an unbounded retry loop" is not a number on purpose. The agent has no stopping condition — no retry cap, no convergence check, no notion of its own repetition. Any specific figure would be invented, and far too small.

The real thing

This demo governs a fake agent locally. To govern your actual agents:

npm install @thsky-21/thskyshield
import { Thskyshield } from '@thsky-21/thskyshield';

const shield = new Thskyshield({ apiKey });
const run = await shield.beginRun({ loopThreshold: 5, iterationLimit: 30 });

const { requestId } = await run.beforeStep({
  stepType: 'llm',
  model: 'gpt-4o',
  promptInput: prompt,   // hashed client-side; raw prompt never leaves your process
});

// ... call your model ...

await run.afterStep({ requestId });

Start free at thskyshield.com/start — no infra.

License

MIT