memorix 0.7.0 → 0.7.1

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.
@@ -1014,6 +1014,7 @@ function toggleObsSelect(id) {
1014
1014
  selectedIds.add(id);
1015
1015
  }
1016
1016
  renderBatchToolbar();
1017
+ renderObsList();
1017
1018
  }
1018
1019
 
1019
1020
  // Make batch functions globally accessible
@@ -1140,7 +1141,7 @@ function renderObsList() {
1140
1141
  return `
1141
1142
  <div class="obs-card${isLow ? ' low-quality' : ''}" data-obs-id="${obs.id}">
1142
1143
  <div class="obs-card-header" onclick="toggleObsDetail(${obs.id})">
1143
- ${batchMode ? `<input type="checkbox" class="obs-checkbox" ${isSelected ? 'checked' : ''} onclick="event.stopPropagation(); toggleObsSelect(${obs.id}); this.checked = !this.checked;" />` : ''}
1144
+ ${batchMode ? `<input type="checkbox" class="obs-checkbox" ${isSelected ? 'checked' : ''} onclick="event.stopPropagation(); toggleObsSelect(${obs.id});" />` : ''}
1144
1145
  <span class="obs-card-id">#${obs.id}</span>
1145
1146
  <span class="type-badge" data-type="${obs.type || 'unknown'}">
1146
1147
  ${typeIcons[obs.type] || '❓'} ${obs.type || 'unknown'}
@@ -1242,6 +1242,7 @@ body {
1242
1242
  /* Batch select checkbox */
1243
1243
  .obs-checkbox {
1244
1244
  appearance: none;
1245
+ position: relative;
1245
1246
  width: 16px;
1246
1247
  height: 16px;
1247
1248
  border: 1.5px solid var(--border-medium);
@@ -1259,12 +1260,14 @@ body {
1259
1260
 
1260
1261
  .obs-checkbox:checked::after {
1261
1262
  content: '✓';
1262
- display: block;
1263
- text-align: center;
1263
+ position: absolute;
1264
+ top: 50%;
1265
+ left: 50%;
1266
+ transform: translate(-50%, -50%);
1264
1267
  font-size: 11px;
1265
1268
  color: #000;
1266
- line-height: 14px;
1267
1269
  font-weight: bold;
1270
+ line-height: 1;
1268
1271
  }
1269
1272
 
1270
1273
  .obs-detail-section {
package/dist/index.js CHANGED
@@ -443,24 +443,26 @@ __export(provider_exports, {
443
443
  resetProvider: () => resetProvider
444
444
  });
445
445
  async function getEmbeddingProvider() {
446
- if (initialized) return provider;
447
- initialized = true;
448
- try {
449
- const { FastEmbedProvider: FastEmbedProvider2 } = await Promise.resolve().then(() => (init_fastembed_provider(), fastembed_provider_exports));
450
- provider = await FastEmbedProvider2.create();
451
- console.error(`[memorix] Embedding provider: ${provider.name} (${provider.dimensions}d)`);
452
- return provider;
453
- } catch {
454
- }
455
- try {
456
- const { TransformersProvider: TransformersProvider2 } = await Promise.resolve().then(() => (init_transformers_provider(), transformers_provider_exports));
457
- provider = await TransformersProvider2.create();
458
- console.error(`[memorix] Embedding provider: ${provider.name} (${provider.dimensions}d)`);
459
- return provider;
460
- } catch {
461
- }
462
- console.error("[memorix] No embedding provider available \u2014 using fulltext search only");
463
- return null;
446
+ if (initPromise) return initPromise;
447
+ initPromise = (async () => {
448
+ try {
449
+ const { FastEmbedProvider: FastEmbedProvider2 } = await Promise.resolve().then(() => (init_fastembed_provider(), fastembed_provider_exports));
450
+ provider = await FastEmbedProvider2.create();
451
+ console.error(`[memorix] Embedding provider: ${provider.name} (${provider.dimensions}d)`);
452
+ return provider;
453
+ } catch {
454
+ }
455
+ try {
456
+ const { TransformersProvider: TransformersProvider2 } = await Promise.resolve().then(() => (init_transformers_provider(), transformers_provider_exports));
457
+ provider = await TransformersProvider2.create();
458
+ console.error(`[memorix] Embedding provider: ${provider.name} (${provider.dimensions}d)`);
459
+ return provider;
460
+ } catch {
461
+ }
462
+ console.error("[memorix] No embedding provider available \u2014 using fulltext search only");
463
+ return null;
464
+ })();
465
+ return initPromise;
464
466
  }
465
467
  async function isVectorSearchAvailable() {
466
468
  const p = await getEmbeddingProvider();
@@ -468,15 +470,15 @@ async function isVectorSearchAvailable() {
468
470
  }
469
471
  function resetProvider() {
470
472
  provider = null;
471
- initialized = false;
473
+ initPromise = null;
472
474
  }
473
- var provider, initialized;
475
+ var provider, initPromise;
474
476
  var init_provider = __esm({
475
477
  "src/embedding/provider.ts"() {
476
478
  "use strict";
477
479
  init_esm_shims();
478
480
  provider = null;
479
- initialized = false;
481
+ initPromise = null;
480
482
  }
481
483
  });
482
484
 
@@ -1598,7 +1600,7 @@ async function handleApi(req, res, dataDir, projectId, projectName, baseDir) {
1598
1600
  case "/projects": {
1599
1601
  try {
1600
1602
  const entries = await fs4.readdir(baseDir, { withFileTypes: true });
1601
- const projects = entries.filter((e) => e.isDirectory() && e.name.includes("--")).map((e) => {
1603
+ const projects = entries.filter((e) => e.isDirectory() && e.name.includes("--") && !e.name.startsWith("local--")).map((e) => {
1602
1604
  const dirName = e.name;
1603
1605
  const id = dirName.replace(/--/g, "/");
1604
1606
  return {
@@ -1642,13 +1644,12 @@ async function handleApi(req, res, dataDir, projectId, projectName, baseDir) {
1642
1644
  const sorted = [...observations2].sort((a, b) => (b.id || 0) - (a.id || 0)).slice(0, 10);
1643
1645
  let embeddingStatus = { enabled: false, provider: "", dimensions: 0 };
1644
1646
  try {
1645
- const { isEmbeddingEnabled: isEmbeddingEnabled2 } = await Promise.resolve().then(() => (init_orama_store(), orama_store_exports));
1646
1647
  const { getEmbeddingProvider: getEmbeddingProvider2 } = await Promise.resolve().then(() => (init_provider(), provider_exports));
1647
- const provider2 = await getEmbeddingProvider2();
1648
+ const embProvider = await getEmbeddingProvider2();
1648
1649
  embeddingStatus = {
1649
- enabled: isEmbeddingEnabled2(),
1650
- provider: provider2?.name || "",
1651
- dimensions: provider2?.dimensions || 0
1650
+ enabled: embProvider !== null,
1651
+ provider: embProvider?.name || "",
1652
+ dimensions: embProvider?.dimensions || 0
1652
1653
  };
1653
1654
  } catch {
1654
1655
  }
@@ -5051,7 +5052,23 @@ ${skill.content}` }]
5051
5052
  console.error("[memorix] Dashboard error:", err);
5052
5053
  dashboardRunning = false;
5053
5054
  });
5054
- await new Promise((resolve2) => setTimeout(resolve2, 800));
5055
+ const { createConnection } = await import("net");
5056
+ await new Promise((resolve2) => {
5057
+ const deadline = Date.now() + 5e3;
5058
+ const tryConnect = () => {
5059
+ const sock = createConnection(portNum, "127.0.0.1");
5060
+ sock.once("connect", () => {
5061
+ sock.destroy();
5062
+ resolve2();
5063
+ });
5064
+ sock.once("error", () => {
5065
+ sock.destroy();
5066
+ if (Date.now() < deadline) setTimeout(tryConnect, 100);
5067
+ else resolve2();
5068
+ });
5069
+ };
5070
+ tryConnect();
5071
+ });
5055
5072
  dashboardRunning = true;
5056
5073
  const { exec: execCmd } = await import("child_process");
5057
5074
  const openCmd = process.platform === "win32" ? `start "" "${url}"` : process.platform === "darwin" ? `open "${url}"` : `xdg-open "${url}"`;