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

@svatah/yam-surface

v0.2.0

Published

The published AgentSurface interface, adapter registry and wire schemas

Readme

@svatah/yam-surface

The published agent surface (REQ-SURF-1..5, LLD §2): the AgentSurface interface every adapter implements, the adapter registry, the typed errors, the snapshot text renderer, the structural hash, and the role tables that normalise UIA, AX and Appium trees onto the ARIA vocabulary.

This is the only way down. Nothing above it knows a locator, a protocol or a platform: callers address elements by reference, or by handing a stored Candidate to locate. An import-boundary lint and a dependency-graph test enforce that (LLD §1, REQ-SURF-2).

The interface

interface AgentSurface {
  readonly kind: "web" | "mobile" | "desktop" | "http";
  capabilities(): Capabilities;
  open(session: SessionInit): Promise<void>;
  close(): Promise<void>;

  snapshot(opts?): Promise<Snapshot>;              // a semantic tree with stable references
  act(action, ref?, args?, ref2?): Promise<ActResult>;
  read(kind, ref?, name?): Promise<unknown>;
  check(predicate, subject, ref?): Promise<CheckResult>;

  locate(candidate: Candidate): Promise<Ref[]>;    // 0, 1 or many — the resolver requires one
  describe(ref: Ref): Promise<ElementDescription>; // what synthesis and fingerprinting read
  screenshot(path, mask?): Promise<void>;
  state(): Promise<SessionState>;
  restore(state: SessionState): Promise<void>;
  trace?(start, path?): Promise<void>;
  request?(req, opts): Promise<ApiResponse>;
}

The full contract, including the role-mapping tables an adapter implementer needs, is docs/agent-surface.md.

Capabilities, not assumptions

An adapter publishes what it can do — dialogs, frames, windows, upload, drag, trace, webmcp, screenshot, restore — and the executor checks a plan against that at start, not mid-run (LLD §2.4). A missing feature is a refusal to begin rather than a failure halfway through a flow.

Typed errors

LocateError, ActionabilityError, TimeoutError, CheckError, DialogError, NavigationError, ScriptError, SessionError, DataError. Each carries the failure class the executor records, so LLD §8.4's mapping is data on the error rather than a switch statement above the surface. Anything that is not a SurfaceError classifies as unknown — an adapter leaking a native error is visible in the results rather than silently miscategorised.

Conformance

An adapter is conformant only when @svatah/yam-conformance's surface suite passes against it (REQ-SURF-3):

yam surface conform --adapter <name>

Licence

Apache-2.0.