Plugin Inventory

MRP-VM organizes all behavior through five typed plugin families. The VM core provides only the LLM bridge, execution frames, and plugin orchestration. All domain logic belongs to plugins.

Plugin Categories

TypeRole in VM LoopPhase
sd-pluginExtracts intents (fine-grained) and knowledge (semantically coherent KUs) from user input or source text.Seed Generation
mrp-plan-pluginBuilds execution plans ordering plugins per stage. Uses descriptions and plannerHints for relevance filtering. May request task decomposition.Plan Generation
kb-pluginRetrieves relevant Knowledge Units from the hierarchical KB at the appropriate abstraction level. Builds plugin-private indices during ingest.Task Resolution
gs-pluginProduces grounded answers from resolved intents and retrieved evidence. May signal needs-decomposition.Task Resolution
val-pluginValidates goal solver output. Rejection triggers planner backtracking.Result Composition

Built-In Plugins

sd-plugin — Seed Detectors

IDDescriptionUses LLMCost
sd-symbolicRule-based intent and knowledge extraction. Fast, deterministic, no LLM cost. Best for simple factual queries and structured input.Nocheap
sd-llm-fastLightweight LLM-backed normalization. Good balance of quality and speed for most conversational input.Yesmoderate
sd-llm-deepThorough LLM normalization with richer intent decomposition. Best for ambiguous, multi-part, or complex requests.Yesexpensive

kb-plugin — Knowledge Retrievers

IDDescriptionBackendCost
kb-fastLexical-first retrieval with small result budget. Cheapest path, suitable for simple focused questions.BM25 (DS009)cheap
kb-balancedLexical + associative retrieval with diversity-aware reranking. Recommended default for moderate-complexity questions.BM25 + HDC/VSA (DS009, DS024)moderate
kb-thinkingdbLexical + bounded symbolic closure. Best for multi-hop, relation-sensitive, or proof-bearing retrieval tasks.BM25 + ThinkingDB (DS009, DS025)expensive

gs-plugin — Goal Solvers

IDDescriptionUses LLMCost
gs-symbolicDeterministic answer assembly from retrieved evidence. No LLM cost. Produces structured bullet-point answers.Nocheap
gs-llm-fastLightweight LLM synthesis from evidence. Good fluency with low latency.Yesmoderate
gs-llm-deepThorough LLM synthesis with richer reasoning. Best for complex or nuanced answers.Yesexpensive

mrp-plan-plugin — Planners

IDDescriptionStyle
planner-defaultAdaptive cheap-first planner with EWMA learning. Inspects task signals (depth, speed, symbolic cues) to adjust ordering.cheap-first
planner-depthHeavy-first fallback planner for multi-hop or recovery paths. Used when cheap planners exhaust their options.deep-first

val-plugin — Validators

IDDescriptionUses LLM
val-llmLLM-backed response validator. Checks that the answer is grounded in evidence and addresses the question. Rejection triggers replanning.Yes

How to Build a Plugin

Step 1: Choose the Plugin Type

Decide which phase of the execution loop your plugin serves. Each type has a specific contract defined in DS027.

Step 2: Implement the Interface

Every plugin must implement:

Step 3: Write the Descriptor

{
  id: "my-kb-plugin",
  type: "kb-plugin",
  name: "My Custom KB Retriever",
  version: "1.0.0",
  description: "Semantic search using embeddings.
    Best for long-form technical documents.",
  costClass: "moderate",
  usesLLM: false,
  modelRoles: [],
  maxLLMCalls: 0,
  tags: ["custom", "embeddings"],
  timeoutMs: 15000,
  plannerHints: {
    expectedLatencyMs: 200,
    expectedLLMCalls: 0,
    relativeCost: 0.3,
    supportedActs: ["explain", "compare", "define"],
    topicTags: ["technical"],
    preferredDepth: "medium",
    confidenceWhenMatched: 0.7
  },
  provides: ["retrieve-context"],
  accepts: ["chat-turn", "source-text"]
}

Descriptor Requirements

Step 4: Register the Plugin

Built-in plugins (JavaScript)

Register programmatically in src/server/index.mjs during boot:

typedPluginRegistry.register(new MyKBPlugin(...));

External wrapper plugins (any language)

Create a directory under wrappers/:

wrappers/my-plugin/
├── manifest.json    # descriptor + command + args
├── wrapper.js       # (or .py, .rs, etc.)
└── README.md

The manifest.json follows the same descriptor shape plus:

{
  "command": "node",
  "args": ["wrapper.js"],
  "protocolVersion": 1,
  "maxInputSizeBytes": 65536
}

Add the plugin ID to pluginAllowlist in config/engine.json.

Step 5: Configure

Step 6: Test

Plugin Communication

Plugins communicate through natural language using CNL formats:

The VM is agnostic to the content inside these formats. It enforces only the structural delimiters (headings, field names) defined by each CNL schema.