Local-first cognitive graph middleware with CLI, MCP, and Docker runtime targets.
Project description
CognitiveOS
CognitiveOS is a local-first cognitive graph runtime for agentic environments such as Claude Code, Gemini CLI, Codex, and other MCP-capable hosts.
This repository implements a production-oriented project skeleton for a local-first agent memory runtime, with a focus on:
- installable Python packaging via
pip - CLI operations for database lifecycle and graph manipulation
- an installable MCP server runtime
- Docker-based deployment for HTTP MCP serving
- extensible provider and extractor boundaries
📦
v0.1.1is now available on PyPI:pip install cognitiveos
✨ Design Goals
CognitiveOS is not intended to be a universal knowledge vault.
Its primary goal is to give an agent host a compact, durable, searchable memory layer that remains useful across sessions without forcing the runtime to mirror every source in full.
The practical goals are:
- preserve durable user preferences, profile facts, goals, lessons, and decisions
- preserve useful source anchors such as files, folders, repositories, and URLs
- make those memories searchable through both keyword and semantic retrieval
- keep the public memory model compact enough that hosts can reason about it reliably
- support long-lived local operation with minimal infrastructure
- keep the host-facing tool surface small and stable
🧭 Design Philosophy
Several design choices in this repository follow that goal directly.
Local-first:
- memory lives in a local user-controlled runtime and does not require a hosted backend by default
- SQLite is the default runtime store
- MCP and CLI surfaces are designed to work well on a single machine
Compact public model:
- the runtime prefers a small number of structural node types over many specialized ones
- files are stored as
source_document - folders and repositories are stored as
source_collection - deep live inspection of codebases, folders, and remote resources remains the host agent's job
Searchability over verbatim chat copying:
- stored memory should be normalized into retrieval-friendly language
- durable facts should be explicit about actor, object, and time when known
- the point is future recall quality, not transcript fidelity
Source anchors over recursive mirroring:
- large repositories and folders should usually be remembered as compact roots
- the runtime stores enough summary and metadata to make the source re-openable
- the host agent can inspect the live source later when detailed exploration is needed
Operational simplicity:
- prefer predictable CLI and MCP semantics over feature sprawl
- prefer bounded metadata over unbounded recursive ingestion
- prefer internal hardening, such as SQLite stability settings and background logs, over expanding host-visible tooling
✅ Status
The current milestone is an MVP foundation:
- SQLite-backed node, edge, and audit log storage
sqlite-vecbacked vector index with cosine KNN retrieval- FTS5 keyword search over a unified
search_textprojection with bounded neighbor traversal - optional multi-provider embeddings with similarity probing and query-only semantic search
- hybrid ranking that merges semantic and FTS results
- content, file, and folder ingestion with durable
source_documentandsource_collectionroots - chat-backed document descriptions and retrieval-tag generation for file ingestion
- Trafilatura-first remote extraction with typed remote source metadata and snapshot preservation for remote URLs
- root-only folder inspection for repository, media, document, and workspace collection anchors
- update and link operations with audit tracing
- canonical node semantics where
node_typeis structural,durabilityis lifecycle,tagsare retrieval labels, andmetadatais factual structured payload - canonical edge semantics where
strength_scoreis the only runtime edge-strength field - dream execution with access-log-driven clustering, chat-first compaction, host-agent fallback tasks, and
MEMORY.MDgeneration - CLI and MCP entrypoints
- operations commands for health checks, provider smoke tests, and embedding reindexing
- host bootstrap bundle generation for cold-start memory mount and MCP wiring
- generic host bootstrap outputs plus Codex-specific project auto-install via
AGENTS.mdand.codex/config.toml - first-start onboarding questions that seed pinned system-profile memory through structured profile metadata
- background dream execution for runtime-only compaction paths
🚀 Quick Start
python -m venv .venv
. .venv/bin/activate
pip install -e ".[dev]"
Initialize the workspace database:
cognitiveos init-db
Add a node:
cognitiveos add --type content --payload "CognitiveOS stores graph-shaped memory." --tag tech --tag memory --tag graph
Add a folder root:
cognitiveos add --type folder --payload ".\\Pictures\\Japan Trip 2025" --name "Japan Trip 2025 Photos" --tag travel --tag japan --tag photos
Add a remote source document and preserve a local snapshot:
cognitiveos add --type file --payload "https://example.com/article" --name "Example Article" --tag article --tag reference
Add a browser-exported local capture with a sidecar manifest:
cognitiveos add --type file --payload ".\\exports\\article.html"
Note:
- use repeated
--tagfor retrieval labels - use
--namewhen the node should keep a stable human-readable title instead of relying on payload-derived defaults - remote
httpandhttpsURLs are preserved by default under.cognitiveos/snapshots/, using Markdown for readable text/page captures and binary files for formats such as PDF - when a page requires login or browser state, use the host's existing browser tools to open the accessible page first; CognitiveOS v1 does not automate browser capture itself
- adding the same remote URL again warns on conflict by default; use
force=trueto refresh that source in place - host-assisted inputs can be: the final accessible URL, a browser-exported local HTML file, or a host-prepared Markdown file
- for browser-exported local HTML or Markdown, add a sidecar file named
<stem>.cognitiveos-source.jsonbeside the export to preserve the original remote URL and capture metadata
Context-size warning:
include_neighbors,include_content, andinclude_evidencecan expand returned context very quickly- start narrow, then widen only when the initial result is clearly insufficient
- for routine recall, prefer
include_neighbors=0or1,include_content=false, andinclude_evidence=false
Search by keyword:
cognitiveos search --keyword CognitiveOS --top-k 5 --include-neighbors 1
Run hybrid search:
cognitiveos search --query "graph memory runtime" --keyword CognitiveOS --top-k 5
Run the MCP server over stdio:
cognitiveos-mcp --transport stdio --profile host-core
Run the MCP server over Streamable HTTP:
cognitiveos-mcp --transport streamable-http --profile host-core --host 0.0.0.0 --port 8000 --path /mcp
🔌 Provider Configuration
Embedding and chat providers are optional. When an embedding model is configured:
addperforms similarity probing before insert unlessforce=truesearch --query ...performs semantic search even without keywordssearch --query ... --keyword ...performs hybrid ranking- missing node embeddings are lazily backfilled
Provider role support:
ollama: chat, embeddingsopenai: chat, embeddingsgemini: chat, embeddingsanthropic: chat onlylocal_huggingface: chat, embeddings, but requirespip install 'cognitiveos[local-hf]'
Environment variables:
COGNITIVEOS_EMBEDDING_PROVIDER_TYPE=ollama
COGNITIVEOS_EMBEDDING_MODEL_NAME=nomic-embed-text
COGNITIVEOS_EMBEDDING_BASE_URL=http://localhost:11434/api
COGNITIVEOS_CHAT_PROVIDER_TYPE=ollama
COGNITIVEOS_CHAT_MODEL_NAME=gemma3
COGNITIVEOS_CHAT_BASE_URL=http://localhost:11434/api
COGNITIVEOS_SIMILARITY_THRESHOLD=0.92
COGNITIVEOS_HYBRID_SEMANTIC_WEIGHT=0.65
COGNITIVEOS_HYBRID_KEYWORD_WEIGHT=0.35
Examples by provider:
# OpenAI
COGNITIVEOS_EMBEDDING_PROVIDER_TYPE=openai
COGNITIVEOS_EMBEDDING_MODEL_NAME=text-embedding-3-small
COGNITIVEOS_EMBEDDING_API_KEY=...
COGNITIVEOS_CHAT_PROVIDER_TYPE=openai
COGNITIVEOS_CHAT_MODEL_NAME=gpt-5-mini
COGNITIVEOS_CHAT_API_KEY=...
# Anthropic chat only
COGNITIVEOS_CHAT_PROVIDER_TYPE=anthropic
COGNITIVEOS_CHAT_MODEL_NAME=claude-3-7-sonnet-latest
COGNITIVEOS_CHAT_API_KEY=...
# Gemini
COGNITIVEOS_EMBEDDING_PROVIDER_TYPE=gemini
COGNITIVEOS_EMBEDDING_MODEL_NAME=text-embedding-004
COGNITIVEOS_EMBEDDING_API_KEY=...
COGNITIVEOS_CHAT_PROVIDER_TYPE=gemini
COGNITIVEOS_CHAT_MODEL_NAME=gemini-2.5-flash
COGNITIVEOS_CHAT_API_KEY=...
🐳 Docker
Build:
docker build -t cognitiveos:latest .
Run:
docker run --rm -p 8000:8000 -v $(pwd)/data:/app/data cognitiveos:latest
With a local .env file:
cp .env.example .env
docker compose up --build
🛠 Operations
Health report:
cognitiveos doctor
Live provider smoke test:
cognitiveos providers-test
Rebuild the vector index from current node embedding inputs:
cognitiveos reindex-embeddings
Refresh one source_document from its original source path or URI:
cognitiveos refresh-source-document <node-id>
Generate host bootstrap and mount artifacts:
cognitiveos bootstrap-host
This command generates local runtime bootstrap artifacts under .cognitiveos/bootstrap/. They are environment-specific and are not intended to be committed to the repository.
Supported host kinds currently include:
genericas the default portable pathcodexwith project-level auto-install supportclaude-codeclaude-desktopgemini-clicursor
Inspect host bootstrap status:
cognitiveos host-bootstrap-status --host-kind generic
Submit first-start onboarding answers:
cognitiveos submit-host-onboarding \
--answer display_name=Bruce \
--answer role_team="Sr. Data Engineer" \
--answer preferred_language=Chinese \
--answer response_style="Concise, direct, pragmatic" \
--answer workspace_goal="Build CognitiveOS as a host-facing memory runtime"
Install the Codex-specific cold-start mount into project files:
cognitiveos bootstrap-host --host-kind codex --install
Queue a dream run in the background:
cognitiveos dream --background
Inspect current dream status:
cognitiveos dream --inspect status
Inspect recent dream runs:
cognitiveos dream --inspect runs
List pending host dream compaction tasks:
cognitiveos dream --inspect tasks
Resolve one pending dream compaction with host-authored compressed content:
cognitiveos dream --task-id <task-id> \
--title "Compressed cluster title" \
--description "Compressed description" \
--content "Compressed synthesis"
Resolve one pending compaction with heuristic fallback in the background:
cognitiveos dream --task-id <task-id> --use-heuristic
🧱 Data Model
Canonical node rules:
node_typecarries structural type onlydurabilitycarries lifecycle tier onlytagsare open retrieval labels onlymetadatastores structured factual payload only
Current structural node types:
memorysource_documentsource_collectionsuper_node
Current durability tiers:
workingdurablepinnedephemeral
Common add parameters:
payload: the primary input body or locatorname: optional human-readable title stored on the nodetag: repeated retrieval labelsdurability: optional lifecycle overrideforce: bypass similarity or duplicate blocking where supported
File ingestion keeps one durable node by default:
- local files keep extracted raw text in
source_document.content - remote URLs keep a compact preservation note in
source_document.content source_document.descriptionstores a retrieval-oriented descriptionsource_document.tagscarries user tags plus generated retrieval tags- document embeddings are built from
description + tags - keyword search does not index full raw document content for
source_document - remote URL source kinds include
remote_page,remote_document,remote_feed_item,remote_video, andremote_binary - remote snapshots are preserved under
.cognitiveos/snapshots/ read --include-contenton a remotesource_documentreturns the preserved Markdown snapshot body when available- binary remote snapshots stay preserved on disk and
read --include-contentfalls back to the stored note instead of emitting raw bytes - browser-exported local HTML / Markdown with a sibling
<stem>.cognitiveos-source.jsonmanifest is ingested as a remote source instead of a plainlocal_file
Browser-capture sidecar example:
{
"source_kind": "remote_page",
"requested_url": "https://example.com/login",
"final_url": "https://example.com/article",
"title": "Captured Article",
"capture_method": "browser_export_html",
"captured_at": "2026-04-09T10:00:00+08:00",
"http_status": 200,
"exported_from": "chrome-devtools"
}
Folder ingestion also keeps one durable node by default:
source_collection.contentstores a compact root summary, not a recursive file dumpsource_collection.descriptionstores a retrieval-oriented collection summarysource_collection.metadata.source.refstores the normalized folder pathsource_collection.metadata.collection.classis one ofrepository,media_collection,document_collection, orworkspace_bundle- folder scanning is
root_onlyin v1, with bounded sample entries, file-type counts, and important markers - folder embeddings are built from
description + tags + compact collection hints updaterevises the stored summary only; it does not rescan the live folder
Canonical edge rules:
strength_scoreis the only runtime edge-strength field- edge lifecycle is controlled through
statusvalues such asactive,weak, andstale linkno longer accepts a publicweightparameter
🌙 Dream Policy
Dream becomes due when either condition is met:
10new memory events have accumulated since the last completed dream- more than
24hours have passed since the last completed dream and at least5new memory events have accumulated since that dream
When a chat model is configured, CognitiveOS auto-triggers dream on the next memory operation after the threshold is met.
When that auto-trigger path can complete entirely inside the runtime, CognitiveOS queues dream in the background instead of blocking the current memory operation.
When the age window is reached but fewer than 5 new events exist, CognitiveOS emits a deferred reminder instead of auto-running dream.
Dream compaction priority is:
chat providerhost agentheuristic fallback
When no chat model is configured, or when chat compaction fails during a dream run, CognitiveOS returns pending host compaction tasks with source data, a prepared digest, and a prompt for the host agent.
When no chat model is configured and dream is due, CognitiveOS emits a reminder on the next memory operation instead of auto-running dream. The reminder points the host to run dream, inspect pending compactions, and submit compressed clusters back through dream itself.
For host-core integrations, dream is the single public dream entrypoint. It covers:
- running a new dream job
- inspecting current dream status
- inspecting recent runs
- inspecting pending compaction tasks
- resolving one pending compaction task
Heuristic fallback can also run in the background after the host explicitly selects it during compaction resolution.
📁 Layout
skills/ repository-local agent skill instructions
src/cognitiveos/
cli/ CLI entrypoint
db/ SQLite schema and repository
extractors/ File and URL extraction pipeline
mcp/ MCP server entrypoint
providers/ Provider abstractions
📝 Notes
- Default runtime paths are user-level and host-agnostic under
~/.cognitiveos/, so Codex, Claude Code, Gemini CLI, and other hosts can share one CognitiveOS runtime by default. - When you pass
--db-path, CognitiveOS infers the shared runtime root from that database path and keepsMEMORY.MD, logs, and snapshots anchored to the same runtime. - Bootstrap artifacts remain project-local by default under
./.cognitiveos/bootstrap/. - Override runtime locations explicitly with
COGNITIVEOS_HOME,COGNITIVEOS_DB_PATH, andCOGNITIVEOS_MEMORY_OUTPUT_PATHwhen needed. bootstrap-host --host-kind genericis the default bootstrap path and generates local host guidance under.cognitiveos/bootstrap/.bootstrap-host --host-kind codex --installadditionally writes a managed block into project-rootAGENTS.mdand.codex/config.tomlfor Codex-specific auto-mount, and pins--project-root,--db-path, and--memory-output-pathin the generated MCP config.- On first startup, the host should call
get_host_bootstrap_status; when onboarding is required, ask the user the generated questions and submit them withsubmit_host_onboardingbefore depending on memory. - Files under
.cognitiveos/bootstrap/are runtime-generated local artifacts. Discover them throughhost-bootstrap-statusor generate them withbootstrap-host; they are not meant to be repository-tracked source files. - Durable engineering docs in this repository are kept in English.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cognitiveos-0.1.1.tar.gz.
File metadata
- Download URL: cognitiveos-0.1.1.tar.gz
- Upload date:
- Size: 12.5 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e0297e8b99e0d99f7f59bed09af86758583315645a3e918997e57864a6125df
|
|
| MD5 |
6f93506425aec45455182f0f17e6c210
|
|
| BLAKE2b-256 |
89d1f3dbf3deca0f657f706c54984bcfdad0d2d81dc0e5adc8abd5c91512c672
|
File details
Details for the file cognitiveos-0.1.1-py3-none-any.whl.
File metadata
- Download URL: cognitiveos-0.1.1-py3-none-any.whl
- Upload date:
- Size: 97.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea5a31edc3f79032cfa0dfa2ff04e4b714c5f5a06b279d78c3c905a9a6278915
|
|
| MD5 |
bc8eed5f707b65bc420956159bc3011c
|
|
| BLAKE2b-256 |
616c3c96c6b5b6e818a0c403f4665e47f4d0cfd805ab3f2449d601d0a1ad49cc
|