// viewer-limits.mts —— 查看器要展示的**阈值与配置**节(桥的 /api/limits) // // 为什么要有这个入口,而不是让页面自己写数字: // · 页面要显示"上限 2200 / 阈值 30 / 单条 500 / maxScenes 15"这类数字,若在前端硬编码, // 改一处源码就得记得改前端 —— 又是一次"同一概念多份实现"(仓库里记过同样的教训)。 // · 也不能让页面直接 fetch `config/application-propertis.json`:那是 JSONC(浏览器 parse 不了) // 且含 `model.embedding.apiKey`(桥 CORS 全开地托管 memoryDB,等于把密钥交给任何本地页面)。 // 所以:**取值一律 import 源码常量/加载器**,响应按构造只含这几个数字,密钥没有机会出现。 // // 输出: // { l1: { mode }, // l2: { maxScenes, archive: {enabled, minAgeCalendarDays, maxPerBatch} }, // l3: { interval, userCharLimit, memoryCharLimit, entryCharLimit } } // // 用法:node --experimental-strip-types scripts/l1-admin/viewer-limits.mts [--profile ] import { argv, stdout } from "node:process"; import { loadL1Config } from "../../memory/l1/config.ts"; import { loadL2ArchiveConfig, loadL2Config } from "../../memory/l2/config.ts"; import { L3_ENTRY_CHAR_LIMIT, L3_INTERVAL, USER_CHAR_LIMIT } from "../../memory/l3/config.ts"; import { DEFAULT_MEMORY_CHAR_LIMIT } from "../../memory/core/types.ts"; /** 取 `--flag value` 形式的值。 */ function flagValue(flag: string): string | undefined { const i = argv.indexOf(flag); return i >= 0 ? argv[i + 1] : undefined; } const PROFILE = flagValue("--profile") ?? "C:/Users/leaf/.pi/agent/profiles/default"; // 一律用 process.exitCode 而非 exit():stdout 是管道时写入异步,立刻 exit 会截断 JSON。 stdout.write( `${JSON.stringify( { l1: { mode: loadL1Config(PROFILE).mode }, l2: { maxScenes: loadL2Config(PROFILE).maxScenes, archive: loadL2ArchiveConfig(PROFILE) }, l3: { interval: L3_INTERVAL, userCharLimit: USER_CHAR_LIMIT, memoryCharLimit: DEFAULT_MEMORY_CHAR_LIMIT, entryCharLimit: L3_ENTRY_CHAR_LIMIT, }, }, null, 2, )}\n`, ); process.exitCode = 0;