Skip to main content
NSP organizes everything around a single idea: every running application is a substrate — a live, addressable source of typed data that your agent can read and write in real time. Understanding the three components of the substrate model, and the safety guarantees built into the action system, is the foundation for building reliable agents with NSP.

The Substrate Model

The substrate model has three components that work together on every state capture.

State

A typed JSON snapshot of the application’s current data, normalized to the Substrate Schema Format (SSF). State is read on demand or streamed continuously via WebSocket.

Actions

Typed function signatures discovered from the runtime that your agent can invoke directly — no UI interaction, no pixel coordinates, no simulated keystrokes.

Schema

A persistent, versioned registry of discovered state structures and action mappings. The schema is stored in SQLite and survives daemon restarts, so cold-start times improve over time.

SubstrateState (SSF)

Every application’s state is represented as a SubstrateState object in the Substrate Schema Format (SSF). This is the core data structure that every NSP endpoint returns and every SDK method operates on.

Key Fields

Confidence Score

Every SubstrateState carries a confidence field between 0.0 and 1.0 that represents how certain the probe is in its semantic labels. NSP uses this score to gate which actions your agent is allowed to execute — preventing writes on partially-understood state. Once a probe has run through its warm-up cycle, you can expect these confidence baselines by runtime:

Action Schema

Every action available on a substrate is described by an ActionSchema that tells your agent exactly what the action does, what parameters it requires, and what safety tier it belongs to.
The signature field uses a simple function notation so LLM-based agents can parse it without additional tooling. The confidence on an action schema reflects how certain the probe is that the action binding is correct — distinct from the state-level confidence.

Reversibility

Every action is classified into one of three reversibility tiers. This is a safety contract enforced by the daemon and the SDK — not an advisory label. The tier determines what confidence level is required before NSP will dispatch the action.
The action reads data without modifying anything in the application. There is no confidence gate for read actions — they are safe to call at any time, even during probe warm-up.Examples: get_thread, search, list_contacts, read_document
The action modifies application state, but the change can be undone by the user or by a subsequent action.Requires: confidence >= 0.80Examples: archive, label, move_to_folder, mark_read, star, create_draft
The action causes a permanent side effect that cannot be undone — sending a message, making a purchase, deleting data permanently.Requires: confidence >= 0.95 AND verify=True with a verify_expressionExamples: send_reply, delete_permanently, purchase, submit_form, send_messageThe SDK automatically enforces the verification requirement. Calling an irreversible action without it raises an error:

Runtime Probes

NSP supports three managed runtimes, each using a purpose-built probe. From your agent’s perspective, all three produce the same SSF JSON — the differences are internal.

V8 / JavaScript

The V8 probe connects to any running Chrome or Electron process via the Chrome DevTools Protocol (CDP) on the remote debugging port you configure at launch. State extraction uses a two-tier approach:
  1. ASO Fast-Path (primary) — Injects a lightweight JavaScript snippet that reads the application’s data model from the V8 heap directly. Returns in 5–50ms and is used for all normal poll cycles.
  2. Heap Snapshot Fallback — When the ASO fast-path is unavailable, the probe takes a full V8 heap snapshot, parses its flat node/edge format, filters runtime internals, and normalizes the result to SSF. This path takes approximately 47 seconds and is only used during initial schema discovery.
Supported applications: Gmail, Slack, VS Code, Notion, GitHub Desktop, Salesforce, WhatsApp Desktop, Discord, Shopify, HubSpot, and any Electron-based app.

JVM / Java

The JVM probe uses the JVMTI (JVM Tool Interface) to attach to a running Java process without modifying it. It loads a native JVMTI agent via the standard AttachAPI, uses JNI reflection to enumerate classes and read live field values, then converts Java objects to SSF JSON using type metadata from class files. Supported applications: SAP ERP, Eclipse, IntelliJ IDEA, Jenkins, Elasticsearch, ArduPilot GCS (Java build).

CLR / .NET

The CLR probe uses a Memory-Mapped File (MMF) channel to communicate with a managed bootstrapper injected into the target process. It injects the bootstrapper DLL using the Windows CLR Hosting API, then the managed bridge walks the CLR heap using reflection-style APIs to read field values and method return values across the MMF channel. Supported applications: Mission Planner, WinForms and WPF apps, Visual Studio, Microsoft Office, and any .NET 4.x or .NET 6+ application.
Support for native C/C++ applications without a managed runtime is coming next month.

App Lifecycle

When you start an application, NSP moves it through a predictable lifecycle before your agent can read its state. Understanding this sequence helps you handle the initial warm-up period in your agent code.
The cold probe time (3–90 seconds) only applies the first time NSP encounters a given application. After the schema is persisted to the registry, subsequent attachments are much faster.

State Object Keys

NSP uses dot-notation flat keys for all state objects rather than nested JSON. This design lets your agent reference any specific value with a single precise string, and makes it straightforward for LLM-based agents to construct key references from natural language.
Keys are stable across poll cycles — the same key will always refer to the same semantic concept for a given app and schema version. If the underlying application updates and the schema changes, NSP increments the schema_version field so your agent can detect and adapt to the change.

Python SDK Reference

The Python SDK (pip install nelieo-nsp) provides typed, async-friendly wrappers around all daemon endpoints. The two primary classes are NSPClient and Session.

NSPClient

NSPClient is the top-level entry point. Use it as an async context manager so the underlying HTTP connection is properly closed on exit.

Session

A Session is a live handle to one tracked application. It caches the most recently fetched SubstrateState and provides typed helpers for reading values and executing actions.

CLI Reference

The axon-daemon.exe binary includes a built-in CLI for managing the daemon process and its Windows Service registration.