Skip to main content
The runtime bundles 15 plugins that load by default; opt out per plugin via the features map on createOracleApp. One additional plugin — flows — ships in the package but is opt-in only: wire it in explicitly via the plugins array.

At a glance

NameVisibilityDefault stateRequired envDepends on
memoryalwaysAuto-detectMEMORY_MCP_URL, MEMORY_ENGINE_URL
portalon-demandOn
firecrawlon-demandAuto-detectFIRECRAWL_MCP_URL
domain-indexeralwaysOn
composioon-demandAuto-detectCOMPOSIO_API_KEY
sandboxalwaysAuto-detectSANDBOX_MCP_URL
skillsalwaysOnsandbox
editoralwaysOn
aguion-demandOn
slacksilentAuto-detectSLACK_BOT_OAUTH_TOKEN
taskson-demandAuto-detectREDIS_URL
creditssilentOn unless DISABLE_CREDITS=true
callssilentOn (stub)
user-preferencesalwaysOn
matrix-group-chatson-demandOn
flowson-demandOpt-in (not bundled)editor Qi Flow engine
Default state legend:
  • On — loaded by default; opt out with features: { name: false }.
  • Auto-detect — loaded when its env var is set; opt in by setting it, force on with features: { name: true }, force off with false.
  • (stub) — placeholder entry in BUNDLED_PLUGINS so feature toggles work; full implementation deferred.

How to use features

const app = await createOracleApp({
  config,
  features: {
    composio: false,            // never load even if COMPOSIO_API_KEY is set
    slack: true,                // force load even if SLACK_BOT_OAUTH_TOKEN is missing (will fail env validation)
    'domain-indexer': 'auto',   // explicit auto (same as omitting)
  },
});
true forces on, false forces off, 'auto' runs the plugin’s autoDetect callback. Omitted keys default to 'auto'.

Browse

memory

Durable memory across conversations.

portal

Browser-side actions on the user’s Portal UI.

firecrawl

Web search and human-readable page scraping.

domain-indexer

IXO entity lookup — orgs, projects, DAOs, DIDs.

composio

SaaS tool catalog (Gmail, GitHub, Linear, …).

sandbox

Per-user Linux box for code execution.

skills

IXO skill capsule discovery.

editor

Read and edit BlockNote workspace pages.

agui

Render interactive UI components in the browser.

slack

Slack bot transport.

tasks

Schedule the agent to run on time-based triggers, in the background.

credits

Per-user credit enforcement and claim settlement.

calls

LiveKit call integration (stub — deferred).

user-preferences

Tone / format / language preferences.

matrix-group-chats

Gate the bot + per-room compacted memory for Matrix group rooms.

flows

Author and inspect multi-step Qi Flow templates (opt-in).

Wiring custom-constructed plugins

Some plugins accept constructor args. Pass a custom instance via the plugins array — the loader dedupes by name, so your instance overrides the bundled default. credits genuinely needs a Redis client. Without one the enforcement middleware loads in pass-through mode and the settlement cron is skipped, so production must construct it explicitly:
import { createOracleApp, CreditsPlugin } from '@ixo/oracle-runtime';
import Redis from 'ioredis';

const redis = new Redis(process.env.REDIS_URL!);

const app = await createOracleApp({
  config,
  plugins: [new CreditsPlugin({ redis, network: 'devnet' })],
});
editor works from env on its own. The bundled editorPlugin is fully functional: when no matrixClient is passed it lazily builds an internal Matrix client from the MATRIX_* admin env vars. Pass matrixClient only to reuse a client your app already keeps synced:
import { createOracleApp, EditorPlugin } from '@ixo/oracle-runtime';
import * as sdk from 'matrix-js-sdk';

const matrixClient = sdk.createClient({ /* ... */ });

const app = await createOracleApp({
  config,
  plugins: [new EditorPlugin({ matrixClient })], // optional — env fallback otherwise
});

Plugin vs Skill

Why skills + sandbox are paired in the catalog.

Using bundled plugins

features patterns in depth.

Environment variables

All env vars in one table.

Manifest schema

Every field a plugin manifest declares.