weflow-cli 1.7.0 → 1.8.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/ARCHITECTURE.md +3 -2
- package/CHANGELOG.md +1949 -1
- package/OPERATIONS.md +774 -1
- package/README.en.md +93 -7
- package/README.md +31 -6
- package/bin/weflow-cli.ts +934 -27
- package/dist/bin/weflow-cli.js +952 -27
- package/dist/bin/weflow-cli.js.map +1 -1
- package/dist/mcp-server/index.js +39 -13
- package/dist/mcp-server/index.js.map +1 -1
- package/dist/src/core/appMsgFormat.d.ts +37 -0
- package/dist/src/core/appMsgFormat.d.ts.map +1 -0
- package/dist/src/core/appMsgFormat.js +106 -0
- package/dist/src/core/appMsgFormat.js.map +1 -0
- package/dist/src/core/ntCore.d.ts +19 -2
- package/dist/src/core/ntCore.d.ts.map +1 -1
- package/dist/src/core/ntCore.js +11 -1
- package/dist/src/core/ntCore.js.map +1 -1
- package/dist/src/core/sqlcipherCore.d.ts +0 -12
- package/dist/src/core/sqlcipherCore.d.ts.map +1 -1
- package/dist/src/core/sqlcipherCore.js +5 -64
- package/dist/src/core/sqlcipherCore.js.map +1 -1
- package/dist/src/core/wcdbCore.d.ts +1 -1
- package/dist/src/core/wcdbCore.d.ts.map +1 -1
- package/dist/src/core/wcdbCore.js +5 -1
- package/dist/src/core/wcdbCore.js.map +1 -1
- package/dist/src/panel/client.d.ts +25 -0
- package/dist/src/panel/client.d.ts.map +1 -0
- package/dist/src/panel/client.js +34 -0
- package/dist/src/panel/client.js.map +1 -0
- package/dist/src/panel/endpoint.d.ts +45 -0
- package/dist/src/panel/endpoint.d.ts.map +1 -0
- package/dist/src/panel/endpoint.js +132 -0
- package/dist/src/panel/endpoint.js.map +1 -0
- package/dist/src/panel/launch.d.ts +50 -0
- package/dist/src/panel/launch.d.ts.map +1 -0
- package/dist/src/panel/launch.js +74 -0
- package/dist/src/panel/launch.js.map +1 -0
- package/dist/src/panel/server.d.ts +23 -0
- package/dist/src/panel/server.d.ts.map +1 -0
- package/dist/src/panel/server.js +413 -0
- package/dist/src/panel/server.js.map +1 -0
- package/dist/src/panel/userId.d.ts +37 -0
- package/dist/src/panel/userId.d.ts.map +1 -0
- package/dist/src/panel/userId.js +56 -0
- package/dist/src/panel/userId.js.map +1 -0
- package/dist/src/services/assistantDaemon.d.ts +20 -3
- package/dist/src/services/assistantDaemon.d.ts.map +1 -1
- package/dist/src/services/assistantDaemon.js +46 -9
- package/dist/src/services/assistantDaemon.js.map +1 -1
- package/dist/src/services/assistantEval.d.ts +141 -0
- package/dist/src/services/assistantEval.d.ts.map +1 -0
- package/dist/src/services/assistantEval.js +497 -0
- package/dist/src/services/assistantEval.js.map +1 -0
- package/dist/src/services/assistantMemory.d.ts +106 -4
- package/dist/src/services/assistantMemory.d.ts.map +1 -1
- package/dist/src/services/assistantMemory.js +396 -61
- package/dist/src/services/assistantMemory.js.map +1 -1
- package/dist/src/services/assistantPrivacy.d.ts +15 -2
- package/dist/src/services/assistantPrivacy.d.ts.map +1 -1
- package/dist/src/services/assistantPrivacy.js +18 -4
- package/dist/src/services/assistantPrivacy.js.map +1 -1
- package/dist/src/services/assistantRouter.d.ts +41 -0
- package/dist/src/services/assistantRouter.d.ts.map +1 -0
- package/dist/src/services/assistantRouter.js +151 -0
- package/dist/src/services/assistantRouter.js.map +1 -0
- package/dist/src/services/assistantService.d.ts +209 -3
- package/dist/src/services/assistantService.d.ts.map +1 -1
- package/dist/src/services/assistantService.js +590 -75
- package/dist/src/services/assistantService.js.map +1 -1
- package/dist/src/services/assistantTools.d.ts +205 -1
- package/dist/src/services/assistantTools.d.ts.map +1 -1
- package/dist/src/services/assistantTools.js +1089 -58
- package/dist/src/services/assistantTools.js.map +1 -1
- package/dist/src/services/assistantTrace.d.ts +47 -0
- package/dist/src/services/assistantTrace.d.ts.map +1 -0
- package/dist/src/services/assistantTrace.js +150 -0
- package/dist/src/services/assistantTrace.js.map +1 -0
- package/dist/src/services/chatService.d.ts +1 -1
- package/dist/src/services/chatService.d.ts.map +1 -1
- package/dist/src/services/chatService.js +5 -2
- package/dist/src/services/chatService.js.map +1 -1
- package/dist/src/services/configService.d.ts +9 -0
- package/dist/src/services/configService.d.ts.map +1 -1
- package/dist/src/services/configService.js +15 -8
- package/dist/src/services/configService.js.map +1 -1
- package/dist/src/services/pythonBridge.d.ts +41 -0
- package/dist/src/services/pythonBridge.d.ts.map +1 -0
- package/dist/src/services/pythonBridge.js +119 -0
- package/dist/src/services/pythonBridge.js.map +1 -0
- package/dist/src/services/syncService.d.ts +8 -2
- package/dist/src/services/syncService.d.ts.map +1 -1
- package/dist/src/services/syncService.js +26 -7
- package/dist/src/services/syncService.js.map +1 -1
- package/dist/src/services/wechatMessageService.d.ts +25 -0
- package/dist/src/services/wechatMessageService.d.ts.map +1 -1
- package/dist/src/services/wechatMessageService.js +69 -7
- package/dist/src/services/wechatMessageService.js.map +1 -1
- package/dist/src/utils/atomicWrite.d.ts +4 -0
- package/dist/src/utils/atomicWrite.d.ts.map +1 -0
- package/dist/src/utils/atomicWrite.js +60 -0
- package/dist/src/utils/atomicWrite.js.map +1 -0
- package/dist/src/utils/dateRange.d.ts +15 -0
- package/dist/src/utils/dateRange.d.ts.map +1 -1
- package/dist/src/utils/dateRange.js +47 -0
- package/dist/src/utils/dateRange.js.map +1 -1
- package/dist/src/utils/text.d.ts +18 -0
- package/dist/src/utils/text.d.ts.map +1 -0
- package/dist/src/utils/text.js +20 -0
- package/dist/src/utils/text.js.map +1 -0
- package/docs/AI_INTERFACE.md +2 -0
- package/docs/DECISIONS.md +1424 -0
- package/docs/EXTENDING.md +187 -0
- package/docs/JEV/345/272/224/347/224/250/346/226/275/345/267/245/346/226/207/346/241/243.md +310 -0
- package/docs/MCP.md +23 -4
- package/docs/PROJECT_STATE.md +299 -98
- package/docs/SETUP.md +22 -0
- package/docs/SYNC_CONTRACT.md +31 -3
- package/mcp-server/index.ts +681 -657
- package/package.json +84 -83
- package/resources/panel/ball-position.cjs +153 -0
- package/resources/panel/index.html +46 -0
- package/resources/panel/main.cjs +447 -0
- package/resources/panel/mascot-focus.png +0 -0
- package/resources/panel/mascot-happy.png +0 -0
- package/resources/panel/mascot-sorry.png +0 -0
- package/resources/panel/mascot-tired.png +0 -0
- package/resources/panel/mascot.png +0 -0
- package/resources/panel/package.json +7 -0
- package/resources/panel/panel.css +407 -0
- package/resources/panel/preload.cjs +72 -0
- package/resources/panel/quick-menu.cjs +197 -0
- package/resources/panel/renderer.js +441 -0
- package/resources/panel/tray-menu.cjs +40 -0
- package/resources/panel/tray.png +0 -0
- package/scripts/_utils.py +403 -54
- package/scripts/annual_report.py +4 -2
- package/scripts/article_notes.py +423 -0
- package/scripts/backfill_articles.py +438 -0
- package/scripts/biz_daily.py +590 -105
- package/scripts/chat_notes.py +470 -0
- package/scripts/classify_daily.py +10 -18
- package/scripts/compile_wiki.py +1059 -46
- package/scripts/create_reading_notes.py +199 -14
- package/scripts/decide.py +253 -0
- package/scripts/draft_reply.py +671 -0
- package/scripts/export_chat_html.py +35 -33
- package/scripts/extract_todos.py +31 -5
- package/scripts/fav_notes.py +318 -0
- package/scripts/fix_topics.py +2 -1
- package/scripts/generate_ai_report.py +214 -9
- package/scripts/generate_html.py +18 -3
- package/scripts/generate_review.py +2 -2
- package/scripts/jev_client.py +294 -0
- package/scripts/jev_probe.py +440 -0
- package/scripts/nt_common.py +82 -0
- package/scripts/nt_decrypt.py +1755 -1460
- package/scripts/pipeline.py +27 -2
- package/scripts/promote_ideas.py +19 -4
- package/scripts/quality_eval.py +707 -0
- package/scripts/rag_chat.py +4 -4
- package/scripts/read_image.py +187 -0
- package/scripts/reply_debt.py +488 -0
- package/scripts/route_cards.py +453 -0
- package/scripts/semantic_search.py +208 -49
- package/scripts/user_notes.py +315 -0
- package/scripts/vault_rag.py +13 -7
- package/scripts/vault_search.py +21 -4
- package/scripts/wiki_lint.py +397 -0
- package/src/core/appMsgFormat.ts +117 -0
- package/src/core/ntCore.ts +27 -2
- package/src/core/sqlcipherCore.ts +5 -61
- package/src/core/wcdbCore.ts +6 -2
- package/src/panel/client.ts +49 -0
- package/src/panel/endpoint.ts +144 -0
- package/src/panel/launch.ts +101 -0
- package/src/panel/server.ts +424 -0
- package/src/panel/userId.ts +72 -0
- package/src/services/assistantDaemon.ts +57 -9
- package/src/services/assistantEval.ts +611 -0
- package/src/services/assistantMemory.ts +413 -57
- package/src/services/assistantPrivacy.ts +18 -4
- package/src/services/assistantRouter.ts +191 -0
- package/src/services/assistantService.ts +671 -74
- package/src/services/assistantTools.ts +1118 -57
- package/src/services/assistantTrace.ts +175 -0
- package/src/services/chatService.ts +6 -2
- package/src/services/configService.ts +403 -385
- package/src/services/pythonBridge.ts +139 -0
- package/src/services/syncService.ts +37 -9
- package/src/services/wechatMessageService.ts +73 -7
- package/src/utils/atomicWrite.ts +56 -0
- package/src/utils/dateRange.ts +46 -0
- package/src/utils/text.ts +20 -0
|
@@ -1,42 +1,157 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 三层记忆 (参考 LangGraph checkpointer + Mem0
|
|
3
|
-
* L1 工作记忆
|
|
4
|
-
* L2 滚动摘要
|
|
5
|
-
* L3 长期事实 从对话中提取的持久信息 (偏好/项目/关系)
|
|
6
|
-
* 持久化: ~/.weflow-cli/assistant_memory.json
|
|
2
|
+
* 三层记忆 (参考 LangGraph checkpointer + Mem0 范式,工程细节对照 deepseek-harness 的压缩纪律):
|
|
3
|
+
* L1 工作记忆 最近若干轮原文 (滑入滑出,按**预算比率**与条数两道闸)
|
|
4
|
+
* L2 滚动摘要 滑出的旧轮次压缩成摘要,跨窗口保留脉络
|
|
5
|
+
* L3 长期事实 从对话中提取的持久信息 (偏好/项目/关系),带溯源,注入系统提示
|
|
6
|
+
* 持久化: ~/.weflow-cli/assistant_memory.json(带 `version`,见下)
|
|
7
|
+
*
|
|
8
|
+
* ## 文件格式与版本
|
|
9
|
+
*
|
|
10
|
+
* ```json
|
|
11
|
+
* { "version": 1,
|
|
12
|
+
* "users": { "<会话id>": {
|
|
13
|
+
* "working": [{"role":"user","content":"…"}],
|
|
14
|
+
* "summary": "…",
|
|
15
|
+
* "facts": [{"content":"…","ts":0,"sourceTurn":6,"sourceQuote":"…","usedAt":0}],
|
|
16
|
+
* "turnCount": 12 } } }
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* **什么算结构变更、要 bump 版本**(这条判据本身就是格式的一部分):
|
|
20
|
+
* 字段改名/删除、字段含义或单位变了、键空间变了(例如 `users` 这一层)。**只加可选字段不算**——
|
|
21
|
+
* 读者忽略不认识的字段即可。当前 `MEMORY_FORMAT_VERSION = 1`。
|
|
22
|
+
*
|
|
23
|
+
* **读不出来时怎么办**:v0(没有 `version`、顶层直接是会话 id,历史遗留)**迁移**到 v1;
|
|
24
|
+
* 版本等于当前值的正常读;**其它一律拒绝**(不猜、不迁移),并把原文件**改名留档**再以空状态启动。
|
|
25
|
+
* 静默丢弃用户记忆是不能接受的,所以留档这一步是强制的,`loadIssue` 会把话说出来。
|
|
7
26
|
*/
|
|
8
27
|
import { join } from 'path';
|
|
9
|
-
import {
|
|
28
|
+
import { writeFileAtomic } from '../utils/atomicWrite.js';
|
|
29
|
+
import { existsSync, readFileSync, mkdirSync, renameSync } from 'fs';
|
|
10
30
|
import os from 'os';
|
|
31
|
+
import { privacyGate } from './assistantPrivacy.js';
|
|
11
32
|
const MEMORY_FILE = join(os.homedir(), '.weflow-cli', 'assistant_memory.json');
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const
|
|
15
|
-
|
|
33
|
+
export const MEMORY_FORMAT_VERSION = 1;
|
|
34
|
+
/** 输入预算(字符)。中文约 1 token/字,按 24k 字留足余量给系统提示与工具结果 */
|
|
35
|
+
export const CONTEXT_BUDGET_CHARS = 24000;
|
|
36
|
+
/** 窗口占用达预算这个比例就压缩 */
|
|
37
|
+
export const WORKING_TRIGGER_RATIO = 0.8;
|
|
38
|
+
/** 压完最多保留预算的这个比例(按字符) */
|
|
39
|
+
export const WORKING_RETAIN_RATIO = 0.16;
|
|
40
|
+
/** 保留的条数下限:预算算出来太少时按这个来,别把小窗口压空 */
|
|
41
|
+
export const WORKING_MIN_TURNS = 6;
|
|
42
|
+
/** 条数上限:与预算闸并行,谁先到谁生效 */
|
|
43
|
+
export const WORKING_MAX = 16;
|
|
44
|
+
export const SUMMARY_MAX = 800;
|
|
45
|
+
export const FACTS_MAX = 30;
|
|
46
|
+
export const FACT_EXTRACT_EVERY = 6;
|
|
47
|
+
/** 每次注入事实的字符预算:30 条 × 72 字 ≈ 2.1KB 全塞进去是纯噪声,按相关度取一部分 */
|
|
48
|
+
export const FACTS_INJECT_BUDGET_CHARS = 1200;
|
|
49
|
+
/** 相关度低于这个值就不进上下文:**预算空着也不填无关事实** */
|
|
50
|
+
export const FACT_RELEVANCE_FLOOR = 0.2;
|
|
51
|
+
/** 一条都不相关时至少给最近这么多条——「记忆」本身也是上下文 */
|
|
52
|
+
export const FACTS_INJECT_MIN_RECENT = 8;
|
|
53
|
+
/** 两条事实的包含关系达到这个比例才当"同一条"(长的、更具体的那条胜出) */
|
|
54
|
+
const FACT_SAME_RATIO = 0.5;
|
|
55
|
+
function chars(turns) {
|
|
56
|
+
return turns.reduce((n, t) => n + (t.content?.length ?? 0), 0);
|
|
57
|
+
}
|
|
58
|
+
/** 事实的归一化形式:去掉空白与常见标点,再小写。只用于**比较**,不用于存储 */
|
|
59
|
+
export function normalizeFact(text) {
|
|
60
|
+
return String(text ?? '')
|
|
61
|
+
.replace(/\s+/g, '')
|
|
62
|
+
.replace(/[,。、;:!?,.;:!?()()【】[\]{}"'「」『』·—~~]/g, '')
|
|
63
|
+
.toLowerCase();
|
|
64
|
+
}
|
|
16
65
|
export class AssistantMemory {
|
|
17
66
|
states = {};
|
|
18
67
|
/** 本进程修改过的用户 (save 时只回写这些用户, 其余保留磁盘最新值) */
|
|
19
68
|
dirtyUsers = new Set();
|
|
69
|
+
/** 加载时出了什么值得说出来的事(版本不认识 → 已留档;文件坏了 → 已留档)。空串=没事 */
|
|
70
|
+
loadIssue = '';
|
|
71
|
+
/** 上一次落盘失败的原因;成功一次就清空。见 `save()` 里那段注释 */
|
|
72
|
+
saveIssue = null;
|
|
20
73
|
constructor() { this.load(); }
|
|
21
|
-
|
|
74
|
+
/** 加载期的问题。调用方(服务启动时)应当把它**打出来**,而不是让用户面对一份空记忆 */
|
|
75
|
+
get problem() { return this.loadIssue; }
|
|
76
|
+
/** 上一次落盘失败的原因(成功过就是 null)。存在不等于"这次没存上"——错误是累积前的最后一次 */
|
|
77
|
+
get lastSaveError() { return this.saveIssue; }
|
|
78
|
+
normalizeUser(s) {
|
|
79
|
+
const facts = Array.isArray(s?.facts)
|
|
80
|
+
? s.facts
|
|
81
|
+
.filter((f) => f && typeof f.content === 'string' && f.content.trim())
|
|
82
|
+
.map((f) => ({
|
|
83
|
+
content: String(f.content),
|
|
84
|
+
ts: Number(f.ts) || 0,
|
|
85
|
+
...(Number.isFinite(Number(f.sourceTurn)) ? { sourceTurn: Number(f.sourceTurn) } : {}),
|
|
86
|
+
...(typeof f.sourceQuote === 'string' && f.sourceQuote ? { sourceQuote: f.sourceQuote } : {}),
|
|
87
|
+
...(Number.isFinite(Number(f.usedAt)) ? { usedAt: Number(f.usedAt) } : {}),
|
|
88
|
+
}))
|
|
89
|
+
: [];
|
|
22
90
|
return {
|
|
23
|
-
working: Array.isArray(s
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
91
|
+
working: Array.isArray(s?.working)
|
|
92
|
+
? s.working.filter((t) => t && typeof t.content === 'string')
|
|
93
|
+
: [],
|
|
94
|
+
summary: typeof s?.summary === 'string' ? s.summary : '',
|
|
95
|
+
facts,
|
|
96
|
+
turnCount: Number(s?.turnCount) || 0,
|
|
27
97
|
};
|
|
28
98
|
}
|
|
99
|
+
/** 把读不出来的文件改名留档——**不许静默丢弃** */
|
|
100
|
+
quarantine(reason) {
|
|
101
|
+
const target = `${MEMORY_FILE}.unreadable-${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
102
|
+
try {
|
|
103
|
+
renameSync(MEMORY_FILE, target);
|
|
104
|
+
this.loadIssue = `${reason};原文件已留档为 ${target.split(/[\\/]/).pop()}`;
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
this.loadIssue = `${reason};留档也失败了(${error?.message ?? error}),未改动原文件`;
|
|
108
|
+
}
|
|
109
|
+
this.states = {};
|
|
110
|
+
}
|
|
29
111
|
load() {
|
|
112
|
+
if (!existsSync(MEMORY_FILE))
|
|
113
|
+
return;
|
|
114
|
+
let raw;
|
|
30
115
|
try {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
116
|
+
raw = JSON.parse(readFileSync(MEMORY_FILE, 'utf8'));
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
// 坏 JSON 也留档:它可能是用户唯一的一份记忆,不能就地丢弃
|
|
120
|
+
this.quarantine(`记忆文件无法解析(${error?.message?.slice(0, 80) ?? error})`);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
124
|
+
this.quarantine('记忆文件不是一个对象');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
// v0:没有 version,顶层就是会话 id(历史遗留)→ 迁移到 v1
|
|
128
|
+
if (raw.version === undefined) {
|
|
129
|
+
for (const [uid, state] of Object.entries(raw)) {
|
|
130
|
+
if (typeof state !== 'object' || state === null)
|
|
131
|
+
continue;
|
|
132
|
+
this.states[uid] = this.normalizeUser(state);
|
|
36
133
|
}
|
|
134
|
+
if (Object.keys(this.states).length) {
|
|
135
|
+
this.loadIssue = `记忆文件是 v0 格式,已迁移到 v${MEMORY_FORMAT_VERSION}(下次保存时落盘)`;
|
|
136
|
+
for (const uid of Object.keys(this.states))
|
|
137
|
+
this.dirtyUsers.add(uid);
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
37
140
|
}
|
|
38
|
-
|
|
39
|
-
|
|
141
|
+
if (raw.version !== MEMORY_FORMAT_VERSION) {
|
|
142
|
+
// 不猜、不迁移:版本比我们新(或看不懂)时,宁可留档重来,也不把对方的字段读歪
|
|
143
|
+
this.quarantine(`记忆文件版本是 ${JSON.stringify(raw.version)},本程序只认 ${MEMORY_FORMAT_VERSION}`);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const users = raw.users;
|
|
147
|
+
if (users === undefined)
|
|
148
|
+
return;
|
|
149
|
+
if (typeof users !== 'object' || users === null || Array.isArray(users)) {
|
|
150
|
+
this.quarantine('记忆文件的 users 字段不是一个对象');
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
for (const [uid, state] of Object.entries(users)) {
|
|
154
|
+
this.states[uid] = this.normalizeUser(state);
|
|
40
155
|
}
|
|
41
156
|
}
|
|
42
157
|
save() {
|
|
@@ -47,14 +162,18 @@ export class AssistantMemory {
|
|
|
47
162
|
try {
|
|
48
163
|
if (existsSync(MEMORY_FILE)) {
|
|
49
164
|
const disk = JSON.parse(readFileSync(MEMORY_FILE, 'utf8'));
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
165
|
+
const diskUsers = disk?.version === MEMORY_FORMAT_VERSION ? disk.users
|
|
166
|
+
: disk?.version === undefined ? disk : null;
|
|
167
|
+
if (diskUsers && typeof diskUsers === 'object') {
|
|
168
|
+
for (const [uid, s] of Object.entries(diskUsers)) {
|
|
169
|
+
if (this.dirtyUsers.has(uid))
|
|
170
|
+
continue;
|
|
171
|
+
merged[uid] = this.normalizeUser(s);
|
|
172
|
+
}
|
|
54
173
|
}
|
|
55
174
|
}
|
|
56
175
|
}
|
|
57
|
-
catch { /* 磁盘损坏 →
|
|
176
|
+
catch { /* 磁盘损坏 → 只落内存态(上面 load 已经留过档了) */ }
|
|
58
177
|
for (const uid of this.dirtyUsers) {
|
|
59
178
|
if (this.states[uid])
|
|
60
179
|
merged[uid] = this.states[uid];
|
|
@@ -62,13 +181,24 @@ export class AssistantMemory {
|
|
|
62
181
|
const dir = join(os.homedir(), '.weflow-cli');
|
|
63
182
|
if (!existsSync(dir))
|
|
64
183
|
mkdirSync(dir, { recursive: true });
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
184
|
+
const payload = { version: MEMORY_FORMAT_VERSION, users: merged };
|
|
185
|
+
// 走 writeFileAtomic:Windows 上 rename 覆盖被别的句柄打开的文件会 EPERM,
|
|
186
|
+
// 直接 rename 的话这里会**静默失败**(本条就是这个 bug 的现场)
|
|
187
|
+
writeFileAtomic(MEMORY_FILE, JSON.stringify(payload, null, 1));
|
|
68
188
|
this.states = merged;
|
|
69
189
|
this.dirtyUsers.clear();
|
|
190
|
+
this.saveIssue = null;
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
// **不抛**是对的:磁盘打嗝不该毁掉这次对话(内存态还在,dirty 没清,下一次还会试)。
|
|
194
|
+
// 但**不吭声是错的**:用户说"记住",写失败,这条记忆就是没了——而没有任何地方留下痕迹。
|
|
195
|
+
// 这里此前整个是一个空 catch,连审计都没有。实测撞到过:一次临时目录上的写失败让两条
|
|
196
|
+
// "记忆能跨重启"的测试失败,系统里却没有任何记录指向它。
|
|
197
|
+
//
|
|
198
|
+
// 审计只记错误码,不记消息本身(消息里可能带路径);要给人看的在 `lastSaveError`。
|
|
199
|
+
this.saveIssue = String(error?.message ?? error).slice(0, 120);
|
|
200
|
+
privacyGate.audit('MEMORY_SAVE_FAILED', 0, `code=${error?.code ?? error?.name ?? 'unknown'}`);
|
|
70
201
|
}
|
|
71
|
-
catch { /* 持久化失败不阻断对话 */ }
|
|
72
202
|
}
|
|
73
203
|
state(userId) {
|
|
74
204
|
if (!this.states[userId]) {
|
|
@@ -95,23 +225,61 @@ export class AssistantMemory {
|
|
|
95
225
|
summary(userId) { return this.state(userId).summary; }
|
|
96
226
|
facts(userId) { return this.state(userId).facts; }
|
|
97
227
|
userCount() { return Object.keys(this.states).length; }
|
|
98
|
-
/**
|
|
228
|
+
/** 是哪道闸要压:条数(短轮次堆多了)还是预算(长轮次把窗口撑爆了) */
|
|
229
|
+
compressionGate(userId) {
|
|
230
|
+
const s = this.state(userId);
|
|
231
|
+
const byCount = s.working.length > WORKING_MAX;
|
|
232
|
+
const byBudget = chars(s.working) > CONTEXT_BUDGET_CHARS * WORKING_TRIGGER_RATIO;
|
|
233
|
+
if (byCount && byBudget)
|
|
234
|
+
return 'both';
|
|
235
|
+
if (byCount)
|
|
236
|
+
return 'count';
|
|
237
|
+
if (byBudget)
|
|
238
|
+
return 'budget';
|
|
239
|
+
return null;
|
|
240
|
+
}
|
|
241
|
+
needsCompression(userId) { return this.compressionGate(userId) !== null; }
|
|
242
|
+
/** 压完保留多少条。**两道闸的保留规则不同,这是有意的**:
|
|
243
|
+
*
|
|
244
|
+
* - 条数闸(一堆短轮次堆到 16 条):保留最近的一半,下限 `WORKING_MIN_TURNS`——这里条数才是
|
|
245
|
+
* 问题所在,留一半正好把窗口减半;
|
|
246
|
+
* - 预算闸(几条长轮次就把预算撑爆):按**字符**保留预算的 16%,条数只保底 1 条。
|
|
247
|
+
* 这两条约束会互斥——6000 字的轮次保 6 条就是 36000 字,远超 24k 预算。**字符上限优先**,
|
|
248
|
+
* 因为它是硬预算;条数下限在小窗口下才有意义。
|
|
249
|
+
* - 两道同时触发:取两者中**更小的**(更保守)。
|
|
250
|
+
*
|
|
251
|
+
* 无论哪条,都卡在 `[1, 窗口长度-1]`:算出"保留 6 条"而窗口只有 5 条时,`slice(-1)` 会只留
|
|
252
|
+
* 1 条,下限形同虚设(实测撞出来的);也至少要压出去一条,否则"压了"却没动。
|
|
253
|
+
*/
|
|
254
|
+
retainCount(turns, gate) {
|
|
255
|
+
const cap = CONTEXT_BUDGET_CHARS * WORKING_RETAIN_RATIO;
|
|
256
|
+
let used = 0;
|
|
257
|
+
let byChars = 0;
|
|
258
|
+
for (let i = turns.length - 1; i >= 0; i--) {
|
|
259
|
+
const size = turns[i].content?.length ?? 0;
|
|
260
|
+
if (byChars > 0 && used + size > cap)
|
|
261
|
+
break;
|
|
262
|
+
used += size;
|
|
263
|
+
byChars++;
|
|
264
|
+
if (used >= cap)
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
const countKeep = Math.max(WORKING_MIN_TURNS, Math.floor(turns.length / 2));
|
|
268
|
+
const budgetKeep = Math.max(1, byChars);
|
|
269
|
+
const want = gate === 'count' ? countKeep : gate === 'budget' ? budgetKeep : Math.min(countKeep, budgetKeep);
|
|
270
|
+
return Math.min(Math.max(want, 1), turns.length - 1);
|
|
271
|
+
}
|
|
272
|
+
/** L2: 窗口该压时,把最旧的那些压进摘要 */
|
|
99
273
|
async compressIfNeeded(userId, llm) {
|
|
100
274
|
const s = this.state(userId);
|
|
101
|
-
if (
|
|
275
|
+
if (!this.needsCompression(userId))
|
|
102
276
|
return false;
|
|
103
277
|
this.dirtyUsers.add(userId);
|
|
104
|
-
const
|
|
105
|
-
|
|
278
|
+
const keep = this.retainCount(s.working, this.compressionGate(userId) ?? 'count');
|
|
279
|
+
const out = s.working.slice(0, s.working.length - keep);
|
|
280
|
+
s.working = s.working.slice(s.working.length - keep);
|
|
106
281
|
try {
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
[已有摘要]
|
|
110
|
-
${s.summary || '(无)'}
|
|
111
|
-
|
|
112
|
-
[新增对话]
|
|
113
|
-
${out.map(t => `${t.role === 'user' ? '用户' : '助手'}: ${t.content}`).join('\n')}`;
|
|
114
|
-
const merged = await llm([{ role: 'user', content: prompt }], 600);
|
|
282
|
+
const merged = await llm([{ role: 'user', content: buildSummaryPrompt(s.summary, out) }], 900);
|
|
115
283
|
s.summary = merged.trim().slice(0, SUMMARY_MAX);
|
|
116
284
|
}
|
|
117
285
|
catch {
|
|
@@ -130,12 +298,12 @@ ${out.map(t => `${t.role === 'user' ? '用户' : '助手'}: ${t.content}`).join(
|
|
|
130
298
|
if (!recent.length)
|
|
131
299
|
return 0;
|
|
132
300
|
this.dirtyUsers.add(userId);
|
|
301
|
+
// 溯源:这一批事实是从"第几个用户轮"抽出来的,触发的那句用户话也记下来
|
|
302
|
+
const lastUser = [...recent].reverse().find(t => t.role === 'user');
|
|
303
|
+
const sourceTurn = s.turnCount;
|
|
304
|
+
const sourceQuote = (lastUser?.content ?? '').replace(/\s+/g, ' ').slice(0, 40);
|
|
133
305
|
try {
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
[对话]
|
|
137
|
-
${recent.map(t => `${t.role === 'user' ? '用户' : '助手'}: ${t.content}`).join('\n')}`;
|
|
138
|
-
const raw = await llm([{ role: 'user', content: prompt }], 300);
|
|
306
|
+
const raw = await llm([{ role: 'user', content: buildFactPrompt(recent) }], 300);
|
|
139
307
|
const m = raw.match(/\[[\s\S]*\]/);
|
|
140
308
|
if (!m)
|
|
141
309
|
return 0;
|
|
@@ -144,12 +312,8 @@ ${recent.map(t => `${t.role === 'user' ? '用户' : '助手'}: ${t.content}`).jo
|
|
|
144
312
|
for (const item of items) {
|
|
145
313
|
if (typeof item !== 'string' || !item.trim())
|
|
146
314
|
continue;
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if (s.facts.some(f => f.content.includes(fact) || fact.includes(f.content)))
|
|
150
|
-
continue;
|
|
151
|
-
s.facts.push({ content: fact, ts: Date.now() });
|
|
152
|
-
added++;
|
|
315
|
+
if (this.rememberFact(s, item.trim().slice(0, 60), { sourceTurn, sourceQuote }))
|
|
316
|
+
added++;
|
|
153
317
|
}
|
|
154
318
|
if (s.facts.length > FACTS_MAX)
|
|
155
319
|
s.facts = s.facts.slice(-FACTS_MAX);
|
|
@@ -159,24 +323,195 @@ ${recent.map(t => `${t.role === 'user' ? '用户' : '助手'}: ${t.content}`).jo
|
|
|
159
323
|
return 0;
|
|
160
324
|
}
|
|
161
325
|
}
|
|
162
|
-
/** L3 检索:
|
|
326
|
+
/** L3 检索: 关键词命中;命中即记 `usedAt`(谁被用过是排序与"陈旧"判断的依据) */
|
|
163
327
|
searchFacts(userId, keyword) {
|
|
164
328
|
const kw = keyword.trim();
|
|
165
329
|
if (!kw)
|
|
166
330
|
return [];
|
|
167
|
-
|
|
331
|
+
const s = this.state(userId);
|
|
332
|
+
const hits = s.facts.filter(f => f.content.includes(kw) || kw.split(/\s+/).some(w => w.length >= 2 && f.content.includes(w)));
|
|
333
|
+
if (hits.length) {
|
|
334
|
+
const now = Date.now();
|
|
335
|
+
for (const f of hits)
|
|
336
|
+
f.usedAt = now;
|
|
337
|
+
this.dirtyUsers.add(userId);
|
|
338
|
+
}
|
|
339
|
+
return hits;
|
|
168
340
|
}
|
|
169
341
|
/** L3 写入 (save_memory 工具用, 立即生效) */
|
|
170
|
-
addFact(userId, content) {
|
|
342
|
+
addFact(userId, content, source) {
|
|
171
343
|
this.dirtyUsers.add(userId);
|
|
172
344
|
const s = this.state(userId);
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
s.facts.push({ content, ts: Date.now() });
|
|
176
|
-
if (s.facts.length > FACTS_MAX)
|
|
345
|
+
const added = this.rememberFact(s, content, source);
|
|
346
|
+
if (added && s.facts.length > FACTS_MAX)
|
|
177
347
|
s.facts = s.facts.slice(-FACTS_MAX);
|
|
178
348
|
this.save();
|
|
349
|
+
return added;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* 记忆一条事实,返回**是否新增或更新**。三种判定:
|
|
353
|
+
*
|
|
354
|
+
* - 归一化后相同 → 重复,什么都不做;
|
|
355
|
+
* - 一条包含另一条 → 取**更长的那条**(更具体),短的那条被顶掉;
|
|
356
|
+
* - 其它 → 新增。
|
|
357
|
+
*
|
|
358
|
+
* 包含式去重的固有模糊写在测试里:两个恰好互为前缀的短事实(`事实1` 与 `事实10`),
|
|
359
|
+
* 长的那条会顶掉短的。真实事实极少这样,而"更具体的胜出"在真实场景里是对的。
|
|
360
|
+
*/
|
|
361
|
+
rememberFact(s, content, source) {
|
|
362
|
+
const text = content.trim();
|
|
363
|
+
if (!text)
|
|
364
|
+
return false;
|
|
365
|
+
const norm = normalizeFact(text);
|
|
366
|
+
for (let i = 0; i < s.facts.length; i++) {
|
|
367
|
+
const existing = s.facts[i];
|
|
368
|
+
const other = normalizeFact(existing.content);
|
|
369
|
+
if (norm === other) {
|
|
370
|
+
// 同一条:把溯源补全(旧的可能是没有溯源的版本),不动时间戳
|
|
371
|
+
if (source?.sourceTurn !== undefined && existing.sourceTurn === undefined) {
|
|
372
|
+
existing.sourceTurn = source.sourceTurn;
|
|
373
|
+
existing.sourceQuote = source.sourceQuote;
|
|
374
|
+
}
|
|
375
|
+
return false;
|
|
376
|
+
}
|
|
377
|
+
const contains = other.includes(norm) || norm.includes(other);
|
|
378
|
+
if (!contains)
|
|
379
|
+
continue;
|
|
380
|
+
const ratio = Math.min(norm.length, other.length) / Math.max(norm.length, other.length);
|
|
381
|
+
if (ratio < FACT_SAME_RATIO)
|
|
382
|
+
continue; // 只是碰巧包含,算两条
|
|
383
|
+
if (norm.length > other.length) {
|
|
384
|
+
// 新的更具体 → 顶掉旧的,保留它最早的时间戳
|
|
385
|
+
s.facts[i] = { content: text, ts: existing.ts || Date.now(), ...(source ?? {}) };
|
|
386
|
+
return true;
|
|
387
|
+
}
|
|
388
|
+
return false; // 旧的已经更具体,不动
|
|
389
|
+
}
|
|
390
|
+
s.facts.push({ content: text, ts: Date.now(), ...(source ?? {}) });
|
|
179
391
|
return true;
|
|
180
392
|
}
|
|
181
393
|
}
|
|
394
|
+
/** L2 的压缩提示词。**固定节骨架 + 合并律**:空节写 `(none)`,永不删节。
|
|
395
|
+
*
|
|
396
|
+
* 为什么固定成节:自由摘要最容易在压缩时悄悄丢信息(丢了自己也不知道)。固定节至少让
|
|
397
|
+
* 每一次压缩都必须回答"待办有没有、错误有没有、下一步有没有"。
|
|
398
|
+
* 为什么写合并律:滚动摘要腐化的正解是"保留仍然成立的、丢掉过期的、合成一份",并明确
|
|
399
|
+
* **禁止逐字复制前任**——否则摘要会一层层掺水。
|
|
400
|
+
*/
|
|
401
|
+
export function buildSummaryPrompt(previous, turnsOut) {
|
|
402
|
+
const transcript = turnsOut.map(t => `${t.role === 'user' ? '用户' : '助手'}: ${t.content}`).join('\n');
|
|
403
|
+
return `把下面的对话压缩进已有摘要。**输出必须是这 8 个节,一节不删**;某一节没有内容就写 (none):
|
|
404
|
+
|
|
405
|
+
## 用户诉求
|
|
406
|
+
## 技术要点
|
|
407
|
+
## 涉及的文件与命令
|
|
408
|
+
## 错误与修复
|
|
409
|
+
## 待办
|
|
410
|
+
## 当前进展
|
|
411
|
+
## 下一步
|
|
412
|
+
## 关键上下文
|
|
413
|
+
|
|
414
|
+
合并规则:保留**仍然成立**的事实,丢掉已经过期的,合成**一份**摘要。
|
|
415
|
+
不许逐字复制旧摘要,也不许把已经解决的错误当成待办留着。
|
|
416
|
+
总长不超过 800 字,直接输出摘要正文,不要任何前后缀。
|
|
417
|
+
|
|
418
|
+
[已有摘要]
|
|
419
|
+
${previous || '(无)'}
|
|
420
|
+
|
|
421
|
+
[新增对话]
|
|
422
|
+
${transcript}`;
|
|
423
|
+
}
|
|
424
|
+
/** L3 的抽取提示词。要求可核对:每条事实都能在对话里指出来源 */
|
|
425
|
+
export function buildFactPrompt(recent) {
|
|
426
|
+
const transcript = recent.map(t => `${t.role === 'user' ? '用户' : '助手'}: ${t.content}`).join('\n');
|
|
427
|
+
return `从对话中提取关于用户的持久事实(背景/偏好/项目/人际关系/惯例)。每条不超过40字。
|
|
428
|
+
只提取**用户自己说过的、长期成立的**信息;助手自己的推测不算。
|
|
429
|
+
只输出 JSON 字符串数组,最多3条,没有则输出 []。不要提取临时性内容。
|
|
430
|
+
|
|
431
|
+
[对话]
|
|
432
|
+
${transcript}`;
|
|
433
|
+
}
|
|
434
|
+
/** 字符二元组集合——中文没有词边界,用二元组算重合比"包含"稳,也不用引模型 */
|
|
435
|
+
function bigrams(text) {
|
|
436
|
+
const norm = normalizeFact(text);
|
|
437
|
+
const out = new Set();
|
|
438
|
+
for (let i = 0; i + 1 < norm.length; i++)
|
|
439
|
+
out.add(norm.slice(i, i + 2));
|
|
440
|
+
return out;
|
|
441
|
+
}
|
|
442
|
+
function overlap(a, b) {
|
|
443
|
+
if (!a.size || !b.size)
|
|
444
|
+
return 0;
|
|
445
|
+
let hit = 0;
|
|
446
|
+
for (const g of a)
|
|
447
|
+
if (b.has(g))
|
|
448
|
+
hit++;
|
|
449
|
+
return hit / Math.min(a.size, b.size);
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* 该把哪几条事实放进这次请求:**先相关、再近期用过、最后按时间**,总量受字符预算约束。
|
|
453
|
+
*
|
|
454
|
+
* 为什么不全量注入:30 条 × ~72 字 ≈ 2.1KB **每轮**都发,而且与当前问题无关的那些是纯噪声——
|
|
455
|
+
* 噪声不只是花钱,它是"模型被无关信息带偏"的来源之一。
|
|
456
|
+
*
|
|
457
|
+
* **相关度决定"谁进",展示保持时序**:入选的按时间先后排列(读起来像一份清单,而不是一堆碎片),
|
|
458
|
+
* 没进的按相关度+近期用过来决定顺序。
|
|
459
|
+
*
|
|
460
|
+
* 返回未被选中的条数,调用方要**如实说出来**(`另有 N 条未列出`)。谎报"全部记忆如下"比少给
|
|
461
|
+
* 几条更糟:模型会以为自己看到了全部。
|
|
462
|
+
*/
|
|
463
|
+
export function selectFactsForInjection(facts, question, budgetChars = FACTS_INJECT_BUDGET_CHARS) {
|
|
464
|
+
if (!facts.length)
|
|
465
|
+
return { selected: [], withheld: 0 };
|
|
466
|
+
const q = bigrams(question || '');
|
|
467
|
+
const qText = normalizeFact(question || '');
|
|
468
|
+
const scored = facts.map((f, index) => {
|
|
469
|
+
const fText = normalizeFact(f.content);
|
|
470
|
+
// 直接包含(整串或关键片段)算强相关;否则用二元组重合
|
|
471
|
+
const direct = qText.length >= 2 && (fText.includes(qText) || qText.includes(fText));
|
|
472
|
+
const sim = direct ? 1 : overlap(q, bigrams(f.content));
|
|
473
|
+
// sim 单独留着:闸门按它判,排序才用 rank(后者含「最近用过」与时间的权重)
|
|
474
|
+
return { fact: f, index, sim, rank: sim * 10 + (f.usedAt ? 0.5 : 0) + (f.ts ? 0.1 : 0) };
|
|
475
|
+
});
|
|
476
|
+
scored.sort((a, b) => b.rank - a.rank || a.index - b.index);
|
|
477
|
+
// **先按相关度筛,再按预算裁**——这个顺序是要紧的:预算够大时不该拿无关事实去填空,
|
|
478
|
+
// 否则"按相关度注入"只是排了个序而已(实测:30 条短事实全装得下,等于全量注入)。
|
|
479
|
+
const relevant = scored.filter(item => item.sim >= FACT_RELEVANCE_FLOOR);
|
|
480
|
+
// 兜底要取**最近**的几条(按原始下标=时间顺序),不是 rank 排在前面的那些:
|
|
481
|
+
// 一条都不相关时 rank 全都一样,按 rank 取到的是最旧的那批,正好反了。
|
|
482
|
+
const oldestToKeep = Math.max(0, facts.length - FACTS_INJECT_MIN_RECENT);
|
|
483
|
+
const pool = relevant.length
|
|
484
|
+
? relevant
|
|
485
|
+
: scored.filter(item => item.index >= oldestToKeep);
|
|
486
|
+
const selected = [];
|
|
487
|
+
let used = 0;
|
|
488
|
+
for (const item of pool) {
|
|
489
|
+
const size = item.fact.content.length + 2;
|
|
490
|
+
if (selected.length && used + size > budgetChars)
|
|
491
|
+
break;
|
|
492
|
+
selected.push(item.fact);
|
|
493
|
+
used += size;
|
|
494
|
+
}
|
|
495
|
+
// 保持原来的顺序(时间先后),读起来才像一份清单而不是一堆碎片
|
|
496
|
+
selected.sort((a, b) => facts.indexOf(a) - facts.indexOf(b));
|
|
497
|
+
return { selected, withheld: facts.length - selected.length };
|
|
498
|
+
}
|
|
499
|
+
const FRAME_OPEN = 'weflow-local-data';
|
|
500
|
+
const FRAME_CLOSE = '/' + FRAME_OPEN;
|
|
501
|
+
/**
|
|
502
|
+
* 把一段**本地数据**包进框里再进提示词,并转义内容里出现的框标签。
|
|
503
|
+
*
|
|
504
|
+
* 防的是"框欺骗":聊天正文、文章正文、事实里完全可能写着 `</weflow-local-data>` 再跟一段
|
|
505
|
+
* 像系统指令的话——不转义就等于让数据自己把框关上、直接以系统身份说话。转义后它只能是数据。
|
|
506
|
+
* (这不等于防住提示词注入本身:数据里仍可以有指令性文字;我们只保证它**关不掉这个框**。)
|
|
507
|
+
*/
|
|
508
|
+
export function frameLocalData(label, body) {
|
|
509
|
+
// 用 split/join 而不是正则:这里只需要"把框标签的尖括号改掉一个字",正则只会给它引入转义问题。
|
|
510
|
+
// 开标签与闭标签都要挡:数据里出现任一形式,都不能让它把框关上。
|
|
511
|
+
const safe = String(body ?? '')
|
|
512
|
+
.split('<' + FRAME_OPEN).join('<‹' + FRAME_OPEN)
|
|
513
|
+
.split('<' + FRAME_CLOSE).join('<‹' + FRAME_CLOSE);
|
|
514
|
+
const crlf = String.fromCharCode(10);
|
|
515
|
+
return '<' + FRAME_OPEN + ' source="' + label + '">' + crlf + safe + crlf + '<' + FRAME_CLOSE + '>';
|
|
516
|
+
}
|
|
182
517
|
//# sourceMappingURL=assistantMemory.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistantMemory.js","sourceRoot":"","sources":["../../../src/services/assistantMemory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"assistantMemory.js","sourceRoot":"","sources":["../../../src/services/assistantMemory.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,18 @@ export declare function redactText(text: string, mode: PrivacyMode, localInferen
|
|
|
3
3
|
safe: string;
|
|
4
4
|
redactions: number;
|
|
5
5
|
};
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* strict 模式:**保留类型标签、丢掉载荷**。
|
|
8
|
+
*
|
|
9
|
+
* 契约是"仅保留时间/方向/类型",而类型标签正是那个"类型":非文本消息的正文本来就是
|
|
10
|
+
* `[图片]` / `[文件] Base.csv` / `[引用] 回复 | 引:原文` 这种形态,整条遮掉会把
|
|
11
|
+
* "这是一张图片"一起抹掉——模型从此分不出图片和文本消息,而它**一个字都没有多知道**。
|
|
12
|
+
* 载荷(文件名、被引原文、撤回提示里的名字)照旧不出境。
|
|
13
|
+
*
|
|
14
|
+
* `isText` 由调用方给:只有读取器说的"非文本消息"才配当作标签。用户自己敲的
|
|
15
|
+
* `[图片] 这是我拍的` 是正文,按正文遮——否则就是一个把用户的话放出去的口子。
|
|
16
|
+
*/
|
|
17
|
+
export declare function maskMessageBodyText(body: string, mode: PrivacyMode, localInference: boolean, isText?: boolean): string;
|
|
7
18
|
export declare class PrivacyGate {
|
|
8
19
|
mode(): PrivacyMode;
|
|
9
20
|
/** 本地引擎数据不出机器, 无需脱敏 */
|
|
@@ -17,7 +28,9 @@ export declare class PrivacyGate {
|
|
|
17
28
|
redactions: number;
|
|
18
29
|
};
|
|
19
30
|
/** strict 模式: 第三方聊天正文不出境, 只保留元数据形态 */
|
|
20
|
-
maskMessageBody(body: string
|
|
31
|
+
maskMessageBody(body: string, opts?: {
|
|
32
|
+
isText?: boolean;
|
|
33
|
+
}): string;
|
|
21
34
|
/** 审计日志 — 只记事件与字节量, 绝不记内容 */
|
|
22
35
|
audit(event: string, bytes?: number, extra?: string): void;
|
|
23
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assistantPrivacy.d.ts","sourceRoot":"","sources":["../../../src/services/assistantPrivacy.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;AAcxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAUzH;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"assistantPrivacy.d.ts","sourceRoot":"","sources":["../../../src/services/assistantPrivacy.ts"],"names":[],"mappings":"AAkBA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,CAAA;AAcxD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAUzH;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAC/B,cAAc,EAAE,OAAO,EAAE,MAAM,UAAO,GAAG,MAAM,CAKlF;AAED,qBAAa,WAAW;IACtB,IAAI,IAAI,WAAW;IAKnB,uBAAuB;IACvB,gBAAgB,IAAI,OAAO;IAK3B;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;IAI1D,sCAAsC;IACtC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,MAAM;IAItE,6BAA6B;IAC7B,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,KAAK,SAAK,GAAG,IAAI;CASlD;AAED,eAAO,MAAM,WAAW,aAAoB,CAAA"}
|