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

@obsunified/telemetry-sdk

v2.0.2

Published

Server-side telemetry SDK — OTLP spans, structured logger, AI/LLM helpers, interaction_id stamping. Workers wrappers under ./cloudflare.

Readme

@obsunified/telemetry-sdk

Server-side telemetry SDK for obs-unified. OTLP spans, structured logger, AI/LLM helpers, interaction_id stamping, and Agent Action Graph primitives. Targets Cloudflare Workers, Node.js, Bun, and Deno; the Workers binding wrappers live under the ./cloudflare subpath.

pnpm add @obsunified/telemetry-sdk

Quick start

import {
  createRequestSpan,
  initObservability,
  runWithSpan,
  stampInteractionFromRequest,
  flushLogs,
  flushAICalls,
} from "@obsunified/telemetry-sdk";

app.use("*", async (c, next) => {
  initObservability({
    collectorUrl: c.env.OBS_COLLECTOR_URL,
    apiKey: c.env.OBS_INGEST_KEY,
    serviceName: "checkout-api",
  });
  await next();
});

app.use("*", async (c, next) => {
  const span = createRequestSpan(
    "checkout-api",
    `${c.req.method} ${c.req.path}`,
  );
  // Closes the click-to-trace loop. No-op if header is missing.
  stampInteractionFromRequest(span, c.req.raw);
  try {
    await runWithSpan(span, () => next());
    span.setStatus(c.res.status >= 400 ? 2 : 1);
  } finally {
    span.end();
    await Promise.all([flushLogs(), flushAICalls()]);
  }
});

Cloudflare binding wrappers

wrapD1 / wrapR2 / wrapFetch live under ./cloudflare so that Node consumers don't pull @cloudflare/workers-types:

import {
  wrapD1,
  wrapR2,
  wrapFetch,
} from "@obsunified/telemetry-sdk/cloudflare";

const db = wrapD1(env.DB);
const bucket = wrapR2(env.REPLAYS, { bucketName: "replays" });
const fetch = wrapFetch(globalThis.fetch);

What you get vs. what you wire

See INSTRUMENTATION_GUIDE.md for the full table. TL;DR: the SDK provides span/log/AI primitives and the OpenInference conventions; your application wires call sites and choice of LLM-call boundaries.

Identity propagation

The interaction key flows browser → server through the x-obs-interaction header. Call stampInteractionFromRequest(span, req) once on the root span; child spans and logs inherit automatically. See docs/spec/interaction-id.md.

Agent Action Graphs

Use @obsunified/telemetry-sdk/agent when your backend runs agents, tool-calling workflows, background jobs, or MCP hosts. The SDK creates RFC 0010 action IDs, preserves browser interaction_id when a user action triggered the agent, and links each step through caused_by_action_id.

import { startAgentRun } from "@obsunified/telemetry-sdk/agent";

await startAgentRun(
  {
    agentId: "billing-agent",
    agentName: "Billing Agent",
    autonomyLevel: "human_approved_write",
  },
  async (run) => {
    await run.llm(
      { model: "gpt-4o", provider: "openai" },
      async (call) => call.setTokens({ prompt: 320, completion: 84 }),
    );

    await run.tool(
      {
        name: "db.invoice_update",
        arguments: { invoiceId: "INV-2026-9912" },
        sideEffect: true,
        approvalState: "human_approved",
      },
      async (toolCall) => toolCall.setResult({ updated: true }),
    );
  },
);

MCP context propagation helpers let MCP hosts carry the same graph context through JSON-RPC params._meta. These helpers are separate from the @obsunified/mcp-server investigation server:

import { injectMcpContext, extractMcpContext } from "@obsunified/telemetry-sdk/mcp";
import { withAction } from "@obsunified/telemetry-sdk/agent";

injectMcpContext(params);

const context = extractMcpContext(params);
if (context?.actionContext) {
  await withAction(context.actionContext, async () => {
    await callTool();
  });
}

See Agent Action Graph and the action ID wire spec.