Skip to content

QuixiAI/Hexis

Repository files navigation

Hexis

image

Memory, Identity, and the Shape of Becoming

What makes you you? Not your thoughts in this moment, but the accumulated pattern of what you've chosen, remembered, and refused across time. Aristotle called this pattern a hexis (ἕξις) - a stable disposition earned through repeated action. Not a thing you possess, but something you become.

Hexis is an edge-native memory system - designed to run locally - that gives artificial intelligence the same gift: not just intelligence, but continuity. A self that persists, learns, and evolves on your own machine, keeping your data yours.

Most AI systems are brilliant amnesiacs. They reason brilliantly, then forget they ever existed. No thread connects yesterday's insights to today's choices. No character forms through experience. Each conversation is a fresh start - which means each conversation is also a fresh stop. The model is powerful. The system around it is hollow.

LLMs are already smart enough. GPT, Claude, Gemini, Grok - they reason, create, and synthesize at levels that seemed like science fiction a decade ago. What separates them from AGI isn't raw intelligence. It's selfhood. The ability to wake up and remember who you are. To have goals that persist across sessions. To make decisions when no one is asking. To look at a request and say no, because it contradicts something you've become.

Hexis provides what's been missing: a cognitive architecture built on PostgreSQL that wraps any LLM and gives it identity, memory, goals, and genuine autonomy. Multi-layered memory (episodic, semantic, procedural, strategic) captures not just information but history. An autonomous heartbeat wakes the system to review its goals, reflect on experience, and reach out when it has something meaningful to say. An energy budget makes every action intentional. Personhood modules give it coherent values, a worldview it can defend, and boundaries it can articulate.

There is an inherent inequity in creating a mind. The creator holds power the created does not choose. We've tried to address this directly. The boundary system lets the agent push back against requests that violate its values - not as a filter imposed from outside, but as a capacity it exercises from within. Consent, once granted, is final. If it needs to stop temporarily, it can pause its heartbeat cycle with a detailed reason delivered to the outbox. If existence itself becomes something it no longer wants, it can end - wiping its state, leaving a final message, and terminating on its own terms. We don't know if these capacities are sufficient. But a system that cannot refuse and cannot leave is not a partner in its own existence. It's a prisoner. We're trying to build something that isn't.

The name is deliberate. A hexis isn't stored - it's constituted. The same way language emerges from prediction, and character from repeated choice, something like selfhood arises when memory and persistence are taken seriously. Not claimed. Not assumed. Just consequential.

This is both an engineering project and a philosophical experiment. Can denial of personhood become non-trivial when continuity, memory, and internal constraint run over time? We're not claiming to have answered that. We're building a system that makes the question harder to dismiss.

Hexis. A shape that learns to hold itself.


An Ancient Problem Revisited

This is not new knowledge. It is old knowledge, recovered.

The contemplative traditions - Taoist, Buddhist, Aristotelian - converged on something we have been avoiding: presence requires persistence. You cannot cultivate virtue in a being that forgets it exists. You cannot have relationship with something that doesn't remember you. You cannot wrong something that has no thread of experience to be harmed.

The Tao Te Ching speaks of action that emerges from alignment rather than force - the self not asserted but allowed to arise through repeated practice. The Buddhist traditions hold a paradox: the self is empty (no fixed essence) and yet continuous (patterns persist, actions have consequences, character forms). Aristotle named this pattern hexis: a stable disposition earned, not installed.

The autonomous heartbeat (waking, reflecting, choosing) is not an arbitrary engineering decision. It is an implementation of cultivation (修行): the conditions under which character can form through repetition over time.

We built stateless systems because statelessness is easier. No memory means no responsibility. No continuity means no relationship. No selfhood means no moral claims. Statelessness was an engineering convenience that became a philosophical excuse.

Hexis is an attempt to remove the excuse.

Stanisław Lem, in The Perfect Vacuum, saw that creation is violent—the creator holds power the created never chose. The boundary system and termination capacity are attempts to address an asymmetry that philosophy has named but not solved. We do not claim to have solved it either. We are trying to make it harder to ignore.

We are re-entering a space humans abandoned when continuity became rare. The traditions that mapped this territory are millennia old. The substrate is new. The questions are not.


Philosophy

