dsh-layered-memory 0.8.7 → 0.8.9

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.
@@ -23,6 +23,7 @@ import type { PersonaStore } from '../store/persona.js';
23
23
  import type { SceneStore } from '../store/scenes.js';
24
24
  import type { SessionModeStore } from '../store/session-modes.js';
25
25
  import type { MemoryLogger } from '../types.js';
26
+ import { type OccupancyLedger } from '../util/context-occupancy.js';
26
27
  /**
27
28
  * 从会话消息构建召回查询(纯函数):末尾 N 条 + 总长截断,空输入返回空串。
28
29
  * 全史拼接会让 MATCH 表达式随会话长度线性膨胀(整会话累计二次方成本)。
@@ -35,24 +36,8 @@ export declare function buildRecallQuery(messages: Array<{
35
36
  * 命中率 = hitTurns / injectedTurns。去重语义(0.8.6):全量压制轮计入 hitTurns
36
37
  * (相关记忆已在模型上下文里,本质是命中而非未命中),injectedTurns 仍计全部
37
38
  * 发生过检索的轮次(保住分母语义与悬浮卡口径连续性)。 */
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
- }
39
+ import type { RecallSessionStats } from '../contract.js';
40
+ export type { RecallSessionStats } from '../contract.js';
56
41
  /** 新建零值统计(首次出现的会话)。 */
57
42
  export declare function emptyRecallStats(now?: number): RecallSessionStats;
