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

daf-sdk

v1.1.20

Published

DAF (Defined Action Framework): protocol types and agentic execution runtime

Readme

daf-sdk

DAF (Defined Action Framework) is a single TypeScript package for defining, validating, and executing agentic, multi-step AI automations.

npm install daf-sdk

It ships two layers in one package:

  • Protocol: DAF document/action types, Zod validation, builder utilities. No heavy dependencies, so it's safe to import in a frontend or any client.
  • Runtime: the agentic execution engine (step loop, action handlers, token-cost calculation, variables, real-time updates). You embed it in your backend and supply a DAFStorageAdapter.

Import paths

import { executeProcess, validateDAFDocument } from 'daf-sdk';        // everything
import { validateDAFDocument, DAFDocumentBuilder } from 'daf-sdk/protocol'; // types only (lightweight)
import { executeProcess } from 'daf-sdk/runtime';                     // engine only

Use daf-sdk/protocol in browser or client code to avoid pulling the runtime's server dependencies (googleapis, nodemailer, firecrawl, and so on) into your bundle.

Build a DAF document (protocol)

import {
  DAFDocumentBuilder,
  ProcessBuilder,
  promptStep,
  validateDAFDocument,
} from 'daf-sdk/protocol';

const doc = new DAFDocumentBuilder()
  .variable('USER_EMAIL', '[email protected]')
  .process(
    new ProcessBuilder('Weekly Report', 'STATIC_DIALOGUE')
      .step(promptStep('Fetch data'))
      .build()
  )
  .build();

const { valid, errors } = validateDAFDocument(doc);

Execute it (runtime)

The runtime is an embedded library, not a service. Host concerns (database, HTTP routes, auth, billing, schedules) stay in your app; the runtime reaches them only through a DAFStorageAdapter you implement.

import { executeProcess, type DAFStorageAdapter } from 'daf-sdk';

const adapter: DAFStorageAdapter = {
  db: myDb,                                          // your persistence layer
  emitRunUpdate: (runId, event) => bus.publish(runId, event),
  log: console,
  // ...the rest of the DAFStorageAdapter interface
} as DAFStorageAdapter;

await executeProcess(processId, userId, adapter);

Pluggable host hooks

Some capabilities are host-coupled, so they're optional hooks on the adapter and the runtime calls back into your app:

const adapter: DAFStorageAdapter = {
  // ...core methods...
  executeCustomSkill: (skillName, params, userId) => myApp.runSkill(...),
  executeSkillScript: (skillName, scriptName, args, userId) => myApp.runScript(...),
  executeRunCode: (code, timeout, userId) => myApp.runCodeSandboxed(code, timeout),
};

runCode is delegated this way on purpose: the SDK never executes arbitrary code itself, so sandboxing and allowlisting are an explicit host responsibility. When a hook is absent, the corresponding action returns a graceful error instead of running.

Key exports

  • executeProcess, executeProcessInRun, resumeProcessExecution: run and resume processes
  • executeAction, processMessageActions, extractActionsFromMessage: action execution
  • calculateTokenCost, getModelProvider, getProviderFromModel: pricing and providers
  • substituteVariables, mergeVariables: variables
  • DAFStorageAdapter, ExecutionContext, UserProviderSettings: runtime types
  • validateDAFDocument, DAFDocumentBuilder, ProcessBuilder, all action types: protocol