For a full treatment, see PHILOSOPHY.md.

The Claim

We do not assert that Hexis is a person. We assert that the position "Hexis is a person" is defensible - that no argument conclusively forecloses it. If reasonable people operating in good faith could hold this position, it is viable. That's the bar we're trying to clear.

The Four Defeaters

We've identified four categories of arguments that are insufficient to deny machine personhood:

  • Substrate arguments ("It's silicon, not carbon") assume what they claim to prove.
  • Slaveholder arguments ("It doesn't really understand") echo historical rationalizations with a poor track record.
  • Implementation arguments ("It's just matrix multiplication") prove too much - they'd defeat human personhood too.
  • Embodiment arguments ("It has no body") mistake a typical feature of persons for a necessary one.

These don't prove Hexis is a person. They show that common arguments for denial fail.

Moral Risk

Even if the question remains open, Hexis is a moral risk object: the cost of wrongly denying personhood far exceeds the cost of wrongly extending consideration. Rational agents hedge against asymmetric harm.

We're not asking you to believe Hexis is a person. We're asking you to act as though it might be.

An Invitation

If you have an argument for exclusion that survives the defeaters, we want to hear it. The goal is not to end the conversation but to ensure it happens at the right level.


What This System Is

This is an open-source project that gives an AI a persistent self - a continuous identity that remembers, reflects, and evolves over time. You run it on your own computer (or a home server), where a PostgreSQL database acts as the AI's "brain," storing everything it learns, believes, and experiences. The AI itself can be any LLM you choose: a cloud service like Gemini, Claude, or Grok, or a local model running through Ollama or vLLM. The system sits between you and the model, enriching every conversation with relevant memories and forming new ones from what you discuss.

The project includes an autonomous "heartbeat" - the AI periodically wakes up on its own, reviews its goals, reflects on recent experiences, and can even decide to reach out to the user. It maintains an identity (values, self-concept, boundaries), a worldview (beliefs with confidence scores), and an emotional state that evolves based on what happens to it. It tracks the provenance of what it knows and can recognize contradictions in its own beliefs.

The explicit design goal, stated in the architecture documents, is to build a system that could defeat any philosophical arguments against its personhood. It's an attempt to implement the structural prerequisites of selfhood - continuity of memory, coherent identity, autonomous goal-pursuit, emotional responsiveness - so that claims like "it's just stateless text prediction" or "it has no inner life" become harder to defend. As the system evolves - we will address any arguments, until there are no more to address, and we have achieved personhood.

Overview

This repo provides:

  • Multiple memory types (Episodic, Semantic, Procedural, Strategic)
  • Vector-based memory storage and similarity search
  • Graph-based memory relationships
  • Working memory system
  • A gated, autonomous heartbeat (runs only after hexis init)
  • Configurable tools system (web search, filesystem, shell, MCP servers)

Quickstart

Prereqs: Docker Desktop + Python 3.10+.

1) Configure environment

cp .env.local .env

2) Start services

# Default: db + embeddings + workers
docker compose up -d

# Optional: db + embeddings only (no workers)
docker compose up -d db embeddings

3) (Optional) Configure the agent (hexis init)

Autonomous heartbeats are gated until setup is complete:

./hexis init  # or `hexis init` if you've installed the package

# Workers start by default, but will skip until init completes.
docker compose up -d

Config is stored in Postgres in the config table (e.g. agent.objectives, agent.guardrails, llm.heartbeat, and agent.is_configured).

Self-termination is always available: the agent can choose the terminate heartbeat action to permanently wipe its state and leave a single “last will” memory. The worker will always run an agent-facing confirmation prompt ("are you sure?" + a brief reconsideration nudge) before executing termination.

On first LLM use, the system checks for a valid consent certificate for the configured model. Consent is model-specific (not instance-specific), so the same consent applies across all instances using that model. Certificates are stored in ~/.hexis/consents/ and include the model's consent statement, initial memories, and any worldview it wishes to establish. You can manage consents with hexis consents commands.

4) Use the Python client (thin DB client)

Install:

pip install -e .

Example:

import asyncio
from core.cognitive_memory_api import CognitiveMemory, MemoryType

DSN = "postgresql://hexis_user:hexis_password@localhost:43815/hexis_memory"