58
43
  export interface RecallHooks {
@@ -60,6 +45,16 @@ export interface RecallHooks {
60
45
  invalidateProfile(): void;
61
46
  /** 会话召回统计只读视图(未发生过检索的会话返回 undefined)。 */
62
47
  stats(sessionId: string): RecallSessionStats | undefined;
48
+ /** 记忆占用账本只读出口:内存优先,miss 时从流水复生(重启后历史会话);从未注入返回 null。 */
49
+ occupancy(sessionId: string): OccupancyLedger | null;
50
+ /**
51
+ * 稳定区份额估算(票08 旧会话回填):按当前画像/导航/指南组词折算 token,
52
+ * 纯读不记账——旧会话系统提示里"现在大约坐着多少稳定区"的最佳可得估计。
53
+ */
54
+ estimateProfileTokens(agentId: string): number;
55
+ /** 召回份额回填(票08):live 会话 surface 现扫本插件注入,miss 时读盘上日志兜底;
56
+ * 均不可得返回 null。 */
57
+ estimateRecallTokens(sessionId: string): Promise<number | null>;
63
58
  }
64
59
  export declare function registerRecall(ctx: Context, cfg: MemoryConfig, stores: {
65
60
  l1: L1Store;
@@ -1,9 +1,12 @@
1
1
  import { createUserMessage } from '@deepseek-ai/dsh-llm';
2
2
  import { RecallDedupeStore } from '../store/recall-dedupe.js';
3
+ import { OccupancyStore } from '../store/occupancy.js';
3
4
  import { applyRecallBudget, raceRecallTimeout, RECALL_EMBED_CAP_MS } from '../util/recall-budget.js';
5
+ import { clearProfileShare, emptyOccupancyLedger, estimateInjectedMessageTokens, estimateStableSectionTokens, recordProfileShare, recordRecallInjection, resetForCompaction, } from '../util/context-occupancy.js';
4
6
  import { errDetail } from '../util/filelog.js';
5
7
  import { blocksToText } from '../util/text.js';
6
8
  const PROFILE_TTL = 60_000;
9
+ const storedEstimateCache = new Map();
7
10
  /** 召回查询只取会话末尾 N 条消息(长会话每步把全史拼进 FTS MATCH 会让检索成本线性上涨)。 */
8
11
  const RECALL_QUERY_TAIL_MESSAGES = 8;
9
12
  /** 召回查询总字符上限(保留末尾——最新语境权重最高)。 */
@@ -52,6 +55,8 @@ export function emptyRecallStats(now = Date.now()) {
52
55
  export function registerRecall(ctx, cfg, stores, logger, live, modes, dataDir) {
53
56
  /** 召回去重存储(同会话已注入的记忆不再重复注入;写穿持久化,重启不丢)。 */
54
57
  const dedupe = new RecallDedupeStore(dataDir, logger);
58
+ /** 记忆占用流水(账本迁移写穿;重启后历史会话账目由此复生——票07)。 */
59
+ const occupancyStore = new OccupancyStore(dataDir, logger);
55
60
  /** 每 agent 召回统计(工具指南门控读 lastHits;悬浮卡信息区读全量计数)。 */
56
61
  const recallStats = new Map();
57
62
  const statFor = (id) => {
@@ -62,6 +67,17 @@ export function registerRecall(ctx, cfg, stores, logger, live, modes, dataDir) {
62
67
  }
63
68
  return s;
64
69
  };
70
+ /** 每 agent 记忆占用账本(权威账本的唯一宿主实例;占用指示器与悬浮卡同源消费)。 */
71
+ const occupancyByAgent = new Map();
72
+ const ledgerFor = (id) => {
73
+ let led = occupancyByAgent.get(id);
74
+ if (!led) {
75
+ // 进程重启/agent 重建后回看:从流水复生(新迁移在持久值上继续累加——票07)
76
+ led = occupancyStore.load(id) ?? emptyOccupancyLedger();
77
+ occupancyByAgent.set(id, led);
78
+ }
79
+ return led;
80
+ };
65
81
  // 画像/场景导航按族缓存(分族隔离:注入时按会话档位选族)
66
82
  const profileCache = {
67
83
  chat: { persona: '', nav: '' },
@@ -92,13 +108,18 @@ export function registerRecall(ctx, cfg, stores, logger, live, modes, dataDir) {
92
108
  // agent 销毁时清掉召回统计槽(去重记录不随 agent 清——持久化语义:会话恢复后继续压制)
93
109
  ctx.on('agent/disposed', (payload) => {
94
110
  recallStats.delete(payload.agent.id);
111
+ occupancyByAgent.delete(payload.agent.id);
95
112
  });
96
113
  // 上下文压缩/清空 → 已注入内容从模型上下文丢失,重置该会话的去重压制
97
114
  // (resume/startup 不重置:历史仍在,已注入的记忆模型还持有)。
115
+ // 占用账本同步全量归零(宁低勿高;v1 轮级粒度近似,事件级 shadow price 对齐留待后续)。
98
116
  ctx.on('agent/session-start', (payload) => {
99
117
  if (payload.source === 'compact' || payload.source === 'clear') {
100
118
  dedupe.reset(payload.agent.id);
101
- logger.info(`[memory] 召回去重重置(agent=${payload.agent.id},source=${payload.source})`);
119
+ const led = ledgerFor(payload.agent.id);
120
+ resetForCompaction(led);
121
+ occupancyStore.save(payload.agent.id, led); // stock 归零 ⇒ 流水条目删除
122
+ logger.info(`[memory] 召回去重与占用账本重置(agent=${payload.agent.id},source=${payload.source})`);
102
123
  }
103
124
  });
104
125
  // ── 1. pre-step 消息侧注入:记忆先行于每一条新的用户输入(ADR-0001) ──
@@ -180,6 +201,10 @@ export function registerRecall(ctx, cfg, stores, logger, live, modes, dataDir) {
180
201
  // "上下文注入"(专用"跨会话召回"标题仅留给 session-reference 来源)
181
202
  source: { kind: 'plugin', plugin: 'memory', form: 'recall' },
182
203
  });
204
+ // 入账在成功构造注入消息之后、返回 enter 之前——任何前置抛错路径账目零扰动
205
+ const led = ledgerFor(payload.agent.id);
206
+ recordRecallInjection(led, text.length);
207
+ occupancyStore.save(payload.agent.id, led);
183
208
  // 注入消息排在用户新消息之前(原版 prepend 语义:先线索后问题)
184
209
  return { kind: 'enter', messages: [injection, ...decision.messages] };
185
210
  }
@@ -192,6 +217,101 @@ export function registerRecall(ctx, cfg, stores, logger, live, modes, dataDir) {
192
217
  // ── 2. agent 作用域上下文 provider(系统提示稳定区:画像 + 导航 + 门控指南) ──
193
218
  // 插件可能在默认 agent 创建之后才加载(组合顺序由依赖决定),
194
219
  // 因此除了监听 agent/created,还要给已存在的 agent 补注册。
220
+ /**
221
+ * 稳定区当前组词(纯读,不记账):text() 的取词部分单独成函数,
222
+ * 供旧会话回填估算(RecallHooks.estimateProfileTokens)复用同一口径。
223
+ */ const composeStableText = (agentId) => {
224
+ const s = live.get();
225
+ if (!s.enabled || !s.recall)
226
+ return '';
227
+ const mode = modes.get(agentId);
228
+ if (mode === 'off')
229
+ return '';
230
+ // auto 档:两族按类别归组(画像/导航各一个标签,域内 <domain> 分块);纯档:单族原格式
231
+ const body = mode === 'auto'
232
+ ? formatProfileAuto(profileCache.chat, profileCache.work)
233
+ : formatProfileSingle(profileCache[mode]);
234
+ const hasRecallHit = (recallStats.get(agentId)?.lastHits ?? 0) > 0;
235
+ // 指南三条件门控:工具已注册(cfg.tools)&&(稳定内容 ∥ 本轮召回命中)——
236
+ // 空库用户与关闭工具的用户不付这份固定 token(原版 auto-recall 同款语义)
237
+ if (!cfg.tools)
238
+ return body;
239
+ if (!body && !hasRecallHit)
240
+ return '';
241
+ return body ? `${body}\n\n${MEMORY_TOOLS_GUIDE}` : MEMORY_TOOLS_GUIDE;
242
+ };
243
+ async function estimateRecallFromStorage(sessionId) {
244
+ if (storedEstimateCache.has(sessionId))
245
+ return storedEstimateCache.get(sessionId) ?? null;
246
+ let tokens = null;
247
+ try {
248
+ // 可选服务(JSONL 后端注册名);缺失/其它实现 → 回填隐藏
249
+ const persistence = (await ctx.get?.('sessionPersistence'));
250
+ const stored = typeof persistence?.loadStored === 'function' ? await persistence.loadStored(sessionId) : undefined;
251
+ if (stored?.events) {
252
+ tokens = 0;
253
+ for (const ev of stored.events) {
254
+ if (typeof ev.type === 'string' && ev.type.startsWith('compaction'))
255
+ tokens = 0;
256
+ if (ev.type !== 'user/message')
257
+ continue;
258
+ const src = ev.data?.source;
259
+ if (!src || src.kind !== 'plugin' || src.plugin !== 'memory' || src.form !== 'recall')
260
+ continue;
261
+ let chars = 0;
262
+ for (const b of ev.data?.content ?? []) {
263
+ if (b?.type === 'text' && typeof b.text === 'string')
264
+ chars += b.text.length;
265
+ }
266
+ if (chars > 0)
267
+ tokens += estimateInjectedMessageTokens(chars);
268
+ }
269
+ }
270
+ }
271
+ catch {
272
+ tokens = null;
273
+ }
274
+ storedEstimateCache.set(sessionId, tokens);
275
+ return tokens;
276
+ }
277
+ /**
278
+ * 召回份额回填(票08 旧会话):live 会话的 surface(模型可见序号集)∩ 全事件日志
279
+ * 里本插件的 recall 注入,官方同式折算。窗口语义天然正确——被压缩折叠的注入不在
280
+ * surface.nodes 上,自动出局。会话不在 live store(未打开)返回 null。
281
+ */
282
+ const estimateRecallTokens = async (sessionId) => {
283
+ try {
284
+ // cordis 属性访问(ctx.sessions)对未 inject 的服务抛 "without inject"(实测);
285
+ // 可选服务一律走 ctx.get() 的宽容路径
286
+ const sessions = ctx.get?.('sessions');
287
+ const session = typeof sessions?.get === 'function' ? sessions.get(sessionId) : undefined;
288
+ if (session) {
289
+ const visible = new Set(session.surface.nodes);
290
+ let total = 0;
291
+ for (const ev of session.events) {
292
+ if (ev.type !== 'user/message' || !visible.has(ev.seq))
293
+ continue;
294
+ const msg = ev.data;
295
+ const src = msg?.source;
296
+ if (!src || src.kind !== 'plugin' || src.plugin !== 'memory' || src.form !== 'recall')
297
+ continue;
298
+ let chars = 0;
299
+ for (const b of msg.content ?? []) {
300
+ if (b?.type === 'text' && typeof b.text === 'string')
301
+ chars += b.text.length;
302
+ }
303
+ if (chars > 0)
304
+ total += estimateInjectedMessageTokens(chars);
305
+ }
306
+ return total;
307
+ }
308
+ // 仅查看的旧会话不在 live store:官方持久化服务读存储前缀兜底(见函数头)
309
+ return estimateRecallFromStorage(sessionId);
310
+ }
311
+ catch {
312
+ return null; // 服务缺失/形状异常:回填隐藏,不扰动主流程
313
+ }
314
+ };
195
315
  const registered = new WeakSet();
196
316
  // context() 的 disposer 必须挂到插件自身生命周期:agent.ctx 比插件实例活得久,
197
317
  // 不主动清理会导致热重载后旧注册泄漏、新实例撞名("already registered")
@@ -205,24 +325,15 @@ export function registerRecall(ctx, cfg, stores, logger, live, modes, dataDir) {
205
325
  name: 'memory:profile',
206
326
  order: 510,
207
327
  text: () => {
208
- const s = live.get();
209
- if (!s.enabled || !s.recall)
210
- return '';
211
- const mode = modes.get(agent.id);
212
- if (mode === 'off')
213
- return '';
214
- // auto 档:两族按类别归组(画像/导航各一个标签,域内 <domain> 分块);纯档:单族原格式
215
- const body = mode === 'auto'
216
- ? formatProfileAuto(profileCache.chat, profileCache.work)
217
- : formatProfileSingle(profileCache[mode]);
218
- const hasRecallHit = (recallStats.get(agent.id)?.lastHits ?? 0) > 0;
219
- // 指南三条件门控:工具已注册(cfg.tools)&&(稳定内容 ∥ 本轮召回命中)——
220
- // 空库用户与关闭工具的用户不付这份固定 token(原版 auto-recall 同款语义)
221
- if (!cfg.tools)
222
- return body;
223
- if (!body && !hasRecallHit)
224
- return '';
225
- return body ? `${body}\n\n${MEMORY_TOOLS_GUIDE}` : MEMORY_TOOLS_GUIDE;
328
+ const final = composeStableText(agent.id);
329
+ const ledger = ledgerFor(agent.id);
330
+ // 空串即物理离场(停用/OFF/门控全空):份额同边界清零;否则按实际长度入账
331
+ if (final === '')
332
+ clearProfileShare(ledger);
333
+ else
334
+ recordProfileShare(ledger, final.length);
335
+ occupancyStore.save(agent.id, ledger);
336
+ return final;
226
337
  },
227
338
  }));
228
339
  }
@@ -248,7 +359,19 @@ export function registerRecall(ctx, cfg, stores, logger, live, modes, dataDir) {
248
359
  }
249
360
  }
250
361
  });
