Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 19 additions & 18 deletions build-an-oracle/develop/enable-bundled-plugins.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Enable bundled plugins"
description: "Toggle the 16 bundled QiForge plugins via the features map — opt out, force on, or let auto-detect handle it — and retune their manifests."
description: "Toggle the 14 bundled QiForge plugins via the features map — opt out, force on, or let auto-detect handle it — and retune their manifests."
icon: "boxes-stacked"
---

Expand All @@ -16,7 +16,7 @@
config,
features: {
composio: true, // force on (set COMPOSIO_API_KEY)
slack: false, // force off
'matrix-group-chats': false, // force off
firecrawl: 'auto', // same as omitting — runs autoDetect
},
plugins: [], // your own plugins go here
Expand All @@ -31,9 +31,9 @@

<Steps>
<Step title="The runtime starts with the bundled list">
[`BUNDLED_PLUGINS`](https://github.com/ixoworld/ixo-oracles-boilerplate/blob/main/packages/oracle-runtime/src/plugins/index.ts) is a fixed 16-plugin tuple — memory, portal, firecrawl, domain-indexer, composio, sandbox, skills, editor, agui, slack, tasks, credits, calls, user-preferences, matrix-group-chats, vfs.
[`BUNDLED_PLUGINS`](https://github.com/ixoworld/ixo-oracles-boilerplate/blob/main/packages/oracle-runtime/src/plugins/index.ts) is a fixed 14-plugin tuple — memory, portal, firecrawl, domain-indexer, composio, sandbox, skills, editor, agui, tasks, user-preferences, matrix-group-chats, vfs, oracle-payments.

Check warning on line 34 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L34

Did you really mean 'firecrawl'?

Check warning on line 34 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L34

Did you really mean 'composio'?

Check warning on line 34 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L34

Did you really mean 'agui'?

Check warning on line 34 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L34

Did you really mean 'vfs'?

You do not import or instantiate the plugins you want at defaults — they are already there.
You do not import or instantiate the plugins you want at defaults — they are already there. `credits`, `slack`, `calls`, and `flows` are **not** in the tuple: `features` never reaches them, so you construct each one and pass it in [`plugins`](#plugins-that-are-not-bundled).
</Step>

<Step title="Each plugin gets a feature decision">
Expand All @@ -53,11 +53,11 @@
</Step>

<Step title="Your own plugins are added next">
Plugins from the `plugins: []` array are always loaded — they're not gated by `features`. If a name collides with a bundled plugin, your instance wins (the loader dedupes by `name`).

Check warning on line 56 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L56

Did you really mean 'dedupes'?
</Step>

<Step title="Hard-dep cascades resolve transitively">
If a loaded plugin has `dependsOn: ['removed-plugin']` and that dep ended up excluded, the dependent cascades off too. Soft deps (`softDependsOn`) only log a warning.

Check warning on line 60 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L60

Did you really mean 'deps'?
</Step>
</Steps>

Expand All @@ -70,19 +70,17 @@
| `memory` | `MEMORY_MCP_URL` set | Visibility `always` |
| `portal` | always on | Visibility `on-demand` |
| `firecrawl` | `FIRECRAWL_MCP_URL` set | Visibility `on-demand` |
| `domain-indexer` | always on | Visibility `always` |
| `domain-indexer` | always on | Visibility `on-demand` |
| `composio` | `COMPOSIO_API_KEY` set | Visibility `on-demand` |
| `sandbox` | `SANDBOX_MCP_URL` set | Visibility `always` |
| `skills` | always on | Visibility `always`; depends on `sandbox` |
| `editor` | always on | Needs `matrixClient` — instantiate explicitly |
| `editor` | always on | Visibility `on-demand` — auto-loaded whenever the request carries an active editor session (`editorRoomId`/`spaceId`), no `load_capability` step needed. Needs `matrixClient` — instantiate explicitly |
| `agui` | always on | Visibility `on-demand` |
| `slack` | `SLACK_BOT_OAUTH_TOKEN` set | Visibility `silent` (transport) |
| `tasks` | `REDIS_URL` set | Visibility `on-demand`; BullMQ-backed async tasks (needs `REDIS_URL`) |
| `credits` | always on | Visibility `silent`; pass `redis` for production |
| `calls` | always on | Visibility `silent`; placeholder stub (no tools yet) |
| `user-preferences` | always on | Visibility `always` |
| `matrix-group-chats` | always on | Visibility `on-demand`; gating middleware + tools fire only in Matrix group rooms (`memberCount > 2`) |
| `vfs` | always on | Visibility `always`; worker URLs derived from `NETWORK`. Contributes tools only when the oracle has a UCAN signing key and the user granted filesystem access |
| `vfs` | always on | Visibility `on-demand`, except `vfs_search` + `vfs_read` which are per-tool `always` so file recall needs no load step. Worker URLs derived from `NETWORK`. Contributes tools only when the oracle has a UCAN signing key and the user granted filesystem access |
| `oracle-payments` | unless `ORACLE_PAYMENTS_DISABLED=true` | Visibility `always`; Matrix-only commerce lane. A no-op until the oracle publishes an Agent Card, and paid work needs `EVAL_ENGINE_URL` |

Full per-plugin env vars: [plugin catalog](/build-an-oracle/reference/bundled-plugins/overview) and [environment variables reference](/build-an-oracle/reference/environment-variables).

Expand Down Expand Up @@ -136,9 +134,11 @@
</Step>
</Steps>

## Plugins that need constructor args
## Plugins that are not bundled

Two bundled plugins take a live runtime object you provide — instantiate explicitly and pass them via `plugins`:
`credits`, `slack`, `calls`, and `flows` ship inside `@ixo/oracle-runtime` but are absent from `BUNDLED_PLUGINS`, so `features` never reaches them. Load one by constructing it and passing it in `plugins` — anything in that array loads unconditionally.

The same array is how you replace a bundled plugin with a custom-constructed instance (the loader dedupes by `name`, and yours wins). `editor` is the usual case: the bundled instance builds its own Matrix client from the `MATRIX_*` admin env vars, so pass `matrixClient` only to reuse a client your app already keeps synced.

Check warning on line 141 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L141

Did you really mean 'dedupes'?

```ts
import { createOracleApp, EditorPlugin, CreditsPlugin } from '@ixo/oracle-runtime';
Expand All @@ -156,16 +156,16 @@
const app = await createOracleApp({
config,
plugins: [
new EditorPlugin({ matrixClient }),
...(redis ? [new CreditsPlugin({ redis, network: 'devnet' })] : []),
new EditorPlugin({ matrixClient }), // overrides the bundled instance
...(redis ? [new CreditsPlugin({ redis, network: 'devnet' })] : []), // not bundled — this is the only way it loads
],
});
```

Live example: [apps/qiforge-example/src/main.ts](https://github.com/ixoworld/ixo-oracles-boilerplate/blob/main/apps/qiforge-example/src/main.ts).

<Note>
The bundled `editorPlugin` and `creditsPlugin` instances boot in stub form (for testing). For production behaviour, instantiate them yourself and pass the live objects in.
`credits` without a Redis client loads in pass-through mode and skips the settlement cron. Since it is also where LLM token metering lives, an oracle that never wires it has no metering at all.

Check warning on line 168 in build-an-oracle/develop/enable-bundled-plugins.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/enable-bundled-plugins.mdx#L168

Did you really mean 'cron'?
</Note>

## Retune a bundled plugin's manifest
Expand All @@ -176,8 +176,9 @@
const app = await createOracleApp({
config,
manifestOverrides: {
// Take a noisy `always` bundled plugin out of the Tier-1 prompt.
'domain-indexer': { visibility: 'on-demand' },
// Promote an `on-demand` bundled plugin into the Tier-1 prompt so the
// agent sees it without a `load_capability` step.
'domain-indexer': { visibility: 'always' },
// Hide a transport plugin entirely; its tools still bind.
portal: { visibility: 'silent' },
},
Expand All @@ -196,7 +197,7 @@
// loaded: ['memory', 'domain-indexer', 'editor', 'user-preferences', 'weather'],
// excluded: [
// { plugin: 'composio', reason: 'auto-detect precondition not met (COMPOSIO_API_KEY)' },
// { plugin: 'slack', reason: 'feature flag set to false' },
// { plugin: 'tasks', reason: 'feature flag set to false' },
// ],
// softDepGaps: [],
// }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Add config and env vars"
description: "Declare your plugin's env vars with a Zod configSchema; read typed values from ctx.config."

Check warning on line 3 in build-an-oracle/develop/plugin-recipes/add-config-and-env.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/plugin-recipes/add-config-and-env.mdx#L3

Did you really mean 'Zod'?

Check warning on line 3 in build-an-oracle/develop/plugin-recipes/add-config-and-env.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/plugin-recipes/add-config-and-env.mdx#L3

Did you really mean 'configSchema'?
icon: "key"
---

Expand Down Expand Up @@ -70,7 +70,7 @@
config,
features: {
weather: true, // force on, skip autoDetect
slack: false, // force off
tasks: false, // force off
composio: 'auto', // explicit auto (the default)
},
});
Expand All @@ -92,7 +92,7 @@

<CardGroup cols={2}>
<Card title="Enable bundled plugins" icon="boxes-stacked" href="/build-an-oracle/develop/enable-bundled-plugins">
Features map, autoDetect, and the bundled set's defaults.

Check warning on line 95 in build-an-oracle/develop/plugin-recipes/add-config-and-env.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/plugin-recipes/add-config-and-env.mdx#L95

Did you really mean 'autoDetect'?
</Card>
<Card title="Environment variables reference" icon="key" href="/build-an-oracle/reference/environment-variables">
Every base var and per-plugin var.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "Declare dependencies"
description: "Use dependsOn for hard requirements (fails boot if missing) and softDependsOn for optional enrichment."

Check warning on line 3 in build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx#L3

Did you really mean 'dependsOn'?
icon: "link"
---

Expand All @@ -8,7 +8,7 @@

<Steps>
<Step title="Declare hard dependencies via dependsOn">
Use this when the plugin literally cannot function without the other. The runtime topologically sorts plugins by `dependsOn` and aborts boot on missing deps or cycles.

Check warning on line 11 in build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx#L11

Did you really mean 'deps'?

```ts
import { OraclePlugin } from '@ixo/oracle-runtime';
Expand Down Expand Up @@ -70,7 +70,7 @@
features: {
sandbox: true, // force on
skills: 'auto', // load when its autoDetect (and deps) pass
slack: false, // force off
firecrawl: false, // force off
},
});
```
Expand All @@ -82,8 +82,8 @@
## What to know before shipping

- Names are kebab-case plugin identifiers, not titles. `'memory'`, not `'Memory'`.
- The topo sort order drives middleware ordering and tool ordering in the prompt — encode ordering via `dependsOn` when it matters.

Check warning on line 85 in build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx#L85

Did you really mean 'topo'?
- Cycles in `dependsOn` fail boot with a clear error. Soft deps don't participate in the cycle check.

Check warning on line 86 in build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/develop/plugin-recipes/declare-dependencies.mdx#L86

Did you really mean 'deps'?
- Dependencies don't introspect what the other plugin contributes — only that it loaded. Check for specific tools at request time.
- There's no version constraint and no late-arriving plugins. Plugin resolution is a single boot-time step.

Expand Down
13 changes: 7 additions & 6 deletions build-an-oracle/for-ai-agents.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@

This page is for AI tools (Cursor, Claude Code, Codex, …) scaffolding a QiForge oracle. Humans should read [Quickstart](/build-an-oracle/quickstart) and [Build a plugin](/build-an-oracle/develop/write-a-plugin) instead.

If you are an AI agent: read top-to-bottom once. Every signature you need is inlined. Source paths cite the canonical files on the QiForge runtime ([`packages/oracle-runtime`](https://github.com/ixoworld/ixo-oracles-boilerplate/tree/main/packages/oracle-runtime)) and the reference oracle ([`apps/qiforge-example`](https://github.com/ixoworld/ixo-oracles-boilerplate/tree/main/apps/qiforge-example)).

Check warning on line 9 in build-an-oracle/for-ai-agents.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/for-ai-agents.mdx#L9

Did you really mean 'inlined'?

<Note>
**If you are working inside a scaffolded oracle project** (one created with `qiforge-cli new`), there is already a Claude Code skill at `.claude/skills/qiforge-oracle/SKILL.md` with project-local guidance: adding plugins, adding tools, wiring env, writing tests with `createTestRuntime`. Load it first — it carries denser, scenario-specific references than this page.

Check warning on line 12 in build-an-oracle/for-ai-agents.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/for-ai-agents.mdx#L12

Did you really mean 'scaffolded'?
</Note>

## TL;DR — what you produce

A QiForge oracle is **one `main.ts`** that calls `createOracleApp({ config, plugins, … })` plus **one folder per plugin** under `src/plugins/<name>/`. The runtime handles HTTP, auth, the agent graph, the checkpointer, Matrix, and bundles 16 plugins by default. You ship glue code, not infrastructure.
A QiForge oracle is **one `main.ts`** that calls `createOracleApp({ config, plugins, … })` plus **one folder per plugin** under `src/plugins/<name>/`. The runtime handles HTTP, auth, the agent graph, the checkpointer, Matrix, and bundles 14 plugins by default. You ship glue code, not infrastructure.

Check warning on line 17 in build-an-oracle/for-ai-agents.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/for-ai-agents.mdx#L17

Did you really mean 'checkpointer'?

## main.ts shape

Expand Down Expand Up @@ -180,7 +180,7 @@

`silent` means *not advertised* — the tools are still bound and the agent can call them; they're just kept out of the Tier-1 prompt and `list_capabilities`. It is not a security boundary.

## Bundled plugins (15)
## Bundled plugins (14)

From [`packages/oracle-runtime/src/plugins/index.ts`](https://github.com/ixoworld/ixo-oracles-boilerplate/blob/main/packages/oracle-runtime/src/plugins/index.ts):

Expand All @@ -195,22 +195,23 @@
| `skills` | always | on (needs `sandbox`) | — |
| `editor` | on-demand | on (needs Matrix) | — |
| `agui` | on-demand | on | — |
| `slack` | silent | auto-detect | `SLACK_BOT_OAUTH_TOKEN` |
| `tasks` | on-demand | auto-detect | `REDIS_URL` |
| `credits` | silent | on unless `DISABLE_CREDITS=true` | — |
| `calls` | silent | on (placeholder stub — no tools) | — |
| `user-preferences` | always | on | — |
| `matrix-group-chats` | on-demand | on (opt out via `features`) | — (optional `CHANNEL_MEMORY_*`) |
| `vfs` | always | on | — (worker URLs from `NETWORK`) |
| `oracle-payments` | always | on unless `ORACLE_PAYMENTS_DISABLED=true` | — (`EVAL_ENGINE_URL` for the paid lane) |

Toggle via `features` in `createOracleApp`: `true` forces on, `false` forces off, `'auto'` runs `autoDetect`.

**Not in `BUNDLED_PLUGINS`** — these ship in the package but `features` never reaches them; construct each one and pass it in `plugins`: `credits` (`new CreditsPlugin({ redis, network })` — also where LLM token metering lives), `slack` (`new SlackPlugin()`), `calls` (stub), `flows` (`new FlowsPlugin({ matrixClient })`).

Per-plugin reference pages: [`/build-an-oracle/reference/bundled-plugins/overview`](/build-an-oracle/reference/bundled-plugins/overview).

## Core (Tier-0) env vars

From [`packages/oracle-runtime/src/config/base-env-schema.ts`](https://github.com/ixoworld/ixo-oracles-boilerplate/blob/main/packages/oracle-runtime/src/config/base-env-schema.ts):

These are the exact names the runtime validates — set them character-for-character or the boot-time Zod check fails.

Check warning on line 214 in build-an-oracle/for-ai-agents.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/for-ai-agents.mdx#L214

Did you really mean 'Zod'?

| Var | Required | Description |
| --- | --- | --- |
Expand All @@ -220,15 +221,15 @@
| `ORACLE_ENTITY_DID` | yes | The oracle's on-chain entity DID (`did:ixo:entity:...`). |
| `SECP_MNEMONIC` | yes | Wallet mnemonic used to sign UCAN invocations to downstream services. |
| `RPC_URL` | yes | IXO chain RPC endpoint. |
| `BLOCKSYNC_GRAPHQL_URL` | yes | Blocksync GraphQL endpoint (UCAN validation reads it). |

Check warning on line 224 in build-an-oracle/for-ai-agents.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/for-ai-agents.mdx#L224

Did you really mean 'Blocksync'?
| `MATRIX_BASE_URL` | yes | Matrix homeserver URL. |

Check warning on line 225 in build-an-oracle/for-ai-agents.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/for-ai-agents.mdx#L225

Did you really mean 'homeserver'?
| `MATRIX_RECOVERY_PHRASE` | yes | Recovery phrase for the oracle's Matrix encryption. |
| `MATRIX_ORACLE_ADMIN_USER_ID` | yes | Matrix user ID the bot logs in as. |
| `MATRIX_ORACLE_ADMIN_PASSWORD` | yes | Matrix bot password. |
| `MATRIX_ORACLE_ADMIN_ACCESS_TOKEN` | yes | Matrix bot access token. |
| `MATRIX_ACCOUNT_ROOM_ID` | yes | Oracle's Matrix account room (holds signing key + secrets). |
| `MATRIX_VALUE_PIN` | yes | PIN for the oracle's Matrix value store / vault. |
| `SQLITE_DATABASE_PATH` | yes | Path for the per-user SQLite checkpointer DB. |

Check warning on line 232 in build-an-oracle/for-ai-agents.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/for-ai-agents.mdx#L232

Did you really mean 'checkpointer'?
| `LLM_PROVIDER` | optional | `openrouter` (default) \| `nebius`. Selects the per-role model map. |
| `OPEN_ROUTER_API_KEY` | conditional | Required when `LLM_PROVIDER=openrouter` (the default). |
| `NEBIUS_API_KEY` | conditional | Required when `LLM_PROVIDER=nebius`. |
Expand All @@ -245,7 +246,7 @@
| `LANGSMITH_PROJECT` | optional | LangSmith project name. |
| `LANGSMITH_ENDPOINT` | optional | LangSmith endpoint override. |

There is no `ANTHROPIC_API_KEY` — the agent's model id is fixed per role in the provider model map; switch the provider with `LLM_PROVIDER` + its key, or override the main model via the `resolveModel` hook. Plugin-specific env vars (`MEMORY_MCP_URL`, `FIRECRAWL_MCP_URL`, `SANDBOX_MCP_URL`, `COMPOSIO_API_KEY`, `SLACK_BOT_OAUTH_TOKEN`, `REDIS_URL`, …) merge in via each plugin's `configSchema`.
There is no `ANTHROPIC_API_KEY` — the agent's model id is fixed per role in the provider model map; switch the provider with `LLM_PROVIDER` + its key, or override the main model via the `resolveModel` hook. Plugin-specific env vars (`MEMORY_MCP_URL`, `FIRECRAWL_MCP_URL`, `SANDBOX_MCP_URL`, `COMPOSIO_API_KEY`, `REDIS_URL`, `EVAL_ENGINE_URL`, `AGENT_CARD_PATH`, …) merge in via each plugin's `configSchema`.

## Copy-pasteable plugin template

Expand Down
4 changes: 2 additions & 2 deletions build-an-oracle/index.mdx
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
---
title: "Build an Oracle"
description: "QiForge is the framework for shipping Agentic Oracles — governed AI evaluators and workflow actors with verifiable identity, encrypted per-user storage, and a plugin runtime you wire up in ~30 lines of TypeScript."

Check warning on line 3 in build-an-oracle/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/index.mdx#L3

Did you really mean 'Agentic'?
icon: "compass"
---

An **Agentic Oracle** is a governed AI evaluator and workflow actor. It performs **P-Functions** over verifiable state—turning claims, evidence, models, and context into accountable intelligence: typed facts, predictions, recommendations, attestations, determinations, risk signals, compliance checks, payment triggers, and permitted workflow actions.

Check warning on line 7 in build-an-oracle/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/index.mdx#L7

Did you really mean 'Agentic'?

Unlike a generic AI agent, an oracle is identity-bound, authority-scoped, evidence-grounded, protocol-governed, and audit-producing. Unlike a blockchain or data oracle, it does not merely relay information; it evaluates what information means, which rules apply, which actions are allowed, and what proof must be left behind.

Check warning on line 9 in build-an-oracle/index.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/index.mdx#L9

Did you really mean 'blockchain'?

**QiForge** ships the runtime for that pattern: verifiable identity (IXO entity DID), UCAN delegation, encrypted per-user Matrix storage, and typed plugins ([`@ixo/oracle-runtime`](https://github.com/ixoworld/ixo-oracles-boilerplate/tree/main/packages/oracle-runtime)). Your oracle is a `main.ts` plus the plugins you want. For the full concept model, see [Agentic Oracles](/articles/agentic-oracles).

Expand Down Expand Up @@ -38,8 +38,8 @@
<Card title="A LangGraph agent" icon="diagram-project">
Per-request agent build, dynamic tool loading via meta-tools, four always-on middleware (capability gating, tool validation, repetition guard, retry).
</Card>
<Card title="16 bundled plugins" icon="boxes-stacked">
`memory`, `skills`, `sandbox`, `portal`, `firecrawl`, `composio`, `editor`, `agui`, `slack`, `credits`, `user-preferences`, and more — toggle them via the `features` map.
<Card title="14 bundled plugins" icon="boxes-stacked">
`memory`, `skills`, `sandbox`, `portal`, `firecrawl`, `composio`, `editor`, `agui`, `vfs`, `oracle-payments`, `user-preferences`, and more — toggle them via the `features` map.
</Card>
<Card title="A plugin API for your code" icon="puzzle-piece">
9 typed hooks let your plugin contribute tools, sub-agents, middleware, HTTP routes, shared state, and env vars. Boot-time and per-request flavours.
Expand Down
4 changes: 2 additions & 2 deletions build-an-oracle/quickstart.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

A live oracle on `localhost:3000` with:

- The 16 bundled plugins resolved at boot.
- The 14 bundled plugins resolved at boot.
- A custom Weather plugin loading on demand.
- A `GET /weather/now?city=X` public HTTP route.
- A streaming chat endpoint over SSE.
Expand Down Expand Up @@ -183,7 +183,7 @@

| You saw | What it proves |
| --- | --- |
| Boot log listing plugins | Loader + topo sort + manifest validation worked. |

Check warning on line 186 in build-an-oracle/quickstart.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/quickstart.mdx#L186

Did you really mean 'topo'?
| `excluded plugins:` line with reasons | Env-driven opt-in (`autoDetect`) is wired correctly. |
| `GET /weather/now` returning JSON | Plugin Nest modules mount + auth exclusions apply. |
| Agent calling `load_capability` then `get_current_weather` | Dynamic discovery and `loadedPlugins` state work end-to-end. |
Expand All @@ -202,10 +202,10 @@
Every option you can pass — config, plugins, features, hooks.
</Card>
<Card title="Bundled plugins" icon="boxes-stacked" href="/build-an-oracle/reference/bundled-plugins/overview">
The 16 plugins shipped with the runtime.
The 14 plugins that load by default, plus the four you wire in yourself.
</Card>
<Card title="For AI agents" icon="robot" href="/build-an-oracle/for-ai-agents">
Dense one-pager with every signature inlined.

Check warning on line 208 in build-an-oracle/quickstart.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/quickstart.mdx#L208

Did you really mean 'inlined'?
</Card>
<Card title="Understand the model" icon="lightbulb" href="/build-an-oracle/understand/what-is-qiforge">
Optional. The mental model, runtime layers, plugins vs skills.
Expand Down
15 changes: 3 additions & 12 deletions build-an-oracle/reference/bundled-plugins/calls.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,15 @@ icon: "phone"
| Version | `0.0.0` |
| Visibility | `silent` |
| Stability | `experimental` |
| Default state | Loaded by default (stub — contributes nothing) |
| Default state | Opt-in — not in `BUNDLED_PLUGINS` (stub — contributes nothing) |

<Warning>
`calls` is a **placeholder stub**, not a shipped feature. It is the only bundled entry created via `stub('calls', 'Calls')` in `plugins/index.ts` — version `0.0.0`, no tools, no sub-agents, no middleware, no Nest modules. Don't rely on it.
`calls` is a **placeholder stub**, not a shipped feature. It is created via `stub('calls', 'Calls')` in `plugins/index.ts` — version `0.0.0`, no tools, no sub-agents, no middleware, no Nest modules. Don't rely on it.
</Warning>

## Status: deferred

`calls` exists in `BUNDLED_PLUGINS` only so the `features` toggle key resolves. Because it declares no `autoDetect`, the loader loads it by default — but it contributes nothing, so loading it has no effect. The legacy `apps/app` codebase had a `@Controller('calls')` for LiveKit integration; the `getNestModules` API hook would technically unblock a real implementation. Deferred for now.

It contributes nothing, so there is nothing to enable. You can keep it from loading at all with:

```ts
const app = await createOracleApp({
config,
features: { calls: false }, // skip the stub entirely
});
```
`calls` is exported from the package but is not in `BUNDLED_PLUGINS`, so nothing loads it. It contributes nothing, so there is nothing to enable either. The legacy `apps/app` codebase had a `@Controller('calls')` for LiveKit integration; the `getNestModules` API hook would technically unblock a real implementation. Deferred for now.

See the framework's [follow-ups](https://github.com/ixoworld/ixo-oracles-boilerplate/blob/main/docs/spec-and-roadmap/follow-ups.md) for the rebuild plan.

Expand Down
13 changes: 5 additions & 8 deletions build-an-oracle/reference/bundled-plugins/credits.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "credits"
description: "Enforces per-user credit budgets and settles held credits to the chain on a cron."

Check warning on line 3 in build-an-oracle/reference/bundled-plugins/credits.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/reference/bundled-plugins/credits.mdx#L3

Did you really mean 'cron'?
icon: "coins"
---

Expand All @@ -12,7 +12,7 @@
| Visibility | `silent` |
| Stability | `stable` |
| Category | `core` |
| Default state | On unless `DISABLE_CREDITS=true` |
| Default state | Opt-in — not in `BUNDLED_PLUGINS`. Construct it and pass it in `plugins`. |
| Depends on | — |

## Summary
Expand All @@ -20,7 +20,7 @@
Owns the full credit lifecycle:

- **Enforcement** — per-request middleware that aborts model calls when the user is out of credits (`createCreditsMiddleware` + `TokenLimiter`).
- **Settlement** — background cron that converts held credits into on-chain claims, shipped via `ClaimProcessingModule`.

Check warning on line 23 in build-an-oracle/reference/bundled-plugins/credits.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/reference/bundled-plugins/credits.mdx#L23

Did you really mean 'cron'?

Silent (no agent-visible tools). When loaded, this plugin also activates the runtime's Tier-0 `SubscriptionMiddleware`, which gates the HTTP request before the graph even runs.

Expand All @@ -29,9 +29,9 @@
| Var | Required | Description |
| --- | --- | --- |
| `SUBSCRIPTION_URL` | no | Subscription API URL. |
| `SUBSCRIPTION_ORACLE_MCP_URL` | no | Subscription Agentic Oracles MCP server URL. |

Check warning on line 32 in build-an-oracle/reference/bundled-plugins/credits.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/reference/bundled-plugins/credits.mdx#L32

Did you really mean 'Agentic'?
| `DISABLE_CREDITS` | no | Set to `'true'` to skip the plugin entirely. |
| `NETWORK` | no | Read but not owned (declared by the core base env schema). Required by the cron module. |

Check warning on line 34 in build-an-oracle/reference/bundled-plugins/credits.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/reference/bundled-plugins/credits.mdx#L34

Did you really mean 'cron'?

## What it contributes

Expand All @@ -39,7 +39,7 @@
- **Sub-agents:** none.
- **Middleware:** `createCreditsMiddleware` (aborts the agent run when the user is out of credits).
- **Nest modules** (when Redis is configured at construct time):
- `ClaimProcessingModule` — cron that settles held credits on chain.

Check warning on line 42 in build-an-oracle/reference/bundled-plugins/credits.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/reference/bundled-plugins/credits.mdx#L42

Did you really mean 'cron'?
- `FileProcessingSinkModule` — `FILE_PROCESSING_CREDIT_SINK` so pre-flight file-processing LLM usage bills the per-user budget.
- `SubscriptionSinkModule` — `SUBSCRIPTION_CREDIT_SINK` so the subscription middleware mirrors per-DID subscription payload + balance into Redis on every authenticated request.
- **HTTP routes:** none directly.
Expand All @@ -61,18 +61,15 @@
});
```

Without a Redis client the middleware loads in pass-through mode and the cron modules are skipped.

Check warning on line 64 in build-an-oracle/reference/bundled-plugins/credits.mdx

View check run for this annotation

Mintlify / Mintlify Validation (ixoworld) - vale-spellcheck

build-an-oracle/reference/bundled-plugins/credits.mdx#L64

Did you really mean 'cron'?

## Opt out / Opt in

```ts
const app = await createOracleApp({
config,
features: { credits: false }, // never load
});
`credits` is not in `BUNDLED_PLUGINS`, so nothing loads it unless you pass an instance in `plugins` (see [Production constructor](#production-constructor) above). Once wired, `DISABLE_CREDITS=true` still turns it off via `autoDetect` without touching the code.

// Or via env: DISABLE_CREDITS=true
```
<Warning>
LLM token metering **is** this plugin. An oracle that never wires it has no metering at all — worth knowing before you leave it out, especially alongside [`oracle-payments`](/build-an-oracle/reference/bundled-plugins/oracle-payments), where "free support" means "no work claim", not "free LLM".
</Warning>

## Where to read next

Expand Down
Loading
Loading