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

@goatlab/delphi-ui

v0.1.10

Published

Workflow dashboard for the Goat agent ecosystem

Readme

@goatlab/delphi-ui

Workflow dashboard for @goatlab/delphi-core. A React + React Flow + Vite app that visualizes runs, events, workers, and metrics in real time via server-sent events. Ships with a Node test server used for Playwright E2E and k6 load benchmarks.

What it is

  • Dashboard — lists workflows, inspects runs/steps/logs, surfaces human-approval pauses, shows worker health and queue depth
  • Visual editor — drag-and-drop graph editor (React Flow + dagre) to author workflow templates without hand-writing DSL
  • Smart trigger form — introspects a workflow's declared input schema and renders the right form fields
  • Test server (test-server/server.ts) — a self-contained HTTP backend: Postgres + Redis testcontainers, all workflow executors registered, queue-first ingestion wired in. Used for E2E tests and load benchmarks.
  • Example (example/start.ts) — long-running demo with three workflows and registered workers for local development

Install

pnpm add @goatlab/delphi-ui

Dashboard components are exported from the package root; styles from @goatlab/delphi-ui/styles.css.

Run locally

# Dashboard dev server (default port 5173)
pnpm dev

# Example backend (real Postgres/Redis via testcontainers, 3 demo workflows)
npx tsx example/start.ts

# Test backend (used by E2E + load tests; supports Node cluster mode)
pnpm test:server

# Playwright E2E for the visual editor (12 tests)
npx playwright test e2e/workflow-editor.spec.ts

# k6 load test (needs the test server running)
k6 run ../../packages/delphi-core/loadtest/k6-workflow.js

Point the UI at a backend

VITE_API_URL=http://localhost:4444 pnpm dev

Test server tuning

test-server/server.ts reads these env vars:

| Env | Default | Purpose | |---|---|---| | PORT | 4444 | HTTP port | | PG_POOL_SIZE | 20 | Postgres pool per Node process | | WORKER_CONCURRENCY | 50 | BullMQ concurrency per queue per process | | DISABLE_LOG_BUFFER | false | Set true for synchronous log writes | | CLUSTER_MODE | auto | auto (cores-1), off (single proc), or an integer |

On boot it detects the available CPU count, forks workers via node:cluster, starts containers once in the primary, and passes connection URLs to children. All workers share HTTP port 4444 (kernel round-robin) and consume the same BullMQ queues.

HTTP endpoints

| Method + path | Purpose | |---|---| | POST /workflows/start | Sync start (writes PG, then enqueues) | | POST /workflows/start-async | Queue-first ingest (returns {runId, traceId, status: QUEUED} in ~2ms) | | POST /workflows/start-batch | Batched start (single COPY FROM under the hood) | | POST /workflows/start-batch-copy | Explicit COPY FROM path | | POST /workflows/status | Fetches run + steps; falls back to BullMQ lookup for in-flight QUEUED runs | | POST /workflows/cancel | Cancel a run | | POST /workflows/human-input | Resume a WAITING_HUMAN step | | POST /workflows/signal | Send a signal to a running workflow | | POST /workflows/query | List runs with filters | | POST /workflows/ingest-event | Event ingestion endpoint | | POST /workers/generate-token, /workers/list, /workflows/heartbeat | Remote worker registration + liveness | | POST /workflows/validate | Validate a workflow definition | | GET /health | Returns {ok, ingestWorkers, ingestBufferDepth}; 503 if no ingest worker registered |

Measured performance (on the test server)

Load-tested with k6-workflow.js:

| Hardware | SLO | Throughput | |---|---|---| | 2 vCPU (CLUSTER_MODE=2) | p95 < 50ms | ~4,000 req/s | | 2 vCPU | p95 < 100ms | ~5,000 req/s | | 16 vCPU (CLUSTER_MODE=auto → 15 workers) | p95 < 100ms | ~17,000 req/s (Node-bound, not PG-bound) |

Zero errors observed at any tested rate. Data loss verified at 0 across 400k+ workflow runs.

Dashboard features

  • Workflow list: sorted by most recent run; workflows with no runs appear last
  • Run inspector: step DAG rendered with React Flow, per-step logs, inputs/outputs, error traces
  • Human approval UI: inline form for steps in WAITING_HUMAN state, schema-validated
  • Worker monitor: lists registered WorkerNodes, their heartbeats, slot utilization
  • Metrics: queue depth, throughput, recent failures
  • SSE: live updates without polling

Key exports

| Export | Purpose | |---|---| | <Dashboard /> | Top-level app component | | <WorkflowList />, <RunInspector />, <VisualEditor /> | Mix-and-match sub-components | | useWorkflowRun(runId) | React hook — live run + step state via SSE | | useWorkflowList(filters) | React hook — filtered list of runs |

License

MIT