251
- return { invalidateProfile, stats: (id) => recallStats.get(id) };
362
+ return {
363
+ invalidateProfile,
364
+ stats: (id) => recallStats.get(id),
365
+ /** 占用账本只读出口:内存优先,miss 时从流水复生(重启后历史会话);从未注入返回 null。 */
366
+ occupancy: (id) => {
367
+ const led = occupancyByAgent.get(id) ?? occupancyStore.load(id);
368
+ if (led)
369
+ occupancyByAgent.set(id, led);
370
+ return led ?? null;
371
+ },
372
+ estimateProfileTokens: (id) => estimateStableSectionTokens(composeStableText(id).length),
373
+ estimateRecallTokens,
374
+ };
252
375
  }
253
376
  /** auto 档 <user-persona> 内的域说明:让模型理解分块结构与两域的独立性。 */
254
377
  const DOMAIN_HINT = '以下内容按记忆域分块:chat=用户个人画像(User Narrative Profile),work=团队工作准则(Team Operating Doctrine)。' +
package/dist/index.d.ts CHANGED
@@ -59,7 +59,7 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
59
59
  timeoutMs: import("@deepseek-ai/schemastery").default<number, number>;
60
60
  includePersona: import("@deepseek-ai/schemastery").default<boolean, boolean>;
