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

@plurnk/plurnk-agui

v1.0.5

Published

The plurnk daemon's transport daughter — owns the client interface, serving AG-UI+ (the Agent-User Interaction Protocol + plurnk metadata extensions) as the sole client interaction surface. In-process module activated at the daemon's boot plug-point; any

Readme

@plurnk/plurnk-agui

The plurnk daemon's transport daughter: owns the client interface, serving AG-UI+ — the Agent-User Interaction Protocol plus plurnk metadata extensions — as the sole client interaction surface. Any AG-UI frontend (CopilotKit, community UIs, the plurnk CLI/TUI/nvim clients) is a plurnk client. Vendor-agnostic, MIT.

Topology

An in-process module of the daemon, not an external service: the daemon activates it at boot (daemon.registerModule(Module.init(opts))), handing it the curated core seam (event source, loop-control, op dispatch, journal/metadata reads, proposal HITL, session lifecycle — plurnk-service#355). The module opens its own HTTP/SSE listener and owns the transport+security line at that edge: bearer auth, per-session authorization, input validation. Below the seam: plurnk terms (loop/turn/proposal). Above: AG-UI terms (run/message/tool-call/state). This module is the translation.

The interface (AG-UI+)

One endpoint: POST / with RunAgentInput (threadId, runId, messages, forwardedProps) → text/event-stream of AG-UI events.

  • Runs: turns are STEP_*; PLAN is THINKING_TEXT_MESSAGE_*; SEND bodies are TEXT_MESSAGE_*; every other op row is a TOOL_CALL_* triple + TOOL_CALL_RESULT. Numbers pass through verbatim (contextSize = the daemon's effective prompt budget).
  • HITL, terminate-resume: a stopped-world proposal (file edit, exec, MCP auth) emits a request_approval tool-call — a SEND[300] operator question emits request_user_input — and the run finishes while the loop stays paused in-engine. The next run's tool-result message (toolCallId: "prop:<id>", content {decision: accept|reject|cancel, body?}) resolves it; the continued loop streams there. Pending proposals re-surface on (re)connect — a days-old question is discoverable.
  • Reads ride STATE: providers/aliases/budget/session arrive as STATE_SNAPSHOT on RUN_STARTED and STATE_DELTA on change — observed, not polled.
  • The session is the WORLD: forwardedProps.plurnk.session selects the workspace by name, verbatim (attach-or-create). It is REQUIRED — a run has no existence without a world, so its absence is rejected (500), never forged from the threadId. Session options ride the workspace's first run: forwardedProps.plurnk (projectRoot, constraints, settings); per-run knobs (maxTurns, flags, alias/model) every run.
  • The thread is the CONVERSATION: a threadId binds a run over the selected world — today the session's model run (ensureModelRun), so extended context persists across runs; history replays as MESSAGES_SNAPSHOT on reattach. Distinct second conversations over one world gate on plurnk-service#366. (Machine model: service SPEC §machine-processes.)
  • Cancel: dropping the SSE aborts a live loop (hangup is the abort); a proposal-terminated run leaves the paused loop for the resume.
  • Tier 2 metadata (CUSTOM plurnk.*: row, stream, telemetry, terminated) carries what AG-UI has no term for — fold state, coordinates, tags, token truth. Generic frontends skip it; family clients render it richly. The full contract: SPEC.md (every {§} anchor cited by a test).

Consume

import { Module } from "@plurnk/plurnk-agui";
daemon.registerModule(Module.init({ host: "127.0.0.1", port: 3044 }));
// The daemon reads PLURNK_HOST/PLURNK_PORT: plurnk has ONE client surface, this listener.

Dependencies

Zero at runtime — no Zod, no SDK. The AG-UI event shapes are hand-defined plain TS (the official @ag-ui/core is 0.0.x and would drag Zod in, so it is deliberately NOT a dependency). If the official SDK ever stabilizes dependency-free, adopting it is a types-only swap.