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