Releases: synpulse8-opensource/pulse8-ai-cortex-knowledge-vault
Releases · synpulse8-opensource/pulse8-ai-cortex-knowledge-vault
v1.2.2
[1.2.2] — 2026-06-12
Changed
- Re-release to trigger MCP Registry publishing:
1.2.1was tagged and released before thepublish-mcp.ymlworkflow reached the default branch, so the registry listing never ran. No functional code changes since1.2.1; this release exists to publish the server toregistry.modelcontextprotocol.io.
[1.2.1] — 2026-06-12
Added
- Official MCP Registry listing: Added
server.json(schema2025-12-11) describing the server under the namespaceio.github.synpulse8-opensource/pulse8-ai-cortex-knowledge-vault, plus anmcp-name:ownership marker in the README so the registry can verify the PyPI package. Enables discovery viaregistry.modelcontextprotocol.io.
[1.2.0] — 2026-06-11
Added
- Feedback vault collection: New
feedback/folder withvault_feedbackandvault_list_feedbacksMCP tools plus REST endpoints, capturing user/agent feedback on vault quality withstatusandrelated_paths. - Microsoft Teams notifications: Optional
TEAMS_WEBHOOK_URLposts an adaptive card after each new feedback note; optionalTEAMS_APP_BASE_URLadds a "View in Cortex" link. - Daily activity log: Every
vault_write,vault_ingest, and successful compile is mirrored intodaily/<UTC-date>.mdas a greppable## [HH:MM] event | summaryentry with a[[wiki-stem]]wikilink. Writes todaily/,feedback/, and.cortex/are excluded to avoid self-reference. - Folder-based node typing: Files under
agents/,sessions/, anddaily/are classified asAGENT_DEF,SESSION, and the newNodeType.DAILYwithout requiring a filename suffix. Frontmattertype:and the existing.agent.md/.session.mdsuffixes still take precedence/work. - Configurable search tuning:
CORTEX_QMD_CACHE_TTL_SECONDS(result-cache TTL, default 30s) andCORTEX_QMD_SEARCH_TIMEOUT_SECONDS(search request timeout, default 120s).
Changed
- Default search mode is now
hybrid(waskeyword). Clients that don't pass an explicitmodenow get the best-quality BM25 + vector + re-ranking results. SetCORTEX_QMD_SEARCH_MODE=keywordto restore the previous fast-but-shallow default. Latency is mitigated by the result cache and the HTTP QMD container.
Fixed
- QMD container returned no results: The image installed
qmdvianpm install -g ., which created a global symlink into a build directory deleted in the same layer — leaving a danglingqmdbinary so every search failed withspawn qmd ENOENTand silently returned[]. Now installed from a packed tarball with a build-timeqmd --versionsmoke check. - Hybrid searches silently truncated: QMD HTTP searches hit a hardcoded 30s timeout on CPU-only hosts and returned
[]while QMD was still working. Timeout is now configurable (default 120s). - Cached search failures: Empty result sets (transport errors/timeouts) are no longer cached, preventing a transient failure from blanking search for the full cache TTL.
Performance
- Memoized QMD path index:
build_path_index_from_graphis cached per graph mutation and no longer rebuilt on every search/read. - Non-blocking reads:
vault_readoffloads note parsing to a thread so concurrent MCP requests no longer serialize behind file I/O.
v1.2.1
Full Changelog: v1.2.0...v1.2.1
v1.2.0
Added
- Feedback vault collection: New
feedback/folder withvault_feedbackandvault_list_feedbacksMCP tools plus REST endpoints, capturing user/agent feedback on vault quality withstatusandrelated_paths. - Microsoft Teams notifications: Optional
TEAMS_WEBHOOK_URLposts an adaptive card after each new feedback note; optionalTEAMS_APP_BASE_URLadds a "View in Cortex" link. - Daily activity log: Every
vault_write,vault_ingest, and successful compile is mirrored intodaily/<UTC-date>.mdas a greppable## [HH:MM] event | summaryentry with a[[wiki-stem]]wikilink. Writes todaily/,feedback/, and.cortex/are excluded to avoid self-reference. - Folder-based node typing: Files under
agents/,sessions/, anddaily/are classified asAGENT_DEF,SESSION, and the newNodeType.DAILYwithout requiring a filename suffix. Frontmattertype:and the existing.agent.md/.session.mdsuffixes still take precedence/work. - Configurable search tuning:
CORTEX_QMD_CACHE_TTL_SECONDS(result-cache TTL, default 30s) andCORTEX_QMD_SEARCH_TIMEOUT_SECONDS(search request timeout, default 120s).
Changed
- Default search mode is now
hybrid(waskeyword). Clients that don't pass an explicitmodenow get the best-quality BM25 + vector + re-ranking results. SetCORTEX_QMD_SEARCH_MODE=keywordto restore the previous fast-but-shallow default. Latency is mitigated by the result cache and the HTTP QMD container.
Fixed
- QMD container returned no results: The image installed
qmdvianpm install -g ., which created a global symlink into a build directory deleted in the same layer — leaving a danglingqmdbinary so every search failed withspawn qmd ENOENTand silently returned[]. Now installed from a packed tarball with a build-timeqmd --versionsmoke check. - Hybrid searches silently truncated: QMD HTTP searches hit a hardcoded 30s timeout on CPU-only hosts and returned
[]while QMD was still working. Timeout is now configurable (default 120s). - Cached search failures: Empty result sets (transport errors/timeouts) are no longer cached, preventing a transient failure from blanking search for the full cache TTL.
Performance
- Memoized QMD path index:
build_path_index_from_graphis cached per graph mutation and no longer rebuilt on every search/read. - Non-blocking reads:
vault_readoffloads note parsing to a thread so concurrent MCP requests no longer serialize behind file I/O.
v1.0.2 — Fix fastmcp dependency & remove internal CI
Fixed
- Bumped
fastmcpdependency floor from>=2.0.0to>=3.0.0to fixImportError: cannot import name 'FastMCP'
Removed
- Removed internal
build-container-jfrog.ymlworkflow that referenced privatesynpulse-group/s8-actions
Housekeeping
- Bumped
versioninpyproject.tomlto1.0.2
v1.0.1 — Fix fastmcp dependency
Bug Fix
- Bumped
fastmcpdependency floor from>=2.0.0to>=3.0.0inpyproject.toml - The codebase uses fastmcp 3.x APIs (
FastMCP,OIDCProxy,http_app) which are unavailable in 2.x - The loose lower bound caused namespace-package corruption resulting in
ImportError: cannot import name 'FastMCP', breaking 9 tests + 6 fixture errors
Verification
- All 293 tests pass
- Pylint passes cleanly
v1.0.0 — Production Release
v1.0.0 — Production Release
PULSE8.ai Cortex reaches v1.0.0 — promoted from Beta to Production/Stable.
Highlights
Authentication & Security
- API key authentication (
AUTH_METHOD=apikey) — simple, statelessx-api-keyheader auth - Microsoft Entra ID / OIDC (
AUTH_METHOD=oidc) — OAuth 2.0 Authorization Code Flow with MFA support - OpenAPI specification — auto-generated docs via FastAPI
GPU Support & Flexible Deployment
- NVIDIA GPU support for QMD —
Dockerfile.gpu(CUDA 12.8 + Node.js 22) anddocker-compose.gpu.ymloverlay for EC2/Linux - Cortex-only deployment mode —
./scripts/start.sh --cortex-onlyfor macOS Metal GPU acceleration - Configurable embed timeout —
QMD_EMBED_TIMEOUT_MSenvironment variable - EC2 GPU setup guide — full guide at
docs/ec2-gpu-setup.md
CI/CD & Operations
- JFrog build & push workflow — automated container image builds
- Enhanced logging — structured ingestion and compilation logs
- Import constraints — enforced module boundaries in the compiler
Bug Fixes
- Prevent
SameFileErrorin bulk ingest - Fix Dockerfile.gpu Node version compatibility
- Fix
read_notecrash on directory paths - Fix pylint test using wrong Python executable
- Fix flaky perf test budget for CI runners
- Fix QMD model download race condition
- Various Docker permission and logging fixes
Full Changelog
See CHANGELOG.md for the complete history.
v0.7.0 — Bulk Ingest
Bulk Ingest from Local Storage
Ingest dozens or hundreds of files at once from a local directory — no MCP wire overhead, no running server required.
New features
BulkIngestorclass — scan source directory, SHA-256 content dedup via manifest, copy toraw/, batch compile withasyncio.Semaphoreconcurrency control, single reindex at end (cortex/compiler/bulk.py)cortex-bulk-ingestCLI —--source,--concurrency,--force,--dry-run(scripts/bulk_ingest.py)- One-click shell script —
./scripts/bulk_ingest.sh /path/to/papersloads.env, prints summary, runs the full pipeline POST /api/v1/bulk-ingestREST endpoint — programmatic bulk ingest without MCP (cortex/api/routes.py)- Docker
INGEST_DIRvolume mount — mount a local directory as/ingestin the container
Deduplication
Files are matched by SHA-256 content hash (not filename) via .cortex/ingest-manifest.json. Same content under a different name is skipped. --force bypasses the check.
Tests
31 new tests covering scan, hash, manifest, copy, compile batch, CLI parsing, REST endpoint, and Docker compose validation. Full suite: 286 passed.
v0.6.0
What's Changed
Bug Fixes
- Fix vault appearing empty via MCP — normalize QMD
filefield topathand stripqmd://prefix - Fix compile-flag bug — sources with failed LLM enrichment are no longer stuck;
enrichment_statusfrontmatter tracks whether enrichment actually succeeded - Fix blocking I/O in async paths — offload
log_operationfile writes andbuild_context_windownote reads to threads - Fix duplicate MCP service initialization — REST and MCP now share the same graph/QMD/compiler instances
- Fix
get_edges_batchoverhead — replace unnecessaryasyncio.gatherwith direct loop for in-memory operations
New Features
vault_compile(force, path)— recompile specific sources or force re-enrichment of stuck notes- Search caching for stdio MCP — repeated queries served from 30s TTL cache
- Async vault scan in MCP fallback — prevents event-loop blocking during standalone MCP startup
Tests & Benchmarks
- 8 performance benchmarks covering search, context building, MCP startup, and cache hits
- 254 total tests passing
Docs
- Added
roadmap/with bulk-ingest implementation plan