memory-eternal 0.15.0 → 0.16.0
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/.claude-plugin/plugin.json +27 -20
- package/.codex-plugin/plugin.json +24 -24
- package/.cursor-plugin/plugin.json +14 -14
- package/README.en.md +45 -43
- package/README.md +46 -44
- package/cursor-extension/package.json +54 -54
- package/dsh-tui-plugin/README.md +63 -3
- package/dsh-tui-plugin/demo.mjs +113 -25
- package/dsh-tui-plugin/dsh-plugin.json +42 -42
- package/dsh-tui-plugin/main.js +65 -31
- package/dsh-tui-plugin/package.json +51 -31
- package/dsh-tui-plugin/scene.js +125 -16
- package/index.js +3 -1
- package/lib/api.js +80 -14
- package/lib/capture.js +25 -2
- package/lib/client.js +116 -20
- package/lib/setup.js +67 -5
- package/orca-plugin/orca-plugin.json +36 -36
- package/package.json +145 -142
- package/web/app.js +121 -25
- package/web/index.html +14 -0
package/lib/setup.js
CHANGED
|
@@ -19,6 +19,39 @@ export const PACKAGE_ROOT = path.join(__dirname, '..')
|
|
|
19
19
|
export const BIN_PATH = path.join(PACKAGE_ROOT, 'bin', 'dsh-memory.mjs')
|
|
20
20
|
|
|
21
21
|
const home = os.homedir()
|
|
22
|
+
const appdataDir = process.env.APPDATA || path.join(home, 'AppData', 'Roaming')
|
|
23
|
+
|
|
24
|
+
/** 从 MCP 客户端 JSON 配置里列出 server 名(兼容 mcpServers 与 VS Code 的 servers 两种键名)。 */
|
|
25
|
+
function listMcpServers(cfg, keys = ['mcpServers', 'servers']) {
|
|
26
|
+
if (!cfg || typeof cfg !== 'object') return []
|
|
27
|
+
for (const k of keys) {
|
|
28
|
+
const v = cfg[k]
|
|
29
|
+
if (v && typeof v === 'object' && !Array.isArray(v)) return Object.keys(v)
|
|
30
|
+
}
|
|
31
|
+
return []
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** 从 codex config.toml 里列出所有 [mcp_servers.<name>] 的 name(跳过 .env 这类二级段)。 */
|
|
35
|
+
function listCodexMcpServers(text) {
|
|
36
|
+
const names = []
|
|
37
|
+
for (const m of String(text || '').matchAll(/^\s*\[mcp_servers\.([A-Za-z0-9_-]+)\]\s*$/gm)) names.push(m[1])
|
|
38
|
+
return [...new Set(names)]
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 只读兼容性探测清单:除可一键挂载的 claude-code / codex / cursor 之外,
|
|
43
|
+
* 自动识别本机常见的 MCP 客户端(存在配置文件才列出),并列出它们已配置的 MCP server。
|
|
44
|
+
* detectedOnly = 只展示,不提供安装/卸载按钮(不改不认识的配置格式)。
|
|
45
|
+
*/
|
|
46
|
+
const DETECT_ONLY_CLIENTS = [
|
|
47
|
+
{ name: 'gemini-cli', label: 'Gemini CLI', paths: () => [path.join(home, '.gemini', 'settings.json')] },
|
|
48
|
+
{ name: 'windsurf', label: 'Windsurf', paths: () => [path.join(home, '.codeium', 'windsurf', 'mcp_config.json')] },
|
|
49
|
+
{ name: 'cline', label: 'Cline', paths: () => [
|
|
50
|
+
path.join(appdataDir, 'Code', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'),
|
|
51
|
+
path.join(appdataDir, 'Cursor', 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json'),
|
|
52
|
+
] },
|
|
53
|
+
{ name: 'vscode', label: 'VS Code', paths: () => [path.join(appdataDir, 'Code', 'User', 'mcp.json')], keys: ['servers'] },
|
|
54
|
+
]
|
|
22
55
|
|
|
23
56
|
async function exists(p) {
|
|
24
57
|
try { await fs.access(p); return true } catch { return false }
|
|
@@ -350,7 +383,7 @@ export async function getSetupStatus({ nodePath = process.execPath } = {}) {
|
|
|
350
383
|
// claude-code
|
|
351
384
|
const claudeJson = path.join(home, '.claude.json')
|
|
352
385
|
if (!(await exists(claudeJson))) {
|
|
353
|
-
agents.push({ name: 'claude-code', installed: false, mcpConfigured: false, hook: 'unknown' })
|
|
386
|
+
agents.push({ name: 'claude-code', label: 'Claude Code', compat: 'managed', installed: false, mcpConfigured: false, hook: 'unknown', servers: [] })
|
|
354
387
|
} else {
|
|
355
388
|
let cfg = null
|
|
356
389
|
try { cfg = JSON.parse(await fs.readFile(claudeJson, 'utf8')) } catch {}
|
|
@@ -358,6 +391,9 @@ export async function getSetupStatus({ nodePath = process.execPath } = {}) {
|
|
|
358
391
|
const mcpExists = !!entry
|
|
359
392
|
agents.push({
|
|
360
393
|
name: 'claude-code',
|
|
394
|
+
label: 'Claude Code',
|
|
395
|
+
compat: 'managed',
|
|
396
|
+
servers: listMcpServers(cfg),
|
|
361
397
|
installed: true,
|
|
362
398
|
mcpConfigured: mcpExists,
|
|
363
399
|
mcpMatchesCurrentNode: mcpExists && sameMcpEntry(entry, want),
|
|
@@ -381,7 +417,7 @@ export async function getSetupStatus({ nodePath = process.execPath } = {}) {
|
|
|
381
417
|
// codex
|
|
382
418
|
const codexToml = path.join(home, '.codex', 'config.toml')
|
|
383
419
|
if (!(await exists(codexToml))) {
|
|
384
|
-
agents.push({ name: 'codex', installed: false, mcpConfigured: false })
|
|
420
|
+
agents.push({ name: 'codex', label: 'Codex CLI / Desktop', compat: 'managed', installed: false, mcpConfigured: false, servers: [] })
|
|
385
421
|
} else {
|
|
386
422
|
const text = await fs.readFile(codexToml, 'utf8')
|
|
387
423
|
const has = /^\[mcp_servers\.memory\]$/m.test(text)
|
|
@@ -392,6 +428,9 @@ export async function getSetupStatus({ nodePath = process.execPath } = {}) {
|
|
|
392
428
|
if (has) configuredNodePath = parseCodexMemoryEntry(text).command
|
|
393
429
|
agents.push({
|
|
394
430
|
name: 'codex',
|
|
431
|
+
label: 'Codex CLI / Desktop',
|
|
432
|
+
compat: 'managed',
|
|
433
|
+
servers: listCodexMcpServers(text),
|
|
395
434
|
installed: true,
|
|
396
435
|
mcpConfigured: has,
|
|
397
436
|
mcpMatchesCurrentNode: has && configuredNodePath === nodePath,
|
|
@@ -405,9 +444,9 @@ export async function getSetupStatus({ nodePath = process.execPath } = {}) {
|
|
|
405
444
|
const cursorJson = path.join(home, '.cursor', 'mcp.json')
|
|
406
445
|
const cursorDir = path.join(home, '.cursor')
|
|
407
446
|
if (!(await exists(cursorDir))) {
|
|
408
|
-
agents.push({ name: 'cursor', installed: false, mcpConfigured: false, reason: '~/.cursor 不存在' })
|
|
447
|
+
agents.push({ name: 'cursor', label: 'Cursor', compat: 'managed', installed: false, mcpConfigured: false, servers: [], reason: '~/.cursor 不存在' })
|
|
409
448
|
} else if (!(await exists(cursorJson))) {
|
|
410
|
-
agents.push({ name: 'cursor', installed: true, mcpConfigured: false, mcpPath: cursorJson })
|
|
449
|
+
agents.push({ name: 'cursor', label: 'Cursor', compat: 'managed', installed: true, mcpConfigured: false, servers: [], mcpPath: cursorJson })
|
|
411
450
|
} else {
|
|
412
451
|
try {
|
|
413
452
|
const cfg = JSON.parse(await fs.readFile(cursorJson, 'utf8'))
|
|
@@ -415,6 +454,9 @@ export async function getSetupStatus({ nodePath = process.execPath } = {}) {
|
|
|
415
454
|
const mcpExists = !!entry
|
|
416
455
|
agents.push({
|
|
417
456
|
name: 'cursor',
|
|
457
|
+
label: 'Cursor',
|
|
458
|
+
compat: 'managed',
|
|
459
|
+
servers: listMcpServers(cfg),
|
|
418
460
|
installed: true,
|
|
419
461
|
mcpConfigured: mcpExists,
|
|
420
462
|
mcpMatchesCurrentNode: mcpExists && sameMcpEntry(entry, want),
|
|
@@ -425,7 +467,27 @@ export async function getSetupStatus({ nodePath = process.execPath } = {}) {
|
|
|
425
467
|
})
|
|
426
468
|
} catch { agents.push({ name: 'cursor', installed: true, mcpConfigured: false, mcpPath: cursorJson, reason: 'JSON 解析失败' }) }
|
|
427
469
|
}
|
|
428
|
-
|
|
470
|
+
// 兼容性探测:只列出「本机确实存在配置文件」的其它 MCP 客户端(只读,不提供挂载按钮)
|
|
471
|
+
for (const spec of DETECT_ONLY_CLIENTS) {
|
|
472
|
+
let mcpPath = ''
|
|
473
|
+
for (const p of spec.paths()) { if (await exists(p)) { mcpPath = p; break } }
|
|
474
|
+
if (!mcpPath) continue
|
|
475
|
+
let servers = []
|
|
476
|
+
let reason = ''
|
|
477
|
+
try { servers = listMcpServers(JSON.parse(await fs.readFile(mcpPath, 'utf8')), spec.keys) } catch { reason = 'JSON 解析失败' }
|
|
478
|
+
agents.push({
|
|
479
|
+
name: spec.name, label: spec.label, installed: true, detectedOnly: true, compat: 'detected',
|
|
480
|
+
mcpConfigured: servers.includes('memory'), servers, mcpPath, reason,
|
|
481
|
+
})
|
|
482
|
+
}
|
|
483
|
+
const allServers = [...new Set(agents.flatMap((a) => a.servers || []))]
|
|
484
|
+
const summary = {
|
|
485
|
+
detectedAgents: agents.filter((a) => a.installed).length,
|
|
486
|
+
mountedAgents: agents.filter((a) => a.mcpConfigured).length,
|
|
487
|
+
totalServers: allServers.length,
|
|
488
|
+
allServers,
|
|
489
|
+
}
|
|
490
|
+
return { ok: true, agents, summary, lastCheckedAt: Date.now(), want: { command: nodePath, args: want.args } }
|
|
429
491
|
}
|
|
430
492
|
|
|
431
493
|
// -- 会话结束自动沉淀 hook(connect <agent>,agentmemory 的 `connect --with-hooks` 兜底路径)--
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
{
|
|
2
|
-
"manifestVersion": 1,
|
|
3
|
-
"id": "memory-eternal",
|
|
4
|
-
"publisher": "eternalnight996",
|
|
5
|
-
"name": "memory-eternal",
|
|
6
|
-
"version": "0.
|
|
7
|
-
"description": "Memory Atlas for Orca: open the local memory vault, pending review and knowledge graph from a sandboxed Orca panel.",
|
|
8
|
-
"author": {
|
|
9
|
-
"name": "EternalNight996",
|
|
10
|
-
"url": "https://github.com/EternalNight996"
|
|
11
|
-
},
|
|
12
|
-
"repository": "https://github.com/EternalNight996/memory-eternal",
|
|
13
|
-
"icon": "assets/icon.png",
|
|
14
|
-
"engines": {
|
|
15
|
-
"orca": ">=1.4.0"
|
|
16
|
-
},
|
|
17
|
-
"pluginApi": 1,
|
|
18
|
-
"contributes": {
|
|
19
|
-
"panels": [
|
|
20
|
-
{
|
|
21
|
-
"id": "memory",
|
|
22
|
-
"title": "记忆",
|
|
23
|
-
"icon": "brain",
|
|
24
|
-
"entry": "panel.html"
|
|
25
|
-
}
|
|
26
|
-
]
|
|
27
|
-
},
|
|
28
|
-
"capabilities": [
|
|
29
|
-
{
|
|
30
|
-
"kind": "workspace:read"
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"kind": "terminal:send"
|
|
34
|
-
}
|
|
35
|
-
]
|
|
36
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"manifestVersion": 1,
|
|
3
|
+
"id": "memory-eternal",
|
|
4
|
+
"publisher": "eternalnight996",
|
|
5
|
+
"name": "memory-eternal",
|
|
6
|
+
"version": "0.16.0",
|
|
7
|
+
"description": "Memory Atlas for Orca: open the local memory vault, pending review and knowledge graph from a sandboxed Orca panel.",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "EternalNight996",
|
|
10
|
+
"url": "https://github.com/EternalNight996"
|
|
11
|
+
},
|
|
12
|
+
"repository": "https://github.com/EternalNight996/memory-eternal",
|
|
13
|
+
"icon": "assets/icon.png",
|
|
14
|
+
"engines": {
|
|
15
|
+
"orca": ">=1.4.0"
|
|
16
|
+
},
|
|
17
|
+
"pluginApi": 1,
|
|
18
|
+
"contributes": {
|
|
19
|
+
"panels": [
|
|
20
|
+
{
|
|
21
|
+
"id": "memory",
|
|
22
|
+
"title": "记忆",
|
|
23
|
+
"icon": "brain",
|
|
24
|
+
"entry": "panel.html"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
"capabilities": [
|
|
29
|
+
{
|
|
30
|
+
"kind": "workspace:read"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"kind": "terminal:send"
|
|
34
|
+
}
|
|
35
|
+
]
|
|
36
|
+
}
|
package/package.json
CHANGED
|
@@ -1,142 +1,145 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "memory-eternal",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "记忆核心(Memory Eternal):自研的 DeepSeek Harness 记忆插件,不移植任何既有记忆框架——对话结束后自动沉淀知识卡到本地 Markdown Vault(自研去重、自研 CJK 检索、可 git 管理),设置页提供图形化知识库(统计 / 搜索 / 知识图谱 + 侧边栏一键弹窗),Agent 通过 memory_recall 工具按需召回历史上下文。零人工干预。",
|
|
5
|
-
"icon": "assets/icon.png",
|
|
6
|
-
"license": "MIT",
|
|
7
|
-
"repository": {
|
|
8
|
-
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/EternalNight996/memory-eternal.git"
|
|
10
|
-
},
|
|
11
|
-
"homepage": "https://github.com/EternalNight996/memory-eternal",
|
|
12
|
-
"author": "EternalNight996",
|
|
13
|
-
"publishConfig": {
|
|
14
|
-
"registry": "https://registry.npmjs.org/"
|
|
15
|
-
},
|
|
16
|
-
"type": "module",
|
|
17
|
-
"main": "index.js",
|
|
18
|
-
"bin": {
|
|
19
|
-
"dsh-memory": "bin/dsh-memory.mjs"
|
|
20
|
-
},
|
|
21
|
-
"exports": {
|
|
22
|
-
".": "./index.js",
|
|
23
|
-
"./client": "./lib/client.js",
|
|
24
|
-
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
25
|
-
"./package.json": "./package.json"
|
|
26
|
-
},
|
|
27
|
-
"files": [
|
|
28
|
-
"index.js",
|
|
29
|
-
"lib",
|
|
30
|
-
"bin",
|
|
31
|
-
"scripts",
|
|
32
|
-
"examples",
|
|
33
|
-
"web",
|
|
34
|
-
"hooks",
|
|
35
|
-
"skills",
|
|
36
|
-
"assets/icon.png",
|
|
37
|
-
"orca-plugin",
|
|
38
|
-
"dsh-tui-plugin",
|
|
39
|
-
"cursor-extension",
|
|
40
|
-
".claude-plugin",
|
|
41
|
-
".codex-plugin",
|
|
42
|
-
".cursor-plugin",
|
|
43
|
-
".mcp.json",
|
|
44
|
-
"cordis.patch.yml",
|
|
45
|
-
"README.md",
|
|
46
|
-
"README.en.md",
|
|
47
|
-
"LICENSE"
|
|
48
|
-
],
|
|
49
|
-
"engines": {
|
|
50
|
-
"node": ">=22",
|
|
51
|
-
"dsh": ">=0.1.5-alpha.2 <0.3.0-0"
|
|
52
|
-
},
|
|
53
|
-
"keywords": [
|
|
54
|
-
"deepseek-harness",
|
|
55
|
-
"dsh",
|
|
56
|
-
"dsh-plugin",
|
|
57
|
-
"plugin",
|
|
58
|
-
"memory",
|
|
59
|
-
"knowledge-base",
|
|
60
|
-
"vault",
|
|
61
|
-
"markdown",
|
|
62
|
-
"knowledge-graph",
|
|
63
|
-
"rag",
|
|
64
|
-
"second-brain"
|
|
65
|
-
],
|
|
66
|
-
"scripts": {
|
|
67
|
-
"build": "node build.mjs",
|
|
68
|
-
"build:client": "node build.mjs",
|
|
69
|
-
"prepublishOnly": "node build.mjs",
|
|
70
|
-
"release": "node scripts/release.mjs",
|
|
71
|
-
"release:dry": "node scripts/release.mjs --dry-run",
|
|
72
|
-
"panel-check": "node scripts/panel-check.mjs",
|
|
73
|
-
"test": "node build.mjs && node tests/vault.test.mjs && node tests/capture.test.mjs && node tests/capture-route.test.mjs && node tests/stall.test.mjs && node tests/vault-path.test.mjs && node tests/vault-resolve.test.mjs && node tests/minhash.test.mjs && node tests/settings-save.test.mjs && node tests/config-coverage.test.mjs && node tests/config-sync.test.mjs && node tests/config-merge.test.mjs && node tests/sse.test.mjs && node tests/api.test.mjs && node tests/import-roundtrip.test.mjs && node tests/graph-perf.test.mjs && node tests/settings-compat.test.mjs && node tests/node-bin.test.mjs && node tests/watchdog-lock.test.mjs && node tests/markdown.test.mjs && node tests/feedback.test.mjs && node tests/graph-lod.test.mjs && node tests/ssr.test.mjs && node tests/web-assets.test.mjs && node tests/manifests.test.mjs && node tests/two-store.test.mjs && node tests/noise-gate.test.mjs && node tests/e2e-recall.test.mjs && node tests/issue-fixes.test.mjs && node tests/issue-fixes-2.test.mjs && node tests/issue-fixes-3.test.mjs && node tests/watchdog-orphans.test.mjs && node tests/watchdog-restart.test.mjs && node tests/readme-i18n.test.mjs && node tests/issue-fixes-4.test.mjs && node tests/host-drain.test.mjs && node tests/e2e-host-drain.mjs && node tests/issue-fixes-5.test.mjs && node tests/issue-fixes-6.test.mjs && node tests/capture-json-repair.test.mjs && node tests/csrf-origin.test.mjs && node tests/watchdog-orphan-web.test.mjs && node tests/config-validate.test.mjs && node tests/issue-fixes-8.test.mjs && node tests/issue-fixes-9.test.mjs && node tests/release-verify.test.mjs && node tests/refine.test.mjs && node tests/db-restore.test.mjs && node tests/align.test.mjs && node tests/tags-normalize.test.mjs && node tests/resident-state.test.mjs && node tests/llm-route.test.mjs && node tests/host-managed.test.mjs && node tests/replace-claim.test.mjs && node tests/version-check-self.test.mjs && node tests/setup-codex.test.mjs && node tests/listener-netstat.test.mjs && node tests/issue-46-overlay.test.mjs && node tests/graph-initial-zoom.test.mjs && node tests/card-head-actions.test.mjs && node tests/card-reader-ux.test.mjs && node tests/tag-filter.test.mjs && node tests/ui-overflow.test.mjs && node tests/version-card-state.test.mjs && node tests/llm-routes-proxy.test.mjs && node tests/model-strikes.test.mjs && node tests/support-bundle.test.mjs && node tests/health-panel.test.mjs && node tests/issue-48-timeout.test.mjs"
|
|
74
|
-
},
|
|
75
|
-
"dependencies": {
|
|
76
|
-
"@deepseek-ai/schemastery": "^3.18.1"
|
|
77
|
-
},
|
|
78
|
-
"peerDependencies": {
|
|
79
|
-
"@deepseek-ai/cordis": "^4.0.1",
|
|
80
|
-
"@deepseek-ai/dsh-llm": ">=0.1.0-rc.2 <0.3.0-0",
|
|
81
|
-
"@deepseek-ai/dsh-tools": ">=0.1.0-rc.2 <0.3.0-0"
|
|
82
|
-
},
|
|
83
|
-
"devDependencies": {
|
|
84
|
-
"@types/react": "^18.3.1",
|
|
85
|
-
"esbuild": "^0.24.0",
|
|
86
|
-
"react": "18.3.1",
|
|
87
|
-
"react-dom": "18.3.1"
|
|
88
|
-
},
|
|
89
|
-
"dsh": {
|
|
90
|
-
"client": {
|
|
91
|
-
"platform": "web",
|
|
92
|
-
"inject": [
|
|
93
|
-
"@deepseek-ai/dsh-client-ui-settings",
|
|
94
|
-
"@deepseek-ai/dsh-client-locale"
|
|
95
|
-
]
|
|
96
|
-
},
|
|
97
|
-
"bundle": {
|
|
98
|
-
"patch": "./cordis.patch.yml"
|
|
99
|
-
},
|
|
100
|
-
"marketplace": {
|
|
101
|
-
"profiles": [
|
|
102
|
-
"web",
|
|
103
|
-
"desktop"
|
|
104
|
-
],
|
|
105
|
-
"requiresBuildApproval": false,
|
|
106
|
-
"requiresRestart": true,
|
|
107
|
-
"manualSteps": false
|
|
108
|
-
},
|
|
109
|
-
"permissions": {
|
|
110
|
-
"level": "medium",
|
|
111
|
-
"files": "read-write",
|
|
112
|
-
"network": "none",
|
|
113
|
-
"commands": "node",
|
|
114
|
-
"credentials": [],
|
|
115
|
-
"externalServices": [],
|
|
116
|
-
"notes": "Read/write under ~/.dsh/memory-vault only (plugin-private Markdown vault). No outbound network, no credentials, no shell. Hooks/MCP run via the `node` binary that hosts the DSH process."
|
|
117
|
-
},
|
|
118
|
-
"lifecycle": {
|
|
119
|
-
"scripts": [
|
|
120
|
-
|
|
121
|
-
"
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
"
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
"0.1.
|
|
133
|
-
"0.
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "memory-eternal",
|
|
3
|
+
"version": "0.16.0",
|
|
4
|
+
"description": "记忆核心(Memory Eternal):自研的 DeepSeek Harness 记忆插件,不移植任何既有记忆框架——对话结束后自动沉淀知识卡到本地 Markdown Vault(自研去重、自研 CJK 检索、可 git 管理),设置页提供图形化知识库(统计 / 搜索 / 知识图谱 + 侧边栏一键弹窗),Agent 通过 memory_recall 工具按需召回历史上下文。零人工干预。",
|
|
5
|
+
"icon": "assets/icon.png",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/EternalNight996/memory-eternal.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/EternalNight996/memory-eternal",
|
|
12
|
+
"author": "EternalNight996",
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"registry": "https://registry.npmjs.org/"
|
|
15
|
+
},
|
|
16
|
+
"type": "module",
|
|
17
|
+
"main": "index.js",
|
|
18
|
+
"bin": {
|
|
19
|
+
"dsh-memory": "bin/dsh-memory.mjs"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": "./index.js",
|
|
23
|
+
"./client": "./lib/client.js",
|
|
24
|
+
"./cordis.patch.yml": "./cordis.patch.yml",
|
|
25
|
+
"./package.json": "./package.json"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"index.js",
|
|
29
|
+
"lib",
|
|
30
|
+
"bin",
|
|
31
|
+
"scripts",
|
|
32
|
+
"examples",
|
|
33
|
+
"web",
|
|
34
|
+
"hooks",
|
|
35
|
+
"skills",
|
|
36
|
+
"assets/icon.png",
|
|
37
|
+
"orca-plugin",
|
|
38
|
+
"dsh-tui-plugin",
|
|
39
|
+
"cursor-extension",
|
|
40
|
+
".claude-plugin",
|
|
41
|
+
".codex-plugin",
|
|
42
|
+
".cursor-plugin",
|
|
43
|
+
".mcp.json",
|
|
44
|
+
"cordis.patch.yml",
|
|
45
|
+
"README.md",
|
|
46
|
+
"README.en.md",
|
|
47
|
+
"LICENSE"
|
|
48
|
+
],
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=22",
|
|
51
|
+
"dsh": ">=0.1.5-alpha.2 <0.3.0-0"
|
|
52
|
+
},
|
|
53
|
+
"keywords": [
|
|
54
|
+
"deepseek-harness",
|
|
55
|
+
"dsh",
|
|
56
|
+
"dsh-plugin",
|
|
57
|
+
"plugin",
|
|
58
|
+
"memory",
|
|
59
|
+
"knowledge-base",
|
|
60
|
+
"vault",
|
|
61
|
+
"markdown",
|
|
62
|
+
"knowledge-graph",
|
|
63
|
+
"rag",
|
|
64
|
+
"second-brain"
|
|
65
|
+
],
|
|
66
|
+
"scripts": {
|
|
67
|
+
"build": "node build.mjs",
|
|
68
|
+
"build:client": "node build.mjs",
|
|
69
|
+
"prepublishOnly": "node build.mjs",
|
|
70
|
+
"release": "node scripts/release.mjs",
|
|
71
|
+
"release:dry": "node scripts/release.mjs --dry-run",
|
|
72
|
+
"panel-check": "node scripts/panel-check.mjs",
|
|
73
|
+
"test": "node build.mjs && node tests/vault.test.mjs && node tests/capture.test.mjs && node tests/capture-route.test.mjs && node tests/stall.test.mjs && node tests/vault-path.test.mjs && node tests/vault-resolve.test.mjs && node tests/minhash.test.mjs && node tests/settings-save.test.mjs && node tests/config-coverage.test.mjs && node tests/config-sync.test.mjs && node tests/config-merge.test.mjs && node tests/sse.test.mjs && node tests/api.test.mjs && node tests/import-roundtrip.test.mjs && node tests/graph-perf.test.mjs && node tests/settings-compat.test.mjs && node tests/node-bin.test.mjs && node tests/watchdog-lock.test.mjs && node tests/markdown.test.mjs && node tests/feedback.test.mjs && node tests/graph-lod.test.mjs && node tests/graph-warmup.test.mjs && node tests/loading-hints.test.mjs && node tests/web-entry.test.mjs && node tests/tui-scroll.test.mjs && node tests/tui-audit-scene.test.mjs && node tests/tui-plugin-boot.test.mjs && node tests/capture-session-id.test.mjs && node tests/ssr.test.mjs && node tests/window-controls.test.mjs && node tests/web-assets.test.mjs && node tests/manifests.test.mjs && node tests/two-store.test.mjs && node tests/noise-gate.test.mjs && node tests/e2e-recall.test.mjs && node tests/issue-fixes.test.mjs && node tests/issue-fixes-2.test.mjs && node tests/issue-fixes-3.test.mjs && node tests/watchdog-orphans.test.mjs && node tests/watchdog-restart.test.mjs && node tests/readme-i18n.test.mjs && node tests/issue-fixes-4.test.mjs && node tests/host-drain.test.mjs && node tests/e2e-host-drain.mjs && node tests/issue-fixes-5.test.mjs && node tests/issue-fixes-6.test.mjs && node tests/capture-json-repair.test.mjs && node tests/csrf-origin.test.mjs && node tests/watchdog-orphan-web.test.mjs && node tests/config-validate.test.mjs && node tests/issue-fixes-8.test.mjs && node tests/issue-fixes-9.test.mjs && node tests/release-verify.test.mjs && node tests/refine.test.mjs && node tests/db-restore.test.mjs && node tests/align.test.mjs && node tests/tags-normalize.test.mjs && node tests/resident-state.test.mjs && node tests/llm-route.test.mjs && node tests/host-managed.test.mjs && node tests/replace-claim.test.mjs && node tests/version-check-self.test.mjs && node tests/setup-codex.test.mjs && node tests/listener-netstat.test.mjs && node tests/issue-46-overlay.test.mjs && node tests/graph-initial-zoom.test.mjs && node tests/card-head-actions.test.mjs && node tests/card-reader-ux.test.mjs && node tests/tag-filter.test.mjs && node tests/ui-overflow.test.mjs && node tests/version-card-state.test.mjs && node tests/llm-routes-proxy.test.mjs && node tests/model-strikes.test.mjs && node tests/support-bundle.test.mjs && node tests/health-panel.test.mjs && node tests/issue-48-timeout.test.mjs"
|
|
74
|
+
},
|
|
75
|
+
"dependencies": {
|
|
76
|
+
"@deepseek-ai/schemastery": "^3.18.1"
|
|
77
|
+
},
|
|
78
|
+
"peerDependencies": {
|
|
79
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
80
|
+
"@deepseek-ai/dsh-llm": ">=0.1.0-rc.2 <0.3.0-0",
|
|
81
|
+
"@deepseek-ai/dsh-tools": ">=0.1.0-rc.2 <0.3.0-0"
|
|
82
|
+
},
|
|
83
|
+
"devDependencies": {
|
|
84
|
+
"@types/react": "^18.3.1",
|
|
85
|
+
"esbuild": "^0.24.0",
|
|
86
|
+
"react": "18.3.1",
|
|
87
|
+
"react-dom": "18.3.1"
|
|
88
|
+
},
|
|
89
|
+
"dsh": {
|
|
90
|
+
"client": {
|
|
91
|
+
"platform": "web",
|
|
92
|
+
"inject": [
|
|
93
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
94
|
+
"@deepseek-ai/dsh-client-locale"
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
"bundle": {
|
|
98
|
+
"patch": "./cordis.patch.yml"
|
|
99
|
+
},
|
|
100
|
+
"marketplace": {
|
|
101
|
+
"profiles": [
|
|
102
|
+
"web",
|
|
103
|
+
"desktop"
|
|
104
|
+
],
|
|
105
|
+
"requiresBuildApproval": false,
|
|
106
|
+
"requiresRestart": true,
|
|
107
|
+
"manualSteps": false
|
|
108
|
+
},
|
|
109
|
+
"permissions": {
|
|
110
|
+
"level": "medium",
|
|
111
|
+
"files": "read-write",
|
|
112
|
+
"network": "none",
|
|
113
|
+
"commands": "node",
|
|
114
|
+
"credentials": [],
|
|
115
|
+
"externalServices": [],
|
|
116
|
+
"notes": "Read/write under ~/.dsh/memory-vault only (plugin-private Markdown vault). No outbound network, no credentials, no shell. Hooks/MCP run via the `node` binary that hosts the DSH process."
|
|
117
|
+
},
|
|
118
|
+
"lifecycle": {
|
|
119
|
+
"scripts": [
|
|
120
|
+
"prepare",
|
|
121
|
+
"prepublishOnly"
|
|
122
|
+
],
|
|
123
|
+
"details": {
|
|
124
|
+
"prepare": "node build.mjs",
|
|
125
|
+
"prepublishOnly": "node build.mjs"
|
|
126
|
+
},
|
|
127
|
+
"notes": "Only `prepare` and `prepublishOnly` run `node build.mjs` (esbuild client bundling). No preinstall/install/postinstall hooks, no remote downloads, no native builds."
|
|
128
|
+
},
|
|
129
|
+
"compatibility": {
|
|
130
|
+
"dsh": ">=0.1.5-alpha.2 <0.3.0-0",
|
|
131
|
+
"dshReleases": {
|
|
132
|
+
"0.1.5-alpha.2": "compatible",
|
|
133
|
+
"0.1.5-rc.1": "compatible",
|
|
134
|
+
"0.1.5-rc.2": "compatible",
|
|
135
|
+
"0.1.7-rc.2": "compatible",
|
|
136
|
+
"0.2.0-rc.2": "compatible"
|
|
137
|
+
},
|
|
138
|
+
"node": ">=22",
|
|
139
|
+
"profiles": [
|
|
140
|
+
"web",
|
|
141
|
+
"desktop"
|
|
142
|
+
]
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|