Other Plugins

Additional built-in plugins for specialized functionality including clarification workflows, reference handling, multimodal support, subagent orchestration, and background task management.

Clarification Plugin

Structured question-and-answer workflow for gathering information from the user before proceeding with a task.

Nameclarification
ToolsaskClarification
Auto-approvedYes

Question Types

  • single_choice: Select one option from a list
  • multiple_choice: Select multiple options
  • free_text: Open-ended text response

Use Cases

  • Disambiguating vague requests
  • Gathering missing parameters
  • Confirming before destructive operations
Usage example
# Model asks for clarification
askClarification(
    question="Which environment should I deploy to?",
    question_type="single_choice",
    options=["development", "staging", "production"]
)

# Response
{
  "answer": "staging",
  "question_type": "single_choice"
}
Multiple choice
askClarification(
    question="Which tests should I run?",
    question_type="multiple_choice",
    options=["unit", "integration", "e2e", "performance"]
)

# Response
{
  "answer": ["unit", "integration"],
  "question_type": "multiple_choice"
}

Memory Plugin

Model self-curated persistent memory across sessions. The model can store valuable explanations and insights, then retrieve them in future sessions to build a persistent knowledge base.

Namememory
Toolsstore_memory, retrieve_memories, list_memory_tags
Subscribes toPrompt enrichment (priority: 80)
Auto-approvedYes

Two-Phase Retrieval

  1. Prompt Enrichment: Plugin injects lightweight hints about available memories
  2. Model Decision: Model decides whether to retrieve full content

Session Flow

Visual representation of how memories work across sessions:

Session 1: Storing Knowledge User "Explain Runtime/ Session architecture" Model Generates detailed explanation... store_memory() tags: [architecture, runtime, session] Memory Storage .jaato/memories.jsonl ✓ Saved Session 2: Retrieving Knowledge User "How to spawn subagent efficiently?" Plugin Enrichment Detects: "subagent" Adds hint 💡 Model (enriched prompt) Sees hint about available memory retrieve_memories() tags: [subagent, runtime] Full content Model Response Uses retrieved context to answer question

Configuration

storage_pathPath to JSONL storage file (default: .jaato/memories.jsonl)

Use Cases

  • Remember architecture explanations across sessions
  • Build project-specific knowledge base over time
  • Reduce redundant explanations of the same topics
Self-Curated
The model decides what to store and when to retrieve. Only substantial, reusable information should be stored - not ephemeral responses.
Model stores memory
# Session 1: Model provides comprehensive explanation
# then stores it
store_memory(
    content="The Runtime/Session split allows...",
    description="jaato Runtime/Session architecture",
    tags=["architecture", "runtime", "session", "subagents"]
)

# Response
{
  "status": "success",
  "memory_id": "mem_20231211_143022",
  "message": "Stored memory: jaato Runtime/Session architecture"
}
Prompt enrichment and retrieval
# Session 2: User asks related question
# Plugin enriches prompt with hint:

💡 **Available Memories** (use retrieve_memories to access):
  - [architecture, runtime, session, subagents]: jaato Runtime/Session architecture

# Model sees hint, retrieves memory
retrieve_memories(
    tags=["subagents", "runtime"],
    limit=3
)

# Response
{
  "status": "success",
  "count": 1,
  "memories": [{
    "id": "mem_20231211_143022",
    "description": "jaato Runtime/Session architecture",
    "content": "The Runtime/Session split allows...",
    "tags": ["architecture", "runtime", "session", "subagents"],
    "stored": "2023-12-11T14:30:22",
    "usage_count": 3
  }]
}
Configuration
registry.expose_tool('memory', config={
    'storage_path': '.jaato/memories.jsonl',
})

# Default storage location: .jaato/memories.jsonl
# Add to .gitignore for private knowledge
# Or commit for team-shared knowledge base

References Plugin

Manages a catalog of documentation and reference sources. Sources can be automatically injected or user-selected on demand.

Namereferences
ToolsselectReferences, listReferences
Auto-approvedYes

Source Types

  • LOCAL: Local files on filesystem
  • URL: HTTP/HTTPS URLs
  • MCP: MCP server tool calls
  • INLINE: Content embedded in config

Injection Modes

  • AUTO: Included in system instructions at startup
  • SELECTABLE: User chooses via selectReferences tool

Subagent Configuration

