Back to Changelog
v0.14.0
April 5, 2026

Catalog Overhaul, Memory Optimization and more

AddedChangedFixed

#[0.14.0] - 2026-04-05

Major release that restructures the Catalog plugin into a modular discovery/profiler architecture with broad AWS service coverage, adds Redis and BigQuery plugins, introduces cooldown control to watch(), and optimizes the Memory plugin with batch storage, TTL, and eviction.

#Added

  • Redis Plugin (daita/plugins/redis.py)

    Full-featured Redis data store plugin with key-value, hash, list, and set operations. Supports namespace isolation via key_prefix, read-only mode, and configurable connection pooling.

    python
    from daita.plugins import redis
     
    async with redis(url="redis://localhost:6379", key_prefix="myapp:") as r:
        await r.set("user:1", '{"name": "Alice"}', ttl=3600)
        value = await r.get("user:1")

    Install with pip install 'daita-agents[redis]'.

  • BigQuery Plugin (daita/plugins/bigquery.py)

    Google BigQuery data warehouse plugin with query execution and schema inspection. Wraps the synchronous google-cloud-bigquery SDK with asyncio executors. Supports service account and Application Default Credentials.

    python
    from daita.plugins import bigquery
     
    async with bigquery(project="my-project", dataset="analytics") as bq:
        results = await bq.query("SELECT * FROM users LIMIT 10")

    Install with pip install 'daita-agents[bigquery]'.

  • Catalog Plugin — Modular Discovery & Profiling Architecture

    The monolithic catalog.py has been replaced with a package under daita/plugins/catalog/ featuring a pluggable discoverer/profiler system:

    • BaseDiscoverer and BaseProfiler — abstract base classes for building custom discovery and profiling backends.
    • AWS Discoverer (catalog/aws.py) — discovers infrastructure from AWS accounts with individual discoverers for PostgreSQL (RDS), MySQL (RDS), DynamoDB, S3, MongoDB (DocumentDB), API Gateway, Kinesis, OpenSearch, SNS, and SQS.
    • GitHub Discoverer (catalog/github.py) — discovers repositories and OpenAPI specs from GitHub organizations.
    • Per-service Profilers — dedicated profilers under catalog/profiler/ for each supported AWS service, extracting normalized schemas.
    • Schema Normalizer (catalog/normalizer.py) — unified normalization pipeline producing NormalizedSchema objects across all source types.
    • Schema Comparator (catalog/comparator.py) — diffs two NormalizedSchema snapshots to detect added/removed/changed tables and columns.
    • Diagram Export (catalog/diagram.py) — generates Mermaid ER diagrams from normalized schemas.
    • Persistence Layer (catalog/persistence.py) — pluggable storage for catalog snapshots with register_catalog_backend_factory() for custom backends.

    New pyproject.toml extras: opensearch, github, bigquery.

  • Watch Cooldown Parameter

    agent.watch() now accepts a cooldown parameter that controls repeat alerting while a threshold stays met:

    python
    @agent.watch(source=pg,
                 condition="SELECT COUNT(*) FROM orders",
                 threshold=lambda v: v > 100,
                 interval="10s",
                 cooldown=True)          # fire once, then only on resolve
    async def on_spike(event):
        print(f"Order spike: {event.value}")
    • False / None (default): fire every poll cycle (existing behavior).
    • True: fire once, then only again on resolve (alarm model).
    • str / timedelta: fire once, then re-alert on the given interval (e.g. "5m").
  • Memory Plugin — Batch Storage & TTL

    remember() now accepts a list of dicts for batch ingestion with a single embedding API call. New ttl_days parameter (per-memory) and default_ttl_days (plugin-wide) enable automatic memory expiry. A max_chunks setting caps stored chunks with LRU-style eviction.

    python
    memory = MemoryPlugin(max_chunks=2000, default_ttl_days=90)
     
    await remember([
        {"content": "Q1 revenue was $4.2M", "importance": 0.8},
        {"content": "New VP of Eng starts March 15", "category": "people"},
    ])
  • Memory Plugin — Auto-Classification & Time-Aware Recall

    New auto_classify.py module for automatic memory categorization at ingestion. Time parameters in recall accept relative shorthand ("24h", "7d", "30d") in addition to ISO datetimes.

  • Example Deployments

    • db-health-monitor — a deployable agent that watches database health metrics with remediation handlers.
    • infrastructure-catalog — a deployable agent that discovers and catalogs infrastructure using the new Catalog plugin.

#Changed

  • Catalog plugin restructured from single file to package

    daita/plugins/catalog.py (1 531 lines) has been replaced by daita/plugins/catalog/ with focused modules. Backward-compatible: from daita.plugins.catalog import CatalogPlugin continues to work.

  • Graph backend reads are now lock-protected

    get_node(), get_edges(), and load_graph() in LocalGraphBackend now acquire _lock before reading, preventing races with concurrent writes. remove_node() and update_node_properties() now set _dirty = True instead of calling _save() directly, deferring persistence to the next flush() cycle.

  • Memory plugin search rewritten (daita/plugins/memory/search.py)

    Consolidated search logic with improved scoring, removed legacy keyword_search.py, storage.py, and text_utils.py in favor of unified utils.py.

#Fixed

  • Graph node/edge updated_at stored as datetime instead of ISO string

    update_node_properties() was storing updated_at as an ISO string while the rest of the codebase expected datetime objects. Now consistently uses datetime.now(timezone.utc).

  • Watch condition parameter removed from WatchConfig

    The condition field was passed through to WatchConfig but never used by the watch loop (the source handles condition evaluation). Removed to avoid confusion.

  • filter and threshold mutual exclusion enforced

    agent.watch() now raises ValueError if both filter= and threshold= are set, since they apply to different watch modes (streaming vs. polling).

  • ImportError fixes across catalog discoverers

    All AWS discovery modules now correctly raise ImportError with install hints when optional dependencies (boto3, opensearch-py, etc.) are missing, following the project-wide lazy import pattern.

  • Stale watch tasks cleaned up before starting new watches

    _ensure_watches_started() now prunes completed tasks from _tasks before launching new ones, preventing unbounded list growth in long-running agents.