v0.2.9

ScrapeGraphAI/Scrapegraph-aiv0.2.9Jul 22, 2026by het0814

AI Summary

Addresses memory integrity bugs such as silent content deletion and phantom session summaries, while adding OKF import support in the Web UI and streaming uploads for the TypeScript SDK and Claude Code integration.

Key Highlights

  • Fixes content deletion caused by false-positive 'Tags:' matches
  • Fixes phantom session summaries from failed writes
  • Adds OKF import support in Web UI
  • Implements streaming uploads for SDK and Claude Code

New Features

  • OKF import support in Web UI
  • Streaming uploads for TypeScript SDK
  • Streaming uploads for Claude Code integration

Full Release Notes

# Release Notes for v0.2.9

This release fixes a batch of **memory-integrity bugs** - content silently wiped by a false-positive "Tags:" match, phantom session summaries logged for writes that actually failed, timestamp/TTL invariant violations, and temporal-filter fail-open behavior — plus **tags/metadata/provenance preservation** across recall, LangGraph, MCP, and Hermes, streamed uploads for both the TypeScript SDK and the Claude Code integration's transcript parser, and OKF support surfaced in the Web UI.

## New Features

- **OKF in the Web UI** (`memanto/app/ui/static/index.html`, `memanto/app/ui/routes/ui_router.py`)
  - The Migrate tab now supports importing an OKF bundle directly from the
    dashboard, alongside Mem0/Letta/Supermemory.

## Bug Fixes

- **Content silently wiped by false-positive "Tags:" match** (`memanto/app/services/memory_read_service.py`)
  - The wire-format parser split stored memory text on every blank-line-separated
    chunk and dropped any chunk starting with `"Tags: "` — so content that
    legitimately began a paragraph with the literal text `"Tags: "` was silently
    deleted on read. Parsing now partitions strictly into title/content, and
    only strips a trailing tags block when the record actually has tags *and*
    the last blank-line-delimited segment starts with `"Tags: "`.

- **Temporal filter fail-open** (`memanto/app/services/memory_read_service.py`)
  - A silent-fail path in temporal filtering could fall through to returning
    unfiltered results instead of the intended filtered set; fixed to fail
    closed.

- **Phantom session summaries from failed writes** (`memanto/app/routes/memory.py`,
  `memanto/app/utils/validation.py`)
  - `remember`/`batch-remember` logged a memory to the local session Markdown
    summary regardless of whether the underlying Moorcheh write actually
    succeeded. New shared `is_successful_write_result()` helper gates summary
    logging (and batch per-item reporting) on a real success status
    (`queued`/`success`/`ok`), so a failed write no longer produces a phantom
    entry in the session log.

- **Batch upload status now fails closed on unrecognized values** (`memanto/app/services/memory_write_service.py`)
  - Previously any non-empty status from Moorcheh was treated as ambiguous;
    now only `queued`/`success`/`ok` count as successful and anything else is
    explicitly marked `"failed"` with the returned status recorded as the error.

- **Timestamp / TTL invariant violations** (`memanto/app/core.py`,
  `memanto/app/services/memory_write_service.py`)
  - `created_at`/`updated_at` are now normalized to UTC-aware (`as_utc_aware`),
    clamped to "now" if a caller-supplied value is in the future, and
    `created_at` is forced to never exceed `updated_at` — closing a set of
    cases where a bad/aware timestamp from an import or manual edit could
    produce a memory that looks "created after it was updated" or timestamped
    in the future.
  - `expires_at` is now always serialized as an ISO string on the outgoing
    document instead of relying on the object's default `str()`.
  - Pagination offset and aware-datetime comparison bugs in session listing
    (`memanto/app/models/session.py`, `memanto/app/services/session_service.py`)
    fixed as part of the same batch.

- **Tags, metadata, and provenance preservation** (`memanto/app/services/memory_read_service.py`,
  `memanto/cli/commands/memory.py`, `integrations/{langgraph,mcp,hermes-agents}/`)
  - Consolidates four related fixes: Hermes agents no longer strip tags on
    read; `memanto recall` CLI display now shows tags/provenance correctly;
    LangGraph's `MemantoStore` normalizes tags consistently (including a fix
    for comma-containing tag keys and preserving wildcard tag filters); and a
    trailing-"Tags:" suffix leak in read formatting is fixed.
  - MCP `batch_remember` tool now normalizes tags before sending.

- **Streaming uploads** (`sdks/typescript/src/index.ts`, `integrations/claudecode/hooks/_common.py`)
  - TypeScript SDK file uploads are now streamed via a multipart
    `Readable` generator instead of buffering the whole file in memory.
  - The Claude Code integration's transcript reader now streams the JSONL
    transcript line-by-line (bounded `deque` tail) instead of requiring
    `readlines()` to materialize the entire file — matters for long-running
    Claude Code sessions with large transcripts.
  - Read failures during transcript parsing are now logged instead of
    silently swallowed.

- **Export limit validation** (`memanto/cli/client/{direct_client,sdk_client}.py`)
  - `limit_per_type` for `memanto memory export` is now validated (integer,
    1–100) before querying every memory type, instead of failing deep inside
    the export loop on a bad value.

- **UI date formatting** (`memanto/app/ui/static/index.html`)
  - Fixed a date-format bug in the Memory Explorer.

## Tests

- New `tests/test_memory_format.py` covering the tags/content parsing fixes.
- New `tests/test_memory_read_confidence.py` additions, expanded
  `tests/test_api.py`, `tests/test_cli.py`, `tests/test_unit.py` for
  timestamp/TTL invariants, export-limit validation, and write-status gating.
- New/expanded test coverage in `integrations/{langgraph,mcp,hermes-agents,claudecode}/tests/`.

## Full Changelog

Full Changelog: https://github.com/moorcheh-ai/memanto/compare/v0.2.8...v0.2.9