Skip to main content
Aether exposes a discoverable service registry that your extension can query and call at runtime. You can invoke built-in services such as skills directly from any extension, and — when writing a Native Mod — register higher-priority implementations that replace the defaults entirely.

API reference

Listing available services

Call services.list() to retrieve the full catalog of registered services:

Describing a service

Call services.describe() with a service ID to inspect its available methods and metadata:

Built-in services

skills service

The skills service exposes Aether’s native Skill selection state.
MethodArgumentsDescription
listReturns all installed Skills
getSelectionReturns currently selected Skill IDs
setSelection{ ids, scope, session_id? }Set the full selection
setSelected{ skill_id, selected, scope, session_id? }Toggle a single Skill
Scope values: "current", "default" / "global", "both" / "current_and_default". Using "both" updates the current session selection and the default selection independently.

state service

The state service provides direct read and transactional write access to Aether’s application state.
MethodArgumentsDescription
get{ path }Read state at path
transaction{ operations }Apply state mutations

Priority system

Services are priority-ordered. The active implementation for a given service ID is always the highest-priority registration. When you remove a registration, the next-highest-priority implementation becomes active. Aether’s core services intentionally use a low priority, so a Native Mod registering the same service ID at the default Native Mod priority will seamlessly override the built-in behavior.
Script Mods can call any registered service using aether.services.invoke(), but they cannot register new service implementations. To override a built-in service or add a new one, you must use a Native Mod.