Bundled plugins

Reference for every plugin the oracle runtime ships with — toggle each one through the features map, set its env vars, and ship to production.

The runtime bundles 16 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
vfsalwaysOn— (URLs from NETWORK)
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

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
});