Skip to content

Advanced runtime blocks

This is an extension-author and operator reference. Personal onboarding chooses recommended runtime defaults and does not expose these registries.

Everything in moxxy resolves through a registry. Fifteen kinds, each with a protected floor a plugin can add to but never shadow.

sh
moxxy plugins defaults            # what each kind resolved to
moxxy plugins use <kind> <name>   # change one

Use moxxy onboard --advanced when you deliberately want runtime and channel configuration. Default moxxy onboard only connects a model account.

The kinds

KindDecidesFloorAlso ships
providerwhich model answersanthropicopenai, openai-codex, claude-code, google, xai, zai, local, plus any OpenAI-compatible endpoint
modethe shape of the loopdefaultgoal, research, collaborative
compactorwhat happens to old turnssummarize-old-turnsbring your own
cacheStrategywhere cache breakpoints landstable-prefixnone
isolatorthe boundary a tool runs inside— (off)none, inproc, worker, subprocess, wasm
eventStorewhere the log is writtenjsonlbring your own
auditSinkwhere the receipt goeslocalbring your own
reflectorwhat carries between turnsdefaultbring your own
transcriberspeech inwhisper, whisper-codex, local
synthesizerspeech outopenai, elevenlabs, local
embedderhow memory is vectorisedtfidfopenai, transformers
workflowExecutorhow a DAG is walkedbuilt-inbring your own
viewRendererhow an authored view is drawnbuilt-inbring your own
tunnelProviderhow a listener gets a public URLproxybring your own
channelthe surface driving a sessiontuiten more

A dash in the floor column means the kind has no default registration. Nothing is registered for transcriber until you install one, which is why onboarding drops the category entirely rather than showing "(none)" and inviting a question you cannot act on yet.

What "protected floor" buys you

Registering is not activating.

  • A discovered plugin adds its implementation to the registry.
  • It cannot replace the floor.
  • Making it active is always an explicit setActive, a command, or a config key.
  • Removing a non-floor entry reverts to the floor, never to nothing.

The consequence worth stating plainly: installing a plugin is safe to try. The worst case is an agent that ignores it, not one whose spine changed underneath you.

auditSink takes this one step further. A discovered sink is registered but never auto-activated even if it is the only one, because a sink's whole purpose is to send recorded actions elsewhere and silent adoption would be an exfiltration path.

Changing one

Most kinds are a command:

sh
moxxy plugins use provider openai
moxxy plugins use mode goal
moxxy plugins use embedder openai

isolator and channel are persist-only — their active value is not a live session slot — so they apply on the next boot and are set in config:

yaml
plugins:
  isolator:
    default: subprocess

And a few carry their own configuration block:

yaml
audit:
  enabled: true
  sink: siem

Under policy

Any of these can be pinned by an operator so a user cannot change it:

yaml
plugins:
  isolator:
    default: subprocess
locked:
  - plugins.isolator

See policy and locked config.

Writing one

Each kind has a define* factory in @moxxy/sdk, and a plugin contributes an array of them:

ts
import { defineCompactor, definePlugin } from '@moxxy/sdk';

export const dropOldest = defineCompactor({
  name: 'drop-oldest',
  async compact(ctx) { /* … */ },
});

export default definePlugin({
  name: '@acme/compactor-drop-oldest',
  version: '1.0.0',
  compactors: [dropOldest],
});

See authoring a plugin for discovery, requirements and packaging.

Next

Open source · self-hosted · MIT