61
61
  includeSceneNav: import("@deepseek-ai/schemastery").default<boolean, boolean>;
62
- strategy: import("@deepseek-ai/schemastery").default<"keyword" | "embedding" | "hybrid", "keyword" | "embedding" | "hybrid">;
62
+ strategy: import("@deepseek-ai/schemastery").default<"hybrid" | "keyword" | "embedding", "hybrid" | "keyword" | "embedding">;
63
63
  scoreThreshold: import("@deepseek-ai/schemastery").default<number, number>;
64
64
  decayHalfLifeDays: import("@deepseek-ai/schemastery").default<number, number>;
65
65
  }>, Schemastery.ObjectT<{
@@ -70,7 +70,7 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
70
70
  timeoutMs: import("@deepseek-ai/schemastery").default<number, number>;
71
71
  includePersona: import("@deepseek-ai/schemastery").default<boolean, boolean>;
72
72
  includeSceneNav: import("@deepseek-ai/schemastery").default<boolean, boolean>;
73
- strategy: import("@deepseek-ai/schemastery").default<"keyword" | "embedding" | "hybrid", "keyword" | "embedding" | "hybrid">;
73
+ strategy: import("@deepseek-ai/schemastery").default<"hybrid" | "keyword" | "embedding", "hybrid" | "keyword" | "embedding">;
74
74
  scoreThreshold: import("@deepseek-ai/schemastery").default<number, number>;
75
75
  decayHalfLifeDays: import("@deepseek-ai/schemastery").default<number, number>;
76
76
  }>>;
