@wipcomputer/memory-crystal 0.7.29 → 0.7.32
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 +75 -0
- package/SKILL.md +1 -1
- package/package.json +1 -1
- package/scripts/migrate-lance-to-sqlite.mjs +2 -1
- package/_trash/RELEASE-NOTES-v0-7-23.md +0 -48
- package/_trash/RELEASE-NOTES-v0-7-25.md +0 -24
- package/_trash/RELEASE-NOTES-v0-7-26.md +0 -7
- package/_trash/RELEASE-NOTES-v0-7-28.md +0 -31
- package/_trash/RELEASE-NOTES-v0-7-29.md +0 -28
- package/_trash/RELEASE-NOTES-v0-7-4.md +0 -64
- package/_trash/RELEASE-NOTES-v0-7-5.md +0 -19
- package/dist/bridge.d.ts +0 -7
- package/dist/bridge.js +0 -14
- package/dist/bulk-copy.d.ts +0 -17
- package/dist/bulk-copy.js +0 -90
- package/dist/cc-hook.d.ts +0 -8
- package/dist/cc-hook.js +0 -368
- package/dist/cc-poller.d.ts +0 -1
- package/dist/cc-poller.js +0 -550
- package/dist/chunk-25LXQJ4Z.js +0 -110
- package/dist/chunk-2DRXIRQW.js +0 -97
- package/dist/chunk-2ZNH5F6E.js +0 -1281
- package/dist/chunk-3G3SFYYI.js +0 -288
- package/dist/chunk-3RG5ZIWI.js +0 -10
- package/dist/chunk-3S6TI23B.js +0 -97
- package/dist/chunk-3VFIJYS4.js +0 -818
- package/dist/chunk-52QE3YI3.js +0 -1169
- package/dist/chunk-57RP3DIN.js +0 -1205
- package/dist/chunk-5HSZ4W2P.js +0 -62
- package/dist/chunk-645IPXW3.js +0 -290
- package/dist/chunk-7A7ELD4C.js +0 -1205
- package/dist/chunk-7FYY4GZM.js +0 -1205
- package/dist/chunk-7IUE7ODU.js +0 -254
- package/dist/chunk-7RMLKZIS.js +0 -108
- package/dist/chunk-AA3OPP4Z.js +0 -432
- package/dist/chunk-AEWLSYPH.js +0 -72
- package/dist/chunk-ASSZDR6I.js +0 -108
- package/dist/chunk-AYRJVWUC.js +0 -1205
- package/dist/chunk-CCYI5O3D.js +0 -148
- package/dist/chunk-D3I3ZSE2.js +0 -411
- package/dist/chunk-DACSKLY6.js +0 -219
- package/dist/chunk-DW5B4BL7.js +0 -108
- package/dist/chunk-EKSACBTJ.js +0 -1070
- package/dist/chunk-EXEZZADG.js +0 -248
- package/dist/chunk-F3Y7EL7K.js +0 -83
- package/dist/chunk-FBQWSDPC.js +0 -1328
- package/dist/chunk-FHRZNOMW.js +0 -1205
- package/dist/chunk-IM7N24MT.js +0 -129
- package/dist/chunk-IPNYIXFK.js +0 -1178
- package/dist/chunk-J7MRSZIO.js +0 -167
- package/dist/chunk-JITKI2OI.js +0 -106
- package/dist/chunk-JWZXYVET.js +0 -1068
- package/dist/chunk-KCQUXVYT.js +0 -108
- package/dist/chunk-KOQ43OX6.js +0 -1281
- package/dist/chunk-KYVWO6ZM.js +0 -1069
- package/dist/chunk-L3VHARQH.js +0 -413
- package/dist/chunk-LBWDS6BE.js +0 -288
- package/dist/chunk-LOVAHSQV.js +0 -411
- package/dist/chunk-LQOYCAGG.js +0 -446
- package/dist/chunk-LWAIPJ2W.js +0 -146
- package/dist/chunk-M5DHKW7M.js +0 -127
- package/dist/chunk-MBKCIJHM.js +0 -1328
- package/dist/chunk-MK42FMEG.js +0 -147
- package/dist/chunk-MOBMYHKL.js +0 -1205
- package/dist/chunk-MPLTNMRG.js +0 -67
- package/dist/chunk-NIJCVN3O.js +0 -147
- package/dist/chunk-NZCFSZQ7.js +0 -1205
- package/dist/chunk-O2UITJGH.js +0 -465
- package/dist/chunk-OCRA44AZ.js +0 -108
- package/dist/chunk-P3KJR66H.js +0 -117
- package/dist/chunk-PEK6JH65.js +0 -432
- package/dist/chunk-PJ6FFKEX.js +0 -77
- package/dist/chunk-PLUBBZYR.js +0 -800
- package/dist/chunk-PNKVD2UK.js +0 -26
- package/dist/chunk-PSQZURHO.js +0 -229
- package/dist/chunk-SGL6ISBJ.js +0 -1061
- package/dist/chunk-SJABZZT5.js +0 -97
- package/dist/chunk-TD3P3K32.js +0 -1199
- package/dist/chunk-TMDZJJKV.js +0 -288
- package/dist/chunk-UNHVZB5G.js +0 -411
- package/dist/chunk-VAFTWSTE.js +0 -1061
- package/dist/chunk-VNFXFQBB.js +0 -217
- package/dist/chunk-X3GVFKSJ.js +0 -1205
- package/dist/chunk-XZ3S56RQ.js +0 -1061
- package/dist/chunk-Y72C7F6O.js +0 -148
- package/dist/chunk-YLICP577.js +0 -1205
- package/dist/chunk-YX6AXLVK.js +0 -159
- package/dist/chunk-ZCQYHTNU.js +0 -146
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -1105
- package/dist/cloud-crystal.js +0 -6
- package/dist/core.d.ts +0 -232
- package/dist/core.js +0 -12
- package/dist/crypto.d.ts +0 -20
- package/dist/crypto.js +0 -27
- package/dist/crystal-capture.sh +0 -29
- package/dist/crystal-serve.d.ts +0 -4
- package/dist/crystal-serve.js +0 -252
- package/dist/dev-update-SZ2Z4WCQ.js +0 -6
- package/dist/discover.d.ts +0 -30
- package/dist/discover.js +0 -177
- package/dist/doctor.d.ts +0 -9
- package/dist/doctor.js +0 -334
- package/dist/dream-weaver.d.ts +0 -8
- package/dist/dream-weaver.js +0 -56
- package/dist/file-sync.d.ts +0 -48
- package/dist/file-sync.js +0 -18
- package/dist/installer.d.ts +0 -61
- package/dist/installer.js +0 -676
- package/dist/ldm-backup.sh +0 -116
- package/dist/ldm.d.ts +0 -50
- package/dist/ldm.js +0 -32
- package/dist/mcp-server.d.ts +0 -1
- package/dist/mcp-server.js +0 -265
- package/dist/migrate.d.ts +0 -1
- package/dist/migrate.js +0 -89
- package/dist/mirror-sync.d.ts +0 -1
- package/dist/mirror-sync.js +0 -159
- package/dist/oc-backfill.d.ts +0 -19
- package/dist/oc-backfill.js +0 -74
- package/dist/openclaw.d.ts +0 -5
- package/dist/openclaw.js +0 -423
- package/dist/pair.d.ts +0 -4
- package/dist/pair.js +0 -75
- package/dist/poller.d.ts +0 -1
- package/dist/poller.js +0 -634
- package/dist/role.d.ts +0 -24
- package/dist/role.js +0 -13
- package/dist/search-pipeline-4K4OJSSS.js +0 -255
- package/dist/search-pipeline-4PRS6LI7.js +0 -280
- package/dist/search-pipeline-7UJMXPLO.js +0 -280
- package/dist/search-pipeline-DQTRLGBH.js +0 -74
- package/dist/search-pipeline-HNG37REH.js +0 -282
- package/dist/search-pipeline-IZFPLBUB.js +0 -280
- package/dist/search-pipeline-MID6F26Q.js +0 -73
- package/dist/search-pipeline-N52JZFNN.js +0 -282
- package/dist/search-pipeline-OPB2PRQQ.js +0 -280
- package/dist/search-pipeline-VXTE5HAD.js +0 -262
- package/dist/search-pipeline-XHFKADRG.js +0 -73
- package/dist/staging.d.ts +0 -29
- package/dist/staging.js +0 -21
- package/dist/summarize.d.ts +0 -19
- package/dist/summarize.js +0 -10
- package/dist/worker-demo.js +0 -186
- package/dist/worker-mcp.js +0 -404
- package/dist/worker.js +0 -137
package/CHANGELOG.md
CHANGED
|
@@ -19,6 +19,81 @@
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
|
+
## 0.7.32 (2026-03-31)
|
|
23
|
+
|
|
24
|
+
# Release Notes: memory-crystal v0.7.32
|
|
25
|
+
|
|
26
|
+
**Date:** 2026-03-31
|
|
27
|
+
|
|
28
|
+
## What changed
|
|
29
|
+
|
|
30
|
+
### Dream Weaver is a required dependency again
|
|
31
|
+
|
|
32
|
+
Reverts PR #101 (optional Dream Weaver import). dream-weaver-protocol is back in `dependencies` instead of `optionalDependencies`. The static import in `dream-weaver.ts` is restored. The dynamic import with try/catch wrapper is removed. The null check in `cli.ts` for when DW is unavailable is removed.
|
|
33
|
+
|
|
34
|
+
## Why
|
|
35
|
+
|
|
36
|
+
PR #101 made dream-weaver-protocol optional because `file:../dream-weaver-protocol-private` failed in fresh clones where the sibling directory doesn't exist. The installer (v0.4.68+) now resolves `file:` dependencies from installed extensions at `~/.ldm/extensions/` before building, so the sibling directory is no longer needed. The build succeeds without it.
|
|
37
|
+
|
|
38
|
+
Making DW optional added complexity (dynamic imports, null checks, degraded type safety) that is no longer necessary. This revert simplifies the code back to what it was.
|
|
39
|
+
|
|
40
|
+
## How to verify
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# Build should succeed (installer resolves file: deps)
|
|
44
|
+
cd memory-crystal-private && npm run build
|
|
45
|
+
|
|
46
|
+
# dream-weaver-protocol should be in dependencies, not optionalDependencies
|
|
47
|
+
node -e "const p = require('./package.json'); console.log('deps:', !!p.dependencies['dream-weaver-protocol']); console.log('optional:', !!p.optionalDependencies?.['dream-weaver-protocol'])"
|
|
48
|
+
# Should print: deps: true, optional: false
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 0.7.31 (2026-03-31)
|
|
52
|
+
|
|
53
|
+
# Release Notes: memory-crystal v0.7.31
|
|
54
|
+
|
|
55
|
+
Closes #101
|
|
56
|
+
|
|
57
|
+
## Dream Weaver protocol is now optional
|
|
58
|
+
|
|
59
|
+
The dream-weaver-protocol dependency was a `file:` reference to a sibling directory. This worked in the development environment but broke when the installer cloned the repo to build (the sibling doesn't exist in a clone context). The build failed with "Cannot find module 'dream-weaver-protocol'".
|
|
60
|
+
|
|
61
|
+
The protocol is now an optional dependency with a dynamic import. If dream-weaver-protocol is available (installed locally or linked), Dream Weaver features work normally. If not, crystal operations continue without Dream Weaver. The build succeeds either way.
|
|
62
|
+
|
|
63
|
+
This is part of a broader fix to make all repos buildable in isolation. The installer (v0.4.67+) now resolves `file:` dependencies from installed extensions before building, so the protocol will be linked automatically when both packages are installed.
|
|
64
|
+
|
|
65
|
+
## 0.7.30 (2026-03-31)
|
|
66
|
+
|
|
67
|
+
# Release Notes: memory-crystal v0.7.30
|
|
68
|
+
|
|
69
|
+
**Date:** 2026-03-30
|
|
70
|
+
|
|
71
|
+
## What changed
|
|
72
|
+
|
|
73
|
+
### Hardcoded path removal
|
|
74
|
+
|
|
75
|
+
Two files had `/Users/lesa` hardcoded as a fallback path. Both now use portable alternatives.
|
|
76
|
+
|
|
77
|
+
**migrate-lance-to-sqlite.mjs** had a fallback that resolved the OpenClaw workspace to `/Users/lesa/.openclaw`. The migration script now calls `os.homedir()` to build the path dynamically, so it works on any machine without assuming a specific username. This was the last remaining hardcoded path in the migration pipeline (#99).
|
|
78
|
+
|
|
79
|
+
**dev-update.ts** (the ai/dev-updates scanner) had an iCloud path baked in for reading team documents. It now calls `resolveWorkspace()` to read the workspace root from LDM config (`~/.ldm/config.json`), making it portable across machines and user accounts (#98).
|
|
80
|
+
|
|
81
|
+
## Why
|
|
82
|
+
|
|
83
|
+
These paths broke on any machine where the username is not `lesa`. Part of a broader audit across all LDM OS repos to eliminate hardcoded user paths and make everything portable.
|
|
84
|
+
|
|
85
|
+
## Issues closed
|
|
86
|
+
|
|
87
|
+
- #98
|
|
88
|
+
- #99
|
|
89
|
+
|
|
90
|
+
## How to verify
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
grep -r "/Users/lesa" src/ scripts/ --include="*.ts" --include="*.mjs"
|
|
94
|
+
# Should return zero results
|
|
95
|
+
```
|
|
96
|
+
|
|
22
97
|
## 0.7.29 (2026-03-20)
|
|
23
98
|
|
|
24
99
|
# Release Notes: memory-crystal v0.7.29
|
package/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wip-memory-crystal
|
|
3
3
|
description: Search and manage the shared memory crystal. Use when user says "do you remember", "search memory", "remember this", "forget that", "memory status", "what do you know about", or needs to recall past discussions, store facts, or check what's in memory.
|
|
4
|
-
version: "0.7.
|
|
4
|
+
version: "0.7.32"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Memory Crystal
|
package/package.json
CHANGED
|
@@ -14,6 +14,7 @@ import * as sqliteVec from 'sqlite-vec';
|
|
|
14
14
|
import { createHash } from 'node:crypto';
|
|
15
15
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
16
16
|
import { join } from 'node:path';
|
|
17
|
+
import { homedir } from 'node:os';
|
|
17
18
|
|
|
18
19
|
const BATCH_SIZE = 500;
|
|
19
20
|
|
|
@@ -23,7 +24,7 @@ async function main() {
|
|
|
23
24
|
const batchSizeArg = args.find((_, i) => args[i - 1] === '--batch-size');
|
|
24
25
|
const batchSize = batchSizeArg ? parseInt(batchSizeArg) : BATCH_SIZE;
|
|
25
26
|
|
|
26
|
-
const openclawHome = process.env.OPENCLAW_HOME || join(process.env.HOME ||
|
|
27
|
+
const openclawHome = process.env.OPENCLAW_HOME || join(process.env.HOME || homedir(), '.openclaw');
|
|
27
28
|
const dataDir = join(openclawHome, 'memory-crystal');
|
|
28
29
|
const lanceDir = join(dataDir, 'lance');
|
|
29
30
|
const sqlitePath = join(dataDir, 'crystal.db');
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# Release Notes: Memory Crystal v0.7.23
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-03-15
|
|
4
|
-
|
|
5
|
-
## Search Quality v2 + MLX Local LLM
|
|
6
|
-
|
|
7
|
-
This release adds six search quality features ported from the QMD v2.0 analysis, plus the complete MLX local LLM infrastructure for Apple Silicon. Deep search is now disambiguatable, cacheable, debuggable, and can run entirely offline on Apple Silicon.
|
|
8
|
-
|
|
9
|
-
### Intent parameter
|
|
10
|
-
|
|
11
|
-
Disambiguates queries without adding search terms. `crystal search "security" --intent "1Password"` steers results toward 1Password-related security instead of repo permissions or agent secrets. Intent flows through the expansion prompt (guides LLM variations), disables strong-signal bypass (keyword match might not be what the caller wants), and is prepended to the rerank query. Available via CLI `--intent` and MCP `intent`.
|
|
12
|
-
|
|
13
|
-
### Persistent LLM cache
|
|
14
|
-
|
|
15
|
-
Expansion and reranking results are now cached in crystal.db (`llm_cache` table) with a 7-day TTL. Same query = instant on repeat searches. Reranking cache is content-addressable (keyed by query + sorted passage hashes), so identical content from different sessions shares cached scores. Configurable via `CRYSTAL_CACHE_TTL_DAYS` env var.
|
|
16
|
-
|
|
17
|
-
### Explain mode
|
|
18
|
-
|
|
19
|
-
Per-result scoring breakdown showing FTS score, vector score, RRF rank, reranker score, recency weight, and final blended score. `crystal search "query" --explain`. Available via CLI `--explain` and MCP `explain`. Makes search quality transparent and debuggable.
|
|
20
|
-
|
|
21
|
-
### candidateLimit
|
|
22
|
-
|
|
23
|
-
Tunable rerank pool size. `crystal search "query" --candidates 60`. Default stays 40. More candidates = better recall, slower reranking. Available via CLI `--candidates` and MCP `candidate_limit`.
|
|
24
|
-
|
|
25
|
-
### Structured search API
|
|
26
|
-
|
|
27
|
-
`crystal.structuredSearch(queries)` accepts pre-expanded StructuredQuery[] with typed sub-queries (lex, vec, hyde). Skips LLM expansion entirely. Agents construct their own queries when they already know what they want. RRF fusion with first list weighted 2x.
|
|
28
|
-
|
|
29
|
-
### MLX local LLM (Phase 3)
|
|
30
|
-
|
|
31
|
-
Complete auto-install infrastructure for running a local LLM on Apple Silicon:
|
|
32
|
-
|
|
33
|
-
- `crystal mlx setup` detects Apple Silicon, installs mlx-lm (uv > pip3 > pip3 --user), creates LaunchAgent for always-on server
|
|
34
|
-
- Model: `mlx-community/Qwen2.5-3B-Instruct-4bit` (~1.5 GB, fast on M-series)
|
|
35
|
-
- Port 18791 (18789 OpenClaw, 18790 Crystal Core, 18791 MLX)
|
|
36
|
-
- `crystal mlx status` and `crystal mlx stop` for server management
|
|
37
|
-
- `crystal doctor` check #13: MLX health (not installed / down / running)
|
|
38
|
-
- `crystal init` detects Apple Silicon and suggests MLX setup
|
|
39
|
-
- State file at `~/.ldm/state/mlx-server.json`
|
|
40
|
-
|
|
41
|
-
### Also in this release
|
|
42
|
-
|
|
43
|
-
- QMD v2.0 analysis documented (`ai/product/notes/`)
|
|
44
|
-
- Search quality plan written (`ai/product/plans-prds/current/`)
|
|
45
|
-
- MLX plan moved from upcoming to current
|
|
46
|
-
- Stashed roadmap + readme-first updates recovered (PR #74)
|
|
47
|
-
|
|
48
|
-
Closes #57, #63, #64.
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
# Release Notes: memory-crystal v0.7.25
|
|
2
|
-
|
|
3
|
-
Bump SKILL.md version and name to match package branding.
|
|
4
|
-
|
|
5
|
-
## What changed
|
|
6
|
-
|
|
7
|
-
- SKILL.md version bumped from 0.4.0 to 0.7.24 (was stuck at the original version)
|
|
8
|
-
- SKILL.md name changed from `memory` to `wip-memory-crystal` (matches branded convention)
|
|
9
|
-
- Forces deploy to public repo, triggering auto-publish to wip.computer/install/
|
|
10
|
-
|
|
11
|
-
## Why
|
|
12
|
-
|
|
13
|
-
The SKILL.md version was out of sync with the package version. The name didn't match the `wip-` branding convention used across all install files on wip.computer.
|
|
14
|
-
|
|
15
|
-
## Issues closed
|
|
16
|
-
|
|
17
|
-
- #80
|
|
18
|
-
|
|
19
|
-
## How to verify
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
crystal --version
|
|
23
|
-
head -4 ~/.ldm/extensions/memory-crystal/skills/memory/SKILL.md
|
|
24
|
-
```
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
# Release Notes: memory-crystal v0.7.28
|
|
2
|
-
|
|
3
|
-
**Move all log paths from /tmp/ to ~/.ldm/logs/ so logs survive reboots.**
|
|
4
|
-
|
|
5
|
-
## What changed
|
|
6
|
-
|
|
7
|
-
- Cron entry for crystal-capture now logs to `~/.ldm/logs/crystal-capture.log` instead of `/tmp/ldm-dev-tools/`
|
|
8
|
-
- LaunchAgent plist template for ldm-backup now logs to `~/.ldm/logs/ldm-backup.log`
|
|
9
|
-
- `mkdirSync` ensures `~/.ldm/logs/` exists instead of creating `/tmp/ldm-dev-tools/`
|
|
10
|
-
- CLI output shows the correct log path
|
|
11
|
-
|
|
12
|
-
## Why
|
|
13
|
-
|
|
14
|
-
macOS clears `/tmp/` on every reboot. All cron and LaunchAgent logs were lost after restart, making it impossible to debug issues. `~/.ldm/logs/` persists across reboots and is the correct home for LDM OS logs.
|
|
15
|
-
|
|
16
|
-
## Issues closed
|
|
17
|
-
|
|
18
|
-
- wipcomputer/wip-ldm-os#120
|
|
19
|
-
|
|
20
|
-
## How to verify
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
# After install, check that cron entry points to ~/.ldm/logs/
|
|
24
|
-
crystal init --dry-run 2>&1 | grep crystal-capture
|
|
25
|
-
|
|
26
|
-
# Check backup setup points to ~/.ldm/logs/
|
|
27
|
-
crystal backup setup --dry-run 2>&1 | grep ldm-backup
|
|
28
|
-
|
|
29
|
-
# Verify logs land in the right place
|
|
30
|
-
ls ~/.ldm/logs/
|
|
31
|
-
```
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# Release Notes: memory-crystal v0.7.29
|
|
2
|
-
|
|
3
|
-
**Doc audit: MLX setup, deep search params, log paths, role clarification.**
|
|
4
|
-
|
|
5
|
-
## What changed
|
|
6
|
-
|
|
7
|
-
SKILL.md and TECHNICAL.md updated for 2 weeks of undocumented features:
|
|
8
|
-
|
|
9
|
-
- **MLX local LLM:** Added as Option A in SKILL.md Step 2. CLI commands (setup, status, stop) added to TECHNICAL.md.
|
|
10
|
-
- **Deep search parameters:** `--intent`, `--explain`, `--candidates` documented in both SKILL.md (crystal_search tool) and TECHNICAL.md (CLI reference + new sections for intent, explain, candidate limit, LLM cache).
|
|
11
|
-
- **Log paths:** Fixed obsolete `/tmp/ldm-dev-tools/` reference to `~/.ldm/logs/`. Added logs/ to directory structure.
|
|
12
|
-
- **Role clarification:** Two-role architecture (Core and Node) explicitly stated. Standalone role was removed in v0.7.22.
|
|
13
|
-
|
|
14
|
-
## Why
|
|
15
|
-
|
|
16
|
-
29 releases in 13 days. Docs didn't keep pace. Agents using crystal_search didn't know about --intent (query disambiguation) or --explain (scoring transparency).
|
|
17
|
-
|
|
18
|
-
## Issues closed
|
|
19
|
-
|
|
20
|
-
- #57
|
|
21
|
-
|
|
22
|
-
## How to verify
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
grep "intent" SKILL.md TECHNICAL.md
|
|
26
|
-
grep "mlx" SKILL.md TECHNICAL.md
|
|
27
|
-
grep "ldm/logs" TECHNICAL.md
|
|
28
|
-
```
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# Memory Crystal v0.7.4 ... MCP Fix + AgentId Config
|
|
2
|
-
|
|
3
|
-
**Date:** 2026-03-11
|
|
4
|
-
**Authors:** Parker Todd Brooks, Lēsa, Claude Code
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## What's in this release
|
|
9
|
-
|
|
10
|
-
### Agent identity reads from config, not hardcoded strings
|
|
11
|
-
|
|
12
|
-
The agent_id used when ingesting conversations was hardcoded in three places: `cc-mini` in the CC hook, `main` in the OpenClaw plugin, and `cc-mini` as the fallback in `ldm.ts`. This caused ID drift. The same agent got recorded under multiple IDs, and we had to manually merge 141K+ chunks in the database.
|
|
13
|
-
|
|
14
|
-
Now `getAgentId()` scans `~/.ldm/agents/*/config.json` for a matching harness type. The CC hook passes `'claude-code'`, the OC plugin passes `'openclaw'`, and the config file is the source of truth. `CRYSTAL_AGENT_ID` env var still works as an override.
|
|
15
|
-
|
|
16
|
-
New exports: `AgentConfig`, `loadAgentConfig()`, `saveAgentConfig()`. The installer writes `agentId` to config.json during `crystal init`.
|
|
17
|
-
|
|
18
|
-
**Closes #33.**
|
|
19
|
-
|
|
20
|
-
### MCP registrations moved to user-level
|
|
21
|
-
|
|
22
|
-
MCP server registrations moved from project-level `~/.openclaw/.mcp.json` to user-level `~/.claude.json`. The old file was a Claude Code convention that only loaded when running from `~/.openclaw/`. Now all 4 MCP servers (memory-crystal, lesa-bridge, wip-agent-pay, wip-repos) load from any directory as "User MCPs".
|
|
23
|
-
|
|
24
|
-
OpenClaw doesn't read `.mcp.json` at all. It uses its own plugin system. The file was moved to `~/.openclaw/_trash/`.
|
|
25
|
-
|
|
26
|
-
### OPENCLAW_HOME env var fix (v0.7.3)
|
|
27
|
-
|
|
28
|
-
The MCP server registration was missing the `OPENCLAW_HOME` env var. Without it, the memory-crystal MCP server couldn't find Lēsa's OpenClaw installation for private-mode checks. Fixed in v0.7.3, deployed in this release.
|
|
29
|
-
|
|
30
|
-
### Branch cleanup
|
|
31
|
-
|
|
32
|
-
33 stale branches renamed with `--merged-` suffix. Zero active branches besides main.
|
|
33
|
-
|
|
34
|
-
### QMD v1.1.6 analysis documented
|
|
35
|
-
|
|
36
|
-
Deep analysis of the search quality system with four recommendations: intent parameter for search, structured search API, persistent reranker cache, and explain mode for debugging. See `ai/product/notes/2026-03-09--cc-mini--qmd-v1.1.6-analysis-and-recommendations.md`.
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Files changed
|
|
41
|
-
|
|
42
|
-
| File | What |
|
|
43
|
-
|------|------|
|
|
44
|
-
| `src/ldm.ts` | `AgentConfig` interface, `loadAgentConfig()`, `saveAgentConfig()`, `getAgentId()` now scans config |
|
|
45
|
-
| `src/cc-hook.ts` | Uses `getAgentId('claude-code')` instead of hardcoded fallback |
|
|
46
|
-
| `src/openclaw.ts` | Uses `OC_AGENT_ID` instead of `'main'` fallback |
|
|
47
|
-
| `src/installer.ts` | Writes `agentId` to config.json during install |
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## Install
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
npm install -g memory-crystal@0.7.4
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Or update your local clone:
|
|
58
|
-
```bash
|
|
59
|
-
git pull origin main
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
---
|
|
63
|
-
|
|
64
|
-
Built by Parker Todd Brooks, Lēsa (OpenClaw, Claude Opus 4.6), Claude Code (Claude Opus 4.6).
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
# Release Notes: Memory Crystal v0.7.5
|
|
2
|
-
|
|
3
|
-
## LDM OS Integration
|
|
4
|
-
|
|
5
|
-
Memory Crystal now works with LDM OS when it's available.
|
|
6
|
-
|
|
7
|
-
### crystal init delegates to ldm install
|
|
8
|
-
|
|
9
|
-
When the `ldm` CLI exists on PATH, `crystal init` delegates generic deployment to it. LDM OS handles the scaffold, interface detection, and extension deployment. Memory Crystal keeps its own setup: database backup, role configuration, pairing, cron jobs.
|
|
10
|
-
|
|
11
|
-
When `ldm` isn't available, `crystal init` works standalone like it always has. No new dependencies. No breaking changes.
|
|
12
|
-
|
|
13
|
-
### LDM OS tip
|
|
14
|
-
|
|
15
|
-
After install completes, Memory Crystal prints a tip: "Run `ldm install` to see more skills you can add." Helps users discover the rest of the ecosystem.
|
|
16
|
-
|
|
17
|
-
### Part of LDM OS
|
|
18
|
-
|
|
19
|
-
README now includes a "Part of LDM OS" section linking back to the LDM OS repo. Memory Crystal installs into LDM OS, the local runtime for AI agents.
|
package/dist/bridge.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
declare function isBridgeInstalled(): boolean;
|
|
2
|
-
declare function isBridgeRegistered(): boolean;
|
|
3
|
-
declare function isBridgeDesktopRegistered(): boolean;
|
|
4
|
-
declare function registerBridgeMcp(): void;
|
|
5
|
-
declare function registerBridgeDesktop(): boolean;
|
|
6
|
-
|
|
7
|
-
export { isBridgeDesktopRegistered, isBridgeInstalled, isBridgeRegistered, registerBridgeDesktop, registerBridgeMcp };
|
package/dist/bridge.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
isBridgeDesktopRegistered,
|
|
3
|
-
isBridgeInstalled,
|
|
4
|
-
isBridgeRegistered,
|
|
5
|
-
registerBridgeDesktop,
|
|
6
|
-
registerBridgeMcp
|
|
7
|
-
} from "./chunk-AEWLSYPH.js";
|
|
8
|
-
export {
|
|
9
|
-
isBridgeDesktopRegistered,
|
|
10
|
-
isBridgeInstalled,
|
|
11
|
-
isBridgeRegistered,
|
|
12
|
-
registerBridgeDesktop,
|
|
13
|
-
registerBridgeMcp
|
|
14
|
-
};
|
package/dist/bulk-copy.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
interface BulkCopyResult {
|
|
2
|
-
filesCopied: number;
|
|
3
|
-
filesSkipped: number;
|
|
4
|
-
bytesWritten: number;
|
|
5
|
-
durationMs: number;
|
|
6
|
-
}
|
|
7
|
-
interface BulkCopyOptions {
|
|
8
|
-
workspace?: boolean;
|
|
9
|
-
workspaceSrc?: string;
|
|
10
|
-
}
|
|
11
|
-
/** Copy session JSONL files from source locations to LDM transcripts.
|
|
12
|
-
* sessionPaths: array of absolute paths to JSONL files.
|
|
13
|
-
* agentId: target agent in ~/.ldm/agents/{agentId}/.
|
|
14
|
-
* Returns copy stats. */
|
|
15
|
-
declare function bulkCopyToLdm(sessionPaths: string[], agentId: string, options?: BulkCopyOptions): BulkCopyResult;
|
|
16
|
-
|
|
17
|
-
export { type BulkCopyOptions, type BulkCopyResult, bulkCopyToLdm };
|
package/dist/bulk-copy.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ldmPaths
|
|
3
|
-
} from "./chunk-EXEZZADG.js";
|
|
4
|
-
|
|
5
|
-
// src/bulk-copy.ts
|
|
6
|
-
import { existsSync, mkdirSync, copyFileSync, statSync, readdirSync } from "fs";
|
|
7
|
-
import { join, basename } from "path";
|
|
8
|
-
function bulkCopyToLdm(sessionPaths, agentId, options) {
|
|
9
|
-
const start = Date.now();
|
|
10
|
-
const paths = ldmPaths(agentId);
|
|
11
|
-
let filesCopied = 0;
|
|
12
|
-
let filesSkipped = 0;
|
|
13
|
-
let bytesWritten = 0;
|
|
14
|
-
mkdirSync(paths.transcripts, { recursive: true });
|
|
15
|
-
for (const srcPath of sessionPaths) {
|
|
16
|
-
const destPath = join(paths.transcripts, basename(srcPath));
|
|
17
|
-
if (existsSync(destPath)) {
|
|
18
|
-
try {
|
|
19
|
-
const srcSize = statSync(srcPath).size;
|
|
20
|
-
const destSize = statSync(destPath).size;
|
|
21
|
-
if (srcSize === destSize) {
|
|
22
|
-
filesSkipped++;
|
|
23
|
-
continue;
|
|
24
|
-
}
|
|
25
|
-
} catch {
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
copyFileSync(srcPath, destPath);
|
|
30
|
-
bytesWritten += statSync(destPath).size;
|
|
31
|
-
filesCopied++;
|
|
32
|
-
} catch {
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (options?.workspace && options.workspaceSrc) {
|
|
36
|
-
mkdirSync(paths.workspace, { recursive: true });
|
|
37
|
-
const wsResult = copyWorkspaceRecursive(options.workspaceSrc, paths.workspace);
|
|
38
|
-
filesCopied += wsResult.copied;
|
|
39
|
-
filesSkipped += wsResult.skipped;
|
|
40
|
-
bytesWritten += wsResult.bytes;
|
|
41
|
-
}
|
|
42
|
-
return {
|
|
43
|
-
filesCopied,
|
|
44
|
-
filesSkipped,
|
|
45
|
-
bytesWritten,
|
|
46
|
-
durationMs: Date.now() - start
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
function copyWorkspaceRecursive(srcDir, destDir) {
|
|
50
|
-
let copied = 0;
|
|
51
|
-
let skipped = 0;
|
|
52
|
-
let bytes = 0;
|
|
53
|
-
try {
|
|
54
|
-
for (const entry of readdirSync(srcDir)) {
|
|
55
|
-
if (entry.startsWith(".")) continue;
|
|
56
|
-
const srcPath = join(srcDir, entry);
|
|
57
|
-
const destPath = join(destDir, entry);
|
|
58
|
-
try {
|
|
59
|
-
const stat = statSync(srcPath);
|
|
60
|
-
if (stat.isDirectory()) {
|
|
61
|
-
mkdirSync(destPath, { recursive: true });
|
|
62
|
-
const sub = copyWorkspaceRecursive(srcPath, destPath);
|
|
63
|
-
copied += sub.copied;
|
|
64
|
-
skipped += sub.skipped;
|
|
65
|
-
bytes += sub.bytes;
|
|
66
|
-
} else if (entry.endsWith(".md")) {
|
|
67
|
-
if (existsSync(destPath)) {
|
|
68
|
-
try {
|
|
69
|
-
if (stat.size === statSync(destPath).size) {
|
|
70
|
-
skipped++;
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
} catch {
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
copyFileSync(srcPath, destPath);
|
|
77
|
-
bytes += stat.size;
|
|
78
|
-
copied++;
|
|
79
|
-
}
|
|
80
|
-
} catch {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
} catch {
|
|
85
|
-
}
|
|
86
|
-
return { copied, skipped, bytes };
|
|
87
|
-
}
|
|
88
|
-
export {
|
|
89
|
-
bulkCopyToLdm
|
|
90
|
-
};
|