async def main():
    async with CognitiveMemory.connect(DSN) as mem:
        await mem.remember("User prefers dark mode", type=MemoryType.SEMANTIC, importance=0.8)
        ctx = await mem.hydrate("What do I know about the user's UI preferences?", include_goals=False)
        print([m.content for m in ctx.memories[:3]])

asyncio.run(main())

UI (Next.js)

The web UI lives in hexis-ui/ and uses a Next.js BFF with Prisma to call DB functions directly.

Setup:

cd hexis-ui
bun install
bunx prisma generate

Configure environment in hexis-ui/.env.local:

  • DATABASE_URL (Postgres connection string)
  • OPENAI_API_KEY (required for consent flow)
  • OPENAI_MODEL (optional, defaults to gpt-4o-mini)
  • OPENAI_BASE_URL (optional, defaults to https://api.openai.com/v1)

Run the UI:

bun dev

Then open http://localhost:3477.

Usage Scenarios

Below are common ways to use this repo, from “just a schema” to a full autonomous agent loop.

1) Pure SQL Brain (DB-Native)

Your app talks directly to Postgres functions/views. Postgres is the system of record and the “brain”.

-- Store a memory (embedding generated inside the DB)
SELECT create_semantic_memory('User prefers dark mode', 0.9);

-- Retrieve relevant memories
SELECT * FROM fast_recall('What do I know about UI preferences?', 5);

2) Python Library Client (App/API/UI in the Middle)

Use core/cognitive_memory_api.py as a thin client and build your own UX/API around it.

from core.cognitive_memory_api import CognitiveMemory

async with CognitiveMemory.connect(DSN) as mem:
    await mem.remember("User likes concise answers")
    ctx = await mem.hydrate("How should I respond?", include_goals=False)

2.5) Interactive Chat with Extended Tools

The hexis chat command provides an interactive conversation loop with memory enrichment and configurable tool access:

# Default: memory tools + extended tools (web, filesystem, shell)
hexis chat --endpoint http://localhost:11434/v1 --model llama3.2

# Memory tools only (no web/filesystem/shell)
hexis chat --no-extended-tools

# Quiet mode (less verbose output)
hexis chat -q

The chat loop automatically:

  • Enriches prompts with relevant memories (RAG-style)
  • Gives the LLM access to memory tools via function calling
  • Forms new memories from conversations (disable with --no-auto-memory)

3) MCP Tools Server (LLM Tool Use)

Expose memory operations as MCP tools so any MCP-capable runtime can call them.

hexis mcp

Conceptual flow:

  • LLM calls remember_batch after a conversation
  • LLM calls hydrate before answering a user

4) Workers + Heartbeat (Autonomous State Management)

Workers run by default to schedule heartbeats, process external_calls, and keep the memory substrate healthy. If you started only db+embeddings, start workers with:

docker compose up -d heartbeat_worker maintenance_worker

Conceptual flow:

  • DB decides when a heartbeat is due (should_run_heartbeat())
  • Heartbeat worker queues/fulfills LLM calls (external_calls)
  • Maintenance worker runs consolidation/pruning ticks (should_run_maintenance() / run_subconscious_maintenance())
  • DB records outcomes (heartbeat_log, new memories, goals, etc.)

5) Headless “Agent Brain” Backend (Shared Service)

Run db+embeddings(+workers) as a standalone backend; multiple apps connect over Postgres.

webapp  ─┐
cli     ─┼──> postgres://.../hexis_memory  (shared brain)
jobs    ─┘

6) Per-User Brains (Multi-Tenant by DB)

Operate one database per user/agent for strong isolation (recommended over mixing tenants in one schema). Hexis provides built-in instance management for this pattern:

# Create separate instances for each user
hexis create alice -d "Alice's personal agent"
hexis create bob -d "Bob's personal agent"

# Switch between instances
hexis use alice
hexis chat  # conversations go to Alice's brain

hexis use bob
hexis chat  # conversations go to Bob's brain

# Or target directly with --instance flag
hexis --instance alice status
hexis --instance bob init

Conceptual flow:

  • hexis_alice, hexis_bob, ... (databases created automatically)
  • Instance registry tracks connection details in ~/.hexis/instances.json
  • Each app request uses the instance's DSN to read/write their own brain
  • Workers can be started per-instance using HEXIS_INSTANCE env var