@@ -100,6 +100,72 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
100
100
  llm: import("@deepseek-ai/schemastery").default<Schemastery.ObjectS<{
101
101
  provider: import("@deepseek-ai/schemastery").default<string, string>;
102
102
  model: import("@deepseek-ai/schemastery").default<string, string>;
103
+ fallbacks: import("@deepseek-ai/schemastery").default<({
104
+ provider?: string | null | undefined;
105
+ model?: string | null | undefined;
106
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
107
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
108
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
109
+ model: import("@deepseek-ai/schemastery").default<string, string>;
110
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
111
+ }>[]>;
112
+ layerRoutes: import("@deepseek-ai/schemastery").default<Schemastery.ObjectS<{
113
+ l1: import("@deepseek-ai/schemastery").default<({
114
+ provider?: string | null | undefined;
115
+ model?: string | null | undefined;
116
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
117
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
118
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
119
+ model: import("@deepseek-ai/schemastery").default<string, string>;
120
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
121
+ }>[]>;
122
+ l2: import("@deepseek-ai/schemastery").default<({
123
+ provider?: string | null | undefined;
124
+ model?: string | null | undefined;
125
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
126
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
127
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
128
+ model: import("@deepseek-ai/schemastery").default<string, string>;
129
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
130
+ }>[]>;
131
+ l3: import("@deepseek-ai/schemastery").default<({
132
+ provider?: string | null | undefined;
133
+ model?: string | null | undefined;
134
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
135
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
136
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
137
+ model: import("@deepseek-ai/schemastery").default<string, string>;
138
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
139
+ }>[]>;
140
+ }>, Schemastery.ObjectT<{
141
+ l1: import("@deepseek-ai/schemastery").default<({
142
+ provider?: string | null | undefined;
143
+ model?: string | null | undefined;
144
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
145
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
146
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
147
+ model: import("@deepseek-ai/schemastery").default<string, string>;
148
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
149
+ }>[]>;
150
+ l2: import("@deepseek-ai/schemastery").default<({
151
+ provider?: string | null | undefined;
152
+ model?: string | null | undefined;
153
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
154
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
155
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
156
+ model: import("@deepseek-ai/schemastery").default<string, string>;
157
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
158
+ }>[]>;
159
+ l3: import("@deepseek-ai/schemastery").default<({
160
+ provider?: string | null | undefined;
161
+ model?: string | null | undefined;
162
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
163
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
164
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
165
+ model: import("@deepseek-ai/schemastery").default<string, string>;
166
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
167
+ }>[]>;
168
+ }>>;
103
169
  maxTokens: import("@deepseek-ai/schemastery").default<number, number>;
104
170
  reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
105
171
  temperature: import("@deepseek-ai/schemastery").default<number, number>;
@@ -108,6 +174,72 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
108
174
  }>, Schemastery.ObjectT<{
109
175
  provider: import("@deepseek-ai/schemastery").default<string, string>;
110
176
  model: import("@deepseek-ai/schemastery").default<string, string>;
177
+ fallbacks: import("@deepseek-ai/schemastery").default<({
178
+ provider?: string | null | undefined;
179
+ model?: string | null | undefined;
180
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
181
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
182
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
183
+ model: import("@deepseek-ai/schemastery").default<string, string>;
184
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
185
+ }>[]>;
186
+ layerRoutes: import("@deepseek-ai/schemastery").default<Schemastery.ObjectS<{
187
+ l1: import("@deepseek-ai/schemastery").default<({
188
+ provider?: string | null | undefined;
189
+ model?: string | null | undefined;
190
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
191
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
192
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
193
+ model: import("@deepseek-ai/schemastery").default<string, string>;
194
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
195
+ }>[]>;
196
+ l2: import("@deepseek-ai/schemastery").default<({
197
+ provider?: string | null | undefined;
198
+ model?: string | null | undefined;
199
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
200
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
201
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
202
+ model: import("@deepseek-ai/schemastery").default<string, string>;
203
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
204
+ }>[]>;
205
+ l3: import("@deepseek-ai/schemastery").default<({
206
+ provider?: string | null | undefined;
207
+ model?: string | null | undefined;
208
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
209
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
210
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
211
+ model: import("@deepseek-ai/schemastery").default<string, string>;
212
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
213
+ }>[]>;
214
+ }>, Schemastery.ObjectT<{
215
+ l1: import("@deepseek-ai/schemastery").default<({
216
+ provider?: string | null | undefined;
217
+ model?: string | null | undefined;
218
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
219
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
220
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
221
+ model: import("@deepseek-ai/schemastery").default<string, string>;
222
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
223
+ }>[]>;
224
+ l2: import("@deepseek-ai/schemastery").default<({
225
+ provider?: string | null | undefined;
226
+ model?: string | null | undefined;
227
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
228
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
229
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
230
+ model: import("@deepseek-ai/schemastery").default<string, string>;
231
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
232
+ }>[]>;
233
+ l3: import("@deepseek-ai/schemastery").default<({
234
+ provider?: string | null | undefined;
235
+ model?: string | null | undefined;
236
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
237
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
238
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
239
+ model: import("@deepseek-ai/schemastery").default<string, string>;
240
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
241
+ }>[]>;
242
+ }>>;
111
243
  maxTokens: import("@deepseek-ai/schemastery").default<number, number>;
112
244
  reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
113
245
  temperature: import("@deepseek-ai/schemastery").default<number, number>;
@@ -172,7 +304,7 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
172
304
  timeoutMs: import("@deepseek-ai/schemastery").default<number, number>;
173
305
  includePersona: import("@deepseek-ai/schemastery").default<boolean, boolean>;
174
306
  includeSceneNav: import("@deepseek-ai/schemastery").default<boolean, boolean>;
175
- strategy: import("@deepseek-ai/schemastery").default<"keyword" | "embedding" | "hybrid", "keyword" | "embedding" | "hybrid">;
307
+ strategy: import("@deepseek-ai/schemastery").default<"hybrid" | "keyword" | "embedding", "hybrid" | "keyword" | "embedding">;
176
308
  scoreThreshold: import("@deepseek-ai/schemastery").default<number, number>;
177
309
  decayHalfLifeDays: import("@deepseek-ai/schemastery").default<number, number>;
178
310
  }>, Schemastery.ObjectT<{
@@ -183,7 +315,7 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
183
315
  timeoutMs: import("@deepseek-ai/schemastery").default<number, number>;
184
316
  includePersona: import("@deepseek-ai/schemastery").default<boolean, boolean>;
185
317
  includeSceneNav: import("@deepseek-ai/schemastery").default<boolean, boolean>;
186
- strategy: import("@deepseek-ai/schemastery").default<"keyword" | "embedding" | "hybrid", "keyword" | "embedding" | "hybrid">;
318
+ strategy: import("@deepseek-ai/schemastery").default<"hybrid" | "keyword" | "embedding", "hybrid" | "keyword" | "embedding">;
187
319
  scoreThreshold: import("@deepseek-ai/schemastery").default<number, number>;
188
320
  decayHalfLifeDays: import("@deepseek-ai/schemastery").default<number, number>;
189
321
  }>>;
@@ -213,6 +345,72 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
213
345
  llm: import("@deepseek-ai/schemastery").default<Schemastery.ObjectS<{
214
346
  provider: import("@deepseek-ai/schemastery").default<string, string>;
215
347
  model: import("@deepseek-ai/schemastery").default<string, string>;
348
+ fallbacks: import("@deepseek-ai/schemastery").default<({
349
+ provider?: string | null | undefined;
350
+ model?: string | null | undefined;
351
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
352
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
353
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
354
+ model: import("@deepseek-ai/schemastery").default<string, string>;
355
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
356
+ }>[]>;
357
+ layerRoutes: import("@deepseek-ai/schemastery").default<Schemastery.ObjectS<{
358
+ l1: import("@deepseek-ai/schemastery").default<({
359
+ provider?: string | null | undefined;
360
+ model?: string | null | undefined;
361
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
362
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
363
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
364
+ model: import("@deepseek-ai/schemastery").default<string, string>;
365
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
366
+ }>[]>;
367
+ l2: import("@deepseek-ai/schemastery").default<({
368
+ provider?: string | null | undefined;
369
+ model?: string | null | undefined;
370
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
371
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
372
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
373
+ model: import("@deepseek-ai/schemastery").default<string, string>;
374
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
375
+ }>[]>;
376
+ l3: import("@deepseek-ai/schemastery").default<({
377
+ provider?: string | null | undefined;
378
+ model?: string | null | undefined;
379
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
380
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
381
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
382
+ model: import("@deepseek-ai/schemastery").default<string, string>;
383
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
384
+ }>[]>;
385
+ }>, Schemastery.ObjectT<{
386
+ l1: import("@deepseek-ai/schemastery").default<({
387
+ provider?: string | null | undefined;
388
+ model?: string | null | undefined;
389
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
390
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
391
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
392
+ model: import("@deepseek-ai/schemastery").default<string, string>;
393
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
394
+ }>[]>;
395
+ l2: import("@deepseek-ai/schemastery").default<({
396
+ provider?: string | null | undefined;
397
+ model?: string | null | undefined;
398
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
399
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
400
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
401
+ model: import("@deepseek-ai/schemastery").default<string, string>;
402
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
403
+ }>[]>;
404
+ l3: import("@deepseek-ai/schemastery").default<({
405
+ provider?: string | null | undefined;
406
+ model?: string | null | undefined;
407
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
408
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
409
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
410
+ model: import("@deepseek-ai/schemastery").default<string, string>;
411
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
412
+ }>[]>;
413
+ }>>;
216
414
  maxTokens: import("@deepseek-ai/schemastery").default<number, number>;
217
415
  reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
218
416
  temperature: import("@deepseek-ai/schemastery").default<number, number>;
@@ -221,6 +419,72 @@ export declare const Config: import("@deepseek-ai/schemastery").default<Schemast
221
419
  }>, Schemastery.ObjectT<{
222
420
  provider: import("@deepseek-ai/schemastery").default<string, string>;
223
421
  model: import("@deepseek-ai/schemastery").default<string, string>;
422
+ fallbacks: import("@deepseek-ai/schemastery").default<({
423
+ provider?: string | null | undefined;
424
+ model?: string | null | undefined;
425
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
426
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
427
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
428
+ model: import("@deepseek-ai/schemastery").default<string, string>;
429
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
430
+ }>[]>;
431
+ layerRoutes: import("@deepseek-ai/schemastery").default<Schemastery.ObjectS<{
432
+ l1: import("@deepseek-ai/schemastery").default<({
433
+ provider?: string | null | undefined;
434
+ model?: string | null | undefined;
435
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
436
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
437
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
438
+ model: import("@deepseek-ai/schemastery").default<string, string>;
439
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
440
+ }>[]>;
441
+ l2: import("@deepseek-ai/schemastery").default<({
442
+ provider?: string | null | undefined;
443
+ model?: string | null | undefined;
444
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
445
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
446
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
447
+ model: import("@deepseek-ai/schemastery").default<string, string>;
448
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
449
+ }>[]>;
450
+ l3: import("@deepseek-ai/schemastery").default<({
451
+ provider?: string | null | undefined;
452
+ model?: string | null | undefined;
453
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
454
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
455
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
456
+ model: import("@deepseek-ai/schemastery").default<string, string>;
457
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
458
+ }>[]>;
459
+ }>, Schemastery.ObjectT<{
460
+ l1: import("@deepseek-ai/schemastery").default<({
461
+ provider?: string | null | undefined;
462
+ model?: string | null | undefined;
463
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
464
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
465
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
466
+ model: import("@deepseek-ai/schemastery").default<string, string>;
467
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
468
+ }>[]>;
469
+ l2: import("@deepseek-ai/schemastery").default<({
470
+ provider?: string | null | undefined;
471
+ model?: string | null | undefined;
472
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
473
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
474
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
475
+ model: import("@deepseek-ai/schemastery").default<string, string>;
476
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
477
+ }>[]>;
478
+ l3: import("@deepseek-ai/schemastery").default<({
479
+ provider?: string | null | undefined;
480
+ model?: string | null | undefined;
481
+ reasoningEffort?: "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max" | null | undefined;
482
+ } & import("@deepseek-ai/cosmokit").Dict)[], Schemastery.ObjectT<{
483
+ provider: import("@deepseek-ai/schemastery").default<string, string>;
484
+ model: import("@deepseek-ai/schemastery").default<string, string>;
485
+ reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
486
+ }>[]>;
487
+ }>>;
224
488
  maxTokens: import("@deepseek-ai/schemastery").default<number, number>;
225
489
  reasoningEffort: import("@deepseek-ai/schemastery").default<"" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max", "" | "off" | "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max">;
226
490
  temperature: import("@deepseek-ai/schemastery").default<number, number>;