memory-eternal 0.30.2 → 0.30.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/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/README.md +14 -1
- package/README.zh-CN.md +14 -1
- package/cursor-extension/package.json +1 -1
- package/dsh-tui-plugin/dsh-plugin.json +1 -1
- package/dsh-tui-plugin/package.json +1 -1
- package/index.js +36 -4
- package/lib/api.js +1 -0
- package/lib/client.js +1 -1
- package/lib/feedback.js +3 -0
- package/orca-plugin/orca-plugin.json +1 -1
- package/package.json +150 -150
- package/web/app.js +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
3
|
"name": "memory-eternal",
|
|
4
|
-
"version": "0.30.
|
|
4
|
+
"version": "0.30.3",
|
|
5
5
|
"description": "记忆核心(Memory Eternal):对话结束后自动沉淀知识卡到本地记忆库(~/.dsh/memory-vault),支持检索 / 召回 / 审核中心。",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "EternalNight996",
|
package/README.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
[](https://github.com/EternalNight996/memory-eternal/stargazers)
|
|
17
17
|
[](https://www.npmjs.com/package/memory-eternal)
|
|
18
|
-
[](https://github.com/EternalNight996/memory-eternal/releases)
|
|
19
19
|
[](LICENSE)
|
|
20
20
|
|
|
21
21
|
**English (default)** · [简体中文](README.zh-CN.md)
|
|
@@ -295,3 +295,16 @@ _Verses from 《蛊真人》(Reverend Insanity). Kept in the original Chinese
|
|
|
295
295
|
|
|
296
296
|
<p align="right"><sub>——《蛊真人》· 大爱仙尊</sub></p>
|
|
297
297
|
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 🌟 Contributors
|
|
301
|
+
|
|
302
|
+
Thanks to everyone who helped memory-eternal get better.
|
|
303
|
+
|
|
304
|
+
| Contributor | Contribution |
|
|
305
|
+
| --- | --- |
|
|
306
|
+
| [@aloneangel45](https://github.com/aloneangel45) | Found and fixed [#54](https://github.com/EternalNight996/memory-eternal/issues/54) — `memory_recall` / `memory_note` were never registered when the `tools` service mounted late ([#58](https://github.com/EternalNight996/memory-eternal/pull/58)) |
|
|
307
|
+
| [@EternalNight996](https://github.com/EternalNight996) | Author and maintainer |
|
|
308
|
+
|
|
309
|
+
Have a fix worth landing? Open an issue or a pull request — accepted contributions are listed here.
|
|
310
|
+
|
package/README.zh-CN.md
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
[](https://github.com/EternalNight996/memory-eternal/stargazers)
|
|
17
17
|
[](https://www.npmjs.com/package/memory-eternal)
|
|
18
|
-
[](https://github.com/EternalNight996/memory-eternal/releases)
|
|
19
19
|
[](LICENSE)
|
|
20
20
|
|
|
21
21
|
[English (default)](README.md) · **简体中文(镜像)**
|
|
@@ -295,3 +295,16 @@ _「大爱」二字,是全篇最大的反讽。面板左栏底部同步轮播
|
|
|
295
295
|
|
|
296
296
|
<p align="right"><sub>——《蛊真人》· 大爱仙尊</sub></p>
|
|
297
297
|
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## 🌟 贡献者
|
|
301
|
+
|
|
302
|
+
感谢每一位让记忆核心更好用的人。
|
|
303
|
+
|
|
304
|
+
| 贡献者 | 贡献 |
|
|
305
|
+
| --- | --- |
|
|
306
|
+
| [@aloneangel45](https://github.com/aloneangel45) | 发现并修复 [#54](https://github.com/EternalNight996/memory-eternal/issues/54) —— `tools` 服务晚挂载时 `memory_recall` / `memory_note` 从未注册([#58](https://github.com/EternalNight996/memory-eternal/pull/58)) |
|
|
307
|
+
| [@EternalNight996](https://github.com/EternalNight996) | 作者与维护者 |
|
|
308
|
+
|
|
309
|
+
有想落地的修复?欢迎开 issue 或 PR —— 每个被合并的贡献都会出现在这里。
|
|
310
|
+
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "memory-eternal",
|
|
3
3
|
"displayName": "Memory Atlas",
|
|
4
4
|
"description": "Memory-eternal: open the local Memory Atlas library, review queue and knowledge graph in a Cursor/VS Code webview.",
|
|
5
|
-
"version": "0.30.
|
|
5
|
+
"version": "0.30.3",
|
|
6
6
|
"publisher": "EternalNight996",
|
|
7
7
|
"license": "MIT",
|
|
8
8
|
"repository": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "urn:dsh-std:community-draft:dsh-plugin:0.15",
|
|
3
3
|
"id": "memory-eternal-tui",
|
|
4
4
|
"name": "memory-eternal-tui",
|
|
5
|
-
"version": "0.30.
|
|
5
|
+
"version": "0.30.3",
|
|
6
6
|
"manifestVersion": "0.15",
|
|
7
7
|
"description": "Open Memory Atlas from dsh-TUI: native /audit scene plus browser launcher.",
|
|
8
8
|
"facets": {
|
package/index.js
CHANGED
|
@@ -1191,8 +1191,12 @@ export function apply(ctx, config) {
|
|
|
1191
1191
|
}
|
|
1192
1192
|
}, 'memory-eternal: news digest section')
|
|
1193
1193
|
|
|
1194
|
-
|
|
1195
|
-
|
|
1194
|
+
// toolsRegistered 只在**真的注册成功**后置真:/config 与 /diagnostics 都读它,不能把
|
|
1195
|
+
// 「尝试过」当成「已注册」——注册抛错时用户看到 registered 却依然没有工具,比静默更难排查(#54)。
|
|
1196
|
+
// toolsAttempted 只负责挡住重复尝试(晚到回调可能被重放)。
|
|
1197
|
+
let toolsAttempted = false
|
|
1198
|
+
let toolsRegistered = false
|
|
1199
|
+
const registerMemoryToolsNow = (tools) => {
|
|
1196
1200
|
tools.register(defineTool({
|
|
1197
1201
|
name: 'memory_recall',
|
|
1198
1202
|
description:
|
|
@@ -1316,6 +1320,33 @@ export function apply(ctx, config) {
|
|
|
1316
1320
|
+ '。注意:这是草稿,不会进入记忆库。'
|
|
1317
1321
|
},
|
|
1318
1322
|
}))
|
|
1323
|
+
logCapture('system', 'boot', '记忆工具已注册(memory_recall / memory_note)')
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
const registerMemoryTools = (tools) => {
|
|
1327
|
+
if (toolsAttempted || !tools || typeof tools.register !== 'function') return
|
|
1328
|
+
toolsAttempted = true
|
|
1329
|
+
try {
|
|
1330
|
+
registerMemoryToolsNow(tools)
|
|
1331
|
+
toolsRegistered = true
|
|
1332
|
+
} catch (error) {
|
|
1333
|
+
// 晚到回调里的异常不该打断宿主;失败必须留痕,别退回静默(#54)。
|
|
1334
|
+
logCapture('system', 'fail', '记忆工具注册失败:' + (error?.message || error))
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1338
|
+
// tools 服务在部分宿主版本(如 DSH 0.1.7-rc.2)可能晚于插件 apply 挂载(#54):
|
|
1339
|
+
// 先走同步快路径,若尚未就绪则通过 ctx.inject(['tools']) 在服务就绪时补注册。
|
|
1340
|
+
const tools = ctx.get('tools')
|
|
1341
|
+
if (tools !== undefined) {
|
|
1342
|
+
registerMemoryTools(tools)
|
|
1343
|
+
} else if (typeof ctx.inject === 'function') {
|
|
1344
|
+
ctx.inject(['tools'], (child) => {
|
|
1345
|
+
const lateTools = child.get('tools')
|
|
1346
|
+
if (lateTools !== undefined) registerMemoryTools(lateTools)
|
|
1347
|
+
})
|
|
1348
|
+
} else {
|
|
1349
|
+
logCapture('system', 'warn', '未检测到 tools 服务,memory_recall / memory_note 未注册')
|
|
1319
1350
|
}
|
|
1320
1351
|
|
|
1321
1352
|
// 沉淀停滞探测:只有「有轮次在跑」且「管线 15 分钟一个活口都没有」才报(真死才报)。
|
|
@@ -1429,7 +1460,7 @@ export function apply(ctx, config) {
|
|
|
1429
1460
|
name: 'deepseek-harness',
|
|
1430
1461
|
label: 'DeepSeek Harness(当前宿主)',
|
|
1431
1462
|
installed: true,
|
|
1432
|
-
memoryRecallTool:
|
|
1463
|
+
memoryRecallTool: toolsRegistered,
|
|
1433
1464
|
autoCapture: (settings.get() ?? {}).autoCapture !== false,
|
|
1434
1465
|
autoRecall: (settings.get() ?? {}).autoRecall !== false,
|
|
1435
1466
|
vaultDir: vaultDir(),
|
|
@@ -1538,7 +1569,7 @@ export function apply(ctx, config) {
|
|
|
1538
1569
|
name: 'deepseek-harness',
|
|
1539
1570
|
label: 'DeepSeek Harness(当前宿主)',
|
|
1540
1571
|
installed: true,
|
|
1541
|
-
memoryRecallTool:
|
|
1572
|
+
memoryRecallTool: toolsRegistered,
|
|
1542
1573
|
autoCapture: cfg.autoCapture !== false,
|
|
1543
1574
|
autoRecall: cfg.autoRecall !== false,
|
|
1544
1575
|
vaultDir: vaultDir(),
|
|
@@ -1900,3 +1931,4 @@ export function apply(ctx, config) {
|
|
|
1900
1931
|
ensureVault(root).catch((error) => console.error('[memory-eternal] ensureVault failed:', error))
|
|
1901
1932
|
}, 'memory-eternal: ensure vault')
|
|
1902
1933
|
}
|
|
1934
|
+
|
package/lib/api.js
CHANGED
|
@@ -627,6 +627,7 @@ export function createApi(deps = {}) {
|
|
|
627
627
|
vaultDir: vaultRoot,
|
|
628
628
|
vaultSource: dshD && dshD.vaultSource,
|
|
629
629
|
workspace: dshD && dshD.workspace,
|
|
630
|
+
memoryRecallTool: dshD ? !!dshD.memoryRecallTool : undefined,
|
|
630
631
|
cards: countsD ? countsD.total : undefined,
|
|
631
632
|
health: healthD,
|
|
632
633
|
captureLog: logD,
|
package/lib/client.js
CHANGED
|
@@ -1033,7 +1033,7 @@ Option A, because:
|
|
|
1033
1033
|
.mc-audit-batchcard > .mc-btn { width: 100%; }
|
|
1034
1034
|
.mc-audit-batchcard > div[style*="flex: 1"] { display: none; }
|
|
1035
1035
|
}
|
|
1036
|
-
`;function jo(t){t.effect(()=>t.locale.register(ta,{zh:Gn,en:Kn}),"memory-eternal: locale");let a=t.locale.bind(ta);t.effect(()=>t.slots.inject("settings.section",()=>t.slots.register({name:"settings.section",id:ta,order:25,label:()=>a("nav"),locale:ta,inject:()=>({})},()=>r.default.createElement(Oo,{t:a}))),"memory-eternal: settings section"),t.effect(()=>t.slots.inject("sidebar.footer.action",()=>t.slots.register({name:"sidebar.footer.action",id:`${ta}:footer`,order:100,label:()=>a("nav"),locale:ta,inject:()=>({})},n=>r.default.createElement(Wo,{t:a,locale:t.locale,wide:!(n&&n.wide===!1)}))),"memory-eternal: sidebar footer action")}function Ho(){let[t,a]=(0,r.useState)(K+"/ui/app");return(0,r.useEffect)(()=>{let n=!0,i=()=>fetch("/memory-eternal/api/web-info").then(s=>s.json()).then(s=>{n&&s&&s.ok&&s.alive!==!1&&s.url&&a(s.url.endsWith("/")?s.url:s.url+"/")}).catch(()=>{});return fetch(K+"/ui/app",{method:"HEAD"}).then(s=>{if(n&&!s.ok)return i()}).catch(()=>n?i():void 0),()=>{n=!1}},[]),t}function Oo({t}){return(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",height:"100%",minHeight:0},children:[(0,e.jsx)("style",{children:ht}),(0,e.jsx)(Jn,{t,onReload:()=>{},version:0})]})}function Wo({t,locale:a,wide:n}){let[i,s]=(0,r.useState)(!1);return(0,e.jsxs)("div",{className:`me-footer${n?"":" rail"}`,children:[(0,e.jsx)("style",{children:ht}),(0,e.jsxs)("button",{type:"button",className:"me-footer-btn",onClick:()=>s(!0),"aria-label":t("nav"),title:t("nav"),children:[(0,e.jsx)("span",{className:"me-footer-ico","aria-hidden":"true",children:(0,e.jsx)(Go,{})}),(0,e.jsx)("span",{className:"me-footer-label",children:t("nav")})]}),i&&(0,e.jsx)(qo,{t,locale:a,onClose:()=>s(!1)})]})}function _o(){return(0,e.jsx)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4","aria-hidden":"true",children:(0,e.jsx)("rect",{x:"2.9",y:"2.9",width:"10.2",height:"10.2",rx:"1.7"})})}function Uo(){return(0,e.jsxs)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4","aria-hidden":"true",children:[(0,e.jsx)("rect",{x:"2.6",y:"5.4",width:"8",height:"8",rx:"1.5"}),(0,e.jsx)("path",{d:"M5.6 5.4V4.1c0-.9.7-1.6 1.6-1.6h4.7c.9 0 1.6.7 1.6 1.6v4.7c0 .9-.7 1.6-1.6 1.6h-1.3"})]})}function $o(){return(0,e.jsx)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round","aria-hidden":"true",children:(0,e.jsx)("path",{d:"M3.9 3.9l8.2 8.2M12.1 3.9l-8.2 8.2"})})}function qo({t,locale:a,onClose:n,tab:i}){let[s,m]=(0,r.useState)(!1),[u,k]=(0,r.useState)(!1),f=(0,r.useRef)(null),h=Ho(),p=(0,r.useCallback)(V=>a&&typeof a.subscribe=="function"?a.subscribe(V):()=>{},[a]),w=(0,r.useCallback)(()=>a&&typeof a.getSnapshot=="function"?a.getSnapshot():null,[a]),x=(0,r.useSyncExternalStore)(p,w),T=x&&(x.active==="zh"||x.active==="en")?x.active:null,G=(0,r.useRef)(null);G.current===null&&T&&(G.current=T);let H=(0,r.useMemo)(()=>{let V=G.current?`lang=${G.current}`:"";if(i==="config")return`${K}/ui/config?tab=config${V?`&${V}`:""}`;let L=h.replace(/\/$/,""),Y=L.endsWith("/ui/app")?"?":"/?";return i?`${L}${Y}tab=${i}${V?`&${V}`:""}`:V?`${L}${Y}${V}`:h},[h,i]);(0,r.useEffect)(()=>{let V=f.current&&f.current.contentWindow;V&&T&&V.postMessage({source:"memory-eternal",type:"locale",lang:T},"*")},[T]),(0,r.useEffect)(()=>{let V=L=>{L.key==="Escape"&&n()};return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[n]);let R=(0,e.jsxs)("div",{className:"me-overlay-top",onClick:n,children:[(0,e.jsx)("style",{children:ht}),(0,e.jsx)("div",{className:"me-modal"+(s?" me-modal-full":""),onClick:V=>V.stopPropagation(),children:(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",height:"100%",minHeight:0,position:"relative"},children:[(0,e.jsxs)("div",{className:"me-wctl",children:[(0,e.jsx)("button",{type:"button",className:"me-wctl-btn","data-me-wctl":s?"restore":"full","aria-pressed":s,onClick:()=>m(V=>!V),"aria-label":t(s?"exitFullscreen":"enterFullscreen"),title:t(s?"exitFullscreen":"enterFullscreen"),children:s?(0,e.jsx)(Uo,{}):(0,e.jsx)(_o,{})}),(0,e.jsx)("button",{type:"button",className:"me-wctl-btn me-wctl-close","data-me-wctl":"close",onClick:n,"aria-label":t("close"),title:t("close"),children:(0,e.jsx)($o,{})})]}),(0,e.jsx)("iframe",{ref:f,src:H,title:"memory-eternal",allow:"clipboard-write; clipboard-read",onLoad:()=>k(!0),style:{width:"100%",flex:1,border:0,borderRadius:"inherit",background:"transparent"}}),!u&&(0,e.jsxs)("div",{className:"me-frame-boot",role:"status","aria-live":"polite",children:[(0,e.jsx)(ma,{}),(0,e.jsx)("span",{className:"me-loading-text",children:t("loading")})]})]})})]});return typeof document>"u"?R:(0,qn.createPortal)(R,document.body)}function Go(){return(0,e.jsxs)("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,e.jsx)("defs",{children:(0,e.jsxs)("linearGradient",{id:"mg-brain",x1:"0",y1:"0",x2:"1",y2:"1",children:[(0,e.jsx)("stop",{offset:"0%",stopColor:"#FFC46B"}),(0,e.jsx)("stop",{offset:"50%",stopColor:"#F97316"}),(0,e.jsx)("stop",{offset:"100%",stopColor:"#EA580C"})]})}),(0,e.jsx)("path",{fill:"url(#mg-brain)",d:"M12 4.5a3.2 3.2 0 0 0-6.4.1 4.1 4.1 0 0 0-2.7 5.9 4.1 4.1 0 0 0 .6 6.7A4.2 4.2 0 0 0 12 18.2Z"}),(0,e.jsx)("path",{fill:"url(#mg-brain)",d:"M12 4.5a3.2 3.2 0 0 1 6.4.1 4.1 4.1 0 0 1 2.7 5.9 4.1 4.1 0 0 1-.6 6.7A4.2 4.2 0 0 1 12 18.2Z"}),(0,e.jsx)("path",{d:"M12 9.2c-.8-1.4-1.7-2-3.1-2.2M12 9.2c.8-1.4 1.7-2 3.1-2.2M12 12.4c-1.2 1-3.2 1.6-5 1.4M12 12.4c1.2 1 3.2 1.6 5 1.4M12 13.2v4",fill:"none",stroke:"rgba(255,255,255,0.62)",strokeWidth:"1",strokeLinecap:"round"}),(0,e.jsx)("circle",{cx:"12",cy:"8.6",r:"1.1",fill:"rgba(255,255,255,0.85)"})]})}var aa="0.30.
|
|
1036
|
+
`;function jo(t){t.effect(()=>t.locale.register(ta,{zh:Gn,en:Kn}),"memory-eternal: locale");let a=t.locale.bind(ta);t.effect(()=>t.slots.inject("settings.section",()=>t.slots.register({name:"settings.section",id:ta,order:25,label:()=>a("nav"),locale:ta,inject:()=>({})},()=>r.default.createElement(Oo,{t:a}))),"memory-eternal: settings section"),t.effect(()=>t.slots.inject("sidebar.footer.action",()=>t.slots.register({name:"sidebar.footer.action",id:`${ta}:footer`,order:100,label:()=>a("nav"),locale:ta,inject:()=>({})},n=>r.default.createElement(Wo,{t:a,locale:t.locale,wide:!(n&&n.wide===!1)}))),"memory-eternal: sidebar footer action")}function Ho(){let[t,a]=(0,r.useState)(K+"/ui/app");return(0,r.useEffect)(()=>{let n=!0,i=()=>fetch("/memory-eternal/api/web-info").then(s=>s.json()).then(s=>{n&&s&&s.ok&&s.alive!==!1&&s.url&&a(s.url.endsWith("/")?s.url:s.url+"/")}).catch(()=>{});return fetch(K+"/ui/app",{method:"HEAD"}).then(s=>{if(n&&!s.ok)return i()}).catch(()=>n?i():void 0),()=>{n=!1}},[]),t}function Oo({t}){return(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",height:"100%",minHeight:0},children:[(0,e.jsx)("style",{children:ht}),(0,e.jsx)(Jn,{t,onReload:()=>{},version:0})]})}function Wo({t,locale:a,wide:n}){let[i,s]=(0,r.useState)(!1);return(0,e.jsxs)("div",{className:`me-footer${n?"":" rail"}`,children:[(0,e.jsx)("style",{children:ht}),(0,e.jsxs)("button",{type:"button",className:"me-footer-btn",onClick:()=>s(!0),"aria-label":t("nav"),title:t("nav"),children:[(0,e.jsx)("span",{className:"me-footer-ico","aria-hidden":"true",children:(0,e.jsx)(Go,{})}),(0,e.jsx)("span",{className:"me-footer-label",children:t("nav")})]}),i&&(0,e.jsx)(qo,{t,locale:a,onClose:()=>s(!1)})]})}function _o(){return(0,e.jsx)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4","aria-hidden":"true",children:(0,e.jsx)("rect",{x:"2.9",y:"2.9",width:"10.2",height:"10.2",rx:"1.7"})})}function Uo(){return(0,e.jsxs)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4","aria-hidden":"true",children:[(0,e.jsx)("rect",{x:"2.6",y:"5.4",width:"8",height:"8",rx:"1.5"}),(0,e.jsx)("path",{d:"M5.6 5.4V4.1c0-.9.7-1.6 1.6-1.6h4.7c.9 0 1.6.7 1.6 1.6v4.7c0 .9-.7 1.6-1.6 1.6h-1.3"})]})}function $o(){return(0,e.jsx)("svg",{viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round","aria-hidden":"true",children:(0,e.jsx)("path",{d:"M3.9 3.9l8.2 8.2M12.1 3.9l-8.2 8.2"})})}function qo({t,locale:a,onClose:n,tab:i}){let[s,m]=(0,r.useState)(!1),[u,k]=(0,r.useState)(!1),f=(0,r.useRef)(null),h=Ho(),p=(0,r.useCallback)(V=>a&&typeof a.subscribe=="function"?a.subscribe(V):()=>{},[a]),w=(0,r.useCallback)(()=>a&&typeof a.getSnapshot=="function"?a.getSnapshot():null,[a]),x=(0,r.useSyncExternalStore)(p,w),T=x&&(x.active==="zh"||x.active==="en")?x.active:null,G=(0,r.useRef)(null);G.current===null&&T&&(G.current=T);let H=(0,r.useMemo)(()=>{let V=G.current?`lang=${G.current}`:"";if(i==="config")return`${K}/ui/config?tab=config${V?`&${V}`:""}`;let L=h.replace(/\/$/,""),Y=L.endsWith("/ui/app")?"?":"/?";return i?`${L}${Y}tab=${i}${V?`&${V}`:""}`:V?`${L}${Y}${V}`:h},[h,i]);(0,r.useEffect)(()=>{let V=f.current&&f.current.contentWindow;V&&T&&V.postMessage({source:"memory-eternal",type:"locale",lang:T},"*")},[T]),(0,r.useEffect)(()=>{let V=L=>{L.key==="Escape"&&n()};return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[n]);let R=(0,e.jsxs)("div",{className:"me-overlay-top",onClick:n,children:[(0,e.jsx)("style",{children:ht}),(0,e.jsx)("div",{className:"me-modal"+(s?" me-modal-full":""),onClick:V=>V.stopPropagation(),children:(0,e.jsxs)("div",{style:{display:"flex",flexDirection:"column",height:"100%",minHeight:0,position:"relative"},children:[(0,e.jsxs)("div",{className:"me-wctl",children:[(0,e.jsx)("button",{type:"button",className:"me-wctl-btn","data-me-wctl":s?"restore":"full","aria-pressed":s,onClick:()=>m(V=>!V),"aria-label":t(s?"exitFullscreen":"enterFullscreen"),title:t(s?"exitFullscreen":"enterFullscreen"),children:s?(0,e.jsx)(Uo,{}):(0,e.jsx)(_o,{})}),(0,e.jsx)("button",{type:"button",className:"me-wctl-btn me-wctl-close","data-me-wctl":"close",onClick:n,"aria-label":t("close"),title:t("close"),children:(0,e.jsx)($o,{})})]}),(0,e.jsx)("iframe",{ref:f,src:H,title:"memory-eternal",allow:"clipboard-write; clipboard-read",onLoad:()=>k(!0),style:{width:"100%",flex:1,border:0,borderRadius:"inherit",background:"transparent"}}),!u&&(0,e.jsxs)("div",{className:"me-frame-boot",role:"status","aria-live":"polite",children:[(0,e.jsx)(ma,{}),(0,e.jsx)("span",{className:"me-loading-text",children:t("loading")})]})]})})]});return typeof document>"u"?R:(0,qn.createPortal)(R,document.body)}function Go(){return(0,e.jsxs)("svg",{viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,e.jsx)("defs",{children:(0,e.jsxs)("linearGradient",{id:"mg-brain",x1:"0",y1:"0",x2:"1",y2:"1",children:[(0,e.jsx)("stop",{offset:"0%",stopColor:"#FFC46B"}),(0,e.jsx)("stop",{offset:"50%",stopColor:"#F97316"}),(0,e.jsx)("stop",{offset:"100%",stopColor:"#EA580C"})]})}),(0,e.jsx)("path",{fill:"url(#mg-brain)",d:"M12 4.5a3.2 3.2 0 0 0-6.4.1 4.1 4.1 0 0 0-2.7 5.9 4.1 4.1 0 0 0 .6 6.7A4.2 4.2 0 0 0 12 18.2Z"}),(0,e.jsx)("path",{fill:"url(#mg-brain)",d:"M12 4.5a3.2 3.2 0 0 1 6.4.1 4.1 4.1 0 0 1 2.7 5.9 4.1 4.1 0 0 1-.6 6.7A4.2 4.2 0 0 1 12 18.2Z"}),(0,e.jsx)("path",{d:"M12 9.2c-.8-1.4-1.7-2-3.1-2.2M12 9.2c.8-1.4 1.7-2 3.1-2.2M12 12.4c-1.2 1-3.2 1.6-5 1.4M12 12.4c1.2 1 3.2 1.6 5 1.4M12 13.2v4",fill:"none",stroke:"rgba(255,255,255,0.62)",strokeWidth:"1",strokeLinecap:"round"}),(0,e.jsx)("circle",{cx:"12",cy:"8.6",r:"1.1",fill:"rgba(255,255,255,0.85)"})]})}var aa="0.30.3";function Ko({t}){let[a,n]=(0,r.useState)(""),i="dsh-memory tui",s="dsh-memory tui --write",m=async(h,p)=>{try{await navigator.clipboard.writeText(h),n(p),setTimeout(()=>n(""),1600)}catch{}},u={border:"1px solid #3a404a",borderRadius:14,background:"#22262d",padding:"16px 18px"},k={margin:"10px 0 0",padding:"12px 14px",borderRadius:10,background:"#171a1f",border:"1px solid #333943",color:"#f3f5f8",fontSize:12.5,lineHeight:1.7,overflowX:"auto",fontFamily:"ui-monospace, Consolas, monospace"},f={marginTop:10,border:"1px solid #4a515c",background:"transparent",color:"#ffb08a",borderRadius:9,padding:"7px 12px",fontSize:12,cursor:"pointer"};return(0,e.jsxs)("div",{style:{padding:"22px 26px 34px",maxWidth:1040,color:"#f3f5f8"},children:[(0,e.jsxs)("div",{style:{display:"flex",alignItems:"baseline",gap:12,flexWrap:"wrap"},children:[(0,e.jsx)("h2",{style:{margin:0,fontSize:24,letterSpacing:"-.02em"},children:t("terminalTitle")}),(0,e.jsx)("span",{style:{color:"#99a1ac",fontSize:12},children:"TUI \xB7 LIVE \xB7 dsh-tui"})]}),(0,e.jsx)("p",{style:{margin:"9px 0 20px",color:"#aeb5bf",fontSize:13.5,lineHeight:1.8},children:t("terminalIntro")}),(0,e.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1.1fr) minmax(0, .9fr)",gap:14},children:[(0,e.jsxs)("div",{style:u,children:[(0,e.jsxs)("div",{style:{fontSize:13,fontWeight:700},children:["\u25B8 ",t("terminalRun")]}),(0,e.jsx)("pre",{style:k,children:i}),(0,e.jsx)("button",{type:"button",style:f,onClick:()=>m(i,"run"),children:a==="run"?"\u2713 "+t("terminalCopied"):"\u29C9 "+t("terminalCopy")}),(0,e.jsxs)("div",{style:{marginTop:12,color:"#99a1ac",fontSize:12,lineHeight:1.7},children:["\u9ED8\u8BA4\u8BFB\u53D6\u771F\u5B9E\u8BB0\u5FC6\u5E93\u4E0E\u5F85\u5BA1\u961F\u5217\uFF1B\u53EA\u8BFB\uFF0C\u786E\u8BA4\u540E\u624D\u7528 `--write`\u3002\u793A\u4F8B\u6570\u636E\u7528 `--demo`\u3002",(0,e.jsx)("br",{}),"\u6CA1\u6709 `dsh-memory` \u547D\u4EE4\u65F6\uFF1A`npx -p memory-eternal dsh-memory tui`"]})]}),(0,e.jsxs)("div",{style:u,children:[(0,e.jsxs)("div",{style:{fontSize:13,fontWeight:700},children:["\u25B8 ",t("terminalTui")]}),(0,e.jsx)("pre",{style:k,children:s}),(0,e.jsx)("button",{type:"button",style:f,onClick:()=>m(s,"tui"),children:a==="tui"?"\u2713 "+t("terminalCopied"):"\u29C9 "+t("terminalCopy")}),(0,e.jsx)("div",{style:{marginTop:12,color:"#99a1ac",fontSize:12,lineHeight:1.7},children:"\u771F\u5B9E\u6279\u51C6/\u9A73\u56DE\uFF1B\u4E0D\u786E\u5B9A\u65F6\u5148\u7528\u53EA\u8BFB\u6A21\u5F0F\u3002"})]})]}),(0,e.jsxs)("div",{style:{...u,marginTop:14},children:[(0,e.jsxs)("div",{style:{fontSize:13,fontWeight:700},children:["\u25B8 ",t("terminalPreview")]}),(0,e.jsx)("pre",{style:{...k,marginTop:10,color:"#d7dce3",fontSize:12,lineHeight:1.5},children:`\u256D\u2500 MEMORY ATLAS / \u5F85\u5BA1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E
|
|
1037
1037
|
\u2502 \u7C7B\u578B \u25CF \u5168\u90E8 7 \u25CB \u9879\u76EE 3 \u25CB \u77E5\u8BC6 1 \u25CB \u6559\u8BAD 1 \u2502
|
|
1038
1038
|
\u2502 \u2502
|
|
1039
1039
|
\u2502 \u25A3 \u5168\u9009 7 \u5DF2\u9009 3 s \u5168\u9009 \u2502
|
package/lib/feedback.js
CHANGED
|
@@ -58,6 +58,9 @@ export function buildDiagnostics(input = {}, home = '') {
|
|
|
58
58
|
add('Vault', input.vaultDir)
|
|
59
59
|
add('Vault source', input.vaultSource)
|
|
60
60
|
add('Workspace', input.workspace)
|
|
61
|
+
if (input.memoryRecallTool !== undefined) {
|
|
62
|
+
add('Tools (memory_recall)', input.memoryRecallTool ? 'registered' : 'MISSING')
|
|
63
|
+
}
|
|
61
64
|
add('Cards', input.cards)
|
|
62
65
|
add('Graph', input.graph)
|
|
63
66
|
// 待应用配置的同步状态(#16):独立 Web 端保存 → pending 文件 → 宿主 drain。
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"id": "memory-eternal",
|
|
4
4
|
"publisher": "eternalnight996",
|
|
5
5
|
"name": "memory-eternal",
|
|
6
|
-
"version": "0.30.
|
|
6
|
+
"version": "0.30.3",
|
|
7
7
|
"description": "Memory Atlas for Orca: open the local memory vault, pending review and knowledge graph from a sandboxed Orca panel.",
|
|
8
8
|
"author": {
|
|
9
9
|
"name": "EternalNight996",
|
package/package.json
CHANGED
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "memory-eternal",
|
|
3
|
-
"version": "0.30.
|
|
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
|
-
"docs/INTEGRATIONS.md",
|
|
46
|
-
"llms-install.md",
|
|
47
|
-
"README.md",
|
|
48
|
-
"README.zh-CN.md",
|
|
49
|
-
"LICENSE"
|
|
50
|
-
],
|
|
51
|
-
"engines": {
|
|
52
|
-
"node": ">=22",
|
|
53
|
-
"dsh": ">=0.1.5-alpha.2 <0.3.0-0"
|
|
54
|
-
},
|
|
55
|
-
"keywords": [
|
|
56
|
-
"deepseek-harness",
|
|
57
|
-
"dsh",
|
|
58
|
-
"dsh-plugin",
|
|
59
|
-
"plugin",
|
|
60
|
-
"memory",
|
|
61
|
-
"knowledge-base",
|
|
62
|
-
"vault",
|
|
63
|
-
"markdown",
|
|
64
|
-
"knowledge-graph",
|
|
65
|
-
"rag",
|
|
66
|
-
"second-brain"
|
|
67
|
-
],
|
|
68
|
-
"scripts": {
|
|
69
|
-
"build": "node build.mjs",
|
|
70
|
-
"build:client": "node build.mjs",
|
|
71
|
-
"prepublishOnly": "node build.mjs",
|
|
72
|
-
"release": "node scripts/release.mjs",
|
|
73
|
-
"release:dry": "node scripts/release.mjs --dry-run",
|
|
74
|
-
"panel-check": "node scripts/panel-check.mjs",
|
|
75
|
-
"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/graph-force.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-subgraph.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 && node tests/setup-node-path.test.mjs && node tests/capture-kind.test.mjs && node tests/core-memory.test.mjs && node tests/skill-cards.test.mjs && node tests/audit-search.test.mjs && node tests/news.test.mjs && node tests/news-feed.test.mjs && node tests/ledger.test.mjs && node tests/issue-55-timezone.test.mjs && node tests/recycle-center.test.mjs && node tests/news-follows.test.mjs && node tests/news-digest.test.mjs && node tests/search-index.test.mjs && node tests/star-prompt.test.mjs && node tests/working-memory.test.mjs && node tests/mcp-manifests.test.mjs"
|
|
76
|
-
},
|
|
77
|
-
"dependencies": {
|
|
78
|
-
"@deepseek-ai/schemastery": "^3.18.1"
|
|
79
|
-
},
|
|
80
|
-
"peerDependencies": {
|
|
81
|
-
"@deepseek-ai/cordis": "^4.0.1",
|
|
82
|
-
"@deepseek-ai/dsh-llm": ">=0.1.0-rc.2 <0.3.0-0",
|
|
83
|
-
"@deepseek-ai/dsh-tools": ">=0.1.0-rc.2 <0.3.0-0"
|
|
84
|
-
},
|
|
85
|
-
"devDependencies": {
|
|
86
|
-
"@types/react": "^18.3.1",
|
|
87
|
-
"esbuild": "^0.24.0",
|
|
88
|
-
"react": "18.3.1",
|
|
89
|
-
"react-dom": "18.3.1"
|
|
90
|
-
},
|
|
91
|
-
"dsh": {
|
|
92
|
-
"client": {
|
|
93
|
-
"platform": "web",
|
|
94
|
-
"inject": [
|
|
95
|
-
"@deepseek-ai/dsh-client-ui-settings",
|
|
96
|
-
"@deepseek-ai/dsh-client-locale"
|
|
97
|
-
]
|
|
98
|
-
},
|
|
99
|
-
"bundle": {
|
|
100
|
-
"patch": "./cordis.patch.yml"
|
|
101
|
-
},
|
|
102
|
-
"marketplace": {
|
|
103
|
-
"profiles": [
|
|
104
|
-
"web",
|
|
105
|
-
"desktop"
|
|
106
|
-
],
|
|
107
|
-
"requiresBuildApproval": false,
|
|
108
|
-
"requiresRestart": true,
|
|
109
|
-
"manualSteps": false
|
|
110
|
-
},
|
|
111
|
-
"permissions": {
|
|
112
|
-
"level": "medium",
|
|
113
|
-
"files": "read-write",
|
|
114
|
-
"network": "restricted",
|
|
115
|
-
"commands": "node",
|
|
116
|
-
"credentials": [],
|
|
117
|
-
"externalServices": [
|
|
118
|
-
"Public RSS/Atom feeds: 量子位, 雷锋网, 钛媒体, InfoQ 中文, TechCrunch AI, The Verge AI, MIT Technology Review AI, Google DeepMind",
|
|
119
|
-
"Hacker News Algolia API (AI story ranking)"
|
|
120
|
-
],
|
|
121
|
-
"notes": "Read/write under ~/.dsh/memory-vault only. Memory data stays local; only the optional News page fetches the fixed public RSS/HN sources above on demand (titles, excerpts, links). No credentials, no shell. Hooks/MCP run via the `node` binary that hosts the DSH process."
|
|
122
|
-
},
|
|
123
|
-
"lifecycle": {
|
|
124
|
-
"scripts": [
|
|
125
|
-
"prepare",
|
|
126
|
-
"prepublishOnly"
|
|
127
|
-
],
|
|
128
|
-
"details": {
|
|
129
|
-
"prepare": "node build.mjs",
|
|
130
|
-
"prepublishOnly": "node build.mjs"
|
|
131
|
-
},
|
|
132
|
-
"notes": "Only `prepare` and `prepublishOnly` run `node build.mjs` (esbuild client bundling). No preinstall/install/postinstall hooks, no remote downloads, no native builds."
|
|
133
|
-
},
|
|
134
|
-
"compatibility": {
|
|
135
|
-
"dsh": ">=0.1.5-alpha.2 <0.3.0-0",
|
|
136
|
-
"dshReleases": {
|
|
137
|
-
"0.1.5-alpha.2": "compatible",
|
|
138
|
-
"0.1.5-rc.1": "compatible",
|
|
139
|
-
"0.1.5-rc.2": "compatible",
|
|
140
|
-
"0.1.7-rc.2": "compatible",
|
|
141
|
-
"0.2.0-rc.2": "compatible"
|
|
142
|
-
},
|
|
143
|
-
"node": ">=22",
|
|
144
|
-
"profiles": [
|
|
145
|
-
"web",
|
|
146
|
-
"desktop"
|
|
147
|
-
]
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "memory-eternal",
|
|
3
|
+
"version": "0.30.3",
|
|
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
|
+
"docs/INTEGRATIONS.md",
|
|
46
|
+
"llms-install.md",
|
|
47
|
+
"README.md",
|
|
48
|
+
"README.zh-CN.md",
|
|
49
|
+
"LICENSE"
|
|
50
|
+
],
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=22",
|
|
53
|
+
"dsh": ">=0.1.5-alpha.2 <0.3.0-0"
|
|
54
|
+
},
|
|
55
|
+
"keywords": [
|
|
56
|
+
"deepseek-harness",
|
|
57
|
+
"dsh",
|
|
58
|
+
"dsh-plugin",
|
|
59
|
+
"plugin",
|
|
60
|
+
"memory",
|
|
61
|
+
"knowledge-base",
|
|
62
|
+
"vault",
|
|
63
|
+
"markdown",
|
|
64
|
+
"knowledge-graph",
|
|
65
|
+
"rag",
|
|
66
|
+
"second-brain"
|
|
67
|
+
],
|
|
68
|
+
"scripts": {
|
|
69
|
+
"build": "node build.mjs",
|
|
70
|
+
"build:client": "node build.mjs",
|
|
71
|
+
"prepublishOnly": "node build.mjs",
|
|
72
|
+
"release": "node scripts/release.mjs",
|
|
73
|
+
"release:dry": "node scripts/release.mjs --dry-run",
|
|
74
|
+
"panel-check": "node scripts/panel-check.mjs",
|
|
75
|
+
"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/graph-force.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-subgraph.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 && node tests/setup-node-path.test.mjs && node tests/capture-kind.test.mjs && node tests/core-memory.test.mjs && node tests/skill-cards.test.mjs && node tests/audit-search.test.mjs && node tests/news.test.mjs && node tests/news-feed.test.mjs && node tests/ledger.test.mjs && node tests/issue-55-timezone.test.mjs && node tests/recycle-center.test.mjs && node tests/news-follows.test.mjs && node tests/news-digest.test.mjs && node tests/search-index.test.mjs && node tests/star-prompt.test.mjs && node tests/working-memory.test.mjs && node tests/mcp-manifests.test.mjs && node tests/issue-54-late-tools.test.mjs"
|
|
76
|
+
},
|
|
77
|
+
"dependencies": {
|
|
78
|
+
"@deepseek-ai/schemastery": "^3.18.1"
|
|
79
|
+
},
|
|
80
|
+
"peerDependencies": {
|
|
81
|
+
"@deepseek-ai/cordis": "^4.0.1",
|
|
82
|
+
"@deepseek-ai/dsh-llm": ">=0.1.0-rc.2 <0.3.0-0",
|
|
83
|
+
"@deepseek-ai/dsh-tools": ">=0.1.0-rc.2 <0.3.0-0"
|
|
84
|
+
},
|
|
85
|
+
"devDependencies": {
|
|
86
|
+
"@types/react": "^18.3.1",
|
|
87
|
+
"esbuild": "^0.24.0",
|
|
88
|
+
"react": "18.3.1",
|
|
89
|
+
"react-dom": "18.3.1"
|
|
90
|
+
},
|
|
91
|
+
"dsh": {
|
|
92
|
+
"client": {
|
|
93
|
+
"platform": "web",
|
|
94
|
+
"inject": [
|
|
95
|
+
"@deepseek-ai/dsh-client-ui-settings",
|
|
96
|
+
"@deepseek-ai/dsh-client-locale"
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
"bundle": {
|
|
100
|
+
"patch": "./cordis.patch.yml"
|
|
101
|
+
},
|
|
102
|
+
"marketplace": {
|
|
103
|
+
"profiles": [
|
|
104
|
+
"web",
|
|
105
|
+
"desktop"
|
|
106
|
+
],
|
|
107
|
+
"requiresBuildApproval": false,
|
|
108
|
+
"requiresRestart": true,
|
|
109
|
+
"manualSteps": false
|
|
110
|
+
},
|
|
111
|
+
"permissions": {
|
|
112
|
+
"level": "medium",
|
|
113
|
+
"files": "read-write",
|
|
114
|
+
"network": "restricted",
|
|
115
|
+
"commands": "node",
|
|
116
|
+
"credentials": [],
|
|
117
|
+
"externalServices": [
|
|
118
|
+
"Public RSS/Atom feeds: 量子位, 雷锋网, 钛媒体, InfoQ 中文, TechCrunch AI, The Verge AI, MIT Technology Review AI, Google DeepMind",
|
|
119
|
+
"Hacker News Algolia API (AI story ranking)"
|
|
120
|
+
],
|
|
121
|
+
"notes": "Read/write under ~/.dsh/memory-vault only. Memory data stays local; only the optional News page fetches the fixed public RSS/HN sources above on demand (titles, excerpts, links). No credentials, no shell. Hooks/MCP run via the `node` binary that hosts the DSH process."
|
|
122
|
+
},
|
|
123
|
+
"lifecycle": {
|
|
124
|
+
"scripts": [
|
|
125
|
+
"prepare",
|
|
126
|
+
"prepublishOnly"
|
|
127
|
+
],
|
|
128
|
+
"details": {
|
|
129
|
+
"prepare": "node build.mjs",
|
|
130
|
+
"prepublishOnly": "node build.mjs"
|
|
131
|
+
},
|
|
132
|
+
"notes": "Only `prepare` and `prepublishOnly` run `node build.mjs` (esbuild client bundling). No preinstall/install/postinstall hooks, no remote downloads, no native builds."
|
|
133
|
+
},
|
|
134
|
+
"compatibility": {
|
|
135
|
+
"dsh": ">=0.1.5-alpha.2 <0.3.0-0",
|
|
136
|
+
"dshReleases": {
|
|
137
|
+
"0.1.5-alpha.2": "compatible",
|
|
138
|
+
"0.1.5-rc.1": "compatible",
|
|
139
|
+
"0.1.5-rc.2": "compatible",
|
|
140
|
+
"0.1.7-rc.2": "compatible",
|
|
141
|
+
"0.2.0-rc.2": "compatible"
|
|
142
|
+
},
|
|
143
|
+
"node": ">=22",
|
|
144
|
+
"profiles": [
|
|
145
|
+
"web",
|
|
146
|
+
"desktop"
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
package/web/app.js
CHANGED
|
@@ -1035,7 +1035,7 @@ Option A, because:
|
|
|
1035
1035
|
.mc-audit-batchcard > .mc-btn { width: 100%; }
|
|
1036
1036
|
.mc-audit-batchcard > div[style*="flex: 1"] { display: none; }
|
|
1037
1037
|
}
|
|
1038
|
-
`;var Ia="0.30.
|
|
1038
|
+
`;var Ia="0.30.3";function i0({t:e}){let[t,n]=(0,p.useState)(""),a="dsh-memory tui",o="dsh-memory tui --write",i=async(u,m)=>{try{await navigator.clipboard.writeText(u),n(m),setTimeout(()=>n(""),1600)}catch{}},l={border:"1px solid #3a404a",borderRadius:14,background:"#22262d",padding:"16px 18px"},s={margin:"10px 0 0",padding:"12px 14px",borderRadius:10,background:"#171a1f",border:"1px solid #333943",color:"#f3f5f8",fontSize:12.5,lineHeight:1.7,overflowX:"auto",fontFamily:"ui-monospace, Consolas, monospace"},c={marginTop:10,border:"1px solid #4a515c",background:"transparent",color:"#ffb08a",borderRadius:9,padding:"7px 12px",fontSize:12,cursor:"pointer"};return(0,r.jsxs)("div",{style:{padding:"22px 26px 34px",maxWidth:1040,color:"#f3f5f8"},children:[(0,r.jsxs)("div",{style:{display:"flex",alignItems:"baseline",gap:12,flexWrap:"wrap"},children:[(0,r.jsx)("h2",{style:{margin:0,fontSize:24,letterSpacing:"-.02em"},children:e("terminalTitle")}),(0,r.jsx)("span",{style:{color:"#99a1ac",fontSize:12},children:"TUI \xB7 LIVE \xB7 dsh-tui"})]}),(0,r.jsx)("p",{style:{margin:"9px 0 20px",color:"#aeb5bf",fontSize:13.5,lineHeight:1.8},children:e("terminalIntro")}),(0,r.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"minmax(0, 1.1fr) minmax(0, .9fr)",gap:14},children:[(0,r.jsxs)("div",{style:l,children:[(0,r.jsxs)("div",{style:{fontSize:13,fontWeight:700},children:["\u25B8 ",e("terminalRun")]}),(0,r.jsx)("pre",{style:s,children:a}),(0,r.jsx)("button",{type:"button",style:c,onClick:()=>i(a,"run"),children:t==="run"?"\u2713 "+e("terminalCopied"):"\u29C9 "+e("terminalCopy")}),(0,r.jsxs)("div",{style:{marginTop:12,color:"#99a1ac",fontSize:12,lineHeight:1.7},children:["\u9ED8\u8BA4\u8BFB\u53D6\u771F\u5B9E\u8BB0\u5FC6\u5E93\u4E0E\u5F85\u5BA1\u961F\u5217\uFF1B\u53EA\u8BFB\uFF0C\u786E\u8BA4\u540E\u624D\u7528 `--write`\u3002\u793A\u4F8B\u6570\u636E\u7528 `--demo`\u3002",(0,r.jsx)("br",{}),"\u6CA1\u6709 `dsh-memory` \u547D\u4EE4\u65F6\uFF1A`npx -p memory-eternal dsh-memory tui`"]})]}),(0,r.jsxs)("div",{style:l,children:[(0,r.jsxs)("div",{style:{fontSize:13,fontWeight:700},children:["\u25B8 ",e("terminalTui")]}),(0,r.jsx)("pre",{style:s,children:o}),(0,r.jsx)("button",{type:"button",style:c,onClick:()=>i(o,"tui"),children:t==="tui"?"\u2713 "+e("terminalCopied"):"\u29C9 "+e("terminalCopy")}),(0,r.jsx)("div",{style:{marginTop:12,color:"#99a1ac",fontSize:12,lineHeight:1.7},children:"\u771F\u5B9E\u6279\u51C6/\u9A73\u56DE\uFF1B\u4E0D\u786E\u5B9A\u65F6\u5148\u7528\u53EA\u8BFB\u6A21\u5F0F\u3002"})]})]}),(0,r.jsxs)("div",{style:{...l,marginTop:14},children:[(0,r.jsxs)("div",{style:{fontSize:13,fontWeight:700},children:["\u25B8 ",e("terminalPreview")]}),(0,r.jsx)("pre",{style:{...s,marginTop:10,color:"#d7dce3",fontSize:12,lineHeight:1.5},children:`\u256D\u2500 MEMORY ATLAS / \u5F85\u5BA1 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E
|
|
1039
1039
|
\u2502 \u7C7B\u578B \u25CF \u5168\u90E8 7 \u25CB \u9879\u76EE 3 \u25CB \u77E5\u8BC6 1 \u25CB \u6559\u8BAD 1 \u2502
|
|
1040
1040
|
\u2502 \u2502
|
|
1041
1041
|
\u2502 \u25A3 \u5168\u9009 7 \u5DF2\u9009 3 s \u5168\u9009 \u2502
|