dsh-memory-nebula 1.1.0 → 1.1.2
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 +542 -513
- package/README.en.md +151 -148
- package/README.md +8 -5
- package/docs/compatibility.md +2 -1
- package/docs/distribution.md +18 -7
- package/docs/http-api.md +2 -2
- package/docs/market.en.md +109 -0
- package/docs/market.zh.md +109 -0
- package/docs/operations.md +1 -1
- package/docs/release.md +3 -3
- package/docs/testing.md +2 -1
- package/docs/verified.md +24 -0
- package/lib/web/app.js +1 -1
- package/locale/en.json +7 -0
- package/locale/zh.json +7 -0
- package/market/assets/icon.svg +40 -0
- package/market/index.json +101 -0
- package/package.json +70 -68
- package/scripts/release-check.mjs +16 -0
package/README.en.md
CHANGED
|
@@ -1,148 +1,151 @@
|
|
|
1
|
-
# Memory Nebula · memory-nebula
|
|
2
|
-
|
|
3
|
-
A DSH plugin that pulls memories out of every workspace **and every memory plugin**, turns them into a **nebula of evidence-backed connections**, and lets both you and the AI follow those connections the way neurons do.
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-
|
|
7
|
-
No memories yet? The empty state offers three ways in, plus a built-in demo galaxy:
|
|
8
|
-
|
|
9
|
-

|
|
10
|
-
|
|
11
|
-

|
|
12
|
-
|
|
13
|
-

|
|
14
|
-
|
|
15
|
-
Export the whole graph (text included) as one self-contained HTML for offline reading:
|
|
16
|
-
|
|
17
|
-

