@mclean-capital/neura 2.4.2 → 3.1.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 (38) hide show
  1. package/core/server.bundled.mjs +80060 -57930
  2. package/core/server.bundled.mjs.map +4 -4
  3. package/core/version.txt +1 -1
  4. package/dist/commands/backup.js +2 -2
  5. package/dist/commands/backup.js.map +1 -1
  6. package/dist/commands/config.d.ts.map +1 -1
  7. package/dist/commands/config.js +42 -14
  8. package/dist/commands/config.js.map +1 -1
  9. package/dist/commands/install.d.ts.map +1 -1
  10. package/dist/commands/install.js +24 -15
  11. package/dist/commands/install.js.map +1 -1
  12. package/dist/commands/open.js +1 -1
  13. package/dist/commands/open.js.map +1 -1
  14. package/dist/commands/restart.js +1 -1
  15. package/dist/commands/restart.js.map +1 -1
  16. package/dist/commands/start.js +1 -1
  17. package/dist/commands/start.js.map +1 -1
  18. package/dist/commands/status.js +1 -1
  19. package/dist/commands/status.js.map +1 -1
  20. package/dist/commands/version.js +1 -1
  21. package/dist/commands/version.js.map +1 -1
  22. package/dist/config.d.ts.map +1 -1
  23. package/dist/config.js +21 -16
  24. package/dist/config.js.map +1 -1
  25. package/package.json +3 -2
  26. package/stores/index.js +44 -13
  27. package/stores/index.js.map +2 -2
  28. package/stores/memory-queries.d.ts.map +1 -1
  29. package/stores/memory-queries.js +3 -4
  30. package/stores/memory-queries.js.map +1 -1
  31. package/stores/migrations.d.ts +1 -1
  32. package/stores/migrations.d.ts.map +1 -1
  33. package/stores/migrations.js +55 -8
  34. package/stores/migrations.js.map +1 -1
  35. package/stores/pglite-store.d.ts +1 -1
  36. package/stores/pglite-store.d.ts.map +1 -1
  37. package/stores/pglite-store.js +2 -2
  38. package/stores/pglite-store.js.map +1 -1
