@signetai/connector-openclaw 0.146.4 → 0.147.0

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.
Files changed (2) hide show
  1. package/dist/index.js +595 -27
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -10766,6 +10766,251 @@ function up82(db) {
10766
10766
  `);
10767
10767
  db.exec("CREATE INDEX IF NOT EXISTS idx_skill_inv_harness ON skill_invocations(harness, created_at)");
10768
10768
  }
10769
+ var DEPENDENCY_TYPES = new Set([
10770
+ "uses",
10771
+ "requires",
10772
+ "owned_by",
10773
+ "owns",
10774
+ "blocks",
10775
+ "informs",
10776
+ "maintains",
10777
+ "implements",
10778
+ "built",
10779
+ "depends_on",
10780
+ "related_to",
10781
+ "learned_from",
10782
+ "teaches",
10783
+ "knows",
10784
+ "assumes",
10785
+ "supports_claim",
10786
+ "authored_by",
10787
+ "links_to",
10788
+ "contains",
10789
+ "contains_note",
10790
+ "contradicts",
10791
+ "supersedes",
10792
+ "part_of",
10793
+ "produced_artifact",
10794
+ "precedes",
10795
+ "follows",
10796
+ "triggers",
10797
+ "may_execute",
10798
+ "requires_approval_from",
10799
+ "impacts",
10800
+ "produces",
10801
+ "consumes"
10802
+ ]);
10803
+ function sqlStringList(values) {
10804
+ return [...values].map((value) => `'${value}'`).join(", ");
10805
+ }
10806
+ function hasTable3(db, table) {
10807
+ return Boolean(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(table));
10808
+ }
10809
+ function hasColumn12(db, table, column) {
10810
+ const rows = db.prepare(`PRAGMA table_info(${table})`).all();
10811
+ return rows.some((row) => row.name === column);
10812
+ }
10813
+ function addColumnIfMissing20(db, table, column, definition) {
10814
+ if (!hasColumn12(db, table, column))
10815
+ db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
10816
+ }
10817
+ function documentScopeColumnsPreservingExisting(db) {
10818
+ const preserveAgentId = hasColumn12(db, "documents", "agent_id");
10819
+ const preserveProject = hasColumn12(db, "documents", "project");
10820
+ if (preserveAgentId) {
10821
+ db.exec(`
10822
+ CREATE TEMP TABLE __signet_doc_agent_guard AS
10823
+ SELECT id, agent_id FROM documents
10824
+ WHERE NULLIF(TRIM(agent_id), '') IS NOT NULL
10825
+ AND NULLIF(TRIM(agent_id), '') <> 'default'
10826
+ `);
10827
+ }
10828
+ if (preserveProject) {
10829
+ db.exec(`
10830
+ CREATE TEMP TABLE __signet_doc_project_guard AS
10831
+ SELECT id, project FROM documents
10832
+ WHERE NULLIF(TRIM(project), '') IS NOT NULL
10833
+ `);
10834
+ }
10835
+ try {
10836
+ up80(db);
10837
+ if (preserveAgentId) {
10838
+ db.exec(`
10839
+ UPDATE documents
10840
+ SET agent_id = (SELECT agent_id FROM __signet_doc_agent_guard WHERE __signet_doc_agent_guard.id = documents.id)
10841
+ WHERE EXISTS (SELECT 1 FROM __signet_doc_agent_guard WHERE __signet_doc_agent_guard.id = documents.id)
10842
+ `);
10843
+ }
10844
+ if (preserveProject) {
10845
+ db.exec(`
10846
+ UPDATE documents
10847
+ SET project = (SELECT project FROM __signet_doc_project_guard WHERE __signet_doc_project_guard.id = documents.id)
10848
+ WHERE EXISTS (SELECT 1 FROM __signet_doc_project_guard WHERE __signet_doc_project_guard.id = documents.id)
10849
+ `);
10850
+ }
10851
+ } finally {
10852
+ db.exec("DROP TABLE IF EXISTS temp.__signet_doc_agent_guard");
10853
+ db.exec("DROP TABLE IF EXISTS temp.__signet_doc_project_guard");
10854
+ }
10855
+ }
10856
+ function up83(db) {
10857
+ up79(db);
10858
+ if (hasTable3(db, "documents")) {
10859
+ documentScopeColumnsPreservingExisting(db);
10860
+ }
10861
+ up81(db);
10862
+ addColumnIfMissing20(db, "memories", "superseded_by", "TEXT");
10863
+ addColumnIfMissing20(db, "memories", "superseded_at", "TEXT");
10864
+ addColumnIfMissing20(db, "memories", "superseded_reason", "TEXT");
10865
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memories_superseded_by ON memories(superseded_by)");
10866
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active_supersession ON memories(is_deleted, superseded_by)");
10867
+ if (!hasTable3(db, "relations") || !hasTable3(db, "entity_dependencies"))
10868
+ return;
10869
+ addColumnIfMissing20(db, "entity_dependencies", "confidence", "REAL");
10870
+ addColumnIfMissing20(db, "entity_dependencies", "reason", "TEXT");
10871
+ addColumnIfMissing20(db, "entity_dependencies", "source_id", "TEXT");
10872
+ addColumnIfMissing20(db, "entity_dependencies", "source_kind", "TEXT");
10873
+ addColumnIfMissing20(db, "entity_dependencies", "proposal_evidence", "TEXT NOT NULL DEFAULT '[]'");
10874
+ addColumnIfMissing20(db, "entity_dependencies", "status", "TEXT NOT NULL DEFAULT 'active'");
10875
+ const relationConfidence = hasColumn12(db, "relations", "confidence") ? "r.confidence" : "NULL";
10876
+ const relationUpdatedAt = hasColumn12(db, "relations", "updated_at") ? "r.updated_at" : "r.created_at";
10877
+ const sourceAgentId = hasColumn12(db, "entities", "agent_id") ? "COALESCE(NULLIF(TRIM(src.agent_id), ''), 'default')" : "'default'";
10878
+ const targetAgentId = hasColumn12(db, "entities", "agent_id") ? "COALESCE(NULLIF(TRIM(dst.agent_id), ''), 'default')" : "'default'";
10879
+ db.exec(`
10880
+ INSERT OR IGNORE INTO entity_dependencies (
10881
+ id,
10882
+ source_entity_id,
10883
+ target_entity_id,
10884
+ agent_id,
10885
+ dependency_type,
10886
+ strength,
10887
+ confidence,
10888
+ reason,
10889
+ created_at,
10890
+ updated_at,
10891
+ source_id,
10892
+ source_kind,
10893
+ proposal_evidence,
10894
+ status
10895
+ )
10896
+ SELECT
10897
+ 'relation:' || r.id,
10898
+ r.source_entity_id,
10899
+ r.target_entity_id,
10900
+ COALESCE(${sourceAgentId}, ${targetAgentId}, 'default'),
10901
+ CASE WHEN r.relation_type IN (${sqlStringList(DEPENDENCY_TYPES)}) THEN r.relation_type ELSE 'related_to' END,
10902
+ MAX(0.1, MIN(1.0, COALESCE(r.strength, 0.5))),
10903
+ MAX(0.1, MIN(1.0, COALESCE(${relationConfidence}, 0.7))),
10904
+ 'legacy relation backfill: ' || r.relation_type,
10905
+ COALESCE(r.created_at, datetime('now')),
10906
+ COALESCE(${relationUpdatedAt}, r.created_at, datetime('now')),
10907
+ r.id,
10908
+ 'relation',
10909
+ '[]',
10910
+ 'active'
10911
+ FROM relations r
10912
+ JOIN entities src ON src.id = r.source_entity_id
10913
+ JOIN entities dst ON dst.id = r.target_entity_id
10914
+ WHERE r.source_entity_id <> r.target_entity_id
10915
+ AND ${sourceAgentId} = ${targetAgentId}
10916
+ `);
10917
+ }
10918
+ function up84(db) {
10919
+ db.exec(`
10920
+ CREATE TABLE IF NOT EXISTS legacy_markdown_imports (
10921
+ path TEXT PRIMARY KEY,
10922
+ mtime_ms INTEGER NOT NULL,
10923
+ ctime_ms INTEGER NOT NULL,
10924
+ size INTEGER NOT NULL,
10925
+ content_hash TEXT NOT NULL,
10926
+ importer_version INTEGER NOT NULL,
10927
+ chunk_count INTEGER NOT NULL DEFAULT 0,
10928
+ last_imported_at TEXT NOT NULL,
10929
+ last_seen_at TEXT NOT NULL,
10930
+ status TEXT NOT NULL DEFAULT 'imported',
10931
+ error TEXT
10932
+ );
10933
+
10934
+ CREATE TABLE IF NOT EXISTS legacy_markdown_chunks (
10935
+ file_path TEXT NOT NULL,
10936
+ chunk_hash TEXT NOT NULL,
10937
+ chunk_index INTEGER NOT NULL,
10938
+ memory_id TEXT,
10939
+ source_id TEXT,
10940
+ created_at TEXT NOT NULL,
10941
+ PRIMARY KEY (file_path, chunk_hash)
10942
+ );
10943
+
10944
+ CREATE INDEX IF NOT EXISTS idx_legacy_markdown_chunks_memory_id
10945
+ ON legacy_markdown_chunks(memory_id);
10946
+ `);
10947
+ }
10948
+ function up85(db) {
10949
+ const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name IN ('relations', 'entity_dependencies')").all();
10950
+ const tableNames = new Set(tables.map((r) => String(r.name)));
10951
+ if (!tableNames.has("relations") || !tableNames.has("entity_dependencies"))
10952
+ return;
10953
+ const relCols = db.prepare("PRAGMA table_info(relations)").all();
10954
+ const depCols = db.prepare("PRAGMA table_info(entity_dependencies)").all();
10955
+ const rel = new Set(relCols.map((c) => String(c.name)));
10956
+ const dep = new Set(depCols.map((c) => String(c.name)));
10957
+ if (!rel.has("source_entity_id") || !rel.has("relation_type"))
10958
+ return;
10959
+ if (!dep.has("source_entity_id") || !dep.has("dependency_type") || !dep.has("agent_id"))
10960
+ return;
10961
+ const hasRelConfidence = rel.has("confidence");
10962
+ const hasRelUpdated = rel.has("updated_at");
10963
+ const hasDepConfidence = dep.has("confidence");
10964
+ const hasDepReason = dep.has("reason");
10965
+ const hasDepStatus = dep.has("status");
10966
+ const selectParts = ["id", "source_entity_id", "target_entity_id"];
10967
+ const colParts = ["id", "source_entity_id", "target_entity_id"];
10968
+ selectParts.push("relation_type");
10969
+ colParts.push("dependency_type");
10970
+ selectParts.push("strength", "created_at");
10971
+ colParts.push("strength", "created_at");
10972
+ selectParts.push("'default'");
10973
+ colParts.push("agent_id");
10974
+ selectParts.push("NULL");
10975
+ colParts.push("aspect_id");
10976
+ if (hasRelConfidence && hasDepConfidence) {
10977
+ selectParts.push("confidence");
10978
+ colParts.push("confidence");
10979
+ }
10980
+ if (hasDepReason) {
10981
+ selectParts.push("'extracted'");
10982
+ colParts.push("reason");
10983
+ }
10984
+ if (hasDepStatus) {
10985
+ selectParts.push("'active'");
10986
+ colParts.push("status");
10987
+ }
10988
+ if (hasRelUpdated && dep.has("updated_at")) {
10989
+ selectParts.push("updated_at");
10990
+ colParts.push("updated_at");
10991
+ }
10992
+ const selectClause = selectParts.join(", ");
10993
+ const colsClause = colParts.join(", ");
10994
+ db.exec(`INSERT OR IGNORE INTO entity_dependencies (${colsClause})
10995
+ SELECT ${selectClause}
10996
+ FROM relations
10997
+ WHERE source_entity_id IS NOT NULL
10998
+ AND target_entity_id IS NOT NULL
10999
+ AND relation_type IS NOT NULL`);
11000
+ }
11001
+ function addColumnIfMissing21(db, table, column, definition) {
11002
+ const cols = db.prepare(`PRAGMA table_info(${table})`).all();
11003
+ if (cols.some((col) => col.name === column))
11004
+ return;
11005
+ db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
11006
+ }
11007
+ function up86(db) {
11008
+ addColumnIfMissing21(db, "summary_jobs", "content_hash", "TEXT");
11009
+ db.exec(`
11010
+ CREATE INDEX IF NOT EXISTS idx_summary_jobs_agent_session_content_hash
11011
+ ON summary_jobs(agent_id, session_key, content_hash)
11012
+ `);
11013
+ }
10769
11014
  var MIGRATIONS = [
10770
11015
  {
10771
11016
  version: 1,
@@ -11430,6 +11675,45 @@ var MIGRATIONS = [
11430
11675
  { table: "skill_invocations", column: "tool_use_id" }
11431
11676
  ]
11432
11677
  }
11678
+ },
11679
+ {
11680
+ version: 83,
11681
+ name: "memory-lifecycle-repair",
11682
+ up: up83,
11683
+ artifacts: {
11684
+ tables: ["transcript_capture_jobs", "aggregate_evidence_sources", "entity_dependencies"],
11685
+ columns: [
11686
+ { table: "documents", column: "agent_id" },
11687
+ { table: "documents", column: "project" },
11688
+ { table: "memories", column: "superseded_by" },
11689
+ { table: "memories", column: "superseded_at" },
11690
+ { table: "memories", column: "superseded_reason" }
11691
+ ]
11692
+ }
11693
+ },
11694
+ {
11695
+ version: 84,
11696
+ name: "legacy-markdown-import-state",
11697
+ up: up84,
11698
+ artifacts: {
11699
+ tables: ["legacy_markdown_imports", "legacy_markdown_chunks"]
11700
+ }
11701
+ },
11702
+ {
11703
+ version: 85,
11704
+ name: "backfill-relations-to-dependencies",
11705
+ up: up85,
11706
+ artifacts: {
11707
+ tables: ["entity_dependencies"]
11708
+ }
11709
+ },
11710
+ {
11711
+ version: 86,
11712
+ name: "summary-jobs-content-hash",
11713
+ up: up86,
11714
+ artifacts: {
11715
+ columns: [{ table: "summary_jobs", column: "content_hash" }]
11716
+ }
11433
11717
  }
11434
11718
  ];
11435
11719
  var LATEST_SCHEMA_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;
@@ -18780,7 +19064,7 @@ function memoriesFtsNeedsTokenizerRepair2(sql) {
18780
19064
  return true;
18781
19065
  return !normalized.includes(`tokenize='${MEMORIES_FTS_TOKENIZER2}'`);
18782
19066
  }
18783
- function up83(db) {
19067
+ function up87(db) {
18784
19068
  db.exec(`
18785
19069
  CREATE TABLE IF NOT EXISTS schema_migrations (
18786
19070
  version INTEGER PRIMARY KEY,
@@ -18869,31 +19153,31 @@ function up83(db) {
18869
19153
  } catch {}
18870
19154
  createMemoriesFts2(db);
18871
19155
  }
18872
- function hasColumn12(db, table, column) {
19156
+ function hasColumn13(db, table, column) {
18873
19157
  const rows = db.prepare(`PRAGMA table_info(${table})`).all();
18874
19158
  return rows.some((r) => r.name === column);
18875
19159
  }
18876
- function addColumnIfMissing20(db, table, column, definition) {
18877
- if (!hasColumn12(db, table, column)) {
19160
+ function addColumnIfMissing22(db, table, column, definition) {
19161
+ if (!hasColumn13(db, table, column)) {
18878
19162
  db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
18879
19163
  }
18880
19164
  }
18881
19165
  function up210(db) {
18882
- addColumnIfMissing20(db, "memories", "content_hash", "TEXT");
18883
- addColumnIfMissing20(db, "memories", "normalized_content", "TEXT");
18884
- addColumnIfMissing20(db, "memories", "is_deleted", "INTEGER DEFAULT 0");
18885
- addColumnIfMissing20(db, "memories", "deleted_at", "TEXT");
18886
- addColumnIfMissing20(db, "memories", "extraction_status", "TEXT DEFAULT 'none'");
18887
- addColumnIfMissing20(db, "memories", "embedding_model", "TEXT");
18888
- addColumnIfMissing20(db, "memories", "extraction_model", "TEXT");
18889
- addColumnIfMissing20(db, "memories", "update_count", "INTEGER DEFAULT 0");
18890
- addColumnIfMissing20(db, "memories", "who", "TEXT");
18891
- addColumnIfMissing20(db, "memories", "why", "TEXT");
18892
- addColumnIfMissing20(db, "memories", "project", "TEXT");
18893
- addColumnIfMissing20(db, "memories", "pinned", "INTEGER DEFAULT 0");
18894
- addColumnIfMissing20(db, "memories", "importance", "REAL DEFAULT 0.5");
18895
- addColumnIfMissing20(db, "memories", "last_accessed", "TEXT");
18896
- addColumnIfMissing20(db, "memories", "access_count", "INTEGER DEFAULT 0");
19166
+ addColumnIfMissing22(db, "memories", "content_hash", "TEXT");
19167
+ addColumnIfMissing22(db, "memories", "normalized_content", "TEXT");
19168
+ addColumnIfMissing22(db, "memories", "is_deleted", "INTEGER DEFAULT 0");
19169
+ addColumnIfMissing22(db, "memories", "deleted_at", "TEXT");
19170
+ addColumnIfMissing22(db, "memories", "extraction_status", "TEXT DEFAULT 'none'");
19171
+ addColumnIfMissing22(db, "memories", "embedding_model", "TEXT");
19172
+ addColumnIfMissing22(db, "memories", "extraction_model", "TEXT");
19173
+ addColumnIfMissing22(db, "memories", "update_count", "INTEGER DEFAULT 0");
19174
+ addColumnIfMissing22(db, "memories", "who", "TEXT");
19175
+ addColumnIfMissing22(db, "memories", "why", "TEXT");
19176
+ addColumnIfMissing22(db, "memories", "project", "TEXT");
19177
+ addColumnIfMissing22(db, "memories", "pinned", "INTEGER DEFAULT 0");
19178
+ addColumnIfMissing22(db, "memories", "importance", "REAL DEFAULT 0.5");
19179
+ addColumnIfMissing22(db, "memories", "last_accessed", "TEXT");
19180
+ addColumnIfMissing22(db, "memories", "access_count", "INTEGER DEFAULT 0");
18897
19181
  db.exec(`
18898
19182
  CREATE TABLE IF NOT EXISTS memory_history (
18899
19183
  id TEXT PRIMARY KEY,
@@ -18989,7 +19273,7 @@ function up210(db) {
18989
19273
  ON memory_entity_mentions(entity_id);
18990
19274
  `);
18991
19275
  }
18992
- function addColumnIfMissing22(db, table, column, definition) {
19276
+ function addColumnIfMissing23(db, table, column, definition) {
18993
19277
  const rows = db.prepare(`PRAGMA table_info(${table})`).all();
18994
19278
  if (rows.some((r) => r.name === column))
18995
19279
  return false;
@@ -18997,8 +19281,8 @@ function addColumnIfMissing22(db, table, column, definition) {
18997
19281
  return true;
18998
19282
  }
18999
19283
  function up310(db) {
19000
- addColumnIfMissing22(db, "memories", "why", "TEXT");
19001
- addColumnIfMissing22(db, "memories", "project", "TEXT");
19284
+ addColumnIfMissing23(db, "memories", "why", "TEXT");
19285
+ addColumnIfMissing23(db, "memories", "project", "TEXT");
19002
19286
  db.exec(`DROP INDEX IF EXISTS idx_memories_content_hash`);
19003
19287
  db.exec(`
19004
19288
  UPDATE memories
@@ -19155,7 +19439,7 @@ function up710(db) {
19155
19439
  db.exec("ALTER TABLE memory_jobs ADD COLUMN document_id TEXT");
19156
19440
  }
19157
19441
  }
19158
- function up84(db) {
19442
+ function up88(db) {
19159
19443
  const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='embeddings'").all();
19160
19444
  if (tables.length === 0)
19161
19445
  return;
@@ -20424,7 +20708,7 @@ function up492(db) {
20424
20708
  );
20425
20709
  `);
20426
20710
  }
20427
- function hasTable3(db, name) {
20711
+ function hasTable4(db, name) {
20428
20712
  return db.prepare(`SELECT name
20429
20713
  FROM sqlite_master
20430
20714
  WHERE type = 'table' AND name = ?
@@ -20454,7 +20738,7 @@ function up502(db) {
20454
20738
  CREATE INDEX IF NOT EXISTS idx_entity_dependency_history_created
20455
20739
  ON entity_dependency_history(created_at DESC);
20456
20740
  `);
20457
- if (!hasTable3(db, "entity_dependencies"))
20741
+ if (!hasTable4(db, "entity_dependencies"))
20458
20742
  return;
20459
20743
  db.exec("DROP TRIGGER IF EXISTS trg_entity_dependencies_related_to_reason_insert");
20460
20744
  db.exec("DROP TRIGGER IF EXISTS trg_entity_dependencies_related_to_reason_update");
@@ -21464,11 +21748,256 @@ function up822(db) {
21464
21748
  `);
21465
21749
  db.exec("CREATE INDEX IF NOT EXISTS idx_skill_inv_harness ON skill_invocations(harness, created_at)");
21466
21750
  }
21751
+ var DEPENDENCY_TYPES2 = new Set([
21752
+ "uses",
21753
+ "requires",
21754
+ "owned_by",
21755
+ "owns",
21756
+ "blocks",
21757
+ "informs",
21758
+ "maintains",
21759
+ "implements",
21760
+ "built",
21761
+ "depends_on",
21762
+ "related_to",
21763
+ "learned_from",
21764
+ "teaches",
21765
+ "knows",
21766
+ "assumes",
21767
+ "supports_claim",
21768
+ "authored_by",
21769
+ "links_to",
21770
+ "contains",
21771
+ "contains_note",
21772
+ "contradicts",
21773
+ "supersedes",
21774
+ "part_of",
21775
+ "produced_artifact",
21776
+ "precedes",
21777
+ "follows",
21778
+ "triggers",
21779
+ "may_execute",
21780
+ "requires_approval_from",
21781
+ "impacts",
21782
+ "produces",
21783
+ "consumes"
21784
+ ]);
21785
+ function sqlStringList2(values) {
21786
+ return [...values].map((value) => `'${value}'`).join(", ");
21787
+ }
21788
+ function hasTable32(db, table) {
21789
+ return Boolean(db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(table));
21790
+ }
21791
+ function hasColumn122(db, table, column) {
21792
+ const rows = db.prepare(`PRAGMA table_info(${table})`).all();
21793
+ return rows.some((row) => row.name === column);
21794
+ }
21795
+ function addColumnIfMissing202(db, table, column, definition) {
21796
+ if (!hasColumn122(db, table, column))
21797
+ db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
21798
+ }
21799
+ function documentScopeColumnsPreservingExisting2(db) {
21800
+ const preserveAgentId = hasColumn122(db, "documents", "agent_id");
21801
+ const preserveProject = hasColumn122(db, "documents", "project");
21802
+ if (preserveAgentId) {
21803
+ db.exec(`
21804
+ CREATE TEMP TABLE __signet_doc_agent_guard AS
21805
+ SELECT id, agent_id FROM documents
21806
+ WHERE NULLIF(TRIM(agent_id), '') IS NOT NULL
21807
+ AND NULLIF(TRIM(agent_id), '') <> 'default'
21808
+ `);
21809
+ }
21810
+ if (preserveProject) {
21811
+ db.exec(`
21812
+ CREATE TEMP TABLE __signet_doc_project_guard AS
21813
+ SELECT id, project FROM documents
21814
+ WHERE NULLIF(TRIM(project), '') IS NOT NULL
21815
+ `);
21816
+ }
21817
+ try {
21818
+ up802(db);
21819
+ if (preserveAgentId) {
21820
+ db.exec(`
21821
+ UPDATE documents
21822
+ SET agent_id = (SELECT agent_id FROM __signet_doc_agent_guard WHERE __signet_doc_agent_guard.id = documents.id)
21823
+ WHERE EXISTS (SELECT 1 FROM __signet_doc_agent_guard WHERE __signet_doc_agent_guard.id = documents.id)
21824
+ `);
21825
+ }
21826
+ if (preserveProject) {
21827
+ db.exec(`
21828
+ UPDATE documents
21829
+ SET project = (SELECT project FROM __signet_doc_project_guard WHERE __signet_doc_project_guard.id = documents.id)
21830
+ WHERE EXISTS (SELECT 1 FROM __signet_doc_project_guard WHERE __signet_doc_project_guard.id = documents.id)
21831
+ `);
21832
+ }
21833
+ } finally {
21834
+ db.exec("DROP TABLE IF EXISTS temp.__signet_doc_agent_guard");
21835
+ db.exec("DROP TABLE IF EXISTS temp.__signet_doc_project_guard");
21836
+ }
21837
+ }
21838
+ function up832(db) {
21839
+ up792(db);
21840
+ if (hasTable32(db, "documents")) {
21841
+ documentScopeColumnsPreservingExisting2(db);
21842
+ }
21843
+ up812(db);
21844
+ addColumnIfMissing202(db, "memories", "superseded_by", "TEXT");
21845
+ addColumnIfMissing202(db, "memories", "superseded_at", "TEXT");
21846
+ addColumnIfMissing202(db, "memories", "superseded_reason", "TEXT");
21847
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memories_superseded_by ON memories(superseded_by)");
21848
+ db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active_supersession ON memories(is_deleted, superseded_by)");
21849
+ if (!hasTable32(db, "relations") || !hasTable32(db, "entity_dependencies"))
21850
+ return;
21851
+ addColumnIfMissing202(db, "entity_dependencies", "confidence", "REAL");
21852
+ addColumnIfMissing202(db, "entity_dependencies", "reason", "TEXT");
21853
+ addColumnIfMissing202(db, "entity_dependencies", "source_id", "TEXT");
21854
+ addColumnIfMissing202(db, "entity_dependencies", "source_kind", "TEXT");
21855
+ addColumnIfMissing202(db, "entity_dependencies", "proposal_evidence", "TEXT NOT NULL DEFAULT '[]'");
21856
+ addColumnIfMissing202(db, "entity_dependencies", "status", "TEXT NOT NULL DEFAULT 'active'");
21857
+ const relationConfidence = hasColumn122(db, "relations", "confidence") ? "r.confidence" : "NULL";
21858
+ const relationUpdatedAt = hasColumn122(db, "relations", "updated_at") ? "r.updated_at" : "r.created_at";
21859
+ const sourceAgentId = hasColumn122(db, "entities", "agent_id") ? "COALESCE(NULLIF(TRIM(src.agent_id), ''), 'default')" : "'default'";
21860
+ const targetAgentId = hasColumn122(db, "entities", "agent_id") ? "COALESCE(NULLIF(TRIM(dst.agent_id), ''), 'default')" : "'default'";
21861
+ db.exec(`
21862
+ INSERT OR IGNORE INTO entity_dependencies (
21863
+ id,
21864
+ source_entity_id,
21865
+ target_entity_id,
21866
+ agent_id,
21867
+ dependency_type,
21868
+ strength,
21869
+ confidence,
21870
+ reason,
21871
+ created_at,
21872
+ updated_at,
21873
+ source_id,
21874
+ source_kind,
21875
+ proposal_evidence,
21876
+ status
21877
+ )
21878
+ SELECT
21879
+ 'relation:' || r.id,
21880
+ r.source_entity_id,
21881
+ r.target_entity_id,
21882
+ COALESCE(${sourceAgentId}, ${targetAgentId}, 'default'),
21883
+ CASE WHEN r.relation_type IN (${sqlStringList2(DEPENDENCY_TYPES2)}) THEN r.relation_type ELSE 'related_to' END,
21884
+ MAX(0.1, MIN(1.0, COALESCE(r.strength, 0.5))),
21885
+ MAX(0.1, MIN(1.0, COALESCE(${relationConfidence}, 0.7))),
21886
+ 'legacy relation backfill: ' || r.relation_type,
21887
+ COALESCE(r.created_at, datetime('now')),
21888
+ COALESCE(${relationUpdatedAt}, r.created_at, datetime('now')),
21889
+ r.id,
21890
+ 'relation',
21891
+ '[]',
21892
+ 'active'
21893
+ FROM relations r
21894
+ JOIN entities src ON src.id = r.source_entity_id
21895
+ JOIN entities dst ON dst.id = r.target_entity_id
21896
+ WHERE r.source_entity_id <> r.target_entity_id
21897
+ AND ${sourceAgentId} = ${targetAgentId}
21898
+ `);
21899
+ }
21900
+ function up842(db) {
21901
+ db.exec(`
21902
+ CREATE TABLE IF NOT EXISTS legacy_markdown_imports (
21903
+ path TEXT PRIMARY KEY,
21904
+ mtime_ms INTEGER NOT NULL,
21905
+ ctime_ms INTEGER NOT NULL,
21906
+ size INTEGER NOT NULL,
21907
+ content_hash TEXT NOT NULL,
21908
+ importer_version INTEGER NOT NULL,
21909
+ chunk_count INTEGER NOT NULL DEFAULT 0,
21910
+ last_imported_at TEXT NOT NULL,
21911
+ last_seen_at TEXT NOT NULL,
21912
+ status TEXT NOT NULL DEFAULT 'imported',
21913
+ error TEXT
21914
+ );
21915
+
21916
+ CREATE TABLE IF NOT EXISTS legacy_markdown_chunks (
21917
+ file_path TEXT NOT NULL,
21918
+ chunk_hash TEXT NOT NULL,
21919
+ chunk_index INTEGER NOT NULL,
21920
+ memory_id TEXT,
21921
+ source_id TEXT,
21922
+ created_at TEXT NOT NULL,
21923
+ PRIMARY KEY (file_path, chunk_hash)
21924
+ );
21925
+
21926
+ CREATE INDEX IF NOT EXISTS idx_legacy_markdown_chunks_memory_id
21927
+ ON legacy_markdown_chunks(memory_id);
21928
+ `);
21929
+ }
21930
+ function up852(db) {
21931
+ const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name IN ('relations', 'entity_dependencies')").all();
21932
+ const tableNames = new Set(tables.map((r) => String(r.name)));
21933
+ if (!tableNames.has("relations") || !tableNames.has("entity_dependencies"))
21934
+ return;
21935
+ const relCols = db.prepare("PRAGMA table_info(relations)").all();
21936
+ const depCols = db.prepare("PRAGMA table_info(entity_dependencies)").all();
21937
+ const rel = new Set(relCols.map((c) => String(c.name)));
21938
+ const dep = new Set(depCols.map((c) => String(c.name)));
21939
+ if (!rel.has("source_entity_id") || !rel.has("relation_type"))
21940
+ return;
21941
+ if (!dep.has("source_entity_id") || !dep.has("dependency_type") || !dep.has("agent_id"))
21942
+ return;
21943
+ const hasRelConfidence = rel.has("confidence");
21944
+ const hasRelUpdated = rel.has("updated_at");
21945
+ const hasDepConfidence = dep.has("confidence");
21946
+ const hasDepReason = dep.has("reason");
21947
+ const hasDepStatus = dep.has("status");
21948
+ const selectParts = ["id", "source_entity_id", "target_entity_id"];
21949
+ const colParts = ["id", "source_entity_id", "target_entity_id"];
21950
+ selectParts.push("relation_type");
21951
+ colParts.push("dependency_type");
21952
+ selectParts.push("strength", "created_at");
21953
+ colParts.push("strength", "created_at");
21954
+ selectParts.push("'default'");
21955
+ colParts.push("agent_id");
21956
+ selectParts.push("NULL");
21957
+ colParts.push("aspect_id");
21958
+ if (hasRelConfidence && hasDepConfidence) {
21959
+ selectParts.push("confidence");
21960
+ colParts.push("confidence");
21961
+ }
21962
+ if (hasDepReason) {
21963
+ selectParts.push("'extracted'");
21964
+ colParts.push("reason");
21965
+ }
21966
+ if (hasDepStatus) {
21967
+ selectParts.push("'active'");
21968
+ colParts.push("status");
21969
+ }
21970
+ if (hasRelUpdated && dep.has("updated_at")) {
21971
+ selectParts.push("updated_at");
21972
+ colParts.push("updated_at");
21973
+ }
21974
+ const selectClause = selectParts.join(", ");
21975
+ const colsClause = colParts.join(", ");
21976
+ db.exec(`INSERT OR IGNORE INTO entity_dependencies (${colsClause})
21977
+ SELECT ${selectClause}
21978
+ FROM relations
21979
+ WHERE source_entity_id IS NOT NULL
21980
+ AND target_entity_id IS NOT NULL
21981
+ AND relation_type IS NOT NULL`);
21982
+ }
21983
+ function addColumnIfMissing212(db, table, column, definition) {
21984
+ const cols = db.prepare(`PRAGMA table_info(${table})`).all();
21985
+ if (cols.some((col) => col.name === column))
21986
+ return;
21987
+ db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${definition}`);
21988
+ }
21989
+ function up862(db) {
21990
+ addColumnIfMissing212(db, "summary_jobs", "content_hash", "TEXT");
21991
+ db.exec(`
21992
+ CREATE INDEX IF NOT EXISTS idx_summary_jobs_agent_session_content_hash
21993
+ ON summary_jobs(agent_id, session_key, content_hash)
21994
+ `);
21995
+ }
21467
21996
  var MIGRATIONS2 = [
21468
21997
  {
21469
21998
  version: 1,
21470
21999
  name: "baseline",
21471
- up: up83,
22000
+ up: up87,
21472
22001
  artifacts: { tables: ["memories", "conversations", "embeddings"] }
21473
22002
  },
21474
22003
  {
@@ -21517,7 +22046,7 @@ var MIGRATIONS2 = [
21517
22046
  {
21518
22047
  version: 8,
21519
22048
  name: "embeddings-unique-hash",
21520
- up: up84
22049
+ up: up88
21521
22050
  },
21522
22051
  {
21523
22052
  version: 9,
@@ -22128,6 +22657,45 @@ var MIGRATIONS2 = [
22128
22657
  { table: "skill_invocations", column: "tool_use_id" }
22129
22658
  ]
22130
22659
  }
22660
+ },
22661
+ {
22662
+ version: 83,
22663
+ name: "memory-lifecycle-repair",
22664
+ up: up832,
22665
+ artifacts: {
22666
+ tables: ["transcript_capture_jobs", "aggregate_evidence_sources", "entity_dependencies"],
22667
+ columns: [
22668
+ { table: "documents", column: "agent_id" },
22669
+ { table: "documents", column: "project" },
22670
+ { table: "memories", column: "superseded_by" },
22671
+ { table: "memories", column: "superseded_at" },
22672
+ { table: "memories", column: "superseded_reason" }
22673
+ ]
22674
+ }
22675
+ },
22676
+ {
22677
+ version: 84,
22678
+ name: "legacy-markdown-import-state",
22679
+ up: up842,
22680
+ artifacts: {
22681
+ tables: ["legacy_markdown_imports", "legacy_markdown_chunks"]
22682
+ }
22683
+ },
22684
+ {
22685
+ version: 85,
22686
+ name: "backfill-relations-to-dependencies",
22687
+ up: up852,
22688
+ artifacts: {
22689
+ tables: ["entity_dependencies"]
22690
+ }
22691
+ },
22692
+ {
22693
+ version: 86,
22694
+ name: "summary-jobs-content-hash",
22695
+ up: up862,
22696
+ artifacts: {
22697
+ columns: [{ table: "summary_jobs", column: "content_hash" }]
22698
+ }
22131
22699
  }
22132
22700
  ];
22133
22701
  var LATEST_SCHEMA_VERSION2 = MIGRATIONS2[MIGRATIONS2.length - 1]?.version ?? 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signetai/connector-openclaw",
3
- "version": "0.146.4",
3
+ "version": "0.147.0",
4
4
  "description": "Signet connector for OpenClaw - configures workspace and memory hooks",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -25,8 +25,8 @@
25
25
  "test": "bun test"
26
26
  },
27
27
  "dependencies": {
28
- "@signetai/connector-base": "0.146.4",
29
- "@signetai/core": "0.146.4",
28
+ "@signetai/connector-base": "0.147.0",
29
+ "@signetai/core": "0.147.0",
30
30
  "json5": "^2.2.3"
31
31
  },
32
32
  "devDependencies": {