preselectedList of source IDs to pre-select at startup
transitive_injectionEnable transitive detection (default: true). Scans pre-selected content for mentions of other catalog references.
exclude_toolsList of tools to hide (e.g., ["selectReferences"])
sourcesOverride available sources (IDs or full objects)

Transitive Injection

When enabled (default), pre-selected references are scanned for mentions of other catalog reference IDs. Discovered references are automatically added to the injection set, recursively with cycle detection.

references.json catalog
{
  "version": "1.0",
  "sources": [
    {
      "id": "api-spec",
      "name": "API Specification",
      "type": "local",
      "path": "./docs/openapi.yaml",
      "mode": "auto",
      "tags": ["api", "endpoints"]
    }
  ]
}
Subagent profile with pre-selected references
{
  "name": "my-skill-agent",
  "plugins": ["cli", "file_edit", "references"],
  "plugin_configs": {
    "references": {
      "preselected": ["adr-001", "eri-001"],
      "exclude_tools": ["selectReferences"]
    }
  }
}

Multimodal Plugin

Image loading for multimodal model interactions. Enables the model to analyze images referenced in prompts or loaded on demand.

Namemultimodal
ToolsloadImage
Subscribes toPrompt enrichment (priority: 60)
Model Requirementsgemini-3-*, gemini-3.5-*

Configuration

base_pathBase directory for relative paths
max_image_size_mbMaximum image size in MB
Model Requirements
This plugin requires Gemini 3+ for multimodal function responses. It will be skipped on incompatible models.
Usage
# Reference image in prompt
"What's in this image? @./screenshot.png"

# Model loads image explicitly
loadImage(path="./diagram.png")

# Response includes image data
{
  "path": "./diagram.png",
  "mime_type": "image/png",
  "_multimodal": true,
  "image_data": "base64..."
}

Template Plugin

Jinja2-based template rendering with automatic extraction from documentation. When prompts contain code blocks with template syntax (like MODULE.md content), the plugin extracts them to .jaato/templates/ for later use.

Nametemplate
ToolswriteFileFromTemplate, listAvailableTemplates
Subscribes toPrompt enrichment (priority: 40)
Auto-approvedlistAvailableTemplates only

Automatic Template Extraction

The plugin scans prompts for code blocks containing Jinja2 syntax ({% raw %}{{ }}{% endraw %} or {% raw %}{% %}{% endraw %}). Detected templates are:

  1. Extracted to .jaato/templates/
  2. Named based on frontmatter ID + heading
  3. Annotated in the prompt with usage instructions

Enrichment Pipeline Position

Runs at priority 40, after the references plugin (20) injects MODULE.md content, and before multimodal (60) and memory (80) plugins.

Template Syntax
Templates use Jinja2 syntax: variables ({% raw %}{{ name }}{% endraw %}), conditionals ({% raw %}{% if %}...{% endif %}{% endraw %}), loops ({% raw %}{% for %}...{% endfor %}{% endraw %}).
Template extraction flow
# Prompt contains MODULE.md with embedded template:
```java
@CircuitBreaker(name = "{{ circuitBreakerName }}")
public {{ returnType }} {{ methodName }}() { ... }
```

# After enrichment, agent sees:
---
**Extracted Templates:**
[Template extracted: .jaato/templates/mod-code-001-basic.java.tmpl]
  Variables: circuitBreakerName, methodName, returnType
  Use: writeFileFromTemplate(template_path="...", variables={...})
---
Render template
# Use extracted template
writeFileFromTemplate(
    template_path=".jaato/templates/mod-code-001-basic.java.tmpl",
    variables={
        "circuitBreakerName": "orderService",
        "returnType": "Order",
        "methodName": "getOrder"
    },
    output_path="src/main/java/OrderService.java"
)

# Or use inline template
writeFileFromTemplate(
    template="Hello {{ name }}!",
    variables={"name": "Alice"},
    output_path="greeting.txt"
)
List available templates
listAvailableTemplates()
# Returns:
{
  "templates": [
    {
      "path": ".jaato/templates/mod-code-001-basic.java.tmpl",
      "variables": ["circuitBreakerName", "methodName", "returnType"],
      "exists": true
    }
  ],
  "count": 1
}

Subagent Plugin

Spawn child agents with configurable profiles for delegating specialized tasks. Supports parallel execution, cancellation propagation, and shared state for inter-agent communication.

Namesubagent
Toolsspawn_subagent, continue_subagent, close_subagent, cancel_subagent, get_subagent_result, list_active_subagents, list_subagent_profiles, set_shared_state, get_shared_state, list_shared_state

