Skip to main content

Memory

Pawz uses Project Engram, a biologically-inspired three-tier memory architecture that lets agents remember facts, preferences, and context across conversations with graph-based knowledge management, hybrid search, and automatic PII encryption.

Architecture

Engram models memory after human cognitive architecture with three tiers:

How it works

Configuration

Go to Settings → Sessions to configure memory:

Memory categories

Each memory is tagged with a category: Memory retrieval uses a three-signal hybrid algorithm fused with Reciprocal Rank Fusion (RRF):
  1. BM25 — text relevance via full-text search with porter stemming
  2. Vector cosine similarity — semantic meaning via Ollama embeddings
  3. Graph spreading activation — 1-hop traversal of typed memory edges to find related memories
  4. RRF fusion — merges all three signals without requiring score normalization
  5. Reranking — configurable strategy: RRF, MMR (maximal marginal relevance), or combined
  6. Keyword fallback — when both BM25 and vector search return no results, the engine falls back to a keyword search using SQL LIKE on memory content. This ensures memories can always be found even when embeddings are unavailable or the full-text index misses a match.
:::tip Keyword fallback The keyword fallback is automatic — you don’t need to configure anything. If semantic search and BM25 both return empty results for a query, Pawz transparently retries with a simple substring match so you never get a false “no results found.” ::: In the Memory Palace, you can adjust:

Memory Palace

The Memory Palace is a dedicated view for managing all stored memories. It is organized into four tabs:

Tabs

Recall

Type a query into the search box and press Enter (or click the search button). Results are displayed as cards showing the category tag, relevance score (percentage), content preview, and importance. Clicking a memory in the sidebar also opens it in the Recall tab.

Remember

Manually store a new memory by filling in:
  • Content — the text to remember
  • Category — select from the standard categories (general, preference, instruction, etc.)
  • Importance — 1–10 scale
Click Save Memory to persist it. The sidebar and stats update automatically.

Graph

Click Render to generate a bubble-chart visualization. Memories are grouped by category and laid out in a circle. Each bubble represents one memory — its size reflects importance, and its color maps to the category. This gives a quick visual overview of what your agent knows and where knowledge is concentrated.

Files

Browse and edit the agent’s identity and personality files that live on disk. This tab is always available, even when the embedding model is not configured.

Embedding status banner

At the top of the Memory Palace, a status banner shows whether the embedding model is loaded and operational: :::note When embeddings are unavailable the banner tells you that memory search will fall back to keyword matching. You can still store and retrieve memories — just without semantic ranking. :::

Recent memories sidebar

On the right side of the Memory Palace, a sidebar displays the 20 most recently stored memories for quick reference. Each card shows:
  • Category tag
  • Content preview (first 60 characters)
  • Importance score
Click any card to jump to its full details in the Recall tab. A search box at the top of the sidebar lets you filter the visible cards by keyword.

JSON export

Click the Export button in the Memory Palace toolbar to download all memories as a JSON file. The export includes:
The file is named paw-memories-YYYY-MM-DD.json. Use this for backup or to transfer memories between machines.

Slash commands

Quick memory operations from any chat:

Auto-capture

When auto-capture is enabled, the engine extracts memorable facts from conversations using heuristics. It looks for:
  • User preferences (“I prefer…”, “I like…”)
  • Explicit instructions (“Always…”, “Never…”)
  • Personal context (names, locations, roles)
  • Concrete facts (dates, numbers, decisions)

Embedding setup

Pawz auto-manages embeddings via Ollama:
  1. Checks if Ollama is reachable
  2. Auto-starts Ollama if needed
  3. Checks if the embedding model is available
  4. Auto-pulls the model if missing
  5. Tests embedding generation
If you switch embedding models, use backfill to re-embed existing memories.

Embedding backends

The engine tries endpoints in order:
  1. Ollama /api/embed (current API)
  2. Ollama /api/embeddings (legacy API)
  3. OpenAI-compatible /v1/embeddings
This means you can use any OpenAI-compatible embedding API by changing the base URL.

Security

Memory in Pawz is protected at multiple levels: :::info PII auto-encryption Engram automatically scans memory content for PII using a two-layer defense:
  • Layer 1 (regex): 17 patterns detect emails, phone numbers, SSNs, credit cards, JWTs, AWS keys, etc.
  • Layer 2 (LLM): An LLM-assisted scanner catches context-dependent PII that regex misses (e.g., “my mother’s maiden name is Smith”). Content flagged by Layer 1 or exceeding a size threshold is sent to the active model for classification.
All PII-containing content is encrypted with per-agent AES-256-GCM keys (derived via HKDF from the OS keychain). Decryption happens transparently on retrieval. :::

Consolidation engine

Engram runs a background consolidation cycle every 5 minutes that maintains memory health:

Memory strength

Each memory has a strength score (0.0–1.0) managed by the FadeMem dual-layer decay system:
  • Layer 1 (Ebbinghaus curve): Time-based exponential decay with configurable half-life. High-importance memories (importance > 0.7) decay at half the rate. The decay factor is: 0.5^(age_days / half_life) × importance_weight.
  • Layer 2 (LRU boost): Each memory access (search hit, recall, explicit read) increments a frequency counter. Frequently-accessed memories receive a boost that counteracts decay: min(access_count × 0.05, 0.3).
The combined strength determines garbage collection eligibility. This ensures frequently-used knowledge persists while truly stale information is naturally pruned.

GraphRAG community detection

The memory graph is periodically analyzed using Louvain modularity optimization to discover clusters of related knowledge:
  • Community labels are assigned to memories, enabling community-scoped retrieval
  • Modularity score tracks cluster quality — higher scores indicate well-separated knowledge domains
  • Cross-community edges highlight connections between knowledge areas
  • Communities are re-computed during consolidation cycles as new memories arrive

Agent memory tools

Agents have access to 7 memory tools for direct memory management:

Flow memory integration

When a flow runs, the executor automatically retrieves long-term memories so agent nodes have relevant context before they generate a response.

Pre-recall at flow start

Before any node executes, the flow executor builds a memory query from the graph name and all agent prompts in the flow, then calls pawEngine.memorySearch(). The top results (filtered at score ≥ 0.3) are concatenated into a memoryContext string and stored in FlowRunState. Every agent node receives this context in a [Relevant Memory] section prepended to its prompt via buildNodePrompt().

Cell-scoped memory in tesseract flows

Tesseract flows split work into parallel cells — independent sub-graphs that execute concurrently. Each cell needs different memory because the agents inside serve different purposes (e.g. a research cell vs. an analysis cell). The Conductor solves this with per-cell memory isolation:
  1. For each cell, a focused query is built from the cell’s agent prompts (up to 3 agents, 200 chars each, capped at 300 chars total)
  2. All cell queries are resolved concurrently via deps.searchMemory(), which calls pawEngine.memorySearch() with score ≥ 0.3 filtering
  3. Results are stored in an immutable resolvedCellMemory map — computed once before execution begins
  4. Each cell’s executor receives a ConductorDeps wrapper that binds its memory override to every executeNode and executeAgentStep call
This eliminates shared-state mutation — parallel cells never race on runState.memoryContext.

searchMemory IPC bridge

The searchMemory function on ConductorDeps bridges the flow engine to the Rust memory backend:
This is the same hybrid search pipeline (BM25 + vector + graph spreading activation) used in chat sessions, so flow agents benefit from the full Engram retrieval stack.