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

@spectratools/sentinel

v1.0.2

Published

Secure declarative gateway-native watcher plugin for OpenClaw

Readme

@spectratools/sentinel

Declarative gateway-native watcher plugin for OpenClaw. Define watchers that poll HTTP endpoints, WebSocket streams, SSE feeds, or EVM contract state — and fire callbacks to agent sessions when conditions are met.

Installation

openclaw plugins install @spectratools/sentinel

Configuration

Config options in openclaw.json under plugins.sentinel:

| Option | Type | Default | Description | |---|---|---|---| | allowedHosts | string[] | [] | Hostnames watchers may connect to (required — no hosts allowed by default) | | hookSessionPrefix | string | agent:main:hooks:sentinel | Base session key for isolated callback sessions | | defaultHookModel | string | — | LLM model for callback sessions (per-watcher fire.model takes precedence) | | notificationPayloadMode | "none" \| "concise" \| "debug" | "concise" | How much data to include in notification payloads | | dataDir | string | — | Managed data directory for state and operator goal files | | maxOperatorGoalChars | number | 12000 | Maximum operatorGoal length |

Watcher Definition

{
  id: "my-watcher",
  skillId: "my-skill",
  enabled: true,
  strategy: "http-poll",    // http-poll | websocket | sse | evm-call
  endpoint: "https://api.example.com/status",
  intervalMs: 30000,
  match: "all",             // all | any
  conditions: [
    { path: "$.status", op: "eq", value: "degraded" }
  ],
  fire: {
    webhookPath: "/hooks/sentinel",
    eventName: "status-degraded",
    payloadTemplate: { status: "${$.status}" },
    operatorGoal: "The API is degraded. Notify the on-call channel and check recent deployments.",
  },
  retry: { maxRetries: 3, baseMs: 1000, maxMs: 30000 },
}

Strategies

| Strategy | Description | |---|---| | http-poll | Periodic GET/POST requests | | websocket | Persistent WebSocket connection | | sse | Server-Sent Events stream | | evm-call | Ethereum contract read via eth_call |

Condition Operators

eq · neq · gt · gte · lt · lte · exists · absent · contains · matches · changed

Conditions are evaluated against each response using JSONPath expressions. Use match: "all" to require every condition to pass, or match: "any" to fire when at least one matches.

Callback (Hook Session)

When conditions fire, sentinel spawns an isolated agent session with the callback envelope and operatorGoal as context. The callback agent uses these tools:

  • sentinel_act(notify) — deliver a notification (fulfills the relay contract, cancels the timeout fallback)
  • sentinel_act(run_command) — execute a shell command
  • sentinel_escalate — signal the agent can't handle it (lets the timeout fallback relay fire)

⚠️ In callback sessions, use sentinel_act(notify) for delivery — not the message tool. Using message directly bypasses the relay contract and causes double-delivery.

operatorGoal vs payloadTemplate

| Field | Purpose | |---|---| | operatorGoal | Natural language instruction for the callback agent — describes what success looks like | | payloadTemplate | Structured key-value data included in the callback envelope — for data, not instructions | | operatorGoalFile | Path to a file read fresh at fire time — for dynamic policy/config that changes between fires |

Security

  • allowedHosts must be configured — connections to unlisted hosts are blocked
  • HTTP strategies reject redirects by default
  • Private/reserved IP ranges are blocked unless explicitly allowlisted

Agent Skill

Ships a SKILL.md covering tool usage, relay contract semantics, and watcher lifecycle. The skill is loaded automatically when the plugin is enabled, providing agents with structured instructions for creating and managing watchers.

License

MIT