@zaofan/dsh-qqbot 1.4.6 → 1.5.0
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/README.md +158 -535
- package/README_EN.md +6 -0
- package/client/qqbot-settings.js +152 -5
- package/dist/channel-tools.d.ts.map +1 -1
- package/dist/channel-tools.js +106 -1
- package/dist/channel-tools.js.map +1 -1
- package/dist/features/agg-score.d.ts +73 -0
- package/dist/features/agg-score.d.ts.map +1 -0
- package/dist/features/agg-score.js +63 -0
- package/dist/features/agg-score.js.map +1 -0
- package/dist/features/attitude.d.ts +132 -0
- package/dist/features/attitude.d.ts.map +1 -0
- package/dist/features/attitude.js +318 -0
- package/dist/features/attitude.js.map +1 -0
- package/dist/features/bot-reply-memo.d.ts +8 -0
- package/dist/features/bot-reply-memo.d.ts.map +1 -0
- package/dist/features/bot-reply-memo.js +34 -0
- package/dist/features/bot-reply-memo.js.map +1 -0
- package/dist/features/emo-samples.d.ts +27 -0
- package/dist/features/emo-samples.d.ts.map +1 -0
- package/dist/features/emo-samples.js +116 -0
- package/dist/features/emo-samples.js.map +1 -0
- package/dist/features/four-source.d.ts +114 -0
- package/dist/features/four-source.d.ts.map +1 -0
- package/dist/features/four-source.js +260 -0
- package/dist/features/four-source.js.map +1 -0
- package/dist/features/image-url-ledger.d.ts +2 -0
- package/dist/features/image-url-ledger.d.ts.map +1 -1
- package/dist/features/image-url-ledger.js +23 -0
- package/dist/features/image-url-ledger.js.map +1 -1
- package/dist/features/intimacy-ledger.d.ts +31 -0
- package/dist/features/intimacy-ledger.d.ts.map +1 -0
- package/dist/features/intimacy-ledger.js +113 -0
- package/dist/features/intimacy-ledger.js.map +1 -0
- package/dist/features/local-signals.d.ts +130 -0
- package/dist/features/local-signals.d.ts.map +1 -0
- package/dist/features/local-signals.js +445 -0
- package/dist/features/local-signals.js.map +1 -0
- package/dist/features/people-memo.d.ts +52 -0
- package/dist/features/people-memo.d.ts.map +1 -0
- package/dist/features/people-memo.js +239 -0
- package/dist/features/people-memo.js.map +1 -0
- package/dist/features/quote-cache.d.ts +19 -0
- package/dist/features/quote-cache.d.ts.map +1 -0
- package/dist/features/quote-cache.js +67 -0
- package/dist/features/quote-cache.js.map +1 -0
- package/dist/features/self-disclosure.d.ts +28 -0
- package/dist/features/self-disclosure.d.ts.map +1 -0
- package/dist/features/self-disclosure.js +60 -0
- package/dist/features/self-disclosure.js.map +1 -0
- package/dist/features/tendency-samples.d.ts +22 -0
- package/dist/features/tendency-samples.d.ts.map +1 -0
- package/dist/features/tendency-samples.js +194 -0
- package/dist/features/tendency-samples.js.map +1 -0
- package/dist/features/thinking-log.d.ts +22 -0
- package/dist/features/thinking-log.d.ts.map +1 -0
- package/dist/features/thinking-log.js +70 -0
- package/dist/features/thinking-log.js.map +1 -0
- package/dist/features/xlsx.d.ts +28 -0
- package/dist/features/xlsx.d.ts.map +1 -0
- package/dist/features/xlsx.js +159 -0
- package/dist/features/xlsx.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -1
- package/dist/index.js.map +1 -1
- package/dist/session/session-manager.d.ts.map +1 -1
- package/dist/session/session-manager.js +25 -3
- package/dist/session/session-manager.js.map +1 -1
- package/dist/transport/events.d.ts +12 -0
- package/dist/transport/events.d.ts.map +1 -1
- package/dist/transport/events.js +15 -2
- package/dist/transport/events.js.map +1 -1
- package/dist/transport/inbound.d.ts.map +1 -1
- package/dist/transport/inbound.js +344 -20
- package/dist/transport/inbound.js.map +1 -1
- package/dist/transport/outbound-buffer.d.ts.map +1 -1
- package/dist/transport/outbound-buffer.js +8 -0
- package/dist/transport/outbound-buffer.js.map +1 -1
- package/dist/transport/outbound.d.ts +12 -0
- package/dist/transport/outbound.d.ts.map +1 -1
- package/dist/transport/outbound.js +170 -5
- package/dist/transport/outbound.js.map +1 -1
- package/docs/USER-GUIDE.md +429 -0
- package/package.json +2 -1
- package/settings-host.js +154 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* intimacy-ledger.ts — 亲密度**日报台账**(2026-09-13 主人定, 用来出《本周亲密度小报》)
|
|
3
|
+
*
|
|
4
|
+
* 为什么再记一份: `affinity.json` 是**累计**计数(一辈子总和), 出不了"本周"这种窗口;
|
|
5
|
+
* 这里按**天**分桶, 每桶记每人当天的可观测量 → 出小报时按最近 N 天求和即可。
|
|
6
|
+
*
|
|
7
|
+
* 只记**肉眼可核的事实**(不记内容、不记语义, 群里随时能核对):
|
|
8
|
+
* · msgs 当天说了多少条
|
|
9
|
+
* · mentions 当天点名她多少次
|
|
10
|
+
* · replies 当天"接她的话"多少次(本地小模型判定相关度 ≥ 0.6)
|
|
11
|
+
* · imgs 当天发的图/表情包多少张(投喂度)
|
|
12
|
+
*
|
|
13
|
+
* 存储: `{dataRoot}/.qqbot/intimacy-daily.json`
|
|
14
|
+
* `{ "days": { "2026-09-13": { "group:<gid>|<senderId>": { name, msgs, mentions, replies, imgs } } } }`
|
|
15
|
+
* 保留: 最近 {@link KEEP_DAYS} 天(默认 14), 更早的自动丢 —— 文件永远是几十 KB 级别。
|
|
16
|
+
*/
|
|
17
|
+
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
18
|
+
import { dirname, join } from 'node:path';
|
|
19
|
+
/** 保留天数(14 天: 够出"本周"和"上周对比") */
|
|
20
|
+
export const KEEP_DAYS = 14;
|
|
21
|
+
const cache = new Map();
|
|
22
|
+
function pathOf(dataRoot) {
|
|
23
|
+
return join(dataRoot, '.qqbot', 'intimacy-daily.json');
|
|
24
|
+
}
|
|
25
|
+
function todayKey(now = Date.now()) {
|
|
26
|
+
const d = new Date(now);
|
|
27
|
+
const p = (n) => String(n).padStart(2, '0');
|
|
28
|
+
return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())}`;
|
|
29
|
+
}
|
|
30
|
+
function load(dataRoot) {
|
|
31
|
+
const hit = cache.get(dataRoot);
|
|
32
|
+
if (hit)
|
|
33
|
+
return hit;
|
|
34
|
+
let data = { days: {} };
|
|
35
|
+
try {
|
|
36
|
+
const raw = JSON.parse(readFileSync(pathOf(dataRoot), 'utf8'));
|
|
37
|
+
if (raw && typeof raw === 'object' && raw.days && typeof raw.days === 'object')
|
|
38
|
+
data = { days: raw.days };
|
|
39
|
+
}
|
|
40
|
+
catch { /* 首次/损坏 → 空台账 */ }
|
|
41
|
+
cache.set(dataRoot, data);
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
function prune(data) {
|
|
45
|
+
const keys = Object.keys(data.days).sort();
|
|
46
|
+
if (keys.length <= KEEP_DAYS)
|
|
47
|
+
return;
|
|
48
|
+
for (const k of keys.slice(0, keys.length - KEEP_DAYS))
|
|
49
|
+
delete data.days[k];
|
|
50
|
+
}
|
|
51
|
+
function save(dataRoot, data) {
|
|
52
|
+
try {
|
|
53
|
+
const p = pathOf(dataRoot);
|
|
54
|
+
mkdirSync(dirname(p), { recursive: true });
|
|
55
|
+
writeFileSync(p, JSON.stringify(data), 'utf8');
|
|
56
|
+
}
|
|
57
|
+
catch { /* 记不上不影响主链 */ }
|
|
58
|
+
}
|
|
59
|
+
/** 记一条(每条群消息调一次): key = `group:<gid>|<senderId>` */
|
|
60
|
+
export function touchDaily(dataRoot, gid, senderId, opts = {}) {
|
|
61
|
+
if (!dataRoot || !gid || !senderId)
|
|
62
|
+
return;
|
|
63
|
+
try {
|
|
64
|
+
const data = load(dataRoot);
|
|
65
|
+
const day = todayKey();
|
|
66
|
+
const bucket = (data.days[day] ??= {});
|
|
67
|
+
const key = `group:${gid}|${senderId}`;
|
|
68
|
+
const cell = (bucket[key] ??= { msgs: 0, mentions: 0, replies: 0, imgs: 0 });
|
|
69
|
+
cell.msgs += 1;
|
|
70
|
+
if (opts.mention)
|
|
71
|
+
cell.mentions += 1;
|
|
72
|
+
if (opts.reply)
|
|
73
|
+
cell.replies += 1;
|
|
74
|
+
if (opts.img)
|
|
75
|
+
cell.imgs += 1;
|
|
76
|
+
if (opts.name)
|
|
77
|
+
cell.name = String(opts.name).slice(0, 40);
|
|
78
|
+
prune(data);
|
|
79
|
+
save(dataRoot, data);
|
|
80
|
+
}
|
|
81
|
+
catch { /* ignore */ }
|
|
82
|
+
}
|
|
83
|
+
/** 汇总最近 days 天(默认 7)的每人数据, 按 msgs 降序 */
|
|
84
|
+
export function weeklyRows(dataRoot, days = 7, now = Date.now()) {
|
|
85
|
+
const data = load(dataRoot);
|
|
86
|
+
const dayKeys = [];
|
|
87
|
+
for (let i = 0; i < days; i += 1)
|
|
88
|
+
dayKeys.push(todayKey(now - i * 86400_000));
|
|
89
|
+
const agg = new Map();
|
|
90
|
+
for (const dk of dayKeys) {
|
|
91
|
+
const bucket = data.days[dk];
|
|
92
|
+
if (!bucket)
|
|
93
|
+
continue;
|
|
94
|
+
for (const [key, cell] of Object.entries(bucket)) {
|
|
95
|
+
const cur = agg.get(key) ?? { key, name: cell.name, msgs: 0, mentions: 0, replies: 0, imgs: 0, activeDays: 0, daySet: new Set() };
|
|
96
|
+
cur.msgs += cell.msgs;
|
|
97
|
+
cur.mentions += cell.mentions;
|
|
98
|
+
cur.replies += cell.replies;
|
|
99
|
+
cur.imgs += cell.imgs;
|
|
100
|
+
cur.name = cell.name || cur.name;
|
|
101
|
+
cur.daySet.add(dk);
|
|
102
|
+
agg.set(key, cur);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return [...agg.values()]
|
|
106
|
+
.map((x) => ({ ...x, activeDays: x.daySet.size }))
|
|
107
|
+
.sort((a, b) => b.msgs - a.msgs);
|
|
108
|
+
}
|
|
109
|
+
/** 台账文件路径(脚本/面板用) */
|
|
110
|
+
export function ledgerPathOf(dataRoot) {
|
|
111
|
+
return pathOf(dataRoot);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=intimacy-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intimacy-ledger.js","sourceRoot":"","sources":["../../src/features/intimacy-ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { type EmoLabel } from './emo-samples.js';
|
|
2
|
+
import { type TendencyLabel } from './tendency-samples.js';
|
|
3
|
+
import type { Logger } from '../types.js';
|
|
4
|
+
export interface RelResult {
|
|
5
|
+
/** 当前消息 ↔ 她上一条发言 的余弦(0~1) */
|
|
6
|
+
relReply?: number;
|
|
7
|
+
/** 当前消息 ↔ 群里最近 5 条 的最大余弦(0~1) */
|
|
8
|
+
relHist?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* 算相关度。模型不可用/文本为空 → undefined(调用方照常记录其它字段)。
|
|
12
|
+
* @param history 群历史缓冲(`mwState.history`),只取最后 5 条有效文本
|
|
13
|
+
*/
|
|
14
|
+
export declare function computeRelevance(opts: {
|
|
15
|
+
gid: string;
|
|
16
|
+
currentText: string;
|
|
17
|
+
history: Array<{
|
|
18
|
+
messageId?: string;
|
|
19
|
+
content?: string;
|
|
20
|
+
}> | undefined;
|
|
21
|
+
modelDir?: string;
|
|
22
|
+
logger?: Logger;
|
|
23
|
+
}): Promise<RelResult | undefined>;
|
|
24
|
+
export interface AffinityEntry {
|
|
25
|
+
/** 最近一次看到的昵称 */
|
|
26
|
+
name?: string;
|
|
27
|
+
/** 消息数 */
|
|
28
|
+
msgs: number;
|
|
29
|
+
/** 被 @ 次数 */
|
|
30
|
+
mentions: number;
|
|
31
|
+
/** "接她的话"次数(相关度 ≥ 0.6 视为在接话) */
|
|
32
|
+
replies: number;
|
|
33
|
+
firstAt: number;
|
|
34
|
+
lastAt: number;
|
|
35
|
+
/** 记忆强度 0~1(2026-09-13 主人定:按记忆曲线遗忘;每次互动=一次复习 → 回满) */
|
|
36
|
+
strength?: number;
|
|
37
|
+
/** 复习次数(= 有效互动次数; 用来抬高遗忘下限、拉长遗忘时间常数) */
|
|
38
|
+
reviews?: number;
|
|
39
|
+
/** 上次复习(= 上次互动)时间戳 */
|
|
40
|
+
lastReview?: number;
|
|
41
|
+
/** 上次复习的**日期**(YYYY-MM-DD): 同一天多次互动只算一次复习(2026-09-13 主人定: 每天就几次复习) */
|
|
42
|
+
lastReviewDay?: string;
|
|
43
|
+
}
|
|
44
|
+
/** 记一次互动(每条群消息调一次; 只统计, 不生效) */
|
|
45
|
+
export declare function touchAffinity(dataRoot: string, key: string, opts?: {
|
|
46
|
+
name?: string;
|
|
47
|
+
mention?: boolean;
|
|
48
|
+
reply?: boolean;
|
|
49
|
+
}): void;
|
|
50
|
+
export declare function effectiveReviews(e: AffinityEntry, now?: number): number;
|
|
51
|
+
export declare function memoryStrength(e: AffinityEntry, now?: number): number;
|
|
52
|
+
/** 档位(滞回:进档门槛高于退档,防止抖动) */
|
|
53
|
+
export declare function memoryTier(strength: number, prevTier?: string): '陌生人' | '眼熟' | '熟人';
|
|
54
|
+
/** 0~100 分(= 记忆强度 × 100;面板与排序沿用它,语义已从"功劳榜"改为"记忆强度") */
|
|
55
|
+
export declare function affinityScore(e: AffinityEntry, now?: number): number;
|
|
56
|
+
/** 取某人的台账条目(好感度聚合要用它的熟识度算阻尼与范围) */
|
|
57
|
+
export declare function getAffinityEntry(dataRoot: string, key: string): AffinityEntry | undefined;
|
|
58
|
+
/** 按熟度排序(面板/工具用) */
|
|
59
|
+
export declare function topAffinity(dataRoot: string, limit?: number): Array<{
|
|
60
|
+
key: string;
|
|
61
|
+
name?: string;
|
|
62
|
+
score: number;
|
|
63
|
+
tier: string;
|
|
64
|
+
reviews: number;
|
|
65
|
+
msgs: number;
|
|
66
|
+
mentions: number;
|
|
67
|
+
replies: number;
|
|
68
|
+
lastAt: number;
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* 用**同一个本地小模型**判"这句话是夸、骂还是中性":
|
|
72
|
+
* 把三组例句各嵌一次(缓存), 新文本嵌入后跟每组求平均相似度, 取最高的那组。
|
|
73
|
+
* ⚠️ 只做**弱信号**: 反讽/互怼/引用会误判 → 观察期只记录, 不参与行为。
|
|
74
|
+
*/
|
|
75
|
+
/**
|
|
76
|
+
* 判定打分方式(2026-09-14 主人要求"重新添加样本测试一下"之后的实测结论)。
|
|
77
|
+
*
|
|
78
|
+
* · `centroid` = 每组例句取**平均向量**(原做法)
|
|
79
|
+
* · `knn` = 每组取**最相似的 K 条**,平均相似度(现做法)
|
|
80
|
+
*
|
|
81
|
+
* 为什么换:质心会把一组的几十条例句揉成"平均意思",样本越杂越糊 ——
|
|
82
|
+
* 实测把"没点名我,静默"判成「拒绝」、把 141 字热情卖萌正文判成「冷」、
|
|
83
|
+
* 把工具参数里的「…需回应」判成「拒绝」(这三条都在 m1/eval 里钉成回归样本)。
|
|
84
|
+
* kNN 不做平均,直接看"这句话最像组里的哪几句",边界句不再被离群样本拖走。
|
|
85
|
+
*
|
|
86
|
+
* 回滚:把它改回 `'centroid'` 即可(其余代码一行不用动)。
|
|
87
|
+
* 复跑:`node m1/judge-eval.mjs --kind tendency|emo`(改样本/改门槛后都跑一遍)。
|
|
88
|
+
*/
|
|
89
|
+
export declare const CLASSIFY_SCORE_MODE: 'knn' | 'centroid';
|
|
90
|
+
export interface EmoResult {
|
|
91
|
+
label: EmoLabel;
|
|
92
|
+
/** 最高组得分 */
|
|
93
|
+
best: number;
|
|
94
|
+
/** 与第二名的差(越大越有把握) */
|
|
95
|
+
margin: number;
|
|
96
|
+
/** 三组原始得分, 便于观察 */
|
|
97
|
+
scores: Record<string, number>;
|
|
98
|
+
}
|
|
99
|
+
export declare function classifyEmo(text: string, opts?: {
|
|
100
|
+
modelDir?: string;
|
|
101
|
+
logger?: Logger;
|
|
102
|
+
}): Promise<EmoResult | undefined>;
|
|
103
|
+
/**
|
|
104
|
+
* 用途(设计稿 §11): **语言情绪库判对方, 倾向库判她自己** ——
|
|
105
|
+
* 她对某个人的态度不长在情绪词上, 而藏在**选择**里(接不接梗、给不给台阶、愿不愿多花力气),
|
|
106
|
+
* 所以拿 `tendency-samples.ts` 的亲近/拒绝/任务三组例句做质心比对。
|
|
107
|
+
*
|
|
108
|
+
* ⚠️ 语言必须对得上: 中文思考配 zh 库、英文配 en 库; **中英混杂跳过不判**(跨语言比不了, 宁可空着)。
|
|
109
|
+
* ⚠️ 弱信号: 观察期只记录, 不参与行为; 绝不用它冷落谁。
|
|
110
|
+
*/
|
|
111
|
+
export interface TendencyResult {
|
|
112
|
+
label: TendencyLabel;
|
|
113
|
+
best: number;
|
|
114
|
+
margin: number;
|
|
115
|
+
scores: Record<string, number>;
|
|
116
|
+
/** 判定所用语言(zh / en) */
|
|
117
|
+
lang: 'zh' | 'en';
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 按 CJK 占比判语言: ≥0.6 判中文 / ≤0.25 判英文 / 中间=中英混杂 → undefined(跳过不判)。
|
|
121
|
+
* 只数"汉字"与"拉丁字母", 标点、数字、空格、表情都不参与。
|
|
122
|
+
* 阈值放宽的理由: 她的思考常夹英文术语("先 reply 他"), 只要中文为主仍按中文库判;
|
|
123
|
+
* 真·对半开才跳过 —— 小模型的英文语义质量差, 判了不如空着(设计稿: 不确定就不动分)。
|
|
124
|
+
*/
|
|
125
|
+
export declare function detectScript(text: string): 'zh' | 'en' | undefined;
|
|
126
|
+
export declare function classifyTendency(text: string, opts?: {
|
|
127
|
+
modelDir?: string;
|
|
128
|
+
logger?: Logger;
|
|
129
|
+
}): Promise<TendencyResult | undefined>;
|
|
130
|
+
//# sourceMappingURL=local-signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-signals.d.ts","sourceRoot":"","sources":["../../src/features/local-signals.ts"],"names":[],"mappings":"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"}
|