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

lisa-runtime-kit

v0.0.13

Published

Reusable Angular runtime for manifest-driven LISA dashboards backed by MCP tools.

Readme

lisa-runtime-kit

Reusable Angular runtime for manifest-driven LISA dashboards backed by MCP tools.

In this repo, lisa-runtime-kit is currently consumed by:

  • the thin standalone runtime host app
  • the authoring preview host app
  • projects/lisa-runtime-dashboard, a routed dashboard host app with login, project selection, and project-detail rendering

The routed dashboard host app also demonstrates a host-owned SSO pattern:

  • Kloudspot browser SSO and /ui-api/* session ownership stay in the host app
  • the host app then exchanges that existing Kloudspot UI session for an MCP token through kspot-mcp
  • lisa-runtime-kit itself still only receives the final MCP token plus optional MCP URL overrides

Install

npm install lisa-runtime-kit

Required peer dependencies:

  • @angular/animations
  • @angular/cdk
  • @angular/common
  • @angular/core
  • @angular/forms
  • @angular/material
  • apexcharts
  • ng-apexcharts

Main Usage

<lisa-runtime-renderer
  [manifest]="draftManifest"
  [token]="authToken"
  [mcpBaseUrl]="mcpBaseUrl"
  [mcpEndpoint]="mcpEndpoint"
  mode="preview" />

Inputs

  • manifest: inline manifest JSON object
  • manifestUrl: URL to fetch the manifest from
  • token: JWT used for MCP tool calls
  • mcpBaseUrl: optional explicit MCP base URL override
  • mcpEndpoint: optional explicit MCP endpoint override
  • mode: 'preview' or 'standalone'

MCP URL precedence:

  1. explicit host inputs
  2. manifest.mcp
  3. library defaults

If the host app uses the Angular Material date picker UI from this library, it should also provide Angular animations, for example with:

import { provideAnimationsAsync } from '@angular/platform-browser/animations/async';

Variables

Supported variable types:

  • date
  • dateRange
  • select
  • multiSelect
  • boolean
  • text
  • number

Variables can also optionally set:

  • placement: "left" | "right"

Use placement: "right" when a control should sit in the far-right cluster of the filter bar while the rest stay on the left.

select renders as an Angular Material single-select dropdown.

multiSelect renders as an Angular Material multi-select and resolves to a string[].

boolean renders as a compact toggle and resolves to true or false.

Special behavior:

  • if a manifest explicitly defines a boolean variable with id: "autorefresh" and the toggle is enabled, the runtime automatically refreshes dashboard data every 60 seconds

Example:

{
  "id": "selectedLines",
  "label": "Lines",
  "type": "multiSelect",
  "defaultValue": ["LF", "LH"],
  "options": [
    { "label": "LF", "value": "LF" },
    { "label": "LH", "value": "LH" }
  ]
}

date renders with an Angular Material date picker inside the runtime UI.

date resolves to a millisecond range for the selected day:

{
  "start": 1777100400000,
  "end": 1777186799999
}

dateRange renders as a paired start/end date picker and is stored as:

{
  "start": 1776495600000,
  "end": 1777186799999
}

That means manifests should reference:

  • {{variables.someDate.start}}
  • {{variables.someDate.end}}
  • {{variables.someRange.start}}
  • {{variables.someRange.end}}

Theme Presets

Built-in theme presets:

  • kloudspot
  • western-digital
  • aurora-light
  • graphite-orange
  • mint-garden
  • rose-paper
  • cobalt-slate
  • midnight-teal
  • ember-ash
  • forest-night

Theme is currently resolved once per runtime instance and applied globally across the rendered app. For schemaVersion: "2.0" multi-page manifests, all pages share the same resolved theme unless page-level theme overrides are introduced later.

Manifest Versions

schemaVersion: "1.0"

Single-page dashboard manifests use top-level widgets:

{
  "schemaVersion": "1.0",
  "dashboard": {
    "id": "example",
    "title": "Example Dashboard",
    "team": "Operations"
  },
  "theme": {
    "preset": "kloudspot"
  },
  "variables": [],
  "dataSources": [],
  "widgets": []
}

schemaVersion: "2.0"

Multi-page runtime app manifests can define shared app metadata plus tabbed pages. Each page can either keep a flat widgets list or switch to structured sections:

{
  "schemaVersion": "2.0",
  "app": {
    "id": "example-app",
    "title": "Example App",
    "description": "A multi-page runtime app",
    "team": "Operations"
  },
  "layout": {
    "navigation": "tabs"
  },
  "theme": {
    "preset": "kloudspot"
  },
  "variables": [],
  "dataSources": [],
  "pages": [
    {
      "id": "overview",
      "title": "Overview",
      "icon": "📊",
      "sections": [
        {
          "id": "overview-kpis",
          "title": "Area KPIs",
          "type": "kpiRow",
          "variant": "band",
          "density": "compact",
          "columns": 6,
          "widgets": []
        },
        {
          "id": "overview-content",
          "title": "Signal Mix",
          "type": "grid",
          "variant": "hero",
          "density": "comfortable",
          "columns": 2,
          "widgets": []
        },
        {
          "id": "throughput-focus",
          "title": "Throughput Focus",
          "type": "split",
          "splitRatio": "2:1",
          "widgets": []
        },
        {
          "id": "throughput-details",
          "title": "Detail Tables",
          "type": "stack",
          "widgets": []
        }
      ]
    },
    {
      "id": "alerts",
      "title": "Alerts",
      "icon": "🔔",
      "widgets": []
    }
  ]
}

Current 2.0 notes:

  • layout.navigation currently supports tabs and sidebar
  • variables and data sources remain shared across pages
  • only the active page's widgets are rendered and refreshed
  • sidebar navigation uses a desktop left rail and collapses to a lightweight hamburger drawer on mobile
  • pages can use either widgets[] or sections[]
  • pages can optionally set loadStrategy: "lazy" | "prefetch" | "eager"
  • the active page is deep-linkable with ?page=<pageId>
  • tab clicks update the URL, and browser back/forward restores the selected page
  • layout.pageParam can override the query parameter name; default is page
  • page deep links are only honored for manifests with pages[]; 1.0 manifests ignore that param
  • section types currently support kpiRow, grid, split, and stack
  • sections can optionally set variant: "hero" | "band" | "band-scroll" | "rail"
  • sections can optionally set density: "compact" | "comfortable"
  • sections currently support columns: 1 | 2 | 3 | 4 | 5 | 6
  • section title is optional; omit it when you want layout grouping without a visible heading
  • split sections are designed for two primary widgets and use splitRatio such as "2:1" or "3:2"
  • stack sections render widgets vertically in a single-column group and ignore widget width
  • variant is visual emphasis only: layout still comes from grid, split, or stack, and section titles keep the same base heading style
  • band-scroll is intended for kpiRow sections and turns the KPI strip into a horizontal scroller instead of wrapping
  • density adjusts presentation only: section gaps, header spacing, section widget padding, and section-local typography without changing layout behavior
  • 1.0 single-page manifests remain supported

loadStrategy behavior:

  • lazy (default): page data loads when the page becomes active
  • prefetch: page data loads in the background after the active page settles
  • eager: page data loads during the main refresh pass even while inactive

Reference samples: