sensorium-mcp 3.1.0-refactor.8 → 3.1.0-refactor.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
1
  import type { Database } from "./db-types.js";
2
- export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS episodes (\n episode_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n thread_id INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n type TEXT NOT NULL CHECK(type IN ('operator_message','agent_action','system_event','operator_reaction')),\n modality TEXT NOT NULL CHECK(modality IN ('text','voice','photo','video_note','document','mixed','reaction')),\n content TEXT NOT NULL,\n topic_tags TEXT,\n importance REAL NOT NULL DEFAULT 0.5,\n consolidated INTEGER DEFAULT 0,\n accessed_count INTEGER DEFAULT 0,\n last_accessed TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_ep_thread_time ON episodes(thread_id, timestamp DESC);\nCREATE INDEX IF NOT EXISTS idx_ep_importance ON episodes(importance DESC);\nCREATE INDEX IF NOT EXISTS idx_ep_uncons ON episodes(consolidated) WHERE consolidated = 0;\n\nCREATE TABLE IF NOT EXISTS semantic_notes (\n note_id TEXT PRIMARY KEY,\n type TEXT NOT NULL CHECK(type IN ('fact','preference','pattern','entity','relationship')),\n content TEXT NOT NULL,\n keywords TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 0.5,\n source_episodes TEXT,\n linked_notes TEXT,\n link_reasons TEXT,\n valid_from TEXT NOT NULL,\n valid_to TEXT,\n superseded_by TEXT,\n access_count INTEGER DEFAULT 0,\n last_accessed TEXT,\n priority INTEGER NOT NULL DEFAULT 0,\n thread_id INTEGER,\n is_guardrail INTEGER NOT NULL DEFAULT 0,\n pinned INTEGER NOT NULL DEFAULT 0,\n quality_score INTEGER,\n expiry_reason TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_sem_type ON semantic_notes(type);\nCREATE INDEX IF NOT EXISTS idx_sem_conf ON semantic_notes(confidence DESC);\nCREATE INDEX IF NOT EXISTS idx_sem_valid ON semantic_notes(valid_to) WHERE valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_priority ON semantic_notes(priority DESC) WHERE valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_thread ON semantic_notes(thread_id) WHERE valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_guardrail ON semantic_notes(is_guardrail) WHERE is_guardrail = 1 AND valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_pinned ON semantic_notes(pinned) WHERE pinned = 1 AND valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_expiry_reason ON semantic_notes(thread_id, expiry_reason) WHERE valid_to IS NOT NULL;\n\nCREATE TABLE IF NOT EXISTS meta_consolidation_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_at TEXT NOT NULL,\n episodes_processed INTEGER,\n notes_created INTEGER,\n duration_ms INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS voice_signatures (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n episode_id TEXT NOT NULL,\n emotion TEXT,\n arousal REAL,\n dominance REAL,\n valence REAL,\n speech_rate REAL,\n mean_pitch_hz REAL,\n pitch_std_hz REAL,\n jitter REAL,\n shimmer REAL,\n hnr_db REAL,\n audio_events TEXT,\n duration_sec REAL,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_voice_ep ON voice_signatures(episode_id);\nCREATE INDEX IF NOT EXISTS idx_voice_time ON voice_signatures(created_at DESC);\n\nCREATE TABLE IF NOT EXISTS note_embeddings (\n note_id TEXT PRIMARY KEY,\n embedding BLOB NOT NULL,\n model TEXT NOT NULL DEFAULT 'text-embedding-3-small',\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_emb_note ON note_embeddings(note_id);\n\nCREATE TABLE IF NOT EXISTS sent_messages (\n message_id INTEGER PRIMARY KEY,\n thread_id INTEGER NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_sent_messages_thread ON sent_messages(thread_id);\n\nCREATE TABLE IF NOT EXISTS topic_registry (\n chat_id TEXT NOT NULL,\n name TEXT NOT NULL COLLATE NOCASE,\n thread_id INTEGER NOT NULL,\n registered_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (chat_id, name)\n);\n\nCREATE TABLE IF NOT EXISTS temporal_narratives (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n thread_id INTEGER NOT NULL,\n resolution TEXT NOT NULL CHECK(resolution IN ('day', 'week', 'month', 'quarter', 'half_year')),\n period_start TEXT NOT NULL,\n period_end TEXT NOT NULL,\n narrative TEXT NOT NULL,\n source_episode_count INTEGER NOT NULL DEFAULT 0,\n source_note_count INTEGER NOT NULL DEFAULT 0,\n model TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE(thread_id, resolution, period_start)\n);\nCREATE INDEX IF NOT EXISTS idx_narrative_thread_res ON temporal_narratives(thread_id, resolution, created_at DESC);\n\nCREATE TABLE IF NOT EXISTS thread_registry (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n thread_id INTEGER NOT NULL UNIQUE,\n name TEXT NOT NULL,\n type TEXT NOT NULL CHECK(type IN ('root','daily','branch','worker')),\n root_thread_id INTEGER,\n badge TEXT NOT NULL DEFAULT 'root',\n client TEXT DEFAULT 'claude',\n max_retries INTEGER DEFAULT 5,\n cooldown_ms INTEGER DEFAULT 300000,\n keep_alive INTEGER DEFAULT 0,\n created_at TEXT NOT NULL,\n last_active_at TEXT,\n session_reset_at TEXT,\n clean_shutdown INTEGER NOT NULL DEFAULT 1,\n status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','archived','expired','exited')),\n daily_rotation INTEGER NOT NULL DEFAULT 0,\n autonomous_mode INTEGER NOT NULL DEFAULT 0,\n telegram_topic_id INTEGER,\n identity_prompt TEXT,\n working_directory TEXT,\n pid INTEGER,\n archived_at TEXT,\n summary TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_thread_reg_type ON thread_registry(type);\nCREATE INDEX IF NOT EXISTS idx_thread_reg_root ON thread_registry(root_thread_id);\nCREATE INDEX IF NOT EXISTS idx_thread_reg_status ON thread_registry(status);\n\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL\n);\n";
2
+ export declare const SCHEMA_SQL = "\nCREATE TABLE IF NOT EXISTS episodes (\n episode_id TEXT PRIMARY KEY,\n session_id TEXT NOT NULL,\n thread_id INTEGER NOT NULL,\n timestamp TEXT NOT NULL,\n type TEXT NOT NULL CHECK(type IN ('operator_message','agent_action','system_event','operator_reaction')),\n modality TEXT NOT NULL CHECK(modality IN ('text','voice','photo','video_note','document','mixed','reaction')),\n content TEXT NOT NULL,\n topic_tags TEXT,\n importance REAL NOT NULL DEFAULT 0.5,\n consolidated INTEGER DEFAULT 0,\n accessed_count INTEGER DEFAULT 0,\n last_accessed TEXT,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_ep_thread_time ON episodes(thread_id, timestamp DESC);\nCREATE INDEX IF NOT EXISTS idx_ep_importance ON episodes(importance DESC);\nCREATE INDEX IF NOT EXISTS idx_ep_uncons ON episodes(consolidated) WHERE consolidated = 0;\n\nCREATE TABLE IF NOT EXISTS semantic_notes (\n note_id TEXT PRIMARY KEY,\n type TEXT NOT NULL CHECK(type IN ('fact','preference','pattern','entity','relationship')),\n content TEXT NOT NULL,\n keywords TEXT NOT NULL,\n confidence REAL NOT NULL DEFAULT 0.5,\n source_episodes TEXT,\n linked_notes TEXT,\n link_reasons TEXT,\n valid_from TEXT NOT NULL,\n valid_to TEXT,\n superseded_by TEXT,\n access_count INTEGER DEFAULT 0,\n last_accessed TEXT,\n priority INTEGER NOT NULL DEFAULT 0,\n thread_id INTEGER,\n is_guardrail INTEGER NOT NULL DEFAULT 0,\n pinned INTEGER NOT NULL DEFAULT 0,\n quality_score INTEGER,\n expiry_reason TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_sem_type ON semantic_notes(type);\nCREATE INDEX IF NOT EXISTS idx_sem_conf ON semantic_notes(confidence DESC);\nCREATE INDEX IF NOT EXISTS idx_sem_valid ON semantic_notes(valid_to) WHERE valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_priority ON semantic_notes(priority DESC) WHERE valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_thread ON semantic_notes(thread_id) WHERE valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_guardrail ON semantic_notes(is_guardrail) WHERE is_guardrail = 1 AND valid_to IS NULL;\nCREATE INDEX IF NOT EXISTS idx_sem_pinned ON semantic_notes(pinned) WHERE pinned = 1 AND valid_to IS NULL;\n-- NOTE: idx_sem_expiry_reason is intentionally NOT created here. It references\n-- the expiry_reason column, which is added by migration 28 (ALTER TABLE) for\n-- pre-existing DBs. Because SCHEMA_SQL runs before runMigrations(), creating the\n-- index here would throw \"no such column: expiry_reason\" on any DB created before\n-- migration 28 \u2014 crashing startup before the migration can add the column.\n-- Migration 28 creates this index itself, right after the ALTER, for both fresh\n-- and existing DBs.\n\nCREATE TABLE IF NOT EXISTS meta_consolidation_log (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n run_at TEXT NOT NULL,\n episodes_processed INTEGER,\n notes_created INTEGER,\n duration_ms INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS voice_signatures (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n episode_id TEXT NOT NULL,\n emotion TEXT,\n arousal REAL,\n dominance REAL,\n valence REAL,\n speech_rate REAL,\n mean_pitch_hz REAL,\n pitch_std_hz REAL,\n jitter REAL,\n shimmer REAL,\n hnr_db REAL,\n audio_events TEXT,\n duration_sec REAL,\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_voice_ep ON voice_signatures(episode_id);\nCREATE INDEX IF NOT EXISTS idx_voice_time ON voice_signatures(created_at DESC);\n\nCREATE TABLE IF NOT EXISTS note_embeddings (\n note_id TEXT PRIMARY KEY,\n embedding BLOB NOT NULL,\n model TEXT NOT NULL DEFAULT 'text-embedding-3-small',\n created_at TEXT NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_emb_note ON note_embeddings(note_id);\n\nCREATE TABLE IF NOT EXISTS sent_messages (\n message_id INTEGER PRIMARY KEY,\n thread_id INTEGER NOT NULL,\n created_at TEXT DEFAULT (datetime('now'))\n);\n\nCREATE INDEX IF NOT EXISTS idx_sent_messages_thread ON sent_messages(thread_id);\n\nCREATE TABLE IF NOT EXISTS topic_registry (\n chat_id TEXT NOT NULL,\n name TEXT NOT NULL COLLATE NOCASE,\n thread_id INTEGER NOT NULL,\n registered_at TEXT NOT NULL DEFAULT (datetime('now')),\n PRIMARY KEY (chat_id, name)\n);\n\nCREATE TABLE IF NOT EXISTS temporal_narratives (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n thread_id INTEGER NOT NULL,\n resolution TEXT NOT NULL CHECK(resolution IN ('day', 'week', 'month', 'quarter', 'half_year')),\n period_start TEXT NOT NULL,\n period_end TEXT NOT NULL,\n narrative TEXT NOT NULL,\n source_episode_count INTEGER NOT NULL DEFAULT 0,\n source_note_count INTEGER NOT NULL DEFAULT 0,\n model TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE(thread_id, resolution, period_start)\n);\nCREATE INDEX IF NOT EXISTS idx_narrative_thread_res ON temporal_narratives(thread_id, resolution, created_at DESC);\n\nCREATE TABLE IF NOT EXISTS thread_registry (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n thread_id INTEGER NOT NULL UNIQUE,\n name TEXT NOT NULL,\n type TEXT NOT NULL CHECK(type IN ('root','daily','branch','worker')),\n root_thread_id INTEGER,\n badge TEXT NOT NULL DEFAULT 'root',\n client TEXT DEFAULT 'claude',\n max_retries INTEGER DEFAULT 5,\n cooldown_ms INTEGER DEFAULT 300000,\n keep_alive INTEGER DEFAULT 0,\n created_at TEXT NOT NULL,\n last_active_at TEXT,\n session_reset_at TEXT,\n clean_shutdown INTEGER NOT NULL DEFAULT 1,\n status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active','archived','expired','exited')),\n daily_rotation INTEGER NOT NULL DEFAULT 0,\n autonomous_mode INTEGER NOT NULL DEFAULT 0,\n telegram_topic_id INTEGER,\n identity_prompt TEXT,\n working_directory TEXT,\n pid INTEGER,\n archived_at TEXT,\n summary TEXT\n);\nCREATE INDEX IF NOT EXISTS idx_thread_reg_type ON thread_registry(type);\nCREATE INDEX IF NOT EXISTS idx_thread_reg_root ON thread_registry(root_thread_id);\nCREATE INDEX IF NOT EXISTS idx_thread_reg_status ON thread_registry(status);\n\nCREATE TABLE IF NOT EXISTS schema_version (\n version INTEGER PRIMARY KEY,\n applied_at TEXT NOT NULL\n);\n";
3
3
  export declare function cleanupOldSentMessages(db: Database): void;
4
4
  //# sourceMappingURL=schema-ddl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-ddl.d.ts","sourceRoot":"","sources":["../../../src/data/memory/schema-ddl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAI9C,eAAO,MAAM,UAAU,+/LA4JtB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAWzD"}
1
+ {"version":3,"file":"schema-ddl.d.ts","sourceRoot":"","sources":["../../../src/data/memory/schema-ddl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAI9C,eAAO,MAAM,UAAU,w4MAkKtB,CAAC;AAEF,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAWzD"}
@@ -52,7 +52,13 @@ CREATE INDEX IF NOT EXISTS idx_sem_priority ON semantic_notes(priority DESC) WHE
52
52
  CREATE INDEX IF NOT EXISTS idx_sem_thread ON semantic_notes(thread_id) WHERE valid_to IS NULL;
53
53
  CREATE INDEX IF NOT EXISTS idx_sem_guardrail ON semantic_notes(is_guardrail) WHERE is_guardrail = 1 AND valid_to IS NULL;
54
54
  CREATE INDEX IF NOT EXISTS idx_sem_pinned ON semantic_notes(pinned) WHERE pinned = 1 AND valid_to IS NULL;
55
- CREATE INDEX IF NOT EXISTS idx_sem_expiry_reason ON semantic_notes(thread_id, expiry_reason) WHERE valid_to IS NOT NULL;
55
+ -- NOTE: idx_sem_expiry_reason is intentionally NOT created here. It references
56
+ -- the expiry_reason column, which is added by migration 28 (ALTER TABLE) for
57
+ -- pre-existing DBs. Because SCHEMA_SQL runs before runMigrations(), creating the
58
+ -- index here would throw "no such column: expiry_reason" on any DB created before
59
+ -- migration 28 — crashing startup before the migration can add the column.
60
+ -- Migration 28 creates this index itself, right after the ALTER, for both fresh
61
+ -- and existing DBs.
56
62
 
57
63
  CREATE TABLE IF NOT EXISTS meta_consolidation_log (
58
64
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -1 +1 @@
1
- {"version":3,"file":"schema-ddl.js","sourceRoot":"","sources":["../../../src/data/memory/schema-ddl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4JzB,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,EAAY;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,yEAAyE,CAAC;aAClF,GAAG,EAAE,CAAC;QACT,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,0CAA0C,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"schema-ddl.js","sourceRoot":"","sources":["../../../src/data/memory/schema-ddl.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkKzB,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,EAAY;IACjD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,EAAE;aACd,OAAO,CAAC,yEAAyE,CAAC;aAClF,GAAG,EAAE,CAAC;QACT,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;YACvB,GAAG,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,OAAO,6BAA6B,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,0CAA0C,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sensorium-mcp",
3
- "version": "3.1.0-refactor.8",
3
+ "version": "3.1.0-refactor.9",
4
4
  "description": "MCP server for remote control of AI assistants via Telegram",
5
5
  "main": "dist/index.js",
6
6
  "bin": {