|
|
18
|
-
|
|
19
|
-
- One icon in the sidebar opens the whole nebula (deep-space style: zoom, filter, search).
|
|
20
|
-
- Every other memory database is opened **read-only**. The plugin only writes under `$DSH_HOME/memory-nebula/`.
|
|
21
|
-
- It is not just a picture: the host registers **9 tools** plus a per-turn prompt, so the AI can walk a connection into another project and read the other half of a memory.
|
|
22
|
-
- Sources are **pluggable**: meow-memory SQLite, any notes directory, any SQLite table, or JSONL pushed by a remote service — all behind one adapter contract.
|
|
23
|
-
|
|
24
|
-
## What it does
|
|
25
|
-
|
|
26
|
-
| Capability | Where |
|
|
27
|
-
| --- | --- |
|
|
28
|
-
| Nebula / galaxy / time-spiral views | sidebar icon; `1` `2` `3` |
|
|
29
|
-
| Spreading-activation recall across workspaces | `nebula_recall`, search box `/` |
|
|
30
|
-
| Full text, origin, same-session neighbours, who mentioned it | click any node |
|
|
31
|
-
| Evidence chain: how two memories are actually connected | select one, `Shift`-click another |
|
|
32
|
-
| **Cross-plugin bridge**: what another plugin just injected → the neighbours it did not | `nebula_bridge`, per-turn injection |
|
|
33
|
-
| **Attach a new memory store**: SQLite / notes dir / JSONL | `nebula_sources`, `sources.json` |
|
|
34
|
-
| **Push from a remote memory service** | `nebula_ingest`, `POST /ingest` |
|
|
35
|
-
| Export the whole graph (MD report / JSON) | `GET /export?format=md\|json` |
|
|
36
|
-
| Corrections: mute a wrong edge | `×` next to a neighbour, or `nebula_link(action="mute")` |
|
|
37
|
-
| Memory hygiene (six failure modes) | left panel, board `B`, `nebula_hygiene` |
|
|
38
|
-
| Export visible PNG / subgraph JSON | top bar |
|
|
39
|
-
| First open: three ways in, or a built-in demo galaxy | empty-state card, `?demo=1` |
|
|
40
|
-
| Single-file snapshot: the whole graph (with text) as one offline HTML | Export → “whole graph · single HTML”, `GET /share` |
|
|
41
|
-
| Scoped share: one workspace, one project, or a node’s 2-hop neighbourhood | Export menu, `GET /share?scope=ws:<workspace>` |
|
|
42
|
-
| Privacy filter: drop the diary workspace, a level, a project or a status before export | Export menu, `GET /share?hide=ws:diary` |
|
|
43
|
-
| **Bilingual UI**: interface and offline snapshots in English, untranslated strings fall back to Chinese | top-bar language button, `?lang=en` |
|
|
44
|
-
| **One-click diagnostics**: version, environment, graph size and last error, with no memory text or paths | `?` → “Copy diagnostics”, `GET /diagnostics`, `--diagnose` |
|
|
45
|
-
| First-visit guide: search → open one memory → trace one chain, skippable | appears once, replay from `?` |
|
|
46
|
-
| Time replay (everything up to a day) | timeline in the time view |
|
|
47
|
-
| Keyboard map | `?` |
|
|
48
|
-
|
|
49
|
-
## Quick start
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
#
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
# 2
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
#
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
|
105
|
-
|
|
|
106
|
-
| [docs/
|
|
107
|
-
| [docs/
|
|
108
|
-
| [docs/
|
|
109
|
-
| [docs/
|
|
110
|
-
| [docs/
|
|
111
|
-
| [docs/
|
|
112
|
-
| [docs/
|
|
113
|
-
| [docs/
|
|
114
|
-
| [docs/
|
|
115
|
-
| [docs/
|
|
116
|
-
| [
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
1
|
+
# Memory Nebula · memory-nebula
|
|
2
|
+
|
|
3
|
+
A DSH plugin that pulls memories out of every workspace **and every memory plugin**, turns them into a **nebula of evidence-backed connections**, and lets both you and the AI follow those connections the way neurons do.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
No memories yet? The empty state offers three ways in, plus a built-in demo galaxy:
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+

|
|
12
|
+
|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
Export the whole graph (text included) as one self-contained HTML for offline reading:
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
- One icon in the sidebar opens the whole nebula (deep-space style: zoom, filter, search).
|
|
20
|
+
- Every other memory database is opened **read-only**. The plugin only writes under `$DSH_HOME/memory-nebula/`.
|
|
21
|
+
- It is not just a picture: the host registers **9 tools** plus a per-turn prompt, so the AI can walk a connection into another project and read the other half of a memory.
|
|
22
|
+
- Sources are **pluggable**: meow-memory SQLite, any notes directory, any SQLite table, or JSONL pushed by a remote service — all behind one adapter contract.
|
|
23
|
+
|
|
24
|
+
## What it does
|
|
25
|
+
|
|
26
|
+
| Capability | Where |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| Nebula / galaxy / time-spiral views | sidebar icon; `1` `2` `3` |
|
|
29
|
+
| Spreading-activation recall across workspaces | `nebula_recall`, search box `/` |
|
|
30
|
+
| Full text, origin, same-session neighbours, who mentioned it | click any node |
|
|
31
|
+
| Evidence chain: how two memories are actually connected | select one, `Shift`-click another |
|
|
32
|
+
| **Cross-plugin bridge**: what another plugin just injected → the neighbours it did not | `nebula_bridge`, per-turn injection |
|
|
33
|
+
| **Attach a new memory store**: SQLite / notes dir / JSONL | `nebula_sources`, `sources.json` |
|
|
34
|
+
| **Push from a remote memory service** | `nebula_ingest`, `POST /ingest` |
|
|
35
|
+
| Export the whole graph (MD report / JSON) | `GET /export?format=md\|json` |
|
|
36
|
+
| Corrections: mute a wrong edge | `×` next to a neighbour, or `nebula_link(action="mute")` |
|
|
37
|
+
| Memory hygiene (six failure modes) | left panel, board `B`, `nebula_hygiene` |
|
|
38
|
+
| Export visible PNG / subgraph JSON | top bar |
|
|
39
|
+
| First open: three ways in, or a built-in demo galaxy | empty-state card, `?demo=1` |
|
|
40
|
+
| Single-file snapshot: the whole graph (with text) as one offline HTML | Export → “whole graph · single HTML”, `GET /share` |
|
|
41
|
+
| Scoped share: one workspace, one project, or a node’s 2-hop neighbourhood | Export menu, `GET /share?scope=ws:<workspace>` |
|
|
42
|
+
| Privacy filter: drop the diary workspace, a level, a project or a status before export | Export menu, `GET /share?hide=ws:diary` |
|
|
43
|
+
| **Bilingual UI**: interface and offline snapshots in English, untranslated strings fall back to Chinese | top-bar language button, `?lang=en` |
|
|
44
|
+
| **One-click diagnostics**: version, environment, graph size and last error, with no memory text or paths | `?` → “Copy diagnostics”, `GET /diagnostics`, `--diagnose` |
|
|
45
|
+
| First-visit guide: search → open one memory → trace one chain, skippable | appears once, replay from `?` |
|
|
46
|
+
| Time replay (everything up to a day) | timeline in the time view |
|
|
47
|
+
| Keyboard map | `?` |
|
|
48
|
+
|
|
49
|
+
## Quick start
|
|
50
|
+
|
|
51
|
+
From the plugin market (recommended): add the index
|
|
52
|
+
`https://unpkg.com/dsh-memory-nebula@1.1.2/market/index.json` under
|
|
53
|
+
Plugins → Discover, search for “Memory Nebula”, and install. Run the doctor in step 2.5 afterwards.
|
|
54
|
+
|
|
55
|
+
Or install from this checkout:
|
|
56
|
+
|
|
57
|
+
```powershell
|
|
58
|
+
# 1) link the plugin (either way)
|
|
59
|
+
New-Item -ItemType Junction -Path "<profile>\node_modules\dsh-memory-nebula" -Target "<plugin>"
|
|
60
|
+
npm install <path>\dsh-memory-nebula-1.1.2.tgz --prefix <profile>
|
|
61
|
+
|
|
62
|
+
# 2) profile package.json: add the dependency AND the bundle
|
|
63
|
+
# dependencies: "dsh-memory-nebula": "file:../../plugins/dsh-memory-nebula"
|
|
64
|
+
# dsh.profile.bundles: "dsh-memory-nebula"
|
|
65
|
+
|
|
66
|
+
# 2.5) read-only preflight: Node, dependency, bundles and files; exits 1 only on fail
|
|
67
|
+
node "<profile>\node_modules\dsh-memory-nebula\scripts\doctor.mjs" --profile "<profile>"
|
|
68
|
+
|
|
69
|
+
# 3) restart DSH, open the "Memory Nebula" sidebar panel
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
No restart, or the host still runs old modules:
|
|
73
|
+
|
|
74
|
+
```powershell
|
|
75
|
+
powershell -ExecutionPolicy Bypass -File sidecar.ps1 start # Windows, port 7890, finds node itself
|
|
76
|
+
node lib/standalone.mjs --port 7890 # other systems, scans the current directory
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
`sidecar.ps1` also takes `-Port`, `-Root <extra scan dir>` and `-Node <node.exe>`; `status` / `stop` only touch that port.
|
|
80
|
+
|
|
81
|
+
The page probes `/ping` on both legs and picks the newer `build`; a banner explains when the host lacks endpoints.
|
|
82
|
+
|
|
83
|
+
Self-checks:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
npm test # 84 unit assertions
|
|
87
|
+
npm run check # static release check
|
|
88
|
+
node scripts/smoke.mjs # 63 contract assertions against a live instance
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Attaching a new memory store (three steps)
|
|
92
|
+
|
|
93
|
+
1. Ask the AI: *"run `nebula_sources`, then attach `<where your memories live>`."*
|
|
94
|
+
2. The AI reads [docs/integration-guide.md](docs/integration-guide.md) and picks a path:
|
|
95
|
+
- **on disk (SQLite / notes)** → add a source to `sources.json`; hot-reloaded.
|
|
96
|
+
- **API only** → have that plugin `POST /api/memory-nebula/ingest`, or call `nebula_ingest`.
|
|
97
|
+
- **just need context once** → call `nebula_bridge(memory_ids=[…])`, no source needed.
|
|
98
|
+
3. Confirm with `GET /sources`: the new store must report "N nodes, 0 read errors".
|
|
99
|
+
|
|
100
|
+
Adapter contract and every `sources.json` field: [docs/adapters.md](docs/adapters.md).
|
|
101
|
+
|
|
102
|
+
## Docs
|
|
103
|
+
|
|
104
|
+
| File | Contents |
|
|
105
|
+
| --- | --- |
|
|
106
|
+
| [docs/integration-guide.md](docs/integration-guide.md) | **Integration manual for another AI**: three paths, decision tree, verification |
|
|
107
|
+
| [docs/adapters.md](docs/adapters.md) | Adapter contract, four built-in adapters, `sources.json`, safety boundary |
|
|
108
|
+
| [docs/recall-and-tools.md](docs/recall-and-tools.md) | Spreading activation, the nine tools, bridge budget, per-turn injection |
|
|
109
|
+
| [docs/architecture.md](docs/architecture.md) | Module map, request path, invariants |
|
|
110
|
+
| [docs/interface.md](docs/interface.md) | Views, interaction, detail panel, LOD, board / command palette, export |
|
|
111
|
+
| [docs/http-api.md](docs/http-api.md) | HTTP routes, `/ping` fields, ETag/304, error codes, body limits |
|
|
112
|
+
| [docs/security.md](docs/security.md) | Local-only boundary, CORS/CSRF, CSP, read-only guarantee, threat model |
|
|
113
|
+
| [docs/operations.md](docs/operations.md) | Read-only boundary, install, hot reload, known limits |
|
|
114
|
+
| [docs/release.md](docs/release.md) | Release checklist, versioning, packaging, rollback |
|
|
115
|
+
| [docs/compatibility.md](docs/compatibility.md) | Verified OS/Node/browser matrix, explicit non-support |
|
|
116
|
+
| [docs/distribution.md](docs/distribution.md) | Install/upgrade/rollback/uninstall, support flow, marketplace copy |
|
|
117
|
+
| [docs/testing.md](docs/testing.md) | 84 unit tests, 63 smoke checks, 21 security probes, browser probes |
|
|
118
|
+
| [docs/roadmap.md](docs/roadmap.md) | From 0.5 to 1.0: scoped sharing, first-run guidance, 10k-node performance, i18n and release support |
|
|
119
|
+
| [CHANGELOG.md](CHANGELOG.md) | Version history |
|
|
120
|
+
|
|
121
|
+
## Layout
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
lib/
|
|
125
|
+
index.js entry: 9 tools, prompt injection, /api/memory-nebula
|
|
126
|
+
host/
|
|
127
|
+
nebula.js facade: index / cache / refresh / detail / bridge
|
|
128
|
+
graph.js build, score, prune, auditHygiene
|
|
129
|
+
recall.js seeds + spreading activation
|
|
130
|
+
bridge.js complementary bundle: ids → spread → drop seen → fit budget
|
|
131
|
+
ledger.js injection ledger shared across plugins
|
|
132
|
+
adapters/ meow / notes / sqlite / ingest + discovery and config
|
|
133
|
+
live.js hot reload (recursive over lib/host, copy by mtime)
|
|
134
|
+
http.js routes (statically loaded)
|
|
135
|
+
web/ front end (served from disk; refresh to apply)
|
|
136
|
+
scripts/smoke.mjs 63 read-only contract checks
|
|
137
|
+
scripts/release-check.mjs static release check
|
|
138
|
+
scripts/bench.mjs 10k benchmark (build / recall / hygiene / snapshot / memory)
|
|
139
|
+
test/ node:test unit suite (84 assertions)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## Privacy and security
|
|
143
|
+
|
|
144
|
+
- Read-only: every memory database is opened with `readOnly`; writes stay under `$DSH_HOME/memory-nebula/`.
|
|
145
|
+
- Local-only: the standalone engine binds `127.0.0.1`; cross-site reads get no CORS, cross-site writes get 403; the page ships a CSP.
|
|
146
|
+
- Full model and verification: [docs/security.md](docs/security.md).
|
|
147
|
+
- Performance budget and 10k measurements: [docs/benchmarks.md](docs/benchmarks.md).
|
|
148
|
+
|
|
149
|
+
## Version
|
|
150
|
+
|
|
151
|
+
`1.1.2`, MIT. Front-end changes apply on refresh; everything under `lib/host/` is hot-reloaded, while `http.js` / `index.js` / `live.js` need a DSH restart (or the standalone engine).
|
package/README.md
CHANGED
|
@@ -72,20 +72,23 @@
|
|
|
72
72
|
|
|
73
73
|
已经装好的机器上(`profiles/desktop`),只要打开「记忆星图」页面就有一张图;页面每 12 秒比一次 `sig`,别的会话写了新记忆会自动长出新星点。库里还没有记忆时,页面会给三条接入路径,也可以先点「看示例」;`…/memory-nebula/?demo=1` 可直达示例星系,逛完退出不会动真实库。
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
从插件市场装(推荐):在 DSH 的「插件 → 发现」里添加索引
|
|
76
|
+
`https://unpkg.com/dsh-memory-nebula@1.1.2/market/index.json`,搜索「记忆星图」安装。
|
|
77
|
+
装完按下面的 2.5 跑一次 doctor。
|
|
78
|
+
|
|
79
|
+
也可以从仓库装到 DSH:
|
|
76
80
|
|
|
77
81
|
```powershell
|
|
78
82
|
# 1) 装进 profile(二选一)
|
|
79
83
|
New-Item -ItemType Junction -Path "<profile>\node_modules\dsh-memory-nebula" -Target "<plugin>"
|
|
80
|
-
npm install <path>\dsh-memory-nebula-1.1.
|
|
84
|
+
npm install <path>\dsh-memory-nebula-1.1.2.tgz --prefix <profile>
|
|
81
85
|
|
|
82
86
|
# 2) profile 的 package.json 里加依赖与 bundles(只加 dependencies 不会重组)
|
|
83
87
|
# dependencies: "dsh-memory-nebula": "file:../../plugins/dsh-memory-nebula"
|
|
84
88
|
# dsh.profile.bundles: "dsh-memory-nebula"
|
|
85
89
|
|
|
86
90
|
# 2.5) 装完先体检:只读检查 Node/依赖/bundles/文件,fail 才退出 1
|
|
87
|
-
node <profile>
|
|
88
|
-
ode_modules\dsh-memory-nebula\scripts\doctor.mjs --profile <profile>
|
|
91
|
+
node "<profile>\node_modules\dsh-memory-nebula\scripts\doctor.mjs" --profile "<profile>"
|
|
89
92
|
|
|
90
93
|
# 3) 重启 DSH,打开侧栏「记忆星图」
|
|
91
94
|
```
|
|
@@ -178,6 +181,6 @@ sidecar.ps1 Windows 独立引擎开关
|
|
|
178
181
|
|
|
179
182
|
## 版本与许可
|
|
180
183
|
|
|
181
|
-
- 当前版本 `1.1.
|
|
184
|
+
- 当前版本 `1.1.2`,MIT。
|
|
182
185
|
- 打包内容:`lib/`、`scripts/`、`docs/`、`cordis.patch.yml`、`README.md` / `README.en.md`、`CHANGELOG.md`、`LICENSE`、`sidecar.ps1`(`test/` 与 `dev/` 不进包)。
|
|
183
186
|
- 前端改动刷新页面即生效;`lib/host/` 下所有引擎文件(含 `adapters/`、`bridge.js`、`ledger.js`)由 LiveEngine 热载,`http.js` / `index.js` / `live.js` 改动要重启 DSH 或走独立引擎。
|
package/docs/compatibility.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 兼容矩阵
|
|
2
2
|
|
|
3
|
-
最后更新:2026-11-10(1.1.
|
|
3
|
+
最后更新:2026-11-10(1.1.2 市场索引改由 unpkg 托管;运行前提未变)
|
|
4
4
|
|
|
5
5
|
这张表只写**真的跑过**的东西。「预期可用」是依据运行前提做的判断,不是实测;
|
|
6
6
|
没有出现的组合就是没有验证,不应当作支持承诺。
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
| 适配器 | meow / notes / sqlite / ingest | 单测 + `sources`/`ingest` 冒烟 |
|
|
23
23
|
| 独立引擎 | `lib/standalone.mjs`,127.0.0.1:7890/7891 | 0.5–0.9 的 `smoke` 与 `--diagnose` |
|
|
24
24
|
| 安装体检 | 真实 desktop profile + 运行中实例 | 1.1.0:9 项全过(含 endpoint ping) |
|
|
25
|
+
| 市场索引 | `@deepseek-ai/dsh-plugin-market-index` format 1 校验 | 1.1.2:unpkg 索引 200,`parseMarketIndex` 通过,图标/详情/图片可解析 |
|
|
25
26
|
|
|
26
27
|
## 预期可用,但未实测
|
|
27
28
|
|
package/docs/distribution.md
CHANGED
|
@@ -6,28 +6,39 @@
|
|
|
6
6
|
## 包是什么
|
|
7
7
|
|
|
8
8
|
- npm 包名:`dsh-memory-nebula`
|
|
9
|
-
- 当前版本:`1.
|
|
9
|
+
- 当前版本:`1.1.1`
|
|
10
10
|
- 形态:DSH 插件(`cordis.patch.yml` + `lib/client.js`)与独立引擎(`lib/standalone.mjs`)共用一套代码
|
|
11
11
|
- 许可:MIT;没有授权锁、没有遥测、不会把记忆上传到任何服务器
|
|
12
12
|
- 包内容:`lib/`、`scripts/`、`docs/`、`cordis.patch.yml`、`README.md` / `README.en.md`、
|
|
13
|
-
`CHANGELOG.md`、`LICENSE`、`sidecar.ps1
|
|
13
|
+
`CHANGELOG.md`、`LICENSE`、`sidecar.ps1`、`locale/`、`market/`;`test/` 与 `dev/` 不进包
|
|
14
14
|
|
|
15
15
|
## 安装
|
|
16
16
|
|
|
17
|
+
### 从 DSH 插件市场
|
|
18
|
+
|
|
19
|
+
在「插件 → 发现」里添加索引:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
https://unpkg.com/dsh-memory-nebula@1.1.2/market/index.json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
搜索「记忆星图」安装。索引与详情页都在 npm 包里,由 jsDelivr 提供;不需要第二个站点。
|
|
26
|
+
条目声明 `engines.dsh >= 0.2.2-rc.1`,更老的 DSH 会显示不兼容而不是装完才崩。
|
|
27
|
+
|
|
17
28
|
### 从 tgz(离线/客户机器)
|
|
18
29
|
|
|
19
30
|
```powershell
|
|
20
31
|
# Windows PowerShell
|
|
21
|
-
Get-FileHash .\dsh-memory-nebula-1.1.
|
|
32
|
+
Get-FileHash .\dsh-memory-nebula-1.1.2.tgz -Algorithm SHA256
|
|
22
33
|
# 对照同目录的 .sha256 文件;不一致就停,不要装
|
|
23
34
|
|
|
24
|
-
npm install .\dsh-memory-nebula-1.1.
|
|
35
|
+
npm install .\dsh-memory-nebula-1.1.2.tgz --prefix <profile>
|
|
25
36
|
```
|
|
26
37
|
|
|
27
38
|
```bash
|
|
28
39
|
# macOS / Linux
|
|
29
|
-
sha256sum -c dsh-memory-nebula-1.1.
|
|
30
|
-
npm install ./dsh-memory-nebula-1.1.
|
|
40
|
+
sha256sum -c dsh-memory-nebula-1.1.2.tgz.sha256
|
|
41
|
+
npm install ./dsh-memory-nebula-1.1.2.tgz --prefix <profile>
|
|
31
42
|
```
|
|
32
43
|
|
|
33
44
|
然后确认 `<profile>/package.json` 里两处都在:
|
|
@@ -118,7 +129,7 @@ Remove-Item -Recurse -Force "$env:USERPROFILE\.dsh\memory-nebula"
|
|
|
118
129
|
npm run verify # 单测 + release-check;prepack 也会跑
|
|
119
130
|
node scripts/smoke.mjs http://127.0.0.1:7891/api/memory-nebula
|
|
120
131
|
npm pack # 生成 tgz
|
|
121
|
-
sha256sum dsh-memory-nebula-1.1.
|
|
132
|
+
sha256sum dsh-memory-nebula-1.1.2.tgz > dsh-memory-nebula-1.1.2.tgz.sha256
|
|
122
133
|
npm publish # 需要维护者账号;本仓库不自动发布
|
|
123
134
|
```
|
|
124
135
|
|
package/docs/http-api.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
```json
|
|
18
18
|
{
|
|
19
19
|
"ok": true,
|
|
20
|
-
"version": "1.1.
|
|
20
|
+
"version": "1.1.2",
|
|
21
21
|
"build": 1794143336695,
|
|
22
22
|
"startedAt": 1794143336695,
|
|
23
23
|
"mode": "host",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
```text
|
|
48
48
|
memory-nebula diagnostics
|
|
49
49
|
# 不含记忆正文;可以整段贴给支持
|
|
50
|
-
version: 1.1.
|
|
50
|
+
version: 1.1.2
|
|
51
51
|
build: 1794276294467
|
|
52
52
|
started: 2026-11-10T02:20:37.399Z
|
|
53
53
|
mode: standalone
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Memory Nebula
|
|
2
|
+
|
|
3
|
+
Turn memories scattered across workspaces into a star map you can walk, query and carry away.
|
|
4
|
+
|
|
5
|
+
Memories in DSH often live across dozens of workspaces and thousands of sessions. Search returns a list, but not **why** those memories relate; switch projects and the thread disappears. Memory Nebula reads the same stores (meow-memory / OpenViking) and builds a graph: nodes are memories, edges are shared keywords, entities, projects, session co-activation and manual curation. It never copies or rewrites your stores. Everything is computed locally.
|
|
6
|
+
|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
## Three ways to look
|
|
10
|
+
|
|
11
|
+
- **Nebula**: every memory in one cloud, clustered by workspace and coloured by level and link strength. Good for “what does my memory look like as a whole?”
|
|
12
|
+
- **Galaxy**: grouped by workspace; open a cluster to enter that project. Good for “what have I thought about here?”
|
|
13
|
+
- **Time**: memories arranged as a river by creation/update time, with a scrubber. Good for “how did this grow?”
|
|
14
|
+
|
|
15
|
+
All three share the same filters: workspace, level, edge type, minimum strength and importance. Switching views keeps the selection.
|
|
16
|
+
|
|
17
|
+
## From one memory to another
|
|
18
|
+
|
|
19
|
+
Select a node and the right panel shows what it connects to and why: same project, shared keywords, same entity, repeatedly co-mentioned in sessions, or a link you made yourself. Every neighbour carries a weight and a reason, not an evidence-free “similarity 0.87”.
|
|
20
|
+
|
|
21
|
+
Shift-click a second node to find an **evidence chain**: every hop, its reason and the chain strength. If there is no path, it says so instead of inventing one.
|
|
22
|
+
|
|
23
|
+

|
|
24
|
+
|
|
25
|
+
## Search and spread
|
|
26
|
+
|
|
27
|
+
Search covers titles, bodies and keywords. Results mark direct hits versus nodes reached by spreading, and cross-workspace hits are called out so nothing hides behind the current filter.
|
|
28
|
+
|
|
29
|
+
“Spread from here” is not a second search box: it starts at this memory and walks existing links up to two hops, answering “what else is attached to this?”
|
|
30
|
+
|
|
31
|
+
## Hygiene, including the ugly parts
|
|
32
|
+
|
|
33
|
+
Six read-only checks:
|
|
34
|
+
|
|
35
|
+
- near-duplicate memories;
|
|
36
|
+
- oversized memories;
|
|
37
|
+
- stale memories that have not changed in a long time;
|
|
38
|
+
- memories stored but never read;
|
|
39
|
+
- many edges but no strong relation (keyword noise);
|
|
40
|
+
- completely isolated memories.
|
|
41
|
+
|
|
42
|
+
Diagnosis only. It never merges, deletes or rewires anything; that stays your call.
|
|
43
|
+
|
|
44
|
+
## Demo galaxy and first-visit guide
|
|
45
|
+
|
|
46
|
+
An empty store no longer means a black screen: open the **demo galaxy**, 64 fictional memories that are read-only and never touch your stores. First time in a real store, a three-step guide helps you search a word, open one memory and see its evidence, then Shift-click two nodes to see how they connect. Skip it anytime; press `?` to replay.
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
## Share a slice, not the whole store
|
|
51
|
+
|
|
52
|
+
Export the whole map, the current workspace, or “two hops around this memory” as a **single-file HTML**:
|
|
53
|
+
|
|
54
|
+
- double-click to open, no DSH and no network;
|
|
55
|
+
- search, neighbours and evidence chains run locally;
|
|
56
|
+
- read-only, cannot touch your stores;
|
|
57
|
+
- optionally hide the Diary workspace before export; `scope`/`hide` affect the export only;
|
|
58
|
+
- the file is a point-in-time copy **including the text** — check the scope before sending it.
|
|
59
|
+
|
|
60
|
+

|
|
61
|
+
|
|
62
|
+
## Ten thousand memories, still opens
|
|
63
|
+
|
|
64
|
+
Same-machine benchmark with 10,000 memories and 78,593 links:
|
|
65
|
+
|
|
66
|
+
- graph build 1.2 s;
|
|
67
|
+
- first paint about 0.6 s;
|
|
68
|
+
- recall 4.9 ms;
|
|
69
|
+
- single-file snapshot 122 ms / 21 MB;
|
|
70
|
+
- heap 145 MB.
|
|
71
|
+
|
|
72
|
+
Above 3,000 memories it stays in the 2D nebula and asks you to filter before switching to 3D: software rendering would choke, and the map does not pretend otherwise.
|
|
73
|
+
|
|
74
|
+

|
|
75
|
+
|
|
76
|
+
## Install
|
|
77
|
+
|
|
78
|
+
Add this index in the DSH plugin market:
|
|
79
|
+
|
|
80
|
+
```text
|
|
81
|
+
https://unpkg.com/dsh-memory-nebula@1.1.2/market/index.json
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Then search for “Memory Nebula” and install. Or install the npm package directly:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
npm install dsh-memory-nebula@1.1.2
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Run the read-only doctor after installing:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
npx memory-nebula-doctor --profile <your DSH profile directory>
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
It checks the Node version, package files, profile dependency, bundle declaration, memory sources and an optional `/ping` endpoint. Nothing is uploaded.
|
|
97
|
+
|
|
98
|
+
## Boundaries
|
|
99
|
+
|
|
100
|
+
- single-user, local tool: no accounts, do not expose it to the public internet;
|
|
101
|
+
- the stores are read-only: the map never edits memories for you;
|
|
102
|
+
- 3D needs WebGL2;
|
|
103
|
+
- snapshots contain the text inside the selected scope; treat them as plain-text backups;
|
|
104
|
+
- server-side diagnostics and logs are mostly Chinese; the UI is bilingual.
|
|
105
|
+
|
|
106
|
+
## More
|
|
107
|
+
|
|
108
|
+
- architecture, data model, HTTP API, compatibility and distribution docs ship in `docs/`
|
|
109
|
+
- License: MIT
|