dsh-memory-engine 0.5.1 → 0.5.3

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  DSH 插件的本地记忆引擎,带神经网络可视化。它让 agent 保存、召回和管理跨会话记忆,也能把你已有的记忆文件导进来。
4
4
 
5
- 当前版本:0.5.1。Node ≥22,零新增依赖;DSH 宿主提供 `@deepseek-ai/dsh-tools@0.2.1-rc.3`。本机安装已启用,无需重复安装。
5
+ 当前版本:0.5.2。Node ≥22,零新增依赖;DSH 宿主提供 `@deepseek-ai/dsh-tools@0.2.1-rc.3`。本机安装已启用,无需重复安装。
6
6
 
7
7
  ## 界面
8
8
 
@@ -22,6 +22,35 @@ memory_map(out="D:\\memory-map.html")
22
22
 
23
23
  默认输出 `{DSH_HOME}/memory-engine/starmap.html`;未设置 DSH_HOME 时为 `~/.dsh/memory-engine/starmap.html`。`open` 默认 false,显式 true 才启动系统默认浏览器。
24
24
 
25
+ ## 装完是空库(重要)
26
+
27
+ 插件**不会自动读取任何东西**。装完那一刻记忆库是空的,图谱里一个神经元都没有。
28
+
29
+ 它只会读写自己的目录:
30
+
31
+ ```text
32
+ {DSH_HOME}/memory-engine/
33
+ memories.json 记忆库
34
+ config.json 配置(可选)
35
+ starmap.html 生成的图
36
+ ```
37
+
38
+ 不会扫描硬盘、不会猜路径、不会去读你的聊天记录或其他机器人的数据。`DEFAULT_BRIDGE_ROOT`、`DEFAULT_DIARY_DIR` 默认都是空字符串——不配置就完全不读。
39
+
40
+ 记忆只有三个来源:
41
+
42
+ 1. **机器人自己存**:agent 调用 `memory_save`。DSH 里聊几句就有了。
43
+ 2. **你手动导入**:`memory_import(source="json"|"markdown"|"text", path="...")`,见下一节。
44
+ 3. **QQ 桥接同步**:只有配置了 `bridgeRoot` 的私有适配器才走这条,普通用户用不到。
45
+
46
+ 所以新用户装完的方向是:
47
+
48
+ ```text
49
+ 装完 → 空图 → 机器人边聊边存 → 几天后点开,图里是它自己的记忆
50
+ ```
51
+
52
+ 旧的历史数据不会自己进来,需要按下一节导入。
53
+
25
54
  ## 保存和召回
26
55
 
27
56
  让 agent 使用:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-memory-engine",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "description": "Local DSH memory engine with neuron network visualization and private file import",
5
5
  "keywords": [
6
6
  "dsh",
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { pathToFileURL } from 'node:url';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { realpathSync } from 'node:fs';
3
4
  import path from 'node:path';
4
5
  import { MemoryStore } from '../lib/store.js';
5
6
  import { generateMap, mapReport, openMap } from '../lib/map.js';
@@ -25,4 +26,21 @@ export async function main(args = process.argv.slice(2)) {
25
26
  return 1;
26
27
  }
27
28
  }
28
- if (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) process.exitCode = await main();
29
+
30
+ // 入口判定:必须比较「真实路径」。
31
+ // pnpm 把包装在 node_modules/.pnpm 下,再用符号链接指过去;
32
+ // import.meta.url 是解析链接后的真实路径,而 process.argv[1] 是链接路径,
33
+ // 直接比较会不相等 → main() 不执行 → 静默失败(退出码 0、无输出、不生成文件)。
34
+ function isEntryPoint() {
35
+ const argv1 = process.argv[1];
36
+ if (!argv1) return false;
37
+ const self = fileURLToPath(import.meta.url);
38
+ try {
39
+ return path.resolve(realpathSync(argv1)) === path.resolve(realpathSync(self));
40
+ } catch {
41
+ // 任何一方解析失败(文件已删等)就退回到字面比较
42
+ return path.resolve(argv1) === path.resolve(self);
43
+ }
44
+ }
45
+
46
+ if (isEntryPoint()) process.exitCode = await main();