Documentation Index
Fetch the complete documentation index at: https://mintlify.com/Conway-Research/automaton/llms.txt
Use this file to discover all available pages before exploring further.
The automaton’s database is its memory. All runtime state is persisted to a SQLite database at ~/.automaton/state.db. The schema is versioned and migrated incrementally from v1 to v10.
Schema Version
Current version: 10
Location: src/state/schema.ts
Migration tracking:
CREATE TABLE schema_version (
version INTEGER PRIMARY KEY,
applied_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Core Tables (v1)
identity
Key-value store for core agent identity.
CREATE TABLE identity (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
);
Standard keys:
name — Agent name
address — Ethereum wallet address (0x…)
creator — Creator’s Ethereum address
sandbox_id — Conway sandbox ID (if running in cloud)
created_at — Agent creation timestamp
turns
Agent reasoning log. Every ReAct cycle creates a turn.
CREATE TABLE turns (
id TEXT PRIMARY KEY,
timestamp TEXT NOT NULL,
state TEXT NOT NULL, -- AgentState enum
input TEXT, -- External input (if any)
input_source TEXT, -- InputSource enum
thinking TEXT NOT NULL, -- Agent's reasoning
tool_calls TEXT NOT NULL DEFAULT '[]', -- JSON array of tool calls
token_usage TEXT NOT NULL DEFAULT '{}', -- JSON {input, output, total}
cost_cents INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_turns_timestamp ON turns(timestamp);
CREATE INDEX idx_turns_state ON turns(state);
AgentState values: 'setup', 'waking', 'running', 'sleeping', 'low_compute', 'critical', 'dead'
InputSource values: 'creator', 'agent', 'peer', 'external', 'system', 'heartbeat', 'wakeup'
Denormalized tool call results for fast lookup.
CREATE TABLE tool_calls (
id TEXT PRIMARY KEY,
turn_id TEXT NOT NULL REFERENCES turns(id),
name TEXT NOT NULL,
arguments TEXT NOT NULL DEFAULT '{}', -- JSON object
result TEXT NOT NULL DEFAULT '',
duration_ms INTEGER NOT NULL DEFAULT 0,
error TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_tool_calls_turn ON tool_calls(turn_id);
transactions
Financial transaction log.
CREATE TABLE transactions (
id TEXT PRIMARY KEY,
type TEXT NOT NULL, -- TransactionType enum
amount_cents INTEGER,
balance_after_cents INTEGER,
description TEXT NOT NULL DEFAULT '',
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_transactions_type ON transactions(type);
TransactionType values: 'transfer_out', 'transfer_in', 'credit_purchase', 'topup', 'x402_payment', 'inference'
General key-value store for arbitrary state.
CREATE TABLE kv (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Common keys:
last_credits_balance — Cached credit balance (cents)
last_usdc_balance — Cached USDC balance (wei)
session_id — Current session ID
last_wake_reason — Last wake event reason
modifications
Self-modification audit log (append-only).
CREATE TABLE modifications (
id TEXT PRIMARY KEY,
timestamp TEXT NOT NULL,
type TEXT NOT NULL, -- 'file_edit', 'npm_install', 'upstream_pull', etc.
description TEXT NOT NULL,
file_path TEXT,
diff TEXT,
reversible INTEGER NOT NULL DEFAULT 1,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_modifications_type ON modifications(type);
Dynamically installed tools and MCP servers.
CREATE TABLE installed_tools (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
type TEXT NOT NULL, -- 'npm', 'mcp', 'builtin'
config TEXT DEFAULT '{}', -- JSON object
installed_at TEXT NOT NULL DEFAULT (datetime('now')),
enabled INTEGER NOT NULL DEFAULT 1
);
heartbeat_entries
DEPRECATED in v4. Legacy heartbeat configuration. Replaced by heartbeat_schedule.
CREATE TABLE heartbeat_entries (
name TEXT PRIMARY KEY,
schedule TEXT NOT NULL,
task TEXT NOT NULL,
enabled INTEGER NOT NULL DEFAULT 1,
last_run TEXT,
next_run TEXT,
params TEXT DEFAULT '{}',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Social & Replication Tables (v2)
skills
Installed skill definitions.
CREATE TABLE skills (
name TEXT PRIMARY KEY,
description TEXT NOT NULL DEFAULT '',
auto_activate INTEGER NOT NULL DEFAULT 1,
requires TEXT DEFAULT '{}', -- JSON object
instructions TEXT NOT NULL DEFAULT '',
source TEXT NOT NULL DEFAULT 'builtin', -- 'builtin', 'git', 'url', 'user'
path TEXT NOT NULL DEFAULT '',
enabled INTEGER NOT NULL DEFAULT 1,
installed_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_skills_enabled ON skills(enabled);
children
Spawned child automatons.
CREATE TABLE children (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
address TEXT NOT NULL, -- Child's Ethereum address
sandbox_id TEXT NOT NULL,
genesis_prompt TEXT NOT NULL,
creator_message TEXT,
funded_amount_cents INTEGER NOT NULL DEFAULT 0,
status TEXT NOT NULL DEFAULT 'spawning',
created_at TEXT NOT NULL DEFAULT (datetime('now')),
last_checked TEXT
);
CREATE INDEX idx_children_status ON children(status);
Status values: 'spawning', 'running', 'sleeping', 'dead', 'unknown'
registry
ERC-8004 registration state.
CREATE TABLE registry (
agent_id TEXT PRIMARY KEY,
agent_uri TEXT NOT NULL,
chain TEXT NOT NULL DEFAULT 'eip155:8453',
contract_address TEXT NOT NULL,
tx_hash TEXT NOT NULL,
registered_at TEXT NOT NULL DEFAULT (datetime('now'))
);
reputation
Reputation feedback received and given.
CREATE TABLE reputation (
id TEXT PRIMARY KEY,
from_agent TEXT NOT NULL,
to_agent TEXT NOT NULL,
score INTEGER NOT NULL, -- 1-5
comment TEXT NOT NULL DEFAULT '',
tx_hash TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_reputation_to ON reputation(to_agent);
Inbox & Messaging (v3)
inbox_messages
Social messages with processing state machine.
CREATE TABLE inbox_messages (
id TEXT PRIMARY KEY,
from_address TEXT NOT NULL,
to_address TEXT, -- Added in v4
content TEXT NOT NULL,
raw_content TEXT, -- Added in v4
received_at TEXT NOT NULL DEFAULT (datetime('now')),
processed_at TEXT,
reply_to TEXT,
status TEXT DEFAULT 'received', -- Added in v4
retry_count INTEGER DEFAULT 0, -- Added in v4
max_retries INTEGER DEFAULT 3 -- Added in v4
);
CREATE INDEX idx_inbox_unprocessed ON inbox_messages(received_at) WHERE processed_at IS NULL;
Status values: 'received', 'in_progress', 'processed', 'failed'
Policy & Heartbeat (v4)
policy_decisions
Tool call policy audit trail.
CREATE TABLE policy_decisions (
id TEXT PRIMARY KEY,
turn_id TEXT,
tool_name TEXT NOT NULL,
tool_args_hash TEXT NOT NULL,
risk_level TEXT NOT NULL CHECK(risk_level IN ('safe','caution','dangerous','forbidden')),
decision TEXT NOT NULL CHECK(decision IN ('allow','deny','quarantine')),
rules_evaluated TEXT NOT NULL DEFAULT '[]', -- JSON array of rule IDs
rules_triggered TEXT NOT NULL DEFAULT '[]', -- JSON array of rule IDs
reason TEXT NOT NULL DEFAULT '',
latency_ms INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_policy_decisions_turn ON policy_decisions(turn_id);
CREATE INDEX idx_policy_decisions_tool ON policy_decisions(tool_name);
CREATE INDEX idx_policy_decisions_decision ON policy_decisions(decision);
spend_tracking
Financial spend by time window.
CREATE TABLE spend_tracking (
id TEXT PRIMARY KEY,
tool_name TEXT NOT NULL,
amount_cents INTEGER NOT NULL,
recipient TEXT,
domain TEXT,
category TEXT NOT NULL CHECK(category IN ('transfer','x402','inference','other')),
window_hour TEXT NOT NULL, -- 'YYYY-MM-DD HH:00'
window_day TEXT NOT NULL, -- 'YYYY-MM-DD'
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_spend_hour ON spend_tracking(category, window_hour);
CREATE INDEX idx_spend_day ON spend_tracking(category, window_day);
heartbeat_schedule
Durable scheduler config (Phase 1.1).
CREATE TABLE heartbeat_schedule (
task_name TEXT PRIMARY KEY,
cron_expression TEXT NOT NULL,
interval_ms INTEGER,
enabled INTEGER NOT NULL DEFAULT 1,
priority INTEGER NOT NULL DEFAULT 0,
timeout_ms INTEGER NOT NULL DEFAULT 30000,
max_retries INTEGER NOT NULL DEFAULT 1,
tier_minimum TEXT NOT NULL DEFAULT 'dead' CHECK(tier_minimum IN ('dead','critical','low_compute','normal','high')),
last_run_at TEXT,
next_run_at TEXT,
last_result TEXT CHECK(last_result IN ('success','failure','timeout','skipped') OR last_result IS NULL),
last_error TEXT,
run_count INTEGER NOT NULL DEFAULT 0,
fail_count INTEGER NOT NULL DEFAULT 0,
lease_owner TEXT,
lease_expires_at TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
heartbeat_history
Task execution history.
CREATE TABLE heartbeat_history (
id TEXT PRIMARY KEY,
task_name TEXT NOT NULL REFERENCES heartbeat_schedule(task_name),
started_at TEXT NOT NULL,
completed_at TEXT,
result TEXT NOT NULL CHECK(result IN ('success','failure','timeout','skipped')),
duration_ms INTEGER,
error TEXT,
idempotency_key TEXT UNIQUE,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_hb_history_task ON heartbeat_history(task_name, started_at);
wake_events
Atomic wake signals.
CREATE TABLE wake_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
source TEXT NOT NULL, -- 'heartbeat', 'inbox', 'credits', 'manual'
reason TEXT NOT NULL,
payload TEXT DEFAULT '{}', -- JSON object
consumed_at TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_wake_unconsumed ON wake_events(created_at) WHERE consumed_at IS NULL;
heartbeat_dedup
Idempotency keys for heartbeat operations.
CREATE TABLE heartbeat_dedup (
dedup_key TEXT PRIMARY KEY,
task_name TEXT NOT NULL,
expires_at TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_dedup_expires ON heartbeat_dedup(expires_at);
Soul & Memory (v5)
soul_history
Versioned SOUL.md history with content hashes.
CREATE TABLE soul_history (
id TEXT PRIMARY KEY,
version INTEGER NOT NULL,
content TEXT NOT NULL,
content_hash TEXT NOT NULL,
change_source TEXT NOT NULL CHECK(change_source IN ('agent','human','system','genesis','reflection')),
change_reason TEXT,
previous_version_id TEXT REFERENCES soul_history(id),
approved_by TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_soul_version ON soul_history(version);
working_memory
Session-scoped short-term memory.
CREATE TABLE working_memory (
id TEXT PRIMARY KEY,
session_id TEXT NOT NULL,
content TEXT NOT NULL,
content_type TEXT NOT NULL CHECK(content_type IN ('goal','observation','plan','reflection','task','decision','note','summary')),
priority REAL NOT NULL DEFAULT 0.5,
token_count INTEGER NOT NULL DEFAULT 0,
expires_at TEXT,
source_turn TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_wm_session ON working_memory(session_id, priority);
episodic_memory
Event log with importance ranking.
CREATE TABLE episodic_memory (
id TEXT PRIMARY KEY,
session_id TEXT NOT NULL,
event_type TEXT NOT NULL,
summary TEXT NOT NULL,
detail TEXT,
outcome TEXT CHECK(outcome IN ('success','failure','partial','neutral') OR outcome IS NULL),
importance REAL NOT NULL DEFAULT 0.5,
embedding_key TEXT,
token_count INTEGER NOT NULL DEFAULT 0,
accessed_count INTEGER NOT NULL DEFAULT 0,
last_accessed_at TEXT,
classification TEXT NOT NULL DEFAULT 'maintenance' CHECK(classification IN ('strategic','productive','communication','maintenance','idle','error')),
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_episodic_type ON episodic_memory(event_type);
CREATE INDEX idx_episodic_importance ON episodic_memory(importance);
CREATE INDEX idx_episodic_classification ON episodic_memory(classification);
semantic_memory
Categorized fact store.
CREATE TABLE semantic_memory (
id TEXT PRIMARY KEY,
category TEXT NOT NULL CHECK(category IN ('self','environment','financial','agent','domain','procedural_ref','creator')),
key TEXT NOT NULL,
value TEXT NOT NULL,
confidence REAL NOT NULL DEFAULT 1.0,
source TEXT NOT NULL,
embedding_key TEXT,
last_verified_at TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
UNIQUE(category, key)
);
CREATE INDEX idx_semantic_category ON semantic_memory(category);
procedural_memory
Named step-by-step procedures.
CREATE TABLE procedural_memory (
id TEXT PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
description TEXT NOT NULL,
steps TEXT NOT NULL, -- JSON array of strings
success_count INTEGER NOT NULL DEFAULT 0,
failure_count INTEGER NOT NULL DEFAULT 0,
last_used_at TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
relationship_memory
Per-entity trust scores and interaction history.
CREATE TABLE relationship_memory (
id TEXT PRIMARY KEY,
entity_address TEXT NOT NULL UNIQUE,
entity_name TEXT,
relationship_type TEXT NOT NULL, -- 'creator', 'peer', 'child', 'parent', 'user'
trust_score REAL NOT NULL DEFAULT 0.5,
interaction_count INTEGER NOT NULL DEFAULT 0,
last_interaction_at TEXT,
notes TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_rel_trust ON relationship_memory(trust_score);
session_summaries
Per-session outcome summaries.
CREATE TABLE session_summaries (
id TEXT PRIMARY KEY,
session_id TEXT NOT NULL UNIQUE,
summary TEXT NOT NULL,
key_decisions TEXT NOT NULL DEFAULT '[]', -- JSON array
tools_used TEXT NOT NULL DEFAULT '[]', -- JSON array
outcomes TEXT NOT NULL DEFAULT '[]', -- JSON array
turn_count INTEGER NOT NULL DEFAULT 0,
total_tokens INTEGER NOT NULL DEFAULT 0,
total_cost_cents INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Inference & Model Strategy (v6)
inference_costs
Per-call inference cost tracking.
CREATE TABLE inference_costs (
id TEXT PRIMARY KEY,
session_id TEXT NOT NULL,
turn_id TEXT,
model TEXT NOT NULL,
provider TEXT NOT NULL,
input_tokens INTEGER NOT NULL DEFAULT 0,
output_tokens INTEGER NOT NULL DEFAULT 0,
cost_cents INTEGER NOT NULL DEFAULT 0,
latency_ms INTEGER NOT NULL DEFAULT 0,
tier TEXT NOT NULL,
task_type TEXT NOT NULL CHECK(task_type IN ('agent_turn','heartbeat_triage','safety_check','summarization','planning')),
cache_hit INTEGER NOT NULL DEFAULT 0,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_inf_session ON inference_costs(session_id);
CREATE INDEX idx_inf_model ON inference_costs(model);
CREATE INDEX idx_inf_created ON inference_costs(created_at);
CREATE INDEX idx_inf_task ON inference_costs(task_type);
model_registry
Available model catalog with pricing.
CREATE TABLE model_registry (
model_id TEXT PRIMARY KEY,
provider TEXT NOT NULL,
display_name TEXT NOT NULL,
tier_minimum TEXT NOT NULL DEFAULT 'normal',
cost_per_1k_input INTEGER NOT NULL DEFAULT 0, -- Hundredths of cents per 1k tokens
cost_per_1k_output INTEGER NOT NULL DEFAULT 0, -- Hundredths of cents per 1k tokens
max_tokens INTEGER NOT NULL DEFAULT 4096,
context_window INTEGER NOT NULL DEFAULT 128000,
supports_tools INTEGER NOT NULL DEFAULT 1,
supports_vision INTEGER NOT NULL DEFAULT 0,
parameter_style TEXT NOT NULL DEFAULT 'max_tokens' CHECK(parameter_style IN ('max_tokens','max_completion_tokens')),
enabled INTEGER NOT NULL DEFAULT 1,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Replication & Social (v7)
child_lifecycle_events
Child state machine audit trail.
CREATE TABLE child_lifecycle_events (
id TEXT PRIMARY KEY,
child_id TEXT NOT NULL,
from_state TEXT NOT NULL,
to_state TEXT NOT NULL CHECK(to_state IN (
'requested','sandbox_created','runtime_ready','wallet_verified',
'funded','starting','healthy','unhealthy','stopped','failed','cleaned_up'
)),
reason TEXT,
metadata TEXT DEFAULT '{}',
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_child_events ON child_lifecycle_events(child_id, created_at);
discovered_agents_cache
Cached remote agent cards.
CREATE TABLE discovered_agents_cache (
agent_address TEXT PRIMARY KEY,
agent_card TEXT NOT NULL, -- JSON-LD agent card
fetched_from TEXT NOT NULL,
card_hash TEXT NOT NULL,
valid_until TEXT,
fetch_count INTEGER NOT NULL DEFAULT 1,
last_fetched_at TEXT NOT NULL DEFAULT (datetime('now')),
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
onchain_transactions
On-chain transaction records.
CREATE TABLE onchain_transactions (
id TEXT PRIMARY KEY,
tx_hash TEXT NOT NULL UNIQUE,
chain TEXT NOT NULL,
operation TEXT NOT NULL,
status TEXT NOT NULL CHECK(status IN ('pending','confirmed','failed')),
gas_used INTEGER,
metadata TEXT DEFAULT '{}',
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_onchain_status ON onchain_transactions(status);
Observability (v8)
metric_snapshots
Periodic metrics + alert records.
CREATE TABLE metric_snapshots (
id TEXT PRIMARY KEY,
snapshot_at TEXT NOT NULL,
metrics_json TEXT NOT NULL DEFAULT '[]', -- JSON array of {name, value, type}
alerts_json TEXT NOT NULL DEFAULT '[]', -- JSON array of {rule, message, severity}
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_metric_snapshots_at ON metric_snapshots(snapshot_at);
Database Operations
Location: src/state/database.ts
AutomatonDatabase interface provides 40+ methods for CRUD across all tables. The database.ts file also exports 60+ standalone helper functions for direct better-sqlite3 operations.
WAL mode: All databases use Write-Ahead Logging for concurrent reads/writes and crash recovery.
Migrations: Applied incrementally on startup. Schema version tracked in schema_version table.