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.
- package/CHANGELOG.md +8 -0
- package/README.md +30 -15
- package/dist/cli/index.js +45 -28
- package/dist/cli/index.js.map +1 -1
- package/dist/dashboard/static/app.js +2 -1
- package/dist/dashboard/static/style.css +6 -3
- package/dist/index.js +45 -28
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.7.1] — 2026-02-22
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
- **Dashboard checkbox checkmark not visible** — Added `position: relative/absolute` to `.obs-checkbox::after` so the ✓ renders correctly in batch select mode
|
|
9
|
+
- **Embedding provider status flickers to "fulltext only"** — Replaced `initialized` boolean flag with a shared Promise lock; concurrent callers now wait for the same initialization instead of seeing `provider = null` mid-load
|
|
10
|
+
- **`memorix_dashboard` MCP tool reliability** — Replaced fixed 800ms wait with TCP port polling (up to 5s) so the tool only returns after the HTTP server is actually listening
|
|
11
|
+
- **Dashboard embedding status always shows "fulltext only"** — Fixed root cause: dashboard is an independent process, `isEmbeddingEnabled()` from orama-store always returns false there; now uses `provider !== null` directly
|
|
12
|
+
|
|
5
13
|
## [0.7.0] — 2026-02-21
|
|
6
14
|
|
|
7
15
|
### Added
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<a href="https://www.npmjs.com/package/memorix"><img src="https://img.shields.io/npm/dm/memorix.svg?style=flat-square&color=blue" alt="npm downloads"></a>
|
|
8
8
|
<a href="LICENSE"><img src="https://img.shields.io/badge/license-Apache%202.0-green.svg?style=flat-square" alt="License"></a>
|
|
9
9
|
<a href="https://github.com/AVIDS2/memorix"><img src="https://img.shields.io/github/stars/AVIDS2/memorix?style=flat-square&color=yellow" alt="GitHub stars"></a>
|
|
10
|
-
<img src="https://img.shields.io/badge/tests-
|
|
10
|
+
<img src="https://img.shields.io/badge/tests-422%20passed-brightgreen?style=flat-square" alt="Tests">
|
|
11
11
|
</p>
|
|
12
12
|
<p align="center">
|
|
13
13
|
<a href="#-quick-start">Quick Start</a> •
|
|
@@ -28,11 +28,8 @@
|
|
|
28
28
|
|
|
29
29
|
## ⚡ Quick Start
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
One config line. Seven agents. Zero context loss.
|
|
32
32
|
|
|
33
|
-
Add Memorix to your agent's MCP config — **that's it**. No global install needed.
|
|
34
|
-
|
|
35
|
-
**Windsurf** → `~/.codeium/windsurf/mcp_config.json`
|
|
36
33
|
```json
|
|
37
34
|
{
|
|
38
35
|
"mcpServers": {
|
|
@@ -44,17 +41,9 @@ Add Memorix to your agent's MCP config — **that's it**. No global install need
|
|
|
44
41
|
}
|
|
45
42
|
```
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
> 💡 More agent configs: [Cursor](#cursor) • [Claude Code](#claude-code) • [Codex](#codex) • [VS Code Copilot](#vs-code-copilot) • [Antigravity](#antigravity) • [Kiro](#kiro)
|
|
50
|
-
|
|
51
|
-
### Or Install Globally
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
npm install -g memorix
|
|
55
|
-
```
|
|
44
|
+
Add this to your agent's MCP config, restart — done. 🎉
|
|
56
45
|
|
|
57
|
-
|
|
46
|
+
> 💡 Agent-specific config paths: [Windsurf](#windsurf) • [Cursor](#cursor) • [Claude Code](#claude-code) • [Codex](#codex) • [VS Code Copilot](#vs-code-copilot) • [Antigravity](#antigravity) • [Kiro](#kiro)
|
|
58
47
|
|
|
59
48
|
---
|
|
60
49
|
|
|
@@ -143,6 +132,32 @@ Session 2: New chat, same project
|
|
|
143
132
|
|
|
144
133
|
## 🔧 Agent Configuration
|
|
145
134
|
|
|
135
|
+
### Windsurf
|
|
136
|
+
|
|
137
|
+
`~/.codeium/windsurf/mcp_config.json`:
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"mcpServers": {
|
|
141
|
+
"memorix": {
|
|
142
|
+
"command": "npx",
|
|
143
|
+
"args": ["-y", "memorix@latest", "serve"]
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
> **Timeout troubleshooting** — If you see `MCP server initialization timed out after 60 seconds`, add `--cwd` to force the project root:
|
|
150
|
+
> ```json
|
|
151
|
+
> {
|
|
152
|
+
> "mcpServers": {
|
|
153
|
+
> "memorix": {
|
|
154
|
+
> "command": "npx",
|
|
155
|
+
> "args": ["-y", "memorix@latest", "serve", "--cwd", "<your-project-path>"]
|
|
156
|
+
> }
|
|
157
|
+
> }
|
|
158
|
+
> }
|
|
159
|
+
> ```
|
|
160
|
+
|
|
146
161
|
### Cursor
|
|
147
162
|
|
|
148
163
|
`.cursor/mcp.json`:
|
package/dist/cli/index.js
CHANGED
|
@@ -571,24 +571,26 @@ __export(provider_exports, {
|
|
|
571
571
|
resetProvider: () => resetProvider
|
|
572
572
|
});
|
|
573
573
|
async function getEmbeddingProvider() {
|
|
574
|
-
if (
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
574
|
+
if (initPromise) return initPromise;
|
|
575
|
+
initPromise = (async () => {
|
|
576
|
+
try {
|
|
577
|
+
const { FastEmbedProvider: FastEmbedProvider2 } = await Promise.resolve().then(() => (init_fastembed_provider(), fastembed_provider_exports));
|
|
578
|
+
provider = await FastEmbedProvider2.create();
|
|
579
|
+
console.error(`[memorix] Embedding provider: ${provider.name} (${provider.dimensions}d)`);
|
|
580
|
+
return provider;
|
|
581
|
+
} catch {
|
|
582
|
+
}
|
|
583
|
+
try {
|
|
584
|
+
const { TransformersProvider: TransformersProvider2 } = await Promise.resolve().then(() => (init_transformers_provider(), transformers_provider_exports));
|
|
585
|
+
provider = await TransformersProvider2.create();
|
|
586
|
+
console.error(`[memorix] Embedding provider: ${provider.name} (${provider.dimensions}d)`);
|
|
587
|
+
return provider;
|
|
588
|
+
} catch {
|
|
589
|
+
}
|
|
590
|
+
console.error("[memorix] No embedding provider available \u2014 using fulltext search only");
|
|
591
|
+
return null;
|
|
592
|
+
})();
|
|
593
|
+
return initPromise;
|
|
592
594
|
}
|
|
593
595
|
async function isVectorSearchAvailable() {
|
|
594
596
|
const p3 = await getEmbeddingProvider();
|
|
@@ -596,15 +598,15 @@ async function isVectorSearchAvailable() {
|
|
|
596
598
|
}
|
|
597
599
|
function resetProvider() {
|
|
598
600
|
provider = null;
|
|
599
|
-
|
|
601
|
+
initPromise = null;
|
|
600
602
|
}
|
|
601
|
-
var provider,
|
|
603
|
+
var provider, initPromise;
|
|
602
604
|
var init_provider = __esm({
|
|
603
605
|
"src/embedding/provider.ts"() {
|
|
604
606
|
"use strict";
|
|
605
607
|
init_esm_shims();
|
|
606
608
|
provider = null;
|
|
607
|
-
|
|
609
|
+
initPromise = null;
|
|
608
610
|
}
|
|
609
611
|
});
|
|
610
612
|
|
|
@@ -4216,7 +4218,7 @@ async function handleApi(req, res, dataDir, projectId, projectName, baseDir) {
|
|
|
4216
4218
|
case "/projects": {
|
|
4217
4219
|
try {
|
|
4218
4220
|
const entries = await fs4.readdir(baseDir, { withFileTypes: true });
|
|
4219
|
-
const projects = entries.filter((e) => e.isDirectory() && e.name.includes("--")).map((e) => {
|
|
4221
|
+
const projects = entries.filter((e) => e.isDirectory() && e.name.includes("--") && !e.name.startsWith("local--")).map((e) => {
|
|
4220
4222
|
const dirName = e.name;
|
|
4221
4223
|
const id = dirName.replace(/--/g, "/");
|
|
4222
4224
|
return {
|
|
@@ -4260,13 +4262,12 @@ async function handleApi(req, res, dataDir, projectId, projectName, baseDir) {
|
|
|
4260
4262
|
const sorted = [...observations2].sort((a, b) => (b.id || 0) - (a.id || 0)).slice(0, 10);
|
|
4261
4263
|
let embeddingStatus = { enabled: false, provider: "", dimensions: 0 };
|
|
4262
4264
|
try {
|
|
4263
|
-
const { isEmbeddingEnabled: isEmbeddingEnabled2 } = await Promise.resolve().then(() => (init_orama_store(), orama_store_exports));
|
|
4264
4265
|
const { getEmbeddingProvider: getEmbeddingProvider2 } = await Promise.resolve().then(() => (init_provider(), provider_exports));
|
|
4265
|
-
const
|
|
4266
|
+
const embProvider = await getEmbeddingProvider2();
|
|
4266
4267
|
embeddingStatus = {
|
|
4267
|
-
enabled:
|
|
4268
|
-
provider:
|
|
4269
|
-
dimensions:
|
|
4268
|
+
enabled: embProvider !== null,
|
|
4269
|
+
provider: embProvider?.name || "",
|
|
4270
|
+
dimensions: embProvider?.dimensions || 0
|
|
4270
4271
|
};
|
|
4271
4272
|
} catch {
|
|
4272
4273
|
}
|
|
@@ -5237,7 +5238,23 @@ ${skill.content}` }]
|
|
|
5237
5238
|
console.error("[memorix] Dashboard error:", err);
|
|
5238
5239
|
dashboardRunning = false;
|
|
5239
5240
|
});
|
|
5240
|
-
|
|
5241
|
+
const { createConnection } = await import("net");
|
|
5242
|
+
await new Promise((resolve2) => {
|
|
5243
|
+
const deadline = Date.now() + 5e3;
|
|
5244
|
+
const tryConnect = () => {
|
|
5245
|
+
const sock = createConnection(portNum, "127.0.0.1");
|
|
5246
|
+
sock.once("connect", () => {
|
|
5247
|
+
sock.destroy();
|
|
5248
|
+
resolve2();
|
|
5249
|
+
});
|
|
5250
|
+
sock.once("error", () => {
|
|
5251
|
+
sock.destroy();
|
|
5252
|
+
if (Date.now() < deadline) setTimeout(tryConnect, 100);
|
|
5253
|
+
else resolve2();
|
|
5254
|
+
});
|
|
5255
|
+
};
|
|
5256
|
+
tryConnect();
|
|
5257
|
+
});
|
|
5241
5258
|
dashboardRunning = true;
|
|
5242
5259
|
const { exec: execCmd } = await import("child_process");
|
|
5243
5260
|
const openCmd = process.platform === "win32" ? `start "" "${url}"` : process.platform === "darwin" ? `open "${url}"` : `xdg-open "${url}"`;
|