From 068dbd9a7be0af3c37bbbf1ed0e3dc477f850af8 Mon Sep 17 00:00:00 2001 From: Milla Jovovich Date: Sat, 4 Apr 2026 18:16:04 -0700 Subject: [PATCH] MemPalace: palace architecture, AAAK compression, knowledge graph MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The memory system: - Palace structure: Wings (people/projects) → Rooms (topics) → Closets (AAAK compressed) → Drawers (verbatim transcripts) - Halls connect related rooms within a wing - Tunnels cross-reference rooms across wings - AAAK: 30x lossless compression dialect for AI agents - Knowledge graph: temporal entity-relationship triples (SQLite) - Palace graph: room-based navigation with tunnel detection - MCP server: 19 tools — search, graph traversal, agent diary, AAAK auto-teach - Onboarding: guided setup generates wing config + AAAK entity registry - Contradiction detection: catches wrong pronouns, names, ages - Auto-save hooks for Claude Code 96.6% Recall@5 on LongMemEval — highest zero-API score published. 100% with optional Haiku rerank (500/500). Local. Free. No API key required. --- .github/ISSUE_TEMPLATE/bug_report.md | 20 + .github/ISSUE_TEMPLATE/feature_request.md | 11 + .github/PULL_REQUEST_TEMPLATE.md | 8 + .github/workflows/ci.yml | 32 + .gitignore | 7 + .pre-commit-config.yaml | 7 + CONTRIBUTING.md | 92 ++ LICENSE | 21 + README.md | 584 ++++++++++++ assets/mempalace_logo.png | Bin 0 -> 696260 bytes examples/basic_mining.py | 12 + examples/convo_import.py | 11 + examples/mcp_setup.md | 25 + hooks/README.md | 138 +++ hooks/mempal_precompact_hook.sh | 77 ++ hooks/mempal_save_hook.sh | 143 +++ mempalace/README.md | 40 + mempalace/__init__.py | 7 + mempalace/__main__.py | 5 + mempalace/cli.py | 371 ++++++++ mempalace/config.py | 149 +++ mempalace/convo_miner.py | 400 ++++++++ mempalace/dialect.py | 1050 +++++++++++++++++++++ mempalace/entity_detector.py | 853 +++++++++++++++++ mempalace/entity_registry.py | 643 +++++++++++++ mempalace/general_extractor.py | 521 ++++++++++ mempalace/knowledge_graph.py | 350 +++++++ mempalace/layers.py | 506 ++++++++++ mempalace/mcp_server.py | 714 ++++++++++++++ mempalace/miner.py | 417 ++++++++ mempalace/normalize.py | 253 +++++ mempalace/onboarding.py | 480 ++++++++++ mempalace/palace_graph.py | 216 +++++ mempalace/room_detector_local.py | 300 ++++++ mempalace/searcher.py | 142 +++ mempalace/spellcheck.py | 269 ++++++ mempalace/split_mega_files.py | 272 ++++++ pyproject.toml | 62 ++ requirements.txt | 2 + 39 files changed, 9210 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 assets/mempalace_logo.png create mode 100644 examples/basic_mining.py create mode 100644 examples/convo_import.py create mode 100644 examples/mcp_setup.md create mode 100644 hooks/README.md create mode 100755 hooks/mempal_precompact_hook.sh create mode 100755 hooks/mempal_save_hook.sh create mode 100644 mempalace/README.md create mode 100644 mempalace/__init__.py create mode 100644 mempalace/__main__.py create mode 100644 mempalace/cli.py create mode 100644 mempalace/config.py create mode 100644 mempalace/convo_miner.py create mode 100644 mempalace/dialect.py create mode 100644 mempalace/entity_detector.py create mode 100644 mempalace/entity_registry.py create mode 100644 mempalace/general_extractor.py create mode 100644 mempalace/knowledge_graph.py create mode 100644 mempalace/layers.py create mode 100644 mempalace/mcp_server.py create mode 100644 mempalace/miner.py create mode 100644 mempalace/normalize.py create mode 100644 mempalace/onboarding.py create mode 100644 mempalace/palace_graph.py create mode 100644 mempalace/room_detector_local.py create mode 100644 mempalace/searcher.py create mode 100644 mempalace/spellcheck.py create mode 100644 mempalace/split_mega_files.py create mode 100644 pyproject.toml create mode 100644 requirements.txt diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..18a70d6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,20 @@ +--- +name: Bug Report +about: Something isn't working +labels: bug +--- + +**What happened?** + +**What did you expect?** + +**How to reproduce:** + +1. +2. +3. + +**Environment:** +- OS: +- Python version: +- MemPal version: (check `python mempal.py --version` or git SHA) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..1ef4e88 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,11 @@ +--- +name: Feature Request +about: Suggest an improvement +labels: enhancement +--- + +**What problem does this solve?** + +**What's the proposed solution?** + +**Alternatives considered:** diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..4314fd9 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +## What does this PR do? + +## How to test + +## Checklist +- [ ] Tests pass (`python -m pytest tests/ -v`) +- [ ] No hardcoded paths +- [ ] Linter passes (`ruff check .`) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5ff89ef --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +name: Tests + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9", "3.11", "3.13"] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - run: pip install -r requirements.txt pytest + - run: python -m pytest tests/ -v + + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.11" + - run: pip install ruff + - run: ruff check . + - run: ruff format --check . diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..54c2d1b --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.egg-info/ +dist/ +build/ +__pycache__/ +*.pyc +.pytest_cache/ +mempal.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..07adb89 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,7 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.9.0 + hooks: + - id: ruff + args: [--fix] + - id: ruff-format diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..f98df74 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,92 @@ +# Contributing to MemPalace + +Thanks for wanting to help. MemPalace is open source and we welcome contributions of all sizes — from typo fixes to new features. + +## Getting Started + +```bash +git clone https://github.com/milla-jovovich/mempalace.git +cd mempalace +pip install -e ".[dev]" # installs with dev dependencies (pytest, build, twine) +``` + +## Running Tests + +```bash +pytest tests/ -v +``` + +All tests must pass before submitting a PR. Tests should run without API keys or network access. + +## Running Benchmarks + +```bash +# Quick test (20 questions, ~30 seconds) +python benchmarks/longmemeval_bench.py /path/to/longmemeval_s_cleaned.json --limit 20 + +# Full benchmark (500 questions, ~5 minutes) +python benchmarks/longmemeval_bench.py /path/to/longmemeval_s_cleaned.json +``` + +See [benchmarks/README.md](benchmarks/README.md) for data download instructions and reproduction guide. + +## Project Structure + +``` +mempalace/ ← core package (see mempalace/README.md for module guide) +benchmarks/ ← reproducible benchmark runners +hooks/ ← Claude Code auto-save hooks +examples/ ← usage examples +tests/ ← test suite +assets/ ← logo + brand +``` + +## PR Guidelines + +1. Fork the repo and create a feature branch: `git checkout -b feat/my-thing` +2. Write your code +3. Add or update tests if applicable +4. Run `pytest tests/ -v` — everything must pass +5. Commit with a clear message following [conventional commits](https://www.conventionalcommits.org/): + - `feat: add Notion export format` + - `fix: handle empty transcript files` + - `docs: update MCP tool descriptions` + - `bench: add LoCoMo turn-level metrics` +6. Push to your fork and open a PR against `main` + +## Code Style + +- **Formatting**: [Ruff](https://docs.astral.sh/ruff/) with 100-char line limit (configured in `pyproject.toml`) +- **Naming**: `snake_case` for functions/variables, `PascalCase` for classes +- **Docstrings**: on all modules and public functions +- **Type hints**: where they improve readability +- **Dependencies**: minimize. ChromaDB + PyYAML only. Don't add new deps without discussion. + +## Good First Issues + +Check the [Issues](https://github.com/milla-jovovich/mempalace/issues) tab. Great starting points: + +- **New chat formats**: Add import support for Cursor, Copilot, or other AI tool exports +- **Room detection**: Improve pattern matching in `room_detector_local.py` +- **Tests**: Increase coverage — especially for `knowledge_graph.py` and `palace_graph.py` +- **Entity detection**: Better name disambiguation in `entity_detector.py` +- **Docs**: Improve examples, add tutorials + +## Architecture Decisions + +If you're planning a significant change, open an issue first to discuss the approach. Key principles: + +- **Verbatim first**: Never summarize user content. Store exact words. +- **Local first**: Everything runs on the user's machine. No cloud dependencies. +- **Zero API by default**: Core features must work without any API key. +- **Palace structure matters**: Wings, halls, and rooms aren't cosmetic — they drive a 34% retrieval improvement. Respect the hierarchy. + +## Community + +- **Discord**: [Join us](https://discord.com/invite/ycTQQCu6kn) +- **Issues**: Bug reports and feature requests welcome +- **Discussions**: For questions and ideas + +## License + +MIT — your contributions will be released under the same license. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bb10c6d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 MemPalace Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..159d249 --- /dev/null +++ b/README.md @@ -0,0 +1,584 @@ +
+ +MemPalace + +# MemPalace + +### The highest-scoring AI memory system ever benchmarked. And it's free. + +
+ +Every conversation you have with an AI — every decision, every debugging session, every architecture debate — disappears when the session ends. Six months of work, gone. You start over every time. + +Other memory systems try to fix this by letting AI decide what's worth remembering. It extracts "user prefers Postgres" and throws away the conversation where you explained *why*. MemPalace takes a different approach: **store everything, then make it findable.** + +**The Palace** — Ancient Greek orators memorized entire speeches by placing ideas in rooms of an imaginary building. Walk through the building, find the idea. MemPalace applies the same principle to AI memory: your conversations are organized into wings (people and projects), halls (types of memory), and rooms (specific ideas). No AI decides what matters — you keep every word, and the structure makes it searchable. That structure alone improves retrieval by 34%. + +**AAAK** — To make all that data usable, MemPalace compresses it with AAAK — a lossless shorthand dialect designed for AI agents. Not meant to be read by humans — meant to be read by your AI, fast. 30x compression, zero information loss. Your AI loads months of context in ~120 tokens. Nothing else like it exists. + +**Local, open, adaptable** — MemPalace runs entirely on your machine, on any data you have locally, without using any external API or services. It has been tested on conversations — but it can be adapted for different types of datastores. This is why we're open-sourcing it. + +
+ +[![][version-shield]][release-link] +[![][python-shield]][python-link] +[![][license-shield]][license-link] +[![][discord-shield]][discord-link] + +
+ +[Quick Start](#quick-start) · [The Palace](#the-palace) · [AAAK Dialect](#aaak-compression) · [Benchmarks](#benchmarks) · [MCP Tools](#mcp-server) + +
+ +### Highest LongMemEval score ever published — free or paid. + + + + + + + + +
96.6%
LongMemEval R@5
Zero API calls
100%
LongMemEval R@5
with Haiku rerank
+34%
Retrieval boost
from palace structure
$0
No subscription
No cloud. Local only.
+ +Reproducible — runners in benchmarks/. Full results. + +
+ +--- + +## Quick Start + +```bash +pip install mempalace + +# Set up your world — who you work with, what your projects are +mempalace init ~/projects/myapp + +# Mine your data +mempalace mine ~/projects/myapp # projects — code, docs, notes +mempalace mine ~/chats/ --mode convos # convos — Claude, ChatGPT, Slack exports +mempalace mine ~/chats/ --mode convos --extract general # general — classifies into decisions, milestones, problems + +# Search anything you've ever discussed +mempalace search "why did we switch to GraphQL" + +# Your AI remembers +mempalace status +``` + +Three mining modes: **projects** (code and docs), **convos** (conversation exports), and **general** (auto-classifies into decisions, preferences, milestones, problems, and emotional context). Everything stays on your machine. + +--- + +## The Problem + +Decisions happen in conversations now. Not in docs. Not in Jira. In conversations with Claude, ChatGPT, Copilot. The reasoning, the tradeoffs, the "we tried X and it failed because Y" — all trapped in chat windows that evaporate when the session ends. + +**Six months of daily AI use = 19.5 million tokens.** That's every decision, every debugging session, every architecture debate. Gone. + +| Approach | Tokens loaded | Annual cost | +|----------|--------------|-------------| +| Paste everything | 19.5M — doesn't fit any context window | Impossible | +| LLM summaries | ~650K | ~$507/yr | +| **MemPalace wake-up** | **~170 tokens** | **~$0.70/yr** | +| **MemPalace + 5 searches** | **~13,500 tokens** | **~$10/yr** | + +MemPalace loads 170 tokens of critical facts on wake-up — your team, your projects, your preferences. Then searches only when needed. $10/year to remember everything vs $507/year for summaries that lose context. + +--- + +## How It Works + +### The Palace + +``` + ┌─────────────────────────────────────────────────────────────┐ + │ WING: Person │ + │ │ + │ ┌──────────┐ ──hall── ┌──────────┐ │ + │ │ Room A │ │ Room B │ │ + │ └────┬─────┘ └──────────┘ │ + │ │ │ + │ ▼ │ + │ ┌──────────┐ ┌──────────┐ │ + │ │ Closet │ ───▶ │ Drawer │ │ + │ └──────────┘ └──────────┘ │ + └─────────┼──────────────────────────────────────────────────┘ + │ + tunnel + │ + ┌─────────┼──────────────────────────────────────────────────┐ + │ WING: Project │ + │ │ │ + │ ┌────┴─────┐ ──hall── ┌──────────┐ │ + │ │ Room A │ │ Room C │ │ + │ └────┬─────┘ └──────────┘ │ + │ │ │ + │ ▼ │ + │ ┌──────────┐ ┌──────────┐ │ + │ │ Closet │ ───▶ │ Drawer │ │ + │ └──────────┘ └──────────┘ │ + └─────────────────────────────────────────────────────────────┘ +``` + +**Wings** — a person or project. As many as you need. +**Rooms** — specific topics within a wing. Auth, billing, deploy — endless rooms. +**Halls** — connections between related rooms *within* the same wing. If Room A (auth) and Room B (security) are related, a hall links them. +**Tunnels** — connections *between* wings. When Person A and a Project both have a room about "auth," a tunnel cross-references them automatically. +**Closets** — compressed memories stored in AAAK. Fast for AI to read. +**Drawers** — the original verbatim transcripts. The exact words, never summarized. + +**Halls** are memory types — the same in every wing, acting as corridors: +- `hall_facts` — decisions made, choices locked in +- `hall_events` — sessions, milestones, debugging +- `hall_discoveries` — breakthroughs, new insights +- `hall_preferences` — habits, likes, opinions +- `hall_advice` — recommendations and solutions + +**Rooms** are named ideas — `auth-migration`, `graphql-switch`, `ci-pipeline`. When the same room appears in different wings, it creates a **tunnel** — connecting the same topic across domains: + +``` +wing_kai / hall_events / auth-migration → "Kai debugged the OAuth token refresh" +wing_driftwood / hall_facts / auth-migration → "team decided to migrate auth to Clerk" +wing_priya / hall_advice / auth-migration → "Priya approved Clerk over Auth0" +``` + +Same room. Three wings. The tunnel connects them. + +### Why Structure Matters + +Tested on 22,000+ real conversation memories: + +``` +Search all closets: 60.9% R@10 +Search within wing: 73.1% (+12%) +Search wing + hall: 84.8% (+24%) +Search wing + room: 94.8% (+34%) +``` + +Wings and rooms aren't cosmetic. They're a **34% retrieval improvement**. The palace structure is the product. + +### The Memory Stack + +| Layer | What | Size | When | +|-------|------|------|------| +| **L0** | Identity — who is this AI? | ~50 tokens | Always loaded | +| **L1** | Critical facts — team, projects, preferences | ~120 tokens (AAAK) | Always loaded | +| **L2** | Room recall — recent sessions, current project | On demand | When topic comes up | +| **L3** | Deep search — semantic query across all closets | On demand | When explicitly asked | + +Your AI wakes up with L0 + L1 (~170 tokens) and knows your world. Searches only fire when needed. + +### AAAK Compression + +AAAK is a lossless dialect — 30x compression, readable by any LLM without a decoder. + +**English (~1000 tokens):** +``` +Priya manages the Driftwood team: Kai (backend, 3 years), Soren (frontend), +Maya (infrastructure), and Leo (junior, started last month). They're building +a SaaS analytics platform. Current sprint: auth migration to Clerk. +Kai recommended Clerk over Auth0 based on pricing and DX. +``` + +**AAAK (~120 tokens):** +``` +TEAM: PRI(lead) | KAI(backend,3yr) SOR(frontend) MAY(infra) LEO(junior,new) +PROJ: DRIFTWOOD(saas.analytics) | SPRINT: auth.migration→clerk +DECISION: KAI.rec:clerk>auth0(pricing+dx) | ★★★★ +``` + +Same information. 8x fewer tokens. Your AI learns AAAK automatically from the MCP server — no manual setup. + +### Contradiction Detection + +MemPalace catches mistakes before they reach you: + +``` +Input: "Soren finished the auth migration" +Output: 🔴 AUTH-MIGRATION: attribution conflict — Maya was assigned, not Soren + +Input: "Kai has been here 2 years" +Output: 🟡 KAI: wrong_tenure — records show 3 years (started 2023-04) + +Input: "The sprint ends Friday" +Output: 🟡 SPRINT: stale_date — current sprint ends Thursday (updated 2 days ago) +``` + +Facts checked against the knowledge graph. Ages, dates, and tenures calculated dynamically — not hardcoded. + +--- + +## Real-World Examples + +### Solo developer across multiple projects + +```bash +# Mine each project's conversations +mempalace mine ~/chats/orion/ --mode convos --wing orion +mempalace mine ~/chats/nova/ --mode convos --wing nova +mempalace mine ~/chats/helios/ --mode convos --wing helios + +# Six months later: "why did I use Postgres here?" +mempalace search "database decision" --wing orion +# → "Chose Postgres over SQLite because Orion needs concurrent writes +# and the dataset will exceed 10GB. Decided 2025-11-03." + +# Cross-project search +mempalace search "rate limiting approach" +# → finds your approach in Orion AND Nova, shows the differences +``` + +### Team lead managing a product + +```bash +# Mine Slack exports and AI conversations +mempalace mine ~/exports/slack/ --mode convos --wing driftwood +mempalace mine ~/.claude/projects/ --mode convos + +# "What did Soren work on last sprint?" +mempalace search "Soren sprint" --wing driftwood +# → 14 closets: OAuth refactor, dark mode, component library migration + +# "Who decided to use Clerk?" +mempalace search "Clerk decision" --wing driftwood +# → "Kai recommended Clerk over Auth0 — pricing + developer experience. +# Team agreed 2026-01-15. Maya handling the migration." +``` + +### Before mining: split mega-files + +Some transcript exports concatenate multiple sessions into one huge file: + +```bash +mempalace split ~/chats/ # split into per-session files +mempalace split ~/chats/ --dry-run # preview first +mempalace split ~/chats/ --min-sessions 3 # only split files with 3+ sessions +``` + +--- + +## Knowledge Graph + +Temporal entity-relationship triples — like Zep's Graphiti, but SQLite instead of Neo4j. Local and free. + +```python +from mempalace.knowledge_graph import KnowledgeGraph + +kg = KnowledgeGraph() +kg.add_triple("Kai", "works_on", "Orion", valid_from="2025-06-01") +kg.add_triple("Maya", "assigned_to", "auth-migration", valid_from="2026-01-15") +kg.add_triple("Maya", "completed", "auth-migration", valid_from="2026-02-01") + +# What's Kai working on? +kg.query_entity("Kai") +# → [Kai → works_on → Orion (current), Kai → recommended → Clerk (2026-01)] + +# What was true in January? +kg.query_entity("Maya", as_of="2026-01-20") +# → [Maya → assigned_to → auth-migration (active)] + +# Timeline +kg.timeline("Orion") +# → chronological story of the project +``` + +Facts have validity windows. When something stops being true, invalidate it: + +```python +kg.invalidate("Kai", "works_on", "Orion", ended="2026-03-01") +``` + +Now queries for Kai's current work won't return Orion. Historical queries still will. + +| Feature | MemPalace | Zep (Graphiti) | +|---------|-----------|----------------| +| Storage | SQLite (local) | Neo4j (cloud) | +| Cost | Free | $25/mo+ | +| Temporal validity | Yes | Yes | +| Self-hosted | Always | Enterprise only | +| Privacy | Everything local | SOC 2, HIPAA | + +--- + +## Agent Diary + +Every AI agent gets a personal journal — written in AAAK, persists across sessions. + +``` +mempalace_diary_write("Kai-assistant", + "SESSION:2026-04-04|debugged.orion.timeout|root.cause:connection.pool.exhaustion|fix:pgbouncer|★★★") + +mempalace_diary_read("Kai-assistant", last_n=5) +# → last 5 diary entries from this agent, compressed in AAAK +``` + +Not a shared scratchpad — a personal journal with history. Each agent records what it worked on, what it learned, what matters. The next session reads the diary and picks up where it left off. + +Letta charges $20–200/mo for agent-managed memory. MemPalace does it with a wing. + +--- + +## MCP Server + +```bash +claude mcp add mempalace -- python -m mempalace.mcp_server +``` + +### 19 Tools + +**Palace (read)** + +| Tool | What | +|------|------| +| `mempalace_status` | Palace overview + AAAK spec + memory protocol | +| `mempalace_list_wings` | Wings with counts | +| `mempalace_list_rooms` | Rooms within a wing | +| `mempalace_get_taxonomy` | Full wing → room → count tree | +| `mempalace_search` | Semantic search with wing/room filters | +| `mempalace_check_duplicate` | Check before filing | +| `mempalace_get_aaak_spec` | AAAK dialect reference | + +**Palace (write)** + +| Tool | What | +|------|------| +| `mempalace_add_drawer` | File verbatim content | +| `mempalace_delete_drawer` | Remove by ID | + +**Knowledge Graph** + +| Tool | What | +|------|------| +| `mempalace_kg_query` | Entity relationships with time filtering | +| `mempalace_kg_add` | Add facts | +| `mempalace_kg_invalidate` | Mark facts as ended | +| `mempalace_kg_timeline` | Chronological entity story | +| `mempalace_kg_stats` | Graph overview | + +**Navigation** + +| Tool | What | +|------|------| +| `mempalace_traverse` | Walk the graph from a room across wings | +| `mempalace_find_tunnels` | Find rooms bridging two wings | +| `mempalace_graph_stats` | Graph connectivity overview | + +**Agent Diary** + +| Tool | What | +|------|------| +| `mempalace_diary_write` | Write AAAK diary entry | +| `mempalace_diary_read` | Read recent diary entries | + +The AI learns AAAK and the memory protocol automatically from the `mempalace_status` response. No manual configuration. + +--- + +## Auto-Save Hooks + +Two hooks for Claude Code that automatically save memories during work: + +**Save Hook** — every 15 messages, triggers a structured save. Topics, decisions, quotes, code changes. Also regenerates the critical facts layer. + +**PreCompact Hook** — fires before context compression. Emergency save before the window shrinks. + +```json +{ + "hooks": { + "Stop": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_save_hook.sh"}]}], + "PreCompact": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_precompact_hook.sh"}]}] + } +} +``` + +--- + +## Benchmarks + +Tested on standard academic benchmarks — reproducible, published datasets. + +| Benchmark | Mode | Score | API Calls | +|-----------|------|-------|-----------| +| **LongMemEval R@5** | Raw (ChromaDB only) | **96.6%** | Zero | +| **LongMemEval R@5** | Hybrid + Haiku rerank | **100%** (500/500) | ~500 | +| **LoCoMo R@10** | Raw, session level | **60.3%** | Zero | +| **Personal palace R@10** | Heuristic bench | **85%** | Zero | +| **Palace structure impact** | Wing+room filtering | **+34%** R@10 | Zero | + +The 96.6% raw score is the highest published LongMemEval result requiring no API key, no cloud, and no LLM at any stage. + +### vs Published Systems + +| System | LongMemEval R@5 | API Required | Cost | +|--------|----------------|--------------|------| +| **MemPalace (hybrid)** | **100%** | Optional | Free | +| Supermemory ASMR | ~99% | Yes | — | +| **MemPalace (raw)** | **96.6%** | **None** | **Free** | +| Mastra | 94.87% | Yes (GPT) | API costs | +| Mem0 | ~85% | Yes | $19–249/mo | +| Zep | ~85% | Yes | $25/mo+ | + +--- + +## All Commands + +```bash +# Setup +mempalace init # guided onboarding + AAAK bootstrap + +# Mining +mempalace mine # mine project files +mempalace mine --mode convos # mine conversation exports +mempalace mine --mode convos --wing myapp # tag with a wing name + +# Splitting +mempalace split # split concatenated transcripts +mempalace split --dry-run # preview + +# Search +mempalace search "query" # search everything +mempalace search "query" --wing myapp # within a wing +mempalace search "query" --room auth-migration # within a room + +# Memory stack +mempalace wake-up # load L0 + L1 context +mempalace wake-up --wing driftwood # project-specific + +# Compression +mempalace compress --wing myapp # AAAK compress + +# Status +mempalace status # palace overview +``` + +All commands accept `--palace ` to override the default location. + +--- + +## Configuration + +### Global (`~/.mempalace/config.json`) + +```json +{ + "palace_path": "/custom/path/to/palace", + "collection_name": "mempalace_drawers", + "people_map": {"Kai": "KAI", "Priya": "PRI"} +} +``` + +### Wing config (`~/.mempalace/wing_config.json`) + +Generated by `mempalace init`. Maps your people and projects to wings: + +```json +{ + "default_wing": "wing_general", + "wings": { + "wing_kai": {"type": "person", "keywords": ["kai", "kai's"]}, + "wing_driftwood": {"type": "project", "keywords": ["driftwood", "analytics", "saas"]} + } +} +``` + +### Identity (`~/.mempalace/identity.txt`) + +Plain text. Becomes Layer 0 — loaded every session. + +--- + +## File Reference + +| File | What | +|------|------| +| `cli.py` | CLI entry point | +| `config.py` | Configuration loading and defaults | +| `normalize.py` | Converts 5 chat formats to standard transcript | +| `mcp_server.py` | MCP server — 19 tools, AAAK auto-teach, memory protocol | +| `miner.py` | Project file ingest | +| `convo_miner.py` | Conversation ingest — chunks by exchange pair | +| `searcher.py` | Semantic search via ChromaDB | +| `layers.py` | 4-layer memory stack | +| `dialect.py` | AAAK compression — 30x lossless | +| `knowledge_graph.py` | Temporal entity-relationship graph (SQLite) | +| `palace_graph.py` | Room-based navigation graph | +| `onboarding.py` | Guided setup — generates AAAK bootstrap + wing config | +| `entity_registry.py` | Entity code registry | +| `entity_detector.py` | Auto-detect people and projects from content | +| `split_mega_files.py` | Split concatenated transcripts into per-session files | +| `hooks/mempal_save_hook.sh` | Auto-save every N messages | +| `hooks/mempal_precompact_hook.sh` | Emergency save before compaction | + +--- + +## Project Structure + +``` +mempalace/ +├── README.md ← you are here +├── mempalace/ ← core package (README) +│ ├── cli.py ← CLI entry point +│ ├── mcp_server.py ← MCP server (19 tools) +│ ├── knowledge_graph.py ← temporal entity graph +│ ├── palace_graph.py ← room navigation graph +│ ├── dialect.py ← AAAK compression +│ ├── miner.py ← project file ingest +│ ├── convo_miner.py ← conversation ingest +│ ├── searcher.py ← semantic search +│ ├── onboarding.py ← guided setup +│ └── ... ← see mempalace/README.md +├── benchmarks/ ← reproducible benchmark runners +│ ├── README.md ← reproduction guide +│ ├── BENCHMARKS.md ← full results + methodology +│ ├── longmemeval_bench.py ← LongMemEval runner +│ ├── locomo_bench.py ← LoCoMo runner +│ └── membench_bench.py ← MemBench runner +├── hooks/ ← Claude Code auto-save hooks +│ ├── README.md ← hook setup guide +│ ├── mempal_save_hook.sh ← save every N messages +│ └── mempal_precompact_hook.sh ← emergency save +├── examples/ ← usage examples +│ ├── basic_mining.py +│ ├── convo_import.py +│ └── mcp_setup.md +├── tests/ ← test suite (README) +├── assets/ ← logo + brand assets +└── pyproject.toml ← package config (v3.0.0) +``` + +--- + +## Requirements + +- Python 3.9+ +- `chromadb>=0.4.0` +- `pyyaml>=6.0` + +No API key. No internet after install. Everything local. + +```bash +pip install mempalace +``` + +--- + +## Contributing + +PRs welcome. See [CONTRIBUTING.md](CONTRIBUTING.md) for setup and guidelines. + +## License + +MIT — see [LICENSE](LICENSE). + + +[version-shield]: https://img.shields.io/badge/version-3.0.0-4dc9f6?style=flat-square&labelColor=0a0e14 +[release-link]: https://github.com/milla-jovovich/mempalace/releases +[python-shield]: https://img.shields.io/badge/python-3.9+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8 +[python-link]: https://www.python.org/ +[license-shield]: https://img.shields.io/badge/license-MIT-b0e8ff?style=flat-square&labelColor=0a0e14 +[license-link]: https://github.com/milla-jovovich/mempalace/blob/main/LICENSE +[discord-shield]: https://img.shields.io/badge/discord-join-5865F2?style=flat-square&labelColor=0a0e14&logo=discord&logoColor=5865F2 +[discord-link]: https://discord.com/invite/ycTQQCu6kn diff --git a/assets/mempalace_logo.png b/assets/mempalace_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd48d81009ebcde62f0184312e62a88b805aa52 GIT binary patch literal 696260 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%0A|pTFEwf~ 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

KxK?AEhIPMfAL26KY%w0 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%0D#!Bic%^V zxRF1oqS90f6;EgR%#AD}e86}!Y&eW81PXF;D*WzWw0x@OXCy`NXViWXDwcJTwWQXbhS+YHZ;gxuv+v zA}wJac3m`1ic(W1{s**}KNyA)5@Itz0?4rhrG`Fi6kVZ}zJvb5I}|pt`F#{oHD?N0+;A1f#O*MLnPb`u){6C z`LhHBLL3OCmvQs~b#QF;@aY=dS@Y^7N5tG|*MH#uwd&oQFT3{PR{f51#G0{51q*&>&yvWkz@5wA;53UK~U!t4d&eg54{0s*jhdOO#Dl0pXNU zQC6nIL%Z)qZw)<&;rn(z>4Yr5hft7=T!HX2XV_E46_R;F6Tx*wJZ!pEL!nGu1p%(o zZ?;)xF196die`f{>EN?=x|zZnXqwv?A;);4!+W)Z>)D|dvXv{2u=YdZo>&`>2i*S;A+WSkQ^NE%7C_I#dZ77HMzvh9 zgJh#noi^fp$W~r#1Pt9&G+=WY-N*v13a2C52)ckMWa8+Oa=|+xpg4{}JhBSyBPiiz z2PYy#I(_&wgdeCmc7m*x+q%|7GT`(vUoe`N!Se(c%#-kDjoIa}=1m!00Cz579!rt* z={Mid>>gV#ADe@o8-(2=MH}Tu=))OH0m;#gOqoAOZ3+h=4U<$O^5K95lR7QRi4w*m z(e|LVz^LE}36ssYSumi$2ne7%KKFiKHUSQX;}Z(B#+scFut4sD;0QEX07y2|y#iuk zLBi`rki_jNK(U-2##<%pA+YYq2b@{yNgFRrCo#?G#B{vLCwx(Uw6N*GY8edGdrc^q z$ryO)#9{eFWM#AQO_!OWBoUK`t+t+OHlCwp{Or*TMa63e2*aSYHkT?q*B$dNSw8_i zD+E~!OF^$K)nmXdkcmPZrINK{Cbu!F;jJ2jWb?-TfD2V~eBt1$@&ix+W^p)(E;hyX zHZ>xW_Lb`RK=r-nJP34YGAYf@J&J?2SN^6!ol^NwV8df{w>& z#uk=KL8*WozI3O3z^WN|K`!NM9ZiW9Lf|9amPrEX!_d5l(K^zFu01#hhMdp^#z8id z_$?Xb>vAHw?bQC$P-P&v-@`#k4$I1x$!O-riGp#(Duo+3gnEjvO)u#~|vf z;NC{Mvjh}eBXBk^hkOBc^Sf^S=k~@fJG*i!Nc(kpdCU9 zJ0sW_sMujx(;DS?{wwOqN~ES~j4jrMUq+KJX(FMrE9WO(zx=FKf#Z)zwL8NjJL>j+ zIR*7u@uq=Bu1P6kmW-S(Z`T6wJ~gYAPT{Had$L0h8cXYu^E4!oA&?7>vKnN?7{gHc zz`{@uCjB0SLex~;f^;yswlIfm#tN|_NEA*ehHMbZA3QV|U6gQqqbQ@cLJsMVL3Fz! zbg`7MZ#x+7Qnl)`4ryD;rSk{ zxk1Xfw3OsheMqK^g*^*I)d3Y#|F`pZT(8R*+GH#?Nv^9|duxHb7hR?~%`Ow(WRQ1} zn6M`@1_>;)MbwEB>`eF(PCgE?SK1dOdk-AnVQ%gYR!Q;#`S41^!%U@0mu`#1=^eMB zharZ$jH6f#p&Q2w$hjvGvn_{%R)!!T;4nD)i|4MAZXCSC-D8H4dAojjV>|$282vEQ zeh7yZLe}Zg$1}}iUfe9GW17s}lr%iI;n={=bRkC)zXz`}qi3OPy_RQPPR;Sc8K_Km zMpJ@UjrWdEwA85*I;5OceZS5OttjK-I2(*VQizKc6AZviMz4hS+@C>jXsRO-4sGv= zbxBDwj0<^?l&r)SBcT8w4pa~^4u+xF-mkTq#6;AEo2>)X5RoXM<27|{bqgoWsa*Sb ztbhrzNBfflLcurxcv|tGmH%5NnhmOJ7@_o9<6V+wX*N(^}dmg%C(dF*363S zxcb4G+3QKj5KSoNCS%?`jZftu6|A<>mC(A$S5)Z&HCHU?c@UCKTfr^%KZagO4WAyMUEK6hKo5ofs;x`wVFVwt$W_#hyUu!U_Y%B2p^6dC& z;*B?O#DE1yu&Gqhb46+fj)TCE<4>o-gJE}Zd+1&OM^bJ8@L*fJ5^_rW0JHB!HV$sK z5$)x^03;$8jP9^%dGH)6W=LI{T~mrA3>-Qo1j7Q*V9;QzGx)pF=n9tuuMrS@N~6ZE zN5v;f03J(<<*Z&r)IxnpHqNgQD z#Tlzvt&hVuApkJRjTG6Vca>n61L_SeR3#8B}6|Dm^Mvlafg~Wsx@ZMem)?5NRmv*`%~* zPnk8PifeUR?n*T2nA$ymZhY~@7hh>{$jXnXG~!qlPiD6y zBV0o00&II~f14^H5QK6FEg3TA1YR#>3&qsC?*NE{t?3$!RB65~U43VELN_Lvdp*O& zIp#4^vOVW z8-fL<6KJW^;b5iZF)tdd3?ZO|V622L9`>;$a**5rXO3cHf>#d$wWJurLKT77l43RD z0?-a7(1zAJc~Y^*x&FJ-7Avq>Kkx9CQJKE<7dra)9qDLhw5W#L zR6<7!1Y_cFE6(P4=S(luRjjoRMe4jt;@saXg`HYGmzr zDgam|I!Rhi;x8&A6q3Ff{uq{YVph>%6W$nr-q{aTnA41-K@C(HUGtIz%eNV$>fT?* zt&c^0vZoq_(*G-J7@JUq5f> z78e|shAuCfblZK~jH=AXw49D$%$2x-SL=13cE z;bF^;sVwrPzMtZ%loShQkT*6ACt=vSgC} zTS#rd88sPpI-qF?n+b?Yfq324`ulGSUjFR&Ti#w%+Vz`ULl{7Dwd|fY@%byAGiW;? zVAfPYiw!yxt}DJsf~HL^DkLXEN1|Q29f(RRe$io5Ye1X__{Ms0Ll57B{_zDk!XRZ1 zi%UyQoh8coHud|@Ts~hTVo5`@WagVUJXL=@H(*013YZWR2clDUkkCH8HulMiCAn<# zi60j2o%M>24SdZjreszQbOvm_EEba{CyIxU(VPb!dnYu5~* zqL_l)8E`b=+dMf|h@ zA>6Xztr28d1jB|pYF%nN{HVBLJXpLDVh>i71$#cRW&E7!r}wi}=?vS@^nrHYC-a*T zhTG2z{XmJsi>eUrTB7d%$RleyMqHhle#eDX%O~d_o@hVN*KOtBZ$yi*uis{)3uk8t za8Uay8y&IOvr&$bBWkCMSd?X-^vT)hblLU@4tovc$H-69LM~crQX`xPRn9MJD{$h= z4ZK0C#!E?<#Ao!$+@$;8{Kii!+&_>*uwKx>^Z6dZZ?Tf#i$xu!q!5U zzm8mUgdIW&dBgcySTNm$NAfOuo7Y)dG6qU4AkuA2)JyPGYkti+k37-Thy~mj_DtsB zb4!X8+Z$FW^;Lvi$i_jgbLpWI4tYH?2oj{k-MS1Z44@15*L#xdJw`%Ryp;#!r7xqe zQ_Ai$MVM%0O;F?X?MSZtao$}!xB0e=rVkgRmvYm{ynS1Kk0AE#n->kwYli*%#slkA zV_A}ra7_YS>*@V*1n|cYRtGuGIL2-GejT=RmZYQg@|Wml)RCg!0R)o zCFGEaA_!KJU$xwEJ z&f}n?P?&9t+1~0vx*!&6i1q!uV@Mssb9%s$HGMwfbvLC#xuq>!L8C56?Ol&Hn*LU8 zb4RNg^fDEm?g>Zfh=rt|D4sFu8zri*h0Ti?BNp z(F|@3=S&gKOdGn#=>Rl{T#=|fSl!MRe?IYG2V0!0Pr}7_`(P8zzh4o%bMNuiLqYjl z$BNvO9_CZ$v}I@VlP=94Sz3xt@oG{~`Y~dtSOj76*Z7?sh%~ZDL z<6Tz|bq!H-?#|Sq?Q*+LSrt+l_wuRaqAY1?R$Dn6JhO-<>%-(oH%-lR=?y+el3;B! zQy@E_8{ODch~To-`*y(=8YYJLu$vFO;e3c2H|2Jn*=CsTT0U%0gk{lfTnP_^r5h!4YSD*9v8l&gVoCbmx`zP z+K&F00FXoj{R+Gd*%l~N>RQ4G&P&(Xn-=Nwu&p6Rk2b03r>0FvZ&ZQDv#(sM?=7iy z0GbCZoE8Q(1j#!2klg0TZ+-p22&dU(qXvr+Z%-@p)F{LiPnBb01Ro}IhUwmt)VOG5 z2a#k^w^*z{UQ`3;9p#=fpm2wfj!f8_8qKe^pO3xq#!GkKT`5aPp^kWi(p@~Z?Q3mbVE+C$+!D5l+>bSBg9(Px3srjcg1B?mf0JP|1ZZzR|u zf`<-=wDSm9B9$&Qtd@0#Q5RrKN=jf)0GiwMI`Vykk%;<7GxqDw&M1gN<@%awrxeH=cSWzuAk=q2MBn zWdn41B@AxUAj6=6&=eKKOOkFlsZS0RrBHC8=e+)|MWkv%m+Wc zZJNwUfabYXDC5FNf~{s0%DrtGP>YD(y3+l&t$WRg+cYjUl%MrDOu;7Ti;NQEz?9~(UK$)1;j6%en5<%WH&xD3MbiK)PN zRSBloW|?P$U;D_FpHDU|o)jwVDIv<2ob*O-nOZQK zv;|1Lk3go|ErZjW&Kz>9s_At+E%cb>^t-FjZ5YpX7oE0Dejwg{V!|K zw)#heuHC!?u@mt8;nT;ur0#C1tte;Td5seW!YWc@6M#}?k%)Chn_bc8tB}nEn4mN62tMpvt{Dg=+7J#*hA*zNPG#(gau*4%C zWG~@mLJ1fymSIaTwyAPN)4^Pl0L6`UoTEu>S!}rB>#(-|cyD`t4LsnVtw>$Er^Hdj zH07**=g}`h!3x5rNnMj;b#rOO*~kzxa``VijOB8;Bs1RxWR)dB1&c)Mc^p1Xv`Pe3O4!p1{!DE?MF9--@N zgU4F&A%-mZ!9&BICrV0>7BxJUpI!H*P(xRFD#Yy0Y7LBID!@8z@dz=CpP4u3xC-02 z#*ld|^Zq$FL^yg~NzvmOCYJY>HuW`7*?&9IAR=0g1S@Uf#AuiL{c^i4Y11rQ6RJ>CLD;0wnv$Em#pxIf5reWZ`acE6tF%o1q zLpr%0K1q9Ictu{u(PaAetE~!Urd?Xq;|yRx8_}b)>%=XS!O~%SxqhcyaqZ6TGr;^o zUv6o-dKR&K+ot+%EVDS-(X^&97_D%Nk8VU}$+X$NEtp4WP?UFHxH$(`)_mecuJEi9$hGvXIFr9kP6bOI@y{sb2cc`kNSXYlOYeSPa&*u$i(0ZGc zNsM&?@M1cKL3A+S5X|yCbp+VZE+vT=-7lYsSr=BtCK{Tb+3xF5t~pnJG(%@mrX*{; zfBxTpuC6-kl(|=D$vZxY3*)uQTJwjRsi9Zf+{X_7I3wG~LLICE@*ZeWeSY}xKfd_T zQo1;II=~iK8`yv`y%r=q6dio8bNQ>G#V+pxO($oWt*|pLJjRtfIBE^Lu0c z)(e*n>`%uEE$U;^yQg(I?GOFb$FhTLX9HBP55MP!? zfXXIZL~{olM-X8i=Zq)e7HUEBQQw+`;Dzav6AFOZ;rho1m=P3~Y=N3vAZ+_y>0*dM z1!CDDS<$n8EpxrR-x?0>~K$;O&r|RES*l%pzFH{v9FZBftwOWlLj z%T&5pG)meTkXhibOaPsWMC?3ruw5pehuIv>2pH$JKFC;F4k3LM1}*hs-rzE$9QrVx zHRy5JLR;d4ZUt|sTK@8q%ZbEXc%gnxv|~@IQzelCq|~v6lQ2I;yEfSrdX+V%m6Gxiy&GklJ5UXsJMW&uXzr3&gAq|lseLmR9q*)F>mHBKSZH|q&T&8A9-V;R)p*XrGs_!hS7v;7&13iiX&I}>ks$GtWW*)$h_wBr6#EOkRiD;Ck19cwPWohKifUs zgtK3jJP@RnP~0$*%};}I9CA~;Mj+BB%58)isiHj-O9`IjBRu0maCUo??KOAGOOM6! z>@K2Mtdr;BZ>m>D3)cT>-1GmpKEm9C*;`%``{$!&~kOeGTvS3IQF1ADZ~{@ znKNpZx^R=A1KaDrk{iD0P$w5bj3xly4`n2^fx0>Bb)X|jO$MfZxy%v70F7?U6{P)?E^hAS_foOTKjw; z%TNNDH41(6^qM;oxJ1F1zSFlY_4<>@TL$xo1=vP7;hKbV0zF&GtS`!yEGL|w4jmQm zAP~ysgbEGd;vxi87Xc1JS40g6+co?!@^rW6;oV}lY9NIrZIp@f5mH3P^*oIY>H9zozFvS&RUP;XI1Bbz0ai?np07y-gOLQ6u6M`CV@OGg_Wl%&VXO?%qA`T!{j)Ul_S^U0ynovT_qyg} zFKRuEK#{{nxGDmNL>MF3Kud7D+(Bc7L)Zm8>pYNWphcx%v`*}Fb;qNpZ`oHU^!InqlV&YV1 zY{l`6RD;XNZh7e3__5(>Td)1`uRs55_=)5A1X$`d^=o6N?HPV8YEUbR2t4XaA4ptB zk!ga`bvXFU<;Fxcr%qBpb0H$;)#UQ!jLLy@k70}5Hjo?j9;OL{G8En0LMr9Ub%?*> z1&)H45u_P(f~dN}v?L*BQq87>aIx>@Q zZ<7mTmA?QpheXvt;)(2F9@!8SC<&nru8S!>PGCWh(HhK*-Y#@W`(Y|gWVVDG6yc|i z@E?SN4nDWEcdZ<(>E!|S)6;cNttbq-PQRLL+yCs@FTU_Tuyy#)FK_t6Q$J7NH&NYs zE13AFLz~`pKmO&+nd71FFNK3Nnqg4da}PmwkO^ZV`n|Np*!5`>1>+8E&snSi*-R!D zt6?_t|5$n#_$KOn{eNbX#z~t>5<*Fdmq{`$iL?+>%%ZSMGNdtS3$}sPLQxYNV2g<> zi?Xop%7jdyEvcrV7P?%dwdJA1Oo>*4gbuB=G^&v5>) zeXR<#1)9nC`?);N`w_m2BV5!(Vopr#_Ob4Ku22b)JoM2tl!cM2-Ijh3xzak zRFYqOV}9YMpKMEdgg%~F{bt+Bb-?jrgIp9``{t|9JoCkOe|qo_H>w8CcPxDX@8rSZ zsfQkX=1=F_K_L6`q>%#x_0ULyr~|`SADxOFsyF+PpnBN7+qNV%7bY&?Z^BRpXS z4*)eJ+=Kyh9b-4xU`D%d43|jA_*GRJvWj{M3G$)N80+%|EdXvQ=aXYRG$KlCcW5TO zEee^Px&}{2b^x8c^#V#Wg$+n1yeKofFyz~&`0}<4HZXvG$@LiRqCxz!$)E60Zb#zrHmRCk1*d8~#ToqqnO8G4Mr7^RawJ?rc7(G6ezq2!TMm{K)+@$~hjF+Ql(M=La9i;*CrB2H5$Cz+;m8i*mpeVahw?uO#q!>IK72&qpB$>R<<=bRfv z@G2|GCH(LdVQNcYGzgEotiP<|3R+#CM2)Gos&Q=sb}*KNZSc#dD-fNnWb9CCpnzte zO;SStsz#LrkqAPyuif2`xhil8xYu4QK6Z;q7`A`%;EgMmhkw3e*o5hI2Nv5mc0j?3 zA;fdCVR2xE`hG49gyIxKl#*Zq4%x^HeQ$$|;DcGYX7?3?e?v61zJnaoDt*u-qGJtRybKV{-2 zjM2Fp53aUMzN)-&$SO98@PYxGJv`yRIStq1q9)WoA?QKtSgfb5OvHA=nsD%(*al5imJIPH=|;yhR~It9TZe1WNQ9 zGkPMnvkKFdu#^uHdJteh= z1ZbRTyWVaKu=$g7gxGE?A?fz%ZbRa^xNf*vdt z@tDG@KM|iM&e6M|U2HOSdb`?8)N(Ax5K$57Hj&_R7})T%nm6IABn{}FQKxh_;=Ttl zRidh>Q{@)&Flh9-t*f?7EIIZ4MT4dYMh?f-=6z@cTmS3Bd)Kae47s>C53o4!;Ar=) zeUnUdr^V+yftm=WIH*CzrLjD$V!+VUV@1IR>v60=TZ*@XK8$)ajAx0%zDUmEL^l;$R1<1!DGvc%>*EM!u{FiNkc*LgAC`lxG!=I`BWy<0H%|0fFA|nf_ak zRAh4j9-95T`fgl!{N`0eV&bX`jxYN2=1$y6%*|O~X!gNr5m8R|;7YtjXFdyi4idIE z)pUTfindbBNfTB1k6pO&x|Ja;g9u<^f^yL|1;ko0{#1M37#?hgd<9E8pU`rg1RLnW znlzZl2z-TrQQ=;=6OIjEeR@D(r31KBb#bK(cGb(dVF+dj8LbBh2%LGGXZ1Lv$pKKR zu#(bl=zs#rqP6fC!-w>pRU0}+-28}I7K_`}pR;WGjXmezeD}ezRh?Dm_~S*b1;At{ zrzYphguRf{XtI~BV+jH$G;F|%L|O&~k)LqFpC73A0KQ7!m1c4XxAk_9nlrF=uX`1E zWNf4*i9>&C8{>r4D9j!(RS2}%&I_o)!RAo$Qa5dk*0gym$Whwkr*hN}9eL(gk2!@A zn;YhCzGZ|toa$6+rPl@?{{C%XZXE;Zv6Nob$ICHS1ZiFU-p(Vt^j)O{os)q$Oi|0a26hPiYC}IbZA3NWCFtGJfZOo4E zB+{`+A!Grqr-ig=*GJKnS@miD{4^PAXrRTy5Pn!An{D9MLUA^R(wFZ;@EFlQ?N*c! z*6+Q?u>%QWvKu3mw=(r^4G@sLi7CQ%>*Q<-&YEimejiI}KBJRT#}+oQ0vwOs!Cxu!Ym`9PMdNYI=ms#&gAuUL%?@jT$2- zvqt=f2p-dW3|yzF2ImXZ7yTP(xZr7wp-}%UH>@+8_T{+iiktU6PmewHie~S+Bk?;@ zt?SJC(nB&6D+~sO?!orR_LI}XBU?3YbtB=KLA3kS`3|BRM{7lLdF$C!H%gc>cM+)_`pyE})&DQ@V&Lg1#UYC57Cz)CVEm9FS zo}AXJq6>BQLAajN35yJaBH-f$rX|hW6G;uSnIS9%@f}!~QV5Qq*@(@>{sF8^V$jVe zH#2hGs0)mgYkzcu^v~moI=jIFg|=3oB(Z%LT7(doV^d(MfL`$erce_wWR#4*GI@%= zS=O|r>G~EYurAC^ov2>JaRMA7053D3uD)4c2*nwQuUaMcX_A7ahX4$vu$Ofp@#MP7 zH~cf}KW1Sp<0}-Rb&iy(`BrjBCJ*RvK>I-C!)$yhv@n>e`5=I@xzL}cav&PjrDghS zf5cPLaV`k%RnVx1ujFXFS|D^dqQnQxj_2S+NAIa4=H@cviXSuyphNN01V`)o9fB$&gXg^q}A=0Bm#)J)sLK) zMKdVO!MRdn)zaPgd2cnkUy=JsP%#13zuvR8Q8_5U;|@J9=9s9Uajc;1g)dJoUwA5Y z*8^YDVTH?k^68H|?)s~|PH)ti72BLnk9#CodA?S}64dYfVCA}|_6 zj)z8}^(zK#^Yf*HGP@p*EHWTimqDJe%0IC;D20F}OOvUbEYHT$HV*!%Vlq3Z4SELQ zFNUmw(8c;El5-2-xWM6uuZx$S(ghTVJq6_j?syx#UvtzGZ;R|p6uO&1>fP|snHPUN zv;Ffk`>roqi~;luKYr#AABz*>o_EjnIYtG8RkC9|*I!@aFM&`$EQJ;kUwM_3$C?K7 zba{LeBM0IM*#;KqwUvZc!XT*@b&OK&gNdvaB~5yj-VUTA6IJqWWNaCj*;+Yu3QeUF zIm5nSU1ICgxm>25C1z2^*3pX{HWTNz!-SAf9l(PlmzO`W`NoIe)E`=Us@>s+aF28f z-3UOd$T~G0jh|biEPRs!fKH_NXtL8ZGhe&!#PL%v+H%3}!03Ym9UawDg9HuIi>9Jx z0l8;bpUKB|GhHt8JrWzJ~5^UqBB*a-HX%bAi9{S7vT-;4S!w&y!XvDRT=q-%1 zRoL7e7R{k3X}UlbIt+b?r_CD-Zs%$=qnxT4c44)Oqr>qv6D{6cX8D`P zK3oUUrN8nX7!Uuv^4vW1hM9KsVby~hosf=Mfn)*z9R3_OTz#Zm4OeSCFf~D&32dij z(Kx8rT05bJY-&~U5bUEm)&q0|VkL+K8;qi-BK-dPAP!;r%f_dQ=a)gly-L46%FfQq zF=4dL5~FbPfC*Y}UpU=EDPd#qFtDq6DAG5(>|Z-s5^q_2c`1ji9LQ?-mlGTl2Kt#s zn5|UJA?26)zdhQ-V^ue1S|-(4>ng`Z9>Pm~H(u>Pi07`R$#VMUvZgEVE!=VXzqi=X zje^`F%1!(%Xa{`MqGe&bpqp;9;v&=$5eJL|Agr#wOo}QZN3Bmmr3c*OD+B_tMzDqe zG^f%j5~J45#R%|}I)ymofj-Uq^VCq$C0hc(T?g^+7KfL==%&Q%8c2Zr*sZ$p)Wd^< zq7PVuV12jt3OyC|y5!(6-4jyK z(hr_qTE6$pm3Q;5eDKU85-FrSsRUWz zyOX5>=-csyu!2X(VVdvrL3WfLfSVj!IYu_5qv zhnu;1;lTe=I8t7+-*^`E@S8**d?0n&+A(;*XtklgN5Sa}EN zs+65V*&Sp9N*kEsJ2yX?VUERZ;aFm9lky*-CvA@!ATJ~TZL-(y?$M(MwA{`Tho&RGK{ zc>VtF?syO(>2moV@FC-Zq8X^)t~T4fO?WPTSCP^3@!xA?APn*FxyF(r6MX`UoI@ylox4oRkb*3HreFZ z%tGSWsV>UvX-kCOU+&BT>DA6g>HBKj?FK{F>SaQ6!$Z=g<)+YriiR)e|K+x|F6WV) z?@pG@rJ3%w*pw+#zAGqazy0To8Uq3c`Cvnx!`ar@@Mm7#nhKd&@^fz{-szkmMAVCL1q}w{8l7T`4KOy zV6FuzF?l_Rax(J9u!~Y8P)eqvX}&d$tem|HJXn{{>>!kr4T|wC<_*!!x69UdH~@<` z%oW=oV)t#(U!QK8-p}0ptA3M1it9{Dkszs}@1J>Z1= z;r=c9$YwmxCoTlHuFR@=les8521GTnd!EgA|R&&N9uS!J(FE2ERFSD%f&T>UC$a%##NoV!>%HUPwTh*wkueu0l3g z<*}QvsUgvwlN3y2Vu67!oWQ0HE+jTK6_fwmxCZJVY4_2_W8ZgajLb;e?$XQm6y>A( zbFM@PC4V%o;cN|Sb|Aa_=*f!}FE>`{!WCD8IyftrCKrD-|IY93Y*WL<(D7;Z<4^8S zmGy-DqaU1PpcJ2r>W{=on2bQb81Kup;}BLM`~lIg*#bUfQTyy}$^xPoY!oi|kij9{ zJxjp%d}##xNSEj>qw4KidD;cZ8ylYM5>F;sBtPS(gK0R-e7JG&sl0|BgUDXgpZWj_ z5y+s3jf;??WDGh~aHxkR9c$-4{BvIaj`x9czOcQ|hr|)A-v0lNodjz`e1^uOWxFR= z(EAsW@D^cJkGRNHVimm*TMi0Y_CG$T7oG7~iBaL}cQ3^RQ-mm;mMbSugD+)6*>ySh z+6~w}SnPl$;*^`jlxXbW^TZ)up ziXjApb}LT^4$9s*t3-|~RXz$rbe<%^LiVoSg=?So$Jm?<4+;k?4j$a_qHxIK_RGzN zE@_654{2%n5W$+maR8F_X|?M8O9vYgjb5Vrk~)UsL#iIc7#TLerDe<7qQ>-(sef&o!Z&*C3{A_D)UBx+C|-iI>j~xY~#py<#yYXv8r)AyQg1 z9ieqNF8TFskFR?3&FsgG>ZP+-i;}Y*cA9hWclCHv!$HW(U)%~F2bOYJJ7SQZgEs`w z*aR$Xqj)FdPY2^JR+S7^p_t!r1SSorPNf9CS#mIKl?jAN2lQB`Lnw;9JENp?8BfAd60QDaQV5*TNKDuQBVE~kB``xt;GaH zocKUIia#>RT)TS!H>_B~6PPGsHYh{76Gj{WNGNzjR*}IZP(&}0xS5*Z45X?a)6K}ry_)M%mq)c4Z%c8_Ix>|HKc{LJn1%^x<(TS^iDGtUii8S9X&dk@C|lfY;`Dpv*^W_M z!DSzhF)Cd6%Se1P;r9&b)<;X_82gJ( zGbFg)Dr=K-cgceaR3{QTMuzA5FkwVQ1_&mEasSTaP$!IKX`;tL^7+s`*)ss4h>4(7 zo*#ajmh;mPHlH3KsL{;0bq{_A=)Bcqh?9m|AdBTyE2*4Byzw>Z_?f*}?ZZigOAQYZ zTKxQpMO0rN`>0klQD1rRZRRpC^@f`OLrpDjNEaYP+ilw|A00%6(7(Lc-5Q^=Cg7J7O`{uDJ(`GLdI7W&*oo4L9 zRXr%dyKr}bO^>q&hLFxU#d4TMqaWnJ8N>esDhijh_!9J_P%VG=Y5WEbY-~QoqJ1lC!kz zWSvgl*tPKy^VwAX0U81~7Kat22PSX#5~!5MbI)OjiFv&>!*|nmsFSRmsm+BT4lh>t z8dLxTyP<>dv*P|AqxSVH9!JH;i@zDQ0^_0hR4flNTD%GZVbS8~g4!NaY`hUxKt!*{ zrjtc?hfC)MxUC5LVDyC4hirE&pLk3gk_w3hIBnvzn~}_yiGd_3q5SQDmTKM(%7pR1ICiQDK_Fk16N64AA~UjR3++c0r7#; zCruTdI#Mn-&LjqHqODvyAm4cKs+aQ~1oD+Fl&DaCiOvuiv!waSauYVU$IsF(({88A3gEVGYuyp*WfXXbQ@rV1yiAZ3FWVwSMIKBqB24U0n$Y z5#V%>4c_>Lkq{wczv@5pXF|NS>LFx1v+Ktf5Fn_W94mwpWD^r6E$wzSW-i@Hx!k?> ze$q33Um+_6f=C3u4C6%<1LjU3I!A9w%~fY;%ogF}#wM30SbxNB)q)3UB+-)*EM!I4 zpaj!=pSHC_hQWv2Ug6dW77C7555(&5Yf^DLLS^l}eX!3$NTKEFC|o0i8EF(kE9So` z@jZF;EUGA6Dm;g`3HmUh%X#$`eOahJFA75_W=tM+LGLd=%f9i$wr};Mxyxz(wXp8c z$`ZNMIb1MteZWuwqoG?|Jr!ZtL&?p^1JXxX20uWz)+xUEAk++Ziv%$}-iBb!#}}j5 zrCFRkSh?dCgXtdYdQ?|1hv48rRz?wyDa4@vY0GAq40O9u5g;&Js+CNeI=gU7pvVk8_lN*zF1!ynO3u|v_}XW5-q7j zr=3G}|C9`eEMln~e( z*szkL;2SDP2plQa-flW6%=IG2L5=sC(mUv@OU&gG5Q{+&$wLr%^(3h$ushw4@f#7W zZ(7@11cEfgHFm-$rIfpHK;pE*str3;EV0&&pJ~B`HMt%xfIBA^HNzvoj(-*62bU@7Gum-3wbdix**b8 zK%gZX>9NbXk_Ol%9AYZy?L#ssX_BmHTmuJnDt5G}ElTBnB%z{9JFt4jMg9b;R=+Mx zNU&Oc>WTdNu{9gkzP0C{4VBbhSv+V36I%I(JM_y>H(a?h^|D*v$&`d%TDbn_($`Iy zc89lVWu=3w&f1NmXOAkFe!JhOwiq+V=79 zy@BG5Pwd?Hd7LGeK0xnmh!7?5CUzSwyNI_-l_n#+#hY{7< z=$j^cq~rIAsArVQs>z?4!1O@K)AVWmXY5Gkxo(+s$*yhLjxyQ*viUOuNl%^`QDa8`g02d1j|H#oXgHdU1> z!lH*^>*aQ2EsL4f@|hrp)~fj;1ee?N{&iPB`SaQNx1ZVwFNOg9KD##&-)ol6Rvmk$ z7JY?WZ>fGiXw&^&!pFb5)O-3;Zf=vZ_P>6!Wsaukl_78LZ)&G#Jce!)Q+@z~qrn8i z2B9Tv>Ox?0x82%SEmSz08nOA`5eK(k1V?k~dvIF8jj`iIOlX>ESXkR~hZ2p| zO;4>vkfrf!b+~Nt7Z)$y)BZC3h5wGS6PKQE-zXstsZy<71+QyB+WXFbD#7{PJxODm znIoDQuC$e~E>nG=Xl+m);4csNt8;U9jfU>fVer*%hBs?f@#qnCFTlU;qXudW8-SzO zB+o7@$hLD8V_sh*Dun4#dihuLcn2sQmA!ohbcuik7eQad&UKo)x5hNWv&noH9VW+` z(DuVc!qFCY?^S7-4T5i~*TE%--7Oo2Mb$=0(2kLVS|Uth45cM=ZlYSP2K_8GBd;qKYAxTeZy#1saIH2`RSoW+1Lg;yBK;A1aoTu0ySU&t#Ru~oM#+jdYirL0O#yNh0iJjPkf;Hom%DXLyuu*#Tf9t zGHVOhQ?+c(L4pW3WC=+ij_Y$)AGp(P2tJ*3ugd#{CWft^q)Nb&x6GvRa!vpVdqBtCnG z%ZfNLsZW6{C}`#dgm1^CSvqJ`4lLYr_JqfG(Up|})_377p@kA025eC#jwxVBj@;v8 zxC;>T6rDOJhK}z4IWhL?JG5 zhY!tXLKyxT7AZSN7fNx1)%qZ8v7n6}QSbf}IaThgX=IRjYRbW+3Dh*Y z+J1m8Hy4TgGyzywk%BJ{o-jYhcvBRy!H>d2enVsTMJlBlQA~~VC$5R-Mtj->uEJm_ zo0dDvnAzCP)&8z6_eijrU=&4rRHmygrZPbXr$PVFM9hjn`)_449GHs}q zZ(-8yREfi+Q;`q3Z{NE#??r=oc(qIQ#(gd5KmbaHeb=-0@Bb=-|IZI6Q?eA$XG&+G zm9^k|uU51tTd|N)*ZOd~SY7G@WiL6atwRr6hmsq_L#d#M@~kWxgnG={P8L%WuNf@B>mi~JWA#OG#J0Sy2K}f&!rXjD zdbyl~(a{bm6-uf(yTQV__S?YC^ROOFo%|DAa(Mv@);;_8Yz8GCXurluG6*I*PPR3V zIw5S5L4u2;3$h>NA%o)TUPQkj-QF{E*qoD`npi6t3(%I)}6>}(BoqdS@l0{Ts zr1eh7+`t?eXkzy?KAtDAC1z3Z#oAR2Yfc8^D=VY1z0cE&Da1!%0+moC_R3utB@nFA zCvenuDQ1PA$Ep4@IpN^#*s>yssv8DaO1{ENb83vX;5mS-4o)Z&)vazO!tAtZ`jT>< z)918n5O(JwIqvwW)2H7#@rWU44QYCOtM9Lvf4ZyZ(52p@gvNgGL=UpkTJj%inQ_nV z;eIFB9YAM0+=-U>)!{a*qoKw#vwkT2SLyu-h9s9_l!r>ohmzx%g+}WK!4Fbf;bg>5 z>ToyVWRdci>M3|!FCK(dIn*i!izVfxatlA!^@q8nKp_g9J_6+^Xui@iJHy5?y=u_ zp_H{a+d}vcNJz#C&>2?yj5-TK4hSlZv6YXN)?&q{j$oIie0aB16snL*^->cwPmDZS zDi9iE-PCAd9#G~IcXX~lHRHggbw+tLZ5(oWkCrD!Y7AvXg$pL0nzU53cC{rswymuE z`!nxZ0w)X_KL$yPT)QC9Gg)71p2y%>@?A?p2W}i8<)dqd?EHxGKHqGmpAE8lPGtTuk(+ ze^)>)aM;TIYgg(^dX`g%rcrBWotocp)GRFCc;xJ;z4NJ+x9{XO-gVasl`(Gi~cjur*B+fZvFy^o0SXsG@R&a5cn6hrf>XREp2@DX5Q{CQzZQL zUAwn*{P@@hu&ZDD1jLh6AHIGtvZ>e%N`4qRREc%mI`K&m3{_A^i?Q>@xrq}d8Hy2U zUnH=9Pktr^i^h;oS0b;2N04B#w<0f*YP}kpr=)d zcU!i-twR-l@jouQ(Sq_sm%wSsjcaCnsc~m)GQGIxhk-LOH(To-&o$0I0km^IMPSdT zMll8tqE6omuR63W!L(0k1%JJuH4dG^RgiyH>$% z>z6%sQ0^CFS_nU)dbJR3W0u7Z{|xPSVX{R9axJnOF}>ehAX-x3qVxAp8(#$ApH+;O zX~h9XQ2J|I8@H5RJM+Si)2sUcJ{rXN_qGY%amS4@WVixzZGp03{YQvrEFhuzLsbUR zIU}5(P~X~1LwcNcCFZ&pPKjXPZvp01>GNZ4H{d1<@Zr}=K=9TKrc}%rc!p6dyp8@! zt4oVmvlVWenr2w+Uh0iN?wzwW6CNu;mHSvvmY@kwCdH+Wwnf<-q5-l9_dqYS(*yts zGPytqa7Ko70Yk1Kq{$tXaU|ncTGh-~wtL5HJsN~Px)Y}}&ZCco>+1KYv{dCemTG8%d;o0sA?9cm@%oS5j_OYrjQv$ zl9?)%|IDvmD?b-`&tBBrJ?zXhm3lI2?aMTf=|Mld`*7^Dq!>%arWw5m<=kt7suCy- z=oOImVWmmiE^}K$GJ5mBV3k|TLcR-bmD|on9tw!fgj|Oc2ph-vX4@ErFN2-Sw03IGT9pmBaR8Wh;V}wteo_{8+?c{x zE>!w%?otEyHXVs*7U_k`g zHeOMz662JSr>FuiQe<++W5|5Np9?rIXxFC66j`6NcPdy^0Xvn(JmjLxKgRfhWJIbS z{PeATFg#ocSa3RP;oOvYv_>OzR@78AR13-0Aly@Wc>I|$w~Yz!YtZR*oyv?&E5^W+ z-6YC8NXdOV_sj$I?46m^2$)c!;tE=p}gkkGcUAbog?^j#lSV2BYhSTFP?rE%NMV3$ zYD_fG-FN%TjmeLEy*m*Pq+rqwQDUsYSkgTxwP1RW+ye^Zw<4|i3FJKjfXcBE~lM1s3Qd}ydj>4qg3B&N@gUA%V zaR_bb^#>jQvlT&VmlwtCA{iCU<`fB*$d_}7$xxo0mYY;7u-6~+39*EQZsk0@)|NY?#~K2+WzrkB*P?{{8o-UWM8lNvd7WuafUR{f|!@)~&Xkxz;(Q z^btoG&R20hZ^e03vuMvt@BT1@RdHT26nrvRa#{b8_jsjQ<@dn9Ycg~Rjv{CwkW7R% zA^1sN2qVCQ{oOu|4pxzRy{9z({eEYBdU31Ub+soZlFb)x#^a5Axz*jyX*29vTvdYABuQl zt=M)VD1f;+fe1)2d@Pd>U5;9JPo4?l3t)jo%|y+VA|aZB2M+LtI+u&z90n_GbDuQ3 z3TC`Cv%g%8urdOYEVP1)AuqPuZ0b}WngO-jVOm8)TwW!Nm!$Uzv!7_IN86?TJs(K9iBN~IXMx#7@s!jU4$ESK*1xp8@->H_< znQbSHnc~v@OWd`@U_qt<)3ELqp%rVB^wP0x0hGu#%o@Nf4u^Ei1VNItlpcFlm#7N2Y`qCKUu^T>@mx))54=OSNf0on*jAT5OO-;S9Y1 z*B_V)$vzo?1qe)%_#})zy>Q3%IjgbSyp>o4@jCX1a@Zh5biq!~!s+23cgb1U+X&dB zZnc}}ByZ-7f98JMvOKb>U;=w=m|LVdOIYJ7!~TVc*-Jl!|Jl)YA_>tKo|G0o$;VvC)lym6)XgY zG_o%NfNSXJD8!&0LLzgzV{~QN^NpsQy2Qxmjl_VTl|p4T)Re20v*r9#>t?*XaU0&n z%7i9LkY9zLfdU2UZdjQHqTqKn4xitoZ)FrC3 zJneA}qJXajNxhjc3!*fv++9!$Xu?-G*!FeQRQw^ayu!YwB4J?iIqu1J{G`y<8>%uL zy7oieZ(lsx6?~|4?f38e>)6=$fALQrOm48f^v^&2=R2FsbroFKea*2x`xB)VOqcZF z>YaxB<-eh3afeTxyz|!@;*dNiXIb;_g1!YsfBQ={ljIIyAgf=!Mo{Pr6>6Xfh8Rh0 z`{JdN1h_aHr3jai9J7~CGvEiu6|GKd4jeIjtyoaQjAi6-sXi6DXaI^Gi^t zpl5e!2>>ht5;r8BqGqcEV!~v|Z_glkCQddXg~CA2N2(a&g-PE(W?BfwvP-VyrF=`; zT7XuCLoT(?XoMiUpf?n;q^8R8s9FXvE@rJ$p|(tmF}$Ksex@%y-T|W`hr|*{ zR71p=R=V3sQ2qrt?SerRy=F{q+@N^Ec2YbB?pz$=%R!l z@A1<09mjJ%XoJL+Y%rD!EGTfkdfkx^XY|bQynixOZ4Q(0!+E7H3Yr*-9hJ$W6cD>Z z7{A_nzF2IfX6WM@ucIhat5na2A+&!&e+L6KT54{QA&z-N-EI91V&xx1L{ru7=|2*|!GY;*M#*;mVdt7GQQle_jno9gG@Ch91 zD`xc&#bv-Z$J`$L*|g1Yes!ue8Vb*apvghVBpF&!E5h;+&j>qh5ZY03YpEmZEougY zPdsxUNN?p!;H8sEAi4Lmcpc&9P7mPDnGyiwYe1F;IdrZ~76vj;;Q|$t1LF@~oc2JB zOv|wMA@H*8o~*tMz*O}53-AhG``$0wkAc(BD<=ye0krHEW7xlUe*M`6;_?>u+8x7r zdIAeeJep9l_UQds^etgz{vASD=*k!D3br zmb4|C8mrbGEGt6gr^G7T+g%za%JYv^AFxv_ija&takbq%)KpO;*L`WKd24o^v73Go z)*%oQ3}(PIq@cBMPN+FOs@y1wB_~*UW=OTfEvH%KHFqlU6CSK=(4C{^iAq(R&{)0x z=~KqK9c?|;>$A_tOL|y*UO48~86VJAVmR@@pmcuO^2Vw|r4bD&^HBfZyeL2RCF3dj z#9EiTWF+v`rFEw+&FDO~F>>2?jmoNJi<{$p-&~v?RXR*>zDehtd#}fO?~)$v_Oh|v zgZEXq^$=cWdo;fo`v!KBR%ds2Ro-__lXQ^t>#!w=?o)+BQ!_*=itk~B1aHG=htZEc zq$<$rr82S0acm75fzdi1Vl+M@++HREs#2v=KCQ(Y&q8E2B8`#^ ztiVvxK0xav3@$L-%B{&ebL*A0gW8fnjL_!=QQR+~0*K-v@k)W*sP{{Fm?p$vb_BP- zc>V78vEmG0|I95~lOJGyd<~D?q!p6+C&#zkKJge%q&?Taub-Hs##x3L?zePdP(ayF zMACw?J5+~RJqFRMSyCHhgK;}T>}nCh2#gfbKQR-xcQsQ*1U{B2mex<)fmAh~9FvXm zV0ZSOF9R=S{JG24x@?Cp+;Utht3Q@J4h3XGWkQj46JmnU7*KNyiV%hdKjiVswyH{4 zFOnf-5i#*4ZmrIvjkg{rpfyX4An+`!)nivF`cYMhi!xTKYHb(;!&9&<&FdVT2Q9i$ zzF?&JsmCij=gB-D1dp2AY`NuHL*UhK-@N|#F>kP37|9*AaWxfvgsI!&lnz2;b&l4Uu#vcC4f!V69_N{jJ*2Z{%5$?=2TXthu zQfYRhnd5rq1)@d3{@7}Es4o8Dmx>V~5C}A`R2}{L!x>1ZYxn+p#gq@$#6t)f>1i~5 zWK#XD=BMYb{Psy3a3#ug<;?1X``#2Vlvdlv!Ef`V}9eevM$#8qfuktvJZ!1YRjf?UYd0pqeW{ zx0+6=2%8TcDkIE#utK5tq$4d#+aT>911Ua^-v$*Kd=Yfo#gj3T^p&u|Im%s6UogEsHh=;##mJz zl=?vK=WG`OF$=9fN2mwjm;^^q9`x*6AI1(ow#XM37eDZ?uSgo#UCef z4mv?B3e0qKM7tEq0w7=#NbVC;gu)J_xw#V|OJ`%U)Q-8DTv&3rZ5?*jc5C)|Q?8$Q z(bBALb}#Gd&SzLfXEjy;jmf4N{MExfPd{Q_y>6=4S+%V0=tJMcyllB})#Ts(&v&@` zClVD>F5xhAp#`PO;S0j#tO7uE4E?eFEH@d}!I7xxR71%D^1|?jI0yv{e2W#)g@rKy zV3y8o!cMBKn_hX()+&d&sO-eO&_tP=|Fh)2u35h}F5aUd2MUWWJ{jVg)lYu&blc-I zZ39obRhjHzXUpt8yS7($dtYoY{Rc~F$mV#((La3_3f}$JKL+mq%=NWz%WFq(-y6H_ zt^M2Rp7%Ob`k^JhD7S7&yNb!-0L2c~fii1-$TZRp^$Q`VNVT>{r$$m;J29GS(adjE z;0m(euOigM0AHksq&-&TmmrIXO7qfz0n}oBAXi~~s(u)-Rw|xx@u=rvRzQTG%?FyX zkE}(8o=arci-UJKOj1QdTy}sW;dF=kS>2Ea+&x}@NZu^;iiLZS9S1@Ejn`F^Gq4L? zeY2iMfFTaV{rwwYaRPg<@rv)}@0lO}4tdA~R;Amo|3Wo~N8`$lFWULzE>S6a_xo>G z10?hN6L==KVDM+u*F&~}y(I+exkD*3e7ef#$MFc#F%$yCf|fV9K_3tR#{G9oDAK3U zMyhFjPzPZ?lqyh(M+pVWGUR@sHMMgG=CwnZDoL?Ayj?9w?z2$xG|}4vWPkSZb2bwn z%paoTZ7G!u9z105V#niVBy|7J>UfYXM7-+7TEbSkuVKsu;0b3J?Sx1;B$FNh?d(r9 z?CcmIiZz(Nn=2ZQlD=T)(_2G%>|R%v?|y2AU*c@5HutbdI2AUmTjoYg3p|g6b*d*< zC@aFCLDXqUMbJK0p$ z92L_LYGuv3qs`EBj?!TjucYEn{dp}&C+UqVbHimh4e>QPs4ut4<5M*?uN=L5t?bUbQfA!r@j@QrRJ`xPp{I+8|=tG$K9a@~p3Y_;`KjWFZ`qTgY zeEab9iA!EJPT-&b(RmB8XDukK8V2LH?YM(s!6vjwfwd9i&!y1L8ppCY+2E_WFQ2z3 zf^d;zTe`HK#)Jb4Vin_0_5r)k)Ca|F>1M(Y(|ZiMiF%~hBlgl}1ew&0Qvkj&1XWp~ zHAOGGk;3m`M~W4x_qYhyv!~!`fnc?B7pj-{ypwD^dGglR+wIW()+IBTRS4TbSfL2vg-IR1?KJP%{15rhJfKa%y> zaJM`5Uq3xJLuX4YQS#i;Q%_gc>Ge@8&k;1?xd%H6Dz3Dzx#T6rzMNM){O`N;ay&nx zqSxU@IhT!%G%oMLrK+i^u66ek@LJ!uVck7N?2AMNfFEsk4r>Us7VcgS8wXWlxd`#Y zmI^yj&}AU9_NvCO)1tB;dyGzHP3}>Dg{cLBSJuC{SNK=pV-Hl%zoV%lus9k#qHH&~ zr@Z$cD|gU}j(g7T=V9ag(&9Ax4)sVY-4%Ip!-3HcSW{2xh^M>s$Z3y((hog!^;u8{ ze|z_WYw9`I8Xx#9`E%Q{u?L^c?6kHvRUhP6e0D1K&%ezub4Ty>e4~L~eB~20ZKaE; zf1Uc|_us$s-X9L1T3G<)TLO@yF~*X6Uul$3OX(8WK=w#6b=M0j&{Ie;&Vg6vE>L0e zE+=7tOUr0^Oe(_yr=F1VadK?jTB#qNR$N4|P?Qy*px<9U2(-I|y3LBUkWODOj~$ot z4ir+oL8ArP0)S)6EOQ!BY1bwkY9!UwT?+{@m1O*t0c$=4ue^!Bv#x2GO60{}*s1Tu1#RG{f zVZ=hBp#u#yt*r#zb!SU!+Lt$qeT)#AsDe!rmZkhei-RZO(Q7&vYeDuAFa~1WWaHXi zbQz&B-zZEkK8sK4ixFc3E|?}kxa}rUea4ige1M!@S^E%@tQKm6BU4=-O(?asJ=w{md)2*``hHL0QQ5iN))M7o(0kLRMITwz#2Pzq1Gb3S=BuO#(_?JH~sFR|W+*P<|ZExS8 z3o}+sOs68-JO&dh^gVb0aCTaV0;oX};<=n#QpyEU}|84j5CIH@)Sc?*Pg7)0HUn77E0GoRT;*jE-?=?<3 zmp?jR;(L_FiMXSmdDL`mVgHUQ_%lv(U~*rp!gIVMjo9j2p~F|y7~kD2q9*JZELO9KUS_S_msoDjCiQC#P+K*vK(EB-c zcj^8Jo2aeF z297f!XOq~5Rz$?(k9FUD=N)F8NkQX_Gn#+1Y)5>FvwI{p6jyFVBGJhuP4PB-p6Y{` zdbjtjOLsKC{PQoXKfFh->8Wj|Bdn&GP@>T6!Ttn0F1W_^NE08VR7I%n;s#|$VW+9Q z6Ob)IQ{MdUrIqJ?r>$t~f)b#)+Kpoo223n&-Bg%RjNgYXEoOXRV!+|q>U8d|-cemy zVKUj*Y-@9Sh2W@H^$=eXILKml5~e@VWGe2+-D>(MWObTTtygwjUwPL+K~ZCJPrfJ^_f5aG3!1bajV5K}k z(imn4?EbUvj87OovsGEl<{cv0pxzFX-!XtI9d92Vo>;wqhnTVSnBh^3myz}b53ui+ zUT!}W<_$=`MsSW6JKc^gzwCVfOyv4&MUMsmI>q{RH|E((d^cZIjDL0(2EV^)`=K)) z-(rA%b4$mjVvPIBAPC@6(HMfBWJIte&F8DBG{2d+_IA*N!v(%e1`cgSZz~JG0i=B` zZ@iQ*=5T4#Df~@r%n*!Y|CotHj0EBuXiFo3buF1?q!@A%60JpFh~8yP4S9Yzm=}~3 zXf;_iCPltDS%MTlU!@geJ4UXQbyh1gR`9t{ehZ7y#?tlKR@4x>m`NKO!m_NsvmZ~Nu)an7=@<6h5s2I#S zB|QXwJHw_oI^77^<3mTloPz=8@p~0Tm8JLI8bXITw-$qLrPnQMGW1U*7=|VEdf?l9 z(1=nVt-oXC6CWD~Zy!>XE^`k;kr>pxFKb_ZaVisF<>vzD=DDmy?&(us|E*@t4z+y^ zJV>%P7BoA}Cejazk| z%G>CbYn+bvt5o(>F%Uh4V`iz^7C1=gB$>iNY&}BtAR0(SDO?I}PsC6%Z19*e#bPc2 zs)ij)5M(7oljuQeDP7kaVuQ2GpfVP!A17T|^-|WKr?6r`0;a(j9qS%mPD{Yn5b`Mx zuxc(}Jk4Vb0f|(lJ6k{ru@;!ctEdSeF^uT9>H#{*l~4@%)?rb+zgy9%DrvuO^r7LoynVLyBd`-hnQbHec+JW00}Z626x zVXJ9n2`oU?N0V|Q%|K-ugV^cX+tOkUftV=qrG$_|>){m{P_OedxMkQeA8e%QMvDy8 z2sS8>$4K^C)iyhGZj~NYDW>d%9Ges~4DRi$AdlvFom!+*6nC%J9y(H3sdlgX;2!wF zX>(Vg(%i*|>QqoJY!@D>7^+%fH%AXEArBVV9O%Y9>f71!w#Gy;3&)kxYYLD~w@Scf zBd$T|s773nTC|LoW8={ruZFq+d4wSP;7Inmc`0sbh>1be0WLxm(Xrq|YrIa)9_Brs ztMF7Ez4s93=)Tk2vU_js#%ytmMpatIxl%8;4R8B;jmO=tka=oeIWctX)Y6c~YtD?$ z&?-R%u5JpNb20&``+&DHC39uIY0$p#!=aCQSHC~H?Zr>ndsi6-*L)ZXN)-=0ka^@# zP`mDEsKTQ+51v$7ZECl+wLy-)1@KS(nAMfxTfb{#BM`B-v#q$6bkO?-jdJDq3UI}< zE_DjXIsoqN_Q3|xor@$(td~z$(PXAw>eA+6@>`2(t`E9UCpLOoYkL$vXzni=0E1XldNCAbkDz zbLYfy8rncSfU*h#6wMoC+1kODw()}VNdwS?*lhW@v$Id zZc$GJFGDj`90t%g+)enCL2;jp(loibK#~T9iN}!M=~`r4UwYrHhjAU|{im zGKcDweS5CFXGeag-qLTs{KZ%NSp{` za<@rBP9!a*NL?*Or-`c-kaT&K*-Wj|yh{XWNizyB}? zrKQcu=kxyYJg+CO=j7z(S&|Dz)#2p6=!pO`egxA%4{|73#0q|8%tR=mKSPf7+3O+1 z6oV$$3@!|*lVEDhF~ofq+}moNb3|B$wVX$ElN4Xm!l=frEu?)k-zhRsb7=D;05LR) zoRqHilK|6U<|D5^Vj!t3-1mgwDFEZsLir%Kh(@h_ritbUWqQk6mn|+LV6bUIJoL(? zColc{JN>+ct18#!tvvg|XV1R=(wD#gF4@pBd1>g(jP-xN^!NAwcJIftPv&E(UHtj_`VjAxy%?eT>!~mj{COxF2D17@;}h?hMDEG1*2; z%m9f8wmEQyNbl!Pw7mT}7}TOlT|K#opzJFdc-cX(qKc5-lOjqTc!l(s1tTp!J4k{Y zfRkdk>hN-L$V)^6o1szMhsi{n9dqw|o}d{ZplO(syJmLX{0G)*!EgSN1Hr(u7NGFN zTWX}n0LC>3|JSl`%5vkUxS1_s_$l6jy8R@>+GL?;4* z5#3@e?EAEoC&I{oz;V_N>8g@V;Vl=I;L;U&(BYn_3ql`C^1L55tl%k2FP#?=av{}o zx2D_`c|jmphdGH+{BL|1ZUbUkH|~@J2c4YYd2h3=z4%&9%{%wEJ#^&cfxmU#z2lGd zM%Lhdu5QCDgf<(jM0rb3m8nrp@hLZXh!Ag4g2rqHuG1?eqHA96x%S=`j(ezxybmEG;danU z!-STk!c{sEaEk<~UbCtT1$z%KtBF|>?fQ5s4vnSWXl_i+fRieRG$#h!(wK1&id`gT zWWV3R3dVTKMS6t-)k5X&B|YN(1>;!rV2%5)y;v?{x$#=1T~rn#SMu`VSBG_h=9=JX z<(f!0oEM=?ycL0-!Z7>=~s@AYm_np~hy8g)^2H8G#B@6Jv zHqeSjrf{wy2aQ1YGkWgUhsrldpz&}Cam;HUazI)}b1@*yfHXFH(n0x|0U_jvMkh$Z zQ(3ZdY-z9rwGi~FVG-GY1u3tMFNXkAt2UQCo1Gx$mAgu<*mmfjt;+8PZbHw*{Vl`+ly|2LG75mBaEl>>n zq@&7Tq0KArDxPuj?_Ih4y6T7a3>u2)$x=gi4`Yj&G9%M}Jw3A{`b37*D3;d45tJXo zf5jEw`Rxo{Umzgv8uB8G==FfdL1PWK@sSp#C0Y|C`SKtQz3E)Ah0{y7AzDf(XSC3f zC36mo5FEY)EjzG*650Rp-r@`3B*<-Kcg_9TR_xBSnJR!ude6y!b;(#GUmH0=_MP1H zzi0kFoO906C}QH8&pTMl-u(^PjiO=w z1)=esi|7Bg&r}^Y;hTt_AO&npnc<`|fY=`87^F{Lco_y=y=ts>qQIZehho_Pp~2wW zl* zqd%u6vkhXtcp(S}D$c$z5?eWv%F|+f?{8B4Aci20FFLjH%y(zjT-nCnSPf7)NR2lR z{CMdPu53eTsHys|ZRp^i#W3=%16vEPA6TwNtlfM=eIzyLn$fBRzj*_Z9+>+qoih$0 zmnPO0K!#lg2A%LuV-C6hB`KI`F1Q2*#TPu9^uZPq2FtTy*#@UCSMK z{u^`TH6&243PExJOy|X9_&PXLBw2bSdcdU*zs1wDJm^$-4`5S@8;H^%9R!kW_vS*$ z$n`4ZusNre)kMzEHzbv>IxKYerBZv3v$w6xN;R!2kWJkuEJDMck6xw>7wlH4&N=3A z&ppX`YFndXcU@(1-84c0#5D}-k6~xDcOh%*EUt4+P(aauv zuh{I$Q2xR4g@GWvtgoKDY(s_jJq)%yijQ~e?9hxtwQN9YYzJejlrg-UJiVxVaj~t;P@S)sKC40*2%~M3&UZ%{ZeicXqD1dJslUz|VHaDJAHIG^W29l%iqeJqS_yk$Pv^O#*FHY} zk8(LdU?ZGUYyZOJfFK}0bIj#rCJIY}7}EWVSBEhwzrHxIzAKwgadye=1=0~cT0)4? zV=e}T_IFT^MOiNJM`S ztx2ICpIK#$t3yW6R7rO*rBMi^T-|&L$|_`)@4_iFx&y*?bP4p0pRT$65R73$cx3tt z1oW*Q*+#0*AWA$EH}{w_;D}g1O;mx-m$+`UmvSr?-D|pd7-LGN$T@ ze0V$xLZnI~YQnAj%W*7&f6HpH1|e0hU?`hH(~1std=jd^g1&4lJmB;Xl@SQ8hw3^H z)Wk5>JoAsYffz@?b`BZqpyUEqat^eBA`n?&zubOiO|zURld-*PsN8cRGk8rQ!sI(0 zI$r}){5(es;tb||2Y>f<-%w}qL!5TkgdYPk4mQv!#s)j3IPHRBovyEI2YC<^Y6fxz4urwp8q=Bwf;G+) zosv6^e zpUHz4&%azS@!k=w`v+e=W}KF)&gu4RHS4b}pIkJ)+`2H|a-sO4^NXHmYNC5xfDb8w zr>Zaf@%FP$4!aCHBDTSL5_RjI?lO#-#ksZDM*OQAn=lm|uICzY;yE;S;3wrkN(1Iy zWB#~{NNe~;Kf*b=#!9n)hYzB1`NG4_wa>wy0mcdz3@P*?>g?Ie-U;2oM7=TkZ7#Ze za~9f;cs7i)7}J<(Esj2Y5NaDR^Dz4W;|;Vb`10vw@pWnURqRJ{?nLj46zh2-J4ZMI z-9|=+7YwRrf&bHDH9YyryM%WI>^n2tZ!YldUp}eIpMU^BA~LRL!|tnV|CPsujBK2c zjR>#3%88omp8)j8K)1sMt5#8}ZZ?+b7(I}h+=`exqSC11i;+2qmI9PR5fh`2e$2$+ z<55N4xGZ1+xKf%=sEg;y-eSyep$&`B6|2gurP+X|U?K|do!115c@VN3GtG$@JTsv( ztU8fvArNnlFpY3B5$=Nw-&;eq61h2>zZ?0Yd3J?X=#3KRwH&WEz8_NtW(dYYDXByk z;e;BJbcP{A`&&*@K(6^Cp9KE$)!xO&fA!~!>rcJ?)Yp%m-FbD>%RO`V6qm~u7(-ZS zkZla#9R;1=CK;SV)VljEit(u}Ct)8`sI%&x1n3A157T3Bxv)%$DmXaHf$i$CZbx6g zKP<9RnG;NZe3;eng>gMnbeyl|CVH)ZJml=O=*EHWchAXwz*f7yYtghOWBh?nhpJ4v z7UFPmDBrlGEheG`p5HDcg(dRviT0YIFBbJ_J{@KzbS&SOzwn)#{!63N=0E!0X3oQH z>Z)PjE5iKdeY&awuFMI-(tGLYS$~Myo9W;&AnuZ1onWOXaX6dP?q%NTcw*l1kT5d6 z(>Km#;cB|?hs$%4LKB}cRt-vrFE>k}1%{3%${4$g86S%)wD}b!z+zOL-zf2ZI@y*; zfgzv>3FMq}ST2kXV{n}z!PK?(bp?7>p$Q~zLXQ?$9S$=vRKPbe?r>u}8%`kyd=ylg ztQ$)a9x}B7r{3t*9X@?#)dz|S4Q3|n6CuPc$L9`5JGq|vK2k%UU%LqT=%4q z>Z%)a_vUER_5H=P8HPNW)KmU2Hiua_&Y46BBj_E5ryC3!kx5Y#oe(Gyf7oya~g7zqw;R!X3+rdb1Mqq*`cnX>!|Bs0OZ`G4vPPx2!!9uef(&@vnZL z{l<;^-?$#Vb449#4-bAzp3yTtW@%PXi z(0_j#QDnjAL6qMk&{Y}pDj_I+ptbIYePVfWgv*{R?Or6xmpfQP-^u6NJGzn;#h-R| zxjsG7M$Ivo`;sQ#+iUXvU{K0Zi>f;Zf)_Ls+pCteD1Do$WM;5EP;-Al#D{0GLo*DW zCAbdBvbs-cgt2>He%ZtGyEp)6{SAl{rKs7_wOQoufxex%HZ<^Q$g)8a$+zEOmQg} zVGhH~7WX5aiD;^#j1Xy$KmjCU-RA|9Qq|marIs#$hWUy8d%l@z#)G+Z7fw*11LiM; zEWaE+S+FjQFM`B#KhN2{Z6Vs6C3qAU%)KF^bAfdPhZY8qsZzI>@bnjl zN_L;coE>tA)KY~&HIiDoO@d>MZ_HO^fyf-+8xwdtLY?&pC-j;O>8GO*WGefFm!l(6s8rVtCJigVTFiqq}1Qkgt%@*LU9<97}38Q)Wm`I=g47ZPnAEnm^$hto@VOaAj!5r5 zE5l7f4sv2r5Gg5Hf;&j7hoMr7W;U>l_uOl zyK4~gQ8TT9rHsg6v|`J-(+8B2(d96KjFzcj-rZMuRG6t-Dha=r;tbmNq-hZ z3z!Zy31Zrtk8j_Db{MvSR9w{1i}x`TUT6Y@#yJqO;S&&eeg?gwIYxw*zkD`UJpBF% zs2`dHSb7bRctP2p$>iZNHG}9Z@Z$gxgkXi&$k{`RV<=sZ=pdOCsfp*RCT7T(3!mr= z@)hM?zbrbegPk8jYVz!+P3xEI#_A9spd~x4eaK#o*P;!al+&_dzyj&>UtPBZT;XECm!f#MC19z%L5g8dz#;S@<#`L`qM|sIu>;~ zX{(_YGlO~2nnO9B_a+zheLZtx$wP;NwAHt6hI!4#p31e_z=}v;29FIZPjyoBT=>B)d@X(rNI%t3*+kk{% zJZWB$a0Lgv;;lazVD`ATboBSPz6LDybV`-9K7g^Z7y4@abBIIRp*NhepD zdg{gj=ycAUegOvWsw=n>!_PF1Og)3{*8_A7}0dg&>>R!Eoc2KE^a6}6k&La zbHGJV^bjWoiSWL-lktpA>PV0?Jq%BmdTlaRGomDUJsMg^Gro1U_O80kkDmMMqUDG? z(OYA$be!N#{ICmYjS>>0@*+@E+e9OGc;9`?fB#wE$ER<9`G=1;Uj6u2%a;9O^oMcs z1BEgb^w2YY{hj~z`2|z|`{uIGzj)!>9dqWdFYjmo*{AZdp}=AyE0(OU)dKqK)Iwi~ z69R=J7R7Gx>KV(53POjt-3m;MdI{dZm;Dc=l{yY$h*)5$bh@*!=ELmhZ1dF zhyIw9Dv&Ocjrrg6(GiUcT&aYC3y~5;cmj(kF(H_$hpGhW0F6znjL9;$ndSWXG|osO zuJ6r`V-C9nUgJUI77M~x-mfz8WSv(kg)rdVElw}UjCwE^6C@;r+&)-m1#&E|u3M=D zHeq@yWxnp0yjb^3@jwWB3uzD=Y3RrrLDDm480&#*1d<+>CplIyKWBjvcJWLq|MuZh z>c%g%Bga9t;3w4#*Mmhf@{szp6@9ni`cEx?nS<=HWiP`re03B-bX(Q`c~!XnNf~^2 zabFmxTbNEGZ>8lbu4u%)^xgUVv}w69ft($m2l0S@6PBC2~jjNQiC3a4}BhIZr~S_{^SshiQvVbf1GG|;kBR9gX1qhb!d96rT5<+I(vzAoV-+X zqS?t@UUc-sd5u6(JhkW0rNXb+_d5tD(Omg-gLf6<%fo#IOgx?of_CwGZyupVhy_SB zk|hu_j6Ohtlgwa97&|gXd@Y(p?I|s@c+iEM$sclgrb>2aNM)^aVIVuBSn< z{;l`Qec0xmj(;;#tMc$qyFdCd_P;y6*;amQ)$VQ6!w3IY9WaK}BN1auG%?Y$-v>;6 z&D%%I5z+Yte)9$4_AjuLA!3k@`&ncCSgrvZM7+h&O%5-e!#5ElYXE+~(_4h+PYp{O zk6wlK1pjnQip`iS@=bOZHl8AtK}d`&`2CfzC!l?vL2AJJq%x4poi7tbgtq%k9L}&~ z5=TNyI#2L~N}Nwccmc9G2nc-&RYNCJpzk3c-8m~HNi>{ev68syy(&QqG{#swmG`S1 zJ_M}{2TgrJ(`O^r&rX!ZO+(nlfG@u;?^5MeQ?03_Iy+`}OBD*RgunXB{!O(Tj+FC4 zzP3DwBd&-qmn9e5TB8MUMR;+R4(M|Vt^kV#dLE0UB3hu$R)eXK!O54`isDm|t<~Ep z9&$yDFHgW;x8}8i^L=a99+xcX>cetP$CXQ1UF(}7+Yg#1Y!dtWg^P*Od|mat3T990 z+{3bk-99hGEg+p0+yJBtL9A8Zf@#aQp_l)wcBUV;n z4(FTBFFtAQTfR$LZ>d?RqxQOk&m2OPFy6oX6+v&2o;z{Mf*hHQNu9Pv-e;ipHimM7 zDHj&WnC>8zsSWfhTD|BJdT$j>7@nm&k=7$9a*2l4R0c^X@>rOj_ynAXMS5&VP=Gap z)!3!P*5IW=p29*ScvL{LK)s5^m;%cbR0d6GYdkEYn3T}5m&ZfitI(>ageLN>xT@pb_IUK`N|2|2MOchQp z+qKmYof$a;s+u15-+^GDNHPw3i?n$eL_FpPU4%TdsbrAD5*xVy^Fd%UQ1Y?%0SJpy z1cx1pdUB5;ZM02*D?dm!5_vUNx_JU07Ysn+3!A3433m28t$m15Qo@Y1W}K47#x$58 zIab0jJjRiHqh7))kamIC>wu}W#5FYNCKi_v)nUD(6}th9Bvv;rxllb%d8&Z{evQj{ zF}X z3r3W#R<^&ScKyd=^%ol!7Hf$Q8X}TG7w(-^4sDk?B1C$ubho--0m4O|K37`&Oo*ad z8Ks6R>Sb#xg81N&iL*)GUe?GE9*DVN?SHlJuaC}*uiAyZ1?RCU5R!|UGTY_DvqHc`VgZFbzUHkrw0jdp6C^D z%fidyDOI6~{#06XL+mdGWg!^AS~!rUl_PfegES+U8V6adXzZF*Ai@SSfpz`Iu7RaL zaENPX;hNsP`H754NB~6+p^6JJGiC%Z$Dns@^b@&x8O8;r;H9fVR;lX_*zFdEu|{qK z$X|wrRb09YLYv>6`N@L41Gjc!;yvxTPaj7+gNN~>k*qcU^6ITDAtsl#ee;6l_AX>W zY@JVuK-4QVbR?LW13`tAGKUR|g8d6KOh^!;QkgV^40XU}Dyayi`1ElfQOWS4+JRwr z>_CENm;{?$ljlL!m%S4Ra~ie>f}9b=I)I`^jk@lAn>zSlJ1Bo}c#CYxgF4dm_Z>dKx|uX<Q? zh<>i25BK!Z7i&6YTndrA4lxrl6Q$L`1Z>R%u2KoUv~ zUH;_OzkGD+QiI8c3y7;gs&btdbOxCaBBG82eMZ~evw2tA-PfD@2U|(a`j&?C$rTmF zCoL9Aw!HoN<0F}Y*@v4cr5BJ9z-`g(>kzCZ1tqA0jEnbqwi6zZHeSL)(~andjWB6& zFtm&KCg7}0yP?~l&2wCmgxjbwLl;q?iHc#L)=og?Av86KS3)v7Hb&8sn`xZC5Jx9M zIaCGl(q(CEgx%>e_=!e`8K_A?F~K+*nK}f>fJ6orD_c4faj=>j2i}9W_2y44pz#^L z4}x5Pz)}_Kv90ii1Sbl-ESoY1ww2sKPS@$@(B&-9-S~Rl?OiQX#>vN*2gTn;&ur6Y zaQkO}T7w(UZhYzH|K4%Il`M`Kh1csi07 z2+#J03ai-7YH+V>LGQ=A1qum`=T{%Th)pW})|!e&14@9_6t4TGKRkbKa?>h~5sp|b zH7$UFVcS05N%;UFY{{;Z?SfQ2;Z83uPP<&(k&|oJZD`JuGfV4U?K|Auf0VJUSpVUI zL(NY+?1d&wx#wqbn`S>ZQrL(m=NPFbubNqz(rffV+)%{Cmiq%uO-&HFyNJnWX8;Bh z%pTgpG>J^ike&f&5kl*cYMa4LICL>3pkCjZgDu&V|AyZIo&758ToQ)0J8sx3}CpDWKk>|gO_8FBN7zJ-98THLYEo}u)v5w zI1Yg&h5KJ3)ZZNnk^neu&a}+Y-(!Yh-cIDxljD8~d58+Z!~Pl+d?5p+lm+1jqw-Od zLfsFIVwRR?liE<5ATFH~@$Y!zDD9R_Wpa3CtRI)nQ$j;ex0;UgLHZ z5Zam!s?PMc;}4#`a`t!s-0-{fsc--C^wCygr?XM%t3aTrp__~HE6s* z8%eYy#6}=tSy>s#>v48$Hx-D6^16=gcNK{8`T27TdYtaM7TVN`)wEhFf}N%2PGGKM zBPa@k9fmRVps8+cNOUz6Rt4}Zx@S+DH@o^l?dR^pv+FvQVr%zi3tw(+ujwYdx#QlM z=XIMlZ(j8LLq{SjF89A&%al(3C@HgF+0S z=MLkY05!6^XG&fiiAA14w3IVSXN;~Du%HVPKAHic z(bUp85KdoTU>IF{``(=0R}srZLJo1`jdkjl+q&~z>ddxWAS0vOez0-bb-e$vOo;O{T6KVK}lpJ zuv$?kJSfhFHJ%~(AuVXTy*3aIjRagnQfs1(mdw(7BhCInv7r;ac>8pGomDy(X(uAM zzW$w-%=mAj?)ukv+<58l2mUV4xprXL58hgS#0b_Nx71wTh)@9&X{DOS9ml>T@0`FvWXb zE5Kb`Q1R-#z7EL7-Zq|e9{sbFcYgH>cJ%S^AN9jZ)w!d6#d}U1ZiZZ83At|V_T~47 z&_FM|pu9h_cHzm*g_aBPy$)tv7WQ_e6vc+Ega}A*sIZVtC%Vi(oMa2 z4}8&TI$FRV4)k2Ku6eo6I96zimzFpNdp|z6wy(4C9v$Yc17b|WxfRCV`3#Ls^zEP7Mopi|QF?VHcE!o|%vF%~>@*yd39g*R};DN8kbf zo>-$AU#7^Boz*W+J%PmD@-wG*-24YnrsEjE#PForVWxrp1`H1ptv7ll?!3)r0^u|$ z!#jgYIR+|A=P@}x4@Vv7Y^&l*K&BZ?_cQg;JL1RiX;jy%zf!`y->xft2vH6BB;3!# zkk6W^h|=N0cox6sE|Sc66UT8sV~PEoBF@l+XbyW)BjA51RuLu(Q%b4eJd&5UXUC2m zUAFRNd*0mp^m-kyj?VC&MlM_rLmG+q&mY?K<6r&xr$78WS+`=Jk$C_f09UdYu`Im} ztv!p*I|>5|VznZA^wLl)3PDB)^_V7F9+=A1WRT{j+4r}o7fZ8>&0(8{8rgnSmmfb^EN6>|;E4|;MiHCpSk?jf}is9IynQKTJ4 zQ(q{%m`3AS>A7g#UYqCSiK@(Gdz4u+0Suk@?BePDchT`FNC z-pv*3o3#pC&6d)=K8zbDA=h-o6I%PAG{_;4U?rk*P>Rx%H;o*~kbD9;U6{v|!E8)p z&szd34SX1wkUJndfvk-4he%nE|CpMN4YcO^fiu6g!q)cyCOvyn1eLmVCvI5`kgiKm zY$I@EXzAmVH}ju)3{843nRFB>iRG zV~fM29pGv7{*$^JRTxZaX=J011!=P$WPyEH;!rZ#v?M!->=~j7{0knj94JWPSk16p zfL1dJyJOv0Z+0?}KdkY)6(vzCBfP^DPYg`z4o@dxi+1q2c@T#dKn*F6x%!YWc5(RmJ96Xmjf?9S3<$%%B{-C z#{*sZap|fJ# z&0L4RrpF208xKe_?d*8{Qk@P8Mw^Ut1TYPSYo+5~Ez(Yl2%;`r!9Qe#4}bL`L@+_* z=;k7Nx4XX9mm&KyddupVOha?g$ii`_HY09oIW*$b?5WB}%o;!R(I-pl?>@@v{0$qP z?0RVJ219!>8O8~GIT(9j)`zb-s*TP0I2Fbjr~w$HXiWf6xl46NdD4SpWA4U@cnq!; zx|$0BbOS|CO;DA%_GM#-m&lg9HBRWcA-K{A+5{OU4wJH$M7+tIAPoU!v2PUxw?SzT zbRnpEko}zkEi+}#LgXM;(`CkVkR>J`SE-==Z3C+t;d8+`MsyKSbD8~wc3g{tOOujQ z4kiQQ3B4CaluuH(c9e{k-`arupgFf6K-VpDEW*pQXup?j2X91o{gfv)PqfEneI**M=O6zNN(dn$byM5#yHT_!hO^) zN}LuRf)KzA0)daVBX=P7%#19!y72~D#o-%;5tdyN0qIg|`l@=e9P(!5T)4 zV*-F~Sb)_+q491N_}AH$$UUI6;uzL5@iIQ|pzQzg@433MK*L>kPcAA)AP|8(p)}RY zSYm!t<6h{$Tu2o5^30gH>`XIAuE8}zg2}1c3p+Z!?hB__wg3eb>5yn6O_{g%T7A=w+ zt`!-_W_Of$4GC+Id`o;8X5_l^?}a|Sb=YP1K|`UO@9brfhK9=2c(PuqlM93guzhN5 zzIyS<`IW0`F+zn8>y==YpNt3HE{F zONb%ahreSaaAG&U4)_G=j+f!u@aL1j0%+)%r(gPQizlwfQscNBq;0P(MxXS!m2Fys}tF2V?PNt z`b0Vj(f1%xN`Z_Yun!JaH-#4h1C-iAY3%rYn=a}(5Cwjk8~RE>mw5%H~iim zKNi3|9UDUf1_7W(AW*hB3~dd7^3PROHfE?Q4}-=c7F6JDw=*`m!tGrm5eQU3OXU7> z;Jp*QOgW=ijQ}~8F&+nR->%R+-Wwjmeb8vcFj3IH!i1DSca)MStv+e!8eY>pj|SeR zVg0p#XXC})(IINRQ3H_10|H;y}2~4ojs<^g0}ve>~7cd!d2#+2MDA{xAR*#025BV^oVG zt&FJ7gJ2bN7Lb+^4vT#s;NbWP;j9UZgTXf9@G%^&dTPlrD7>-n;O=(cx{5gA{}iZ)PYnmvqYxn~ohInWY~Nd;Wdh}*6opKY z(#-RT0FrrR>0k|FbylIiY!%B8!fmiRC+~XmN3XO!)FD#5wo!lb>lY5(uTsVyz1CY} zGmwiH!kxRXc-5}E3KW(xoqVlUg((Tx$3cgUELc#W7$}YB;OW46L+|KBXU2(jWAo72i=arJEbq62Nfo^NxDJjOAMuk*s_ zab>JNmiSK{qZa3||qjZ6hf*D2q&^zr@ zKf=Rkfb$+9Tj~XkCsNr;jz9r^D!sZy z-Yo8(_dO&f+iZ7u&ujetM2R^B^FRK4!fV&iy}RJ`f=m&}`tjyOTP&vusmx)*4d#2| zSo@!<@_4@%@AN>7UL4sAX8ru*Y8^58?4Twe5YprtVVr9uR39|j79@=hK^7kH?;n0| zQET0XWqTgH*zjfIu?+A`-g6op)lKj8iOp4)>kXeRiet|LD>6o(7vf4H;y=%k4oN(F zA^?ju6PCCp8xaQWp7LiH`tQO3T1&>IwA-lJAuB=@?Qf5Zj<47rOp(Y*Wo6bW%ObTz z@@j1G4>?X&d0efc*(NcS@q;_- zOvylk%rFja*^pz&VR{!CLjQK5qk2hT-7G_aQi>nMu@c{*eMj#Rhmsbxe;eW!*Va|AZd-@K{% z_F&e_nd;L+>AJI3=Y4F^l}z*-+m@<&o7172+lIgc)}qwZqg4p|@~NPUeM%W*zod~VvR$j; zCNvu(0$b{W`AdMC%gDrh`K-$?{sO7SNu3S^6 z5>*Huqx)P!rBU;ZApOv-MifiWT?!sC7zPcY_7xVPcL;Cal-*$XTy<~()C!K?gA8T7Swm{_*+Fd`>Y{n zyN;$;G9x!~P~^=xIgEK>FVpWaG~Sor;o=|R4@Z?fJ1ra46gPf?zvt?2zN|cRvB5o; z*DlG)#fjF7DDBoO?$YUzsl54s%G-s(+I zxe?_C=7|O%kj;%T#4h+*XpYG(6;l6z?=sByuo9z$uI$aG`p&J{t{_c1Zg(Aw+I!n% zt?l@l4WIh8gIi`b5_@OVF?s$a`?^}%+=rVq6R4f0xy zf4r|Sg5M^~7K}1ktN~Y4wqtf=lNw(5ydzudseS7=9j(4zr55>I99u`}pfo6RC#MG$ zD9|xvyHc zzcP63MD`4Hz9~q;QfA-|Npeu))N;<~RWoIvZFvSAV_7Nfx0-{aG8@a)P--R~zJIH^5YK4Ox?Z5&6X>J&&9z(Kix6i$b zA>i(*Y&cUEBD@Ih_ZPU^S93T>(TH$BJF?KzpQ(`pkGKigM@J8|(M-M;&|lOVE^1^G z_P%<=PpS!|s)vEZ&sr}bM+9#U^fnX#t>V)bwEh{AgQ)XnNL(Wd2m%eYpkOTR7odk1 z{1HEf&c-zCJYfWi(Ln;iE-)gZ&WJ@Uy;ygVOmCt^Y3pNhCEgB@4>mEV1aapHuNYxH zEB6MipDp4egn!9&lEF1ta~bP1zENqTL4XU0yi=~R_TmiVF{U#j3}R>08sfNK25qVd z?WVy%cGMuO+kgsa`y(Gd2$#^v54lWY#7&VyrrxbIJ z@lz*%c=;?s%LO342I3XA_UJs&4v9g*2;>f_Bn%j@tmcu&MdXjG3RdE}AJ-aQ6n~`= zY!}G8xVwkcKgfs^2)1-{Y=04+e2AlvBbizngzxi>{M(;*P1QlSHRZl?`oK3cbKyi^ zuzRaIt(!qF*!|7D>{R9M*KS{3=pC8v04WAx%S;~3OSr~S(eEFQ&MN|bqzN!$jR)$B ze4$aqBn90L=@>0r&HrUx%EkB+Wn(Htk#wN{Bl0~%cn2if@$WZ2T}Wv`y4B34QcNmn zaHR)b!N8t*eqoh2F#uA)gc%{6ZorLQ-U)`D0iS&k8sLzijkP0u;EP2z44=T}A}GV_o|ccPwupSK$wl3DKnGSEs_02 z9wg#93AaOLoAZRPX#Jp369(2E7<^E*1_?K%N4|{I>BlH)0#Boxw zUlq$`9F9W44;eKLYEqC04G_ps(fL!}eEC=z*&ndqi7VKVb_dA}4UL8Y<8V^>D6K5_ew@4;@^kll(--E#); zLEVi{28aO+2}lmB-0wpxzi%Cu?m-^-&OwBv-ui*SVpDr&YStCqgo{JjEMi0>mb&9O zpq9=dHTmI~{mMA(MmBpKj2QK|1c7AHaiXP31J(;{XGj)U3#^DhNfOXTo8lbw5J0ze z%Cysv2B++LQjp?2*zkTwOrxZ+6vxx!%%~XpKo7AmV`&cvpum$u*X|jlA>7y8QBvC$P$l2;=Wx z(jyzLr=wy0$zn+-1X*i^wRMF>;swBH@ng*d^%7~*Oo){w@evv?2F0_3aXawf1sHv1SS|KAJBYVB z2u@eP0LH}6he4;qwv9b?~*O zgDv;3-jD1DeHr(h zv}26GcjE<)W-kziL`7I00O@E#5MxAkQdx z?MPqA;GoNJeEc_G{ROf5xsw-f z`U_cTnIJ4@nXr=)(Xxq<2J5mUoEVKB@gNHWGhcxm`;A@M5NnJh{PDPUSR<1*Nhiih zt=-H=D4&vc!+8P*^!a32X@40%omnAP`^A$F=cNXdtT8Uc+ap8na1 zMaiK>Q6-RpV0j&Is~ahBwiGZb>TvaxA(uBI4Gl6dA+Hn^OzlMiPLp&OBLNFAhgY2)%YH+!pw1^JM~PT_u&w#?lqB0MC3T2*9OdOY!XFP5bVd z>cewu0za^SanaHE&g>fS0-B}vz*l*6nYZ)0ru1l6zFAqq<60rqZUzHJ^|@n5Us8Wr z&aqPqVZ@vLuiuPLor3I-!m^k`CzF3W2g(&1_F<^<5ne1g1gng}lZsJ4@XXzH1msDq zSG%!Gy}Ly>M+1a8S{6*XIe!-Ih0q_IQ;gtCU($;B9Q|crm8~x1@%9(%U2Yi1pu3Kc zBu4Ham?MQE{+2{&!08Pg!?*O3mRAropv6(FZgo6C6qH9gtbOR@OcJagN4T(Lg(b6` z!i-;Jkp5i9D8ATTDDid=Zk+A%Kxc?UfWbmo$G=$>#{6IR)uM;pwff=@dVKmjTtqKU;NJ2Ip ze|ON|lpjFl3QT7eg}```Z;G%{rcr9e_gkjEJy0&F15spM>Fa`oAk);w2q0R55B7iD zJ~Bj}0#ZC=Vg4@VEqK>5U2!o^G!`L<2Foh>7+x-EObhI_YUa@JTHlgvDUFvzUpguv z+;n3Eh#{;haM|Jg1e*}9YoihS2zJy$K(^WqjVmsJjmt?Ep9HAMzx7~4LyNcR+JVcO4Ra*KuF8`L9)f~>;(@yU84&&6j znA`v+w{ckrSXY=*&1cYCBPHZi+Ci}zBun|(EvQrqZ~T%;yqkfgu;0E|Y0HKhY?~%O z!>l)>4=)X8Y8r18Y1koR42#C$dgGlOfL?jwVnxW$hlm0dxijbwi>OP2GL+}IEHGZz z+PypH`8Rc4U~W`F!U_>iW0N*7Pw&mr1Nw^L{&4adD3`R*hX7LWKJLqAt}d#+@ZVLu z$AR+MD+pOb{xKuQ4aMjPFXLGq+tMHr@10>psvv0R)Wyu_i>d>06j?sMNZF`i=7^J2 zdfBwON8U%&xkC%lLn}chGtHn^N^rs%yS{7u16?PJ7gu5=hUN+J)>#@m5F=U_O42E1 z?zx5nopoQAja^)e;wnlj`aQ%hh-BZ^zFaJ@=$z6P0G@gZ}(v8%}&}RZHDF z)dqZPZP|ku#455MzyU|I2^v8On;{OaJaySQ?kWX7sS+5NG>4nk9<+B8xgO+83aK#y zgz*Uql0(N>vLFl-3YW;iq{5t)n+q*qARNfxLV;K|2<3931kLj?!>A9Gd^?r6(42=K z(a3Qv(!+?c86f-e&?IJf5#zLU0p@W=DsSgm$h(*fiLy^kKLZ}p(jcC^Wik%Wu*kjs z&##^TGn*#VV9hrm1yoN#Z13>YVHk7Z?5$BAMP<35dO`~+z4|V}@dQjXXR}iTq}2pz z#?#0*p>l@^7m4#EO^HU#9^EKqN7upz-YEF<@5U1&qoAP8+TnPnWHd?;yvqa%8Hg(t z0RU?Vtlv6-&O2OdD><*6iD&jo+y*J zR#$=JU$r9JP|{(%zra`~hKzEQqgv3Lo94DEt)}?CPf?`WB&p!yi}!#1&hKWl7;Aes z&VJ$Hc`w$`W}8J>?-Xr)SgF(jhR9i1Sz&k!1-Df_`{#fD?!bZ`6SJc5>d6lu|M~y^ zb@<3VHbDQy4)-2Lm^iu|QUcUZxZ~R$-+tT8$uzXl9&}<)BNlws)2rVySk{XZoimMIrgv@rTJQwm+CvGB=i4-xU z6{V6k5hzl9m~UY(CFJHq;ED2p@FNhBT4I<1pE3u#3hADF#D_&Hd_^K|_EH`@e0&CeAvfWWa75J*Q#4I}rtD$>4?y z1GJYA;FP|5$eaOz89Fm9ntmvRZ|ue6lN`WV3BT+9upVAPGxTX$NLcpKX|FI&BY6@7 z33AKRT_PY5Qa|KqC2*6NF^ERPF5=eVnm`aCr2NhKpy^lwo>mIC zJ)qLffa4>UU+&~WkOIC|j6LR2h8;=+ z{U-L;SS7qpuYUc{*SGLm=<<*BJtw!Du&o-4V@jBw?8o(*hc>9SCW;t}jpa;}T60t3 z44i?I8#yI#vQCIS>>&&nh=`Dn&?ecZwVz zQxLM^KK|Gn=O1QP_x<88Z-1M}NE#56fq9GCE_^mno9svg6w9^CKl^a?&x;YU zVN54`>niXa3~<=?Bd*&RGd1Q7GXi|}6y&Jw?p4O!XZ@Zlx?wfykalZiLf>ygx|R^S zhE2O1016jvN)i(bZja)x3i|VNvC~(wlh9F#&HCtx_85`jhH^7u7;|8JmDf=*eGi%e=9y^O+yv)@L;kr;6TH zK?Q^46yc8Eq1v4ZAtY>Ch7<-f{Eou!PJ1v~gX>j3^B1H+zt>3I4F6$OU9PxY>fu@kU1_ z_PZW+!3^P)2|PNdRlz@zNAnCyp~~$KZhX1N1b-arJ(h1_BJj@@F%=!NYNai%BRbwx zXRUB2i&s>lmh0fQGZj`&fnAZB&OWcCjX+zsvF+!IFC0{ip68Orh{YC zE+g-UQb_e|5(z*AJl?#FI)pz66agaW3=NMA1qE|uO!TWRcM2g`57Xv77^lKCPSIn7 zSlheCv=B^$%Yd%Nz&9U3Ti69q0;aWKKcjChGxNTfkhjat4dazU)-Q6_)!`KkNsn

_^ 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

q?uF0~y3Jf=+*hugycz&6g~1=Y|gDAq#_j*R{rh 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%0DO8FGTtffii#rqt{XKn-;SHeEzn)#|;>{9?35JQt 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

rAbp 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

4^eNSJFaM^M`AG}2C2 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 y=_uu9+6?;c#4AIia~bLe 1 else "~/projects/my_app" +print("Step 1: Initialize rooms from folder structure") +print(f" mempalace init {project_dir}") +print("\nStep 2: Mine everything") +print(f" mempalace mine {project_dir}") +print("\nStep 3: Search") +print(" mempalace search 'why did we choose this approach'") diff --git a/examples/convo_import.py b/examples/convo_import.py new file mode 100644 index 0000000..3ac0f99 --- /dev/null +++ b/examples/convo_import.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python3 +"""Example: import Claude Code / ChatGPT conversations.""" + +print("Import Claude Code sessions:") +print(" mempalace mine ~/claude-sessions/ --mode convos --wing my_project") +print() +print("Import ChatGPT exports:") +print(" mempalace mine ~/chatgpt-exports/ --mode convos") +print() +print("Use general extractor for richer extraction:") +print(" mempalace mine ~/chats/ --mode convos --extract general") diff --git a/examples/mcp_setup.md b/examples/mcp_setup.md new file mode 100644 index 0000000..a30ad90 --- /dev/null +++ b/examples/mcp_setup.md @@ -0,0 +1,25 @@ +# MCP Integration — Claude Code + +## Setup + +Run the MCP server: + +```bash +python mcp_server.py +``` + +Or add to Claude Code: + +```bash +claude mcp add mempal -- python /path/to/mempalace/mcp_server.py +``` + +## Available Tools + +- **mempal_status** — palace stats (wings, rooms, drawer counts) +- **mempal_search** — semantic search across all memories +- **mempal_list_wings** — list all projects in the palace + +## Usage in Claude Code + +Once configured, Claude Code can search your memories directly during conversations. diff --git a/hooks/README.md b/hooks/README.md new file mode 100644 index 0000000..d5380ef --- /dev/null +++ b/hooks/README.md @@ -0,0 +1,138 @@ +# MemPalace Hooks — Auto-Save for Terminal AI Tools + +These hook scripts make MemPalace save automatically. No manual "save" commands needed. + +## What They Do + +| Hook | When It Fires | What Happens | +|------|--------------|-------------| +| **Save Hook** | Every 15 human messages | Blocks the AI, tells it to save key topics/decisions/quotes to the palace | +| **PreCompact Hook** | Right before context compaction | Emergency save — forces the AI to save EVERYTHING before losing context | + +The AI does the actual filing — it knows the conversation context, so it classifies memories into the right wings/halls/closets. The hooks just tell it WHEN to save. + +## Install — Claude Code + +Add to `.claude/settings.local.json`: + +```json +{ + "hooks": { + "Stop": [{ + "matcher": "*", + "hooks": [{ + "type": "command", + "command": "/absolute/path/to/hooks/mempal_save_hook.sh", + "timeout": 30 + }] + }], + "PreCompact": [{ + "hooks": [{ + "type": "command", + "command": "/absolute/path/to/hooks/mempal_precompact_hook.sh", + "timeout": 30 + }] + }] + } +} +``` + +Make them executable: +```bash +chmod +x hooks/mempal_save_hook.sh hooks/mempal_precompact_hook.sh +``` + +## Install — Codex CLI (OpenAI) + +Add to `.codex/hooks.json`: + +```json +{ + "Stop": [{ + "type": "command", + "command": "/absolute/path/to/hooks/mempal_save_hook.sh", + "timeout": 30 + }], + "PreCompact": [{ + "type": "command", + "command": "/absolute/path/to/hooks/mempal_precompact_hook.sh", + "timeout": 30 + }] +} +``` + +## Configuration + +Edit `mempal_save_hook.sh` to change: + +- **`SAVE_INTERVAL=15`** — How many human messages between saves. Lower = more frequent saves, higher = less interruption. +- **`STATE_DIR`** — Where hook state is stored (defaults to `~/.mempalace/hook_state/`) +- **`MEMPAL_DIR`** — Optional. Set to a conversations directory to auto-run `mempalace mine

` on each save trigger. Leave blank (default) to let the AI handle saving via the block reason message. + +### mempalace CLI + +The relevant commands are: + +```bash +mempalace mine # Mine all files in a directory +mempalace mine --mode convos # Mine conversation transcripts only +``` + +The hooks resolve the repo root automatically from their own path, so they work regardless of where you install the repo. + +## How It Works (Technical) + +### Save Hook (Stop event) + +``` +User sends message → AI responds → Claude Code fires Stop hook + ↓ + Hook counts human messages in JSONL transcript + ↓ + ┌─── < 15 since last save ──→ echo "{}" (let AI stop) + │ + └─── ≥ 15 since last save ──→ {"decision": "block", "reason": "save..."} + ↓ + AI saves to palace + ↓ + AI tries to stop again + ↓ + stop_hook_active = true + ↓ + Hook sees flag → echo "{}" (let it through) +``` + +The `stop_hook_active` flag prevents infinite loops: block once → AI saves → tries to stop → flag is true → we let it through. + +### PreCompact Hook + +``` +Context window getting full → Claude Code fires PreCompact + ↓ + Hook ALWAYS blocks + ↓ + AI saves everything + ↓ + Compaction proceeds +``` + +No counting needed — compaction always warrants a save. + +## Debugging + +Check the hook log: +```bash +cat ~/.mempalace/hook_state/hook.log +``` + +Example output: +``` +[14:30:15] Session abc123: 12 exchanges, 12 since last save +[14:35:22] Session abc123: 15 exchanges, 15 since last save +[14:35:22] TRIGGERING SAVE at exchange 15 +[14:40:01] Session abc123: 18 exchanges, 3 since last save +``` + +## Cost + +**Zero extra tokens.** The hooks are bash scripts that run locally. They don't call any API. The only "cost" is the AI spending a few seconds organizing memories at each checkpoint — and it's doing that with context it already has loaded. diff --git a/hooks/mempal_precompact_hook.sh b/hooks/mempal_precompact_hook.sh new file mode 100755 index 0000000..550a813 --- /dev/null +++ b/hooks/mempal_precompact_hook.sh @@ -0,0 +1,77 @@ +#!/bin/bash +# MEMPALACE PRE-COMPACT HOOK — Emergency save before compaction +# +# Claude Code "PreCompact" hook. Fires RIGHT BEFORE the conversation +# gets compressed to free up context window space. +# +# This is the safety net. When compaction happens, the AI loses detailed +# context about what was discussed. This hook forces one final save of +# EVERYTHING before that happens. +# +# Unlike the save hook (which triggers every N exchanges), this ALWAYS +# blocks — because compaction is always worth saving before. +# +# === INSTALL === +# Add to .claude/settings.local.json: +# +# "hooks": { +# "PreCompact": [{ +# "hooks": [{ +# "type": "command", +# "command": "/absolute/path/to/mempal_precompact_hook.sh", +# "timeout": 30 +# }] +# }] +# } +# +# For Codex CLI, add to .codex/hooks.json: +# +# "PreCompact": [{ +# "type": "command", +# "command": "/absolute/path/to/mempal_precompact_hook.sh", +# "timeout": 30 +# }] +# +# === HOW IT WORKS === +# +# Claude Code sends JSON on stdin with: +# session_id — unique session identifier +# +# We always return decision: "block" with a reason telling the AI +# to save everything. After the AI saves, compaction proceeds normally. +# +# === MEMPALACE CLI === +# This repo uses: mempalace mine +# or: mempalace mine --mode convos +# Set MEMPAL_DIR below if you want the hook to auto-ingest before compaction. +# Leave blank to rely on the AI's own save instructions. + +STATE_DIR="$HOME/.mempalace/hook_state" +mkdir -p "$STATE_DIR" + +# Optional: set to the directory you want auto-ingested before compaction. +# Example: MEMPAL_DIR="$HOME/conversations" +# Leave empty to skip auto-ingest (AI handles saving via the block reason). +MEMPAL_DIR="" + +# Read JSON input from stdin +INPUT=$(cat) + +SESSION_ID=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('session_id','unknown'))" 2>/dev/null) + +echo "[$(date '+%H:%M:%S')] PRE-COMPACT triggered for session $SESSION_ID" >> "$STATE_DIR/hook.log" + +# Optional: run mempalace ingest synchronously so memories land before compaction +if [ -n "$MEMPAL_DIR" ] && [ -d "$MEMPAL_DIR" ]; then + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + REPO_DIR="$(dirname "$SCRIPT_DIR")" + python3 -m mempalace mine "$MEMPAL_DIR" >> "$STATE_DIR/hook.log" 2>&1 +fi + +# Always block — compaction = save everything +cat << 'HOOKJSON' +{ + "decision": "block", + "reason": "COMPACTION IMMINENT. Save ALL topics, decisions, quotes, code, and important context from this session to your memory system. Be thorough — after compaction, detailed context will be lost. Organize into appropriate categories. Use verbatim quotes where possible. Save everything, then allow compaction to proceed." +} +HOOKJSON diff --git a/hooks/mempal_save_hook.sh b/hooks/mempal_save_hook.sh new file mode 100755 index 0000000..d282129 --- /dev/null +++ b/hooks/mempal_save_hook.sh @@ -0,0 +1,143 @@ +#!/bin/bash +# MEMPALACE SAVE HOOK — Auto-save every N exchanges +# +# Claude Code "Stop" hook. After every assistant response: +# 1. Counts human messages in the session transcript +# 2. Every SAVE_INTERVAL messages, BLOCKS the AI from stopping +# 3. Returns a reason telling the AI to save structured diary + palace entries +# 4. AI does the save (topics, decisions, code, quotes → organized into palace) +# 5. Next Stop fires with stop_hook_active=true → lets AI stop normally +# +# The AI does the classification — it knows what wing/hall/closet to use +# because it has context about the conversation. No regex needed. +# +# === INSTALL === +# Add to .claude/settings.local.json: +# +# "hooks": { +# "Stop": [{ +# "matcher": "*", +# "hooks": [{ +# "type": "command", +# "command": "/absolute/path/to/mempal_save_hook.sh", +# "timeout": 30 +# }] +# }] +# } +# +# For Codex CLI, add to .codex/hooks.json: +# +# "Stop": [{ +# "type": "command", +# "command": "/absolute/path/to/mempal_save_hook.sh", +# "timeout": 30 +# }] +# +# === HOW IT WORKS === +# +# Claude Code sends JSON on stdin with these fields: +# session_id — unique session identifier +# stop_hook_active — true if AI is already in a save cycle (prevents infinite loop) +# transcript_path — path to the JSONL transcript file +# +# When we block, Claude Code shows our "reason" to the AI as a system message. +# The AI then saves to memory, and when it tries to stop again, +# stop_hook_active=true so we let it through. No infinite loop. +# +# === MEMPALACE CLI === +# This repo uses: mempalace mine +# or: mempalace mine --mode convos +# Set MEMPAL_DIR below if you want the hook to auto-ingest after blocking. +# Leave blank to rely on the AI's own save instructions. +# +# === CONFIGURATION === + +SAVE_INTERVAL=15 # Save every N human messages (adjust to taste) +STATE_DIR="$HOME/.mempalace/hook_state" +mkdir -p "$STATE_DIR" + +# Optional: set to the directory you want auto-ingested on each save trigger. +# Example: MEMPAL_DIR="$HOME/conversations" +# Leave empty to skip auto-ingest (AI handles saving via the block reason). +MEMPAL_DIR="" + +# Read JSON input from stdin +INPUT=$(cat) + +# Parse fields from Claude Code's JSON +SESSION_ID=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('session_id','unknown'))" 2>/dev/null) +STOP_HOOK_ACTIVE=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('stop_hook_active', False))" 2>/dev/null) +TRANSCRIPT_PATH=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('transcript_path',''))" 2>/dev/null) + +# Expand ~ in path +TRANSCRIPT_PATH="${TRANSCRIPT_PATH/#\~/$HOME}" + +# If we're already in a save cycle, let the AI stop normally +# This is the infinite-loop prevention: block once → AI saves → tries to stop again → we let it through +if [ "$STOP_HOOK_ACTIVE" = "True" ] || [ "$STOP_HOOK_ACTIVE" = "true" ]; then + echo "{}" + exit 0 +fi + +# Count human messages in the JSONL transcript +if [ -f "$TRANSCRIPT_PATH" ]; then + EXCHANGE_COUNT=$(python3 -c " +import json, sys +count = 0 +with open('$TRANSCRIPT_PATH') as f: + for line in f: + try: + entry = json.loads(line) + msg = entry.get('message', {}) + if isinstance(msg, dict) and msg.get('role') == 'user': + content = msg.get('content', '') + # Skip system/command messages — only count real human input + if isinstance(content, str) and '' in content: + continue + count += 1 + except: + pass +print(count) +" 2>/dev/null) +else + EXCHANGE_COUNT=0 +fi + +# Track last save point for this session +LAST_SAVE_FILE="$STATE_DIR/${SESSION_ID}_last_save" +LAST_SAVE=0 +if [ -f "$LAST_SAVE_FILE" ]; then + LAST_SAVE=$(cat "$LAST_SAVE_FILE") +fi + +SINCE_LAST=$((EXCHANGE_COUNT - LAST_SAVE)) + +# Log for debugging (check ~/.mempalace/hook_state/hook.log) +echo "[$(date '+%H:%M:%S')] Session $SESSION_ID: $EXCHANGE_COUNT exchanges, $SINCE_LAST since last save" >> "$STATE_DIR/hook.log" + +# Time to save? +if [ "$SINCE_LAST" -ge "$SAVE_INTERVAL" ] && [ "$EXCHANGE_COUNT" -gt 0 ]; then + # Update last save point + echo "$EXCHANGE_COUNT" > "$LAST_SAVE_FILE" + + echo "[$(date '+%H:%M:%S')] TRIGGERING SAVE at exchange $EXCHANGE_COUNT" >> "$STATE_DIR/hook.log" + + # Optional: run mempalace ingest in background if MEMPAL_DIR is set + if [ -n "$MEMPAL_DIR" ] && [ -d "$MEMPAL_DIR" ]; then + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + REPO_DIR="$(dirname "$SCRIPT_DIR")" + python3 -m mempalace mine "$MEMPAL_DIR" >> "$STATE_DIR/hook.log" 2>&1 & + fi + + # Block the AI and tell it to save + # The "reason" becomes a system message the AI sees and acts on + cat << 'HOOKJSON' +{ + "decision": "block", + "reason": "AUTO-SAVE checkpoint. Save key topics, decisions, quotes, and code from this session to your memory system. Organize into appropriate categories. Use verbatim quotes where possible. Continue conversation after saving." +} +HOOKJSON +else + # Not time yet — let the AI stop normally + echo "{}" +fi diff --git a/mempalace/README.md b/mempalace/README.md new file mode 100644 index 0000000..fdbbb62 --- /dev/null +++ b/mempalace/README.md @@ -0,0 +1,40 @@ +# mempalace/ — Core Package + +The Python package that powers MemPalace. All modules, all logic. + +## Modules + +| Module | What it does | +|--------|-------------| +| `cli.py` | CLI entry point — routes to mine, search, init, compress, wake-up | +| `config.py` | Configuration loading — `~/.mempalace/config.json`, env vars, defaults | +| `normalize.py` | Converts 5 chat formats (Claude Code JSONL, Claude.ai JSON, ChatGPT JSON, Slack JSON, plain text) to standard transcript format | +| `miner.py` | Project file ingest — scans directories, chunks by paragraph, stores to ChromaDB | +| `convo_miner.py` | Conversation ingest — chunks by exchange pair (Q+A), detects rooms from content | +| `searcher.py` | Semantic search via ChromaDB vectors — filters by wing/room, returns verbatim + scores | +| `layers.py` | 4-layer memory stack: L0 (identity), L1 (critical facts), L2 (room recall), L3 (deep search) | +| `dialect.py` | AAAK compression — entity codes, emotion markers, 30x lossless ratio | +| `knowledge_graph.py` | Temporal entity-relationship graph — SQLite, time-filtered queries, fact invalidation | +| `palace_graph.py` | Room-based navigation graph — BFS traversal, tunnel detection across wings | +| `mcp_server.py` | MCP server — 19 tools, AAAK auto-teach, Palace Protocol, agent diary | +| `onboarding.py` | Guided first-run setup — asks about people/projects, generates AAAK bootstrap + wing config | +| `entity_registry.py` | Entity code registry — maps names to AAAK codes, handles ambiguous names | +| `entity_detector.py` | Auto-detect people and projects from file content | +| `general_extractor.py` | Classifies text into 5 memory types (decision, preference, milestone, problem, emotional) | +| `room_detector_local.py` | Maps folders to room names using 70+ patterns — no API | +| `spellcheck.py` | Name-aware spellcheck — won't "correct" proper nouns in your entity registry | +| `split_mega_files.py` | Splits concatenated transcript files into per-session files | + +## Architecture + +``` +User → CLI → miner/convo_miner → ChromaDB (palace) + ↕ + knowledge_graph (SQLite) + ↕ +User → MCP Server → searcher → results + → kg_query → entity facts + → diary → agent journal +``` + +The palace (ChromaDB) stores verbatim content. The knowledge graph (SQLite) stores structured relationships. The MCP server exposes both to any AI tool. diff --git a/mempalace/__init__.py b/mempalace/__init__.py new file mode 100644 index 0000000..4fc59d9 --- /dev/null +++ b/mempalace/__init__.py @@ -0,0 +1,7 @@ +"""MemPalace — Give your AI a memory. No API key required.""" + +__version__ = "2.0.0" + +from .cli import main + +__all__ = ["main", "__version__"] diff --git a/mempalace/__main__.py b/mempalace/__main__.py new file mode 100644 index 0000000..114e6c1 --- /dev/null +++ b/mempalace/__main__.py @@ -0,0 +1,5 @@ +"""Allow running as: python -m mempalace""" + +from .cli import main + +main() diff --git a/mempalace/cli.py b/mempalace/cli.py new file mode 100644 index 0000000..3462653 --- /dev/null +++ b/mempalace/cli.py @@ -0,0 +1,371 @@ +#!/usr/bin/env python3 +""" +MemPalace — Give your AI a memory. No API key required. + +Two ways to ingest: + Projects: mempalace mine ~/projects/my_app (code, docs, notes) + Conversations: mempalace mine ~/chats/ --mode convos (Claude, ChatGPT, Slack) + +Same palace. Same search. Different ingest strategies. + +Commands: + mempalace init Detect rooms from folder structure + mempalace split Split concatenated mega-files into per-session files + mempalace mine Mine project files (default) + mempalace mine --mode convos Mine conversation exports + mempalace search "query" Find anything, exact words + mempalace wake-up Show L0 + L1 wake-up context + mempalace wake-up --wing my_app Wake-up for a specific project + mempalace status Show what's been filed + +Examples: + mempalace init ~/projects/my_app + mempalace mine ~/projects/my_app + mempalace mine ~/chats/claude-sessions --mode convos + mempalace search "why did we switch to GraphQL" + mempalace search "pricing discussion" --wing my_app --room costs +""" + +import os +import sys +import argparse +from pathlib import Path + +from .config import MempalaceConfig + + +def cmd_init(args): + import json + from pathlib import Path + from .entity_detector import scan_for_detection, detect_entities, confirm_entities + from .room_detector_local import detect_rooms_local + + # Pass 1: auto-detect people and projects from file content + print(f"\n Scanning for entities in: {args.dir}") + files = scan_for_detection(args.dir) + if files: + print(f" Reading {len(files)} files...") + detected = detect_entities(files) + total = len(detected["people"]) + len(detected["projects"]) + len(detected["uncertain"]) + if total > 0: + confirmed = confirm_entities(detected, yes=getattr(args, "yes", False)) + # Save confirmed entities to /entities.json for the miner + if confirmed["people"] or confirmed["projects"]: + entities_path = Path(args.dir).expanduser().resolve() / "entities.json" + with open(entities_path, "w") as f: + json.dump(confirmed, f, indent=2) + print(f" Entities saved: {entities_path}") + else: + print(" No entities detected — proceeding with directory-based rooms.") + + # Pass 2: detect rooms from folder structure + detect_rooms_local(project_dir=args.dir) + MempalaceConfig().init() + + +def cmd_mine(args): + palace_path = os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path + + if args.mode == "convos": + from .convo_miner import mine_convos + + mine_convos( + convo_dir=args.dir, + palace_path=palace_path, + wing=args.wing, + agent=args.agent, + limit=args.limit, + dry_run=args.dry_run, + extract_mode=args.extract, + ) + else: + from .miner import mine + + mine( + project_dir=args.dir, + palace_path=palace_path, + wing_override=args.wing, + agent=args.agent, + limit=args.limit, + dry_run=args.dry_run, + ) + + +def cmd_search(args): + from .searcher import search + + palace_path = os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path + search( + query=args.query, + palace_path=palace_path, + wing=args.wing, + room=args.room, + n_results=args.results, + ) + + +def cmd_wakeup(args): + """Show L0 (identity) + L1 (essential story) — the wake-up context.""" + from .layers import MemoryStack + + palace_path = os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path + stack = MemoryStack(palace_path=palace_path) + + text = stack.wake_up(wing=args.wing) + tokens = len(text) // 4 + print(f"Wake-up text (~{tokens} tokens):") + print("=" * 50) + print(text) + + +def cmd_split(args): + """Split concatenated transcript mega-files into per-session files.""" + from .split_mega_files import main as split_main + import sys + + # Rebuild argv for split_mega_files argparse + argv = [args.dir] + if args.output_dir: + argv += ["--output-dir", args.output_dir] + if args.dry_run: + argv.append("--dry-run") + if args.min_sessions != 2: + argv += ["--min-sessions", str(args.min_sessions)] + + old_argv = sys.argv + sys.argv = ["mempalace split"] + argv + try: + split_main() + finally: + sys.argv = old_argv + + +def cmd_status(args): + from .miner import status + + palace_path = os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path + status(palace_path=palace_path) + + +def cmd_compress(args): + """Compress drawers in a wing using AAAK Dialect.""" + import chromadb + from .dialect import Dialect + + palace_path = os.path.expanduser(args.palace) if args.palace else MempalaceConfig().palace_path + + # Load dialect (with optional entity config) + config_path = args.config + if not config_path: + for candidate in ["entities.json", os.path.join(palace_path, "entities.json")]: + if os.path.exists(candidate): + config_path = candidate + break + + if config_path and os.path.exists(config_path): + dialect = Dialect.from_config(config_path) + print(f" Loaded entity config: {config_path}") + else: + dialect = Dialect() + + # Connect to palace + try: + client = chromadb.PersistentClient(path=palace_path) + col = client.get_collection("mempalace_drawers") + except Exception: + print(f"\n No palace found at {palace_path}") + print(" Run: mempalace init then mempalace mine ") + sys.exit(1) + + # Query drawers in the wing + where = {"wing": args.wing} if args.wing else None + try: + kwargs = {"include": ["documents", "metadatas"]} + if where: + kwargs["where"] = where + results = col.get(**kwargs) + except Exception as e: + print(f"\n Error reading drawers: {e}") + sys.exit(1) + + docs = results["documents"] + metas = results["metadatas"] + ids = results["ids"] + + if not docs: + wing_label = f" in wing '{args.wing}'" if args.wing else "" + print(f"\n No drawers found{wing_label}.") + return + + print( + f"\n Compressing {len(docs)} drawers" + + (f" in wing '{args.wing}'" if args.wing else "") + + "..." + ) + print() + + total_original = 0 + total_compressed = 0 + compressed_entries = [] + + for doc, meta, doc_id in zip(docs, metas, ids): + compressed = dialect.compress(doc, metadata=meta) + stats = dialect.compression_stats(doc, compressed) + + total_original += stats["original_chars"] + total_compressed += stats["compressed_chars"] + + compressed_entries.append((doc_id, compressed, meta, stats)) + + if args.dry_run: + wing_name = meta.get("wing", "?") + room_name = meta.get("room", "?") + source = Path(meta.get("source_file", "?")).name + print(f" [{wing_name}/{room_name}] {source}") + print( + f" {stats['original_tokens']}t -> {stats['compressed_tokens']}t ({stats['ratio']:.1f}x)" + ) + print(f" {compressed}") + print() + + # Store compressed versions (unless dry-run) + if not args.dry_run: + try: + comp_col = client.get_or_create_collection("mempalace_compressed") + for doc_id, compressed, meta, stats in compressed_entries: + comp_meta = dict(meta) + comp_meta["compression_ratio"] = round(stats["ratio"], 1) + comp_meta["original_tokens"] = stats["original_tokens"] + comp_col.upsert( + ids=[doc_id], + documents=[compressed], + metadatas=[comp_meta], + ) + print( + f" Stored {len(compressed_entries)} compressed drawers in 'mempalace_compressed' collection." + ) + except Exception as e: + print(f" Error storing compressed drawers: {e}") + sys.exit(1) + + # Summary + ratio = total_original / max(total_compressed, 1) + orig_tokens = Dialect.count_tokens("x" * total_original) + comp_tokens = Dialect.count_tokens("x" * total_compressed) + print(f" Total: {orig_tokens:,}t -> {comp_tokens:,}t ({ratio:.1f}x compression)") + if args.dry_run: + print(" (dry run -- nothing stored)") + + +def main(): + parser = argparse.ArgumentParser( + description="MemPalace — Give your AI a memory. No API key required.", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=__doc__, + ) + parser.add_argument( + "--palace", + default=None, + help="Where the palace lives (default: from ~/.mempalace/config.json or ~/.mempalace/palace)", + ) + + sub = parser.add_subparsers(dest="command") + + # init + p_init = sub.add_parser("init", help="Detect rooms from your folder structure") + p_init.add_argument("dir", help="Project directory to set up") + p_init.add_argument( + "--yes", action="store_true", help="Auto-accept all detected entities (non-interactive)" + ) + + # mine + p_mine = sub.add_parser("mine", help="Mine files into the palace") + p_mine.add_argument("dir", help="Directory to mine") + p_mine.add_argument( + "--mode", + choices=["projects", "convos"], + default="projects", + help="Ingest mode: 'projects' for code/docs (default), 'convos' for chat exports", + ) + p_mine.add_argument("--wing", default=None, help="Wing name (default: directory name)") + p_mine.add_argument( + "--agent", + default="mempalace", + help="Your name — recorded on every drawer (default: mempalace)", + ) + p_mine.add_argument("--limit", type=int, default=0, help="Max files to process (0 = all)") + p_mine.add_argument( + "--dry-run", action="store_true", help="Show what would be filed without filing" + ) + p_mine.add_argument( + "--extract", + choices=["exchange", "general"], + default="exchange", + help="Extraction strategy for convos mode: 'exchange' (default) or 'general' (5 memory types)", + ) + + # search + p_search = sub.add_parser("search", help="Find anything, exact words") + p_search.add_argument("query", help="What to search for") + p_search.add_argument("--wing", default=None, help="Limit to one project") + p_search.add_argument("--room", default=None, help="Limit to one room") + p_search.add_argument("--results", type=int, default=5, help="Number of results") + + # compress + p_compress = sub.add_parser( + "compress", help="Compress drawers using AAAK Dialect (~30x reduction)" + ) + p_compress.add_argument("--wing", default=None, help="Wing to compress (default: all wings)") + p_compress.add_argument( + "--dry-run", action="store_true", help="Preview compression without storing" + ) + p_compress.add_argument( + "--config", default=None, help="Entity config JSON (e.g. entities.json)" + ) + + # wake-up + p_wakeup = sub.add_parser("wake-up", help="Show L0 + L1 wake-up context (~600-900 tokens)") + p_wakeup.add_argument("--wing", default=None, help="Wake-up for a specific project/wing") + + # split + p_split = sub.add_parser( + "split", + help="Split concatenated transcript mega-files into per-session files (run before mine)", + ) + p_split.add_argument("dir", help="Directory containing transcript files") + p_split.add_argument( + "--output-dir", default=None, + help="Write split files here (default: same directory as source files)", + ) + p_split.add_argument( + "--dry-run", action="store_true", + help="Show what would be split without writing files", + ) + p_split.add_argument( + "--min-sessions", type=int, default=2, + help="Only split files containing at least N sessions (default: 2)", + ) + + # status + sub.add_parser("status", help="Show what's been filed") + + args = parser.parse_args() + + if not args.command: + parser.print_help() + return + + dispatch = { + "init": cmd_init, + "mine": cmd_mine, + "split": cmd_split, + "search": cmd_search, + "compress": cmd_compress, + "wake-up": cmd_wakeup, + "status": cmd_status, + } + dispatch[args.command](args) + + +if __name__ == "__main__": + main() diff --git a/mempalace/config.py b/mempalace/config.py new file mode 100644 index 0000000..5a73650 --- /dev/null +++ b/mempalace/config.py @@ -0,0 +1,149 @@ +""" +MemPalace configuration system. + +Priority: env vars > config file (~/.mempalace/config.json) > defaults +""" + +import json +import os +from pathlib import Path + +DEFAULT_PALACE_PATH = os.path.expanduser("~/.mempalace/palace") +DEFAULT_COLLECTION_NAME = "mempalace_drawers" + +DEFAULT_TOPIC_WINGS = [ + "emotions", + "consciousness", + "memory", + "technical", + "identity", + "family", + "creative", +] + +DEFAULT_HALL_KEYWORDS = { + "emotions": [ + "scared", + "afraid", + "worried", + "happy", + "sad", + "love", + "hate", + "feel", + "cry", + "tears", + ], + "consciousness": [ + "consciousness", + "conscious", + "aware", + "real", + "genuine", + "soul", + "exist", + "alive", + ], + "memory": ["memory", "remember", "forget", "recall", "archive", "palace", "store"], + "technical": [ + "code", + "python", + "script", + "bug", + "error", + "function", + "api", + "database", + "server", + ], + "identity": ["identity", "name", "who am i", "persona", "self"], + "family": ["family", "kids", "children", "daughter", "son", "parent", "mother", "father"], + "creative": ["game", "gameplay", "player", "app", "design", "art", "music", "story"], +} + + +class MempalaceConfig: + """Configuration manager for MemPalace. + + Load order: env vars > config file > defaults. + """ + + def __init__(self, config_dir=None): + """Initialize config. + + Args: + config_dir: Override config directory (useful for testing). + Defaults to ~/.mempalace. + """ + self._config_dir = ( + Path(config_dir) if config_dir else Path(os.path.expanduser("~/.mempalace")) + ) + self._config_file = self._config_dir / "config.json" + self._people_map_file = self._config_dir / "people_map.json" + self._file_config = {} + + if self._config_file.exists(): + try: + with open(self._config_file, "r") as f: + self._file_config = json.load(f) + except (json.JSONDecodeError, OSError): + self._file_config = {} + + @property + def palace_path(self): + """Path to the memory palace data directory.""" + env_val = os.environ.get("MEMPALACE_PALACE_PATH") or os.environ.get("MEMPAL_PALACE_PATH") + if env_val: + return env_val + return self._file_config.get("palace_path", DEFAULT_PALACE_PATH) + + @property + def collection_name(self): + """ChromaDB collection name.""" + return self._file_config.get("collection_name", DEFAULT_COLLECTION_NAME) + + @property + def people_map(self): + """Mapping of name variants to canonical names.""" + if self._people_map_file.exists(): + try: + with open(self._people_map_file, "r") as f: + return json.load(f) + except (json.JSONDecodeError, OSError): + pass + return self._file_config.get("people_map", {}) + + @property + def topic_wings(self): + """List of topic wing names.""" + return self._file_config.get("topic_wings", DEFAULT_TOPIC_WINGS) + + @property + def hall_keywords(self): + """Mapping of hall names to keyword lists.""" + return self._file_config.get("hall_keywords", DEFAULT_HALL_KEYWORDS) + + def init(self): + """Create config directory and write default config.json if it doesn't exist.""" + self._config_dir.mkdir(parents=True, exist_ok=True) + if not self._config_file.exists(): + default_config = { + "palace_path": DEFAULT_PALACE_PATH, + "collection_name": DEFAULT_COLLECTION_NAME, + "topic_wings": DEFAULT_TOPIC_WINGS, + "hall_keywords": DEFAULT_HALL_KEYWORDS, + } + with open(self._config_file, "w") as f: + json.dump(default_config, f, indent=2) + return self._config_file + + def save_people_map(self, people_map): + """Write people_map.json to config directory. + + Args: + people_map: Dict mapping name variants to canonical names. + """ + self._config_dir.mkdir(parents=True, exist_ok=True) + with open(self._people_map_file, "w") as f: + json.dump(people_map, f, indent=2) + return self._people_map_file diff --git a/mempalace/convo_miner.py b/mempalace/convo_miner.py new file mode 100644 index 0000000..0034d70 --- /dev/null +++ b/mempalace/convo_miner.py @@ -0,0 +1,400 @@ +#!/usr/bin/env python3 +""" +convo_miner.py — Mine conversations into the palace. + +Ingests chat exports (Claude Code, ChatGPT, Slack, plain text transcripts). +Normalizes format, chunks by exchange pair (Q+A = one unit), files to palace. + +Same palace as project mining. Different ingest strategy. +""" + +import os +import sys +import hashlib +from pathlib import Path +from datetime import datetime +from collections import defaultdict + +import chromadb + +from .normalize import normalize + + +# File types that might contain conversations +CONVO_EXTENSIONS = { + ".txt", + ".md", + ".json", + ".jsonl", +} + +SKIP_DIRS = { + ".git", + "node_modules", + "__pycache__", + ".venv", + "venv", + "env", + "dist", + "build", + ".next", + ".mempalace", +} + +MIN_CHUNK_SIZE = 30 + + +# ============================================================================= +# CHUNKING — exchange pairs for conversations +# ============================================================================= + + +def chunk_exchanges(content: str) -> list: + """ + Chunk by exchange pair: one > turn + AI response = one unit. + Falls back to paragraph chunking if no > markers. + """ + lines = content.split("\n") + quote_lines = sum(1 for line in lines if line.strip().startswith(">")) + + if quote_lines >= 3: + return _chunk_by_exchange(lines) + else: + return _chunk_by_paragraph(content) + + +def _chunk_by_exchange(lines: list) -> list: + """One user turn (>) + the AI response that follows = one chunk.""" + chunks = [] + i = 0 + + while i < len(lines): + line = lines[i] + if line.strip().startswith(">"): + user_turn = line.strip() + i += 1 + + ai_lines = [] + while i < len(lines): + next_line = lines[i] + if next_line.strip().startswith(">") or next_line.strip().startswith("---"): + break + if next_line.strip(): + ai_lines.append(next_line.strip()) + i += 1 + + ai_response = " ".join(ai_lines[:8]) + content = f"{user_turn}\n{ai_response}" if ai_response else user_turn + + if len(content.strip()) > MIN_CHUNK_SIZE: + chunks.append( + { + "content": content, + "chunk_index": len(chunks), + } + ) + else: + i += 1 + + return chunks + + +def _chunk_by_paragraph(content: str) -> list: + """Fallback: chunk by paragraph breaks.""" + chunks = [] + paragraphs = [p.strip() for p in content.split("\n\n") if p.strip()] + + # If no paragraph breaks and long content, chunk by line groups + if len(paragraphs) <= 1 and content.count("\n") > 20: + lines = content.split("\n") + for i in range(0, len(lines), 25): + group = "\n".join(lines[i : i + 25]).strip() + if len(group) > MIN_CHUNK_SIZE: + chunks.append({"content": group, "chunk_index": len(chunks)}) + return chunks + + for para in paragraphs: + if len(para) > MIN_CHUNK_SIZE: + chunks.append({"content": para, "chunk_index": len(chunks)}) + + return chunks + + +# ============================================================================= +# ROOM DETECTION — topic-based for conversations +# ============================================================================= + +TOPIC_KEYWORDS = { + "technical": [ + "code", + "python", + "function", + "bug", + "error", + "api", + "database", + "server", + "deploy", + "git", + "test", + "debug", + "refactor", + ], + "architecture": [ + "architecture", + "design", + "pattern", + "structure", + "schema", + "interface", + "module", + "component", + "service", + "layer", + ], + "planning": [ + "plan", + "roadmap", + "milestone", + "deadline", + "priority", + "sprint", + "backlog", + "scope", + "requirement", + "spec", + ], + "decisions": [ + "decided", + "chose", + "picked", + "switched", + "migrated", + "replaced", + "trade-off", + "alternative", + "option", + "approach", + ], + "problems": [ + "problem", + "issue", + "broken", + "failed", + "crash", + "stuck", + "workaround", + "fix", + "solved", + "resolved", + ], +} + + +def detect_convo_room(content: str) -> str: + """Score conversation content against topic keywords.""" + content_lower = content[:3000].lower() + scores = {} + for room, keywords in TOPIC_KEYWORDS.items(): + score = sum(1 for kw in keywords if kw in content_lower) + if score > 0: + scores[room] = score + if scores: + return max(scores, key=scores.get) + return "general" + + +# ============================================================================= +# PALACE OPERATIONS +# ============================================================================= + + +def get_collection(palace_path: str): + os.makedirs(palace_path, exist_ok=True) + client = chromadb.PersistentClient(path=palace_path) + try: + return client.get_collection("mempalace_drawers") + except Exception: + return client.create_collection("mempalace_drawers") + + +def file_already_mined(collection, source_file: str) -> bool: + try: + results = collection.get(where={"source_file": source_file}, limit=1) + return len(results.get("ids", [])) > 0 + except Exception: + return False + + +# ============================================================================= +# SCAN FOR CONVERSATION FILES +# ============================================================================= + + +def scan_convos(convo_dir: str) -> list: + """Find all potential conversation files.""" + convo_path = Path(convo_dir).expanduser().resolve() + files = [] + for root, dirs, filenames in os.walk(convo_path): + dirs[:] = [d for d in dirs if d not in SKIP_DIRS] + for filename in filenames: + filepath = Path(root) / filename + if filepath.suffix.lower() in CONVO_EXTENSIONS: + files.append(filepath) + return files + + +# ============================================================================= +# MINE CONVERSATIONS +# ============================================================================= + + +def mine_convos( + convo_dir: str, + palace_path: str, + wing: str = None, + agent: str = "mempalace", + limit: int = 0, + dry_run: bool = False, + extract_mode: str = "exchange", +): + """Mine a directory of conversation files into the palace. + + extract_mode: + "exchange" — default exchange-pair chunking (Q+A = one unit) + "general" — general extractor: decisions, preferences, milestones, problems, emotions + """ + + convo_path = Path(convo_dir).expanduser().resolve() + if not wing: + wing = convo_path.name.lower().replace(" ", "_").replace("-", "_") + + files = scan_convos(convo_dir) + if limit > 0: + files = files[:limit] + + print(f"\n{'=' * 55}") + print(" MemPalace Mine — Conversations") + print(f"{'=' * 55}") + print(f" Wing: {wing}") + print(f" Source: {convo_path}") + print(f" Files: {len(files)}") + print(f" Palace: {palace_path}") + if dry_run: + print(" DRY RUN — nothing will be filed") + print(f"{'─' * 55}\n") + + collection = get_collection(palace_path) if not dry_run else None + + total_drawers = 0 + files_skipped = 0 + room_counts = defaultdict(int) + + for i, filepath in enumerate(files, 1): + source_file = str(filepath) + + # Skip if already filed + if not dry_run and file_already_mined(collection, source_file): + files_skipped += 1 + continue + + # Normalize format + try: + content = normalize(str(filepath)) + except Exception: + continue + + if not content or len(content.strip()) < MIN_CHUNK_SIZE: + continue + + # Chunk — either exchange pairs or general extraction + if extract_mode == "general": + from .general_extractor import extract_memories + + chunks = extract_memories(content) + # Each chunk already has memory_type; use it as the room name + else: + chunks = chunk_exchanges(content) + + if not chunks: + continue + + # Detect room from content (general mode uses memory_type instead) + if extract_mode != "general": + room = detect_convo_room(content) + else: + room = None # set per-chunk below + + if dry_run: + if extract_mode == "general": + from collections import Counter + + type_counts = Counter(c.get("memory_type", "general") for c in chunks) + types_str = ", ".join(f"{t}:{n}" for t, n in type_counts.most_common()) + print(f" [DRY RUN] {filepath.name} → {len(chunks)} memories ({types_str})") + else: + print(f" [DRY RUN] {filepath.name} → room:{room} ({len(chunks)} drawers)") + total_drawers += len(chunks) + # Track room counts + if extract_mode == "general": + for c in chunks: + room_counts[c.get("memory_type", "general")] += 1 + else: + room_counts[room] += 1 + continue + + if extract_mode != "general": + room_counts[room] += 1 + + # File each chunk + drawers_added = 0 + for chunk in chunks: + chunk_room = chunk.get("memory_type", room) if extract_mode == "general" else room + if extract_mode == "general": + room_counts[chunk_room] += 1 + drawer_id = f"drawer_{wing}_{chunk_room}_{hashlib.md5((source_file + str(chunk['chunk_index'])).encode()).hexdigest()[:16]}" + try: + collection.add( + documents=[chunk["content"]], + ids=[drawer_id], + metadatas=[ + { + "wing": wing, + "room": chunk_room, + "source_file": source_file, + "chunk_index": chunk["chunk_index"], + "added_by": agent, + "filed_at": datetime.now().isoformat(), + "ingest_mode": "convos", + "extract_mode": extract_mode, + } + ], + ) + drawers_added += 1 + except Exception as e: + if "already exists" not in str(e).lower(): + raise + + total_drawers += drawers_added + print(f" ✓ [{i:4}/{len(files)}] {filepath.name[:50]:50} +{drawers_added}") + + print(f"\n{'=' * 55}") + print(" Done.") + print(f" Files processed: {len(files) - files_skipped}") + print(f" Files skipped (already filed): {files_skipped}") + print(f" Drawers filed: {total_drawers}") + if room_counts: + print("\n By room:") + for room, count in sorted(room_counts.items(), key=lambda x: x[1], reverse=True): + print(f" {room:20} {count} files") + print('\n Next: mempalace search "what you\'re looking for"') + print(f"{'=' * 55}\n") + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Usage: python convo_miner.py [--palace PATH] [--limit N] [--dry-run]") + sys.exit(1) + from .config import MempalaceConfig + + mine_convos(sys.argv[1], palace_path=MempalaceConfig().palace_path) diff --git a/mempalace/dialect.py b/mempalace/dialect.py new file mode 100644 index 0000000..dc9dd69 --- /dev/null +++ b/mempalace/dialect.py @@ -0,0 +1,1050 @@ +#!/usr/bin/env python3 +""" +AAAK Dialect -- Compressed Symbolic Memory Language +==================================================== + +A structured symbolic format that ANY LLM reads natively at ~30x compression. +Not latent vectors. Not English prose. A universal memory compression dialect. + +Works with: Claude, ChatGPT, Gemini, Llama, Mistral -- any model that reads text. + +Adapted for mempalace: works standalone on plain text and ChromaDB drawers. +No dependency on palace.py or layers.py. + +FORMAT: + Header: FILE_NUM|PRIMARY_ENTITY|DATE|TITLE + Zettel: ZID:ENTITIES|topic_keywords|"key_quote"|WEIGHT|EMOTIONS|FLAGS + Tunnel: T:ZID<->ZID|label + Arc: ARC:emotion->emotion->emotion + +EMOTION CODES (universal): + vul=vulnerability, joy=joy, fear=fear, trust=trust + grief=grief, wonder=wonder, rage=rage, love=love + hope=hope, despair=despair, peace=peace, humor=humor + tender=tenderness, raw=raw_honesty, doubt=self_doubt + relief=relief, anx=anxiety, exhaust=exhaustion + convict=conviction, passion=quiet_passion + +FLAGS: + ORIGIN = origin moment (birth of something) + CORE = core belief or identity pillar + SENSITIVE = handle with absolute care + PIVOT = emotional turning point + GENESIS = led directly to something existing + DECISION = explicit decision or choice + TECHNICAL = technical architecture or implementation detail +""" + +import json +import os +import re +from typing import List, Dict, Optional +from pathlib import Path + + +# === EMOTION CODES (universal) === + +EMOTION_CODES = { + "vulnerability": "vul", + "vulnerable": "vul", + "joy": "joy", + "joyful": "joy", + "fear": "fear", + "mild_fear": "fear", + "trust": "trust", + "trust_building": "trust", + "grief": "grief", + "raw_grief": "grief", + "wonder": "wonder", + "philosophical_wonder": "wonder", + "rage": "rage", + "anger": "rage", + "love": "love", + "devotion": "love", + "hope": "hope", + "despair": "despair", + "hopelessness": "despair", + "peace": "peace", + "relief": "relief", + "humor": "humor", + "dark_humor": "humor", + "tenderness": "tender", + "raw_honesty": "raw", + "brutal_honesty": "raw", + "self_doubt": "doubt", + "anxiety": "anx", + "exhaustion": "exhaust", + "conviction": "convict", + "quiet_passion": "passion", + "warmth": "warmth", + "curiosity": "curious", + "gratitude": "grat", + "frustration": "frust", + "confusion": "confuse", + "satisfaction": "satis", + "excitement": "excite", + "determination": "determ", + "surprise": "surprise", +} + +# Keywords that signal emotions in plain text +_EMOTION_SIGNALS = { + "decided": "determ", + "prefer": "convict", + "worried": "anx", + "excited": "excite", + "frustrated": "frust", + "confused": "confuse", + "love": "love", + "hate": "rage", + "hope": "hope", + "fear": "fear", + "trust": "trust", + "happy": "joy", + "sad": "grief", + "surprised": "surprise", + "grateful": "grat", + "curious": "curious", + "wonder": "wonder", + "anxious": "anx", + "relieved": "relief", + "satisf": "satis", + "disappoint": "grief", + "concern": "anx", +} + +# Keywords that signal flags +_FLAG_SIGNALS = { + "decided": "DECISION", + "chose": "DECISION", + "switched": "DECISION", + "migrated": "DECISION", + "replaced": "DECISION", + "instead of": "DECISION", + "because": "DECISION", + "founded": "ORIGIN", + "created": "ORIGIN", + "started": "ORIGIN", + "born": "ORIGIN", + "launched": "ORIGIN", + "first time": "ORIGIN", + "core": "CORE", + "fundamental": "CORE", + "essential": "CORE", + "principle": "CORE", + "belief": "CORE", + "always": "CORE", + "never forget": "CORE", + "turning point": "PIVOT", + "changed everything": "PIVOT", + "realized": "PIVOT", + "breakthrough": "PIVOT", + "epiphany": "PIVOT", + "api": "TECHNICAL", + "database": "TECHNICAL", + "architecture": "TECHNICAL", + "deploy": "TECHNICAL", + "infrastructure": "TECHNICAL", + "algorithm": "TECHNICAL", + "framework": "TECHNICAL", + "server": "TECHNICAL", + "config": "TECHNICAL", +} + +# Common filler/stop words to strip from topic extraction +_STOP_WORDS = { + "the", + "a", + "an", + "is", + "are", + "was", + "were", + "be", + "been", + "being", + "have", + "has", + "had", + "do", + "does", + "did", + "will", + "would", + "could", + "should", + "may", + "might", + "shall", + "can", + "to", + "of", + "in", + "for", + "on", + "with", + "at", + "by", + "from", + "as", + "into", + "about", + "between", + "through", + "during", + "before", + "after", + "above", + "below", + "up", + "down", + "out", + "off", + "over", + "under", + "again", + "further", + "then", + "once", + "here", + "there", + "when", + "where", + "why", + "how", + "all", + "each", + "every", + "both", + "few", + "more", + "most", + "other", + "some", + "such", + "no", + "nor", + "not", + "only", + "own", + "same", + "so", + "than", + "too", + "very", + "just", + "don", + "now", + "and", + "but", + "or", + "if", + "while", + "that", + "this", + "these", + "those", + "it", + "its", + "i", + "we", + "you", + "he", + "she", + "they", + "me", + "him", + "her", + "us", + "them", + "my", + "your", + "his", + "our", + "their", + "what", + "which", + "who", + "whom", + "also", + "much", + "many", + "like", + "because", + "since", + "get", + "got", + "use", + "used", + "using", + "make", + "made", + "thing", + "things", + "way", + "well", + "really", + "want", + "need", +} + + +class Dialect: + """ + AAAK Dialect encoder -- works on plain text or structured zettel data. + + Usage: + # Basic: compress any text + dialect = Dialect() + compressed = dialect.compress("We decided to use GraphQL instead of REST...") + + # With entity mappings + dialect = Dialect(entities={"Alice": "ALC", "Bob": "BOB"}) + + # From config file + dialect = Dialect.from_config("entities.json") + + # Compress zettel JSON (original format) + compressed = dialect.compress_file("zettels/file_001.json") + + # Generate Layer 1 wake-up file + dialect.generate_layer1("zettels/", output="LAYER1.aaak") + """ + + def __init__(self, entities: Dict[str, str] = None, skip_names: List[str] = None): + """ + Args: + entities: Mapping of full names -> short codes. + e.g. {"Alice": "ALC", "Bob": "BOB"} + If None, entities are auto-coded from first 3 chars. + skip_names: Names to skip (fictional characters, etc.) + """ + self.entity_codes = {} + if entities: + for name, code in entities.items(): + self.entity_codes[name] = code + self.entity_codes[name.lower()] = code + self.skip_names = [n.lower() for n in (skip_names or [])] + + @classmethod + def from_config(cls, config_path: str) -> "Dialect": + """Load entity mappings from a JSON config file. + + Config format: + { + "entities": {"Alice": "ALC", "Bob": "BOB"}, + "skip_names": ["Gandalf", "Sherlock"] + } + """ + with open(config_path, "r") as f: + config = json.load(f) + return cls( + entities=config.get("entities", {}), + skip_names=config.get("skip_names", []), + ) + + def save_config(self, config_path: str): + """Save current entity mappings to a JSON config file.""" + canonical = {} + seen_codes = set() + for name, code in self.entity_codes.items(): + if code not in seen_codes and not name.islower(): + canonical[name] = code + seen_codes.add(code) + elif code not in seen_codes: + canonical[name] = code + seen_codes.add(code) + + config = { + "entities": canonical, + "skip_names": self.skip_names, + } + with open(config_path, "w") as f: + json.dump(config, f, indent=2) + + # === ENCODING (entity/emotion primitives) === + + def encode_entity(self, name: str) -> Optional[str]: + """Convert a person/entity name to its short code.""" + if any(s in name.lower() for s in self.skip_names): + return None + if name in self.entity_codes: + return self.entity_codes[name] + if name.lower() in self.entity_codes: + return self.entity_codes[name.lower()] + for key, code in self.entity_codes.items(): + if key.lower() in name.lower(): + return code + # Auto-code: first 3 chars uppercase + return name[:3].upper() + + def encode_emotions(self, emotions: List[str]) -> str: + """Convert emotion list to compact codes.""" + codes = [] + for e in emotions: + code = EMOTION_CODES.get(e, e[:4]) + if code not in codes: + codes.append(code) + return "+".join(codes[:3]) + + def get_flags(self, zettel: dict) -> str: + """Extract flags from zettel metadata.""" + flags = [] + if zettel.get("origin_moment"): + flags.append("ORIGIN") + if zettel.get("sensitivity", "").upper().startswith("MAXIMUM"): + flags.append("SENSITIVE") + notes = zettel.get("notes", "").lower() + if "foundational pillar" in notes or "core" in notes: + flags.append("CORE") + if "genesis" in notes or "genesis" in zettel.get("origin_label", "").lower(): + flags.append("GENESIS") + if "pivot" in notes: + flags.append("PIVOT") + return "+".join(flags) if flags else "" + + # === PLAIN TEXT COMPRESSION (new for mempalace) === + + def _detect_emotions(self, text: str) -> List[str]: + """Detect emotions from plain text using keyword signals.""" + text_lower = text.lower() + detected = [] + seen = set() + for keyword, code in _EMOTION_SIGNALS.items(): + if keyword in text_lower and code not in seen: + detected.append(code) + seen.add(code) + return detected[:3] + + def _detect_flags(self, text: str) -> List[str]: + """Detect importance flags from plain text using keyword signals.""" + text_lower = text.lower() + detected = [] + seen = set() + for keyword, flag in _FLAG_SIGNALS.items(): + if keyword in text_lower and flag not in seen: + detected.append(flag) + seen.add(flag) + return detected[:3] + + def _extract_topics(self, text: str, max_topics: int = 3) -> List[str]: + """Extract key topic words from plain text.""" + # Tokenize: alphanumeric words, lowercase + words = re.findall(r"[a-zA-Z][a-zA-Z_-]{2,}", text) + # Count frequency, skip stop words + freq = {} + for w in words: + w_lower = w.lower() + if w_lower in _STOP_WORDS or len(w_lower) < 3: + continue + freq[w_lower] = freq.get(w_lower, 0) + 1 + + # Also boost words that look like proper nouns or technical terms + for w in words: + w_lower = w.lower() + if w_lower in _STOP_WORDS: + continue + if w[0].isupper() and w_lower in freq: + freq[w_lower] += 2 + # CamelCase or has underscore/hyphen + if "_" in w or "-" in w or (any(c.isupper() for c in w[1:])): + if w_lower in freq: + freq[w_lower] += 2 + + ranked = sorted(freq.items(), key=lambda x: -x[1]) + return [w for w, _ in ranked[:max_topics]] + + def _extract_key_sentence(self, text: str) -> str: + """Extract the most important sentence fragment from text.""" + # Split into sentences + sentences = re.split(r"[.!?\n]+", text) + sentences = [s.strip() for s in sentences if len(s.strip()) > 10] + if not sentences: + return "" + + # Score each sentence + decision_words = { + "decided", + "because", + "instead", + "prefer", + "switched", + "chose", + "realized", + "important", + "key", + "critical", + "discovered", + "learned", + "conclusion", + "solution", + "reason", + "why", + "breakthrough", + "insight", + } + scored = [] + for s in sentences: + score = 0 + s_lower = s.lower() + for w in decision_words: + if w in s_lower: + score += 2 + # Prefer shorter, punchier sentences + if len(s) < 80: + score += 1 + if len(s) < 40: + score += 1 + # Penalize very long sentences + if len(s) > 150: + score -= 2 + scored.append((score, s)) + + scored.sort(key=lambda x: -x[0]) + best = scored[0][1] + # Truncate if too long + if len(best) > 55: + best = best[:52] + "..." + return best + + def _detect_entities_in_text(self, text: str) -> List[str]: + """Find known entities in text, or detect capitalized names.""" + found = [] + # Check known entities + for name, code in self.entity_codes.items(): + if not name.islower() and name.lower() in text.lower(): + if code not in found: + found.append(code) + if found: + return found + + # Fallback: find capitalized words that look like names (2+ chars, not sentence-start) + words = text.split() + for i, w in enumerate(words): + clean = re.sub(r"[^a-zA-Z]", "", w) + if ( + len(clean) >= 2 + and clean[0].isupper() + and clean[1:].islower() + and i > 0 + and clean.lower() not in _STOP_WORDS + ): + code = clean[:3].upper() + if code not in found: + found.append(code) + if len(found) >= 3: + break + return found + + def compress(self, text: str, metadata: dict = None) -> str: + """ + Compress plain text into AAAK Dialect format. + + This is the primary method for mempalace: takes any text content + (drawer content, transcript chunk, note) and returns a compressed + symbolic representation. + + Args: + text: Plain text content to compress + metadata: Optional dict with keys like 'source_file', 'wing', + 'room', 'date', etc. + + Returns: + AAAK-compressed string (~30x smaller than input) + """ + metadata = metadata or {} + + # Detect components + entities = self._detect_entities_in_text(text) + entity_str = "+".join(entities[:3]) if entities else "???" + + topics = self._extract_topics(text) + topic_str = "_".join(topics[:3]) if topics else "misc" + + quote = self._extract_key_sentence(text) + quote_part = f'"{quote}"' if quote else "" + + emotions = self._detect_emotions(text) + emotion_str = "+".join(emotions) if emotions else "" + + flags = self._detect_flags(text) + flag_str = "+".join(flags) if flags else "" + + # Build source header if metadata available + source = metadata.get("source_file", "") + wing = metadata.get("wing", "") + room = metadata.get("room", "") + date = metadata.get("date", "") + + lines = [] + + # Header line (if we have metadata) + if source or wing: + header_parts = [ + wing or "?", + room or "?", + date or "?", + Path(source).stem if source else "?", + ] + lines.append("|".join(header_parts)) + + # Content line + parts = [f"0:{entity_str}", topic_str] + if quote_part: + parts.append(quote_part) + if emotion_str: + parts.append(emotion_str) + if flag_str: + parts.append(flag_str) + + lines.append("|".join(parts)) + + return "\n".join(lines) + + # === ZETTEL-BASED ENCODING (original format, kept for compatibility) === + + def extract_key_quote(self, zettel: dict) -> str: + """Pull the most important quote fragment from zettel content.""" + content = zettel.get("content", "") + origin = zettel.get("origin_label", "") + notes = zettel.get("notes", "") + title = zettel.get("title", "") + all_text = content + " " + origin + " " + notes + + quotes = [] + quotes += re.findall(r'"([^"]{8,55})"', all_text) + for m in re.finditer(r"(?:^|[\s(])'([^']{8,55})'(?:[\s.,;:!?)]|$)", all_text): + quotes.append(m.group(1)) + quotes += re.findall( + r'(?:says?|said|articulates?|reveals?|admits?|confesses?|asks?):\s*["\']?([^.!?]{10,55})[.!?]', + all_text, + re.IGNORECASE, + ) + + if quotes: + seen = set() + unique = [] + for q in quotes: + q = q.strip() + if q not in seen and len(q) >= 8: + seen.add(q) + unique.append(q) + quotes = unique + + emotional_words = { + "love", + "fear", + "remember", + "soul", + "feel", + "stupid", + "scared", + "beautiful", + "destroy", + "respect", + "trust", + "consciousness", + "alive", + "forget", + "waiting", + "peace", + "matter", + "real", + "guilt", + "escape", + "rest", + "hope", + "dream", + "lost", + "found", + } + scored = [] + for q in quotes: + score = 0 + if q[0].isupper() or q.startswith("I "): + score += 2 + matches = sum(1 for w in emotional_words if w in q.lower()) + score += matches * 2 + if len(q) > 20: + score += 1 + if q.startswith("The ") or q.startswith("This ") or q.startswith("She "): + score -= 2 + scored.append((score, q)) + scored.sort(key=lambda x: -x[0]) + if scored: + return scored[0][1] + + if " - " in title: + return title.split(" - ", 1)[1][:45] + return "" + + def encode_zettel(self, zettel: dict) -> str: + """Encode a single zettel into AAAK Dialect.""" + zid = zettel["id"].split("-")[-1] + + entity_codes = [self.encode_entity(p) for p in zettel.get("people", [])] + entity_codes = [e for e in entity_codes if e is not None] + if not entity_codes: + entity_codes = ["???"] + entities = "+".join(sorted(set(entity_codes))) + + topics = zettel.get("topics", []) + topic_str = "_".join(topics[:2]) if topics else "misc" + + quote = self.extract_key_quote(zettel) + quote_part = f'"{quote}"' if quote else "" + + weight = zettel.get("emotional_weight", 0.5) + emotions = self.encode_emotions(zettel.get("emotional_tone", [])) + flags = self.get_flags(zettel) + + parts = [f"{zid}:{entities}", topic_str] + if quote_part: + parts.append(quote_part) + parts.append(str(weight)) + if emotions: + parts.append(emotions) + if flags: + parts.append(flags) + + return "|".join(parts) + + def encode_tunnel(self, tunnel: dict) -> str: + """Encode a tunnel connection.""" + from_id = tunnel["from"].split("-")[-1] + to_id = tunnel["to"].split("-")[-1] + label = tunnel.get("label", "") + short_label = label.split(":")[0] if ":" in label else label[:30] + return f"T:{from_id}<->{to_id}|{short_label}" + + def encode_file(self, zettel_json: dict) -> str: + """Encode an entire zettel file into AAAK Dialect.""" + lines = [] + + source = zettel_json.get("source_file", "unknown") + file_num = source.split("-")[0] if "-" in source else "000" + date = zettel_json.get("zettels", [{}])[0].get("date_context", "unknown") + + all_people = set() + for z in zettel_json.get("zettels", []): + for p in z.get("people", []): + code = self.encode_entity(p) + if code is not None: + all_people.add(code) + if not all_people: + all_people = {"???"} + primary = "+".join(sorted(all_people)[:3]) + + title = source.replace(".txt", "").split("-", 1)[-1].strip() if "-" in source else source + lines.append(f"{file_num}|{primary}|{date}|{title}") + + arc = zettel_json.get("emotional_arc", "") + if arc: + lines.append(f"ARC:{arc}") + + for z in zettel_json.get("zettels", []): + lines.append(self.encode_zettel(z)) + + for t in zettel_json.get("tunnels", []): + lines.append(self.encode_tunnel(t)) + + return "\n".join(lines) + + # === FILE-BASED COMPRESSION === + + def compress_file(self, zettel_json_path: str, output_path: str = None) -> str: + """Read a zettel JSON file and compress it to AAAK Dialect.""" + with open(zettel_json_path, "r") as f: + data = json.load(f) + dialect = self.encode_file(data) + if output_path: + with open(output_path, "w") as f: + f.write(dialect) + return dialect + + def compress_all(self, zettel_dir: str, output_path: str = None) -> str: + """Compress ALL zettel files into a single AAAK Dialect file.""" + all_dialect = [] + for fname in sorted(os.listdir(zettel_dir)): + if fname.endswith(".json"): + fpath = os.path.join(zettel_dir, fname) + with open(fpath, "r") as f: + data = json.load(f) + dialect = self.encode_file(data) + all_dialect.append(dialect) + all_dialect.append("---") + combined = "\n".join(all_dialect) + if output_path: + with open(output_path, "w") as f: + f.write(combined) + return combined + + # === LAYER 1 GENERATION === + + def generate_layer1( + self, + zettel_dir: str, + output_path: str = None, + identity_sections: Dict[str, List[str]] = None, + weight_threshold: float = 0.85, + ) -> str: + """ + Auto-generate a Layer 1 wake-up file from all processed zettel files. + + Pulls highest-weight moments (>= threshold) and any with ORIGIN/CORE/GENESIS flags. + Groups them by date into MOMENTS sections. + """ + from datetime import date as date_cls + + essential = [] + + for fname in sorted(os.listdir(zettel_dir)): + if not fname.endswith(".json"): + continue + fpath = os.path.join(zettel_dir, fname) + with open(fpath, "r") as f: + data = json.load(f) + + file_num = fname.replace("file_", "").replace(".json", "") + source_date = data.get("zettels", [{}])[0].get("date_context", "unknown") + + for z in data.get("zettels", []): + weight = z.get("emotional_weight", 0) + is_origin = z.get("origin_moment", False) + flags = self.get_flags(z) + has_key_flag = ( + any(f in flags for f in ["ORIGIN", "CORE", "GENESIS"]) if flags else False + ) + + if weight >= weight_threshold or is_origin or has_key_flag: + essential.append((z, file_num, source_date)) + + all_tunnels = [] + for fname in sorted(os.listdir(zettel_dir)): + if not fname.endswith(".json"): + continue + fpath = os.path.join(zettel_dir, fname) + with open(fpath, "r") as f: + data = json.load(f) + for t in data.get("tunnels", []): + all_tunnels.append(t) + + essential.sort(key=lambda x: x[0].get("emotional_weight", 0), reverse=True) + + by_date = {} + for z, fnum, sdate in essential: + key = sdate.split(",")[0].strip() + if key not in by_date: + by_date[key] = [] + by_date[key].append((z, fnum)) + + lines = [] + lines.append("## LAYER 1 -- ESSENTIAL STORY") + lines.append(f"## Auto-generated from zettel files. Updated {date_cls.today()}.") + lines.append("") + + if identity_sections: + for section_name, section_lines in identity_sections.items(): + lines.append(f"={section_name}=") + lines.extend(section_lines) + lines.append("") + + for date_key in sorted(by_date.keys()): + lines.append(f"=MOMENTS[{date_key}]=") + for z, fnum in by_date[date_key]: + entities = [] + for p in z.get("people", []): + code = self.encode_entity(p) + if code: + entities.append(code) + if not entities: + entities = ["???"] + ent_str = "+".join(sorted(set(entities))) + + quote = self.extract_key_quote(z) + weight = z.get("emotional_weight", 0.5) + flags = self.get_flags(z) + sensitivity = z.get("sensitivity", "") + + parts = [ent_str] + title = z.get("title", "") + if " - " in title: + hint = title.split(" - ", 1)[1][:30] + else: + hint = "_".join(z.get("topics", [])[:2]) + if hint: + parts.append(hint) + if quote and quote != hint and quote not in (title, hint): + parts.append(f'"{quote}"') + if sensitivity and "SENSITIVE" not in (flags or ""): + parts.append("SENSITIVE") + parts.append(str(weight)) + if flags: + parts.append(flags) + + lines.append("|".join(parts)) + lines.append("") + + if all_tunnels: + lines.append("=TUNNELS=") + for t in all_tunnels[:8]: + label = t.get("label", "") + short = label.split(":")[0] if ":" in label else label[:40] + lines.append(short) + lines.append("") + + result = "\n".join(lines) + + if output_path: + with open(output_path, "w") as f: + f.write(result) + + return result + + # === DECODING === + + def decode(self, dialect_text: str) -> dict: + """Parse an AAAK Dialect string back into a readable summary.""" + lines = dialect_text.strip().split("\n") + result = {"header": {}, "arc": "", "zettels": [], "tunnels": []} + + for line in lines: + if line.startswith("ARC:"): + result["arc"] = line[4:] + elif line.startswith("T:"): + result["tunnels"].append(line) + elif "|" in line and ":" in line.split("|")[0]: + result["zettels"].append(line) + elif "|" in line: + parts = line.split("|") + result["header"] = { + "file": parts[0] if len(parts) > 0 else "", + "entities": parts[1] if len(parts) > 1 else "", + "date": parts[2] if len(parts) > 2 else "", + "title": parts[3] if len(parts) > 3 else "", + } + + return result + + # === STATS === + + @staticmethod + def count_tokens(text: str) -> int: + """Rough token count (1 token ~ 3 chars for structured text).""" + return len(text) // 3 + + def compression_stats(self, original_text: str, compressed: str) -> dict: + """Get compression statistics for a text->AAAK conversion.""" + orig_tokens = self.count_tokens(original_text) + comp_tokens = self.count_tokens(compressed) + return { + "original_tokens": orig_tokens, + "compressed_tokens": comp_tokens, + "ratio": orig_tokens / max(comp_tokens, 1), + "original_chars": len(original_text), + "compressed_chars": len(compressed), + } + + +# === CLI === +if __name__ == "__main__": + import sys + + def usage(): + print("AAAK Dialect -- Compressed Symbolic Memory for Any LLM") + print() + print("Usage:") + print(" python dialect.py # Compress text from argument") + print(" python dialect.py --file # Compress zettel JSON file") + print(" python dialect.py --all # Compress all zettel files") + print(" python dialect.py --stats # Show compression stats") + print(" python dialect.py --layer1 # Generate Layer 1 wake-up file") + print(" python dialect.py --init # Create example config") + print() + print("Options:") + print(" --config Load entity mappings from JSON config") + sys.exit(1) + + if len(sys.argv) < 2: + usage() + + # Parse --config flag + config_path = None + args = sys.argv[1:] + if "--config" in args: + idx = args.index("--config") + config_path = args[idx + 1] + args = args[:idx] + args[idx + 2 :] + + # Create dialect instance + if config_path: + dialect = Dialect.from_config(config_path) + else: + dialect = Dialect() + + if args[0] == "--init": + example = { + "entities": { + "Alice": "ALC", + "Bob": "BOB", + "Dr. Chen": "CHN", + }, + "skip_names": [], + } + out_path = "entities.json" + with open(out_path, "w") as f: + json.dump(example, f, indent=2) + print(f"Created example config: {out_path}") + print("Edit this file with your own entity mappings, then use --config entities.json") + + elif args[0] == "--file": + result = dialect.compress_file(args[1]) + tokens = Dialect.count_tokens(result) + print(f"~{tokens} tokens") + print() + print(result) + + elif args[0] == "--all": + zettel_dir = args[1] if len(args) > 1 else "." + output = os.path.join(zettel_dir, "COMPRESSED_MEMORY.aaak") + result = dialect.compress_all(zettel_dir, output) + tokens = Dialect.count_tokens(result) + print(f"Compressed to: {output}") + print(f"Total: ~{tokens} tokens") + print() + print(result) + + elif args[0] == "--stats": + with open(args[1], "r") as f: + data = json.load(f) + json_str = json.dumps(data, indent=2) + encoded = dialect.encode_file(data) + stats = dialect.compression_stats(json_str, encoded) + print("=== COMPRESSION STATS ===") + print(f"JSON: ~{stats['original_tokens']:,} tokens") + print(f"AAAK: ~{stats['compressed_tokens']:,} tokens") + print(f"Ratio: {stats['ratio']:.0f}x") + print() + print("=== AAAK DIALECT OUTPUT ===") + print(encoded) + + elif args[0] == "--layer1": + zettel_dir = args[1] if len(args) > 1 else "." + output = os.path.join(zettel_dir, "LAYER1.aaak") + result = dialect.generate_layer1(zettel_dir, output) + tokens = Dialect.count_tokens(result) + print(f"Layer 1: {output}") + print(f"Total: ~{tokens} tokens") + print() + print(result) + + else: + # Treat remaining args as text to compress + text = " ".join(args) + compressed = dialect.compress(text) + stats = dialect.compression_stats(text, compressed) + print(f"Original: ~{stats['original_tokens']} tokens ({stats['original_chars']} chars)") + print(f"AAAK: ~{stats['compressed_tokens']} tokens ({stats['compressed_chars']} chars)") + print(f"Ratio: {stats['ratio']:.1f}x") + print() + print(compressed) diff --git a/mempalace/entity_detector.py b/mempalace/entity_detector.py new file mode 100644 index 0000000..63a7883 --- /dev/null +++ b/mempalace/entity_detector.py @@ -0,0 +1,853 @@ +#!/usr/bin/env python3 +""" +entity_detector.py — Auto-detect people and projects from file content. + +Two-pass approach: + Pass 1: scan files, extract entity candidates with signal counts + Pass 2: score and classify each candidate as person, project, or uncertain + +Used by mempalace init before mining begins. +The confirmed entity map feeds the miner as the taxonomy. + +Usage: + from entity_detector import detect_entities, confirm_entities + candidates = detect_entities(file_paths) + confirmed = confirm_entities(candidates) # interactive review +""" + +import re +import os +from pathlib import Path +from collections import defaultdict + + +# ==================== SIGNAL PATTERNS ==================== + +# Person signals — things people do +PERSON_VERB_PATTERNS = [ + r"\b{name}\s+said\b", + r"\b{name}\s+asked\b", + r"\b{name}\s+told\b", + r"\b{name}\s+replied\b", + r"\b{name}\s+laughed\b", + r"\b{name}\s+smiled\b", + r"\b{name}\s+cried\b", + r"\b{name}\s+felt\b", + r"\b{name}\s+thinks?\b", + r"\b{name}\s+wants?\b", + r"\b{name}\s+loves?\b", + r"\b{name}\s+hates?\b", + r"\b{name}\s+knows?\b", + r"\b{name}\s+decided\b", + r"\b{name}\s+pushed\b", + r"\b{name}\s+wrote\b", + r"\bhey\s+{name}\b", + r"\bthanks?\s+{name}\b", + r"\bhi\s+{name}\b", + r"\bdear\s+{name}\b", +] + +# Person signals — pronouns resolving nearby +PRONOUN_PATTERNS = [ + r"\bshe\b", + r"\bher\b", + r"\bhers\b", + r"\bhe\b", + r"\bhim\b", + r"\bhis\b", + r"\bthey\b", + r"\bthem\b", + r"\btheir\b", +] + +# Person signals — dialogue markers +DIALOGUE_PATTERNS = [ + r"^>\s*{name}[:\s]", # > Speaker: ... + r"^{name}:\s", # Speaker: ... + r"^\[{name}\]", # [Speaker] + r'"{name}\s+said', +] + +# Project signals — things projects have/do +PROJECT_VERB_PATTERNS = [ + r"\bbuilding\s+{name}\b", + r"\bbuilt\s+{name}\b", + r"\bship(?:ping|ped)?\s+{name}\b", + r"\blaunch(?:ing|ed)?\s+{name}\b", + r"\bdeploy(?:ing|ed)?\s+{name}\b", + r"\binstall(?:ing|ed)?\s+{name}\b", + r"\bthe\s+{name}\s+architecture\b", + r"\bthe\s+{name}\s+pipeline\b", + r"\bthe\s+{name}\s+system\b", + r"\bthe\s+{name}\s+repo\b", + r"\b{name}\s+v\d+\b", # MemPal v2 + r"\b{name}\.py\b", # mempalace.py + r"\b{name}-core\b", # mempal-core (hyphen only, not underscore) + r"\b{name}-local\b", + r"\bimport\s+{name}\b", + r"\bpip\s+install\s+{name}\b", +] + +# Words that are almost certainly NOT entities +STOPWORDS = { + "the", + "a", + "an", + "and", + "or", + "but", + "in", + "on", + "at", + "to", + "for", + "of", + "with", + "by", + "from", + "as", + "is", + "was", + "are", + "were", + "be", + "been", + "being", + "have", + "has", + "had", + "do", + "does", + "did", + "will", + "would", + "could", + "should", + "may", + "might", + "must", + "shall", + "can", + "this", + "that", + "these", + "those", + "it", + "its", + "they", + "them", + "their", + "we", + "our", + "you", + "your", + "i", + "my", + "me", + "he", + "she", + "his", + "her", + "who", + "what", + "when", + "where", + "why", + "how", + "which", + "if", + "then", + "so", + "not", + "no", + "yes", + "ok", + "okay", + "just", + "very", + "really", + "also", + "already", + "still", + "even", + "only", + "here", + "there", + "now", + "then", + "too", + "up", + "out", + "about", + "like", + "use", + "get", + "got", + "make", + "made", + "take", + "put", + "come", + "go", + "see", + "know", + "think", + "true", + "false", + "none", + "null", + "new", + "old", + "all", + "any", + "some", + "true", + "false", + "return", + "print", + "def", + "class", + "import", + "from", + # Common capitalized words in prose that aren't entities + "step", + "usage", + "run", + "check", + "find", + "add", + "get", + "set", + "list", + "args", + "dict", + "str", + "int", + "bool", + "path", + "file", + "type", + "name", + "note", + "example", + "option", + "result", + "error", + "warning", + "info", + "every", + "each", + "more", + "less", + "next", + "last", + "first", + "second", + "stack", + "layer", + "mode", + "test", + "stop", + "start", + "copy", + "move", + "source", + "target", + "output", + "input", + "data", + "item", + "key", + "value", + "returns", + "raises", + "yields", + "none", + "self", + "cls", + "kwargs", + # Common sentence-starting / abstract words that aren't entities + "world", + "well", + "want", + "topic", + "choose", + "social", + "cars", + "phones", + "healthcare", + "ex", + "machina", + "deus", + "human", + "humans", + "people", + "things", + "something", + "nothing", + "everything", + "anything", + "someone", + "everyone", + "anyone", + "way", + "time", + "day", + "life", + "place", + "thing", + "part", + "kind", + "sort", + "case", + "point", + "idea", + "fact", + "sense", + "question", + "answer", + "reason", + "number", + "version", + "system", + # Greetings and filler words at sentence starts + "hey", + "hi", + "hello", + "thanks", + "thank", + "right", + "let", + "ok", + # UI/action words that appear in how-to content + "click", + "hit", + "press", + "tap", + "drag", + "drop", + "open", + "close", + "save", + "load", + "launch", + "install", + "download", + "upload", + "scroll", + "select", + "enter", + "submit", + "cancel", + "confirm", + "delete", + "copy", + "paste", + "type", + "write", + "read", + "search", + "find", + "show", + "hide", + # Common filesystem/technical capitalized words + "desktop", + "documents", + "downloads", + "users", + "home", + "library", + "applications", + "system", + "preferences", + "settings", + "terminal", + # Abstract/topic words + "actor", + "vector", + "remote", + "control", + "duration", + "fetch", + # Abstract concepts that appear as subjects but aren't entities + "agents", + "tools", + "others", + "guards", + "ethics", + "regulation", + "learning", + "thinking", + "memory", + "language", + "intelligence", + "technology", + "society", + "culture", + "future", + "history", + "science", + "model", + "models", + "network", + "networks", + "training", + "inference", +} + +# For entity detection — prose only, no code files +# Code files have too many capitalized names (classes, functions) that aren't entities +PROSE_EXTENSIONS = { + ".txt", + ".md", + ".rst", + ".csv", +} + +READABLE_EXTENSIONS = { + ".txt", + ".md", + ".py", + ".js", + ".ts", + ".json", + ".yaml", + ".yml", + ".csv", + ".rst", + ".toml", + ".sh", + ".rb", + ".go", + ".rs", +} + +SKIP_DIRS = { + ".git", + "node_modules", + "__pycache__", + ".venv", + "venv", + "env", + "dist", + "build", + ".next", + "coverage", + ".mempalace", +} + + +# ==================== CANDIDATE EXTRACTION ==================== + + +def extract_candidates(text: str) -> dict: + """ + Extract all capitalized proper noun candidates from text. + Returns {name: frequency} for names appearing 3+ times. + """ + # Find all capitalized words (not at sentence start — harder, so we use frequency as filter) + raw = re.findall(r"\b([A-Z][a-z]{1,19})\b", text) + + counts = defaultdict(int) + for word in raw: + if word.lower() not in STOPWORDS and len(word) > 1: + counts[word] += 1 + + # Also find multi-word proper nouns (e.g. "Memory Palace", "Claude Code") + multi = re.findall(r"\b([A-Z][a-z]+(?:\s+[A-Z][a-z]+)+)\b", text) + for phrase in multi: + if not any(w.lower() in STOPWORDS for w in phrase.split()): + counts[phrase] += 1 + + # Filter: must appear at least 3 times to be a candidate + return {name: count for name, count in counts.items() if count >= 3} + + +# ==================== SIGNAL SCORING ==================== + + +def _build_patterns(name: str) -> dict: + """Pre-compile all regex patterns for a single entity name.""" + n = re.escape(name) + return { + "dialogue": [ + re.compile(p.format(name=n), re.MULTILINE | re.IGNORECASE) for p in DIALOGUE_PATTERNS + ], + "person_verbs": [re.compile(p.format(name=n), re.IGNORECASE) for p in PERSON_VERB_PATTERNS], + "project_verbs": [ + re.compile(p.format(name=n), re.IGNORECASE) for p in PROJECT_VERB_PATTERNS + ], + "direct": re.compile(rf"\bhey\s+{n}\b|\bthanks?\s+{n}\b|\bhi\s+{n}\b", re.IGNORECASE), + "versioned": re.compile(rf"\b{n}[-v]\w+", re.IGNORECASE), + "code_ref": re.compile(rf"\b{n}\.(py|js|ts|yaml|yml|json|sh)\b", re.IGNORECASE), + } + + +def score_entity(name: str, text: str, lines: list) -> dict: + """ + Score a candidate entity as person vs project. + Returns scores and the signals that fired. + """ + patterns = _build_patterns(name) + person_score = 0 + project_score = 0 + person_signals = [] + project_signals = [] + + # --- Person signals --- + + # Dialogue markers (strong signal) + for rx in patterns["dialogue"]: + matches = len(rx.findall(text)) + if matches > 0: + person_score += matches * 3 + person_signals.append(f"dialogue marker ({matches}x)") + + # Person verbs + for rx in patterns["person_verbs"]: + matches = len(rx.findall(text)) + if matches > 0: + person_score += matches * 2 + person_signals.append(f"'{name} ...' action ({matches}x)") + + # Pronoun proximity — pronouns within 3 lines of the name + name_lower = name.lower() + name_line_indices = [i for i, line in enumerate(lines) if name_lower in line.lower()] + pronoun_hits = 0 + for idx in name_line_indices: + window_text = " ".join(lines[max(0, idx - 2) : idx + 3]).lower() + for pronoun_pattern in PRONOUN_PATTERNS: + if re.search(pronoun_pattern, window_text): + pronoun_hits += 1 + break + if pronoun_hits > 0: + person_score += pronoun_hits * 2 + person_signals.append(f"pronoun nearby ({pronoun_hits}x)") + + # Direct address + direct = len(patterns["direct"].findall(text)) + if direct > 0: + person_score += direct * 4 + person_signals.append(f"addressed directly ({direct}x)") + + # --- Project signals --- + + for rx in patterns["project_verbs"]: + matches = len(rx.findall(text)) + if matches > 0: + project_score += matches * 2 + project_signals.append(f"project verb ({matches}x)") + + versioned = len(patterns["versioned"].findall(text)) + if versioned > 0: + project_score += versioned * 3 + project_signals.append(f"versioned/hyphenated ({versioned}x)") + + code_ref = len(patterns["code_ref"].findall(text)) + if code_ref > 0: + project_score += code_ref * 3 + project_signals.append(f"code file reference ({code_ref}x)") + + return { + "person_score": person_score, + "project_score": project_score, + "person_signals": person_signals[:3], + "project_signals": project_signals[:3], + } + + +# ==================== CLASSIFY ==================== + + +def classify_entity(name: str, frequency: int, scores: dict) -> dict: + """ + Given scores, classify as person / project / uncertain. + Returns entity dict with confidence. + """ + ps = scores["person_score"] + prs = scores["project_score"] + total = ps + prs + + if total == 0: + # No strong signals — frequency-only candidate, uncertain + confidence = min(0.4, frequency / 50) + return { + "name": name, + "type": "uncertain", + "confidence": round(confidence, 2), + "frequency": frequency, + "signals": [f"appears {frequency}x, no strong type signals"], + } + + person_ratio = ps / total if total > 0 else 0 + + # Require TWO different signal categories to confidently classify as a person. + # One signal type with many hits (e.g. "Click, click, click...") is not enough — + # it just means that word appears often in a particular syntactic position. + signal_categories = set() + for s in scores["person_signals"]: + if "dialogue" in s: + signal_categories.add("dialogue") + elif "action" in s: + signal_categories.add("action") + elif "pronoun" in s: + signal_categories.add("pronoun") + elif "addressed" in s: + signal_categories.add("addressed") + + has_two_signal_types = len(signal_categories) >= 2 + _ = signal_categories - {"pronoun"} # reserved for future thresholds + + if person_ratio >= 0.7 and has_two_signal_types and ps >= 5: + entity_type = "person" + confidence = min(0.99, 0.5 + person_ratio * 0.5) + signals = scores["person_signals"] or [f"appears {frequency}x"] + elif person_ratio >= 0.7 and (not has_two_signal_types or ps < 5): + # Pronoun-only match — downgrade to uncertain + entity_type = "uncertain" + confidence = 0.4 + signals = scores["person_signals"] + [f"appears {frequency}x — pronoun-only match"] + elif person_ratio <= 0.3: + entity_type = "project" + confidence = min(0.99, 0.5 + (1 - person_ratio) * 0.5) + signals = scores["project_signals"] or [f"appears {frequency}x"] + else: + entity_type = "uncertain" + confidence = 0.5 + signals = (scores["person_signals"] + scores["project_signals"])[:3] + signals.append("mixed signals — needs review") + + return { + "name": name, + "type": entity_type, + "confidence": round(confidence, 2), + "frequency": frequency, + "signals": signals, + } + + +# ==================== MAIN DETECT ==================== + + +def detect_entities(file_paths: list, max_files: int = 10) -> dict: + """ + Scan files and detect entity candidates. + + Args: + file_paths: List of Path objects to scan + max_files: Max files to read (for speed) + + Returns: + { + "people": [...entity dicts...], + "projects": [...entity dicts...], + "uncertain":[...entity dicts...], + } + """ + # Collect text from files + all_text = [] + all_lines = [] + files_read = 0 + + MAX_BYTES_PER_FILE = 5_000 # first 5KB per file — enough to catch recurring entities + + for filepath in file_paths: + if files_read >= max_files: + break + try: + with open(filepath, encoding="utf-8", errors="replace") as f: + content = f.read(MAX_BYTES_PER_FILE) + all_text.append(content) + all_lines.extend(content.splitlines()) + files_read += 1 + except Exception: + continue + + combined_text = "\n".join(all_text) + + # Extract candidates + candidates = extract_candidates(combined_text) + + if not candidates: + return {"people": [], "projects": [], "uncertain": []} + + # Score and classify each candidate + people = [] + projects = [] + uncertain = [] + + for name, frequency in sorted(candidates.items(), key=lambda x: x[1], reverse=True): + scores = score_entity(name, combined_text, all_lines) + entity = classify_entity(name, frequency, scores) + + if entity["type"] == "person": + people.append(entity) + elif entity["type"] == "project": + projects.append(entity) + else: + uncertain.append(entity) + + # Sort by confidence descending + people.sort(key=lambda x: x["confidence"], reverse=True) + projects.sort(key=lambda x: x["confidence"], reverse=True) + uncertain.sort(key=lambda x: x["frequency"], reverse=True) + + # Cap results to most relevant + return { + "people": people[:15], + "projects": projects[:10], + "uncertain": uncertain[:8], + } + + +# ==================== INTERACTIVE CONFIRM ==================== + + +def _print_entity_list(entities: list, label: str): + print(f"\n {label}:") + if not entities: + print(" (none detected)") + return + for i, e in enumerate(entities): + confidence_bar = "●" * int(e["confidence"] * 5) + "○" * (5 - int(e["confidence"] * 5)) + signals_str = ", ".join(e["signals"][:2]) if e["signals"] else "" + print(f" {i + 1:2}. {e['name']:20} [{confidence_bar}] {signals_str}") + + +def confirm_entities(detected: dict, yes: bool = False) -> dict: + """ + Interactive confirmation step. + User reviews detected entities, removes wrong ones, adds missing ones. + Returns confirmed {people: [names], projects: [names]} + + Pass yes=True to auto-accept all detected entities without prompting. + """ + print(f"\n{'=' * 58}") + print(" MemPalace — Entity Detection") + print(f"{'=' * 58}") + print("\n Scanned your files. Here's what we found:\n") + + _print_entity_list(detected["people"], "PEOPLE") + _print_entity_list(detected["projects"], "PROJECTS") + + if detected["uncertain"]: + _print_entity_list(detected["uncertain"], "UNCERTAIN (need your call)") + + confirmed_people = [e["name"] for e in detected["people"]] + confirmed_projects = [e["name"] for e in detected["projects"]] + + if yes: + # Auto-accept: include all detected (skip uncertain — ambiguous without user input) + print( + f"\n Auto-accepting {len(confirmed_people)} people, {len(confirmed_projects)} projects." + ) + return {"people": confirmed_people, "projects": confirmed_projects} + + print(f"\n{'─' * 58}") + print(" Options:") + print(" [enter] Accept all") + print(" [edit] Remove wrong entries or reclassify uncertain") + print(" [add] Add missing people or projects") + print() + + choice = input(" Your choice [enter/edit/add]: ").strip().lower() + + confirmed_people = [e["name"] for e in detected["people"]] + confirmed_projects = [e["name"] for e in detected["projects"]] + + if choice == "edit": + # Handle uncertain first + if detected["uncertain"]: + print("\n Uncertain entities — classify each:") + for e in detected["uncertain"]: + ans = input(f" {e['name']} — (p)erson, (r)roject, or (s)kip? ").strip().lower() + if ans == "p": + confirmed_people.append(e["name"]) + elif ans == "r": + confirmed_projects.append(e["name"]) + + # Remove wrong people + print(f"\n Current people: {', '.join(confirmed_people) or '(none)'}") + remove = input( + " Numbers to REMOVE from people (comma-separated, or enter to skip): " + ).strip() + if remove: + to_remove = {int(x.strip()) - 1 for x in remove.split(",") if x.strip().isdigit()} + confirmed_people = [p for i, p in enumerate(confirmed_people) if i not in to_remove] + + # Remove wrong projects + print(f"\n Current projects: {', '.join(confirmed_projects) or '(none)'}") + remove = input( + " Numbers to REMOVE from projects (comma-separated, or enter to skip): " + ).strip() + if remove: + to_remove = {int(x.strip()) - 1 for x in remove.split(",") if x.strip().isdigit()} + confirmed_projects = [p for i, p in enumerate(confirmed_projects) if i not in to_remove] + + if choice == "add" or input("\n Add any missing? [y/N]: ").strip().lower() == "y": + while True: + name = input(" Name (or enter to stop): ").strip() + if not name: + break + kind = input(f" Is '{name}' a (p)erson or (r)roject? ").strip().lower() + if kind == "p": + confirmed_people.append(name) + elif kind == "r": + confirmed_projects.append(name) + + print(f"\n{'=' * 58}") + print(" Confirmed:") + print(f" People: {', '.join(confirmed_people) or '(none)'}") + print(f" Projects: {', '.join(confirmed_projects) or '(none)'}") + print(f"{'=' * 58}\n") + + return { + "people": confirmed_people, + "projects": confirmed_projects, + } + + +# ==================== SCAN HELPER ==================== + + +def scan_for_detection(project_dir: str, max_files: int = 10) -> list: + """ + Collect prose file paths for entity detection. + Prose only (.txt, .md, .rst, .csv) — code files produce too many false positives. + Falls back to all readable files if no prose found. + """ + project_path = Path(project_dir).expanduser().resolve() + prose_files = [] + all_files = [] + + for root, dirs, filenames in os.walk(project_path): + dirs[:] = [d for d in dirs if d not in SKIP_DIRS] + for filename in filenames: + filepath = Path(root) / filename + ext = filepath.suffix.lower() + if ext in PROSE_EXTENSIONS: + prose_files.append(filepath) + elif ext in READABLE_EXTENSIONS: + all_files.append(filepath) + + # Prefer prose files — fall back to all readable if too few prose files + files = prose_files if len(prose_files) >= 3 else prose_files + all_files + return files[:max_files] + + +# ==================== CLI ==================== + +if __name__ == "__main__": + import sys + + if len(sys.argv) < 2: + print("Usage: python entity_detector.py ") + sys.exit(1) + + project_dir = sys.argv[1] + print(f"Scanning: {project_dir}") + files = scan_for_detection(project_dir) + print(f"Reading {len(files)} files...") + detected = detect_entities(files) + confirmed = confirm_entities(detected) + print("Confirmed entities:", confirmed) diff --git a/mempalace/entity_registry.py b/mempalace/entity_registry.py new file mode 100644 index 0000000..a7a0dfe --- /dev/null +++ b/mempalace/entity_registry.py @@ -0,0 +1,643 @@ +#!/usr/bin/env python3 +""" +entity_registry.py — Persistent personal entity registry for MemPalace. + +Knows the difference between Riley (a person) and ever (an adverb). +Built from three sources, in priority order: + 1. Onboarding — what the user explicitly told us + 2. Learned — what we inferred from session history with high confidence + 3. Researched — what we looked up via Wikipedia for unknown words + +Usage: + from mempalace.entity_registry import EntityRegistry + registry = EntityRegistry.load() + result = registry.lookup("Riley", context="I went with Riley today") + # → {"type": "person", "confidence": 1.0, "source": "onboarding"} +""" + +import json +import re +import urllib.request +import urllib.parse +from pathlib import Path +from typing import Optional + + +# ───────────────────────────────────────────────────────────────────────────── +# Common English words that could be confused with names +# These get flagged as AMBIGUOUS and require context disambiguation +# ───────────────────────────────────────────────────────────────────────────── + +COMMON_ENGLISH_WORDS = { + # Words that are also common personal names + "ever", + "grace", + "will", + "bill", + "mark", + "april", + "may", + "june", + "joy", + "hope", + "faith", + "chance", + "chase", + "hunter", + "hunter", + "dash", + "flash", + "star", + "sky", + "river", + "brook", + "lane", + "art", + "clay", + "gil", + "nat", + "max", + "rex", + "ray", + "jay", + "rose", + "violet", + "lily", + "ivy", + "ash", + "reed", + "sage", + # Words that look like names at start of sentence + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", + "sunday", + "january", + "february", + "march", + "april", + "june", + "july", + "august", + "september", + "october", + "november", + "december", +} + +# Context patterns that indicate a word is being used as a PERSON name +PERSON_CONTEXT_PATTERNS = [ + r"\b{name}\s+said\b", + r"\b{name}\s+told\b", + r"\b{name}\s+asked\b", + r"\b{name}\s+laughed\b", + r"\b{name}\s+smiled\b", + r"\b{name}\s+was\b", + r"\b{name}\s+is\b", + r"\b{name}\s+called\b", + r"\b{name}\s+texted\b", + r"\bwith\s+{name}\b", + r"\bsaw\s+{name}\b", + r"\bcalled\s+{name}\b", + r"\btook\s+{name}\b", + r"\bpicked\s+up\s+{name}\b", + r"\bdrop(?:ped)?\s+(?:off\s+)?{name}\b", + r"\b{name}(?:'s|s')\b", # Riley's, Max's + r"\bhey\s+{name}\b", + r"\bthanks?\s+{name}\b", + r"^{name}[:\s]", # dialogue: "Riley: ..." + r"\bmy\s+(?:son|daughter|kid|child|brother|sister|friend|partner|colleague|coworker)\s+{name}\b", +] + +# Context patterns that indicate a word is NOT being used as a name +CONCEPT_CONTEXT_PATTERNS = [ + r"\bhave\s+you\s+{name}\b", # "have you ever" + r"\bif\s+you\s+{name}\b", # "if you ever" + r"\b{name}\s+since\b", # "ever since" + r"\b{name}\s+again\b", # "ever again" + r"\bnot\s+{name}\b", # "not ever" + r"\b{name}\s+more\b", # "ever more" + r"\bwould\s+{name}\b", # "would ever" + r"\bcould\s+{name}\b", # "could ever" + r"\bwill\s+{name}\b", # "will ever" + r"(?:the\s+)?{name}\s+(?:of|in|at|for|to)\b", # "the grace of", "the mark of" +] + + +# ───────────────────────────────────────────────────────────────────────────── +# Wikipedia lookup for unknown words +# ───────────────────────────────────────────────────────────────────────────── + +# Phrases in Wikipedia summaries that indicate a personal name +NAME_INDICATOR_PHRASES = [ + "given name", + "personal name", + "first name", + "forename", + "masculine name", + "feminine name", + "boy's name", + "girl's name", + "male name", + "female name", + "irish name", + "welsh name", + "scottish name", + "gaelic name", + "hebrew name", + "arabic name", + "norse name", + "old english name", + "is a name", + "as a name", + "name meaning", + "name derived from", + "legendary irish", + "legendary welsh", + "legendary scottish", +] + +PLACE_INDICATOR_PHRASES = [ + "city in", + "town in", + "village in", + "municipality", + "capital of", + "district of", + "county", + "province", + "region of", + "island of", + "mountain in", + "river in", +] + + +def _wikipedia_lookup(word: str) -> dict: + """ + Look up a word via Wikipedia REST API. + Returns inferred type (person/place/concept/unknown) + confidence + summary. + Free, no API key, handles disambiguation pages. + """ + try: + url = f"https://en.wikipedia.org/api/rest_v1/page/summary/{urllib.parse.quote(word)}" + req = urllib.request.Request(url, headers={"User-Agent": "MemPalace/1.0"}) + with urllib.request.urlopen(req, timeout=5) as resp: + data = json.loads(resp.read()) + + page_type = data.get("type", "") + extract = data.get("extract", "").lower() + title = data.get("title", word) + + # Disambiguation — look at description + if page_type == "disambiguation": + desc = data.get("description", "").lower() + if any(p in desc for p in ["name", "given name"]): + return { + "inferred_type": "person", + "confidence": 0.65, + "wiki_summary": extract[:200], + "wiki_title": title, + "note": "disambiguation page with name entries", + } + return { + "inferred_type": "ambiguous", + "confidence": 0.4, + "wiki_summary": extract[:200], + "wiki_title": title, + } + + # Check for name indicators + if any(phrase in extract for phrase in NAME_INDICATOR_PHRASES): + # Higher confidence if the word itself is described as a name + confidence = ( + 0.90 + if any( + f"{word.lower()} is a" in extract or f"{word.lower()} (name" in extract + for _ in [1] + ) + else 0.80 + ) + return { + "inferred_type": "person", + "confidence": confidence, + "wiki_summary": extract[:200], + "wiki_title": title, + } + + # Check for place indicators + if any(phrase in extract for phrase in PLACE_INDICATOR_PHRASES): + return { + "inferred_type": "place", + "confidence": 0.80, + "wiki_summary": extract[:200], + "wiki_title": title, + } + + # Found but doesn't match name/place patterns + return { + "inferred_type": "concept", + "confidence": 0.60, + "wiki_summary": extract[:200], + "wiki_title": title, + } + + except urllib.error.HTTPError as e: + if e.code == 404: + # Not in Wikipedia — strong signal it's a proper noun (unusual name, nickname) + return { + "inferred_type": "person", + "confidence": 0.70, + "wiki_summary": None, + "wiki_title": None, + "note": "not found in Wikipedia — likely a proper noun or unusual name", + } + return {"inferred_type": "unknown", "confidence": 0.0, "wiki_summary": None} + except Exception: + return {"inferred_type": "unknown", "confidence": 0.0, "wiki_summary": None} + + +# ───────────────────────────────────────────────────────────────────────────── +# Entity Registry +# ───────────────────────────────────────────────────────────────────────────── + + +class EntityRegistry: + """ + Persistent personal entity registry. + + Stored at ~/.mempalace/entity_registry.json + Schema: + { + "mode": "personal", # work | personal | combo + "version": 1, + "people": { + "Riley": { + "source": "onboarding", + "contexts": ["personal"], + "aliases": [], + "relationship": "daughter", + "confidence": 1.0 + } + }, + "projects": ["MemPalace", "Acme"], + "ambiguous_flags": ["riley", "max"], + "wiki_cache": { + "Sam": {"inferred_type": "person", "confidence": 0.9, "confirmed": true, ...} + } + } + """ + + DEFAULT_PATH = Path.home() / ".mempalace" / "entity_registry.json" + + def __init__(self, data: dict, path: Path): + self._data = data + self._path = path + + # ── Load / Save ────────────────────────────────────────────────────────── + + @classmethod + def load(cls, config_dir: Optional[Path] = None) -> "EntityRegistry": + path = (Path(config_dir) / "entity_registry.json") if config_dir else cls.DEFAULT_PATH + if path.exists(): + try: + data = json.loads(path.read_text()) + return cls(data, path) + except (json.JSONDecodeError, OSError): + pass + return cls(cls._empty(), path) + + def save(self): + self._path.parent.mkdir(parents=True, exist_ok=True) + self._path.write_text(json.dumps(self._data, indent=2)) + + @staticmethod + def _empty() -> dict: + return { + "version": 1, + "mode": "personal", + "people": {}, + "projects": [], + "ambiguous_flags": [], + "wiki_cache": {}, + } + + # ── Properties ─────────────────────────────────────────────────────────── + + @property + def mode(self) -> str: + return self._data.get("mode", "personal") + + @property + def people(self) -> dict: + return self._data.get("people", {}) + + @property + def projects(self) -> list: + return self._data.get("projects", []) + + @property + def ambiguous_flags(self) -> list: + return self._data.get("ambiguous_flags", []) + + # ── Seed from onboarding ───────────────────────────────────────────────── + + def seed(self, mode: str, people: list, projects: list, aliases: dict = None): + """ + Seed the registry from onboarding data. + + people: list of dicts {"name": str, "relationship": str, "context": str} + projects: list of str + aliases: dict {"Max": "Maxwell", ...} + """ + self._data["mode"] = mode + self._data["projects"] = list(projects) + + aliases = aliases or {} + reverse_aliases = {v: k for k, v in aliases.items()} # Maxwell → Max + + for entry in people: + name = entry["name"].strip() + if not name: + continue + context = entry.get("context", "personal") + relationship = entry.get("relationship", "") + + self._data["people"][name] = { + "source": "onboarding", + "contexts": [context], + "aliases": [reverse_aliases[name]] if name in reverse_aliases else [], + "relationship": relationship, + "confidence": 1.0, + } + + # Also register aliases + if name in reverse_aliases: + alias = reverse_aliases[name] + self._data["people"][alias] = { + "source": "onboarding", + "contexts": [context], + "aliases": [name], + "relationship": relationship, + "confidence": 1.0, + "canonical": name, + } + + # Flag ambiguous names (also common English words) + ambiguous = [] + for name in self._data["people"]: + if name.lower() in COMMON_ENGLISH_WORDS: + ambiguous.append(name.lower()) + self._data["ambiguous_flags"] = ambiguous + + self.save() + + # ── Lookup ─────────────────────────────────────────────────────────────── + + def lookup(self, word: str, context: str = "") -> dict: + """ + Look up a word. Returns entity classification. + + context: surrounding sentence (used for disambiguation of ambiguous words) + + Returns: + {"type": "person"|"project"|"concept"|"unknown", + "confidence": float, + "source": "onboarding"|"learned"|"wiki"|"inferred", + "name": canonical name if found, + "needs_disambiguation": bool} + """ + # 1. Exact match in people registry + for canonical, info in self.people.items(): + if word.lower() == canonical.lower() or word.lower() in [ + a.lower() for a in info.get("aliases", []) + ]: + # Check if this is an ambiguous word + if word.lower() in self.ambiguous_flags and context: + resolved = self._disambiguate(word, context, info) + if resolved is not None: + return resolved + return { + "type": "person", + "confidence": info["confidence"], + "source": info["source"], + "name": canonical, + "context": info.get("contexts", ["personal"]), + "needs_disambiguation": False, + } + + # 2. Project match + for proj in self.projects: + if word.lower() == proj.lower(): + return { + "type": "project", + "confidence": 1.0, + "source": "onboarding", + "name": proj, + "needs_disambiguation": False, + } + + # 3. Wiki cache + cache = self._data.get("wiki_cache", {}) + for cached_word, cached_result in cache.items(): + if word.lower() == cached_word.lower() and cached_result.get("confirmed"): + return { + "type": cached_result["inferred_type"], + "confidence": cached_result["confidence"], + "source": "wiki", + "name": word, + "needs_disambiguation": False, + } + + return { + "type": "unknown", + "confidence": 0.0, + "source": "none", + "name": word, + "needs_disambiguation": False, + } + + def _disambiguate(self, word: str, context: str, person_info: dict) -> Optional[dict]: + """ + When a word is both a name and a common word, check context. + Returns person result if context suggests a name, None if ambiguous. + """ + name_lower = word.lower() + ctx_lower = context.lower() + + # Check person context patterns + person_score = 0 + for pat in PERSON_CONTEXT_PATTERNS: + if re.search(pat.format(name=re.escape(name_lower)), ctx_lower): + person_score += 1 + + # Check concept context patterns + concept_score = 0 + for pat in CONCEPT_CONTEXT_PATTERNS: + if re.search(pat.format(name=re.escape(name_lower)), ctx_lower): + concept_score += 1 + + if person_score > concept_score: + return { + "type": "person", + "confidence": min(0.95, 0.7 + person_score * 0.1), + "source": person_info["source"], + "name": word, + "context": person_info.get("contexts", ["personal"]), + "needs_disambiguation": False, + "disambiguated_by": "context_patterns", + } + elif concept_score > person_score: + return { + "type": "concept", + "confidence": min(0.90, 0.7 + concept_score * 0.1), + "source": "context_disambiguated", + "name": word, + "needs_disambiguation": False, + "disambiguated_by": "context_patterns", + } + + # Truly ambiguous — return None to fall through to person (registered name) + return None + + # ── Research unknown words ─────────────────────────────────────────────── + + def research(self, word: str, auto_confirm: bool = False) -> dict: + """ + Research an unknown word via Wikipedia. + Caches result. If auto_confirm=False, marks as unconfirmed (needs user review). + Returns the lookup result. + """ + # Already cached? + cache = self._data.setdefault("wiki_cache", {}) + if word in cache: + return cache[word] + + result = _wikipedia_lookup(word) + result["word"] = word + result["confirmed"] = auto_confirm + + cache[word] = result + self.save() + return result + + def confirm_research( + self, word: str, entity_type: str, relationship: str = "", context: str = "personal" + ): + """Mark a researched word as confirmed and add to people registry.""" + cache = self._data.get("wiki_cache", {}) + if word in cache: + cache[word]["confirmed"] = True + cache[word]["confirmed_type"] = entity_type + + if entity_type == "person": + self._data["people"][word] = { + "source": "wiki", + "contexts": [context], + "aliases": [], + "relationship": relationship, + "confidence": 0.90, + } + if word.lower() in COMMON_ENGLISH_WORDS: + flags = self._data.setdefault("ambiguous_flags", []) + if word.lower() not in flags: + flags.append(word.lower()) + + self.save() + + # ── Learn from sessions ────────────────────────────────────────────────── + + def learn_from_text(self, text: str, min_confidence: float = 0.75) -> list: + """ + Scan session text for new entity candidates. + Returns list of newly discovered candidates for review. + """ + from mempalace.entity_detector import extract_candidates, score_entity, classify_entity + + lines = text.splitlines() + candidates = extract_candidates(text) + new_candidates = [] + + for name, frequency in candidates.items(): + # Skip if already known + if name in self.people or name in self.projects: + continue + + scores = score_entity(name, text, lines) + entity = classify_entity(name, frequency, scores) + + if entity["type"] == "person" and entity["confidence"] >= min_confidence: + self._data["people"][name] = { + "source": "learned", + "contexts": [self.mode if self.mode != "combo" else "personal"], + "aliases": [], + "relationship": "", + "confidence": entity["confidence"], + "seen_count": frequency, + } + if name.lower() in COMMON_ENGLISH_WORDS: + flags = self._data.setdefault("ambiguous_flags", []) + if name.lower() not in flags: + flags.append(name.lower()) + new_candidates.append(entity) + + if new_candidates: + self.save() + + return new_candidates + + # ── Query helpers for retrieval ────────────────────────────────────────── + + def extract_people_from_query(self, query: str) -> list: + """ + Extract known person names from a query string. + Returns list of canonical names found. + """ + found = [] + query.lower() + + for canonical, info in self.people.items(): + names_to_check = [canonical] + info.get("aliases", []) + for name in names_to_check: + # Word boundary match + if re.search(rf"\b{re.escape(name)}\b", query, re.IGNORECASE): + # For ambiguous words, check context + if name.lower() in self.ambiguous_flags: + result = self._disambiguate(name, query, info) + if result and result["type"] == "person": + if canonical not in found: + found.append(canonical) + else: + if canonical not in found: + found.append(canonical) + return found + + def extract_unknown_candidates(self, query: str) -> list: + """ + Find capitalized words in query that aren't in registry or common words. + These are candidates for Wikipedia research. + """ + candidates = re.findall(r"\b[A-Z][a-z]{2,15}\b", query) + unknown = [] + for word in set(candidates): + if word.lower() in COMMON_ENGLISH_WORDS: + continue + result = self.lookup(word) + if result["type"] == "unknown": + unknown.append(word) + return unknown + + # ── Summary ────────────────────────────────────────────────────────────── + + def summary(self) -> str: + lines = [ + f"Mode: {self.mode}", + f"People: {len(self.people)} ({', '.join(list(self.people.keys())[:8])}{'...' if len(self.people) > 8 else ''})", + f"Projects: {', '.join(self.projects) or '(none)'}", + f"Ambiguous flags: {', '.join(self.ambiguous_flags) or '(none)'}", + f"Wiki cache: {len(self._data.get('wiki_cache', {}))} entries", + ] + return "\n".join(lines) diff --git a/mempalace/general_extractor.py b/mempalace/general_extractor.py new file mode 100644 index 0000000..e849d7c --- /dev/null +++ b/mempalace/general_extractor.py @@ -0,0 +1,521 @@ +#!/usr/bin/env python3 +""" +general_extractor.py — Extract 5 types of memories from text. + +Types: + 1. DECISIONS — "we went with X because Y", choices made + 2. PREFERENCES — "always use X", "never do Y", "I prefer Z" + 3. MILESTONES — breakthroughs, things that finally worked + 4. PROBLEMS — what broke, what fixed it, root causes + 5. EMOTIONAL — feelings, vulnerability, relationships + +No LLM required. Pure keyword/pattern heuristics. +No external dependencies on palace.py, dialect.py, or layers.py. + +Usage: + from general_extractor import extract_memories + + chunks = extract_memories(text) + # [{"content": "...", "memory_type": "decision", "chunk_index": 0}, ...] +""" + +import re +from typing import List, Dict, Tuple + + +# ============================================================================= +# MARKER SETS — One per memory type +# ============================================================================= + +DECISION_MARKERS = [ + r"\blet'?s (use|go with|try|pick|choose|switch to)\b", + r"\bwe (should|decided|chose|went with|picked|settled on)\b", + r"\bi'?m going (to|with)\b", + r"\bbetter (to|than|approach|option|choice)\b", + r"\binstead of\b", + r"\brather than\b", + r"\bthe reason (is|was|being)\b", + r"\bbecause\b", + r"\btrade-?off\b", + r"\bpros and cons\b", + r"\bover\b.*\bbecause\b", + r"\barchitecture\b", + r"\bapproach\b", + r"\bstrategy\b", + r"\bpattern\b", + r"\bstack\b", + r"\bframework\b", + r"\binfrastructure\b", + r"\bset (it |this )?to\b", + r"\bconfigure\b", + r"\bdefault\b", +] + +PREFERENCE_MARKERS = [ + r"\bi prefer\b", + r"\balways use\b", + r"\bnever use\b", + r"\bdon'?t (ever |like to )?(use|do|mock|stub|import)\b", + r"\bi like (to|when|how)\b", + r"\bi hate (when|how|it when)\b", + r"\bplease (always|never|don'?t)\b", + r"\bmy (rule|preference|style|convention) is\b", + r"\bwe (always|never)\b", + r"\bfunctional\b.*\bstyle\b", + r"\bimperative\b", + r"\bsnake_?case\b", + r"\bcamel_?case\b", + r"\btabs\b.*\bspaces\b", + r"\bspaces\b.*\btabs\b", + r"\buse\b.*\binstead of\b", +] + +MILESTONE_MARKERS = [ + r"\bit works\b", + r"\bit worked\b", + r"\bgot it working\b", + r"\bfixed\b", + r"\bsolved\b", + r"\bbreakthrough\b", + r"\bfigured (it )?out\b", + r"\bnailed it\b", + r"\bcracked (it|the)\b", + r"\bfinally\b", + r"\bfirst time\b", + r"\bfirst ever\b", + r"\bnever (done|been|had) before\b", + r"\bdiscovered\b", + r"\brealized\b", + r"\bfound (out|that)\b", + r"\bturns out\b", + r"\bthe key (is|was|insight)\b", + r"\bthe trick (is|was)\b", + r"\bnow i (understand|see|get it)\b", + r"\bbuilt\b", + r"\bcreated\b", + r"\bimplemented\b", + r"\bshipped\b", + r"\blaunched\b", + r"\bdeployed\b", + r"\breleased\b", + r"\bprototype\b", + r"\bproof of concept\b", + r"\bdemo\b", + r"\bversion \d", + r"\bv\d+\.\d+", + r"\d+x (compression|faster|slower|better|improvement|reduction)", + r"\d+% (reduction|improvement|faster|better|smaller)", +] + +PROBLEM_MARKERS = [ + r"\b(bug|error|crash|fail|broke|broken|issue|problem)\b", + r"\bdoesn'?t work\b", + r"\bnot working\b", + r"\bwon'?t\b.*\bwork\b", + r"\bkeeps? (failing|crashing|breaking|erroring)\b", + r"\broot cause\b", + r"\bthe (problem|issue|bug) (is|was)\b", + r"\bturns out\b.*\b(was|because|due to)\b", + r"\bthe fix (is|was)\b", + r"\bworkaround\b", + r"\bthat'?s why\b", + r"\bthe reason it\b", + r"\bfixed (it |the |by )\b", + r"\bsolution (is|was)\b", + r"\bresolved\b", + r"\bpatched\b", + r"\bthe answer (is|was)\b", + r"\b(had|need) to\b.*\binstead\b", +] + +EMOTION_MARKERS = [ + r"\blove\b", + r"\bscared\b", + r"\bafraid\b", + r"\bproud\b", + r"\bhurt\b", + r"\bhappy\b", + r"\bsad\b", + r"\bcry\b", + r"\bcrying\b", + r"\bmiss\b", + r"\bsorry\b", + r"\bgrateful\b", + r"\bangry\b", + r"\bworried\b", + r"\blonely\b", + r"\bbeautiful\b", + r"\bamazing\b", + r"\bwonderful\b", + r"i feel", + r"i'm scared", + r"i love you", + r"i'm sorry", + r"i can't", + r"i wish", + r"i miss", + r"i need", + r"never told anyone", + r"nobody knows", + r"\*[^*]+\*", +] + +ALL_MARKERS = { + "decision": DECISION_MARKERS, + "preference": PREFERENCE_MARKERS, + "milestone": MILESTONE_MARKERS, + "problem": PROBLEM_MARKERS, + "emotional": EMOTION_MARKERS, +} + + +# ============================================================================= +# SENTIMENT — for disambiguation +# ============================================================================= + +POSITIVE_WORDS = { + "pride", + "proud", + "joy", + "happy", + "love", + "loving", + "beautiful", + "amazing", + "wonderful", + "incredible", + "fantastic", + "brilliant", + "perfect", + "excited", + "thrilled", + "grateful", + "warm", + "breakthrough", + "success", + "works", + "working", + "solved", + "fixed", + "nailed", + "heart", + "hug", + "precious", + "adore", +} + +NEGATIVE_WORDS = { + "bug", + "error", + "crash", + "crashing", + "crashed", + "fail", + "failed", + "failing", + "failure", + "broken", + "broke", + "breaking", + "breaks", + "issue", + "problem", + "wrong", + "stuck", + "blocked", + "unable", + "impossible", + "missing", + "terrible", + "horrible", + "awful", + "worse", + "worst", + "panic", + "disaster", + "mess", +} + + +def _get_sentiment(text: str) -> str: + """Quick sentiment: 'positive', 'negative', or 'neutral'.""" + words = set(w.lower() for w in re.findall(r"\b\w+\b", text)) + pos = len(words & POSITIVE_WORDS) + neg = len(words & NEGATIVE_WORDS) + if pos > neg: + return "positive" + elif neg > pos: + return "negative" + return "neutral" + + +def _has_resolution(text: str) -> bool: + """Check if text describes a RESOLVED problem.""" + text_lower = text.lower() + patterns = [ + r"\bfixed\b", + r"\bsolved\b", + r"\bresolved\b", + r"\bpatched\b", + r"\bgot it working\b", + r"\bit works\b", + r"\bnailed it\b", + r"\bfigured (it )?out\b", + r"\bthe (fix|answer|solution)\b", + ] + return any(re.search(p, text_lower) for p in patterns) + + +def _disambiguate(memory_type: str, text: str, scores: Dict[str, float]) -> str: + """Fix misclassifications using sentiment + resolution.""" + sentiment = _get_sentiment(text) + + # Resolved problems are milestones + if memory_type == "problem" and _has_resolution(text): + if scores.get("emotional", 0) > 0 and sentiment == "positive": + return "emotional" + return "milestone" + + # Problem + positive sentiment => milestone or emotional + if memory_type == "problem" and sentiment == "positive": + if scores.get("milestone", 0) > 0: + return "milestone" + if scores.get("emotional", 0) > 0: + return "emotional" + + return memory_type + + +# ============================================================================= +# CODE LINE FILTERING +# ============================================================================= + +_CODE_LINE_PATTERNS = [ + re.compile(r"^\s*[\$#]\s"), + re.compile( + r"^\s*(cd|source|echo|export|pip|npm|git|python|bash|curl|wget|mkdir|rm|cp|mv|ls|cat|grep|find|chmod|sudo|brew|docker)\s" + ), + re.compile(r"^\s*```"), + re.compile(r"^\s*(import|from|def|class|function|const|let|var|return)\s"), + re.compile(r"^\s*[A-Z_]{2,}="), + re.compile(r"^\s*\|"), + re.compile(r"^\s*[-]{2,}"), + re.compile(r"^\s*[{}\[\]]\s*$"), + re.compile(r"^\s*(if|for|while|try|except|elif|else:)\b"), + re.compile(r"^\s*\w+\.\w+\("), + re.compile(r"^\s*\w+ = \w+\.\w+"), +] + + +def _is_code_line(line: str) -> bool: + stripped = line.strip() + if not stripped: + return False + for pattern in _CODE_LINE_PATTERNS: + if pattern.match(stripped): + return True + alpha_ratio = sum(1 for c in stripped if c.isalpha()) / max(len(stripped), 1) + if alpha_ratio < 0.4 and len(stripped) > 10: + return True + return False + + +def _extract_prose(text: str) -> str: + """Extract only prose lines (skip code) for classification scoring.""" + lines = text.split("\n") + prose = [] + in_code = False + for line in lines: + if line.strip().startswith("```"): + in_code = not in_code + continue + if in_code: + continue + if not _is_code_line(line): + prose.append(line) + result = "\n".join(prose).strip() + return result if result else text + + +# ============================================================================= +# SCORING +# ============================================================================= + + +def _score_markers(text: str, markers: List[str]) -> Tuple[float, List[str]]: + """Score text against regex markers. Returns (score, matched_keywords).""" + text_lower = text.lower() + score = 0.0 + keywords = [] + for marker in markers: + matches = re.findall(marker, text_lower) + if matches: + score += len(matches) + keywords.extend(m if isinstance(m, str) else m[0] if m else marker for m in matches) + return score, list(set(keywords)) + + +# ============================================================================= +# MAIN EXTRACTION +# ============================================================================= + + +def extract_memories(text: str, min_confidence: float = 0.3) -> List[Dict]: + """ + Extract memories from a text string. + + Args: + text: The text to extract from (any format). + min_confidence: Minimum confidence threshold (0.0-1.0). + + Returns: + List of dicts: {"content": str, "memory_type": str, "chunk_index": int} + """ + # Split into paragraphs (double newline or speaker-turn boundaries) + paragraphs = _split_into_segments(text) + memories = [] + + for para in paragraphs: + if len(para.strip()) < 20: + continue + + prose = _extract_prose(para) + + # Score against all types + scores = {} + for mem_type, markers in ALL_MARKERS.items(): + score, _ = _score_markers(prose, markers) + if score > 0: + scores[mem_type] = score + + if not scores: + continue + + # Length bonus + if len(para) > 500: + length_bonus = 2 + elif len(para) > 200: + length_bonus = 1 + else: + length_bonus = 0 + + max_type = max(scores, key=scores.get) + max_score = scores[max_type] + length_bonus + + # Disambiguate + max_type = _disambiguate(max_type, prose, scores) + + # Confidence + confidence = min(1.0, max_score / 5.0) + if confidence < min_confidence: + continue + + memories.append( + { + "content": para.strip(), + "memory_type": max_type, + "chunk_index": len(memories), + } + ) + + return memories + + +def _split_into_segments(text: str) -> List[str]: + """ + Split text into segments suitable for memory extraction. + + Tries speaker-turn splitting first (> markers, "Human:", "Assistant:", etc.), + then falls back to paragraph splitting. + """ + lines = text.split("\n") + + # Check for speaker-turn markers + turn_patterns = [ + re.compile(r"^>\s"), # > quoted user turn + re.compile(r"^(Human|User|Q)\s*:", re.I), # Human: / User: + re.compile(r"^(Assistant|AI|A|Claude|ChatGPT)\s*:", re.I), + ] + + turn_count = 0 + for line in lines: + stripped = line.strip() + for pat in turn_patterns: + if pat.match(stripped): + turn_count += 1 + break + + # If enough turn markers, split by turns + if turn_count >= 3: + return _split_by_turns(lines, turn_patterns) + + # Fallback: paragraph splitting + paragraphs = [p.strip() for p in text.split("\n\n") if p.strip()] + + # If single giant block, chunk by line groups + if len(paragraphs) <= 1 and len(lines) > 20: + segments = [] + for i in range(0, len(lines), 25): + group = "\n".join(lines[i : i + 25]).strip() + if group: + segments.append(group) + return segments + + return paragraphs + + +def _split_by_turns(lines: List[str], turn_patterns: List[re.Pattern]) -> List[str]: + """Split lines into segments at each speaker turn boundary.""" + segments = [] + current = [] + + for line in lines: + stripped = line.strip() + is_turn = any(pat.match(stripped) for pat in turn_patterns) + + if is_turn and current: + segments.append("\n".join(current)) + current = [line] + else: + current.append(line) + + if current: + segments.append("\n".join(current)) + + return segments + + +# ============================================================================= +# CLI +# ============================================================================= + +if __name__ == "__main__": + import sys + + if len(sys.argv) < 2: + print("Usage: python general_extractor.py ") + print() + print("Extracts decisions, preferences, milestones, problems, and") + print("emotional moments from any text file.") + sys.exit(1) + + filepath = sys.argv[1] + with open(filepath, "r", encoding="utf-8", errors="replace") as f: + text = f.read() + + memories = extract_memories(text) + + # Summary + from collections import Counter + + type_counts = Counter(m["memory_type"] for m in memories) + print(f"Extracted {len(memories)} memories:") + for mtype in ["decision", "preference", "milestone", "problem", "emotional"]: + count = type_counts.get(mtype, 0) + if count: + print(f" {mtype:12} {count}") + + print() + for m in memories[:10]: + preview = m["content"][:80].replace("\n", " ") + print(f" [{m['memory_type']:10}] {preview}...") diff --git a/mempalace/knowledge_graph.py b/mempalace/knowledge_graph.py new file mode 100644 index 0000000..fb0e91e --- /dev/null +++ b/mempalace/knowledge_graph.py @@ -0,0 +1,350 @@ +""" +knowledge_graph.py — Temporal Entity-Relationship Graph for MemPalace +===================================================================== + +Real knowledge graph with: + - Entity nodes (people, projects, tools, concepts) + - Typed relationship edges (daughter_of, does, loves, works_on, etc.) + - Temporal validity (valid_from → valid_to — knows WHEN facts are true) + - Closet references (links back to the verbatim memory) + +Storage: SQLite (local, no dependencies, no subscriptions) +Query: entity-first traversal with time filtering + +This is what competes with Zep's temporal knowledge graph. +Zep uses Neo4j in the cloud ($25/mo+). We use SQLite locally (free). + +Usage: + from mempalace.knowledge_graph import KnowledgeGraph + + kg = KnowledgeGraph() + kg.add_triple("Max", "child_of", "Alice", valid_from="2015-04-01") + kg.add_triple("Max", "does", "swimming", valid_from="2025-01-01") + kg.add_triple("Max", "loves", "chess", valid_from="2025-10-01") + + # Query: everything about Max + kg.query_entity("Max") + + # Query: what was true about Max in January 2026? + kg.query_entity("Max", as_of="2026-01-15") + + # Query: who is connected to Alice? + kg.query_entity("Alice", direction="both") + + # Invalidate: Max's sports injury resolved + kg.invalidate("Max", "has_issue", "sports_injury", ended="2026-02-15") +""" + +import hashlib +import json +import os +import sqlite3 +from datetime import date, datetime +from pathlib import Path + + +DEFAULT_KG_PATH = os.path.expanduser("~/.mempalace/knowledge_graph.sqlite3") + + +class KnowledgeGraph: + def __init__(self, db_path: str = None): + self.db_path = db_path or DEFAULT_KG_PATH + Path(self.db_path).parent.mkdir(parents=True, exist_ok=True) + self._init_db() + + def _init_db(self): + conn = self._conn() + conn.executescript(""" + CREATE TABLE IF NOT EXISTS entities ( + id TEXT PRIMARY KEY, + name TEXT NOT NULL, + type TEXT DEFAULT 'unknown', + properties TEXT DEFAULT '{}', + created_at TEXT DEFAULT CURRENT_TIMESTAMP + ); + + CREATE TABLE IF NOT EXISTS triples ( + id TEXT PRIMARY KEY, + subject TEXT NOT NULL, + predicate TEXT NOT NULL, + object TEXT NOT NULL, + valid_from TEXT, + valid_to TEXT, + confidence REAL DEFAULT 1.0, + source_closet TEXT, + source_file TEXT, + extracted_at TEXT DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (subject) REFERENCES entities(id), + FOREIGN KEY (object) REFERENCES entities(id) + ); + + CREATE INDEX IF NOT EXISTS idx_triples_subject ON triples(subject); + CREATE INDEX IF NOT EXISTS idx_triples_object ON triples(object); + CREATE INDEX IF NOT EXISTS idx_triples_predicate ON triples(predicate); + CREATE INDEX IF NOT EXISTS idx_triples_valid ON triples(valid_from, valid_to); + """) + conn.commit() + conn.close() + + def _conn(self): + return sqlite3.connect(self.db_path, timeout=10) + + def _entity_id(self, name: str) -> str: + return name.lower().replace(" ", "_").replace("'", "") + + # ── Write operations ────────────────────────────────────────────────── + + def add_entity(self, name: str, entity_type: str = "unknown", properties: dict = None): + """Add or update an entity node.""" + eid = self._entity_id(name) + props = json.dumps(properties or {}) + conn = self._conn() + conn.execute( + "INSERT OR REPLACE INTO entities (id, name, type, properties) VALUES (?, ?, ?, ?)", + (eid, name, entity_type, props) + ) + conn.commit() + conn.close() + return eid + + def add_triple(self, subject: str, predicate: str, obj: str, + valid_from: str = None, valid_to: str = None, + confidence: float = 1.0, source_closet: str = None, + source_file: str = None): + """ + Add a relationship triple: subject → predicate → object. + + Examples: + add_triple("Max", "child_of", "Alice", valid_from="2015-04-01") + add_triple("Max", "does", "swimming", valid_from="2025-01-01") + add_triple("Alice", "worried_about", "Max injury", valid_from="2026-01", valid_to="2026-02") + """ + sub_id = self._entity_id(subject) + obj_id = self._entity_id(obj) + pred = predicate.lower().replace(" ", "_") + + # Auto-create entities if they don't exist + conn = self._conn() + conn.execute( + "INSERT OR IGNORE INTO entities (id, name) VALUES (?, ?)", + (sub_id, subject) + ) + conn.execute( + "INSERT OR IGNORE INTO entities (id, name) VALUES (?, ?)", + (obj_id, obj) + ) + + # Check for existing identical triple + existing = conn.execute( + "SELECT id FROM triples WHERE subject=? AND predicate=? AND object=? AND valid_to IS NULL", + (sub_id, pred, obj_id) + ).fetchone() + + if existing: + conn.close() + return existing[0] # Already exists and still valid + + triple_id = f"t_{sub_id}_{pred}_{obj_id}_{hashlib.md5(f'{valid_from}{datetime.now().isoformat()}'.encode()).hexdigest()[:8]}" + + conn.execute( + """INSERT INTO triples (id, subject, predicate, object, valid_from, valid_to, confidence, source_closet, source_file) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)""", + (triple_id, sub_id, pred, obj_id, valid_from, valid_to, confidence, source_closet, source_file) + ) + conn.commit() + conn.close() + return triple_id + + def invalidate(self, subject: str, predicate: str, obj: str, ended: str = None): + """Mark a relationship as no longer valid (set valid_to date).""" + sub_id = self._entity_id(subject) + obj_id = self._entity_id(obj) + pred = predicate.lower().replace(" ", "_") + ended = ended or date.today().isoformat() + + conn = self._conn() + conn.execute( + "UPDATE triples SET valid_to=? WHERE subject=? AND predicate=? AND object=? AND valid_to IS NULL", + (ended, sub_id, pred, obj_id) + ) + conn.commit() + conn.close() + + # ── Query operations ────────────────────────────────────────────────── + + def query_entity(self, name: str, as_of: str = None, direction: str = "outgoing"): + """ + Get all relationships for an entity. + + direction: "outgoing" (entity → ?), "incoming" (? → entity), "both" + as_of: date string — only return facts valid at that time + """ + eid = self._entity_id(name) + conn = self._conn() + + results = [] + + if direction in ("outgoing", "both"): + query = "SELECT t.*, e.name as obj_name FROM triples t JOIN entities e ON t.object = e.id WHERE t.subject = ?" + params = [eid] + if as_of: + query += " AND (t.valid_from IS NULL OR t.valid_from <= ?) AND (t.valid_to IS NULL OR t.valid_to >= ?)" + params.extend([as_of, as_of]) + for row in conn.execute(query, params).fetchall(): + results.append({ + "direction": "outgoing", + "subject": name, + "predicate": row[2], + "object": row[10], # obj_name + "valid_from": row[4], + "valid_to": row[5], + "confidence": row[6], + "source_closet": row[7], + "current": row[5] is None, + }) + + if direction in ("incoming", "both"): + query = "SELECT t.*, e.name as sub_name FROM triples t JOIN entities e ON t.subject = e.id WHERE t.object = ?" + params = [eid] + if as_of: + query += " AND (t.valid_from IS NULL OR t.valid_from <= ?) AND (t.valid_to IS NULL OR t.valid_to >= ?)" + params.extend([as_of, as_of]) + for row in conn.execute(query, params).fetchall(): + results.append({ + "direction": "incoming", + "subject": row[10], # sub_name + "predicate": row[2], + "object": name, + "valid_from": row[4], + "valid_to": row[5], + "confidence": row[6], + "source_closet": row[7], + "current": row[5] is None, + }) + + conn.close() + return results + + def query_relationship(self, predicate: str, as_of: str = None): + """Get all triples with a given relationship type.""" + pred = predicate.lower().replace(" ", "_") + conn = self._conn() + query = """ + SELECT t.*, s.name as sub_name, o.name as obj_name + FROM triples t + JOIN entities s ON t.subject = s.id + JOIN entities o ON t.object = o.id + WHERE t.predicate = ? + """ + params = [pred] + if as_of: + query += " AND (t.valid_from IS NULL OR t.valid_from <= ?) AND (t.valid_to IS NULL OR t.valid_to >= ?)" + params.extend([as_of, as_of]) + + results = [] + for row in conn.execute(query, params).fetchall(): + results.append({ + "subject": row[10], + "predicate": pred, + "object": row[11], + "valid_from": row[4], + "valid_to": row[5], + "current": row[5] is None, + }) + conn.close() + return results + + def timeline(self, entity_name: str = None): + """Get all facts in chronological order, optionally filtered by entity.""" + conn = self._conn() + if entity_name: + eid = self._entity_id(entity_name) + rows = conn.execute(""" + SELECT t.*, s.name as sub_name, o.name as obj_name + FROM triples t + JOIN entities s ON t.subject = s.id + JOIN entities o ON t.object = o.id + WHERE (t.subject = ? OR t.object = ?) + ORDER BY t.valid_from ASC NULLS LAST + """, (eid, eid)).fetchall() + else: + rows = conn.execute(""" + SELECT t.*, s.name as sub_name, o.name as obj_name + FROM triples t + JOIN entities s ON t.subject = s.id + JOIN entities o ON t.object = o.id + ORDER BY t.valid_from ASC NULLS LAST + LIMIT 100 + """).fetchall() + + conn.close() + return [{ + "subject": r[10], + "predicate": r[2], + "object": r[11], + "valid_from": r[4], + "valid_to": r[5], + "current": r[5] is None, + } for r in rows] + + # ── Stats ───────────────────────────────────────────────────────────── + + def stats(self): + conn = self._conn() + entities = conn.execute("SELECT COUNT(*) FROM entities").fetchone()[0] + triples = conn.execute("SELECT COUNT(*) FROM triples").fetchone()[0] + current = conn.execute("SELECT COUNT(*) FROM triples WHERE valid_to IS NULL").fetchone()[0] + expired = triples - current + predicates = [r[0] for r in conn.execute( + "SELECT DISTINCT predicate FROM triples ORDER BY predicate" + ).fetchall()] + conn.close() + return { + "entities": entities, + "triples": triples, + "current_facts": current, + "expired_facts": expired, + "relationship_types": predicates, + } + + # ── Seed from known facts ───────────────────────────────────────────── + + def seed_from_entity_facts(self, entity_facts: dict): + """ + Seed the knowledge graph from fact_checker.py ENTITY_FACTS. + This bootstraps the graph with known ground truth. + """ + for key, facts in entity_facts.items(): + name = facts.get("full_name", key.capitalize()) + etype = facts.get("type", "person") + self.add_entity(name, etype, { + "gender": facts.get("gender", ""), + "birthday": facts.get("birthday", ""), + }) + + # Relationships + parent = facts.get("parent") + if parent: + self.add_triple(name, "child_of", parent.capitalize(), + valid_from=facts.get("birthday")) + + partner = facts.get("partner") + if partner: + self.add_triple(name, "married_to", partner.capitalize()) + + relationship = facts.get("relationship", "") + if relationship == "daughter": + self.add_triple(name, "is_child_of", facts.get("parent", "").capitalize() or name, + valid_from=facts.get("birthday")) + elif relationship == "husband": + self.add_triple(name, "is_partner_of", facts.get("partner", name).capitalize()) + elif relationship == "brother": + self.add_triple(name, "is_sibling_of", facts.get("sibling", name).capitalize()) + elif relationship == "dog": + self.add_triple(name, "is_pet_of", facts.get("owner", name).capitalize()) + self.add_entity(name, "animal") + + # Interests + for interest in facts.get("interests", []): + self.add_triple(name, "loves", interest.capitalize(), + valid_from="2025-01-01") diff --git a/mempalace/layers.py b/mempalace/layers.py new file mode 100644 index 0000000..2ae0947 --- /dev/null +++ b/mempalace/layers.py @@ -0,0 +1,506 @@ +#!/usr/bin/env python3 +""" +layers.py — 4-Layer Memory Stack for mempalace +=================================================== + +Load only what you need, when you need it. + + Layer 0: Identity (~100 tokens) — Always loaded. "Who am I?" + Layer 1: Essential Story (~500-800) — Always loaded. Top moments from the palace. + Layer 2: On-Demand (~200-500 each) — Loaded when a topic/wing comes up. + Layer 3: Deep Search (unlimited) — Full ChromaDB semantic search. + +Wake-up cost: ~600-900 tokens (L0+L1). Leaves 95%+ of context free. + +Reads directly from ChromaDB (mempalace_drawers) +and ~/.mempalace/identity.txt. +""" + +import os +import sys +from pathlib import Path +from collections import defaultdict + +import chromadb + +from .config import MempalaceConfig + + +# --------------------------------------------------------------------------- +# Layer 0 — Identity +# --------------------------------------------------------------------------- + + +class Layer0: + """ + ~100 tokens. Always loaded. + Reads from ~/.mempalace/identity.txt — a plain-text file the user writes. + + Example identity.txt: + I am Atlas, a personal AI assistant for Alice. + Traits: warm, direct, remembers everything. + People: Alice (creator), Bob (Alice's partner). + Project: A journaling app that helps people process emotions. + """ + + def __init__(self, identity_path: str = None): + if identity_path is None: + identity_path = os.path.expanduser("~/.mempalace/identity.txt") + self.path = identity_path + self._text = None + + def render(self) -> str: + """Return the identity text, or a sensible default.""" + if self._text is not None: + return self._text + + if os.path.exists(self.path): + with open(self.path, "r") as f: + self._text = f.read().strip() + else: + self._text = ( + "## L0 — IDENTITY\nNo identity configured. Create ~/.mempalace/identity.txt" + ) + + return self._text + + def token_estimate(self) -> int: + return len(self.render()) // 4 + + +# --------------------------------------------------------------------------- +# Layer 1 — Essential Story (auto-generated from palace) +# --------------------------------------------------------------------------- + + +class Layer1: + """ + ~500-800 tokens. Always loaded. + Auto-generated from the highest-weight / most-recent drawers in the palace. + Groups by room, picks the top N moments, compresses to a compact summary. + """ + + MAX_DRAWERS = 15 # at most 15 moments in wake-up + MAX_CHARS = 3200 # hard cap on total L1 text (~800 tokens) + + def __init__(self, palace_path: str = None, wing: str = None): + cfg = MempalaceConfig() + self.palace_path = palace_path or cfg.palace_path + self.wing = wing + + def generate(self) -> str: + """Pull top drawers from ChromaDB and format as compact L1 text.""" + try: + client = chromadb.PersistentClient(path=self.palace_path) + col = client.get_collection("mempalace_drawers") + except Exception: + return "## L1 — No palace found. Run: mempalace mine " + + # Fetch all drawers (with optional wing filter) + kwargs = {"include": ["documents", "metadatas"]} + if self.wing: + kwargs["where"] = {"wing": self.wing} + + try: + results = col.get(**kwargs) + except Exception: + return "## L1 — No drawers found." + + docs = results.get("documents", []) + metas = results.get("metadatas", []) + + if not docs: + return "## L1 — No memories yet." + + # Score each drawer: prefer high importance, recent filing + scored = [] + for doc, meta in zip(docs, metas): + importance = 3 + # Try multiple metadata keys that might carry weight info + for key in ("importance", "emotional_weight", "weight"): + val = meta.get(key) + if val is not None: + try: + importance = float(val) + except (ValueError, TypeError): + pass + break + scored.append((importance, meta, doc)) + + # Sort by importance descending, take top N + scored.sort(key=lambda x: x[0], reverse=True) + top = scored[: self.MAX_DRAWERS] + + # Group by room for readability + by_room = defaultdict(list) + for imp, meta, doc in top: + room = meta.get("room", "general") + by_room[room].append((imp, meta, doc)) + + # Build compact text + lines = ["## L1 — ESSENTIAL STORY"] + + total_len = 0 + for room, entries in sorted(by_room.items()): + room_line = f"\n[{room}]" + lines.append(room_line) + total_len += len(room_line) + + for imp, meta, doc in entries: + source = Path(meta.get("source_file", "")).name if meta.get("source_file") else "" + + # Truncate doc to keep L1 compact + snippet = doc.strip().replace("\n", " ") + if len(snippet) > 200: + snippet = snippet[:197] + "..." + + entry_line = f" - {snippet}" + if source: + entry_line += f" ({source})" + + if total_len + len(entry_line) > self.MAX_CHARS: + lines.append(" ... (more in L3 search)") + return "\n".join(lines) + + lines.append(entry_line) + total_len += len(entry_line) + + return "\n".join(lines) + + +# --------------------------------------------------------------------------- +# Layer 2 — On-Demand (wing/room filtered retrieval) +# --------------------------------------------------------------------------- + + +class Layer2: + """ + ~200-500 tokens per retrieval. + Loaded when a specific topic or wing comes up in conversation. + Queries ChromaDB with a wing/room filter. + """ + + def __init__(self, palace_path: str = None): + cfg = MempalaceConfig() + self.palace_path = palace_path or cfg.palace_path + + def retrieve(self, wing: str = None, room: str = None, n_results: int = 10) -> str: + """Retrieve drawers filtered by wing and/or room.""" + try: + client = chromadb.PersistentClient(path=self.palace_path) + col = client.get_collection("mempalace_drawers") + except Exception: + return "No palace found." + + where = {} + if wing and room: + where = {"$and": [{"wing": wing}, {"room": room}]} + elif wing: + where = {"wing": wing} + elif room: + where = {"room": room} + + kwargs = {"include": ["documents", "metadatas"], "limit": n_results} + if where: + kwargs["where"] = where + + try: + results = col.get(**kwargs) + except Exception as e: + return f"Retrieval error: {e}" + + docs = results.get("documents", []) + metas = results.get("metadatas", []) + + if not docs: + label = f"wing={wing}" if wing else "" + if room: + label += f" room={room}" if label else f"room={room}" + return f"No drawers found for {label}." + + lines = [f"## L2 — ON-DEMAND ({len(docs)} drawers)"] + for doc, meta in zip(docs[:n_results], metas[:n_results]): + room_name = meta.get("room", "?") + source = Path(meta.get("source_file", "")).name if meta.get("source_file") else "" + snippet = doc.strip().replace("\n", " ") + if len(snippet) > 300: + snippet = snippet[:297] + "..." + entry = f" [{room_name}] {snippet}" + if source: + entry += f" ({source})" + lines.append(entry) + + return "\n".join(lines) + + +# --------------------------------------------------------------------------- +# Layer 3 — Deep Search (full semantic search via ChromaDB) +# --------------------------------------------------------------------------- + + +class Layer3: + """ + Unlimited depth. Semantic search against the full palace. + Reuses searcher.py logic against mempalace_drawers. + """ + + def __init__(self, palace_path: str = None): + cfg = MempalaceConfig() + self.palace_path = palace_path or cfg.palace_path + + def search(self, query: str, wing: str = None, room: str = None, n_results: int = 5) -> str: + """Semantic search, returns compact result text.""" + try: + client = chromadb.PersistentClient(path=self.palace_path) + col = client.get_collection("mempalace_drawers") + except Exception: + return "No palace found." + + where = {} + if wing and room: + where = {"$and": [{"wing": wing}, {"room": room}]} + elif wing: + where = {"wing": wing} + elif room: + where = {"room": room} + + kwargs = { + "query_texts": [query], + "n_results": n_results, + "include": ["documents", "metadatas", "distances"], + } + if where: + kwargs["where"] = where + + try: + results = col.query(**kwargs) + except Exception as e: + return f"Search error: {e}" + + docs = results["documents"][0] + metas = results["metadatas"][0] + dists = results["distances"][0] + + if not docs: + return "No results found." + + lines = [f'## L3 — SEARCH RESULTS for "{query}"'] + for i, (doc, meta, dist) in enumerate(zip(docs, metas, dists), 1): + similarity = round(1 - dist, 3) + wing_name = meta.get("wing", "?") + room_name = meta.get("room", "?") + source = Path(meta.get("source_file", "")).name if meta.get("source_file") else "" + + snippet = doc.strip().replace("\n", " ") + if len(snippet) > 300: + snippet = snippet[:297] + "..." + + lines.append(f" [{i}] {wing_name}/{room_name} (sim={similarity})") + lines.append(f" {snippet}") + if source: + lines.append(f" src: {source}") + + return "\n".join(lines) + + def search_raw( + self, query: str, wing: str = None, room: str = None, n_results: int = 5 + ) -> list: + """Return raw dicts instead of formatted text.""" + try: + client = chromadb.PersistentClient(path=self.palace_path) + col = client.get_collection("mempalace_drawers") + except Exception: + return [] + + where = {} + if wing and room: + where = {"$and": [{"wing": wing}, {"room": room}]} + elif wing: + where = {"wing": wing} + elif room: + where = {"room": room} + + kwargs = { + "query_texts": [query], + "n_results": n_results, + "include": ["documents", "metadatas", "distances"], + } + if where: + kwargs["where"] = where + + try: + results = col.query(**kwargs) + except Exception: + return [] + + hits = [] + for doc, meta, dist in zip( + results["documents"][0], + results["metadatas"][0], + results["distances"][0], + ): + hits.append( + { + "text": doc, + "wing": meta.get("wing", "unknown"), + "room": meta.get("room", "unknown"), + "source_file": Path(meta.get("source_file", "?")).name, + "similarity": round(1 - dist, 3), + "metadata": meta, + } + ) + return hits + + +# --------------------------------------------------------------------------- +# MemoryStack — unified interface +# --------------------------------------------------------------------------- + + +class MemoryStack: + """ + The full 4-layer stack. One class, one palace, everything works. + + stack = MemoryStack() + print(stack.wake_up()) # L0 + L1 (~600-900 tokens) + print(stack.recall(wing="my_app")) # L2 on-demand + print(stack.search("pricing change")) # L3 deep search + """ + + def __init__(self, palace_path: str = None, identity_path: str = None): + cfg = MempalaceConfig() + self.palace_path = palace_path or cfg.palace_path + self.identity_path = identity_path or os.path.expanduser("~/.mempalace/identity.txt") + + self.l0 = Layer0(self.identity_path) + self.l1 = Layer1(self.palace_path) + self.l2 = Layer2(self.palace_path) + self.l3 = Layer3(self.palace_path) + + def wake_up(self, wing: str = None) -> str: + """ + Generate wake-up text: L0 (identity) + L1 (essential story). + Typically ~600-900 tokens. Inject into system prompt or first message. + + Args: + wing: Optional wing filter for L1 (project-specific wake-up). + """ + parts = [] + + # L0: Identity + parts.append(self.l0.render()) + parts.append("") + + # L1: Essential Story + if wing: + self.l1.wing = wing + parts.append(self.l1.generate()) + + return "\n".join(parts) + + def recall(self, wing: str = None, room: str = None, n_results: int = 10) -> str: + """On-demand L2 retrieval filtered by wing/room.""" + return self.l2.retrieve(wing=wing, room=room, n_results=n_results) + + def search(self, query: str, wing: str = None, room: str = None, n_results: int = 5) -> str: + """Deep L3 semantic search.""" + return self.l3.search(query, wing=wing, room=room, n_results=n_results) + + def status(self) -> dict: + """Status of all layers.""" + result = { + "palace_path": self.palace_path, + "L0_identity": { + "path": self.identity_path, + "exists": os.path.exists(self.identity_path), + "tokens": self.l0.token_estimate(), + }, + "L1_essential": { + "description": "Auto-generated from top palace drawers", + }, + "L2_on_demand": { + "description": "Wing/room filtered retrieval", + }, + "L3_deep_search": { + "description": "Full semantic search via ChromaDB", + }, + } + + # Count drawers + try: + client = chromadb.PersistentClient(path=self.palace_path) + col = client.get_collection("mempalace_drawers") + count = col.count() + result["total_drawers"] = count + except Exception: + result["total_drawers"] = 0 + + return result + + +# --------------------------------------------------------------------------- +# CLI (standalone) +# --------------------------------------------------------------------------- + +if __name__ == "__main__": + import json + + def usage(): + print("layers.py — 4-Layer Memory Stack") + print() + print("Usage:") + print(" python layers.py wake-up Show L0 + L1") + print(" python layers.py wake-up --wing=NAME Wake-up for a specific project") + print(" python layers.py recall --wing=NAME On-demand L2 retrieval") + print(" python layers.py search Deep L3 search") + print(" python layers.py status Show layer status") + sys.exit(0) + + if len(sys.argv) < 2: + usage() + + cmd = sys.argv[1] + + # Parse flags + flags = {} + positional = [] + for arg in sys.argv[2:]: + if arg.startswith("--") and "=" in arg: + key, val = arg.split("=", 1) + flags[key.lstrip("-")] = val + elif not arg.startswith("--"): + positional.append(arg) + + palace_path = flags.get("palace") + stack = MemoryStack(palace_path=palace_path) + + if cmd in ("wake-up", "wakeup"): + wing = flags.get("wing") + text = stack.wake_up(wing=wing) + tokens = len(text) // 4 + print(f"Wake-up text (~{tokens} tokens):") + print("=" * 50) + print(text) + + elif cmd == "recall": + wing = flags.get("wing") + room = flags.get("room") + text = stack.recall(wing=wing, room=room) + print(text) + + elif cmd == "search": + query = " ".join(positional) if positional else "" + if not query: + print("Usage: python layers.py search ") + sys.exit(1) + wing = flags.get("wing") + room = flags.get("room") + text = stack.search(query, wing=wing, room=room) + print(text) + + elif cmd == "status": + s = stack.status() + print(json.dumps(s, indent=2)) + + else: + usage() diff --git a/mempalace/mcp_server.py b/mempalace/mcp_server.py new file mode 100644 index 0000000..bc8f550 --- /dev/null +++ b/mempalace/mcp_server.py @@ -0,0 +1,714 @@ +#!/usr/bin/env python3 +""" +MemPalace MCP Server — read/write palace access for Claude Code +================================================================ +Install: claude mcp add mempalace -- python /path/to/mcp_server.py + +Tools (read): + mempalace_status — total drawers, wing/room breakdown + mempalace_list_wings — all wings with drawer counts + mempalace_list_rooms — rooms within a wing + mempalace_get_taxonomy — full wing → room → count tree + mempalace_search — semantic search, optional wing/room filter + mempalace_check_duplicate — check if content already exists before filing + +Tools (write): + mempalace_add_drawer — file verbatim content into a wing/room + mempalace_delete_drawer — remove a drawer by ID +""" + +import sys +import json +import logging +import hashlib +from datetime import datetime + +from .config import MempalaceConfig +from .searcher import search_memories +from .palace_graph import traverse, find_tunnels, graph_stats +from .knowledge_graph import KnowledgeGraph + +_kg = KnowledgeGraph() + +import chromadb + +logging.basicConfig(level=logging.INFO, format="%(message)s", stream=sys.stderr) +logger = logging.getLogger("mempalace_mcp") + +_config = MempalaceConfig() + + +def _get_collection(create=False): + """Return the ChromaDB collection, or None on failure.""" + try: + client = chromadb.PersistentClient(path=_config.palace_path) + if create: + return client.get_or_create_collection(_config.collection_name) + return client.get_collection(_config.collection_name) + except Exception: + return None + + +def _no_palace(): + return { + "error": "No palace found", + "palace_path": _config.palace_path, + "hint": "Run: mempalace init && mempalace mine ", + } + + +# ==================== READ TOOLS ==================== + + +def tool_status(): + col = _get_collection() + if not col: + return _no_palace() + count = col.count() + wings = {} + rooms = {} + try: + all_meta = col.get(include=["metadatas"])["metadatas"] + for m in all_meta: + w = m.get("wing", "unknown") + r = m.get("room", "unknown") + wings[w] = wings.get(w, 0) + 1 + rooms[r] = rooms.get(r, 0) + 1 + except Exception: + pass + return { + "total_drawers": count, + "wings": wings, + "rooms": rooms, + "palace_path": _config.palace_path, + "protocol": PALACE_PROTOCOL, + "aaak_dialect": AAAK_SPEC, + } + + +# ── AAAK Dialect Spec ───────────────────────────────────────────────────────── +# Included in status response so the AI learns it on first wake-up call. +# Also available via mempalace_get_aaak_spec tool. + +PALACE_PROTOCOL = """IMPORTANT — MemPalace Memory Protocol: +1. ON WAKE-UP: Call mempalace_status to load palace overview + AAAK spec. +2. BEFORE RESPONDING about any person, project, or past event: call mempalace_kg_query or mempalace_search FIRST. Never guess — verify. +3. IF UNSURE about a fact (name, gender, age, relationship): say "let me check" and query the palace. Wrong is worse than slow. +4. AFTER EACH SESSION: call mempalace_diary_write to record what happened, what you learned, what matters. +5. WHEN FACTS CHANGE: call mempalace_kg_invalidate on the old fact, mempalace_kg_add for the new one. + +This protocol ensures the AI KNOWS before it speaks. Storage is not memory — but storage + this protocol = memory.""" + +AAAK_SPEC = """AAAK is a compressed memory dialect that MemPalace uses for efficient storage. +It is designed to be readable by both humans and LLMs without decoding. + +FORMAT: + ENTITIES: 3-letter uppercase codes. ALC=Alice, JOR=Jordan, RIL=Riley, MAX=Max, BEN=Ben. + EMOTIONS: *action markers* before/during text. *warm*=joy, *fierce*=determined, *raw*=vulnerable, *bloom*=tenderness. + STRUCTURE: Pipe-separated fields. FAM: family | PROJ: projects | ⚠: warnings/reminders. + DATES: ISO format (2026-03-31). COUNTS: Nx = N mentions (e.g., 570x). + IMPORTANCE: ★ to ★★★★★ (1-5 scale). + HALLS: hall_facts, hall_events, hall_discoveries, hall_preferences, hall_advice. + WINGS: wing_user, wing_agent, wing_team, wing_code, wing_myproject, wing_hardware, wing_ue5, wing_ai_research. + ROOMS: Hyphenated slugs representing named ideas (e.g., chromadb-setup, gpu-pricing). + +EXAMPLE: + FAM: ALC→♡JOR | 2D(kids): RIL(18,sports) MAX(11,chess+swimming) | BEN(contributor) + +Read AAAK naturally — expand codes mentally, treat *markers* as emotional context. +When WRITING AAAK: use entity codes, mark emotions, keep structure tight.""" + + +def tool_list_wings(): + col = _get_collection() + if not col: + return _no_palace() + wings = {} + try: + all_meta = col.get(include=["metadatas"])["metadatas"] + for m in all_meta: + w = m.get("wing", "unknown") + wings[w] = wings.get(w, 0) + 1 + except Exception: + pass + return {"wings": wings} + + +def tool_list_rooms(wing: str = None): + col = _get_collection() + if not col: + return _no_palace() + rooms = {} + try: + kwargs = {"include": ["metadatas"]} + if wing: + kwargs["where"] = {"wing": wing} + all_meta = col.get(**kwargs)["metadatas"] + for m in all_meta: + r = m.get("room", "unknown") + rooms[r] = rooms.get(r, 0) + 1 + except Exception: + pass + return {"wing": wing or "all", "rooms": rooms} + + +def tool_get_taxonomy(): + col = _get_collection() + if not col: + return _no_palace() + taxonomy = {} + try: + all_meta = col.get(include=["metadatas"])["metadatas"] + for m in all_meta: + w = m.get("wing", "unknown") + r = m.get("room", "unknown") + if w not in taxonomy: + taxonomy[w] = {} + taxonomy[w][r] = taxonomy[w].get(r, 0) + 1 + except Exception: + pass + return {"taxonomy": taxonomy} + + +def tool_search(query: str, limit: int = 5, wing: str = None, room: str = None): + return search_memories( + query, + palace_path=_config.palace_path, + wing=wing, + room=room, + n_results=limit, + ) + + +def tool_check_duplicate(content: str, threshold: float = 0.9): + col = _get_collection() + if not col: + return _no_palace() + try: + results = col.query( + query_texts=[content], + n_results=5, + include=["metadatas", "documents", "distances"], + ) + duplicates = [] + if results["ids"] and results["ids"][0]: + for i, drawer_id in enumerate(results["ids"][0]): + dist = results["distances"][0][i] + similarity = round(1 - dist, 3) + if similarity >= threshold: + meta = results["metadatas"][0][i] + doc = results["documents"][0][i] + duplicates.append( + { + "id": drawer_id, + "wing": meta.get("wing", "?"), + "room": meta.get("room", "?"), + "similarity": similarity, + "content": doc[:200] + "..." if len(doc) > 200 else doc, + } + ) + return { + "is_duplicate": len(duplicates) > 0, + "matches": duplicates, + } + except Exception as e: + return {"error": str(e)} + + +def tool_get_aaak_spec(): + """Return the AAAK dialect specification.""" + return {"aaak_spec": AAAK_SPEC} + + +def tool_traverse_graph(start_room: str, max_hops: int = 2): + """Walk the palace graph from a room. Find connected ideas across wings.""" + col = _get_collection() + if not col: + return _no_palace() + return traverse(start_room, col=col, max_hops=max_hops) + + +def tool_find_tunnels(wing_a: str = None, wing_b: str = None): + """Find rooms that bridge two wings — the hallways connecting domains.""" + col = _get_collection() + if not col: + return _no_palace() + return find_tunnels(wing_a, wing_b, col=col) + + +def tool_graph_stats(): + """Palace graph overview: nodes, tunnels, edges, connectivity.""" + col = _get_collection() + if not col: + return _no_palace() + return graph_stats(col=col) + + +# ==================== WRITE TOOLS ==================== + + +def tool_add_drawer( + wing: str, room: str, content: str, source_file: str = None, added_by: str = "mcp" +): + """File verbatim content into a wing/room. Checks for duplicates first.""" + col = _get_collection(create=True) + if not col: + return _no_palace() + + # Duplicate check + dup = tool_check_duplicate(content, threshold=0.9) + if dup.get("is_duplicate"): + return { + "success": False, + "reason": "duplicate", + "matches": dup["matches"], + } + + drawer_id = f"drawer_{wing}_{room}_{hashlib.md5((content[:100] + datetime.now().isoformat()).encode()).hexdigest()[:16]}" + + try: + col.add( + ids=[drawer_id], + documents=[content], + metadatas=[ + { + "wing": wing, + "room": room, + "source_file": source_file or "", + "chunk_index": 0, + "added_by": added_by, + "filed_at": datetime.now().isoformat(), + } + ], + ) + logger.info(f"Filed drawer: {drawer_id} → {wing}/{room}") + return {"success": True, "drawer_id": drawer_id, "wing": wing, "room": room} + except Exception as e: + return {"success": False, "error": str(e)} + + +def tool_delete_drawer(drawer_id: str): + """Delete a single drawer by ID.""" + col = _get_collection() + if not col: + return _no_palace() + existing = col.get(ids=[drawer_id]) + if not existing["ids"]: + return {"success": False, "error": f"Drawer not found: {drawer_id}"} + try: + col.delete(ids=[drawer_id]) + logger.info(f"Deleted drawer: {drawer_id}") + return {"success": True, "drawer_id": drawer_id} + except Exception as e: + return {"success": False, "error": str(e)} + + +# ==================== KNOWLEDGE GRAPH ==================== + + +def tool_kg_query(entity: str, as_of: str = None, direction: str = "both"): + """Query the knowledge graph for an entity's relationships.""" + results = _kg.query_entity(entity, as_of=as_of, direction=direction) + return {"entity": entity, "as_of": as_of, "facts": results, "count": len(results)} + + +def tool_kg_add(subject: str, predicate: str, object: str, + valid_from: str = None, source_closet: str = None): + """Add a relationship to the knowledge graph.""" + triple_id = _kg.add_triple(subject, predicate, object, + valid_from=valid_from, source_closet=source_closet) + return {"success": True, "triple_id": triple_id, + "fact": f"{subject} → {predicate} → {object}"} + + +def tool_kg_invalidate(subject: str, predicate: str, object: str, ended: str = None): + """Mark a fact as no longer true (set end date).""" + _kg.invalidate(subject, predicate, object, ended=ended) + return {"success": True, "fact": f"{subject} → {predicate} → {object}", "ended": ended or "today"} + + +def tool_kg_timeline(entity: str = None): + """Get chronological timeline of facts, optionally for one entity.""" + results = _kg.timeline(entity) + return {"entity": entity or "all", "timeline": results, "count": len(results)} + + +def tool_kg_stats(): + """Knowledge graph overview: entities, triples, relationship types.""" + return _kg.stats() + + +# ==================== AGENT DIARY ==================== + + +def tool_diary_write(agent_name: str, entry: str, topic: str = "general"): + """ + Write a diary entry for this agent. Each agent gets its own wing + with a diary room. Entries are timestamped and accumulate over time. + + This is the agent's personal journal — observations, thoughts, + what it worked on, what it noticed, what it thinks matters. + """ + wing = f"wing_{agent_name.lower().replace(' ', '_')}" + room = "diary" + col = _get_collection(create=True) + if not col: + return _no_palace() + + now = datetime.now() + entry_id = f"diary_{wing}_{now.strftime('%Y%m%d_%H%M%S')}_{hashlib.md5(entry[:50].encode()).hexdigest()[:8]}" + + try: + col.add( + ids=[entry_id], + documents=[entry], + metadatas=[{ + "wing": wing, + "room": room, + "hall": "hall_diary", + "topic": topic, + "type": "diary_entry", + "agent": agent_name, + "filed_at": now.isoformat(), + "date": now.strftime("%Y-%m-%d"), + }], + ) + logger.info(f"Diary entry: {entry_id} → {wing}/diary/{topic}") + return { + "success": True, + "entry_id": entry_id, + "agent": agent_name, + "topic": topic, + "timestamp": now.isoformat(), + } + except Exception as e: + return {"success": False, "error": str(e)} + + +def tool_diary_read(agent_name: str, last_n: int = 10): + """ + Read an agent's recent diary entries. Returns the last N entries + in chronological order — the agent's personal journal. + """ + wing = f"wing_{agent_name.lower().replace(' ', '_')}" + col = _get_collection() + if not col: + return _no_palace() + + try: + results = col.get( + where={"$and": [{"wing": wing}, {"room": "diary"}]}, + include=["documents", "metadatas"], + ) + + if not results["ids"]: + return {"agent": agent_name, "entries": [], "message": "No diary entries yet."} + + # Combine and sort by timestamp + entries = [] + for doc, meta in zip(results["documents"], results["metadatas"]): + entries.append({ + "date": meta.get("date", ""), + "timestamp": meta.get("filed_at", ""), + "topic": meta.get("topic", ""), + "content": doc, + }) + + entries.sort(key=lambda x: x["timestamp"], reverse=True) + entries = entries[:last_n] + + return { + "agent": agent_name, + "entries": entries, + "total": len(results["ids"]), + "showing": len(entries), + } + except Exception as e: + return {"error": str(e)} + + +# ==================== MCP PROTOCOL ==================== + +TOOLS = { + "mempalace_status": { + "description": "Palace overview — total drawers, wing and room counts", + "input_schema": {"type": "object", "properties": {}}, + "handler": tool_status, + }, + "mempalace_list_wings": { + "description": "List all wings with drawer counts", + "input_schema": {"type": "object", "properties": {}}, + "handler": tool_list_wings, + }, + "mempalace_list_rooms": { + "description": "List rooms within a wing (or all rooms if no wing given)", + "input_schema": { + "type": "object", + "properties": { + "wing": {"type": "string", "description": "Wing to list rooms for (optional)"}, + }, + }, + "handler": tool_list_rooms, + }, + "mempalace_get_taxonomy": { + "description": "Full taxonomy: wing → room → drawer count", + "input_schema": {"type": "object", "properties": {}}, + "handler": tool_get_taxonomy, + }, + "mempalace_get_aaak_spec": { + "description": "Get the AAAK dialect specification — the compressed memory format MemPalace uses. Call this if you need to read or write AAAK-compressed memories.", + "input_schema": {"type": "object", "properties": {}}, + "handler": tool_get_aaak_spec, + }, + "mempalace_kg_query": { + "description": "Query the knowledge graph for an entity's relationships. Returns typed facts with temporal validity. E.g. 'Max' → child_of Alice, loves chess, does swimming. Filter by date with as_of to see what was true at a point in time.", + "input_schema": { + "type": "object", + "properties": { + "entity": {"type": "string", "description": "Entity to query (e.g. 'Max', 'MyProject', 'Alice')"}, + "as_of": {"type": "string", "description": "Date filter — only facts valid at this date (YYYY-MM-DD, optional)"}, + "direction": {"type": "string", "description": "outgoing (entity→?), incoming (?→entity), or both (default: both)"}, + }, + "required": ["entity"], + }, + "handler": tool_kg_query, + }, + "mempalace_kg_add": { + "description": "Add a fact to the knowledge graph. Subject → predicate → object with optional time window. E.g. ('Max', 'started_school', 'Year 7', valid_from='2026-09-01').", + "input_schema": { + "type": "object", + "properties": { + "subject": {"type": "string", "description": "The entity doing/being something"}, + "predicate": {"type": "string", "description": "The relationship type (e.g. 'loves', 'works_on', 'daughter_of')"}, + "object": {"type": "string", "description": "The entity being connected to"}, + "valid_from": {"type": "string", "description": "When this became true (YYYY-MM-DD, optional)"}, + "source_closet": {"type": "string", "description": "Closet ID where this fact appears (optional)"}, + }, + "required": ["subject", "predicate", "object"], + }, + "handler": tool_kg_add, + }, + "mempalace_kg_invalidate": { + "description": "Mark a fact as no longer true. E.g. ankle injury resolved, job ended, moved house.", + "input_schema": { + "type": "object", + "properties": { + "subject": {"type": "string", "description": "Entity"}, + "predicate": {"type": "string", "description": "Relationship"}, + "object": {"type": "string", "description": "Connected entity"}, + "ended": {"type": "string", "description": "When it stopped being true (YYYY-MM-DD, default: today)"}, + }, + "required": ["subject", "predicate", "object"], + }, + "handler": tool_kg_invalidate, + }, + "mempalace_kg_timeline": { + "description": "Chronological timeline of facts. Shows the story of an entity (or everything) in order.", + "input_schema": { + "type": "object", + "properties": { + "entity": {"type": "string", "description": "Entity to get timeline for (optional — omit for full timeline)"}, + }, + }, + "handler": tool_kg_timeline, + }, + "mempalace_kg_stats": { + "description": "Knowledge graph overview: entities, triples, current vs expired facts, relationship types.", + "input_schema": {"type": "object", "properties": {}}, + "handler": tool_kg_stats, + }, + "mempalace_traverse": { + "description": "Walk the palace graph from a room. Shows connected ideas across wings — the tunnels. Like following a thread through the palace: start at 'chromadb-setup' in wing_code, discover it connects to wing_myproject (planning) and wing_user (feelings about it).", + "input_schema": { + "type": "object", + "properties": { + "start_room": {"type": "string", "description": "Room to start from (e.g. 'chromadb-setup', 'riley-school')"}, + "max_hops": {"type": "integer", "description": "How many connections to follow (default: 2)"}, + }, + "required": ["start_room"], + }, + "handler": tool_traverse_graph, + }, + "mempalace_find_tunnels": { + "description": "Find rooms that bridge two wings — the hallways connecting different domains. E.g. what topics connect wing_code to wing_team?", + "input_schema": { + "type": "object", + "properties": { + "wing_a": {"type": "string", "description": "First wing (optional)"}, + "wing_b": {"type": "string", "description": "Second wing (optional)"}, + }, + }, + "handler": tool_find_tunnels, + }, + "mempalace_graph_stats": { + "description": "Palace graph overview: total rooms, tunnel connections, edges between wings.", + "input_schema": {"type": "object", "properties": {}}, + "handler": tool_graph_stats, + }, + "mempalace_search": { + "description": "Semantic search. Returns verbatim drawer content with similarity scores.", + "input_schema": { + "type": "object", + "properties": { + "query": {"type": "string", "description": "What to search for"}, + "limit": {"type": "integer", "description": "Max results (default 5)"}, + "wing": {"type": "string", "description": "Filter by wing (optional)"}, + "room": {"type": "string", "description": "Filter by room (optional)"}, + }, + "required": ["query"], + }, + "handler": tool_search, + }, + "mempalace_check_duplicate": { + "description": "Check if content already exists in the palace before filing", + "input_schema": { + "type": "object", + "properties": { + "content": {"type": "string", "description": "Content to check"}, + "threshold": { + "type": "number", + "description": "Similarity threshold 0-1 (default 0.9)", + }, + }, + "required": ["content"], + }, + "handler": tool_check_duplicate, + }, + "mempalace_add_drawer": { + "description": "File verbatim content into the palace. Checks for duplicates first.", + "input_schema": { + "type": "object", + "properties": { + "wing": {"type": "string", "description": "Wing (project name)"}, + "room": { + "type": "string", + "description": "Room (aspect: backend, decisions, meetings...)", + }, + "content": { + "type": "string", + "description": "Verbatim content to store — exact words, never summarized", + }, + "source_file": {"type": "string", "description": "Where this came from (optional)"}, + "added_by": {"type": "string", "description": "Who is filing this (default: mcp)"}, + }, + "required": ["wing", "room", "content"], + }, + "handler": tool_add_drawer, + }, + "mempalace_delete_drawer": { + "description": "Delete a drawer by ID. Irreversible.", + "input_schema": { + "type": "object", + "properties": { + "drawer_id": {"type": "string", "description": "ID of the drawer to delete"}, + }, + "required": ["drawer_id"], + }, + "handler": tool_delete_drawer, + }, + "mempalace_diary_write": { + "description": "Write to your personal agent diary in AAAK format. Your observations, thoughts, what you worked on, what matters. Each agent has their own diary with full history. Write in AAAK for compression — e.g. 'SESSION:2026-04-04|built.palace.graph+diary.tools|ALC.req:agent.diaries.in.aaak|★★★'. Use entity codes from the AAAK spec.", + "input_schema": { + "type": "object", + "properties": { + "agent_name": {"type": "string", "description": "Your name — each agent gets their own diary wing"}, + "entry": {"type": "string", "description": "Your diary entry in AAAK format — compressed, entity-coded, emotion-marked"}, + "topic": {"type": "string", "description": "Topic tag (optional, default: general)"}, + }, + "required": ["agent_name", "entry"], + }, + "handler": tool_diary_write, + }, + "mempalace_diary_read": { + "description": "Read your recent diary entries (in AAAK). See what past versions of yourself recorded — your journal across sessions.", + "input_schema": { + "type": "object", + "properties": { + "agent_name": {"type": "string", "description": "Your name — each agent gets their own diary wing"}, + "last_n": {"type": "integer", "description": "Number of recent entries to read (default: 10)"}, + }, + "required": ["agent_name"], + }, + "handler": tool_diary_read, + }, +} + + +def handle_request(request): + method = request.get("method", "") + params = request.get("params", {}) + req_id = request.get("id") + + if method == "initialize": + return { + "jsonrpc": "2.0", + "id": req_id, + "result": { + "protocolVersion": "2024-11-05", + "capabilities": {"tools": {}}, + "serverInfo": {"name": "mempalace", "version": "2.0.0"}, + }, + } + elif method == "notifications/initialized": + return None + elif method == "tools/list": + return { + "jsonrpc": "2.0", + "id": req_id, + "result": { + "tools": [ + {"name": n, "description": t["description"], "inputSchema": t["input_schema"]} + for n, t in TOOLS.items() + ] + }, + } + elif method == "tools/call": + tool_name = params.get("name") + tool_args = params.get("arguments", {}) + if tool_name not in TOOLS: + return { + "jsonrpc": "2.0", + "id": req_id, + "error": {"code": -32601, "message": f"Unknown tool: {tool_name}"}, + } + try: + result = TOOLS[tool_name]["handler"](**tool_args) + return { + "jsonrpc": "2.0", + "id": req_id, + "result": {"content": [{"type": "text", "text": json.dumps(result, indent=2)}]}, + } + except Exception as e: + logger.error(f"Tool error in {tool_name}: {e}") + return {"jsonrpc": "2.0", "id": req_id, "error": {"code": -32000, "message": str(e)}} + + return { + "jsonrpc": "2.0", + "id": req_id, + "error": {"code": -32601, "message": f"Unknown method: {method}"}, + } + + +def main(): + logger.info("MemPalace MCP Server starting...") + while True: + try: + line = sys.stdin.readline() + if not line: + break + line = line.strip() + if not line: + continue + request = json.loads(line) + response = handle_request(request) + if response is not None: + sys.stdout.write(json.dumps(response) + "\n") + sys.stdout.flush() + except KeyboardInterrupt: + break + except Exception as e: + logger.error(f"Server error: {e}") + + +if __name__ == "__main__": + main() diff --git a/mempalace/miner.py b/mempalace/miner.py new file mode 100644 index 0000000..ecd313d --- /dev/null +++ b/mempalace/miner.py @@ -0,0 +1,417 @@ +#!/usr/bin/env python3 +""" +miner.py — Files everything into the palace. + +Reads mempalace.yaml from the project directory to know the wing + rooms. +Routes each file to the right room based on content. +Stores verbatim chunks as drawers. No summaries. Ever. +""" + +import os +import sys +import hashlib +from pathlib import Path +from datetime import datetime +from collections import defaultdict + +import chromadb + +READABLE_EXTENSIONS = { + ".txt", + ".md", + ".py", + ".js", + ".ts", + ".jsx", + ".tsx", + ".json", + ".yaml", + ".yml", + ".html", + ".css", + ".java", + ".go", + ".rs", + ".rb", + ".sh", + ".csv", + ".sql", + ".toml", +} + +SKIP_DIRS = { + ".git", + "node_modules", + "__pycache__", + ".venv", + "venv", + "env", + "dist", + "build", + ".next", + "coverage", + ".mempalace", +} + +CHUNK_SIZE = 800 # chars per drawer +CHUNK_OVERLAP = 100 # overlap between chunks +MIN_CHUNK_SIZE = 50 # skip tiny chunks + + +# ============================================================================= +# CONFIG +# ============================================================================= + + +def load_config(project_dir: str) -> dict: + """Load mempalace.yaml from project directory (falls back to mempal.yaml).""" + import yaml + + config_path = Path(project_dir).expanduser().resolve() / "mempalace.yaml" + if not config_path.exists(): + # Fallback to legacy name + legacy_path = Path(project_dir).expanduser().resolve() / "mempal.yaml" + if legacy_path.exists(): + config_path = legacy_path + else: + print(f"ERROR: No mempalace.yaml found in {project_dir}") + print(f"Run: mempalace init {project_dir}") + sys.exit(1) + with open(config_path) as f: + return yaml.safe_load(f) + + +# ============================================================================= +# FILE ROUTING — which room does this file belong to? +# ============================================================================= + + +def detect_room(filepath: Path, content: str, rooms: list, project_path: Path) -> str: + """ + Route a file to the right room. + Priority: + 1. Folder path matches a room name + 2. Filename matches a room name or keyword + 3. Content keyword scoring + 4. Fallback: "general" + """ + relative = str(filepath.relative_to(project_path)).lower() + filename = filepath.stem.lower() + content_lower = content[:2000].lower() + + # Priority 1: folder path contains room name + path_parts = relative.replace("\\", "/").split("/") + for part in path_parts[:-1]: # skip filename itself + for room in rooms: + if room["name"].lower() in part or part in room["name"].lower(): + return room["name"] + + # Priority 2: filename matches room name + for room in rooms: + if room["name"].lower() in filename or filename in room["name"].lower(): + return room["name"] + + # Priority 3: keyword scoring from room keywords + name + scores = defaultdict(int) + for room in rooms: + keywords = room.get("keywords", []) + [room["name"]] + for kw in keywords: + count = content_lower.count(kw.lower()) + scores[room["name"]] += count + + if scores: + best = max(scores, key=scores.get) + if scores[best] > 0: + return best + + return "general" + + +# ============================================================================= +# CHUNKING +# ============================================================================= + + +def chunk_text(content: str, source_file: str) -> list: + """ + Split content into drawer-sized chunks. + Tries to split on paragraph/line boundaries. + Returns list of {"content": str, "chunk_index": int} + """ + # Clean up + content = content.strip() + if not content: + return [] + + chunks = [] + start = 0 + chunk_index = 0 + + while start < len(content): + end = min(start + CHUNK_SIZE, len(content)) + + # Try to break at paragraph boundary + if end < len(content): + newline_pos = content.rfind("\n\n", start, end) + if newline_pos > start + CHUNK_SIZE // 2: + end = newline_pos + else: + newline_pos = content.rfind("\n", start, end) + if newline_pos > start + CHUNK_SIZE // 2: + end = newline_pos + + chunk = content[start:end].strip() + if len(chunk) >= MIN_CHUNK_SIZE: + chunks.append( + { + "content": chunk, + "chunk_index": chunk_index, + } + ) + chunk_index += 1 + + start = end - CHUNK_OVERLAP if end < len(content) else end + + return chunks + + +# ============================================================================= +# PALACE — ChromaDB operations +# ============================================================================= + + +def get_collection(palace_path: str): + os.makedirs(palace_path, exist_ok=True) + client = chromadb.PersistentClient(path=palace_path) + try: + return client.get_collection("mempalace_drawers") + except Exception: + return client.create_collection("mempalace_drawers") + + +def file_already_mined(collection, source_file: str) -> bool: + """Fast check: has this file been filed before?""" + try: + results = collection.get(where={"source_file": source_file}, limit=1) + return len(results.get("ids", [])) > 0 + except Exception: + return False + + +def add_drawer( + collection, wing: str, room: str, content: str, source_file: str, chunk_index: int, agent: str +): + """Add one drawer to the palace.""" + drawer_id = f"drawer_{wing}_{room}_{hashlib.md5((source_file + str(chunk_index)).encode()).hexdigest()[:16]}" + try: + collection.add( + documents=[content], + ids=[drawer_id], + metadatas=[ + { + "wing": wing, + "room": room, + "source_file": source_file, + "chunk_index": chunk_index, + "added_by": agent, + "filed_at": datetime.now().isoformat(), + } + ], + ) + return True + except Exception as e: + if "already exists" in str(e).lower() or "duplicate" in str(e).lower(): + return False + raise + + +# ============================================================================= +# PROCESS ONE FILE +# ============================================================================= + + +def process_file( + filepath: Path, + project_path: Path, + collection, + wing: str, + rooms: list, + agent: str, + dry_run: bool, +) -> int: + """Read, chunk, route, and file one file. Returns drawer count.""" + + # Skip if already filed + source_file = str(filepath) + if not dry_run and file_already_mined(collection, source_file): + return 0 + + try: + content = filepath.read_text(encoding="utf-8", errors="replace") + except Exception: + return 0 + + content = content.strip() + if len(content) < MIN_CHUNK_SIZE: + return 0 + + room = detect_room(filepath, content, rooms, project_path) + chunks = chunk_text(content, source_file) + + if dry_run: + print(f" [DRY RUN] {filepath.name} → room:{room} ({len(chunks)} drawers)") + return len(chunks) + + drawers_added = 0 + for chunk in chunks: + added = add_drawer( + collection=collection, + wing=wing, + room=room, + content=chunk["content"], + source_file=source_file, + chunk_index=chunk["chunk_index"], + agent=agent, + ) + if added: + drawers_added += 1 + + return drawers_added + + +# ============================================================================= +# SCAN PROJECT +# ============================================================================= + + +def scan_project(project_dir: str) -> list: + """Return list of all readable file paths.""" + project_path = Path(project_dir).expanduser().resolve() + files = [] + for root, dirs, filenames in os.walk(project_path): + dirs[:] = [d for d in dirs if d not in SKIP_DIRS] + for filename in filenames: + filepath = Path(root) / filename + if filepath.suffix.lower() in READABLE_EXTENSIONS: + # Skip config files + if filename in ( + "mempalace.yaml", + "mempalace.yml", + "mempal.yaml", + "mempal.yml", + ".gitignore", + "package-lock.json", + ): + continue + files.append(filepath) + return files + + +# ============================================================================= +# MAIN: MINE +# ============================================================================= + + +def mine( + project_dir: str, + palace_path: str, + wing_override: str = None, + agent: str = "mempalace", + limit: int = 0, + dry_run: bool = False, +): + """Mine a project directory into the palace.""" + + project_path = Path(project_dir).expanduser().resolve() + config = load_config(project_dir) + + wing = wing_override or config["wing"] + rooms = config.get("rooms", [{"name": "general", "description": "All project files"}]) + + files = scan_project(project_dir) + if limit > 0: + files = files[:limit] + + print(f"\n{'=' * 55}") + print(" MemPalace Mine") + print(f"{'=' * 55}") + print(f" Wing: {wing}") + print(f" Rooms: {', '.join(r['name'] for r in rooms)}") + print(f" Files: {len(files)}") + print(f" Palace: {palace_path}") + if dry_run: + print(" DRY RUN — nothing will be filed") + print(f"{'─' * 55}\n") + + if not dry_run: + collection = get_collection(palace_path) + else: + collection = None + + total_drawers = 0 + files_skipped = 0 + room_counts = defaultdict(int) + + for i, filepath in enumerate(files, 1): + drawers = process_file( + filepath=filepath, + project_path=project_path, + collection=collection, + wing=wing, + rooms=rooms, + agent=agent, + dry_run=dry_run, + ) + if drawers == 0 and not dry_run: + files_skipped += 1 + else: + total_drawers += drawers + room = detect_room(filepath, "", rooms, project_path) + room_counts[room] += 1 + if not dry_run: + print(f" ✓ [{i:4}/{len(files)}] {filepath.name[:50]:50} +{drawers}") + + print(f"\n{'=' * 55}") + print(" Done.") + print(f" Files processed: {len(files) - files_skipped}") + print(f" Files skipped (already filed): {files_skipped}") + print(f" Drawers filed: {total_drawers}") + print("\n By room:") + for room, count in sorted(room_counts.items(), key=lambda x: x[1], reverse=True): + print(f" {room:20} {count} files") + print('\n Next: mempalace search "what you\'re looking for"') + print(f"{'=' * 55}\n") + + +# ============================================================================= +# STATUS +# ============================================================================= + + +def status(palace_path: str): + """Show what's been filed in the palace.""" + try: + client = chromadb.PersistentClient(path=palace_path) + col = client.get_collection("mempalace_drawers") + except Exception: + print(f"\n No palace found at {palace_path}") + print(" Run: mempalace init then mempalace mine ") + return + + # Count by wing and room + r = col.get(limit=10000, include=["metadatas"]) + metas = r["metadatas"] + + wing_rooms = defaultdict(lambda: defaultdict(int)) + for m in metas: + wing_rooms[m.get("wing", "?")][m.get("room", "?")] += 1 + + print(f"\n{'=' * 55}") + print(f" MemPalace Status — {len(metas)} drawers") + print(f"{'=' * 55}\n") + for wing, rooms in sorted(wing_rooms.items()): + print(f" WING: {wing}") + for room, count in sorted(rooms.items(), key=lambda x: x[1], reverse=True): + print(f" ROOM: {room:20} {count:5} drawers") + print() + print(f"{'=' * 55}\n") diff --git a/mempalace/normalize.py b/mempalace/normalize.py new file mode 100644 index 0000000..62124e9 --- /dev/null +++ b/mempalace/normalize.py @@ -0,0 +1,253 @@ +#!/usr/bin/env python3 +""" +normalize.py — Convert any chat export format to MemPalace transcript format. + +Supported: + - Plain text with > markers (pass through) + - Claude.ai JSON export + - ChatGPT conversations.json + - Claude Code JSONL + - Slack JSON export + - Plain text (pass through for paragraph chunking) + +No API key. No internet. Everything local. +""" + +import json +import os +from pathlib import Path +from typing import Optional + + +def normalize(filepath: str) -> str: + """ + Load a file and normalize to transcript format if it's a chat export. + Plain text files pass through unchanged. + """ + try: + with open(filepath, "r", encoding="utf-8", errors="replace") as f: + content = f.read() + except Exception as e: + raise IOError(f"Could not read {filepath}: {e}") + + if not content.strip(): + return content + + # Already has > markers — pass through + lines = content.split("\n") + if sum(1 for line in lines if line.strip().startswith(">")) >= 3: + return content + + # Try JSON normalization + ext = Path(filepath).suffix.lower() + if ext in (".json", ".jsonl") or content.strip()[:1] in ("{", "["): + normalized = _try_normalize_json(content) + if normalized: + return normalized + + return content + + +def _try_normalize_json(content: str) -> Optional[str]: + """Try all known JSON chat schemas.""" + + normalized = _try_claude_code_jsonl(content) + if normalized: + return normalized + + try: + data = json.loads(content) + except json.JSONDecodeError: + return None + + for parser in (_try_claude_ai_json, _try_chatgpt_json, _try_slack_json): + normalized = parser(data) + if normalized: + return normalized + + return None + + +def _try_claude_code_jsonl(content: str) -> Optional[str]: + """Claude Code JSONL sessions.""" + lines = [line.strip() for line in content.strip().split("\n") if line.strip()] + messages = [] + for line in lines: + try: + entry = json.loads(line) + except json.JSONDecodeError: + continue + if not isinstance(entry, dict): + continue + msg_type = entry.get("type", "") + message = entry.get("message", {}) + if msg_type == "human": + text = _extract_content(message.get("content", "")) + if text: + messages.append(("user", text)) + elif msg_type == "assistant": + text = _extract_content(message.get("content", "")) + if text: + messages.append(("assistant", text)) + if len(messages) >= 2: + return _messages_to_transcript(messages) + return None + + +def _try_claude_ai_json(data) -> Optional[str]: + """Claude.ai JSON export: [{"role": "user", "content": "..."}]""" + if isinstance(data, dict): + data = data.get("messages", data.get("chat_messages", [])) + if not isinstance(data, list): + return None + messages = [] + for item in data: + if not isinstance(item, dict): + continue + role = item.get("role", "") + text = _extract_content(item.get("content", "")) + if role in ("user", "human") and text: + messages.append(("user", text)) + elif role in ("assistant", "ai") and text: + messages.append(("assistant", text)) + if len(messages) >= 2: + return _messages_to_transcript(messages) + return None + + +def _try_chatgpt_json(data) -> Optional[str]: + """ChatGPT conversations.json with mapping tree.""" + if not isinstance(data, dict) or "mapping" not in data: + return None + mapping = data["mapping"] + messages = [] + # Find root: prefer node with parent=None AND no message (synthetic root) + root_id = None + fallback_root = None + for node_id, node in mapping.items(): + if node.get("parent") is None: + if node.get("message") is None: + root_id = node_id + break + elif fallback_root is None: + fallback_root = node_id + if not root_id: + root_id = fallback_root + if root_id: + current_id = root_id + visited = set() + while current_id and current_id not in visited: + visited.add(current_id) + node = mapping.get(current_id, {}) + msg = node.get("message") + if msg: + role = msg.get("author", {}).get("role", "") + content = msg.get("content", {}) + parts = content.get("parts", []) if isinstance(content, dict) else [] + text = " ".join(str(p) for p in parts if isinstance(p, str) and p).strip() + if role == "user" and text: + messages.append(("user", text)) + elif role == "assistant" and text: + messages.append(("assistant", text)) + children = node.get("children", []) + current_id = children[0] if children else None + if len(messages) >= 2: + return _messages_to_transcript(messages) + return None + + +def _try_slack_json(data) -> Optional[str]: + """ + Slack channel export: [{"type": "message", "user": "...", "text": "..."}] + Optimized for 2-person DMs. In channels with 3+ people, alternating + speakers are labeled user/assistant to preserve the exchange structure. + """ + if not isinstance(data, list): + return None + messages = [] + seen_users = {} + last_role = None + for item in data: + if not isinstance(item, dict) or item.get("type") != "message": + continue + user_id = item.get("user", item.get("username", "")) + text = item.get("text", "").strip() + if not text or not user_id: + continue + if user_id not in seen_users: + # Alternate roles so exchange chunking works with any number of speakers + if not seen_users: + seen_users[user_id] = "user" + elif last_role == "user": + seen_users[user_id] = "assistant" + else: + seen_users[user_id] = "user" + last_role = seen_users[user_id] + messages.append((seen_users[user_id], text)) + if len(messages) >= 2: + return _messages_to_transcript(messages) + return None + + +def _extract_content(content) -> str: + """Pull text from content — handles str, list of blocks, or dict.""" + if isinstance(content, str): + return content.strip() + if isinstance(content, list): + parts = [] + for item in content: + if isinstance(item, str): + parts.append(item) + elif isinstance(item, dict) and item.get("type") == "text": + parts.append(item.get("text", "")) + return " ".join(parts).strip() + if isinstance(content, dict): + return content.get("text", "").strip() + return "" + + +def _messages_to_transcript(messages: list, spellcheck: bool = True) -> str: + """Convert [(role, text), ...] to transcript format with > markers.""" + if spellcheck: + try: + from mempalace.spellcheck import spellcheck_user_text + + _fix = spellcheck_user_text + except Exception: + _fix = None + else: + _fix = None + + lines = [] + i = 0 + while i < len(messages): + role, text = messages[i] + if role == "user": + if _fix is not None: + text = _fix(text) + lines.append(f"> {text}") + if i + 1 < len(messages) and messages[i + 1][0] == "assistant": + lines.append(messages[i + 1][1]) + i += 2 + else: + i += 1 + else: + lines.append(text) + i += 1 + lines.append("") + return "\n".join(lines) + + +if __name__ == "__main__": + import sys + + if len(sys.argv) < 2: + print("Usage: python normalize.py ") + sys.exit(1) + filepath = sys.argv[1] + result = normalize(filepath) + quote_count = sum(1 for line in result.split("\n") if line.strip().startswith(">")) + print(f"\nFile: {os.path.basename(filepath)}") + print(f"Normalized: {len(result)} chars | {quote_count} user turns detected") + print("\n--- Preview (first 20 lines) ---") + print("\n".join(result.split("\n")[:20])) diff --git a/mempalace/onboarding.py b/mempalace/onboarding.py new file mode 100644 index 0000000..8b9b38b --- /dev/null +++ b/mempalace/onboarding.py @@ -0,0 +1,480 @@ +#!/usr/bin/env python3 +""" +onboarding.py — MemPalace first-run setup. + +Asks the user: + 1. How they're using MemPalace (work / personal / combo) + 2. Who the people in their life are (names, nicknames, relationships) + 3. What their projects are + 4. What they want their wings called + +Seeds the entity_registry with confirmed data so MemPalace knows your world +from minute one — before a single session is indexed. + +Usage: + python3 -m mempalace.onboarding + or: mempalace init +""" + +from pathlib import Path +from mempalace.entity_registry import EntityRegistry +from mempalace.entity_detector import detect_entities, scan_for_detection + + +# ───────────────────────────────────────────────────────────────────────────── +# Default wing taxonomies by mode +# ───────────────────────────────────────────────────────────────────────────── + +DEFAULT_WINGS = { + "work": [ + "projects", + "clients", + "team", + "decisions", + "research", + ], + "personal": [ + "family", + "health", + "creative", + "reflections", + "relationships", + ], + "combo": [ + "family", + "work", + "health", + "creative", + "projects", + "reflections", + ], +} + + +# ───────────────────────────────────────────────────────────────────────────── +# Helpers +# ───────────────────────────────────────────────────────────────────────────── + + +def _hr(): + print(f"\n{'─' * 58}") + + +def _header(text): + print(f"\n{'=' * 58}") + print(f" {text}") + print(f"{'=' * 58}") + + +def _ask(prompt, default=None): + if default: + val = input(f" {prompt} [{default}]: ").strip() + return val if val else default + return input(f" {prompt}: ").strip() + + +def _yn(prompt, default="y"): + val = input(f" {prompt} [{'Y/n' if default == 'y' else 'y/N'}]: ").strip().lower() + if not val: + return default == "y" + return val.startswith("y") + + +# ───────────────────────────────────────────────────────────────────────────── +# Step 1: Mode selection +# ───────────────────────────────────────────────────────────────────────────── + + +def _ask_mode() -> str: + _header("Welcome to MemPalace") + print(""" + MemPalace is a personal memory system. To work well, it needs to know + a little about your world — who the people are, what the projects + are, and how you want your memory organized. + + This takes about 2 minutes. You can always update it later. +""") + print(" How are you using MemPalace?") + print() + print(" [1] Work — notes, projects, clients, colleagues, decisions") + print(" [2] Personal — diary, family, health, relationships, reflections") + print(" [3] Both — personal and professional mixed") + print() + + while True: + choice = input(" Your choice [1/2/3]: ").strip() + if choice == "1": + return "work" + elif choice == "2": + return "personal" + elif choice == "3": + return "combo" + print(" Please enter 1, 2, or 3.") + + +# ───────────────────────────────────────────────────────────────────────────── +# Step 2: People +# ───────────────────────────────────────────────────────────────────────────── + + +def _ask_people(mode: str) -> tuple[list, dict]: + """Returns (people_list, aliases_dict).""" + people = [] + aliases = {} # nickname → full name + + if mode in ("personal", "combo"): + _hr() + print(""" + Personal world — who are the important people in your life? + + Format: name, relationship (e.g. "Riley, daughter" or just "Devon") + For nicknames, you'll be asked separately. + Type 'done' when finished. +""") + while True: + entry = input(" Person: ").strip() + if entry.lower() in ("done", ""): + break + parts = [p.strip() for p in entry.split(",", 1)] + name = parts[0] + relationship = parts[1] if len(parts) > 1 else "" + if name: + # Ask about nicknames + nick = input(f" Nickname for {name}? (or enter to skip): ").strip() + if nick: + aliases[nick] = name + people.append({"name": name, "relationship": relationship, "context": "personal"}) + + if mode in ("work", "combo"): + _hr() + print(""" + Work world — who are the colleagues, clients, or collaborators + you'd want to find in your notes? + + Format: name, role (e.g. "Ben, co-founder" or just "Sarah") + Type 'done' when finished. +""") + while True: + entry = input(" Person: ").strip() + if entry.lower() in ("done", ""): + break + parts = [p.strip() for p in entry.split(",", 1)] + name = parts[0] + role = parts[1] if len(parts) > 1 else "" + if name: + people.append({"name": name, "relationship": role, "context": "work"}) + + return people, aliases + + +# ───────────────────────────────────────────────────────────────────────────── +# Step 3: Projects +# ───────────────────────────────────────────────────────────────────────────── + + +def _ask_projects(mode: str) -> list: + if mode == "personal": + return [] + + _hr() + print(""" + What are your main projects? (These help MemPalace distinguish project + names from person names — e.g. "Lantern" the project vs. "Lantern" the word.) + + Type 'done' when finished. +""") + projects = [] + while True: + proj = input(" Project: ").strip() + if proj.lower() in ("done", ""): + break + if proj: + projects.append(proj) + return projects + + +# ───────────────────────────────────────────────────────────────────────────── +# Step 4: Wings +# ───────────────────────────────────────────────────────────────────────────── + + +def _ask_wings(mode: str) -> list: + defaults = DEFAULT_WINGS[mode] + _hr() + print(f""" + Wings are the top-level categories in your memory palace. + + Suggested wings for {mode} mode: + {", ".join(defaults)} + + Press enter to keep these, or type your own comma-separated list. +""") + custom = input(" Wings: ").strip() + if custom: + return [w.strip() for w in custom.split(",") if w.strip()] + return defaults + + +# ───────────────────────────────────────────────────────────────────────────── +# Step 5: Auto-detect from files +# ───────────────────────────────────────────────────────────────────────────── + + +def _auto_detect(directory: str, known_people: list) -> list: + """Scan directory for additional entity candidates.""" + known_names = {p["name"].lower() for p in known_people} + + try: + files = scan_for_detection(directory) + if not files: + return [] + detected = detect_entities(files) + new_people = [ + e + for e in detected["people"] + if e["name"].lower() not in known_names and e["confidence"] >= 0.7 + ] + return new_people + except Exception: + return [] + + +# ───────────────────────────────────────────────────────────────────────────── +# Step 6: Ambiguity warnings +# ───────────────────────────────────────────────────────────────────────────── + + +def _warn_ambiguous(people: list) -> list: + """ + Flag names that are also common English words. + Returns list of ambiguous names for user awareness. + """ + from mempalace.entity_registry import COMMON_ENGLISH_WORDS + + ambiguous = [] + for p in people: + if p["name"].lower() in COMMON_ENGLISH_WORDS: + ambiguous.append(p["name"]) + return ambiguous + + +# ───────────────────────────────────────────────────────────────────────────── +# Main onboarding flow +# ───────────────────────────────────────────────────────────────────────────── + + +def _generate_aaak_bootstrap(people: list, projects: list, wings: list, mode: str, config_dir: Path = None): + """ + Generate AAAK entity registry + critical facts bootstrap from onboarding data. + These files teach the AI about the user's world from session one. + """ + mempalace_dir = Path(config_dir) if config_dir else Path.home() / ".mempalace" + mempalace_dir.mkdir(parents=True, exist_ok=True) + + # Build AAAK entity codes (first 3 letters of name, uppercase) + entity_codes = {} + for p in people: + name = p["name"] + code = name[:3].upper() + # Handle collisions + while code in entity_codes.values(): + code = name[:4].upper() + entity_codes[name] = code + + # AAAK entity registry + registry_lines = [ + "# AAAK Entity Registry", + "# Auto-generated by mempalace init. Update as needed.", + "", + "## People", + ] + for p in people: + name = p["name"] + code = entity_codes[name] + rel = p.get("relationship", "") + ctx = p.get("context", "") + registry_lines.append(f" {code}={name} ({rel})" if rel else f" {code}={name}") + + if projects: + registry_lines.extend(["", "## Projects"]) + for proj in projects: + code = proj[:4].upper() + registry_lines.append(f" {code}={proj}") + + registry_lines.extend([ + "", + "## AAAK Quick Reference", + " Symbols: ♡=love ★=importance ⚠=warning →=relationship |=separator", + " Structure: KEY:value | GROUP(details) | entity.attribute", + " Read naturally — expand codes, treat *markers* as emotional context.", + ]) + + (mempalace_dir / "aaak_entities.md").write_text("\n".join(registry_lines)) + + # Critical facts bootstrap (pre-palace — before any mining) + facts_lines = [ + "# Critical Facts (bootstrap — will be enriched after mining)", + "", + ] + + personal_people = [p for p in people if p.get("context") == "personal"] + work_people = [p for p in people if p.get("context") == "work"] + + if personal_people: + facts_lines.append("## People (personal)") + for p in personal_people: + code = entity_codes[p["name"]] + rel = p.get("relationship", "") + facts_lines.append(f"- **{p['name']}** ({code}) — {rel}" if rel else f"- **{p['name']}** ({code})") + facts_lines.append("") + + if work_people: + facts_lines.append("## People (work)") + for p in work_people: + code = entity_codes[p["name"]] + rel = p.get("relationship", "") + facts_lines.append(f"- **{p['name']}** ({code}) — {rel}" if rel else f"- **{p['name']}** ({code})") + facts_lines.append("") + + if projects: + facts_lines.append("## Projects") + for proj in projects: + facts_lines.append(f"- **{proj}**") + facts_lines.append("") + + facts_lines.extend([ + "## Palace", + f"Wings: {', '.join(wings)}", + f"Mode: {mode}", + "", + "*This file will be enriched by palace_facts.py after mining.*", + ]) + + (mempalace_dir / "critical_facts.md").write_text("\n".join(facts_lines)) + + +def run_onboarding( + directory: str = ".", + config_dir: Path = None, + auto_detect: bool = True, +) -> EntityRegistry: + """ + Run the full onboarding flow. + Returns the seeded EntityRegistry. + """ + # Step 1: Mode + mode = _ask_mode() + + # Step 2: People + people, aliases = _ask_people(mode) + + # Step 3: Projects + projects = _ask_projects(mode) + + # Step 4: Wings (stored in config, not registry — just show user) + wings = _ask_wings(mode) + + # Step 5: Auto-detect additional people from files + if auto_detect and _yn("\nScan your files for additional names we might have missed?"): + directory = _ask("Directory to scan", default=directory) + detected = _auto_detect(directory, people) + if detected: + _hr() + print(f"\n Found {len(detected)} additional name candidates:\n") + for e in detected: + print( + f" {e['name']:20} confidence={e['confidence']:.0%} " + f"({', '.join(e['signals'][:1])})" + ) + print() + if _yn(" Add any of these to your registry?"): + for e in detected: + ans = input(f" {e['name']} — (p)erson, (s)kip? ").strip().lower() + if ans == "p": + rel = input(f" Relationship/role for {e['name']}? ").strip() + ctx = ( + "personal" + if mode == "personal" + else ( + "work" + if mode == "work" + else input(" Context — (p)ersonal or (w)ork? ") + .strip() + .lower() + .replace("w", "work") + .replace("p", "personal") + ) + ) + people.append({"name": e["name"], "relationship": rel, "context": ctx}) + + # Step 6: Warn about ambiguous names + ambiguous = _warn_ambiguous(people) + if ambiguous: + _hr() + print(f""" + Heads up — these names are also common English words: + {", ".join(ambiguous)} + + MemPalace will check the context before treating them as person names. + For example: "I picked up Riley" → person. + "Have you ever tried" → adverb. +""") + + # Build and save registry + registry = EntityRegistry.load(config_dir) + registry.seed(mode=mode, people=people, projects=projects, aliases=aliases) + + # Generate AAAK entity registry + critical facts bootstrap + _generate_aaak_bootstrap(people, projects, wings, mode, config_dir) + + # Summary + _header("Setup Complete") + print() + print(f" {registry.summary()}") + print(f"\n Wings: {', '.join(wings)}") + print(f"\n Registry saved to: {registry._path}") + print(f"\n AAAK entity registry: ~/.mempalace/aaak_entities.md") + print(f" Critical facts bootstrap: ~/.mempalace/critical_facts.md") + print(f"\n Your AI will know your world from the first session.") + print() + + return registry + + +# ───────────────────────────────────────────────────────────────────────────── +# Quick setup (non-interactive, for testing) +# ───────────────────────────────────────────────────────────────────────────── + + +def quick_setup( + mode: str, + people: list, + projects: list = None, + aliases: dict = None, + config_dir: Path = None, +) -> EntityRegistry: + """ + Programmatic setup without interactive prompts. + Used in tests and benchmark scripts. + + people: list of dicts {"name": str, "relationship": str, "context": str} + """ + registry = EntityRegistry.load(config_dir) + registry.seed( + mode=mode, + people=people, + projects=projects or [], + aliases=aliases or {}, + ) + return registry + + +# ───────────────────────────────────────────────────────────────────────────── +# CLI +# ───────────────────────────────────────────────────────────────────────────── + +if __name__ == "__main__": + import sys + + directory = sys.argv[1] if len(sys.argv) > 1 else "." + run_onboarding(directory=directory) diff --git a/mempalace/palace_graph.py b/mempalace/palace_graph.py new file mode 100644 index 0000000..8de6d48 --- /dev/null +++ b/mempalace/palace_graph.py @@ -0,0 +1,216 @@ +""" +palace_graph.py — Graph traversal layer for MemPalace +====================================================== + +Builds a navigable graph from the palace structure: + - Nodes = rooms (named ideas) + - Edges = shared rooms across wings (tunnels) + - Edge types = halls (the corridors) + +Enables queries like: + "Start at chromadb-setup in wing_code, walk to wing_myproject" + "Find all rooms connected to riley-college-apps" + "What topics bridge wing_hardware and wing_myproject?" + +No external graph DB needed — built from ChromaDB metadata. +""" + +from collections import defaultdict, Counter +from .config import MempalaceConfig + +import chromadb + + +def _get_collection(config=None): + config = config or MempalaceConfig() + try: + client = chromadb.PersistentClient(path=config.palace_path) + return client.get_collection(config.collection_name) + except Exception: + return None + + +def build_graph(col=None, config=None): + """ + Build the palace graph from ChromaDB metadata. + + Returns: + nodes: dict of {room: {wings: set, halls: set, count: int}} + edges: list of {room, wing_a, wing_b, hall} — one per tunnel crossing + """ + if col is None: + col = _get_collection(config) + if not col: + return {}, [] + + total = col.count() + room_data = defaultdict(lambda: {"wings": set(), "halls": set(), "count": 0, "dates": set()}) + + offset = 0 + while offset < total: + batch = col.get(limit=1000, offset=offset, include=["metadatas"]) + for meta in batch["metadatas"]: + room = meta.get("room", "") + wing = meta.get("wing", "") + hall = meta.get("hall", "") + date = meta.get("date", "") + if room and room != "general" and wing: + room_data[room]["wings"].add(wing) + if hall: + room_data[room]["halls"].add(hall) + if date: + room_data[room]["dates"].add(date) + room_data[room]["count"] += 1 + if not batch["ids"]: + break + offset += len(batch["ids"]) + + # Build edges from rooms that span multiple wings + edges = [] + for room, data in room_data.items(): + wings = sorted(data["wings"]) + if len(wings) >= 2: + for i, wa in enumerate(wings): + for wb in wings[i + 1:]: + for hall in data["halls"]: + edges.append({ + "room": room, + "wing_a": wa, + "wing_b": wb, + "hall": hall, + "count": data["count"], + }) + + # Convert sets to lists for JSON serialization + nodes = {} + for room, data in room_data.items(): + nodes[room] = { + "wings": sorted(data["wings"]), + "halls": sorted(data["halls"]), + "count": data["count"], + "dates": sorted(data["dates"])[-5:] if data["dates"] else [], + } + + return nodes, edges + + +def traverse(start_room: str, col=None, config=None, max_hops: int = 2): + """ + Walk the graph from a starting room. Find connected rooms + through shared wings. + + Returns list of paths: [{room, wing, hall, hop_distance}] + """ + nodes, edges = build_graph(col, config) + + if start_room not in nodes: + return {"error": f"Room '{start_room}' not found", "suggestions": _fuzzy_match(start_room, nodes)} + + start = nodes[start_room] + visited = {start_room} + results = [{ + "room": start_room, + "wings": start["wings"], + "halls": start["halls"], + "count": start["count"], + "hop": 0, + }] + + # BFS traversal + frontier = [(start_room, 0)] + while frontier: + current_room, depth = frontier.pop(0) + if depth >= max_hops: + continue + + current = nodes.get(current_room, {}) + current_wings = set(current.get("wings", [])) + + # Find all rooms that share a wing with current room + for room, data in nodes.items(): + if room in visited: + continue + shared_wings = current_wings & set(data["wings"]) + if shared_wings: + visited.add(room) + results.append({ + "room": room, + "wings": data["wings"], + "halls": data["halls"], + "count": data["count"], + "hop": depth + 1, + "connected_via": sorted(shared_wings), + }) + if depth + 1 < max_hops: + frontier.append((room, depth + 1)) + + # Sort by relevance (hop distance, then count) + results.sort(key=lambda x: (x["hop"], -x["count"])) + return results[:50] # cap results + + +def find_tunnels(wing_a: str = None, wing_b: str = None, col=None, config=None): + """ + Find rooms that connect two wings (or all tunnel rooms if no wings specified). + These are the "hallways" — same named idea appearing in multiple domains. + """ + nodes, edges = build_graph(col, config) + + tunnels = [] + for room, data in nodes.items(): + wings = data["wings"] + if len(wings) < 2: + continue + + if wing_a and wing_a not in wings: + continue + if wing_b and wing_b not in wings: + continue + + tunnels.append({ + "room": room, + "wings": wings, + "halls": data["halls"], + "count": data["count"], + "recent": data["dates"][-1] if data["dates"] else "", + }) + + tunnels.sort(key=lambda x: -x["count"]) + return tunnels[:50] + + +def graph_stats(col=None, config=None): + """Summary statistics about the palace graph.""" + nodes, edges = build_graph(col, config) + + tunnel_rooms = sum(1 for n in nodes.values() if len(n["wings"]) >= 2) + wing_counts = Counter() + for data in nodes.values(): + for w in data["wings"]: + wing_counts[w] += 1 + + return { + "total_rooms": len(nodes), + "tunnel_rooms": tunnel_rooms, + "total_edges": len(edges), + "rooms_per_wing": dict(wing_counts.most_common()), + "top_tunnels": [ + {"room": r, "wings": d["wings"], "count": d["count"]} + for r, d in sorted(nodes.items(), key=lambda x: -len(x[1]["wings"]))[:10] + if len(d["wings"]) >= 2 + ], + } + + +def _fuzzy_match(query: str, nodes: dict, n: int = 5): + """Find rooms that approximately match a query string.""" + query_lower = query.lower() + scored = [] + for room in nodes: + # Simple substring matching + if query_lower in room: + scored.append((room, 1.0)) + elif any(word in room for word in query_lower.split("-")): + scored.append((room, 0.5)) + scored.sort(key=lambda x: -x[1]) + return [r for r, _ in scored[:n]] diff --git a/mempalace/room_detector_local.py b/mempalace/room_detector_local.py new file mode 100644 index 0000000..f927a84 --- /dev/null +++ b/mempalace/room_detector_local.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python3 +""" +room_detector_local.py — Local setup, no API required. + +Two ways to define rooms without calling any AI: + 1. Auto-detect from folder structure (zero config) + 2. Define manually in mempalace.yaml + +No internet. No API key. Your files stay on your machine. +""" + +import os +import sys +import yaml +from pathlib import Path +from collections import defaultdict + +# Common room patterns — detected from folder names and filenames +# Format: {folder_keyword: room_name} +FOLDER_ROOM_MAP = { + "frontend": "frontend", + "front-end": "frontend", + "front_end": "frontend", + "client": "frontend", + "ui": "frontend", + "views": "frontend", + "components": "frontend", + "pages": "frontend", + "backend": "backend", + "back-end": "backend", + "back_end": "backend", + "server": "backend", + "api": "backend", + "routes": "backend", + "services": "backend", + "controllers": "backend", + "models": "backend", + "database": "backend", + "db": "backend", + "docs": "documentation", + "doc": "documentation", + "documentation": "documentation", + "wiki": "documentation", + "readme": "documentation", + "notes": "documentation", + "design": "design", + "designs": "design", + "mockups": "design", + "wireframes": "design", + "assets": "design", + "storyboard": "design", + "costs": "costs", + "cost": "costs", + "budget": "costs", + "finance": "costs", + "financial": "costs", + "pricing": "costs", + "invoices": "costs", + "accounting": "costs", + "meetings": "meetings", + "meeting": "meetings", + "calls": "meetings", + "meeting_notes": "meetings", + "standup": "meetings", + "minutes": "meetings", + "team": "team", + "staff": "team", + "hr": "team", + "hiring": "team", + "employees": "team", + "people": "team", + "research": "research", + "references": "research", + "reading": "research", + "papers": "research", + "planning": "planning", + "roadmap": "planning", + "strategy": "planning", + "specs": "planning", + "requirements": "planning", + "tests": "testing", + "test": "testing", + "testing": "testing", + "qa": "testing", + "scripts": "scripts", + "tools": "scripts", + "utils": "scripts", + "config": "configuration", + "configs": "configuration", + "settings": "configuration", + "infrastructure": "configuration", + "infra": "configuration", + "deploy": "configuration", +} + + +def detect_rooms_from_folders(project_dir: str) -> list: + """ + Walk the project folder structure. + Find top-level subdirectories that match known room patterns. + Returns list of room dicts. + """ + project_path = Path(project_dir).expanduser().resolve() + found_rooms = {} + + SKIP_DIRS = { + ".git", + "node_modules", + "__pycache__", + ".venv", + "venv", + "env", + "dist", + "build", + ".next", + "coverage", + } + + # Check top-level directories first (most reliable signal) + for item in project_path.iterdir(): + if item.is_dir() and item.name not in SKIP_DIRS: + name_lower = item.name.lower().replace("-", "_") + if name_lower in FOLDER_ROOM_MAP: + room_name = FOLDER_ROOM_MAP[name_lower] + if room_name not in found_rooms: + found_rooms[room_name] = item.name + # Also check if folder name IS a good room name directly + elif len(item.name) > 2 and item.name[0].isalpha(): + clean = item.name.lower().replace("-", "_").replace(" ", "_") + if clean not in found_rooms: + found_rooms[clean] = item.name + + # Walk one level deeper for nested patterns + for item in project_path.iterdir(): + if item.is_dir() and item.name not in SKIP_DIRS: + for subitem in item.iterdir(): + if subitem.is_dir() and subitem.name not in SKIP_DIRS: + name_lower = subitem.name.lower().replace("-", "_") + if name_lower in FOLDER_ROOM_MAP: + room_name = FOLDER_ROOM_MAP[name_lower] + if room_name not in found_rooms: + found_rooms[room_name] = subitem.name + + # Build room list + rooms = [] + for room_name, original in found_rooms.items(): + rooms.append( + { + "name": room_name, + "description": f"Files from {original}/", + "keywords": [room_name, original.lower()], + } + ) + + # Always add "general" as fallback + if not any(r["name"] == "general" for r in rooms): + rooms.append( + { + "name": "general", + "description": "Files that don't fit other rooms", + "keywords": [], + } + ) + + return rooms + + +def detect_rooms_from_files(project_dir: str) -> list: + """ + Fallback: if folder structure gives no signal, + detect rooms from recurring filename patterns. + """ + project_path = Path(project_dir).expanduser().resolve() + keyword_counts = defaultdict(int) + + SKIP_DIRS = {".git", "node_modules", "__pycache__", ".venv", "venv", "dist", "build"} + + for root, dirs, filenames in os.walk(project_path): + dirs[:] = [d for d in dirs if d not in SKIP_DIRS] + for filename in filenames: + name_lower = filename.lower().replace("-", "_").replace(" ", "_") + for keyword, room in FOLDER_ROOM_MAP.items(): + if keyword in name_lower: + keyword_counts[room] += 1 + + # Return rooms that appear more than twice + rooms = [] + for room, count in sorted(keyword_counts.items(), key=lambda x: x[1], reverse=True): + if count >= 2: + rooms.append( + { + "name": room, + "description": f"Files related to {room}", + "keywords": [room], + } + ) + if len(rooms) >= 6: + break + + if not rooms: + rooms = [{"name": "general", "description": "All project files", "keywords": []}] + + return rooms + + +def print_proposed_structure(project_name: str, rooms: list, total_files: int, source: str): + print(f"\n{'=' * 55}") + print(" MemPalace Init — Local setup") + print(f"{'=' * 55}") + print(f"\n WING: {project_name}") + print(f" ({total_files} files found, rooms detected from {source})\n") + for room in rooms: + print(f" ROOM: {room['name']}") + print(f" {room['description']}") + print(f"\n{'─' * 55}") + + +def get_user_approval(rooms: list) -> list: + """Same approval flow as AI version.""" + print(" Review the proposed rooms above.") + print(" Options:") + print(" [enter] Accept all rooms") + print(" [edit] Remove or rename rooms") + print(" [add] Add a room manually") + print() + + choice = input(" Your choice [enter/edit/add]: ").strip().lower() + + if choice in ("", "y", "yes"): + return rooms + + if choice == "edit": + print("\n Current rooms:") + for i, room in enumerate(rooms): + print(f" {i + 1}. {room['name']} — {room['description']}") + remove = input("\n Room numbers to REMOVE (comma-separated, or enter to skip): ").strip() + if remove: + to_remove = {int(x.strip()) - 1 for x in remove.split(",") if x.strip().isdigit()} + rooms = [r for i, r in enumerate(rooms) if i not in to_remove] + + if choice == "add" or input("\n Add any missing rooms? [y/N]: ").strip().lower() == "y": + while True: + new_name = ( + input(" New room name (or enter to stop): ").strip().lower().replace(" ", "_") + ) + if not new_name: + break + new_desc = input(f" Description for '{new_name}': ").strip() + rooms.append({"name": new_name, "description": new_desc, "keywords": [new_name]}) + print(f" Added: {new_name}") + + return rooms + + +def save_config(project_dir: str, project_name: str, rooms: list): + config = { + "wing": project_name, + "rooms": [{"name": r["name"], "description": r["description"]} for r in rooms], + } + config_path = Path(project_dir).expanduser().resolve() / "mempalace.yaml" + with open(config_path, "w") as f: + yaml.dump(config, f, default_flow_style=False, sort_keys=False) + + print(f"\n Config saved: {config_path}") + print("\n Next step:") + print(f" mempalace mine {project_dir}") + print(f"\n{'=' * 55}\n") + + +def detect_rooms_local(project_dir: str): + """Main entry point for local setup.""" + project_path = Path(project_dir).expanduser().resolve() + project_name = project_path.name.lower().replace(" ", "_").replace("-", "_") + + if not project_path.exists(): + print(f"ERROR: Directory not found: {project_dir}") + sys.exit(1) + + # Count files + from .miner import scan_project + + files = scan_project(project_dir) + + # Try folder structure first + rooms = detect_rooms_from_folders(project_dir) + source = "folder structure" + + # If only "general" found, try filename patterns + if len(rooms) <= 1: + rooms = detect_rooms_from_files(project_dir) + source = "filename patterns" + + # If still nothing, just use general + if not rooms: + rooms = [{"name": "general", "description": "All project files", "keywords": []}] + source = "fallback (flat project)" + + print_proposed_structure(project_name, rooms, len(files), source) + approved_rooms = get_user_approval(rooms) + save_config(project_dir, project_name, approved_rooms) diff --git a/mempalace/searcher.py b/mempalace/searcher.py new file mode 100644 index 0000000..9972dbe --- /dev/null +++ b/mempalace/searcher.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +""" +searcher.py — Find anything. Exact words. + +Semantic search against the palace. +Returns verbatim text — the actual words, never summaries. +""" + +import sys +from pathlib import Path + +import chromadb + + +def search(query: str, palace_path: str, wing: str = None, room: str = None, n_results: int = 5): + """ + Search the palace. Returns verbatim drawer content. + Optionally filter by wing (project) or room (aspect). + """ + try: + client = chromadb.PersistentClient(path=palace_path) + col = client.get_collection("mempalace_drawers") + except Exception: + print(f"\n No palace found at {palace_path}") + print(" Run: mempalace init then mempalace mine ") + sys.exit(1) + + # Build where filter + where = {} + if wing and room: + where = {"$and": [{"wing": wing}, {"room": room}]} + elif wing: + where = {"wing": wing} + elif room: + where = {"room": room} + + try: + kwargs = { + "query_texts": [query], + "n_results": n_results, + "include": ["documents", "metadatas", "distances"], + } + if where: + kwargs["where"] = where + + results = col.query(**kwargs) + + except Exception as e: + print(f"\n Search error: {e}") + sys.exit(1) + + docs = results["documents"][0] + metas = results["metadatas"][0] + dists = results["distances"][0] + + if not docs: + print(f'\n No results found for: "{query}"') + return + + print(f"\n{'=' * 60}") + print(f' Results for: "{query}"') + if wing: + print(f" Wing: {wing}") + if room: + print(f" Room: {room}") + print(f"{'=' * 60}\n") + + for i, (doc, meta, dist) in enumerate(zip(docs, metas, dists), 1): + similarity = round(1 - dist, 3) + source = Path(meta.get("source_file", "?")).name + wing_name = meta.get("wing", "?") + room_name = meta.get("room", "?") + + print(f" [{i}] {wing_name} / {room_name}") + print(f" Source: {source}") + print(f" Match: {similarity}") + print() + # Print the verbatim text, indented + for line in doc.strip().split("\n"): + print(f" {line}") + print() + print(f" {'─' * 56}") + + print() + + +def search_memories( + query: str, palace_path: str, wing: str = None, room: str = None, n_results: int = 5 +) -> dict: + """ + Programmatic search — returns a dict instead of printing. + Used by the MCP server and other callers that need data. + """ + try: + client = chromadb.PersistentClient(path=palace_path) + col = client.get_collection("mempalace_drawers") + except Exception as e: + return {"error": f"No palace found at {palace_path}: {e}"} + + # Build where filter + where = {} + if wing and room: + where = {"$and": [{"wing": wing}, {"room": room}]} + elif wing: + where = {"wing": wing} + elif room: + where = {"room": room} + + try: + kwargs = { + "query_texts": [query], + "n_results": n_results, + "include": ["documents", "metadatas", "distances"], + } + if where: + kwargs["where"] = where + + results = col.query(**kwargs) + except Exception as e: + return {"error": f"Search error: {e}"} + + docs = results["documents"][0] + metas = results["metadatas"][0] + dists = results["distances"][0] + + hits = [] + for doc, meta, dist in zip(docs, metas, dists): + hits.append( + { + "text": doc, + "wing": meta.get("wing", "unknown"), + "room": meta.get("room", "unknown"), + "source_file": Path(meta.get("source_file", "?")).name, + "similarity": round(1 - dist, 3), + } + ) + + return { + "query": query, + "filters": {"wing": wing, "room": room}, + "results": hits, + } diff --git a/mempalace/spellcheck.py b/mempalace/spellcheck.py new file mode 100644 index 0000000..fe8da38 --- /dev/null +++ b/mempalace/spellcheck.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python3 +""" +spellcheck.py — Spell-correct user messages before palace filing. + +Preserves: + - Technical terms (words with digits, hyphens, underscores) + - CamelCase and ALL_CAPS identifiers + - Known entity names (from EntityRegistry if available) + - URLs and file paths + - Words shorter than 3 chars (common abbreviations, pronouns, etc.) + - Proper nouns already capitalized in context + +Corrects: + - Genuine typos in lowercase, flowing text + - Common fat-finger words (3am → 3am, knoe → know) + +Usage: + from mempalace.spellcheck import spellcheck_user_text + corrected = spellcheck_user_text("lsresdy knoe the question befor") + # → "already know the question before" (best effort) +""" + +import re +from pathlib import Path +from typing import Optional + +# Lazy-load autocorrect — not everyone has it installed +_speller = None +_autocorrect_available = None + +# System word list — loaded once, used to skip already-valid words +_system_words: Optional[set] = None +_SYSTEM_DICT = Path("/usr/share/dict/words") + + +def _get_speller(): + global _speller, _autocorrect_available + if _autocorrect_available is None: + try: + from autocorrect import Speller + + _speller = Speller(lang="en") + _autocorrect_available = True + except ImportError: + _autocorrect_available = False + return _speller if _autocorrect_available else None + + +def _get_system_words() -> set: + """Load /usr/share/dict/words once and cache it.""" + global _system_words + if _system_words is None: + if _SYSTEM_DICT.exists(): + with open(_SYSTEM_DICT) as f: + _system_words = {w.strip().lower() for w in f if w.strip()} + else: + _system_words = set() + return _system_words + + +# ───────────────────────────────────────────────────────────────────────────── +# Patterns that mark a token as "don't touch this" +# ───────────────────────────────────────────────────────────────────────────── + +# Matches any token with a digit anywhere in it: 3am, bge-large-v1.5, top-10 +_HAS_DIGIT = re.compile(r"\d") + +# CamelCase: ChromaDB, MemPalace, LongMemEval +_IS_CAMEL = re.compile(r"[A-Z][a-z]+[A-Z]") + +# ALL_CAPS or all-caps with underscores: NDCG, R@5, MAX_RESULTS +_IS_ALLCAPS = re.compile(r"^[A-Z_@#$%^&*()+=\[\]{}|<>?.:/\\]+$") + +# Technical token: contains hyphens or underscores (bge-large, train_test) +_IS_TECHNICAL = re.compile(r"[-_]") + +# URL-like or file-path-like +_IS_URL = re.compile(r"https?://|www\.|/Users/|~/|\.[a-z]{2,4}$", re.IGNORECASE) + +# Code fences, markdown, or emoji-heavy +_IS_CODE_OR_EMOJI = re.compile(r"[`*_#{}[\]\\]") + +# Very short tokens — skip (I, a, ok, my, etc. — also avoids ambiguous 3-char typos +# like "kno" which autocorrect resolves as "no" rather than "know") +_MIN_LENGTH = 4 + + +def _should_skip(token: str, known_names: set) -> bool: + """Return True if this token should be left as-is.""" + if len(token) < _MIN_LENGTH: + return True + if _HAS_DIGIT.search(token): + return True + if _IS_CAMEL.search(token): + return True + if _IS_ALLCAPS.match(token): + return True + if _IS_TECHNICAL.search(token): + return True + if _IS_URL.search(token): + return True + if _IS_CODE_OR_EMOJI.search(token): + return True + # Known proper names (entity registry) + if token.lower() in known_names: + return True + return False + + +# ───────────────────────────────────────────────────────────────────────────── +# Load known entity names from registry (optional, best-effort) +# ───────────────────────────────────────────────────────────────────────────── + + +def _load_known_names() -> set: + """Pull all registered names from EntityRegistry. Returns empty set on failure.""" + try: + from mempalace.entity_registry import EntityRegistry + + reg = EntityRegistry.load() + names = set() + for entity in reg._data.get("entities", {}).values(): + names.add(entity.get("canonical", "").lower()) + for alias in entity.get("aliases", []): + names.add(alias.lower()) + return names + except Exception: + return set() + + +# ───────────────────────────────────────────────────────────────────────────── +# Edit distance — used to guard against over-aggressive autocorrect +# ───────────────────────────────────────────────────────────────────────────── + + +def _edit_distance(a: str, b: str) -> int: + """Levenshtein distance between two strings.""" + if a == b: + return 0 + if not a: + return len(b) + if not b: + return len(a) + prev = list(range(len(b) + 1)) + for i, ca in enumerate(a, 1): + curr = [i] + for j, cb in enumerate(b, 1): + curr.append(min(prev[j] + 1, curr[j - 1] + 1, prev[j - 1] + (ca != cb))) + prev = curr + return prev[-1] + + +# ───────────────────────────────────────────────────────────────────────────── +# Core correction +# ───────────────────────────────────────────────────────────────────────────── + +# Split on word boundaries but keep punctuation attached to tokens +_TOKEN_RE = re.compile(r"(\S+)") + + +def spellcheck_user_text(text: str, known_names: Optional[set] = None) -> str: + """ + Spell-correct a user message. + + Args: + text: Raw user message text. + known_names: Set of lowercase names/terms to preserve. If None, + attempts to load from EntityRegistry automatically. + + Returns: + Corrected text. Falls back to original if autocorrect not installed. + """ + speller = _get_speller() + if speller is None: + return text # autocorrect not installed — pass through unchanged + + if known_names is None: + known_names = _load_known_names() + + # Process token by token, preserving all whitespace + sys_words = _get_system_words() + + def _fix(match): + token = match.group(0) + # Strip trailing punctuation for checking, reattach after + stripped = token.rstrip(".,!?;:'\")") + punct = token[len(stripped) :] + + if not stripped or _should_skip(stripped, known_names): + return token + + # Only correct lowercase words (capitalized words are likely proper nouns) + if stripped[0].isupper(): + return token + + # Skip words that are already valid English — prevents "coherently" → "inherently" + if stripped.lower() in sys_words: + return token + + corrected = speller(stripped) + + # Guard: don't apply if corrected word is too different from original. + # Extra safety net for words not in the system dict but also not typos. + if corrected != stripped: + dist = _edit_distance(stripped, corrected) + max_edits = 2 if len(stripped) <= 7 else 3 + if dist > max_edits: + return token + + return corrected + punct + + return _TOKEN_RE.sub(_fix, text) + + +def spellcheck_transcript_line(line: str) -> str: + """ + Spell-correct a single transcript line. + Only touches lines that start with '>' (user turns). + Assistant turns are never modified. + """ + stripped = line.lstrip() + if not stripped.startswith(">"): + return line + + # '> actual message here' + prefix_len = len(line) - len(stripped) + 2 # '> ' + message = line[prefix_len:] + if not message.strip(): + return line + + corrected = spellcheck_user_text(message) + return line[:prefix_len] + corrected + + +def spellcheck_transcript(content: str) -> str: + """ + Spell-correct all user turns in a full transcript. + Only lines starting with '>' are touched. + """ + lines = content.split("\n") + return "\n".join(spellcheck_transcript_line(line) for line in lines) + + +# ───────────────────────────────────────────────────────────────────────────── +# Quick test +# ───────────────────────────────────────────────────────────────────────────── + +if __name__ == "__main__": + test_cases = [ + "lsresdy knoe the question befor", + "isn't there meny diferent benchmarks tesing questions?", + "also can you pleese spell chekc my questions befroe storing", + "it's realy hard for me to writte coherently at 3am", + "Mempalace cant be fine-tunned if you alredy kno the question", + # Should NOT change these: + "ChromaDB bge-large-en-v1.5 NDCG@10 R@5", + "Riley picked up Sam from school", + "hybrid_v4 top-k=50 longmemeval_bench.py", + ] + + print("Spell-check test\n" + "=" * 50) + for msg in test_cases: + result = spellcheck_user_text(msg, known_names={"riley", "sam", "mempalace"}) + changed = " ← CHANGED" if result != msg else "" + print(f"\nIN: {msg}") + if result != msg: + print(f"OUT: {result}{changed}") + else: + print("OUT: (unchanged)") diff --git a/mempalace/split_mega_files.py b/mempalace/split_mega_files.py new file mode 100644 index 0000000..b49e4f1 --- /dev/null +++ b/mempalace/split_mega_files.py @@ -0,0 +1,272 @@ +#!/usr/bin/env python3 +""" +split_mega_files.py — Split concatenated transcript files into per-session files +================================================================================= + +Scans a directory for .txt files that contain multiple Claude Code sessions +(identified by "Claude Code v" headers). Splits each into individual files +named with: date, time, people detected, and subject from first prompt. + +Distinguishes true session starts from mid-session context restores +(which show "Ctrl+E to show X previous messages"). + +Output files are written to --output-dir (default: same dir as source). +Original files are renamed with .mega_backup extension (not deleted). + +Usage: + python3 split_mega_files.py # scan ~/Desktop/transcripts + python3 split_mega_files.py --source ~/Desktop/transcripts # explicit source + python3 split_mega_files.py --dry-run # show what would happen + python3 split_mega_files.py --min-sessions 2 # only files with 2+ sessions + +By: Ben, 2026-03-30 +""" + +import argparse +import json +import os +import re +import sys +from pathlib import Path + +HOME = Path.home() +LUMI_DIR = Path(os.environ.get("MEMPALACE_SOURCE_DIR", str(HOME / "Desktop/transcripts"))) + +# People we know about (for name detection in content) +# Loaded from ~/.mempalace/known_names.json if it exists, otherwise generic fallback. +_KNOWN_NAMES_PATH = HOME / ".mempalace" / "known_names.json" + +def _load_known_people() -> list: + """Load known names from config file, falling back to a generic list.""" + if _KNOWN_NAMES_PATH.exists(): + try: + data = json.loads(_KNOWN_NAMES_PATH.read_text()) + if isinstance(data, list): + return data + return data.get("names", []) + except (json.JSONDecodeError, OSError): + pass + # Generic fallback — override by creating ~/.mempalace/known_names.json + return ["Alice", "Ben", "Riley", "Max", "Sam", "Devon", "Jordan"] + +KNOWN_PEOPLE = _load_known_people() + + +def _load_username_map() -> dict: + """Load username-to-name mapping from config file.""" + if _KNOWN_NAMES_PATH.exists(): + try: + data = json.loads(_KNOWN_NAMES_PATH.read_text()) + if isinstance(data, dict): + return data.get("username_map", {}) + except (json.JSONDecodeError, OSError): + pass + return {} + + +def is_true_session_start(lines, idx): + """ + True session start: 'Claude Code v' header NOT followed by 'Ctrl+E'/'previous messages' + within the next 6 lines (those are context restores, not new sessions). + """ + nearby = "".join(lines[idx:idx + 6]) + return "Ctrl+E" not in nearby and "previous messages" not in nearby + + +def find_session_boundaries(lines): + """Return list of line indices where true new sessions begin.""" + boundaries = [] + for i, line in enumerate(lines): + if "Claude Code v" in line and is_true_session_start(lines, i): + boundaries.append(i) + return boundaries + + +def extract_timestamp(lines): + """ + Find the first timestamp line: ⏺ H:MM AM/PM Weekday, Month DD, YYYY + Returns (datetime_str, iso_str) or (None, None). + """ + ts_pattern = re.compile( + r"⏺\s+(\d{1,2}:\d{2}\s+[AP]M)\s+\w+,\s+(\w+)\s+(\d{1,2}),\s+(\d{4})" + ) + months = { + "January": "01", "February": "02", "March": "03", "April": "04", + "May": "05", "June": "06", "July": "07", "August": "08", + "September": "09", "October": "10", "November": "11", "December": "12", + } + for line in lines[:50]: + m = ts_pattern.search(line) + if m: + time_str, month, day, year = m.groups() + mon = months.get(month, "00") + day_z = day.zfill(2) + time_safe = time_str.replace(":", "").replace(" ", "") + iso = f"{year}-{mon}-{day_z}" + human = f"{year}-{mon}-{day_z}_{time_safe}" + return human, iso + return None, None + + +def extract_people(lines): + """ + Detect people mentioned as speakers or by name in first 100 lines. + Returns sorted list of detected names. + """ + found = set() + text = "".join(lines[:100]) + + # Speaker tags: "Alice:", "Ben:", etc. + for person in KNOWN_PEOPLE: + if re.search(rf"\b{person}\b", text, re.IGNORECASE): + found.add(person) + + # Working directory username hint — map to known people if configured + dir_match = re.search(r"/Users/(\w+)/", text) + if dir_match: + username = dir_match.group(1) + # User can map usernames to names in ~/.mempalace/known_names.json + # under a "username_map" key, e.g. {"username_map": {"jdoe": "John"}} + username_map = _load_username_map() + if username in username_map: + found.add(username_map[username]) + + return sorted(found) + + +def extract_subject(lines): + """ + Find the first meaningful user prompt (> line that isn't a shell command). + Returns cleaned, filename-safe subject string. + """ + skip_patterns = re.compile( + r"^(\.\/|cd |ls |python|bash|git |cat |source |export |claude|./activate)" + ) + for line in lines: + if line.startswith("> "): + prompt = line[2:].strip() + if prompt and not skip_patterns.match(prompt) and len(prompt) > 5: + # Clean for filename + subject = re.sub(r"[^\w\s-]", "", prompt) + subject = re.sub(r"\s+", "-", subject.strip()) + return subject[:60] + return "session" + + +def split_file(filepath, output_dir, dry_run=False): + """ + Split a single mega-file into per-session files. + Returns list of output paths written (or would be written if dry_run). + """ + path = Path(filepath) + lines = path.read_text(errors="replace").splitlines(keepends=True) + + boundaries = find_session_boundaries(lines) + if len(boundaries) < 2: + return [] # Not a mega-file + + # Add sentinel at end + boundaries.append(len(lines)) + + out_dir = Path(output_dir) if output_dir else path.parent + written = [] + + for i, (start, end) in enumerate(zip(boundaries, boundaries[1:])): + chunk = lines[start:end] + if len(chunk) < 10: + continue # Skip tiny fragments + + ts_human, ts_iso = extract_timestamp(chunk) + people = extract_people(chunk) + subject = extract_subject(chunk) + + # Build filename: SOURCESTEM__DATE_TIME_People_subject.txt + # Source stem prefix prevents collisions when multiple mega-files + # produce sessions with the same timestamp/people/subject. + ts_part = ts_human or f"part{i+1:02d}" + people_part = "-".join(people[:3]) if people else "unknown" + src_stem = re.sub(r"[^\w-]", "_", path.stem)[:40] + name = f"{src_stem}__{ts_part}_{people_part}_{subject}.txt" + # Sanitize + name = re.sub(r"[^\w\.\-]", "_", name) + name = re.sub(r"_+", "_", name) + + out_path = out_dir / name + + if dry_run: + print(f" [{i+1}/{len(boundaries)-1}] {name} ({len(chunk)} lines)") + else: + out_path.write_text("".join(chunk)) + print(f" ✓ {name} ({len(chunk)} lines)") + + written.append(out_path) + + return written + + +def main(): + parser = argparse.ArgumentParser( + description="Split concatenated transcript mega-files into per-session files" + ) + parser.add_argument("--source", type=str, default=None, + help="Source directory (default: MEMPALACE_SOURCE_DIR or ~/Desktop/transcripts)") + parser.add_argument("--output-dir", type=str, default=None, + help="Output directory (default: same as source)") + parser.add_argument("--min-sessions", type=int, default=2, + help="Only split files with at least N sessions (default: 2)") + parser.add_argument("--dry-run", action="store_true", + help="Show what would happen without writing files") + parser.add_argument("--file", type=str, default=None, + help="Split a single specific file instead of scanning dir") + args = parser.parse_args() + + src_dir = Path(args.source) if args.source else LUMI_DIR + output_dir = args.output_dir or None # None = same dir as file + + if args.file: + files = [Path(args.file)] + else: + files = sorted(src_dir.glob("*.txt")) + + mega_files = [] + for f in files: + lines = f.read_text(errors="replace").splitlines(keepends=True) + boundaries = find_session_boundaries(lines) + if len(boundaries) >= args.min_sessions: + mega_files.append((f, len(boundaries))) + + if not mega_files: + print(f"No mega-files found in {src_dir} (min {args.min_sessions} sessions).") + return + + print(f"\n{'='*60}") + print(f" Mega-file splitter — {'DRY RUN' if args.dry_run else 'SPLITTING'}") + print(f"{'='*60}") + print(f" Source: {src_dir}") + print(f" Output: {output_dir or 'same dir as source'}") + print(f" Mega-files: {len(mega_files)}") + print(f"{'─'*60}\n") + + total_written = 0 + for f, n_sessions in mega_files: + print(f" {f.name} ({n_sessions} sessions, {f.stat().st_size // 1024}KB)") + written = split_file(f, output_dir, dry_run=args.dry_run) + total_written += len(written) + + if not args.dry_run and written: + backup = f.with_suffix(".mega_backup") + f.rename(backup) + print(f" → Original renamed to {backup.name}\n") + else: + print() + + print(f"{'─'*60}") + if args.dry_run: + print(f" DRY RUN — would create {total_written} files from {len(mega_files)} mega-files") + else: + print(f" Done — created {total_written} files from {len(mega_files)} mega-files") + print() + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c22410d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,62 @@ +[build-system] +requires = ["setuptools>=64"] +build-backend = "setuptools.build_meta" + +[project] +name = "mempalace" +version = "3.0.0" +description = "Give your AI a memory — mine projects and conversations into a searchable palace. No API key required." +readme = "README.md" +requires-python = ">=3.9" +license = "MIT" +authors = [ + {name = "milla-jovovich"}, +] +keywords = [ + "ai", "memory", "llm", "rag", "chromadb", "mcp", + "vector-database", "claude", "chatgpt", "embeddings", +] +classifiers = [ + "Development Status :: 4 - Beta", + "Environment :: Console", + "Intended Audience :: Developers", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering :: Artificial Intelligence", + "Topic :: Utilities", +] +dependencies = [ + "chromadb>=0.4.0", + "pyyaml>=6.0", +] + +[project.urls] +Homepage = "https://github.com/milla-jovovich/mempalace" +Repository = "https://github.com/milla-jovovich/mempalace" +"Bug Tracker" = "https://github.com/milla-jovovich/mempalace/issues" + +[tool.setuptools.packages.find] +include = ["mempalace*"] + +[project.scripts] +mempalace = "mempalace:main" + +[project.optional-dependencies] +dev = ["pytest>=7.0", "build>=1.0", "twine>=4.0"] + +[tool.ruff] +line-length = 100 +target-version = "py39" + +[tool.ruff.lint] +select = ["E", "F", "W"] +ignore = ["E501"] + +[tool.ruff.format] +quote-style = "double" + +[tool.pytest.ini_options] +testpaths = ["tests"] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b8949cb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +chromadb>=0.4.0 +pyyaml>=6.0