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

@heywinit/chat-flows

v0.1.0

Published

Conversation flow engine for the Vercel Chat SDK — linear multi-turn flows with automatic routing

Readme

@heywinit/chat-flows

Conversation flow engine for the Vercel Chat SDK. Build linear, multi-turn conversational flows with automatic routing and state management.

Features

  • Fluent API: Type-safe FlowBuilder for defining conversation steps.
  • Automatic Routing: FlowRouter manages thread subscriptions and resumes flows based on stored state.
  • Validation: Built-in and custom validators for user input.
  • Dynamic Content: Questions can be static strings or dynamic functions based on current flow data.
  • State Management: Integrates with the Chat SDK's state adapters to persist progress across restarts.
  • Lifecycle Hooks: Define custom behavior for flow completion and abandonment.

Installation

pnpm add @heywinit/chat-flows

Basic Usage

import { createFlow, FlowRouter, required, isEmail } from '@heywinit/chat-flows';

// 1. Define your data structure
interface OnboardingData {
  name: string;
  email: string;
}

// 2. Create the flow
const onboardingFlow = createFlow<OnboardingData>('onboarding')
  .ask('name', "Hey! What's your name?", {
    validate: required,
  })
  .ask('email', (ctx) => `Nice to meet you, ${ctx.data.name}! What's your email?`, {
    validate: isEmail,
  })
  .done(async (ctx, thread) => {
    await thread.post(`🎉 Welcome aboard, ${ctx.data.name}!`);
  });

// 3. Setup the router
const router = new FlowRouter(bot);
router.register(onboardingFlow);

// 4. Start the flow
bot.onNewMention(async (thread, message) => {
  await router.start('onboarding', thread, message);
});

Technical Details

FlowRouter

The FlowRouter is the orchestrator. It listens for messages on subscribed threads and attempts to resume active flows.

  • register(flow): Adds a flow definition to the router.
  • start(flowName, thread, message, initialData?): Initiates a new flow instance.
  • abandonKeywords: Configurable keywords (default: cancel, stop, quit) that trigger the onAbandon hook.

FlowBuilder

Created via createFlow<T>(name).

  • .ask(key, question, options):
    • key: The property in your data object where the response is stored.
    • question: A string or (ctx) => string.
    • options.validate: A function or array of functions (val) => string | true.
  • .done(handler): Executed when all steps are completed successfully.
  • .onAbandon(handler): Executed if the user sends an abandon keyword.

Validators

The package exports several common validators:

  • required
  • minLength(n)
  • maxLength(n)
  • isEmail
  • oneOf([...])
  • composeValidators(...validators)

License

MIT