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 aSubstrateState 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
EverySubstrateState 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 anActionSchema that tells your agent exactly what the action does, what parameters it requires, and what safety tier it belongs to.
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.read — No state change
read — No state change
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_documentreversible_write — Undoable change
reversible_write — Undoable change
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_draftirreversible_write — Permanent change
irreversible_write — Permanent change
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:- 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.
- 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.
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 standardAttachAPI, 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.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.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
ASession 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
Theaxon-daemon.exe binary includes a built-in CLI for managing the daemon process and its Windows Service registration.