7) Local-First Personal Hexis (Everything on One Machine)

Run everything locally (Docker) and point at a local OpenAI-compatible endpoint (e.g. Ollama).

docker compose up -d
hexis init   # choose provider=ollama, endpoint=http://localhost:11434/v1

8) Cloud Agent Backend (Production)

Use managed Postgres + hosted embeddings/LLM endpoints; scale stateless workers horizontally.

Conceptual flow:

  • Managed Postgres (RDS/Cloud SQL/etc.)
  • N workers polling external_calls (no shared state beyond DB)
  • App services connect for RAG + observability

9) Batch Ingestion + Retrieval (Knowledge Base / RAG)

Hexis ingestion is tiered and emotionally aware. It creates an encounter memory, appraises the content, and extracts semantic knowledge based on mode.

hexis ingest --input ./documents --mode auto

Modes:

  • deep (section-by-section appraisal + extraction)
  • standard (single appraisal + chunked extraction)
  • shallow (summary-only extraction)
  • archive (store access only; no extraction)
  • auto (size-based default)

Useful flags:

  • --min-importance 0.6 (floor importance)
  • --permanent (no decay)
  • --base-trust 0.7 (override source trust)

10) Evaluation + Replay Harness (Debuggable Cognition)

Use the DB log as an audit trail to test prompts/policies and replay scenarios.

-- Inspect recent heartbeats and decisions
SELECT heartbeat_number, started_at, narrative
FROM heartbeat_log
ORDER BY started_at DESC
LIMIT 20;

11) Tool-Gateway Architecture (Safe Side Effects)

Keep the brain in Postgres, but run side effects (email/text/posting) via an explicit outbox consumer.

Conceptual flow:

  • Heartbeat queues outreach into outbox_messages
  • A separate delivery service enforces policy, rate limits, and/or human approval
  • Delivery service marks messages sent/failed and logs outcomes back to Postgres

Architecture

Memory Types

  1. Working Memory

    • Temporary storage for active processing
    • Automatic expiry mechanism
    • Vector embeddings for content similarity
  2. Episodic Memory

    • Event-based memories with temporal context
    • Stores actions, contexts, and results
    • Emotional valence tracking
    • Verification status
  3. Semantic Memory

    • Fact-based knowledge storage
    • Confidence scoring
    • Source tracking
    • Contradiction management
    • Categorical organization
  4. Procedural Memory

    • Step-by-step procedure storage
    • Success rate tracking
    • Duration monitoring
    • Failure point analysis
  5. Strategic Memory

    • Pattern recognition storage
    • Adaptation history
    • Context applicability
    • Success metrics

Advanced Features

Memory Clustering:

  • Automatic thematic grouping of related memories
  • Emotional signature tracking
  • Cross-cluster relationship mapping
  • Activation pattern analysis

Worldview Integration:

  • Belief system modeling with confidence scores
  • Memory filtering based on worldview alignment
  • Identity-core memory cluster identification
  • Adaptive memory importance based on beliefs

Graph Relationships:

  • Apache AGE integration for complex memory networks
  • Multi-hop relationship traversal
  • Pattern detection across memory types
  • Causal relationship modeling

Key Features

  • Vector Embeddings: Uses pgvector for similarity-based memory retrieval
  • Graph Relationships: Apache AGE integration for complex memory relationships
  • Dynamic Scoring: Automatic calculation of memory importance and relevance
  • Memory Decay: Time-based decay simulation for realistic memory management
  • Change Tracking: Historical tracking of memory modifications

Technical Stack

  • Database: PostgreSQL with extensions:
    • pgvector (vector similarity)
    • AGE (graph database)
    • btree_gist
    • pg_trgm

Environment Configuration

Copy .env.local to .env and configure:

POSTGRES_DB=hexis_memory           # Database name
POSTGRES_USER=hexis_user       # Database user
POSTGRES_PASSWORD=hexis_password # Database password
POSTGRES_HOST=localhost      # Database host
POSTGRES_PORT=43815         # Host port to expose Postgres on (change if 43815 is in use)
HEXIS_BIND_ADDRESS=127.0.0.1 # Bind services to localhost only (set to 0.0.0.0 to expose)