Parallel Execution

Spawn subagents in background threads for concurrent task execution using background=True. Use get_subagent_result to collect results when ready.

Cancellation Propagation

When the parent agent is cancelled (e.g., user presses Ctrl+C), all running subagents are automatically cancelled through shared CancelToken references. Use cancel_subagent to manually cancel a specific agent.

Shared State

Thread-safe shared state for inter-agent communication. All agents can read and write to a shared dictionary using set_shared_state and get_shared_state tools.

Profile Auto-Discovery

Profiles are automatically discovered from .jaato/profiles/. Each .json or .yaml file is parsed as a profile definition.

  • auto_discover_profiles: Enable/disable (default: true)
  • profiles_dir: Directory to scan (default: .jaato/profiles)

Plugin Configuration

Profiles can include plugin_configs to customize plugin behavior:

plugin_configsPer-plugin configuration overrides

Environment Variables

JAATO_TRACE_LOGPath to trace log file for debug output. Useful with rich terminal UIs. Default: /tmp/rich_client_trace.log
PROJECT_IDCloud project ID (legacy fallback)
LOCATIONProvider region (legacy fallback)
MODEL_NAMEDefault model (fallback)
Parallel execution
# Spawn agents in background
spawn_subagent(task="Analyze API module", background=True)
spawn_subagent(task="Review auth code", background=True)

# Check status
list_active_subagents()

# Collect result when ready
get_subagent_result(agent_id="subagent_abc123")
Shared state
# Store a value (accessible by all agents)
set_shared_state(key="results", value={"count": 42})

# Retrieve a value
get_shared_state(key="results")
# Returns: {'success': True, 'value': {"count": 42}}

# List all keys
list_shared_state()
Profile with plugin_configs
{
  "name": "skill-add-retry",
  "plugins": ["cli", "file_edit", "references"],
  "plugin_configs": {
    "references": {
      "preselected": ["adr-001", "eri-002"],
      "exclude_tools": ["selectReferences"]
    }
  }
}
Spawning agents
# Use predefined profile
spawn_subagent(
    profile="research",
    task="Find best practices for Python async"
)

# Custom inline config
spawn_subagent(
    inline_config={
        "plugins": ["web_search", "cli"],
        "system_instructions": "You are a research assistant..."
    },
    task="Analyze competitor products"
)

Background Plugin

Manage long-running background tasks. Check status, retrieve output, and cancel tasks.

Namebackground
ToolscheckBackgroundTask, getBackgroundOutput, cancelBackgroundTask, listBackgroundTasks
Auto-approvedAll (read-only management)

Integration with CLI Plugin

When the CLI plugin auto-backgrounds a long-running command, this plugin provides tools to monitor and manage it.

Task Lifecycle

  1. CLI command exceeds threshold -> backgrounded
  2. Returns task handle immediately
  3. Model uses background plugin to check status
  4. Retrieve output when complete
Background task management
# Check task status
checkBackgroundTask(task_id="cli_abc123")

# Response
{
  "task_id": "cli_abc123",
  "status": "running",
  "elapsed_seconds": 45
}

# Get output when complete
getBackgroundOutput(task_id="cli_abc123")

# Response
{
  "task_id": "cli_abc123",
  "status": "completed",
  "result": {
    "stdout": "Build completed successfully...",
    "returncode": 0
  }
}

# List all tasks
listBackgroundTasks()

# Cancel a task
cancelBackgroundTask(task_id="cli_abc123")

GC Plugins

Garbage collection plugins manage context window limits by removing or summarizing old conversation history.

See GC Plugin documentation for detailed information on all three strategies (truncate, summarize, hybrid), configuration options, and programmatic usage.

Available Strategies

  • gc_truncate: Simple truncation. Removes oldest messages when context exceeds limit.
  • gc_summarize: Summarization. Compresses old messages into a summary.
  • gc_hybrid: Generational. Preserves recent, summarizes middle, truncates ancient.
Auto-Loading
The rich client automatically loads GC config from .jaato/gc.json on startup if the file exists.
Quick example (.jaato/gc.json)
{
  "type": "hybrid",
  "threshold_percent": 80.0,
  "preserve_recent_turns": 5,
  "summarize_middle_turns": 10
}
Full documentation
See gc.html for:
- Detailed strategy comparison
- All configuration options
- File-based and programmatic setup
- Manual GC triggering
- Strategy selection guide