PluginManifest is the structured metadata every plugin must declare. The runtime composes it into the Tier-1 prompt block, feeds it to the meta-tools, and validates it at boot.
import type { PluginManifest, ManifestExample } from '@ixo/oracle-runtime';
Human-readable name. Used to prefix every tool description ([Climate Data] Fetch emissions…) and appears in qiforge inspect. Distinct from name — name is kebab-case unique identifier, title is prose.
summary
Type:string
Required: yes
One-line description. Rendered in the Tier-1 prompt block for always plugins as - {name}: {summary}. Keep it short — every Tier-1 plugin costs ~80 tokens on every turn.Validation:
Hard: must be non-empty.
Soft warn: > 120 chars.
whenToUse
Type:string[]
Required: when visibility !== 'silent'
Trigger phrases — each entry teaches the agent a situation in which this plugin is the right call.Validation:
Hard: at least 1 entry when visibility !== 'silent'.
Soft warn: > 8 entries, or any entry > 100 chars.
whenNotToUse
Type:string[]
Required: no
Anti-patterns. Use to disambiguate from other plugins.
examples
Type:ManifestExample[]
Required: no
Few-shot examples. Each example binds a user message to a tool call.Validation:
Hard: every example.tool must reference a tool actually registered by this plugin.
Hard violations abort boot with the full error list printed.Soft violations log warnings. The plugin still loads.Manifest validation runs before env validation, so manifest errors surface even when env vars are missing.
Every example.tool is checked against the plugin’s registered tool names. If a manifest references tool: 'foo' but the plugin doesn’t register a tool named foo, boot fails:
[boot-error] Plugin 'weather' manifest example references unknown tool 'foo'.
This catches typos and stale manifests during refactors.
const manifest: PluginManifest = { title: 'Weather', summary: 'Weather lookups via Open-Meteo (no API key required).', whenToUse: [ 'Whenever asked about current weather, temperature, precipitation, or wind in any city.', 'Any question related to forecasts (today, tomorrow, next week) for any location.', 'When the user asks "what should I wear", "do I need an umbrella", or similar outfit guidance.', ], whenNotToUse: [ 'Questions about historical or long-term climate data.', 'Locations smaller than city-level precision.', ], examples: [ { user: "What's the weather in Berlin?", tool: 'get_current_weather', args: { city: 'Berlin' }, }, { user: 'Forecast for Tokyo this week.', tool: 'get_weather_forecast', args: { city: 'Tokyo', days: 7 }, }, ], tags: ['weather', 'forecast', 'outfit'], category: 'data', visibility: 'on-demand', stability: 'experimental',};