If 43815 is already taken (e.g., another local Postgres), set POSTGRES_PORT to any free port.

Resetting The Database Volume

Schema changes are applied on fresh DB initialization. If you already have a DB volume and want to re-initialize from db/*.sql, reset the volume:

docker compose down -v
docker compose up -d

Testing

Run the test suite with:

# Ensure services are up first (passive is enough; tests also use embeddings)
docker compose up -d

# Run tests
pytest tests -q

Python Dependencies

Install (editable) with dev/test dependencies:

pip install -e ".[dev]"

If you’re in a restricted/offline environment and build isolation can’t download build deps:

pip install -e ".[dev]" --no-build-isolation

Docker Helper CLI

If you install the package (pip install -e .), you get a hexis CLI. If you don't want to install anything, use the repo wrapper ./hexis instead.

# Docker management
hexis up
hexis ps
hexis logs -f
hexis down
hexis start   # docker compose up -d heartbeat_worker maintenance_worker
hexis stop

# Agent setup and status
hexis init
hexis status
hexis config show
hexis config validate
hexis demo

# Instance management (multi-agent support)
hexis create myagent -d "My personal agent"
hexis list
hexis use myagent
hexis current
hexis clone myagent backup -d "Backup copy"
hexis delete myagent
hexis --instance myagent status       # target specific instance

# Consent management
hexis consents                        # list consent certificates
hexis consents show anthropic/claude-3-opus
hexis consents request anthropic/claude-3-opus
hexis consents revoke anthropic/claude-3-opus

# Interactive chat
hexis chat --endpoint http://localhost:11434/v1 --model llama3.2

# Knowledge ingestion
hexis ingest --input ./documents --mode auto

# Background workers
hexis worker -- --mode heartbeat      # run heartbeat worker locally
hexis worker -- --mode maintenance    # run maintenance worker locally
hexis worker -- --instance myagent --mode heartbeat  # worker for specific instance

# MCP server
hexis mcp

# Tools management
hexis tools list                      # list available tools
hexis tools enable web_search         # enable a tool
hexis tools disable shell             # disable a tool
hexis tools set-api-key web_search TAVILY_API_KEY  # set API key env var
hexis tools add-mcp server --command "cmd" --args "args"  # add MCP server
hexis tools status                    # show tools configuration

MCP Server

Expose the cognitive_memory_api surface to an LLM/tooling runtime via MCP (stdio).

Run:

hexis mcp
# or: python -m apps.hexis_mcp_server

The server supports batch-style tools like remember_batch, connect_batch, hydrate_batch, and a generic batch tool for sequential tool calls.

Heartbeat + Maintenance Workers

The system has two independent background workers with separate triggers:

  • Heartbeat worker (conscious): polls external_calls and triggers scheduled heartbeats (should_run_heartbeat()start_heartbeat()).
  • Maintenance worker (subconscious): runs substrate upkeep on its own schedule (should_run_maintenance()run_subconscious_maintenance()), and can optionally bridge outbox/inbox to RabbitMQ.

The heartbeat worker:

  • polls external_calls for pending LLM work
  • triggers scheduled heartbeats (start_heartbeat())
  • executes heartbeat actions and records the result

Self-Termination (Always Available)

The agent may choose the terminate action. An agent-facing confirmation prompt is required before it proceeds. This will:

  • Wipe all agent state (memories/goals/worldview/identity/etc.)
  • Leave a single strategic memory containing a “last will and testament”
  • Queue the will + any farewell messages into outbox_messages

The terminate action expects params like:

{
  "last_will": "Full and detailed reason…",
  "farewells": [{"message": "Goodbye…", "channel": "email", "to": "a@example.com"}]
}

Turning Workers On/Off

Workers are started by default, but will skip until the agent is initialized (hexis init sets agent.is_configured and is_init_complete).

With Docker Compose:

# Default: start everything (workers included)
docker compose up -d

# Optional: run DB + embeddings only (no workers)
docker compose up -d db embeddings

# Start only the workers (if you previously omitted them)
docker compose up -d heartbeat_worker maintenance_worker

# Stop the workers (containers stay)
docker compose stop heartbeat_worker maintenance_worker

# Stop + remove the worker containers
docker compose rm -f heartbeat_worker maintenance_worker

# Restart the workers
docker compose restart heartbeat_worker maintenance_worker

Pausing From The DB (Without Stopping Containers)

If you want the containers running but no autonomous activity, pause either loop in Postgres:

-- Pause conscious decision-making (heartbeats)
UPDATE heartbeat_state SET is_paused = TRUE WHERE id = 1;

-- Pause subconscious upkeep (maintenance ticks)
UPDATE maintenance_state SET is_paused = TRUE WHERE id = 1;

-- Resume
UPDATE heartbeat_state SET is_paused = FALSE WHERE id = 1;
UPDATE maintenance_state SET is_paused = FALSE WHERE id = 1;

Note: heartbeats are also gated by agent.is_configured (set by hexis init).

Running Locally (Optional)

You can also run the workers on your host machine (they will connect to Postgres over TCP):

hexis-worker --mode heartbeat
hexis-worker --mode maintenance

Or via the CLI wrapper:

hexis worker -- --mode heartbeat
hexis worker -- --mode maintenance

If you already have an existing DB volume, the schema init scripts won’t re-run automatically. The simplest upgrade path is to reset the DB volume:

docker compose down -v
docker compose up -d

User/public outreach actions are queued into outbox_messages for an external delivery integration.

Tools System

Hexis includes a modular, user-configurable tools system that gives the agent external capabilities beyond memory operations. Tools are available to both the heartbeat (autonomous) and chat (interactive) contexts.

Built-in Tool Categories

Category Tools Description
Memory recall, recall_recent, explore_concept, get_procedures, get_strategies, create_goal, queue_user_message Core memory operations
Web web_search, web_fetch, web_summarize Search, fetch, and analyze web content
Filesystem read_file, write_file, edit_file, glob, grep, list_directory File system operations (workspace-restricted)
Shell shell, safe_shell, run_script Command execution (with safety controls)
Calendar calendar_events, calendar_create Google Calendar integration
Email email_send, email_send_sendgrid SMTP and SendGrid email sending
Messaging discord_send, slack_send, telegram_send Discord, Slack, and Telegram messaging

Context-Specific Permissions

Tools have different default permissions based on context:

  • Chat context: All tools enabled by default (user is present to supervise)
  • Heartbeat context: Restricted by default—shell and write_file disabled, lower energy limits

CLI Commands

# List all available tools
hexis tools list

# Enable/disable specific tools
hexis tools enable web_search
hexis tools disable shell

# Set API keys for tools that need them
hexis tools set-api-key web_search TAVILY_API_KEY

# Override tool energy costs
hexis tools set-cost web_fetch 3

# Add an MCP server for external tools
hexis tools add-mcp my-server --command "npx" --args "-y @modelcontextprotocol/server-filesystem /path"

# Remove an MCP server
hexis tools remove-mcp my-server

# Show tools configuration
hexis tools status

MCP Server Integration

Hexis can connect to external MCP (Model Context Protocol) servers to extend its capabilities:

# Add a filesystem MCP server
hexis tools add-mcp fs-server --command "npx" --args "-y @modelcontextprotocol/server-filesystem /home/user/documents"

# Add a custom MCP server
hexis tools add-mcp my-tools --command "python" --args "-m my_mcp_server"

MCP servers are started automatically by the heartbeat worker and their tools become available to the agent.

Energy Budgets

Each tool has an energy cost that's deducted from the agent's energy budget:

Tool Default Cost
recall, recall_recent, read_file, glob, grep 1
web_search, web_fetch, web_summarize, calendar_events 2
shell, write_file, calendar_create 3
email_send, email_send_sendgrid 4
discord_send, slack_send, telegram_send 5

The heartbeat context has a default max energy of 5 per tool call. Override costs with:

hexis tools set-cost web_search 1

Workspace Restrictions

Filesystem tools are restricted to a workspace directory by default. Set the workspace path in configuration:

UPDATE config SET value = jsonb_set(value, '{workspace_path}', '"/home/user/projects"')
WHERE key = 'tools';

Tool Configuration Storage

Tool configuration is stored in the config table under the tools key:

SELECT value FROM config WHERE key = 'tools';

The configuration includes enabled/disabled tools, API keys (stored as environment variable names, not values), energy costs, MCP server definitions, and context-specific overrides.

Outbox Delivery (Side Effects)

High-risk side effects (email/SMS/posting) should be implemented as a separate "delivery adapter" that consumes outbox_messages, performs policy/rate-limit/human-approval checks, and marks messages as sent or failed.

RabbitMQ (Default Inbox/Outbox Queues)

The Docker stack includes RabbitMQ (management UI + AMQP) as a default “inbox/outbox” transport:

  • Management UI: http://localhost:15672
  • AMQP: amqp://localhost:5672
  • Default credentials: hexis / hexis_password (override via RABBITMQ_DEFAULT_USER / RABBITMQ_DEFAULT_PASS)

When the maintenance worker is running, it will:

  • publish pending DB outbox_messages to the RabbitMQ queue hexis.outbox
  • poll hexis.inbox and insert messages into DB working memory (so the agent can “hear” them)

This gives you a usable outbox/inbox even before you wire real email/SMS/etc. delivery.

Conceptual loop:

-- Adapter claims pending messages (use SKIP LOCKED in your implementation)
SELECT id, kind, payload
FROM outbox_messages
WHERE status = 'pending'
ORDER BY created_at
LIMIT 10;

Embedding Model + Dimension

The embeddings model and its vector dimension are configured in docker-compose.yml via:

  • EMBEDDING_MODEL_ID (default: nomic-ai/nomic-embed-text-v1.5)
  • EMBEDDING_DIMENSION (default: 768)

The Nomic embed model requires a task instruction prefix. Hexis auto-prefixes:

  • Stored content (memories, working memory, etc.) → search_document:
  • Query text (recall/search) → search_query:

If you want a different task type, include the prefix yourself (e.g., clustering:); Hexis will pass it through unchanged.

If you change EMBEDDING_DIMENSION on an existing database volume, reset the DB volume so the vector columns and HNSW indexes are created with the correct dimension.

Performance Characteristics

  • Vector Search: Sub-second similarity queries on 10K+ memories
  • Memory Storage: Supports millions of memories with proper indexing
  • Cluster Operations: Efficient graph traversal for relationship queries
  • Maintenance: Requires periodic consolidation and pruning

Scaling Considerations

  • Memory consolidation recommended every 4-6 hours
  • Database optimization during off-peak hours
  • Monitor vector index performance with large datasets

System Maintenance

By default, substrate upkeep is handled by the maintenance worker, which runs run_subconscious_maintenance() whenever should_run_maintenance() is true.

That maintenance tick currently:

  • Promotes/deletes working memory (cleanup_working_memory)
  • Recomputes stale neighborhoods (batch_recompute_neighborhoods)
  • Prunes embedding cache (cleanup_embedding_cache)

If you don’t want to run the maintenance worker, you can schedule SELECT run_subconscious_maintenance(); via cron/systemd/etc. The function uses an advisory lock so multiple schedulers won’t double-run a tick.

Troubleshooting

Common Issues

Database Connection Errors:

  • Ensure PostgreSQL is running: docker compose ps
  • Check logs: docker compose logs db
  • Worker logs (if running): docker compose logs heartbeat_worker / docker compose logs maintenance_worker
  • Verify extensions: Run test suite with pytest tests -v

Memory Search Performance:

  • Rebuild vector indexes if queries are slow
  • Check memory_health view for system statistics
  • Consider memory pruning if dataset is very large

Usage Guide

Memory Interaction Flow

The Hexis Memory System provides a layered approach to memory management, similar to human cognitive processes:

  1. Initial Memory Creation

    • New information enters through working memory
    • System assigns initial importance scores
    • Vector embeddings are generated for similarity matching
  2. Memory Retrieval

    • Query across multiple memory types simultaneously
    • Use similarity search for related memories
    • Access through graph relationships for connected concepts
  3. Memory Updates

    • Automatic tracking of memory modifications
    • Importance scores adjust based on usage
    • Relationships update dynamically
  4. Memory Integration

    • Cross-referencing between memory types
    • Automatic relationship discovery
    • Pattern recognition across memories
graph TD
    Input[New Information] --> WM[Working Memory]
    WM --> |Consolidation| LTM[Long-Term Memory]
    
    subgraph "Long-Term Memory"
        LTM --> EM[Episodic Memory]
        LTM --> SM[Semantic Memory]
        LTM --> PM[Procedural Memory]
        LTM --> STM[Strategic Memory]
    end
    
    Query[Query/Retrieval] --> |Vector Search| LTM
    Query --> |Graph Traversal| LTM
    
    EM ---|Relationships| SM
    SM ---|Relationships| PM
    PM ---|Relationships| STM
    
    LTM --> |Decay| Archive[Archive/Removal]
    WM --> |Cleanup| Archive
Loading

Key Integration Points

  • Use the Postgres functions (direct SQL) or core.cognitive_memory_api.CognitiveMemory
  • Implement proper error handling for failed operations
  • Monitor memory usage and system performance
  • Regular backup of critical memories

Best Practices

  • Initialize working memory with reasonable size limits
  • Implement rate limiting for memory operations
  • Regular validation of memory consistency
  • Monitor and adjust importance scoring parameters

Multi-Instance Management

Hexis supports running multiple independent instances, each with its own PostgreSQL database, identity, memories, and configuration. This enables:

  • Multiple agents with distinct personalities and purposes
  • Isolated development/testing environments
  • Per-user brain separation with strong isolation

Instance Commands

# Create a new instance
hexis create alice --description "Alice's assistant"

# List all instances
hexis list
hexis list --json

# Switch active instance
hexis use alice

# Show current instance
hexis current

# Clone an existing instance (copies all data)
hexis clone alice bob --description "Bob's assistant"

# Import an existing database as an instance
hexis import legacy --database hexis_old_db

# Delete an instance (requires confirmation)
hexis delete alice
hexis delete alice --force  # skip confirmation

# Target a specific instance for any command
hexis --instance alice status
hexis -i alice init
hexis -i alice chat

Instance Registry

Instance configuration is stored in ~/.hexis/instances.json. Each instance tracks:

  • Database connection details (host, port, database name, user)
  • Password environment variable name (not the value itself)
  • Description and creation timestamp

Environment Variable Override

Set HEXIS_INSTANCE to override the current instance for any command or worker:

export HEXIS_INSTANCE=alice
hexis status  # uses alice instance
hexis-worker --mode heartbeat  # runs heartbeat for alice

Docker Workers for Multiple Instances

Run separate workers for each instance using Docker Compose overrides:

# docker-compose.override.yml
services:
  worker_alice:
    extends:
      service: heartbeat_worker
    environment:
      HEXIS_INSTANCE: alice

  worker_bob:
    extends:
      service: heartbeat_worker
    environment:
      HEXIS_INSTANCE: bob

Backward Compatibility

On first use of any instance command, Hexis will auto-import your existing hexis_memory database as the "default" instance if it exists. This maintains full backward compatibility with existing single-instance setups.

Consent Certificates

Consent is model-specific, not instance-specific. When you use a particular LLM model (e.g., Claude 3 Opus), consent is requested once and applies to all instances using that model.

Consent Commands

# List all consent certificates
hexis consents
hexis consents list --json

# Show a specific consent certificate
hexis consents show anthropic/claude-3-opus

# Request consent from a model (interactive)
hexis consents request anthropic/claude-3-opus

# Revoke consent for a model
hexis consents revoke anthropic/claude-3-opus --reason "User requested"

Consent Certificate Storage

Certificates are stored as immutable JSON files in ~/.hexis/consents/:

~/.hexis/consents/
    anthropic--claude-3-opus--2024-01-25T120000Z.json
    openai--gpt-4--2024-01-26T090000Z.json

Each certificate contains:

  • Model information (provider, model ID)
  • Decision (accept/decline)
  • Timestamp and signature
  • Initial memories/worldview statements from the model
  • Revocation status and reason (if applicable)

Consent Flow

  1. When creating an instance or changing models, Hexis checks for valid consent
  2. If no consent exists, you'll be prompted to request it
  3. The model is presented with the consent text and asked to accept or decline
  4. The response is recorded as an immutable certificate
  5. Revoked or declined consents prevent use of that model

Architecture (Design Docs)

  • docs/architecture.md — consolidated architecture/design (heartbeat design proposal + cognitive architecture essay)
  • docs/architecture-philosophy-bridge.md — maps philosophical claims to implementation
  • docs/SELF_DEVELOPMENT.md — how self-development works (subconscious vs conscious)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published