dsh-layered-memory 0.8.7 → 0.8.8

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.
@@ -0,0 +1,615 @@
1
+ /**
2
+ * RPC 契约单一事实源(types-only,零运行时代码)。
3
+ *
4
+ * 把 host(src/stats.ts 的 case 表)与 client(client/src,浏览器侧)共用的
5
+ * 23 个 `dsh-memory/*` 端点请求/响应类型收敛到本模块——两端各自 `import type`,
6
+ * 契约漂移在编译期暴露,而不是等 UI 渲染出 undefined 才发现。
7
+ *
8
+ * 铁律:
9
+ * - 本文件**只允许 type/interface 与纯类型推导**,不 import 任何运行时值
10
+ * (tsc 会产出空 contract.js,client bundle 里 import type 被 esbuild 擦除);
11
+ * - 被迁移进来的类型在原模块保留 `export type { … } from './contract.js'`
12
+ * re-export,既有 import 路径不断裂;
13
+ * - 响应类型按 stats.ts 实际返回逐字段建模(含 `chain.current[].reasoningEffort`
14
+ * 与 `chain.effectiveChain[].effort` 这对**故意不同名**的字段——链上两种条目
15
+ * 形状不同,不合并)。
16
+ */
17
+ import type { MemoryFamily, MemoryMode } from './types.js';
18
+ /** 蒸馏思考档位:'' = 自动(模型默认档 → high)。词汇表运行时源是 config.ts 的
19
+ * EFFORT_CHOICES(`satisfies readonly EffortChoice[]` 反向锁定防漂移)。 */
20
+ export type EffortChoice = '' | 'off' | 'none' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
21
+ /** 蒸馏用量/成本记账的层标识(llm-usage.ts 计数器口径)。 */
22
+ export type DistillLayer = 'l1-extract' | 'l1-dedup' | 'l2' | 'l3';
23
+ /** 分层输出预算的层键(与 DistillLayer 不同:预算按管线阶段分四层,用量按调用点分四层)。 */
24
+ export type DistillBudgetLayer = 'extract' | 'dedup' | 'l2' | 'l3';
25
+ /** 分层输出预算(token):0 = 跟随内置默认。 */
26
+ export type DistillBudgets = Record<DistillBudgetLayer, number>;
27
+ /**
28
+ * 运行时统一路由链条目:[0] = 主路由(provider/model 双空 = 跟随默认模型),
29
+ * [1..] = 回退链(按序降级);reasoningEffort 为该路由的档位覆盖('' = 跟随部署全局)。
30
+ */
31
+ export interface DistillChainEntry {
32
+ provider: string;
33
+ model: string;
34
+ reasoningEffort: EffortChoice;
35
+ }
36
+ /** 部署静态回退链条目(config.llm.fallbacks):reasoningEffort 可选——与运行时链
37
+ * DistillChainEntry(必填)形状不同,不共用类型。 */
38
+ export interface StaticFallbackEntry {
39
+ provider: string;
40
+ model: string;
41
+ reasoningEffort?: string;
42
+ }
43
+ /** 记忆模式运行时开关(settings-get/set 的 settings 载荷)。 */
44
+ export interface MemoryLiveSettings {
45
+ /** 总开关:关 = 捕获/蒸馏/召回注入全停(数据保留) */
46
+ enabled: boolean;
47
+ /** L0 捕获(原始对话落盘) */
48
+ capture: boolean;
49
+ /** L1 抽取 + L2/L3 蒸馏 */
50
+ distill: boolean;
51
+ /** 召回注入(画像/记忆上下文) */
52
+ recall: boolean;
53
+ /** 蒸馏思考档位运行时覆盖:'' = 跟随静态 config(llm.reasoningEffort) */
54
+ reasoningEffort: EffortChoice;
55
+ /** 蒸馏模型运行时覆盖(供应商 id):'' = 跟随静态 config/默认选择。
56
+ * 与 distillModel 成对生效(单字段不算);部署静态 pin(provider+model 双字段)优先。 */
57
+ distillProvider: string;
58
+ /** 蒸馏模型运行时覆盖(模型 id):'' = 跟随静态 config/默认选择。 */
59
+ distillModel: string;
60
+ /** 运行时统一路由链(统一列表 UI 的存储形态,见 DistillChainEntry);
61
+ * 非空即权威(旧 distillProvider/distillModel/reasoningEffort 不再参与),
62
+ * 空数组 = 跟随部署静态配置与默认模型。 */
63
+ distillChain: DistillChainEntry[];
64
+ /** 分层输出预算运行时覆盖(token):extract/dedup/l2/l3 四层,0 = 跟随内置默认;
65
+ * 思考档 high/max 的 ×4 放大在覆盖值之上照常生效。 */
66
+ distillBudgets: DistillBudgets;
67
+ /** 输入预算运行时覆盖(字符,≈token):单次蒸馏调用的输入上限,L1 按此分块、
68
+ * 超限截断;0 = 跟随静态配置 llm.maxInputChars。 */
69
+ distillMaxInputChars: number;
70
+ }
71
+ /** 单会话召回统计(悬浮卡信息区数据源;口径见 recall.ts 注释)。 */
72
+ export interface RecallSessionStats {
73
+ /** 发生过召回检索的轮次数(含零命中、全量压制与超时)。 */
74
+ injectedTurns: number;
75
+ /** 命中(≥1 条实际注入,或有命中但被去重全量压制)轮次数。 */
76
+ hitTurns: number;
77
+ /** 累计注入条数(去重过滤后、预算截断前)。 */
78
+ totalHits: number;
79
+ /** 总预算超时跳过次数。 */
80
+ timeouts: number;
81
+ /** 累计被去重压制的命中条数(同会话已注入过,不重复注入)。 */
82
+ suppressedRecalls: number;
83
+ /** 最近一轮实际注入条数(0 = 零命中/超时/全量压制;工具指南门控沿用此信号)。 */
84
+ lastHits: number;
85
+ /** 最近一轮检索耗时 ms。 */
86
+ lastDurationMs: number;
87
+ /** 最近一次记账时间(LRU 清理依据)。 */
88
+ updatedAt: number;
89
+ }
90
+ /** 重建阶段。 */
91
+ export type RebuildPhase = 'idle' | 'preparing' | 'distilling' | 'finalizing' | 'done' | 'cancelled' | 'failed';
92
+ /** 重建状态(rebuild-status/start/cancel 端点返回值)。 */
93
+ export interface RebuildStatus {
94
+ running: boolean;
95
+ phase: RebuildPhase;
96
+ /** 已完成的会话块数 / 总块数。 */
97
+ done: number;
98
+ total: number;
99
+ /** L0 体量(idle 时为实时预估,运行中为快照值)。 */
100
+ sessionCount: number;
101
+ messageCount: number;
102
+ /** 预计 LLM 抽取调用次数(下界估算:块数与字符预算取大)。 */
103
+ estCalls: number;
104
+ /** 重建产出的 L1 记录累计条数。 */
105
+ recordsBuilt: number;
106
+ cancelRequested: boolean;
107
+ startedAt: number | null;
108
+ finishedAt: number | null;
109
+ error: string | null;
110
+ /** 归档产物名(提示用户可手工找回)。 */
111
+ archiveNote: string | null;
112
+ }
113
+ /** 概览统计(dsh-memory/stats 端点返回值)。 */
114
+ export interface MemoryStats {
115
+ ok: boolean;
116
+ dataDir: string;
117
+ /** 新会话默认记忆档位(auto/chat/work)。 */
118
+ family: string;
119
+ version: string;
120
+ l0Today: number;
121
+ l1Count: number;
122
+ l1TotalExtracted: number;
123
+ sceneCount: number;
124
+ personaChars: number;
125
+ hasPersona: boolean;
126
+ lastExtractAt: string | null;
127
+ lastL2At: string | null;
128
+ lastL3At: string | null;
129
+ memoriesSinceL2: number;
130
+ memoriesSinceL3: number;
131
+ pendingExtract: number;
132
+ message: string;
133
+ /** 实际生效的阈值(概览进度分母用,避免 UI 硬编码与部署配置脱节)。 */
134
+ thresholds: {
135
+ l2MinNewMemories: number;
136
+ l3Interval: number;
137
+ };
138
+ }
139
+ /** 成本看板时间粒度(趋势图 + 统计口径共用)。 */
140
+ export type Granularity = 'day' | 'week' | 'month';
141
+ /** 成本看板单个时间窗口(day/week/month/all)。 */
142
+ export interface CostWindow {
143
+ range: 'day' | 'week' | 'month' | 'all';
144
+ /** 窗口起点(毫秒;all 为 0)。 */
145
+ since: number;
146
+ calls: number;
147
+ inputChars: number;
148
+ outputTokens: number;
149
+ reasoningTokens: number;
150
+ avgOutputTokens: number;
151
+ medianOutputTokens: number;
152
+ }
153
+ /** 每模型统计指标(层级表格行;均值/中位数按 since=0 全量历史的活跃桶口径,非「最近窗口」)。 */
154
+ export interface ModelMetrics {
155
+ model: string;
156
+ dayCalls: number;
157
+ weekCalls: number;
158
+ monthCalls: number;
159
+ dayOutput: number;
160
+ dayMedian: number;
161
+ weekOutput: number;
162
+ weekMedian: number;
163
+ monthOutput: number;
164
+ monthMedian: number;
165
+ }
166
+ /** 每层级(l1/l2/l3)的模型统计(层级表格)。 */
167
+ export interface LayerMetrics {
168
+ layer: 'l1' | 'l2' | 'l3';
169
+ models: ModelMetrics[];
170
+ }
171
+ /** 层级 × 窗口矩阵里的单个窗口格子。 */
172
+ export interface LayerWindow {
173
+ range: 'day' | 'week' | 'month' | 'all';
174
+ calls: number;
175
+ inputChars: number;
176
+ outputTokens: number;
177
+ reasoningTokens: number;
178
+ avgOutputTokens: number;
179
+ medianOutputTokens: number;
180
+ }
181
+ /** 单个层级在四个窗口的聚合(层级×窗口表格行)。 */
182
+ export interface LayerCost {
183
+ layer: 'l1' | 'l2' | 'l3';
184
+ windows: LayerWindow[];
185
+ }
186
+ /** 趋势单桶。 */
187
+ export interface TrendBucket {
188
+ ts: number;
189
+ total: number;
190
+ byModel: Record<string, number>;
191
+ }
192
+ /** 趋势快照:三个层级各一份连续桶序列。 */
193
+ export interface TrendSnapshot {
194
+ granularity: Granularity;
195
+ byLayer: Record<'l1' | 'l2' | 'l3', TrendBucket[]>;
196
+ }
197
+ /** 按 model 分组的成本行(成本看板用)。 */
198
+ export interface CostByModel {
199
+ provider: string;
200
+ model: string;
201
+ calls: number;
202
+ inputChars: number;
203
+ outputTokens: number;
204
+ reasoningTokens: number;
205
+ }
206
+ /** 成本快照(dsh-memory/token-cost 端点返回值)。 */
207
+ export interface CostSnapshot {
208
+ /** day/week/month/all 四窗口聚合。 */
209
+ windows: CostWindow[];
210
+ /** 全量窗口(all)按 model 分组。 */
211
+ byModel: CostByModel[];
212
+ /** 按层级(l1/l2/l3 归并)在四个窗口的聚合(层级×窗口表格)。 */
213
+ byLayer: LayerCost[];
214
+ /** 每层级的模型统计指标(层级表格)。 */
215
+ byLayerStats: LayerMetrics[];
216
+ /** 趋势图数据。 */
217
+ trend: TrendSnapshot;
218
+ }
219
+ /** 嵌入源:远程 / 本地 / 关闭。 */
220
+ export type EmbeddingSourceKind = 'remote' | 'local' | 'off';
221
+ /** 嵌入运行时安装进度(runtime-installer)。 */
222
+ export interface RuntimeProgress {
223
+ phase: 'idle' | 'installing' | 'ready' | 'error' | 'cancelled';
224
+ /** 插件钉死的目标版本。 */
225
+ targetVersion: string;
226
+ /** runtime 里实际就位的版本(未安装为 null)。 */
227
+ installedVersion: string | null;
228
+ startedAt: number;
229
+ /** 已运行毫秒(读时计算)。 */
230
+ elapsedMs: number;
231
+ /** npm 输出尾行(最近 5 行,让用户看到 npm 在干什么)。 */
232
+ lastLines: string[];
233
+ error?: string;
234
+ }
235
+ /** 下载阶段。 */
236
+ export type DownloadPhase = 'downloading' | 'verifying' | 'done' | 'cancelled' | 'error';
237
+ /** 模型下载进度(下载器 getProgress;无活动下载为 null)。 */
238
+ export interface DownloadProgress {
239
+ modelId: string;
240
+ phase: DownloadPhase;
241
+ /** 当前文件序号(1-based)。 */
242
+ fileIndex: number;
243
+ fileCount: number;
244
+ /** 当前文件已收字节(含续传基线)。 */
245
+ fileReceived: number;
246
+ fileTotal: number;
247
+ /** 整模型累计字节(含已完成文件;分母 = 目录总大小)。 */
248
+ overallReceived: number;
249
+ overallTotal: number;
250
+ /** EMA 平滑速度(字节/秒)。 */
251
+ speedBps: number;
252
+ startedAt: number;
253
+ /** phase=error 时的原因。 */
254
+ error?: string;
255
+ }
256
+ /** 嵌入源活切换阶段。 */
257
+ export type ApplyPhase = 'idle' | 'installing-runtime' | 'warming' | 'switching' | 'reindexing' | 'done' | 'error';
258
+ /** 重嵌入进度。 */
259
+ export interface ReindexProgressState {
260
+ running: boolean;
261
+ l1Done: number;
262
+ l1Total: number;
263
+ l0Done: number;
264
+ l0Total: number;
265
+ startedAt: number;
266
+ cancelled: boolean;
267
+ error?: string;
268
+ }
269
+ /** 嵌入源状态视图(embedding-state-get 端点的主体)。 */
270
+ export interface EmbeddingStateView {
271
+ source: EmbeddingSourceKind;
272
+ activeModel: string | null;
273
+ ceilings: {
274
+ remote: boolean;
275
+ local: boolean;
276
+ };
277
+ runtime: RuntimeProgress;
278
+ models: Array<{
279
+ id: string;
280
+ name: string;
281
+ dims: number;
282
+ contextTokens: number;
283
+ tags: string[];
284
+ description: string;
285
+ totalBytes: number;
286
+ bytesOnDisk: number;
287
+ state: 'none' | 'partial' | 'downloaded';
288
+ }>;
289
+ download: DownloadProgress | null;
290
+ apply: {
291
+ phase: ApplyPhase;
292
+ message: string;
293
+ startedAt: number;
294
+ busy: boolean;
295
+ };
296
+ local: {
297
+ state: 'idle' | 'loading' | 'ready' | 'failed' | 'terminated';
298
+ error: string | null;
299
+ } | null;
300
+ reindex: ReindexProgressState;
301
+ activeNote?: string;
302
+ }
303
+ /** dsh-memory/stats */
304
+ export interface StatsResponse extends MemoryStats {
305
+ }
306
+ /** dsh-memory/token-cost */
307
+ export interface TokenCostRequest {
308
+ granularity?: Granularity;
309
+ /** 正整数且 ≤ 明细保留期(0/非法回退全量窗口)。 */
310
+ rangeDays?: number;
311
+ }
312
+ export interface TokenCostResponse extends CostSnapshot {
313
+ }
314
+ /** dsh-memory/session-mode-get | set */
315
+ export interface SessionModeGetRequest {
316
+ sessionId: string;
317
+ }
318
+ export interface SessionModeGetResponse {
319
+ sessionId: string;
320
+ mode: MemoryMode;
321
+ defaultMode: MemoryMode;
322
+ }
323
+ export interface SessionModeSetRequest {
324
+ sessionId: string;
325
+ mode: MemoryMode;
326
+ }
327
+ export interface SessionModeSetResponse {
328
+ sessionId: string;
329
+ mode: MemoryMode;
330
+ }
331
+ /** dsh-memory/session-stats(悬浮卡信息区;热路径端点)。 */
332
+ export interface SessionStatsRequest {
333
+ sessionId: string;
334
+ }
335
+ /** 蒸馏管线会话视图(runner 投影,lastDistillAt 已转 ISO)。 */
336
+ export interface SessionDistillView {
337
+ pendingSlice: number;
338
+ parkedSlices: number;
339
+ threshold: number | null;
340
+ producedRecords: number;
341
+ lastDistillAt: string | null;
342
+ }
343
+ export type SessionStatsResponse = {
344
+ supported: false;
345
+ } | {
346
+ supported: true;
347
+ sessionId: string;
348
+ mode: MemoryMode;
349
+ defaultMode: MemoryMode;
350
+ recall: {
351
+ enabled: boolean;
352
+ } & RecallSessionStats;
353
+ distill: SessionDistillView;
354
+ l0Count: number;
355
+ retrieval: 'hybrid' | 'vector' | 'keyword' | 'none';
356
+ global: {
357
+ degraded: boolean;
358
+ pendingTotal: number;
359
+ lastExtractAt: string | null;
360
+ };
361
+ };
362
+ /** dsh-memory/settings-get */
363
+ export interface SettingsGetResponse {
364
+ supported: boolean;
365
+ settings: MemoryLiveSettings;
366
+ /** 静态部署上限(cordis.patch.yml):运行时开关与它取 AND。 */
367
+ ceilings: {
368
+ capture: boolean;
369
+ distill: boolean;
370
+ recall: boolean;
371
+ };
372
+ effort: {
373
+ current: EffortChoice;
374
+ effective: EffortChoice;
375
+ fallback: EffortChoice;
376
+ options: string[];
377
+ route?: {
378
+ provider: string;
379
+ model: string;
380
+ };
381
+ };
382
+ budgets: {
383
+ current: DistillBudgets;
384
+ defaults: DistillBudgets;
385
+ effective: DistillBudgets;
386
+ };
387
+ inputBudget: {
388
+ current: number;
389
+ fallback: number;
390
+ effective: number;
391
+ };
392
+ }
393
+ /** dsh-memory/settings-set(patch 语义:只带要改的键)。 */
394
+ export interface SettingsSetRequest {
395
+ enabled?: boolean;
396
+ capture?: boolean;
397
+ distill?: boolean;
398
+ recall?: boolean;
399
+ distillChain?: DistillChainEntry[];
400
+ reasoningEffort?: EffortChoice;
401
+ distillProvider?: string;
402
+ distillModel?: string;
403
+ distillBudgets?: {
404
+ extract: number;
405
+ dedup: number;
406
+ l2: number;
407
+ l3: number;
408
+ };
409
+ distillMaxInputChars?: number;
410
+ }
411
+ export interface SettingsSetResponse {
412
+ ok: true;
413
+ settings: MemoryLiveSettings;
414
+ }
415
+ /** dsh-memory/list-records(记忆浏览器;hitToUiRecord 投影)。 */
416
+ export interface ListRecordsRequest {
417
+ query?: string;
418
+ type?: string;
419
+ scene?: string;
420
+ /** 1~200,默认 50。 */
421
+ limit?: number;
422
+ /** 0~1_000_000。 */
423
+ offset?: number;
424
+ }
425
+ /** 浏览器卡片字段(比 MemoryRecord 精简,去掉大 metadata;epoch→ISO、snake→camel)。 */
426
+ export interface UiRecord {
427
+ id: string;
428
+ content: string;
429
+ type: string;
430
+ priority: number;
431
+ scene: string;
432
+ family: MemoryFamily | null;
433
+ timestamps: string[];
434
+ createdAt: string | null;
435
+ updatedAt: string | null;
436
+ version: number;
437
+ sourceMessageIds: string[];
438
+ /** 检索相关度(列表路径无 score → null)。 */
439
+ score: number | null;
440
+ }
441
+ export interface ListRecordsResponse {
442
+ items: UiRecord[];
443
+ hasMore: boolean;
444
+ /** 列表路径给总数;检索路径无法便宜计数 → null。 */
445
+ total: number | null;
446
+ /** 检索单次上限截断(结果可能不完整)。 */
447
+ truncated: boolean;
448
+ /** 场景筛选下拉选项(仅 offset===0 时附带)。 */
449
+ scenes?: string[];
450
+ }
451
+ /** dsh-memory/scenes(两族拼接的混合视图)。 */
452
+ export interface ScenesResponse {
453
+ items: Array<{
454
+ path: string;
455
+ family: MemoryFamily;
456
+ summary: string;
457
+ updated: string;
458
+ heat: number;
459
+ content: string;
460
+ }>;
461
+ }
462
+ /** dsh-memory/persona(两族以 family 注释 + 分隔线拼接)。 */
463
+ export interface PersonaResponse {
464
+ content: string;
465
+ }
466
+ /** dsh-memory/log-tail */
467
+ export interface LogTailRequest {
468
+ /** 1~1000,默认 200。 */
469
+ lines?: number;
470
+ }
471
+ export interface LogTailResponse {
472
+ lines: string[];
473
+ }
474
+ /** dsh-memory/rebuild-* */
475
+ export type RebuildStatusResponse = {
476
+ supported: false;
477
+ running: false;
478
+ phase: 'idle';
479
+ } | RebuildStatus;
480
+ /** dsh-memory/llm-providers(蒸馏路由链编辑器数据源)。 */
481
+ /** 生效链条目:effort 与 DistillChainEntry.reasoningEffort **不同名不合并**(链上两种条目形状的事实)。 */
482
+ export interface EffectiveChainRoute {
483
+ provider: string;
484
+ model: string;
485
+ effort: string;
486
+ }
487
+ export interface LlmProvidersResponse {
488
+ supported: true;
489
+ providers: Array<{
490
+ id: string;
491
+ name: string;
492
+ }>;
493
+ default: {
494
+ provider: string;
495
+ model: string;
496
+ } | null;
497
+ /** 部署静态 pin(provider+model 双字段)优先于运行时选择,UI 据此禁用选择器。 */
498
+ pinned: boolean;
499
+ current: {
500
+ provider: string;
501
+ model: string;
502
+ };
503
+ /** 所选供应商是否仍在已注册路由中(用户删掉供应商后提示回退)。 */
504
+ currentRegistered: boolean;
505
+ effective: {
506
+ provider: string;
507
+ model: string;
508
+ } | null;
509
+ chain: {
510
+ current: DistillChainEntry[];
511
+ static: StaticFallbackEntry[];
512
+ effectiveChain: EffectiveChainRoute[];
513
+ source: 'runtime' | 'static';
514
+ };
515
+ }
516
+ /** dsh-memory/llm-models */
517
+ export interface LlmModelsRequest {
518
+ provider: string;
519
+ }
520
+ /** 模型条目(附思考档位能力表,探询失败/未声明 → 空表)。 */
521
+ export interface ModelWithEfforts {
522
+ id: string;
523
+ name: string;
524
+ description: string | null;
525
+ efforts: string[];
526
+ }
527
+ export interface LlmModelsResponse {
528
+ provider: string;
529
+ models: ModelWithEfforts[];
530
+ }
531
+ /** dsh-memory/embedding-state-get */
532
+ export type EmbeddingStateResponse = {
533
+ supported: false;
534
+ } | ({
535
+ supported: true;
536
+ } & EmbeddingStateView);
537
+ /** dsh-memory/embedding-source-set */
538
+ export interface EmbeddingSourceSetRequest {
539
+ source: EmbeddingSourceKind;
540
+ activeModel?: string | null;
541
+ }
542
+ export interface EmbeddingSourceSetResponse {
543
+ accepted: true;
544
+ }
545
+ /** dsh-memory/embedding-download-start */
546
+ export interface EmbeddingDownloadStartRequest {
547
+ modelId: string;
548
+ }
549
+ export interface EmbeddingDownloadStartResponse {
550
+ accepted: true;
551
+ }
552
+ /** dsh-memory/embedding-download-cancel | runtime-cancel | reindex-cancel */
553
+ export interface EmbeddingCancelResponse {
554
+ cancelled: boolean;
555
+ }
556
+ /** dsh-memory/embedding-model-delete */
557
+ export interface EmbeddingModelDeleteRequest {
558
+ modelId: string;
559
+ }
560
+ export interface EmbeddingModelDeleteResponse {
561
+ ok: boolean;
562
+ error?: string;
563
+ }
564
+ export interface DshMemoryRequestMap {
565
+ 'dsh-memory/stats': Record<string, never>;
566
+ 'dsh-memory/token-cost': TokenCostRequest;
567
+ 'dsh-memory/session-mode-get': SessionModeGetRequest;
568
+ 'dsh-memory/session-mode-set': SessionModeSetRequest;
569
+ 'dsh-memory/session-stats': SessionStatsRequest;
570
+ 'dsh-memory/settings-get': Record<string, never>;
571
+ 'dsh-memory/settings-set': SettingsSetRequest;
572
+ 'dsh-memory/list-records': ListRecordsRequest;
573
+ 'dsh-memory/scenes': Record<string, never>;
574
+ 'dsh-memory/persona': Record<string, never>;
575
+ 'dsh-memory/log-tail': LogTailRequest;
576
+ 'dsh-memory/rebuild-status': Record<string, never>;
577
+ 'dsh-memory/rebuild-start': Record<string, never>;
578
+ 'dsh-memory/rebuild-cancel': Record<string, never>;
579
+ 'dsh-memory/llm-providers': Record<string, never>;
580
+ 'dsh-memory/llm-models': LlmModelsRequest;
581
+ 'dsh-memory/embedding-state-get': Record<string, never>;
582
+ 'dsh-memory/embedding-source-set': EmbeddingSourceSetRequest;
583
+ 'dsh-memory/embedding-download-start': EmbeddingDownloadStartRequest;
584
+ 'dsh-memory/embedding-download-cancel': Record<string, never>;
585
+ 'dsh-memory/embedding-model-delete': EmbeddingModelDeleteRequest;
586
+ 'dsh-memory/embedding-runtime-cancel': Record<string, never>;
587
+ 'dsh-memory/embedding-reindex-cancel': Record<string, never>;
588
+ }
589
+ export interface DshMemoryResponseMap {
590
+ 'dsh-memory/stats': StatsResponse;
591
+ 'dsh-memory/token-cost': TokenCostResponse;
592
+ 'dsh-memory/session-mode-get': SessionModeGetResponse;
593
+ 'dsh-memory/session-mode-set': SessionModeSetResponse;
594
+ 'dsh-memory/session-stats': SessionStatsResponse;
595
+ 'dsh-memory/settings-get': SettingsGetResponse;
596
+ 'dsh-memory/settings-set': SettingsSetResponse;
597
+ 'dsh-memory/list-records': ListRecordsResponse;
598
+ 'dsh-memory/scenes': ScenesResponse;
599
+ 'dsh-memory/persona': PersonaResponse;
600
+ 'dsh-memory/log-tail': LogTailResponse;
601
+ 'dsh-memory/rebuild-status': RebuildStatusResponse;
602
+ 'dsh-memory/rebuild-start': RebuildStatus;
603
+ 'dsh-memory/rebuild-cancel': RebuildStatus;
604
+ 'dsh-memory/llm-providers': LlmProvidersResponse;
605
+ 'dsh-memory/llm-models': LlmModelsResponse;
606
+ 'dsh-memory/embedding-state-get': EmbeddingStateResponse;
607
+ 'dsh-memory/embedding-source-set': EmbeddingSourceSetResponse;
608
+ 'dsh-memory/embedding-download-start': EmbeddingDownloadStartResponse;
609
+ 'dsh-memory/embedding-download-cancel': EmbeddingCancelResponse;
610
+ 'dsh-memory/embedding-model-delete': EmbeddingModelDeleteResponse;
611
+ 'dsh-memory/embedding-runtime-cancel': EmbeddingCancelResponse;
612
+ 'dsh-memory/embedding-reindex-cancel': EmbeddingCancelResponse;
613
+ }
614
+ /** 全部端点名(client 调用与 host case 表的共用字面量来源)。 */
615
+ export type DshMemoryEndpoint = keyof DshMemoryResponseMap;
@@ -0,0 +1 @@
1
+ export {};
@@ -35,24 +35,8 @@ export declare function buildRecallQuery(messages: Array<{
35
35
  * 命中率 = hitTurns / injectedTurns。去重语义(0.8.6):全量压制轮计入 hitTurns
36
36
  * (相关记忆已在模型上下文里,本质是命中而非未命中),injectedTurns 仍计全部
37
37
  * 发生过检索的轮次(保住分母语义与悬浮卡口径连续性)。 */
38
- export interface RecallSessionStats {
39
- /** 发生过召回检索的轮次数(含零命中、全量压制与超时)。 */
40
- injectedTurns: number;
41
- /** 命中(≥1 条实际注入,或有命中但被去重全量压制)轮次数。 */
42
- hitTurns: number;
43
- /** 累计注入条数(去重过滤后、预算截断前)。 */
44
- totalHits: number;
45
- /** 总预算超时跳过次数。 */
46
- timeouts: number;
47
- /** 累计被去重压制的命中条数(同会话已注入过,不重复注入)。 */
48
- suppressedRecalls: number;
49
- /** 最近一轮实际注入条数(0 = 零命中/超时/全量压制;工具指南门控沿用此信号)。 */
50
- lastHits: number;
51
- /** 最近一轮检索耗时 ms。 */
52
- lastDurationMs: number;
53
- /** 最近一次记账时间(LRU 清理依据)。 */
54
- updatedAt: number;
55
- }
38
+ import type { RecallSessionStats } from '../contract.js';
39
+ export type { RecallSessionStats } from '../contract.js';
56
40
  /** 新建零值统计(首次出现的会话)。 */
57
41
  export declare function emptyRecallStats(now?: number): RecallSessionStats;
58
42
  export interface RecallHooks {