Files
context-manager/schemas/04_log.sql
ARCHITECT d1b2c16bd0 Add Context Manager client and log schema
- context_manager.py: Full stateless client for Anthropic API
  - Builds context from cto.blocks + cto.memory + log.messages
  - Logs all messages to immutable log.messages table
  - Interactive chat mode with CLI commands

- context_bridge.py: PostgreSQL bridge for context queries
  - Peer auth support for local connections
  - get_all_relevant_blocks() single query optimization
  - build_system_prompt() from blocks

- 04_log.sql: Immutable log schema
  - log.messages with hash chain integrity
  - Triggers preventing UPDATE/DELETE

- 07_initial_blocks.sql: Initial context blocks
  - tzzr_base, rules_base, r2_storage
  - server_architect, server_deck, server_corp

- cm: Launcher script with venv support
2026-01-01 22:41:20 +00:00

61 lines
2.3 KiB
PL/PgSQL

-- Schema LOG para Context Manager
CREATE SCHEMA IF NOT EXISTS log;
CREATE TABLE IF NOT EXISTS log.messages (
id BIGSERIAL PRIMARY KEY,
hash CHAR(64) UNIQUE NOT NULL,
session_hash CHAR(64) NOT NULL,
thread_hash CHAR(64),
owner_id CHAR(64),
players_id CHAR(64)[],
master_player CHAR(64),
role TEXT NOT NULL,
content TEXT NOT NULL,
attachments JSONB DEFAULT '{}',
prev_hash CHAR(64),
hashtags CHAR(64)[],
flag_id CHAR(64),
master_item_id CHAR(64),
item_id CHAR(64)[],
loc_id CHAR(64),
ambient JSONB,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS log.message_refs (
id BIGSERIAL PRIMARY KEY,
message_hash CHAR(64) NOT NULL,
ref_hash CHAR(64) NOT NULL,
ref_type VARCHAR(20) NOT NULL,
position INT,
thread_hash CHAR(64)
);
CREATE INDEX IF NOT EXISTS idx_log_session ON log.messages(session_hash);
CREATE INDEX IF NOT EXISTS idx_log_thread ON log.messages(thread_hash);
CREATE INDEX IF NOT EXISTS idx_log_owner ON log.messages(owner_id);
CREATE INDEX IF NOT EXISTS idx_log_prev ON log.messages(prev_hash);
CREATE INDEX IF NOT EXISTS idx_log_created ON log.messages(created_at);
CREATE INDEX IF NOT EXISTS idx_refs_message ON log.message_refs(message_hash);
CREATE INDEX IF NOT EXISTS idx_refs_ref ON log.message_refs(ref_hash);
CREATE OR REPLACE FUNCTION log.prevent_modification() RETURNS TRIGGER AS $$
BEGIN
RAISE EXCEPTION 'Log is immutable';
END;
$$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS no_update_messages ON log.messages;
DROP TRIGGER IF EXISTS no_delete_messages ON log.messages;
CREATE TRIGGER no_update_messages BEFORE UPDATE ON log.messages FOR EACH ROW EXECUTE FUNCTION log.prevent_modification();
CREATE TRIGGER no_delete_messages BEFORE DELETE ON log.messages FOR EACH ROW EXECUTE FUNCTION log.prevent_modification();
DROP TRIGGER IF EXISTS no_update_refs ON log.message_refs;
DROP TRIGGER IF EXISTS no_delete_refs ON log.message_refs;
CREATE TRIGGER no_update_refs BEFORE UPDATE ON log.message_refs FOR EACH ROW EXECUTE FUNCTION log.prevent_modification();
CREATE TRIGGER no_delete_refs BEFORE DELETE ON log.message_refs FOR EACH ROW EXECUTE FUNCTION log.prevent_modification();
GRANT USAGE ON SCHEMA log TO architect;
GRANT SELECT, INSERT ON ALL TABLES IN SCHEMA log TO architect;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA log TO architect;