v0.2.7

MCP-UI-Org/mcp-uiv0.2.7Jul 14, 2026by het0814

AI Summary

This release introduces first-class TypeScript SDK integrations for the Vercel AI SDK, Mastra, and OpenAI frameworks. It significantly hardens security by requiring management auth for agent lifecycle endpoints and preventing filter injection attacks. Additionally, it fixes critical event-loop blocking bugs and improves on-prem data migration stability.

Key Highlights

  • New TypeScript SDK integrations for Vercel AI, Mastra, and OpenAI
  • Enhanced security for agent lifecycle management and recall filter injection
  • Fixed event-loop blocking bugs in on-prem restart and session end
  • Improved memory update and export edge case handling

New Features

  • Vercel AI SDK integration exposing Memanto memories as tools/context
  • Mastra framework integration
  • OpenAI SDK integration for wiring recall/remember into agents
  • Unique UUID-suffixed staging paths for on-prem uploads
  • Strict token pattern validation for recall filter parameters

Full Release Notes

# Release Notes for v0.2.7

This release adds first-class **TypeScript SDK integrations** for the Vercel AI SDK, Mastra, and OpenAI; closes another set of **security gaps** (agent lifecycle management auth, recall filter injection, unique on-prem upload staging paths); fixes **event-loop-blocking bugs** in on-prem restart and session end; and hardens memory-update/export edge cases uncovered in on-prem data migration.

## New Features

- **TypeScript SDK framework integrations** (`sdks/typescript/src/integrations/`)
  - New `ai-sdk.ts`: Vercel AI SDK integration exposing Memanto memories as
    AI SDK-compatible tools/context.
  - New `mastra.ts`: Mastra framework integration.
  - New `openai.ts`: OpenAI SDK integration for wiring Memanto recall/remember
    into OpenAI-based agents.
  - Shared `memory-types.ts` module for consistent memory typing across
    integrations; new peer dependencies (`ai`, `zod`, `@ai-sdk/openai`,
    `@mastra/core`, `openai`); Node engine bumped to `>=20`.
  - Full test coverage: `test/integrations/{ai-sdk,mastra,openai}.test.ts`.
  - README updated with on-prem (no-API-key) usage instructions.

## Security

- **Management auth required for agent lifecycle endpoints** (`memanto/app/routes/auth_deps.py`)
  - Agent create/list/delete/activate and `/api/v2/status` previously only
    checked that the *server* had a configured `MOORCHEH_API_KEY`, not that the
    *caller* was authorized — with the default `HOST=0.0.0.0` bind, any network
    peer could create agents, activate sessions, and obtain session tokens.
    These endpoints now require either a matching management credential
    (`Authorization: Bearer` / `X-Api-Key`) or a loopback client origin.

- **Recall filter-token injection guard** (`memanto/app/services/memory_read_service.py`)
  - `memory_type`, `tag`, `status`, and metadata key/value filters passed to
    Moorcheh's keyword query syntax are now validated against a strict
    `[A-Za-z0-9_.-]+` token pattern before being interpolated, preventing
    query-syntax injection via crafted filter values.

- **Unique on-prem upload staging paths** (`memanto/app/clients/onprem.py`)
  - Uploaded files are now staged under a UUID-suffixed filename
    (`{stem}-{uuid4}{suffix}`) instead of the original name, preventing
    same-named concurrent uploads from colliding/overwriting each other's
    staged file.

## Improvements

- **Event-loop blocking fixes** (`memanto/app/ui/routes/ui_router.py`,
  `memanto/app/services/session_service.py`)
  - `restart_onprem_backend` previously ran two blocking `subprocess.run()`
    calls (up to 360s combined) plus synchronous `httpx.get()` / `time.sleep()`
    directly inside an `async def`, freezing the entire FastAPI event loop for
    the whole restart window. Now wrapped in `asyncio.to_thread` /
    `httpx.AsyncClient` / `await asyncio.sleep`.
  - The restart lock is now cancellation-safe: the actual restart runs as an
    independent task guarded by `asyncio.shield()`, so a cancelled HTTP handler
    (e.g. client timeout) can no longer release the lock while `moorcheh
    down/up` is still running, which previously let concurrent restarts
    interleave subprocess calls against the same stack.
  - `end_session` always returned `memories_created=0` due to an unresolved
    TODO; it now snapshots the live Moorcheh namespace document count
    before/after ending the session and reports the delta (best-effort — falls
    back to 0 if Moorcheh is unreachable).

- **Batch upload status normalization** (`memanto/app/services/memory_write_service.py`)
  - Batch memory writes now count `"ok"` (in addition to `"queued"`/`"success"`)
    as a successful per-item status, and count `"failed"` case-insensitively —
    on-prem batch uploads were previously miscounted as failed despite
    succeeding.

- **On-prem answer model omission** (`memanto/app/services/conversation_memory_extraction_service.py`)
  - Conversation extraction now omits `ai_model` when no on-prem LLM is
    configured (falls back to `get_active_llm_model`), letting the server pick
    its own default instead of erroring, matching the existing `answer`
    endpoint behavior.

- **`memanto export` refuses to overwrite a good cache on backend outage**
  (`memanto/cli/client/{direct_client,sdk_client}.py`)
  - `export_memory_md` previously swallowed every per-type recall failure into
    an empty list and wrote it unconditionally — during a full backend outage
    this silently wiped the cached export (and, via `sync_memory_to_project`,
    the project's `MEMORY.md`) even though nothing was actually forgotten. Now
    raises `ConnectionError` when *every* memory type fails to recall (a
    genuine "no memories of this type" still exports fine); `sync_memory_to_project`
    falls back to the previous export (`"stale-cache"`) when a refresh fails
    and a prior export exists.

- **Memory-update metadata handling** (`memanto/app/services/memory_write_service.py`)
  - `update_memory` now preserves extra metadata fields from the existing
    record (e.g. on-prem `original_id`) that aren't part of the `MemoryRecord`
    schema — but explicitly excludes the trust fields removed on 2026-06-29
    (`superseded_by`, `supersedes`, `validated_at`, `validation_count`,
    `contradiction_detected`) so old on-prem records don't resurrect dead
    schema on update.

- **OpenAPI/CI sync** (`scripts/generate_openapi.py`, `.github/workflows/sdk-typescript.yml`)
  - `generate_openapi.py` now pins a fallback version before importing the app
    so the spec doesn't drift on every commit from the hatch-vcs-derived
    version; CI updated to catch TypeScript `openapi.json` drift.

## Tests

- New `tests/test_memory_read_filter_sanitization.py`, `tests/test_export_resilience.py`,
  and expanded `tests/test_backend.py` / `tests/test_unit.py` / `tests/test_api.py`
  covering the filter-injection guard, stale-cache export fallback, batch
  upload status normalization, and trust-field exclusion on update.
- New `sdks/typescript/test/integrations/*.test.ts` for the three new SDK
  integrations.

## Full Changelog

Full Changelog: https://github.com/moorcheh-ai/memanto/compare/v0.2.6...v0.2.7