dsh-mnemon-source-memory-spaces 0.5.11 → 0.5.13

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/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { findMnemonCommand, isMnemonExecutable, mnemonNpmLauncher, nodeLauncherEnvironment } from "./native-cli.js";
1
+ import { findMnemonCommand, isMnemonExecutable, resolveMnemonInvocation } from "./native-cli.js";
2
2
  import { CATEGORIES as CATEGORIES$1, EDGE_TYPES, INTENTS as INTENTS$1, MNEMON_EMBEDDING_PROTOCOLS, SOURCES as SOURCES$1 } from "./contracts.js";
3
3
  import { a as MemoryProviderCatalog, i as EMPTY_MEMORY_PROVIDER_CATALOG, n as PrivateMemorySpaceProviderHost, r as MemoryProviderAdapterRegistry, t as createMemorySpaceProviderPlugin } from "./plugin-DlsNeZbQ.js";
4
4
  import { t as runProcess } from "./process-BvrgxPNP.js";
@@ -1374,6 +1374,17 @@ var MemorySpacesService = class {
1374
1374
  recallQualityPolicy;
1375
1375
  spacesInFlight;
1376
1376
  providersDisposed = false;
1377
+ /** The CLI version a full status last read, and the binary it read it from. */
1378
+ cliVersion;
1379
+ /** The CLI binary as the file system has it; another value after an update replaces it. */
1380
+ cliBinary() {
1381
+ try {
1382
+ const stat = statSync(this.runner.command);
1383
+ return `${this.runner.command}\0${stat.mtimeMs}\0${stat.size}`;
1384
+ } catch {
1385
+ return;
1386
+ }
1387
+ }
1377
1388
  providerTypeId(providerId) {
1378
1389
  const catalog = this.providerCatalog;
1379
1390
  if (!catalog.has(providerId)) return providerId;
@@ -1524,6 +1535,7 @@ var MemorySpacesService = class {
1524
1535
  /** Return a usable system snapshot without waiting for any Provider I/O. */
1525
1536
  statusSummary() {
1526
1537
  const catalog = this.spaceDirectory();
1538
+ const version = this.cliVersion !== void 0 && this.cliBinary() === this.cliVersion.binary ? this.cliVersion.version : void 0;
1527
1539
  const dshActiveStores = catalog.items.filter((body) => body.active && body.providerEnabled !== false).map((body) => body.id);
1528
1540
  const providerServices = this.memorySpaces.providerServices().items.map((service) => {
1529
1541
  const descriptor = this.providerCatalog.descriptor(service.providerId);
@@ -1554,7 +1566,8 @@ var MemorySpacesService = class {
1554
1566
  recallQuality: this.config.recallQuality,
1555
1567
  memoryBodyDirectory: catalog.directory,
1556
1568
  memoryBodies: catalog.items,
1557
- providerServices
1569
+ providerServices,
1570
+ ...version === void 0 ? {} : { version }
1558
1571
  };
1559
1572
  }
1560
1573
  /** Probe the effective Mnemon embedding runtime and its default Store coverage. */
@@ -1620,6 +1633,12 @@ var MemorySpacesService = class {
1620
1633
  memoryBodies: catalog.items,
1621
1634
  providerServices
1622
1635
  };
1636
+ const version = rawVersion === void 0 ? void 0 : rawVersion.trim().replace(/^mnemon version\s+/i, "");
1637
+ const binary = version === void 0 ? void 0 : this.cliBinary();
1638
+ this.cliVersion = version === void 0 || binary === void 0 ? void 0 : {
1639
+ binary,
1640
+ version
1641
+ };
1623
1642
  try {
1624
1643
  const healthySpaces = active.filter((body) => body.healthy && body.stats !== void 0);
1625
1644
  const topEntities = /* @__PURE__ */ new Map();
@@ -1645,7 +1664,7 @@ var MemorySpacesService = class {
1645
1664
  return {
1646
1665
  healthy: true,
1647
1666
  ...base,
1648
- ...rawVersion === void 0 ? {} : { version: rawVersion.trim().replace(/^mnemon version\s+/i, "") },
1667
+ ...version === void 0 ? {} : { version },
1649
1668
  stats,
1650
1669
  ...errors.length === 0 ? {} : { error: errors.join("; ") }
1651
1670
  };
@@ -2387,11 +2406,10 @@ function createRunner(config, processRunner = runProcess) {
2387
2406
  };
2388
2407
  let result;
2389
2408
  try {
2390
- const command = currentCommand();
2391
- const launcher = mnemonNpmLauncher(command);
2392
- result = await processRunner(launcher === void 0 ? command : process.execPath, launcher === void 0 ? argv : [launcher, ...argv], launcher === void 0 ? processOptions : {
2409
+ const invocation = resolveMnemonInvocation(currentCommand(), argv, environment);
2410
+ result = await processRunner(invocation.command, invocation.args, {
2393
2411
  ...processOptions,
2394
- env: nodeLauncherEnvironment(processOptions.env)
2412
+ ...invocation.env === void 0 ? {} : { env: invocation.env }
2395
2413
  });
2396
2414
  } catch (error) {
2397
2415
  throw new MnemonCliError(`${error instanceof Error ? error.message : String(error)}. ${process.platform === "win32" ? "Install the official Mnemon Windows release, ensure mnemon.exe is on PATH or under %LOCALAPPDATA%\\Programs\\mnemon, or set MNEMON_CLI_PATH or mnemon.cliPath to its absolute path." : "Install Mnemon and ensure \"mnemon\" is on PATH, or set MNEMON_CLI_PATH or mnemon.cliPath."}`);
@@ -2,6 +2,12 @@
2
2
  /** Execute JavaScript with the Host binary even when it is Electron's GUI executable. */
3
3
  declare function nodeLauncherEnvironment(environment?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
4
4
  declare function mnemonNpmLauncher(command: string): string | undefined;
5
+ /** Keep CLI subprocesses under our windowsHide, timeout and cancellation policy. */
6
+ declare function resolveMnemonInvocation(command: string, args: readonly string[], env?: NodeJS.ProcessEnv): {
7
+ command: string;
8
+ args: string[];
9
+ env?: NodeJS.ProcessEnv;
10
+ };
5
11
  interface CommandDiscoveryOptions {
6
12
  platform?: NodeJS.Platform;
7
13
  env?: NodeJS.ProcessEnv;
@@ -14,4 +20,4 @@ declare function findMnemonCommand(config: {
14
20
  cliPath?: string | undefined;
15
21
  }, options?: CommandDiscoveryOptions): string | undefined;
16
22
  //#endregion
17
- export { CommandDiscoveryOptions, findMnemonCommand, isMnemonExecutable, mnemonNpmLauncher, nodeLauncherEnvironment };
23
+ export { CommandDiscoveryOptions, findMnemonCommand, isMnemonExecutable, mnemonNpmLauncher, nodeLauncherEnvironment, resolveMnemonInvocation };
package/lib/native-cli.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { createRequire } from "node:module";
1
2
  import { accessSync, constants, existsSync, readFileSync, realpathSync, statSync } from "node:fs";
2
3
  import { homedir } from "node:os";
3
4
  import { dirname, join, posix, win32 } from "node:path";
@@ -38,6 +39,42 @@ function mnemonNpmLauncher(command) {
38
39
  } catch {}
39
40
  }
40
41
  }
42
+ /** Resolve only the platform package pinned by the recognized official launcher. */
43
+ function npmNativeBinary(launcher) {
44
+ const pkg = manifest(join(dirname(dirname(launcher)), "package.json"));
45
+ const target = `${process.platform}-${process.arch}`;
46
+ const alias = `${MNEMON_NPM_PACKAGE}-${target}`;
47
+ const version = typeof pkg?.version === "string" ? `${pkg.version}-${target}` : void 0;
48
+ if (version === void 0 || pkg?.optionalDependencies?.[alias] !== `npm:${MNEMON_NPM_PACKAGE}@${version}`) return void 0;
49
+ try {
50
+ const packagePath = createRequire(launcher).resolve.paths(alias)?.map((path) => join(path, alias, "package.json")).find(existsSync);
51
+ if (packagePath === void 0) return void 0;
52
+ const native = manifest(packagePath);
53
+ if (native?.name !== MNEMON_NPM_PACKAGE || native.version !== version) return void 0;
54
+ const binary = join(dirname(packagePath), "bin", process.platform === "win32" ? "mnemon.exe" : "mnemon");
55
+ return isMnemonExecutable(binary) ? binary : void 0;
56
+ } catch {
57
+ return;
58
+ }
59
+ }
60
+ /** Keep CLI subprocesses under our windowsHide, timeout and cancellation policy. */
61
+ function resolveMnemonInvocation(command, args, env) {
62
+ const launcher = mnemonNpmLauncher(command);
63
+ if (launcher !== void 0) {
64
+ const binary = args.length === 1 && args[0] === "update" ? void 0 : npmNativeBinary(launcher);
65
+ if (binary === void 0) return {
66
+ command: process.execPath,
67
+ args: [launcher, ...args],
68
+ env: nodeLauncherEnvironment(env)
69
+ };
70
+ command = binary;
71
+ }
72
+ return {
73
+ command,
74
+ args: [...args],
75
+ ...env === void 0 ? {} : { env }
76
+ };
77
+ }
41
78
  const UNIX_COMMON_CLI_PATHS = [
42
79
  "~/.local/bin/mnemon",
43
80
  "/opt/homebrew/bin/mnemon",
@@ -112,4 +149,4 @@ function findMnemonCommand(config, options = {}) {
112
149
  for (const path of commonCliPaths(platform, env, home)) if (isExecutable(path)) return path;
113
150
  }
114
151
  //#endregion
115
- export { findMnemonCommand, isMnemonExecutable, mnemonNpmLauncher, nodeLauncherEnvironment };
152
+ export { findMnemonCommand, isMnemonExecutable, mnemonNpmLauncher, nodeLauncherEnvironment, resolveMnemonInvocation };
@@ -16,6 +16,7 @@ export declare function OverviewPage(props: {
16
16
  client: MemorySpacesPageClient;
17
17
  metadataClient: MemorySpacesPageClient;
18
18
  revision: number;
19
+ reloadKey?: number;
19
20
  activationEnabled: boolean;
20
21
  writeEnabled: boolean;
21
22
  agentAvailable: boolean;
@@ -61,7 +62,7 @@ export declare function RememberPage(props: {
61
62
  seed: string;
62
63
  onMutate: () => void;
63
64
  onClose: () => void;
64
- onComplete?: () => void;
65
+ onView?: () => void;
65
66
  }): JSX.Element;
66
67
  export declare function ListPage(props: {
67
68
  client: MemorySpacesPageClient;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-mnemon-source-memory-spaces",
3
- "version": "0.5.11",
3
+ "version": "0.5.13",
4
4
  "description": "Memory Spaces Source and its private Provider SDK.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -55,8 +55,8 @@
55
55
  },
56
56
  "peerDependencies": {
57
57
  "@deepseek-ai/cordis": "^4.0.1",
58
- "@deepseek-ai/dsh-client-ui-primitives": "^0.1.7-rc.2",
59
- "dsh-mnemon": "^0.5.1",
58
+ "@deepseek-ai/dsh-client-ui-primitives": "^0.1.7-rc.2 || ^0.2.0-rc.1",
59
+ "dsh-mnemon": "^0.5.19",
60
60
  "react": "^18.2.0"
61
61
  },
62
62
  "devDependencies": {
@@ -65,13 +65,13 @@
65
65
  "@types/node": "^22.0.0",
66
66
  "@types/react": "^18.3.0",
67
67
  "@types/react-dom": "^18.3.0",
68
- "dsh-mnemon": "^0.5.17",
68
+ "dsh-mnemon": "^0.5.19",
69
69
  "dsh-mnemon-provider-byterover": "^0.5.5",
70
70
  "dsh-mnemon-provider-hindsight": "^0.5.5",
71
71
  "dsh-mnemon-provider-holographic": "^0.5.5",
72
72
  "dsh-mnemon-provider-honcho": "^0.5.5",
73
73
  "dsh-mnemon-provider-mem0": "^0.5.5",
74
- "dsh-mnemon-provider-mnemon-native": "^0.5.6",
74
+ "dsh-mnemon-provider-mnemon-native": "^0.5.7",
75
75
  "dsh-mnemon-provider-openviking": "^0.5.7",
76
76
  "dsh-mnemon-provider-retaindb": "^0.5.5",
77
77
  "dsh-mnemon-provider-supermemory": "^0.5.5",
@@ -13,10 +13,10 @@
13
13
  "nav.bodies": "记忆空间",
14
14
  "nav.search": "检索",
15
15
  "nav.entities": "实体",
16
- "nav.rememberAction": "沉淀记忆",
16
+ "nav.rememberAction": "存入记忆",
17
17
  "nav.content": "内容",
18
18
  "overview.title": "记忆空间",
19
- "overview.description": "统一管理由 Mnemon Native 或第三方 Provider 承载的记忆空间;已激活的空间共同参与读取、路由与实时快照。",
19
+ "overview.description": "由 Mnemon Native 或第三方 Provider 承载的长期记忆;已激活的空间参与召回。",
20
20
  "overview.pageDescription": "创建和启停记忆空间,查看每个 Provider 的存储状态与实时关联快照。",
21
21
  "overview.interval": "进入时全量同步 · 点击卡片按需同步",
22
22
  "overview.fullSyncPending": "等待首次全量同步",
@@ -25,11 +25,8 @@
25
25
  "overview.fullSyncMinutes": "上次全量同步:{count} 分钟前",
26
26
  "overview.fullSyncHours": "上次全量同步:{count} 小时前",
27
27
  "overview.fullSyncDays": "上次全量同步:{count} 天前",
28
- "overview.syncing": "同步中…",
29
- "overview.syncNow": "立即同步",
30
28
  "overview.directory": "记忆空间目录",
31
- "overview.directory.description": "每张卡片对应一个记忆空间。第三方 Provider 首次接入时建立映射,之后点击卡片只检测该空间;本地维护的标题与说明不会被重连覆盖。",
32
- "overview.directory.waiting": "等待目录",
29
+ "overview.directory.description": "每张卡片是一个记忆空间;点击卡片检查连接,开关决定它是否参与召回。",
33
30
  "overview.directory.unsynced": "目录尚未同步",
34
31
  "overview.directory.unsyncedBadge": "目录待同步",
35
32
  "overview.directoryLoading": "正在加载记忆空间目录",
@@ -41,7 +38,7 @@
41
38
  "overview.reconnectHint": "点击卡片重新检测并同步这个记忆空间",
42
39
  "overview.reconnectAria": "重新连接{name}",
43
40
  "overview.snapshotLoading": "正在加载多记忆空间实时快照",
44
- "overview.metadataAction": "AI 维护元信息",
41
+ "overview.metadataAction": "整理名称与说明",
45
42
  "overview.metadataTitle": "AI 维护记忆空间元信息",
46
43
  "overview.metadataDescription": "选择一个或多个已激活记忆空间。系统会分别通过各 Provider 最快的原生查询路径读取少量样本,再由独立任务 Agent 生成标题与说明。",
47
44
  "overview.metadataUnavailable": "暂时无法运行:未找到与当前记忆范围匹配的活跃 Agent",
@@ -72,13 +69,13 @@
72
69
  "overview.noActiveTitle": "没有激活的记忆空间",
73
70
  "overview.noActiveText": "开启至少一个记忆空间的读取开关,即可在这里聚合它的实时图谱。",
74
71
  "overview.noContentTitle": "已激活记忆空间尚无内容",
75
- "overview.noContentText": "向任意记忆空间沉淀稳定上下文后,这里会聚合呈现节点与关系。",
72
+ "overview.noContentText": "存入记忆后,这里会显示节点与关系。",
76
73
  "overview.createTitle": "创建记忆空间",
77
74
  "overview.createDialogHint": "这里定义记忆空间用途并选择底层 Provider;服务、凭据和全局数据位置沿用“插件 → 可组合记忆”页面中的配置。",
78
75
  "overview.createIdentityTitle": "记忆空间信息",
79
76
  "overview.createIdentityHint": "名称用于识别;描述会帮助 Agent 判断什么内容应写入和召回。",
80
77
  "overview.createPlacementTitle": "记忆空间 Provider",
81
- "overview.createPlacementHint": "这是一次明确的手动创建;选择一个已启用 Provider。自动选择由“沉淀策略”统一管理。",
78
+ "overview.createPlacementHint": "这是一次明确的手动创建;选择一个已启用 Provider。任务 Agent 新建空间时的选择在“新空间的 Provider”中设置。",
82
79
  "overview.createName": "新记忆空间名称",
83
80
  "overview.createNamePlaceholder": "名称",
84
81
  "overview.createDescription": "新记忆空间描述",
@@ -107,7 +104,7 @@
107
104
  "overview.capability.exact-write": "精确写入",
108
105
  "overview.capability.forget": "安全遗忘",
109
106
  "overview.candidateNativeReady": "官方原生 · 跟随当前记忆范围",
110
- "overview.providerServiceRequired": "尚未启用;请先在“插件 → 可组合记忆”页面完成服务配置",
107
+ "overview.providerServiceRequired": "未启用",
111
108
  "overview.nativeCliRequired": "需要在本机安装 Mnemon CLI;其他 Provider 不受影响",
112
109
  "overview.workspaceBinding.automatic": "跟随当前记忆范围",
113
110
  "overview.workspaceBinding.optional-override": "跟随当前范围;全局可自定义位置",
@@ -124,21 +121,19 @@
124
121
  "overview.providerLabel": "记忆引擎",
125
122
  "overview.nativeOfficial": "官方原生",
126
123
  "overview.providerNativeHint": "官方原生、本地优先,保留完整图谱与软删除能力",
127
- "strategy.action": "沉淀策略",
128
- "strategy.title": "沉淀策略",
129
- "strategy.description": "定义 Agent 在沉淀过程中需要新建记忆空间时,如何选择底层 Provider。已有记忆空间仍会优先按名称、描述与能力路由。",
124
+ "strategy.action": "新空间的 Provider",
125
+ "strategy.title": "新空间的 Provider",
126
+ "strategy.description": "任务 Agent 需要新建记忆空间时,如何选择 Provider;已有空间仍按名称与说明路由。",
130
127
  "strategy.loading": "正在读取 Provider 目录…",
131
128
  "strategy.modeTitle": "Provider 选择方式",
132
- "strategy.modeHint": "该策略只影响 Agent 沉淀时的新记忆空间创建;手动点击“创建记忆空间”始终由你指定。",
129
+ "strategy.modeHint": "只影响任务 Agent 新建的记忆空间;手动创建时始终由你指定。",
133
130
  "strategy.manualHint": "固定使用一个 Provider,Agent 无法改选",
134
131
  "strategy.automaticHint": "先执行硬规则,再由任务 Agent 选择合格 Provider",
135
132
  "strategy.manualTitle": "固定 Provider",
136
133
  "strategy.manualDescription": "当现有记忆空间都不适合时,新记忆空间固定创建在这个 Provider 中。",
137
134
  "strategy.automaticTitle": "智能选择规则",
138
135
  "strategy.automaticDescription": "数据边界与能力要求由主机强制执行,Prompt 只影响合格候选之间的判断。",
139
- "strategy.taskAgentReady": "任务 Agent 就绪",
140
- "strategy.taskAgentUnavailable": "等待任务 Agent",
141
- "strategy.save": "保存策略",
136
+ "strategy.save": "保存",
142
137
  "strategy.saving": "保存中…",
143
138
  "overview.providerOpenVikingHint": "连接已有 OpenViking 服务,由记忆空间工作流统一调度",
144
139
  "overview.providerSummary.mnemon-native": "官方原生、本地优先,保留完整图谱与软删除能力",
@@ -256,7 +251,7 @@
256
251
  "graph.kindSpace": "记忆空间",
257
252
  "graph.kindEntity": "实体",
258
253
  "search.title": "检索记忆",
259
- "search.description": "跨已激活记忆空间检索原始证据;每个 Provider 使用自己的原生召回方式并保留来源。",
254
+ "search.description": "在已激活的记忆空间中检索:直接检索返回原文,Agent 查询给出带引用的回答。",
260
255
  "search.maxResults": "最多 {count} 条",
261
256
  "search.placeholder": "为什么选用 SQLite?这个项目有哪些发布约定?",
262
257
  "search.queryAria": "记忆查询",
@@ -283,7 +278,7 @@
283
278
  "search.noRelated": "没有找到两跳内的关联节点。",
284
279
  "search.sourcesTitle": "本次检索范围",
285
280
  "entities.title": "实体查阅",
286
- "entities.description": "只在真正提供实体索引的记忆空间中,查阅实体跨越事实、决策与上下文的关系。",
281
+ "entities.description": "查看实体在事实、决策与上下文之间的关联。",
287
282
  "entities.sourcesTitle": "实体能力范围",
288
283
  "entities.unsupportedTitle": "没有支持实体索引的记忆空间",
289
284
  "entities.unsupportedText": "当前激活 Provider 仍可通过“检索”召回,但不会在这里伪装成实体图谱。",
@@ -301,52 +296,41 @@
301
296
  "entities.selectText": "实体视图会聚合与它相关的记忆,而不是只做字面匹配。",
302
297
  "entities.emptyTitle": "没有关联记忆",
303
298
  "entities.emptyText": "尝试更完整的名称或另一个实体别名。",
304
- "remember.title": "沉淀记忆",
305
- "remember.description": "候选内容会进入无会话历史的独立任务 Agent,由它选择记忆空间、查重、提炼并执行写入,不占用主对话上下文。",
299
+ "remember.title": "存入记忆",
300
+ "remember.description": "任务 Agent 会判断是否值得保存,去重、提炼后写入合适的记忆空间,不占用当前对话。",
306
301
  "remember.readOnlyTitle": "当前为只读模式",
307
302
  "remember.readOnlyText": "当前部署禁止记忆写入;如需调整,请修改 DSH 的 Mnemon 配置并保存。",
308
- "remember.delegateTitle": "交给独立任务 Agent",
309
- "remember.noSession": "无可用会话",
310
- "remember.ready": "独立任务 Agent 就绪",
311
- "remember.noTaskAgent": "任务 Agent 不可用",
312
- "remember.taskAgentReady": "任务 Agent 就绪",
313
303
  "remember.candidate": "候选内容",
314
- "remember.candidateAria": "待沉淀内容",
315
- "remember.placeholder": "输入希望跨任务保留的背景、偏好、决策或洞察。模型会先判断它是否真的值得沉淀。",
304
+ "remember.placeholder": "输入希望长期保留的背景、偏好、决策或结论。",
316
305
  "remember.sessionHint": "当前视图没有可用的模型路由,无法创建独立任务 Agent。",
317
306
  "remember.taskAgentHint": "当前 Host 暂时无法创建独立任务 Agent,请刷新状态后重试。",
318
- "remember.processing": "独立任务 Agent 处理中…",
319
- "remember.action": "调度独立任务 Agent 判断并沉淀",
320
- "remember.advanced": "人工高级选项",
321
- "remember.advancedHint": "为独立任务 Agent 指定目标记忆空间与元数据约束",
307
+ "remember.processing": "任务 Agent 处理中…",
308
+ "remember.action": "交给任务 Agent",
309
+ "remember.advanced": "高级选项",
310
+ "remember.advancedHint": "指定目标记忆空间、分类与重要性",
322
311
  "remember.expand": "展开",
323
312
  "remember.target": "目标记忆空间",
324
313
  "remember.asyncProviderHint": "该记忆空间会等待远程提炼任务完成后再返回真实写入回执。",
325
314
  "remember.entities": "实体(逗号分隔)",
326
315
  "remember.tags": "标签(逗号分隔)",
327
- "remember.advancedText": "高级选项是约束而不是绕过监督;独立任务 Agent 仍会查重并返回结构化回执。",
328
- "remember.saving": "独立任务 Agent 写入中…",
329
- "remember.advancedAction": "按高级约束沉淀",
330
- "remember.skipped": "独立任务 Agent 判断无需写入",
331
- "remember.completed": "独立任务 Agent 已完成处理",
332
- "remember.processed": "独立任务 Agent 已处理:{action}",
333
- "remember.dispatchFailed": "调度失败:{error}",
334
- "remember.saveFailed": "保存失败:{error}",
316
+ "remember.advancedText": "这些约束同样经过任务 Agent 的去重与回执。",
317
+ "remember.saving": "任务 Agent 处理中…",
318
+ "remember.advancedAction": "按约束交给任务 Agent",
335
319
  "content.title": "记忆内容",
336
- "content.description": "按 Provider 的真实浏览契约检查可观察内容;列表型、查询型与不可浏览引擎会明确区分。",
320
+ "content.description": "浏览各记忆空间保存的内容。",
337
321
  "content.sourcesTitle": "Provider 内容模型",
338
322
  "content.count": "{count} 条记忆",
339
323
  "content.filterAria": "筛选记忆内容",
340
324
  "content.filterPlaceholder": "按内容或精确 ID 筛选…",
341
325
  "content.categoryAria": "记忆分类",
342
326
  "content.apply": "应用筛选",
343
- "content.notice": "内容页直接调用 Provider 的只读浏览契约;查询型引擎仅在输入查询后执行检索。",
327
+ "content.notice": "查询型 Provider 需要输入关键词后才显示内容。",
344
328
  "content.queryRequiredTitle": "查询型记忆空间等待问题",
345
329
  "content.queryRequiredText": "输入一个明确查询即可读取 ByteRover 等不提供全量列表的 Provider。",
346
330
  "content.showing": "当前显示 {visible} / {total}",
347
331
  "content.showMore": "再显示 {count} 条",
348
332
  "content.emptyTitle": "没有符合条件的记忆",
349
- "content.emptyText": "清空筛选,或前往“沉淀”写入第一条稳定上下文。",
333
+ "content.emptyText": "清空筛选,或先存入第一条记忆。",
350
334
  "nav.spaces": "记忆空间",
351
335
  "overview.editSpace": "编辑",
352
336
  "overview.editSpaceAria": "编辑{name}",
@@ -356,7 +340,10 @@
356
340
  "overview.deleteSpaceAria": "删除{name}",
357
341
  "overview.disconnectSpace": "断开",
358
342
  "overview.disconnectSpaceAria": "断开{name}",
359
- "overview.deletingSpace": "删除中…"
343
+ "overview.deletingSpace": "删除中…",
344
+ "common.score": "相关度 {value}",
345
+ "overview.providerEnableHint": "未启用的 Provider 可在“插件 → 可组合记忆”的“记忆空间”页面中启用。",
346
+ "search.citations": "引用"
360
347
  },
361
348
  "en": {
362
349
  "term.space": "Memory Space",
@@ -372,10 +359,10 @@
372
359
  "nav.bodies": "Memory Spaces",
373
360
  "nav.search": "Recall",
374
361
  "nav.entities": "Entities",
375
- "nav.rememberAction": "Remember",
362
+ "nav.rememberAction": "Save to memory",
376
363
  "nav.content": "Content",
377
364
  "overview.title": "Memory Spaces",
378
- "overview.description": "Manage memory spaces backed by Mnemon Native or third-party Providers. Active spaces participate in reads, routing, and live snapshots.",
365
+ "overview.description": "Long-term memory held by Mnemon Native or third-party Providers; active spaces take part in recall.",
379
366
  "overview.pageDescription": "Create and activate Memory Spaces, then inspect storage health and live relation snapshots across providers.",
380
367
  "overview.interval": "Full sync on entry · Click a card to sync on demand",
381
368
  "overview.fullSyncPending": "Waiting for the first full sync",
@@ -384,11 +371,8 @@
384
371
  "overview.fullSyncMinutes": "Last full sync: {count}m ago",
385
372
  "overview.fullSyncHours": "Last full sync: {count}h ago",
386
373
  "overview.fullSyncDays": "Last full sync: {count}d ago",
387
- "overview.syncing": "Syncing…",
388
- "overview.syncNow": "Sync now",
389
374
  "overview.directory": "Memory Space Directory",
390
- "overview.directory.description": "Each card represents a memory space. A third-party Provider creates its mapping on first connection; later card clicks check only that space, without overwriting locally maintained titles or descriptions.",
391
- "overview.directory.waiting": "Waiting for directory",
375
+ "overview.directory.description": "Each card is one Memory Space; click it to check the connection, and use its switch to include it in recall.",
392
376
  "overview.directory.unsynced": "Directory not synchronized",
393
377
  "overview.directory.unsyncedBadge": "Directory pending",
394
378
  "overview.directoryLoading": "Loading the Memory Space directory",
@@ -400,7 +384,7 @@
400
384
  "overview.reconnectHint": "Click the card to reconnect and synchronize this Memory Space",
401
385
  "overview.reconnectAria": "Reconnect {name}",
402
386
  "overview.snapshotLoading": "Loading the multi-space live snapshot",
403
- "overview.metadataAction": "AI metadata",
387
+ "overview.metadataAction": "Tidy names and descriptions",
404
388
  "overview.metadataTitle": "Maintain Memory Space metadata with AI",
405
389
  "overview.metadataDescription": "Select one or more active Memory Spaces. The system reads a small sample through each Provider’s fastest native path, then gives each space to an independent task Agent for its title and description.",
406
390
  "overview.metadataUnavailable": "Temporarily unavailable: no active Agent matches the current memory scope",
@@ -431,13 +415,13 @@
431
415
  "overview.noActiveTitle": "No active Memory Spaces",
432
416
  "overview.noActiveText": "Enable read access for at least one space to aggregate its live graph here.",
433
417
  "overview.noContentTitle": "Active spaces have no content yet",
434
- "overview.noContentText": "Distill durable context into a space to populate nodes and relations.",
418
+ "overview.noContentText": "Save memories to see their nodes and relations here.",
435
419
  "overview.createTitle": "Create Memory Space",
436
420
  "overview.createDialogHint": "Define this Memory Space and choose its provider here. It reuses services, credentials, and global data locations configured on the dsh-mnemon page under Plugins.",
437
421
  "overview.createIdentityTitle": "Memory Space details",
438
422
  "overview.createIdentityHint": "The name identifies the space; the description guides when the agent writes and recalls it.",
439
423
  "overview.createPlacementTitle": "Memory Space provider",
440
- "overview.createPlacementHint": "This is an explicit manual creation. Choose one enabled Provider; automatic selection is managed by Distillation Strategy.",
424
+ "overview.createPlacementHint": "This is an explicit manual creation; choose one enabled Provider. What a task Agent chooses for new spaces is set in Provider for new spaces.",
441
425
  "overview.createName": "New Memory Space name",
442
426
  "overview.createNamePlaceholder": "Name",
443
427
  "overview.createDescription": "New Memory Space description",
@@ -466,7 +450,7 @@
466
450
  "overview.capability.exact-write": "Exact writes",
467
451
  "overview.capability.forget": "Safe forget",
468
452
  "overview.candidateNativeReady": "Official native · follows the active memory scope",
469
- "overview.providerServiceRequired": "Not enabled; configure the service on the dsh-mnemon page under Plugins first",
453
+ "overview.providerServiceRequired": "Off",
470
454
  "overview.nativeCliRequired": "Needs the Mnemon CLI on this machine; other providers work without it",
471
455
  "overview.workspaceBinding.automatic": "Follows the active memory scope",
472
456
  "overview.workspaceBinding.optional-override": "Follows the active scope; global location can be customized",
@@ -483,21 +467,19 @@
483
467
  "overview.providerLabel": "Memory engine",
484
468
  "overview.nativeOfficial": "Official native",
485
469
  "overview.providerNativeHint": "Official native, local-first storage with the full graph and soft-delete semantics",
486
- "strategy.action": "Distillation strategy",
487
- "strategy.title": "Distillation strategy",
488
- "strategy.description": "Choose how the Agent selects a Provider when it must create a new Memory Space during distillation. Existing spaces are still routed by name, description, and capabilities first.",
470
+ "strategy.action": "Provider for new spaces",
471
+ "strategy.title": "Provider for new spaces",
472
+ "strategy.description": "How a task Agent picks a Provider when it creates a Memory Space; existing spaces are still chosen by name and description.",
489
473
  "strategy.loading": "Loading Provider directory…",
490
474
  "strategy.modeTitle": "Provider selection",
491
- "strategy.modeHint": "This policy applies only to Agent-created spaces during distillation. Manual Create Memory Space always asks you to choose.",
475
+ "strategy.modeHint": "Applies only to spaces a task Agent creates; you always choose when you create one yourself.",
492
476
  "strategy.manualHint": "Fix one Provider; the Agent cannot override it",
493
477
  "strategy.automaticHint": "Apply hard rules first, then let the task Agent choose an eligible Provider",
494
478
  "strategy.manualTitle": "Fixed Provider",
495
479
  "strategy.manualDescription": "When no existing space fits, create the new space on this Provider.",
496
480
  "strategy.automaticTitle": "Smart selection rules",
497
481
  "strategy.automaticDescription": "The host enforces data and capability rules. The prompt only guides judgment among eligible candidates.",
498
- "strategy.taskAgentReady": "Task Agent ready",
499
- "strategy.taskAgentUnavailable": "Waiting for task Agent",
500
- "strategy.save": "Save strategy",
482
+ "strategy.save": "Save",
501
483
  "strategy.saving": "Saving…",
502
484
  "overview.providerOpenVikingHint": "Connect an existing OpenViking service under the same Memory Space workflow",
503
485
  "overview.providerSummary.mnemon-native": "Official native, local-first storage with the full graph and soft-delete semantics",
@@ -615,7 +597,7 @@
615
597
  "graph.kindSpace": "Memory Space",
616
598
  "graph.kindEntity": "Entity",
617
599
  "search.title": "Recall Memory",
618
- "search.description": "Retrieve raw evidence across active Memory Spaces; every provider uses its native recall method and keeps provenance.",
600
+ "search.description": "Search the active Memory Spaces: direct search returns the stored text, an Agent query answers with citations.",
619
601
  "search.maxResults": "Up to {count} results",
620
602
  "search.placeholder": "Why did we choose SQLite? What release conventions apply?",
621
603
  "search.queryAria": "Memory query",
@@ -642,7 +624,7 @@
642
624
  "search.noRelated": "No related nodes found within two hops.",
643
625
  "search.sourcesTitle": "Search coverage",
644
626
  "entities.title": "Entity Explorer",
645
- "entities.description": "Inspect entity connections only in Memory Spaces that expose a real entity index.",
627
+ "entities.description": "See how entities connect facts, decisions and context.",
646
628
  "entities.sourcesTitle": "Entity capability coverage",
647
629
  "entities.unsupportedTitle": "No active space exposes an entity index",
648
630
  "entities.unsupportedText": "The active providers remain searchable through Recall, but are not presented here as a fabricated entity graph.",
@@ -660,52 +642,41 @@
660
642
  "entities.selectText": "The entity view aggregates related memories instead of relying on literal matching.",
661
643
  "entities.emptyTitle": "No related memories",
662
644
  "entities.emptyText": "Try the full name or another entity alias.",
663
- "remember.title": "Distill Memory",
664
- "remember.description": "An independent task Agent with no conversation history selects a Memory Space, checks duplicates, distills the candidate, and completes the write without filling the main conversation context.",
645
+ "remember.title": "Save to memory",
646
+ "remember.description": "A task Agent decides whether this is worth keeping, removes duplicates, distills it and writes it to the right Memory Space, outside this conversation.",
665
647
  "remember.readOnlyTitle": "Read-only mode",
666
648
  "remember.readOnlyText": "This deployment disables memory writes. Change and save the DSH Mnemon configuration to enable them.",
667
- "remember.delegateTitle": "Send to independent task Agent",
668
- "remember.noSession": "No live session",
669
- "remember.ready": "Independent task Agent ready",
670
- "remember.noTaskAgent": "Task Agent unavailable",
671
- "remember.taskAgentReady": "Task Agent ready",
672
649
  "remember.candidate": "Candidate",
673
- "remember.candidateAria": "Memory candidate",
674
- "remember.placeholder": "Enter background, preferences, decisions, or insights worth retaining across tasks. The model decides whether they qualify.",
650
+ "remember.placeholder": "Background, preferences, decisions or conclusions worth keeping.",
675
651
  "remember.sessionHint": "No usable model route is available for an independent task Agent.",
676
652
  "remember.taskAgentHint": "The Host cannot currently create an isolated task Agent. Refresh status and try again.",
677
- "remember.processing": "Independent task Agent is working…",
678
- "remember.action": "Evaluate and distill",
679
- "remember.advanced": "Advanced human constraints",
680
- "remember.advancedHint": "Constrain the target Memory Space and metadata",
653
+ "remember.processing": "Task Agent working…",
654
+ "remember.action": "Send to task Agent",
655
+ "remember.advanced": "Advanced options",
656
+ "remember.advancedHint": "Choose the target space, category and importance",
681
657
  "remember.expand": "Expand",
682
658
  "remember.target": "Target Memory Space",
683
659
  "remember.asyncProviderHint": "This Memory Space waits for remote extraction to settle before returning a truthful write receipt.",
684
660
  "remember.entities": "Entities (comma-separated)",
685
661
  "remember.tags": "Tags (comma-separated)",
686
- "remember.advancedText": "Advanced options constrain the independent task Agent; they do not bypass supervision or duplicate checks.",
687
- "remember.saving": "Independent task Agent is writing…",
688
- "remember.advancedAction": "Distill with constraints",
689
- "remember.skipped": "The independent task Agent decided not to write",
690
- "remember.completed": "The independent task Agent completed processing",
691
- "remember.processed": "Independent task Agent processed: {action}",
692
- "remember.dispatchFailed": "Dispatch failed: {error}",
693
- "remember.saveFailed": "Save failed: {error}",
662
+ "remember.advancedText": "Constraints still go through the task Agent’s duplicate check and receipt.",
663
+ "remember.saving": "Task Agent working…",
664
+ "remember.advancedAction": "Send with constraints",
694
665
  "content.title": "Memory Content",
695
- "content.description": "Inspect observable content through each provider’s real browse contract, with enumerable, query-only, and unavailable engines kept distinct.",
666
+ "content.description": "Browse what each Memory Space holds.",
696
667
  "content.sourcesTitle": "Provider content models",
697
668
  "content.count": "{count} memories",
698
669
  "content.filterAria": "Filter memory content",
699
670
  "content.filterPlaceholder": "Filter by content or exact ID…",
700
671
  "content.categoryAria": "Memory category",
701
672
  "content.apply": "Apply filters",
702
- "content.notice": "Content calls each provider’s read-only browse contract directly; query-only engines run only after you enter a query.",
673
+ "content.notice": "Query-only Providers show content once you enter a query.",
703
674
  "content.queryRequiredTitle": "Query-only spaces are waiting",
704
675
  "content.queryRequiredText": "Enter a focused query to inspect providers such as ByteRover that do not expose a complete list.",
705
676
  "content.showing": "Showing {visible} / {total}",
706
677
  "content.showMore": "Show {count} more",
707
678
  "content.emptyTitle": "No matching memories",
708
- "content.emptyText": "Clear the filters or distill the first durable memory.",
679
+ "content.emptyText": "Clear the filters or save a first memory.",
709
680
  "nav.spaces": "Memory Spaces",
710
681
  "overview.editSpace": "Edit",
711
682
  "overview.editSpaceAria": "Edit {name}",
@@ -715,6 +686,9 @@
715
686
  "overview.deleteSpaceAria": "Delete {name}",
716
687
  "overview.disconnectSpace": "Disconnect",
717
688
  "overview.disconnectSpaceAria": "Disconnect {name}",
718
- "overview.deletingSpace": "Deleting…"
689
+ "overview.deletingSpace": "Deleting…",
690
+ "common.score": "Score {value}",
691
+ "overview.providerEnableHint": "Turn on more Providers on Memory Spaces’ page under Plugins → dsh-mnemon.",
692
+ "search.citations": "Cites"
719
693
  }
720
694
  }