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

@intisy-ai/api

v1.0.2

Published

Plugin API contract and service registry for the intisy-ai AI-proxy ecosystem.

Readme

api

npm version npm downloads CI

The plugin contract for the intisy-ai ecosystem, published as @intisy-ai/api. It holds the plugin.json manifest schema, the plugin context and lifecycle, the typed keys a capability or a service is reached by, the declaration engine a host runs, the ESM driver a host starts plugins with, and the validate command. The contract is written in Java and the TypeScript surface is generated from it. It has no dependencies, and only the ./host subpath and the CLI import node, so a plugin and a dashboard renderer can import the same package a host does without carrying either.

Under-the-Hood Architecture

flowchart TD
    MANIFEST[plugin.json] -->|validate| VALIDATE[validateManifest]
    MANIFEST -->|declares| CAPS[capabilities]
    MANIFEST -->|declares| SVC[services.provides / consumes]

    subgraph Host [host, one per app]
        HOST[createPluginHost]
        LEDGER[(introspection ledger)]
        HUB[(service registry)]
    end

    HOST -->|contextFor| CTX[PluginContext]
    CTX -->|provide| HOST
    CTX -->|register / get / want / watch| HUB
    CTX -->|subscribe| BUS[events]
    CTX --> LEDGER

    PLUGIN[plugin entry module] -->|activate ctx| CTX
    HOST -->|verifyActivation| CHECK{declared == provided?}
    CHECK -->|no| QUARANTINE[markBroken: capabilities and services dropped, host stays up]
    CHECK -->|yes| ACTIVE[capability id is the only dispatch key a host has]

    SVC --> ORDER[activationOrder: providers before consumers, cycles named]

The permanence rules

The API is append-only from its first release. These four rules are what make that possible, and they are enforced in review:

  1. The API package is append-only. A published capability interface, service contract, manifest field, or event shape is never removed and never changes meaning. New needs get new ids, never edits to old ones. Deprecation is a documentation state, not a code change.
  2. Every vocabulary is open. An unknown capability id, service id, event topic, manifest field, or screen-node kind is ignored with a debug log, never an error. A plugin built against next year's API loads on today's host, minus what the host does not know.
  3. "api": 1 is a floor. A host refuses to load only a plugin whose declared floor exceeds what the host implements, and says exactly that. Everything else loads.
  4. Nothing may branch on a plugin id. Hosts and core libraries never compare against a specific plugin's id; capability ids and service ids are the only dispatch keys. A plugin asking for another plugin's namespaced service is not a violation: that is dispatch by service id, and declaring the dependency is the point.

Structure

  • one directory per java module (the contract and the engine, the source of truth)
    • annotations/, processor/: the emission annotations and the emitter that renders TypeScript
    • contract/: the manifest, the plugin, the context, and the typed keys
    • engine/: validation, activation order, the service hub, the ledger and the diagnostics channel
    • teavm/: the engine's JavaScript module surface, compiled to an ES2015 module
  • generated/ (emitted from the Java, committed)
    • api.keys.js and api.keys.d.ts: the package root, types and constants
    • api.d.ts: the contract declarations, also served as ./contract
    • engine.js and engine.d.ts: the engine, served as ./engine
  • src/host/: the ESM driver and manifest scanner a host runs plugins with, served as ./host
  • src/cli/: the intisy-plugin command
  • dist/ (compiled output, not committed): cli/main.js and host/index.js
  • schema/plugin.schema.json: the manifest schema, emitted from the Java ManifestSchema

Installation

Through the plugin manager, as a dependency of the host or plugin that needs it:

npm install @intisy-ai/api

Inside this repo's own sibling packages, as a file dependency on the submodule checkout:

{ "dependencies": { "api": "file:../api" } }

Configuration

This package reads no configuration file. Its one environment switch is INTISY_PLUGIN_STRICT=1, which makes every ignored unknown id loud instead of quiet:

INTISY_PLUGIN_STRICT=1 npx intisy-plugin validate

A host can route the same diagnostics into its own logger with setDiagnosticSink, and force the mode with setStrict(true).

Logging

This package writes no log files. Every plugin-facing message goes to the Logger the host puts on the context, and the package's own diagnostics go to the sink a host installs, or to the console when it installs none.

License

MIT