sema-core 2.0.10 → 2.0.11
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/dist/core/Conversation.d.ts.map +1 -1
- package/dist/core/Conversation.js +30 -9
- package/dist/core/Conversation.js.map +1 -1
- package/dist/core/SemaEngine.js +2 -2
- package/dist/core/SemaEngine.js.map +1 -1
- package/dist/events/types.d.ts +12 -0
- package/dist/events/types.d.ts.map +1 -1
- package/dist/manager/ConfManager.d.ts.map +1 -1
- package/dist/manager/ConfManager.js +2 -1
- package/dist/manager/ConfManager.js.map +1 -1
- package/dist/manager/CronManager.d.ts.map +1 -1
- package/dist/manager/CronManager.js +7 -2
- package/dist/manager/CronManager.js.map +1 -1
- package/dist/manager/PermissionManager.d.ts.map +1 -1
- package/dist/manager/PermissionManager.js +11 -2
- package/dist/manager/PermissionManager.js.map +1 -1
- package/dist/manager/StateManager.d.ts +15 -0
- package/dist/manager/StateManager.d.ts.map +1 -1
- package/dist/manager/StateManager.js +59 -0
- package/dist/manager/StateManager.js.map +1 -1
- package/dist/prompt/compact.d.ts +7 -0
- package/dist/prompt/compact.d.ts.map +1 -1
- package/dist/prompt/compact.js +17 -0
- package/dist/prompt/compact.js.map +1 -1
- package/dist/prompt/tool.d.ts +2 -0
- package/dist/prompt/tool.d.ts.map +1 -1
- package/dist/prompt/tool.js +15 -1
- package/dist/prompt/tool.js.map +1 -1
- package/dist/services/commands/runCommand.js +6 -3
- package/dist/services/commands/runCommand.js.map +1 -1
- package/dist/tools/LoadTools.d.ts +46 -0
- package/dist/tools/LoadTools.d.ts.map +1 -0
- package/dist/tools/LoadTools.js +168 -0
- package/dist/tools/LoadTools.js.map +1 -0
- package/dist/tools/SearchTools.d.ts +53 -0
- package/dist/tools/SearchTools.d.ts.map +1 -0
- package/dist/tools/SearchTools.js +127 -0
- package/dist/tools/SearchTools.js.map +1 -0
- package/dist/tools/SubAgent.d.ts.map +1 -1
- package/dist/tools/SubAgent.js +6 -22
- package/dist/tools/SubAgent.js.map +1 -1
- package/dist/tools/base/subagentTools.d.ts +13 -0
- package/dist/tools/base/subagentTools.d.ts.map +1 -0
- package/dist/tools/base/subagentTools.js +107 -0
- package/dist/tools/base/subagentTools.js.map +1 -0
- package/dist/tools/base/tools.d.ts +6 -1
- package/dist/tools/base/tools.d.ts.map +1 -1
- package/dist/tools/base/tools.js +107 -4
- package/dist/tools/base/tools.js.map +1 -1
- package/dist/types/agent.d.ts +2 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/index.d.ts +4 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/message.d.ts +2 -2
- package/dist/types/message.d.ts.map +1 -1
- package/dist/util/compact.d.ts +23 -1
- package/dist/util/compact.d.ts.map +1 -1
- package/dist/util/compact.js +54 -6
- package/dist/util/compact.js.map +1 -1
- package/dist/util/microcompact.d.ts +38 -0
- package/dist/util/microcompact.d.ts.map +1 -0
- package/dist/util/microcompact.js +194 -0
- package/dist/util/microcompact.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MICRO_COMPACT_PROTECT_EXTRA_BLOCKS = exports.MICRO_COMPACT_MIN_CONTENT_CHARS = exports.MICRO_COMPACT_PLACEHOLDER_PREFIX = void 0;
|
|
4
|
+
exports.estimateTokensFromText = estimateTokensFromText;
|
|
5
|
+
exports.microCompactMessages = microCompactMessages;
|
|
6
|
+
/**
|
|
7
|
+
* Micro 压缩:把模型已消费过的旧 tool_result 块内容替换为占位符,
|
|
8
|
+
* 在昂贵的全量摘要之前廉价释放上下文空间。
|
|
9
|
+
*
|
|
10
|
+
* 纯函数模块:无 IO、无事件、无配置读取,集成逻辑见 compact.ts 的 applyMicroCompact。
|
|
11
|
+
*
|
|
12
|
+
* 设计约束:
|
|
13
|
+
* - 只替换 tool_result 块的 content,不删除任何消息;
|
|
14
|
+
* uuid / tool_use_id / toolUseResult / controlSignal / checkpointSeq 全部保留,
|
|
15
|
+
* tool_use 与 tool_result 的配对关系结构上不可能被破坏;
|
|
16
|
+
* - 用户输入(含用户粘贴的图片)与 assistant 消息永不触碰;
|
|
17
|
+
* - 命中的消息用 spread 重建,绝不原地 mutate(messages 元素与 StateManager 共享引用)。
|
|
18
|
+
*/
|
|
19
|
+
// 幂等判据 + 协议常量:勿改措辞、勿本地化(旧代码眼中只是普通文本,revert 安全)
|
|
20
|
+
exports.MICRO_COMPACT_PLACEHOLDER_PREFIX = '<cleared>';
|
|
21
|
+
const PLACEHOLDER = '<cleared>Old tool result removed to free context. Re-run the tool if this output is needed again.</cleared>';
|
|
22
|
+
const IMAGE_PLACEHOLDER = '<cleared>Old tool result removed to free context (an image was removed). Re-run the tool if this output is needed again.</cleared>';
|
|
23
|
+
// 文本清理门槛:≈500 token,相对占位符收益比 ≥16:1
|
|
24
|
+
exports.MICRO_COMPACT_MIN_CONTENT_CHARS = 2000;
|
|
25
|
+
// 未消费批次(最后一条 assistant 之后的全部块)之外,额外保护的尾部块数
|
|
26
|
+
exports.MICRO_COMPACT_PROTECT_EXTRA_BLOCKS = 3;
|
|
27
|
+
// 图片块固定估算(勿用 base64 长度折算,会严重高估)
|
|
28
|
+
const IMAGE_BLOCK_TOKEN_ESTIMATE = 1500;
|
|
29
|
+
// 占位符自身的 token 开销,从节省估算中扣除(偏保守)
|
|
30
|
+
const PLACEHOLDER_TOKEN_ESTIMATE = 30;
|
|
31
|
+
function isCjkCharCode(code) {
|
|
32
|
+
return ((code >= 0x2e80 && code <= 0x9fff) || // CJK 部首/日文假名/CJK 统一表意
|
|
33
|
+
(code >= 0xf900 && code <= 0xfaff) || // CJK 兼容表意
|
|
34
|
+
(code >= 0xff00 && code <= 0xffef) || // 全角符号
|
|
35
|
+
(code >= 0xac00 && code <= 0xd7af) // 谚文音节
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 估算文本 token 数:CJK 字符 ≈ 1 token/字符,其余按 4 字符/token。
|
|
40
|
+
* 误差方向刻意偏向低估节省(宁可多做一次全量摘要,不可少做)。
|
|
41
|
+
*/
|
|
42
|
+
function estimateTokensFromText(text) {
|
|
43
|
+
let cjkCount = 0;
|
|
44
|
+
for (let i = 0; i < text.length; i++) {
|
|
45
|
+
if (isCjkCharCode(text.charCodeAt(i)))
|
|
46
|
+
cjkCount++;
|
|
47
|
+
}
|
|
48
|
+
return cjkCount + Math.ceil((text.length - cjkCount) / 4);
|
|
49
|
+
}
|
|
50
|
+
function isClearedContent(content) {
|
|
51
|
+
if (typeof content === 'string') {
|
|
52
|
+
return content.startsWith(exports.MICRO_COMPACT_PLACEHOLDER_PREFIX);
|
|
53
|
+
}
|
|
54
|
+
if (Array.isArray(content)) {
|
|
55
|
+
const first = content[0];
|
|
56
|
+
return (content.length === 1 &&
|
|
57
|
+
first?.type === 'text' &&
|
|
58
|
+
first.text.startsWith(exports.MICRO_COMPACT_PLACEHOLDER_PREFIX));
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
function analyzeBlock(block) {
|
|
63
|
+
// 报错结果永不清理(通常很短,且对后续纠错有持续价值)
|
|
64
|
+
if (block.is_error === true)
|
|
65
|
+
return { clearable: false };
|
|
66
|
+
// 幂等:已清理过的块跳过
|
|
67
|
+
if (isClearedContent(block.content))
|
|
68
|
+
return { clearable: false };
|
|
69
|
+
const content = block.content;
|
|
70
|
+
if (typeof content === 'string') {
|
|
71
|
+
if (content.length < exports.MICRO_COMPACT_MIN_CONTENT_CHARS)
|
|
72
|
+
return { clearable: false };
|
|
73
|
+
return {
|
|
74
|
+
clearable: true,
|
|
75
|
+
savedTokens: Math.max(0, estimateTokensFromText(content) - PLACEHOLDER_TOKEN_ESTIMATE),
|
|
76
|
+
placeholder: PLACEHOLDER,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
if (Array.isArray(content)) {
|
|
80
|
+
let textChars = 0;
|
|
81
|
+
let textTokens = 0;
|
|
82
|
+
let imageCount = 0;
|
|
83
|
+
for (const item of content) {
|
|
84
|
+
if (item.type === 'text') {
|
|
85
|
+
textChars += item.text.length;
|
|
86
|
+
textTokens += estimateTokensFromText(item.text);
|
|
87
|
+
}
|
|
88
|
+
else if (item.type === 'image') {
|
|
89
|
+
imageCount++;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// 含未知块类型的结果不动,保守优先
|
|
93
|
+
return { clearable: false };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// 图片块无条件清(单张 ≈1500 token,不设体积门槛);纯文本按门槛判断
|
|
97
|
+
if (imageCount === 0 && textChars < exports.MICRO_COMPACT_MIN_CONTENT_CHARS) {
|
|
98
|
+
return { clearable: false };
|
|
99
|
+
}
|
|
100
|
+
return {
|
|
101
|
+
clearable: true,
|
|
102
|
+
savedTokens: Math.max(0, textTokens + imageCount * IMAGE_BLOCK_TOKEN_ESTIMATE - PLACEHOLDER_TOKEN_ESTIMATE),
|
|
103
|
+
placeholder: imageCount > 0 ? IMAGE_PLACEHOLDER : PLACEHOLDER,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
return { clearable: false };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 扫描全部历史(不分用户轮次,含当前轮内部),清理保护区之外符合条件的 tool_result 块。
|
|
110
|
+
*
|
|
111
|
+
* 保护区(原封不动):
|
|
112
|
+
* - 最后一条 assistant 消息之后的全部 tool_result 块:模型刚发起调用、尚未消费的
|
|
113
|
+
* 最新一批(数量 = 上一步并行调用数),整批无条件保护;
|
|
114
|
+
* - 再往前 MICRO_COMPACT_PROTECT_EXTRA_BLOCKS 个块。
|
|
115
|
+
*/
|
|
116
|
+
function microCompactMessages(messages) {
|
|
117
|
+
const unchanged = {
|
|
118
|
+
changed: false,
|
|
119
|
+
messages,
|
|
120
|
+
clearedCount: 0,
|
|
121
|
+
estimatedSavedTokens: 0,
|
|
122
|
+
};
|
|
123
|
+
// 没有 assistant 消息则不存在"已消费"的结果,全部视为保护
|
|
124
|
+
let lastAssistantIdx = -1;
|
|
125
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
126
|
+
if (messages[i].type === 'assistant') {
|
|
127
|
+
lastAssistantIdx = i;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (lastAssistantIdx === -1)
|
|
132
|
+
return unchanged;
|
|
133
|
+
// 收集最后一条 assistant 之前的全部 tool_result 块位置(其后的块天然不进候选 = 未消费批次整批保护)
|
|
134
|
+
const candidates = [];
|
|
135
|
+
for (let i = 0; i < lastAssistantIdx; i++) {
|
|
136
|
+
const msg = messages[i];
|
|
137
|
+
if (msg.type !== 'user' || !Array.isArray(msg.message.content))
|
|
138
|
+
continue;
|
|
139
|
+
const content = msg.message.content;
|
|
140
|
+
for (let blockIdx = 0; blockIdx < content.length; blockIdx++) {
|
|
141
|
+
if (content[blockIdx].type === 'tool_result') {
|
|
142
|
+
candidates.push({ msgIdx: i, blockIdx });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 尾部再额外保护 N 个块
|
|
147
|
+
const clearableCandidates = candidates.slice(0, Math.max(0, candidates.length - exports.MICRO_COMPACT_PROTECT_EXTRA_BLOCKS));
|
|
148
|
+
if (clearableCandidates.length === 0)
|
|
149
|
+
return unchanged;
|
|
150
|
+
// 逐块判定,生成清理计划:msgIdx -> (blockIdx -> 占位符)
|
|
151
|
+
const clearPlan = new Map();
|
|
152
|
+
let clearedCount = 0;
|
|
153
|
+
let estimatedSavedTokens = 0;
|
|
154
|
+
for (const { msgIdx, blockIdx } of clearableCandidates) {
|
|
155
|
+
const content = messages[msgIdx].message.content;
|
|
156
|
+
const verdict = analyzeBlock(content[blockIdx]);
|
|
157
|
+
if (!verdict.clearable)
|
|
158
|
+
continue;
|
|
159
|
+
let blockMap = clearPlan.get(msgIdx);
|
|
160
|
+
if (!blockMap) {
|
|
161
|
+
blockMap = new Map();
|
|
162
|
+
clearPlan.set(msgIdx, blockMap);
|
|
163
|
+
}
|
|
164
|
+
blockMap.set(blockIdx, verdict.placeholder);
|
|
165
|
+
clearedCount++;
|
|
166
|
+
estimatedSavedTokens += verdict.savedTokens;
|
|
167
|
+
}
|
|
168
|
+
if (clearedCount === 0)
|
|
169
|
+
return unchanged;
|
|
170
|
+
// spread 重建命中的消息,未命中的复用原引用
|
|
171
|
+
const nextMessages = messages.map((msg, msgIdx) => {
|
|
172
|
+
const blockMap = clearPlan.get(msgIdx);
|
|
173
|
+
if (!blockMap)
|
|
174
|
+
return msg;
|
|
175
|
+
const userMsg = msg;
|
|
176
|
+
const content = userMsg.message.content.map((block, blockIdx) => {
|
|
177
|
+
const placeholder = blockMap.get(blockIdx);
|
|
178
|
+
if (placeholder === undefined)
|
|
179
|
+
return block;
|
|
180
|
+
return { ...block, content: placeholder };
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
...userMsg,
|
|
184
|
+
message: { ...userMsg.message, content },
|
|
185
|
+
};
|
|
186
|
+
});
|
|
187
|
+
return {
|
|
188
|
+
changed: true,
|
|
189
|
+
messages: nextMessages,
|
|
190
|
+
clearedCount,
|
|
191
|
+
estimatedSavedTokens,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=microcompact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"microcompact.js","sourceRoot":"","sources":["../../src/util/microcompact.ts"],"names":[],"mappings":"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"}
|