package/stores/index.js CHANGED
@@ -4385,8 +4385,14 @@ var Logger = class _Logger {
4385
4385
 
4386
4386
  // src/stores/migrations.ts
4387
4387
  var log = new Logger("store");
4388
- async function runMigrations(db) {
4388
+ async function runMigrations(db, embeddingDimensions = 3072) {
4389
4389
  await db.exec("CREATE EXTENSION IF NOT EXISTS vector;");
4390
+ await db.exec(`
4391
+ CREATE TABLE IF NOT EXISTS _meta (
4392
+ key TEXT PRIMARY KEY,
4393
+ value TEXT NOT NULL
4394
+ )
4395
+ `);
4390
4396
  await db.exec(`
4391
4397
  CREATE TABLE IF NOT EXISTS sessions (
4392
4398
  id TEXT PRIMARY KEY,
@@ -4437,7 +4443,7 @@ async function runMigrations(db) {
4437
4443
  content TEXT NOT NULL,
4438
4444
  category TEXT NOT NULL DEFAULT 'general',
4439
4445
  tags JSONB NOT NULL DEFAULT '[]',
4440
- embedding vector(3072),
4446
+ embedding vector(${embeddingDimensions}),
4441
4447
  source_session_id TEXT,
4442
4448
  confidence REAL NOT NULL DEFAULT 0.8,
4443
4449
  access_count INTEGER NOT NULL DEFAULT 0,
@@ -4452,10 +4458,13 @@ async function runMigrations(db) {
4452
4458
  `SELECT format_type(atttypid, atttypmod) AS col_type FROM pg_attribute
4453
4459
  WHERE attrelid = 'facts'::regclass AND attname = 'embedding'`
4454
4460
  );
4455
- if (typeCheck.rows.length > 0 && typeCheck.rows[0].col_type !== "vector(3072)") {
4461
+ if (typeCheck.rows.length > 0 && typeCheck.rows[0].col_type !== `vector(${embeddingDimensions})`) {
4456
4462
  await db.exec("ALTER TABLE facts DROP COLUMN embedding");
4457
- await db.exec("ALTER TABLE facts ADD COLUMN embedding vector(3072)");
4458
- log.info("migrated facts.embedding to vector(3072)", { was: typeCheck.rows[0].col_type });
4463
+ await db.exec(`ALTER TABLE facts ADD COLUMN embedding vector(${embeddingDimensions})`);
4464
+ log.info("migrated facts.embedding", {
4465
+ was: typeCheck.rows[0].col_type,
4466
+ now: `vector(${embeddingDimensions})`
4467
+ });
4459
4468
  }
4460
4469
  await db.exec(
4461
4470
  "CREATE UNIQUE INDEX IF NOT EXISTS idx_facts_content_category ON facts(content, category)"
@@ -4540,7 +4549,9 @@ async function runMigrations(db) {
4540
4549
  content || ' ' || COALESCE((SELECT string_agg(value, ' ') FROM jsonb_array_elements_text(tags)), '')
4541
4550
  ) WHERE tsv IS NULL
4542
4551
  `);
4543
- await db.exec("ALTER TABLE transcripts ADD COLUMN IF NOT EXISTS embedding vector(3072)");
4552
+ await db.exec(
4553
+ `ALTER TABLE transcripts ADD COLUMN IF NOT EXISTS embedding vector(${embeddingDimensions})`
4554
+ );
4544
4555
  await db.exec(`
4545
4556
  CREATE TABLE IF NOT EXISTS entities (
4546
4557
  id TEXT PRIMARY KEY,
@@ -4583,7 +4594,7 @@ async function runMigrations(db) {
4583
4594
  id TEXT PRIMARY KEY,
4584
4595
  session_id TEXT NOT NULL REFERENCES sessions(id),
4585
4596
  chunk_text TEXT NOT NULL,
4586
- embedding vector(3072),
4597
+ embedding vector(${embeddingDimensions}),
4587
4598
  start_transcript_id INTEGER NOT NULL,
4588
4599
  end_transcript_id INTEGER NOT NULL,
4589
4600
  created_at TIMESTAMP NOT NULL DEFAULT NOW()
@@ -4621,6 +4632,29 @@ async function runMigrations(db) {
4621
4632
  use_count INTEGER NOT NULL DEFAULT 0
4622
4633
  )
4623
4634
  `);
4635
+ const storedDims = await db.query(
4636
+ `SELECT value FROM _meta WHERE key = 'embedding_dimensions'`
4637
+ );
4638
+ if (storedDims.rows.length === 0) {
4639
+ await db.query(`INSERT INTO _meta (key, value) VALUES ('embedding_dimensions', $1)`, [
4640
+ String(embeddingDimensions)
4641
+ ]);
4642
+ } else if (storedDims.rows[0].value !== String(embeddingDimensions)) {
4643
+ log.warn("embedding dimensions changed", {
4644
+ was: storedDims.rows[0].value,
4645
+ now: embeddingDimensions
4646
+ });
4647
+ await db.query(`UPDATE _meta SET value = $1 WHERE key = 'embedding_dimensions'`, [
4648
+ String(embeddingDimensions)
4649
+ ]);
4650
+ for (const table of ["facts", "transcripts", "transcript_chunks"]) {
4651
+ await db.exec(`ALTER TABLE ${table} DROP COLUMN IF EXISTS embedding`);
4652
+ await db.exec(`ALTER TABLE ${table} ADD COLUMN embedding vector(${embeddingDimensions})`);
4653
+ }
4654
+ log.info("embedding columns recreated with new dimensions", {
4655
+ dimensions: embeddingDimensions
4656
+ });
4657
+ }
4624
4658
  const identityCount = await db.query(
4625
4659
  "SELECT COUNT(*)::TEXT as count FROM identity"
4626
4660
  );
@@ -4833,7 +4867,7 @@ async function getFacts(db, options = {}) {
4833
4867
  return result.rows.map((r) => mapFact(r));
4834
4868
  }
4835
4869
  async function searchFacts(db, query, embedding, limit = 10) {
4836
- if (embedding?.length === 3072) {
4870
+ if (embedding && embedding.length > 0) {
4837
4871
  const vecStr = `[${embedding.join(",")}]`;
4838
4872
  const result2 = await db.query(
4839
4873
  `SELECT * FROM facts
@@ -4858,9 +4892,6 @@ async function searchFacts(db, query, embedding, limit = 10) {
4858
4892
  return result.rows.map((r) => mapFact(r));
4859
4893
  }
4860
4894
  async function upsertFact(db, content, category, tags, sourceSessionId, confidence = 0.8, embedding, tagPath) {
4861
- if (embedding && embedding.length !== 3072) {
4862
- throw new Error(`Embedding must be 3072-dimensional, got ${embedding.length}`);
4863
- }
4864
4895
  const id = crypto3.randomUUID();
4865
4896
  const embeddingStr = embedding ? `[${embedding.join(",")}]` : null;
4866
4897
  const resolvedTagPath = tagPath ?? category;
@@ -5754,12 +5785,12 @@ var PgliteStore = class _PgliteStore {
5754
5785
  * Create a PgliteStore backed by a directory on disk (WAL-persisted).
5755
5786
  * If no dataDir is provided, creates an in-memory instance (useful for tests).
5756
5787
  */
5757
- static async create(dataDir) {
5788
+ static async create(dataDir, embeddingDimensions) {
5758
5789
  const db = await PGlite.create(dataDir ?? "memory://", {
5759
5790
  extensions: { vector }
5760
5791
  });
5761
5792
  const store = new _PgliteStore(db);
5762
- await runMigrations(db);
5793
+ await runMigrations(db, embeddingDimensions);
5763
5794
  return store;
5764
5795
  }
5765
5796
  // --- Session methods ---