dsh-chubby-whale 1.1.56 → 1.1.57
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/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,18 @@
|
|
|
4
4
|
|
|
5
5
|
## [未发布]
|
|
6
6
|
|
|
7
|
+
## [1.1.57] - 2026-11-07
|
|
8
|
+
|
|
9
|
+
### 修复(B73 主代理:统计与备份)
|
|
10
|
+
- **`/stats` 四个自检字段从未接线**:`index.ts` 只注入了 `cacheStats/loadState/...`,`dataSource`、`model`、`tts`、`backup` 全缺,而 `autoBackupInfo`、`getTtsEngineStats` 只是死导入 → 统计卡永远显示「本机恒 local、模型空、TTS 不可用、备份 0 份」
|
|
11
|
+
- 现在 `StatsHandlerDeps` 支持传**读取器**(值或 getter),每次出包取当前值(备份份数、模型名不再是插件加载那一刻的快照);TTS 统计显式映射 `getTtsEngineStats()` 的宽形状——只有 `probeState === 'ok'` 才算可用,引擎未暴露 worker 冷却状态,`cooling` 恒 `false`(宁可为空,不臆造)
|
|
12
|
+
- **备份导入后不清服务端聊天缓存**:导入会整字段覆盖 memory/personality,但旧回复还在缓存里,只靠客户端 `delJson('/cache')` 补刀;非 GUI 调用或那次失败时就命中旧缓存。现在 `BackupDeps` 增加 `clearChatCache`,导入 `memory`/`personality` 成功后由服务端自己清(只导入 `state` 之类不清,避免无谓清空)
|
|
13
|
+
|
|
14
|
+
### 测试
|
|
15
|
+
- `test.mjs` 补 2 条:导入记忆后作废缓存 / 只导入 state 不清缓存
|
|
16
|
+
- `test-misc-routes.mjs` 补 4 条:getter 首次取值、第二次取到新值、未确认可用、getter 抛错回落缺省
|
|
17
|
+
- 全链 **2409 项 0 失败**(2403 + 2 + 4)
|
|
18
|
+
|
|
7
19
|
## [1.1.56] - 2026-11-07
|
|
8
20
|
|
|
9
21
|
### 修复(B69 动作剩余分身)
|
package/dist/client.js
CHANGED
|
@@ -93,6 +93,15 @@ export function createBackupHandlers(deps) {
|
|
|
93
93
|
return;
|
|
94
94
|
}
|
|
95
95
|
const report = runImport(deps, judged.body);
|
|
96
|
+
// 记忆/人格换了内容 → 旧聊天缓存必须作废(失败只记日志,不影响导入结果)
|
|
97
|
+
if (deps.clearChatCache && (report.imported.indexOf('memory') >= 0 || report.imported.indexOf('personality') >= 0)) {
|
|
98
|
+
try {
|
|
99
|
+
await deps.clearChatCache();
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
console.error('[backup] CACHE-CLEAR-FAIL ' + String((e && e.message) || e));
|
|
103
|
+
}
|
|
104
|
+
}
|
|
96
105
|
sendJson(res, { ok: true, imported: report.imported, skipped: report.skipped });
|
|
97
106
|
}
|
|
98
107
|
catch (err) {
|
|
@@ -22,6 +22,18 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { growthStage } from '../../shared/growth.js';
|
|
24
24
|
import { sendJson, sendError } from '../respond.js';
|
|
25
|
+
function resolve(v, fallback) {
|
|
26
|
+
if (typeof v === 'function') {
|
|
27
|
+
try {
|
|
28
|
+
const got = v();
|
|
29
|
+
return got === undefined || got === null ? fallback : got;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return fallback;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return v === undefined || v === null ? fallback : v;
|
|
36
|
+
}
|
|
25
37
|
/** 非负整数(NaN/负数/小数一律归零或取整,展示用不需要负值) */
|
|
26
38
|
function count(value) {
|
|
27
39
|
const n = Number(value);
|
|
@@ -62,9 +74,12 @@ export function createStatsHandler(opts) {
|
|
|
62
74
|
const elapsed = nowFn() - startedAt;
|
|
63
75
|
// 时钟坏了(now() 非有限数)时 elapsed 是 NaN,JSON 会把它写成 null;这里给 0,保持数字类型
|
|
64
76
|
const uptimeMs = startedAt > 0 && Number.isFinite(elapsed) ? Math.max(0, Math.floor(elapsed)) : 0;
|
|
65
|
-
// 自检字段是"外部注入"
|
|
66
|
-
|
|
67
|
-
const
|
|
77
|
+
// 自检字段是"外部注入"的:形状由调用方决定,这里逐项归一再出包;
|
|
78
|
+
// 支持 getter(备份份数/模型名要反映"现在",而不是插件加载那一刻)
|
|
79
|
+
const ttsRaw = resolve(opts.tts, {}) || {};
|
|
80
|
+
const backupRaw = resolve(opts.backup, {}) || {};
|
|
81
|
+
const dataSource = String(resolve(opts.dataSource, 'local') || 'local');
|
|
82
|
+
const model = String(resolve(opts.model, '') || '');
|
|
68
83
|
return {
|
|
69
84
|
ok: true,
|
|
70
85
|
cache: { tts: count(cache.tts), chat: count(cache.chat), asr: count(cache.asr) },
|
|
@@ -79,8 +94,8 @@ export function createStatsHandler(opts) {
|
|
|
79
94
|
},
|
|
80
95
|
uptimeMs,
|
|
81
96
|
// 自检:数据源 / 模型 / TTS 引擎 / 备份(缺省不报错;坏值也不许把 null/负数/怪类型漏出去)
|
|
82
|
-
dataSource
|
|
83
|
-
model
|
|
97
|
+
dataSource,
|
|
98
|
+
model,
|
|
84
99
|
tts: {
|
|
85
100
|
available: ttsRaw.available === true,
|
|
86
101
|
interpreter: typeof ttsRaw.interpreter === 'string' ? ttsRaw.interpreter : '',
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* chat-core.ts(聊天纯函数)、prefs.ts(偏好)、atomic/body/respond/http(小工具)。
|
|
10
10
|
*/
|
|
11
11
|
import { migrateRuntimeData } from './host/migrate.js';
|
|
12
|
-
import { startAutoBackup } from './host/auto-backup.js';
|
|
12
|
+
import { startAutoBackup, autoBackupInfo } from './host/auto-backup.js';
|
|
13
13
|
import { buildSystemPrompt, SYSTEM_PROMPT } from './host/persona.js';
|
|
14
14
|
import { dirname, join } from 'node:path';
|
|
15
15
|
import { homedir } from 'node:os';
|
|
@@ -39,6 +39,7 @@ import { createPoemTitlesHandler } from './host/routes/poem-titles.js';
|
|
|
39
39
|
import { createBriefingHandlers } from './host/routes/briefing.js';
|
|
40
40
|
import { createTtsHandler } from './host/routes/tts.js';
|
|
41
41
|
import { createCloudTts, readCloudVoice } from './host/voice/cloud-tts.js';
|
|
42
|
+
import { getTtsEngineStats } from './host/tts-engine.js';
|
|
42
43
|
import { createAsrHandler } from './host/routes/asr.js';
|
|
43
44
|
import { createDailyHandler } from './host/routes/daily.js';
|
|
44
45
|
import { createBackupHandlers } from './host/routes/backup.js';
|
|
@@ -314,6 +315,8 @@ export function apply(ctx, rawConfig) {
|
|
|
314
315
|
loadStoryProgress: store.loadStoryProgress,
|
|
315
316
|
saveStoryProgress: store.saveStoryProgress,
|
|
316
317
|
onStoryProgressImported: () => storyPlayer.reloadProgress(),
|
|
318
|
+
// 导入记忆/人格后作废旧聊天缓存(服务端保证,不依赖客户端补刀)
|
|
319
|
+
clearChatCache: () => chatCache.clear(),
|
|
317
320
|
});
|
|
318
321
|
// 可视化汇总:全部读现有 store / cache / 人格,不新增持久化
|
|
319
322
|
// 运行数据自动定时备份(每小时一份、保留 7 份;失败静默;插件 dispose 时停)
|
|
@@ -352,6 +355,19 @@ export function apply(ctx, rawConfig) {
|
|
|
352
355
|
return false;
|
|
353
356
|
} },
|
|
354
357
|
});
|
|
358
|
+
// TTS 自检映射:getTtsEngineStats() 的形状与路由声明的窄形状不同,这里显式转换,
|
|
359
|
+
// 不把引擎内部字段直接漏给 /stats。probeState==='ok' 才表示「确认可用」
|
|
360
|
+
// ('none'/'timeout' 属未确认,不臆造成可用);引擎没有暴露 worker 冷却状态,
|
|
361
|
+
// cooling 恒 false —— 宁可为空,也不假装知道。
|
|
362
|
+
function ttsStatOf() {
|
|
363
|
+
try {
|
|
364
|
+
const t = getTtsEngineStats();
|
|
365
|
+
return { available: t.probeState === 'ok', interpreter: t.interpreter || '', cooling: false };
|
|
366
|
+
}
|
|
367
|
+
catch {
|
|
368
|
+
return { available: false, interpreter: '', cooling: false };
|
|
369
|
+
}
|
|
370
|
+
}
|
|
355
371
|
const stats = createStatsHandler({
|
|
356
372
|
cacheStats,
|
|
357
373
|
loadState: store.loadState,
|
|
@@ -359,6 +375,11 @@ export function apply(ctx, rawConfig) {
|
|
|
359
375
|
loadFishfood: store.loadFishfood,
|
|
360
376
|
loadPersonality: () => personality.load(),
|
|
361
377
|
startedAt: Date.now(),
|
|
378
|
+
// 传 getter:统计要反映「现在」的设置与备份份数,而不是插件加载那一刻的快照
|
|
379
|
+
dataSource: () => dataSource,
|
|
380
|
+
model: () => chatModel,
|
|
381
|
+
backup: () => autoBackupInfo(RUNTIME_DIR),
|
|
382
|
+
tts: () => ttsStatOf(),
|
|
362
383
|
});
|
|
363
384
|
// 路径 → handler 的映射集中在 host/routes.ts,入口不再逐条写 reg(...)
|
|
364
385
|
const routeTable = createRouteTable({
|
|
@@ -115,3 +115,4 @@
|
|
|
115
115
|
| B70 | 2026-11-07 | 杂项路由分身:`/config` 布尔 safeBool(杜绝 Key 回显)/ `/stats` 亲密度同口径 + NaN 归一 / `/briefing` 只认 GET·HEAD + exp 非负 + 坏项守卫 / `/balance` 恒有值 + `BAD_RESPONSE` / 喂食失败回落亲密度;新增 `test-misc-routes.mjs`(97);版本 1.1.56 | 双 tsc 0 / build 0 / 2307 项 0 失败 | 见 git |
|
|
116
116
|
| B71 | 2026-11-07 | 主代理:唤醒词立即生效——`voice-bridge` 判定前同步 `loadCustomWakeWords()`(原地换数组、保留 30s 有效窗),诊断与提示同源;版本 1.1.56 | 双 tsc 0 / build 0 / 2307 项 0 失败 | 见 git |
|
|
117
117
|
| B72 | 2026-11-07 | 客户端聊天分身:`reactTo` 移到流式之前(修「人设情绪在默认路径从不触发」)/ 流式回退前补纪元守卫 / P0 打断条件补 `storyBusy` / 占线阈值改用 `BUSY_STALE_MS`;新增 `test-chat-client.mjs`(96);版本 1.1.56 | 双 tsc 0 / build 0(+85B) / 2403 项 0 失败 | 见 git |
|
|
118
|
+
| B73 | 2026-11-07 | 主代理:`/stats` 四个自检字段接线(deps 支持 getter,TTS 形状显式映射,`cooling` 不臆造)/ `BackupDeps.clearChatCache`——导入记忆·人格后服务端清新聊天缓存(不再只靠客户端补刀);`test.mjs` 补 2 条、`test-misc-routes` 补 4 条;版本 1.1.57 | 双 tsc 0 / build 0 / **2409 项 0 失败** / 119 模块 717 导出 | 见 git |
|