siclaw 0.1.2 → 0.1.4
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/agentbox/gateway-client.d.ts +4 -0
- package/dist/agentbox/gateway-client.js +9 -1
- package/dist/agentbox/gateway-client.js.map +1 -1
- package/dist/agentbox/http-server.js +25 -1
- package/dist/agentbox/http-server.js.map +1 -1
- package/dist/agentbox/session.d.ts +2 -0
- package/dist/agentbox/session.js +11 -7
- package/dist/agentbox/session.js.map +1 -1
- package/dist/agentbox-main.js +10 -0
- package/dist/agentbox-main.js.map +1 -1
- package/dist/cli-main.js +19 -3
- package/dist/cli-main.js.map +1 -1
- package/dist/core/agent-factory.d.ts +2 -0
- package/dist/core/agent-factory.js +87 -21
- package/dist/core/agent-factory.js.map +1 -1
- package/dist/core/compaction.d.ts +80 -0
- package/dist/core/compaction.js +442 -0
- package/dist/core/compaction.js.map +1 -0
- package/dist/core/config.d.ts +7 -0
- package/dist/core/config.js +27 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/extensions/compaction-safeguard.d.ts +2 -0
- package/dist/core/extensions/compaction-safeguard.js +681 -0
- package/dist/core/extensions/compaction-safeguard.js.map +1 -0
- package/dist/core/extensions/deep-investigation.js +47 -73
- package/dist/core/extensions/deep-investigation.js.map +1 -1
- package/dist/core/extensions/memory-flush.d.ts +2 -10
- package/dist/core/extensions/memory-flush.js +4 -86
- package/dist/core/extensions/memory-flush.js.map +1 -1
- package/dist/core/llm-proxy.js +25 -6
- package/dist/core/llm-proxy.js.map +1 -1
- package/dist/core/message-utils.d.ts +18 -0
- package/dist/core/message-utils.js +28 -0
- package/dist/core/message-utils.js.map +1 -0
- package/dist/core/prompt.js +4 -5
- package/dist/core/prompt.js.map +1 -1
- package/dist/core/session-tool-result-guard.d.ts +2 -0
- package/dist/core/session-tool-result-guard.js +159 -0
- package/dist/core/session-tool-result-guard.js.map +1 -0
- package/dist/core/stream-wrappers.d.ts +41 -0
- package/dist/core/stream-wrappers.js +369 -0
- package/dist/core/stream-wrappers.js.map +1 -0
- package/dist/core/thinking-blocks.d.ts +20 -0
- package/dist/core/thinking-blocks.js +45 -0
- package/dist/core/thinking-blocks.js.map +1 -0
- package/dist/core/tool-call-id.d.ts +22 -0
- package/dist/core/tool-call-id.js +226 -0
- package/dist/core/tool-call-id.js.map +1 -0
- package/dist/core/tool-call-repair.d.ts +18 -0
- package/dist/core/tool-call-repair.js +73 -0
- package/dist/core/tool-call-repair.js.map +1 -0
- package/dist/core/tool-result-context-guard.d.ts +36 -0
- package/dist/core/tool-result-context-guard.js +272 -0
- package/dist/core/tool-result-context-guard.js.map +1 -0
- package/dist/cron/cron-limits.d.ts +16 -0
- package/dist/cron/cron-limits.js +17 -0
- package/dist/cron/cron-limits.js.map +1 -0
- package/dist/cron/cron-matcher.d.ts +14 -0
- package/dist/cron/cron-matcher.js +29 -0
- package/dist/cron/cron-matcher.js.map +1 -1
- package/dist/gateway/agentbox/client.d.ts +0 -2
- package/dist/gateway/agentbox/client.js.map +1 -1
- package/dist/gateway/agentbox/k8s-spawner.d.ts +10 -10
- package/dist/gateway/agentbox/k8s-spawner.js +27 -55
- package/dist/gateway/agentbox/k8s-spawner.js.map +1 -1
- package/dist/gateway/agentbox/local-spawner.d.ts +5 -0
- package/dist/gateway/agentbox/local-spawner.js +10 -0
- package/dist/gateway/agentbox/local-spawner.js.map +1 -1
- package/dist/gateway/cron/cron-service.js +7 -0
- package/dist/gateway/cron/cron-service.js.map +1 -1
- package/dist/gateway/db/index.js +9 -1
- package/dist/gateway/db/index.js.map +1 -1
- package/dist/gateway/db/init-schema.js +65 -16
- package/dist/gateway/db/init-schema.js.map +1 -1
- package/dist/gateway/db/migrate-sqlite.js +73 -20
- package/dist/gateway/db/migrate-sqlite.js.map +1 -1
- package/dist/gateway/db/repositories/cluster-repo.d.ts +59 -0
- package/dist/gateway/db/repositories/cluster-repo.js +107 -0
- package/dist/gateway/db/repositories/cluster-repo.js.map +1 -0
- package/dist/gateway/db/repositories/config-repo.d.ts +4 -5
- package/dist/gateway/db/repositories/config-repo.js +17 -0
- package/dist/gateway/db/repositories/config-repo.js.map +1 -1
- package/dist/gateway/db/repositories/feedback-repo.d.ts +71 -0
- package/dist/gateway/db/repositories/feedback-repo.js +52 -0
- package/dist/gateway/db/repositories/feedback-repo.js.map +1 -0
- package/dist/gateway/db/repositories/knowledge-doc-repo.d.ts +37 -0
- package/dist/gateway/db/repositories/knowledge-doc-repo.js +48 -0
- package/dist/gateway/db/repositories/knowledge-doc-repo.js.map +1 -0
- package/dist/gateway/db/repositories/user-cluster-config-repo.d.ts +45 -0
- package/dist/gateway/db/repositories/user-cluster-config-repo.js +90 -0
- package/dist/gateway/db/repositories/user-cluster-config-repo.js.map +1 -0
- package/dist/gateway/db/repositories/workspace-repo.d.ts +2 -2
- package/dist/gateway/db/repositories/workspace-repo.js +12 -12
- package/dist/gateway/db/repositories/workspace-repo.js.map +1 -1
- package/dist/gateway/db/schema-mysql.d.ts +437 -44
- package/dist/gateway/db/schema-mysql.js +36 -9
- package/dist/gateway/db/schema-mysql.js.map +1 -1
- package/dist/gateway/db/schema-sqlite.d.ts +459 -46
- package/dist/gateway/db/schema-sqlite.js +36 -9
- package/dist/gateway/db/schema-sqlite.js.map +1 -1
- package/dist/gateway/db/schema.d.ts +435 -44
- package/dist/gateway/db/schema.js +1 -1
- package/dist/gateway/db/schema.js.map +1 -1
- package/dist/gateway/plugins/channel-bridge.js +1 -1
- package/dist/gateway/plugins/channel-bridge.js.map +1 -1
- package/dist/gateway/rpc-methods.d.ts +2 -1
- package/dist/gateway/rpc-methods.js +507 -172
- package/dist/gateway/rpc-methods.js.map +1 -1
- package/dist/gateway/server.js +191 -51
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/web/dist/assets/index-DTD0P9j8.css +1 -0
- package/dist/gateway/web/dist/assets/index-DhqsS2E0.js +756 -0
- package/dist/gateway/web/dist/assets/index-DhqsS2E0.js.map +1 -0
- package/dist/gateway/web/dist/index.html +2 -2
- package/dist/gateway-main.js +1 -3
- package/dist/gateway-main.js.map +1 -1
- package/dist/memory/indexer.d.ts +13 -0
- package/dist/memory/indexer.js +91 -1
- package/dist/memory/indexer.js.map +1 -1
- package/dist/memory/knowledge-extractor.d.ts +47 -0
- package/dist/memory/knowledge-extractor.js +165 -0
- package/dist/memory/knowledge-extractor.js.map +1 -0
- package/dist/memory/overview-generator.d.ts +16 -0
- package/dist/memory/overview-generator.js +233 -0
- package/dist/memory/overview-generator.js.map +1 -0
- package/dist/memory/session-summarizer.d.ts +28 -0
- package/dist/memory/session-summarizer.js +20 -2
- package/dist/memory/session-summarizer.js.map +1 -1
- package/dist/memory/temporal-decay.js +2 -2
- package/dist/memory/temporal-decay.js.map +1 -1
- package/dist/memory/topic-consolidator.d.ts +52 -0
- package/dist/memory/topic-consolidator.js +197 -0
- package/dist/memory/topic-consolidator.js.map +1 -0
- package/dist/tools/cluster-info.d.ts +9 -0
- package/dist/tools/cluster-info.js +74 -0
- package/dist/tools/cluster-info.js.map +1 -0
- package/dist/tools/command-sets.js +15 -5
- package/dist/tools/command-sets.js.map +1 -1
- package/dist/tools/create-skill.js +1 -1
- package/dist/tools/create-skill.js.map +1 -1
- package/dist/tools/debug-pod.d.ts +217 -0
- package/dist/tools/debug-pod.js +603 -0
- package/dist/tools/debug-pod.js.map +1 -0
- package/dist/tools/deep-search/engine.d.ts +0 -5
- package/dist/tools/deep-search/engine.js +68 -28
- package/dist/tools/deep-search/engine.js.map +1 -1
- package/dist/tools/deep-search/format.d.ts +1 -1
- package/dist/tools/deep-search/format.js +1 -2
- package/dist/tools/deep-search/format.js.map +1 -1
- package/dist/tools/deep-search/prompts.d.ts +4 -1
- package/dist/tools/deep-search/prompts.js +47 -29
- package/dist/tools/deep-search/prompts.js.map +1 -1
- package/dist/tools/deep-search/quality-gate.d.ts +25 -0
- package/dist/tools/deep-search/quality-gate.js +81 -0
- package/dist/tools/deep-search/quality-gate.js.map +1 -0
- package/dist/tools/deep-search/schemas.d.ts +25 -0
- package/dist/tools/deep-search/schemas.js +26 -1
- package/dist/tools/deep-search/schemas.js.map +1 -1
- package/dist/tools/deep-search/sre-knowledge.d.ts +6 -10
- package/dist/tools/deep-search/sre-knowledge.js +21 -52
- package/dist/tools/deep-search/sre-knowledge.js.map +1 -1
- package/dist/tools/deep-search/sub-agent.js +24 -8
- package/dist/tools/deep-search/sub-agent.js.map +1 -1
- package/dist/tools/deep-search/tool.js +3 -6
- package/dist/tools/deep-search/tool.js.map +1 -1
- package/dist/tools/deep-search/types.d.ts +13 -0
- package/dist/tools/deep-search/types.js +4 -4
- package/dist/tools/deep-search/types.js.map +1 -1
- package/dist/tools/dp-tools.d.ts +9 -6
- package/dist/tools/dp-tools.js +26 -55
- package/dist/tools/dp-tools.js.map +1 -1
- package/dist/tools/exec-utils.d.ts +8 -21
- package/dist/tools/exec-utils.js +11 -95
- package/dist/tools/exec-utils.js.map +1 -1
- package/dist/tools/fork-skill.js +1 -1
- package/dist/tools/fork-skill.js.map +1 -1
- package/dist/tools/k8s-checks.d.ts +11 -5
- package/dist/tools/k8s-checks.js +28 -9
- package/dist/tools/k8s-checks.js.map +1 -1
- package/dist/tools/knowledge-search.d.ts +3 -0
- package/dist/tools/knowledge-search.js +115 -0
- package/dist/tools/knowledge-search.js.map +1 -0
- package/dist/tools/kubeconfig-resolver.d.ts +22 -0
- package/dist/tools/kubeconfig-resolver.js +98 -18
- package/dist/tools/kubeconfig-resolver.js.map +1 -1
- package/dist/tools/manage-schedule.js +23 -1
- package/dist/tools/manage-schedule.js.map +1 -1
- package/dist/tools/netns-script.d.ts +1 -1
- package/dist/tools/netns-script.js +19 -7
- package/dist/tools/netns-script.js.map +1 -1
- package/dist/tools/node-exec.d.ts +1 -1
- package/dist/tools/node-exec.js +19 -7
- package/dist/tools/node-exec.js.map +1 -1
- package/dist/tools/node-script.d.ts +1 -1
- package/dist/tools/node-script.js +19 -7
- package/dist/tools/node-script.js.map +1 -1
- package/dist/tools/pod-exec.js +12 -1
- package/dist/tools/pod-exec.js.map +1 -1
- package/dist/tools/pod-nsenter-exec.d.ts +1 -1
- package/dist/tools/pod-nsenter-exec.js +19 -7
- package/dist/tools/pod-nsenter-exec.js.map +1 -1
- package/dist/tools/pod-script.js +12 -1
- package/dist/tools/pod-script.js.map +1 -1
- package/dist/tools/restricted-bash.js +10 -3
- package/dist/tools/restricted-bash.js.map +1 -1
- package/dist/tools/run-skill.js +14 -2
- package/dist/tools/run-skill.js.map +1 -1
- package/dist/tools/save-feedback.d.ts +7 -0
- package/dist/tools/save-feedback.js +125 -0
- package/dist/tools/save-feedback.js.map +1 -0
- package/dist/tools/update-skill.js +1 -1
- package/dist/tools/update-skill.js.map +1 -1
- package/package.json +1 -1
- package/skills/core/deep-investigation/SKILL.md +11 -14
- package/skills/core/session-feedback/SKILL.md +146 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool call ID sanitization for provider compatibility.
|
|
3
|
+
*
|
|
4
|
+
* Some providers (e.g., Mistral, certain OpenAI-compatible APIs) require
|
|
5
|
+
* strictly alphanumeric tool call IDs. This module rewrites IDs in the
|
|
6
|
+
* conversation history while preserving assistant-toolResult pairing.
|
|
7
|
+
*
|
|
8
|
+
* Ported from OpenClaw's src/agents/tool-call-id.ts.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from "node:crypto";
|
|
11
|
+
import { extractToolCallsFromAssistant } from "./message-utils.js";
|
|
12
|
+
const STRICT9_LEN = 9;
|
|
13
|
+
/**
|
|
14
|
+
* Sanitize a tool call ID to be compatible with various providers.
|
|
15
|
+
*
|
|
16
|
+
* - "strict" mode: only [a-zA-Z0-9]
|
|
17
|
+
* - "strict9" mode: only [a-zA-Z0-9], length 9 (Mistral tool call requirement)
|
|
18
|
+
*/
|
|
19
|
+
export function sanitizeToolCallId(id, mode = "strict") {
|
|
20
|
+
if (!id || typeof id !== "string") {
|
|
21
|
+
if (mode === "strict9") {
|
|
22
|
+
return "defaultid";
|
|
23
|
+
}
|
|
24
|
+
return "defaulttoolid";
|
|
25
|
+
}
|
|
26
|
+
if (mode === "strict9") {
|
|
27
|
+
const alphanumericOnly = id.replace(/[^a-zA-Z0-9]/g, "");
|
|
28
|
+
if (alphanumericOnly.length >= STRICT9_LEN) {
|
|
29
|
+
return alphanumericOnly.slice(0, STRICT9_LEN);
|
|
30
|
+
}
|
|
31
|
+
if (alphanumericOnly.length > 0) {
|
|
32
|
+
return shortHash(alphanumericOnly, STRICT9_LEN);
|
|
33
|
+
}
|
|
34
|
+
return shortHash("sanitized", STRICT9_LEN);
|
|
35
|
+
}
|
|
36
|
+
// Some providers require strictly alphanumeric tool call IDs.
|
|
37
|
+
const alphanumericOnly = id.replace(/[^a-zA-Z0-9]/g, "");
|
|
38
|
+
return alphanumericOnly.length > 0 ? alphanumericOnly : "sanitizedtoolid";
|
|
39
|
+
}
|
|
40
|
+
export function isValidCloudCodeAssistToolId(id, mode = "strict") {
|
|
41
|
+
if (!id || typeof id !== "string") {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (mode === "strict9") {
|
|
45
|
+
return /^[a-zA-Z0-9]{9}$/.test(id);
|
|
46
|
+
}
|
|
47
|
+
// Strictly alphanumeric for providers with tighter tool ID constraints
|
|
48
|
+
return /^[a-zA-Z0-9]+$/.test(id);
|
|
49
|
+
}
|
|
50
|
+
function shortHash(text, length = 8) {
|
|
51
|
+
return createHash("sha256").update(text).digest("hex").slice(0, length);
|
|
52
|
+
}
|
|
53
|
+
function makeUniqueToolId(params) {
|
|
54
|
+
if (params.mode === "strict9") {
|
|
55
|
+
const base = sanitizeToolCallId(params.id, params.mode);
|
|
56
|
+
const candidate = base.length >= STRICT9_LEN ? base.slice(0, STRICT9_LEN) : "";
|
|
57
|
+
if (candidate && !params.used.has(candidate)) {
|
|
58
|
+
return candidate;
|
|
59
|
+
}
|
|
60
|
+
for (let i = 0; i < 1000; i += 1) {
|
|
61
|
+
const hashed = shortHash(`${params.id}:${i}`, STRICT9_LEN);
|
|
62
|
+
if (!params.used.has(hashed)) {
|
|
63
|
+
return hashed;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return shortHash(`${params.id}:${Date.now()}`, STRICT9_LEN);
|
|
67
|
+
}
|
|
68
|
+
const MAX_LEN = 40;
|
|
69
|
+
const base = sanitizeToolCallId(params.id, params.mode).slice(0, MAX_LEN);
|
|
70
|
+
if (!params.used.has(base)) {
|
|
71
|
+
return base;
|
|
72
|
+
}
|
|
73
|
+
const hash = shortHash(params.id);
|
|
74
|
+
// Use separator based on mode: none for strict, underscore for non-strict variants
|
|
75
|
+
const separator = params.mode === "strict" ? "" : "_";
|
|
76
|
+
const maxBaseLen = MAX_LEN - separator.length - hash.length;
|
|
77
|
+
const clippedBase = base.length > maxBaseLen ? base.slice(0, maxBaseLen) : base;
|
|
78
|
+
const candidate = `${clippedBase}${separator}${hash}`;
|
|
79
|
+
if (!params.used.has(candidate)) {
|
|
80
|
+
return candidate;
|
|
81
|
+
}
|
|
82
|
+
for (let i = 2; i < 1000; i += 1) {
|
|
83
|
+
const suffix = params.mode === "strict" ? `x${i}` : `_${i}`;
|
|
84
|
+
const next = `${candidate.slice(0, MAX_LEN - suffix.length)}${suffix}`;
|
|
85
|
+
if (!params.used.has(next)) {
|
|
86
|
+
return next;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const ts = params.mode === "strict" ? `t${Date.now()}` : `_${Date.now()}`;
|
|
90
|
+
return `${candidate.slice(0, MAX_LEN - ts.length)}${ts}`;
|
|
91
|
+
}
|
|
92
|
+
function createOccurrenceAwareResolver(mode) {
|
|
93
|
+
const used = new Set();
|
|
94
|
+
const assistantOccurrences = new Map();
|
|
95
|
+
const orphanToolResultOccurrences = new Map();
|
|
96
|
+
const pendingByRawId = new Map();
|
|
97
|
+
const allocate = (seed) => {
|
|
98
|
+
const next = makeUniqueToolId({ id: seed, used, mode });
|
|
99
|
+
used.add(next);
|
|
100
|
+
return next;
|
|
101
|
+
};
|
|
102
|
+
const resolveAssistantId = (id) => {
|
|
103
|
+
const occurrence = (assistantOccurrences.get(id) ?? 0) + 1;
|
|
104
|
+
assistantOccurrences.set(id, occurrence);
|
|
105
|
+
const next = allocate(occurrence === 1 ? id : `${id}:${occurrence}`);
|
|
106
|
+
const pending = pendingByRawId.get(id);
|
|
107
|
+
if (pending) {
|
|
108
|
+
pending.push(next);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
pendingByRawId.set(id, [next]);
|
|
112
|
+
}
|
|
113
|
+
return next;
|
|
114
|
+
};
|
|
115
|
+
const resolveToolResultId = (id) => {
|
|
116
|
+
const pending = pendingByRawId.get(id);
|
|
117
|
+
if (pending && pending.length > 0) {
|
|
118
|
+
const next = pending.shift();
|
|
119
|
+
if (pending.length === 0) {
|
|
120
|
+
pendingByRawId.delete(id);
|
|
121
|
+
}
|
|
122
|
+
return next;
|
|
123
|
+
}
|
|
124
|
+
const occurrence = (orphanToolResultOccurrences.get(id) ?? 0) + 1;
|
|
125
|
+
orphanToolResultOccurrences.set(id, occurrence);
|
|
126
|
+
return allocate(`${id}:tool_result:${occurrence}`);
|
|
127
|
+
};
|
|
128
|
+
return { resolveAssistantId, resolveToolResultId };
|
|
129
|
+
}
|
|
130
|
+
function rewriteAssistantToolCallIds(params) {
|
|
131
|
+
const toolCalls = extractToolCallsFromAssistant(params.message);
|
|
132
|
+
if (toolCalls.length === 0) {
|
|
133
|
+
return params.message;
|
|
134
|
+
}
|
|
135
|
+
const content = params.message.content;
|
|
136
|
+
if (!Array.isArray(content)) {
|
|
137
|
+
return params.message;
|
|
138
|
+
}
|
|
139
|
+
let changed = false;
|
|
140
|
+
const next = content.map((block) => {
|
|
141
|
+
if (!block || typeof block !== "object") {
|
|
142
|
+
return block;
|
|
143
|
+
}
|
|
144
|
+
const rec = block;
|
|
145
|
+
const type = rec.type;
|
|
146
|
+
const id = rec.id;
|
|
147
|
+
if ((type !== "functionCall" && type !== "toolUse" && type !== "toolCall") ||
|
|
148
|
+
typeof id !== "string" ||
|
|
149
|
+
!id) {
|
|
150
|
+
return block;
|
|
151
|
+
}
|
|
152
|
+
const nextId = params.resolveId(id);
|
|
153
|
+
if (nextId === id) {
|
|
154
|
+
return block;
|
|
155
|
+
}
|
|
156
|
+
changed = true;
|
|
157
|
+
return { ...block, id: nextId };
|
|
158
|
+
});
|
|
159
|
+
if (!changed) {
|
|
160
|
+
return params.message;
|
|
161
|
+
}
|
|
162
|
+
return { ...params.message, content: next };
|
|
163
|
+
}
|
|
164
|
+
function rewriteToolResultIds(params) {
|
|
165
|
+
const toolCallId = typeof params.message.toolCallId === "string" && params.message.toolCallId
|
|
166
|
+
? params.message.toolCallId
|
|
167
|
+
: undefined;
|
|
168
|
+
const toolUseId = params.message.toolUseId;
|
|
169
|
+
const toolUseIdStr = typeof toolUseId === "string" && toolUseId ? toolUseId : undefined;
|
|
170
|
+
const sharedRawId = toolCallId && toolUseIdStr && toolCallId === toolUseIdStr ? toolCallId : undefined;
|
|
171
|
+
const sharedResolvedId = sharedRawId ? params.resolveId(sharedRawId) : undefined;
|
|
172
|
+
const nextToolCallId = sharedResolvedId ?? (toolCallId ? params.resolveId(toolCallId) : undefined);
|
|
173
|
+
const nextToolUseId = sharedResolvedId ?? (toolUseIdStr ? params.resolveId(toolUseIdStr) : undefined);
|
|
174
|
+
if (nextToolCallId === toolCallId && nextToolUseId === toolUseIdStr) {
|
|
175
|
+
return params.message;
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
...params.message,
|
|
179
|
+
...(nextToolCallId && { toolCallId: nextToolCallId }),
|
|
180
|
+
...(nextToolUseId && { toolUseId: nextToolUseId }),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Sanitize tool call IDs for provider compatibility.
|
|
185
|
+
*
|
|
186
|
+
* Sanitization can introduce collisions, and some providers also reject raw
|
|
187
|
+
* duplicate tool-call IDs. Track assistant occurrences in-order so repeated
|
|
188
|
+
* raw IDs receive distinct rewritten IDs, while matching tool results consume
|
|
189
|
+
* the same rewritten IDs in encounter order.
|
|
190
|
+
*
|
|
191
|
+
* @param messages - The messages to sanitize
|
|
192
|
+
* @param mode - "strict" (alphanumeric only) or "strict9" (alphanumeric length 9)
|
|
193
|
+
*/
|
|
194
|
+
export function sanitizeToolCallIdsForCloudCodeAssist(messages, mode = "strict") {
|
|
195
|
+
const { resolveAssistantId, resolveToolResultId: resolveToolResultIdFn } = createOccurrenceAwareResolver(mode);
|
|
196
|
+
let changed = false;
|
|
197
|
+
const out = messages.map((msg) => {
|
|
198
|
+
if (!msg || typeof msg !== "object") {
|
|
199
|
+
return msg;
|
|
200
|
+
}
|
|
201
|
+
const role = msg.role;
|
|
202
|
+
if (role === "assistant") {
|
|
203
|
+
const next = rewriteAssistantToolCallIds({
|
|
204
|
+
message: msg,
|
|
205
|
+
resolveId: resolveAssistantId,
|
|
206
|
+
});
|
|
207
|
+
if (next !== msg) {
|
|
208
|
+
changed = true;
|
|
209
|
+
}
|
|
210
|
+
return next;
|
|
211
|
+
}
|
|
212
|
+
if (role === "toolResult") {
|
|
213
|
+
const next = rewriteToolResultIds({
|
|
214
|
+
message: msg,
|
|
215
|
+
resolveId: resolveToolResultIdFn,
|
|
216
|
+
});
|
|
217
|
+
if (next !== msg) {
|
|
218
|
+
changed = true;
|
|
219
|
+
}
|
|
220
|
+
return next;
|
|
221
|
+
}
|
|
222
|
+
return msg;
|
|
223
|
+
});
|
|
224
|
+
return changed ? out : messages;
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=tool-call-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-id.js","sourceRoot":"","sources":["../../src/core/tool-call-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool call validation and repair for session history.
|
|
3
|
+
*
|
|
4
|
+
* Prevents 400 errors from OpenAI-compatible APIs when session history
|
|
5
|
+
* contains malformed tool calls (missing/empty id or name) due to
|
|
6
|
+
* interrupted streams or incomplete API responses.
|
|
7
|
+
*
|
|
8
|
+
* Ported from OpenClaw's session-transcript-repair.ts (simplified —
|
|
9
|
+
* no allowedToolNames, no sessions_spawn handling).
|
|
10
|
+
*/
|
|
11
|
+
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|
12
|
+
export type ToolCallInputRepairReport = {
|
|
13
|
+
messages: AgentMessage[];
|
|
14
|
+
droppedToolCalls: number;
|
|
15
|
+
droppedAssistantMessages: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function repairToolCallInputs(messages: AgentMessage[]): ToolCallInputRepairReport;
|
|
18
|
+
export declare function sanitizeToolCallInputs(messages: AgentMessage[]): AgentMessage[];
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const TOOL_CALL_NAME_MAX_CHARS = 64;
|
|
2
|
+
const TOOL_CALL_NAME_RE = /^[A-Za-z0-9_-]+$/;
|
|
3
|
+
function isRawToolCallBlock(block) {
|
|
4
|
+
if (!block || typeof block !== "object")
|
|
5
|
+
return false;
|
|
6
|
+
const type = block.type;
|
|
7
|
+
return (typeof type === "string" &&
|
|
8
|
+
(type === "toolCall" || type === "toolUse" || type === "functionCall"));
|
|
9
|
+
}
|
|
10
|
+
function hasToolCallInput(block) {
|
|
11
|
+
const hasInput = "input" in block ? block.input !== undefined && block.input !== null : false;
|
|
12
|
+
const hasArguments = "arguments" in block ? block.arguments !== undefined && block.arguments !== null : false;
|
|
13
|
+
return hasInput || hasArguments;
|
|
14
|
+
}
|
|
15
|
+
function hasToolCallId(block) {
|
|
16
|
+
return typeof block.id === "string" && block.id.trim().length > 0;
|
|
17
|
+
}
|
|
18
|
+
function hasToolCallName(block) {
|
|
19
|
+
if (typeof block.name !== "string")
|
|
20
|
+
return false;
|
|
21
|
+
const trimmed = block.name.trim();
|
|
22
|
+
if (!trimmed)
|
|
23
|
+
return false;
|
|
24
|
+
if (trimmed.length > TOOL_CALL_NAME_MAX_CHARS || !TOOL_CALL_NAME_RE.test(trimmed))
|
|
25
|
+
return false;
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
export function repairToolCallInputs(messages) {
|
|
29
|
+
let droppedToolCalls = 0;
|
|
30
|
+
let droppedAssistantMessages = 0;
|
|
31
|
+
let changed = false;
|
|
32
|
+
const out = [];
|
|
33
|
+
for (const msg of messages) {
|
|
34
|
+
if (!msg || typeof msg !== "object") {
|
|
35
|
+
out.push(msg);
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (msg.role !== "assistant" || !Array.isArray(msg.content)) {
|
|
39
|
+
out.push(msg);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
const nextContent = [];
|
|
43
|
+
let droppedInMessage = 0;
|
|
44
|
+
for (const block of msg.content) {
|
|
45
|
+
if (isRawToolCallBlock(block) &&
|
|
46
|
+
(!hasToolCallInput(block) || !hasToolCallId(block) || !hasToolCallName(block))) {
|
|
47
|
+
droppedToolCalls += 1;
|
|
48
|
+
droppedInMessage += 1;
|
|
49
|
+
changed = true;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
nextContent.push(block);
|
|
53
|
+
}
|
|
54
|
+
if (droppedInMessage > 0) {
|
|
55
|
+
if (nextContent.length === 0) {
|
|
56
|
+
droppedAssistantMessages += 1;
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
out.push({ ...msg, content: nextContent });
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
out.push(msg);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
messages: changed ? out : messages,
|
|
66
|
+
droppedToolCalls,
|
|
67
|
+
droppedAssistantMessages,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function sanitizeToolCallInputs(messages) {
|
|
71
|
+
return repairToolCallInputs(messages).messages;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=tool-call-repair.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-call-repair.js","sourceRoot":"","sources":["../../src/core/tool-call-repair.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool result context guard — preemptive context budget enforcement.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the agent's `transformContext` to:
|
|
5
|
+
* 1. Truncate individual oversized tool results
|
|
6
|
+
* 2. Compact oldest tool results when total context exceeds budget
|
|
7
|
+
* 3. Throw preemptive overflow error when context is still too large
|
|
8
|
+
*
|
|
9
|
+
* Ported from OpenClaw's src/agents/pi-embedded-runner/tool-result-context-guard.ts
|
|
10
|
+
* with inlined char estimation (no separate module).
|
|
11
|
+
*/
|
|
12
|
+
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|
13
|
+
export declare const PREEMPTIVE_CONTEXT_OVERFLOW_MESSAGE = "Preemptive context overflow: estimated context size exceeds safe threshold during tool loop";
|
|
14
|
+
type GuardableAgent = object;
|
|
15
|
+
export declare function getToolResultText(msg: AgentMessage): string;
|
|
16
|
+
export declare function estimateMessageChars(msg: AgentMessage): number;
|
|
17
|
+
export declare function truncateTextToBudget(text: string, maxChars: number): string;
|
|
18
|
+
export declare function enforceToolResultContextBudgetInPlace(params: {
|
|
19
|
+
messages: AgentMessage[];
|
|
20
|
+
contextBudgetChars: number;
|
|
21
|
+
maxSingleToolResultChars: number;
|
|
22
|
+
}): void;
|
|
23
|
+
/**
|
|
24
|
+
* Install a context guard that enforces tool result size budgets.
|
|
25
|
+
*
|
|
26
|
+
* Wraps `agent.transformContext` (private in pi-coding-agent, accessed via
|
|
27
|
+
* runtime cast) to truncate/compact tool results and trigger preemptive
|
|
28
|
+
* overflow when context is still too large.
|
|
29
|
+
*
|
|
30
|
+
* Returns an uninstall function that restores the original transformContext.
|
|
31
|
+
*/
|
|
32
|
+
export declare function installToolResultContextGuard(params: {
|
|
33
|
+
agent: GuardableAgent;
|
|
34
|
+
contextWindowTokens: number;
|
|
35
|
+
}): () => void;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
// ── Constants ────────────────────────────────────────────────────────────
|
|
2
|
+
const CHARS_PER_TOKEN = 4;
|
|
3
|
+
const TOOL_RESULT_CHARS_PER_TOKEN = 2;
|
|
4
|
+
const IMAGE_CHAR_ESTIMATE = 8_000;
|
|
5
|
+
const CONTEXT_INPUT_HEADROOM_RATIO = 0.75;
|
|
6
|
+
const SINGLE_TOOL_RESULT_CONTEXT_SHARE = 0.5;
|
|
7
|
+
const PREEMPTIVE_OVERFLOW_RATIO = 0.9;
|
|
8
|
+
const TRUNCATION_NOTICE = "[truncated: output exceeded context limit]";
|
|
9
|
+
const TRUNCATION_SUFFIX = `\n${TRUNCATION_NOTICE}`;
|
|
10
|
+
const COMPACTION_PLACEHOLDER = "[compacted: tool output removed to free context]";
|
|
11
|
+
export const PREEMPTIVE_CONTEXT_OVERFLOW_MESSAGE = "Preemptive context overflow: estimated context size exceeds safe threshold during tool loop";
|
|
12
|
+
// ── Char estimation (inlined from tool-result-char-estimator) ────────────
|
|
13
|
+
function isTextBlock(block) {
|
|
14
|
+
return !!block && typeof block === "object" && block.type === "text";
|
|
15
|
+
}
|
|
16
|
+
function isImageBlock(block) {
|
|
17
|
+
return !!block && typeof block === "object" && block.type === "image";
|
|
18
|
+
}
|
|
19
|
+
function estimateUnknownChars(value) {
|
|
20
|
+
if (typeof value === "string")
|
|
21
|
+
return value.length;
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return 0;
|
|
24
|
+
try {
|
|
25
|
+
const serialized = JSON.stringify(value);
|
|
26
|
+
return typeof serialized === "string" ? serialized.length : 0;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return 256;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function isToolResultMessage(msg) {
|
|
33
|
+
const role = msg.role;
|
|
34
|
+
const type = msg.type;
|
|
35
|
+
return role === "toolResult" || role === "tool" || type === "toolResult";
|
|
36
|
+
}
|
|
37
|
+
function getToolResultContent(msg) {
|
|
38
|
+
if (!isToolResultMessage(msg))
|
|
39
|
+
return [];
|
|
40
|
+
const content = msg.content;
|
|
41
|
+
if (typeof content === "string")
|
|
42
|
+
return [{ type: "text", text: content }];
|
|
43
|
+
return Array.isArray(content) ? content : [];
|
|
44
|
+
}
|
|
45
|
+
function estimateContentBlockChars(content) {
|
|
46
|
+
let chars = 0;
|
|
47
|
+
for (const block of content) {
|
|
48
|
+
if (isTextBlock(block)) {
|
|
49
|
+
chars += block.text.length;
|
|
50
|
+
}
|
|
51
|
+
else if (isImageBlock(block)) {
|
|
52
|
+
chars += IMAGE_CHAR_ESTIMATE;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
chars += estimateUnknownChars(block);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return chars;
|
|
59
|
+
}
|
|
60
|
+
export function getToolResultText(msg) {
|
|
61
|
+
const content = getToolResultContent(msg);
|
|
62
|
+
const chunks = [];
|
|
63
|
+
for (const block of content) {
|
|
64
|
+
if (isTextBlock(block)) {
|
|
65
|
+
chunks.push(block.text);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return chunks.join("\n");
|
|
69
|
+
}
|
|
70
|
+
export function estimateMessageChars(msg) {
|
|
71
|
+
if (!msg || typeof msg !== "object")
|
|
72
|
+
return 0;
|
|
73
|
+
if (msg.role === "user") {
|
|
74
|
+
const content = msg.content;
|
|
75
|
+
if (typeof content === "string")
|
|
76
|
+
return content.length;
|
|
77
|
+
if (Array.isArray(content))
|
|
78
|
+
return estimateContentBlockChars(content);
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
if (msg.role === "assistant") {
|
|
82
|
+
let chars = 0;
|
|
83
|
+
const content = msg.content;
|
|
84
|
+
if (Array.isArray(content)) {
|
|
85
|
+
for (const block of content) {
|
|
86
|
+
if (!block || typeof block !== "object")
|
|
87
|
+
continue;
|
|
88
|
+
const typed = block;
|
|
89
|
+
if (typed.type === "text" && typeof typed.text === "string") {
|
|
90
|
+
chars += typed.text.length;
|
|
91
|
+
}
|
|
92
|
+
else if (typed.type === "thinking" && typeof typed.thinking === "string") {
|
|
93
|
+
chars += typed.thinking.length;
|
|
94
|
+
}
|
|
95
|
+
else if (typed.type === "toolCall") {
|
|
96
|
+
try {
|
|
97
|
+
chars += JSON.stringify(typed.arguments ?? {}).length;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
chars += 128;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
chars += estimateUnknownChars(block);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return chars;
|
|
109
|
+
}
|
|
110
|
+
if (isToolResultMessage(msg)) {
|
|
111
|
+
const content = getToolResultContent(msg);
|
|
112
|
+
let chars = estimateContentBlockChars(content);
|
|
113
|
+
const details = msg.details;
|
|
114
|
+
chars += estimateUnknownChars(details);
|
|
115
|
+
const weightedChars = Math.ceil(chars * (CHARS_PER_TOKEN / TOOL_RESULT_CHARS_PER_TOKEN));
|
|
116
|
+
return Math.max(chars, weightedChars);
|
|
117
|
+
}
|
|
118
|
+
return 256;
|
|
119
|
+
}
|
|
120
|
+
function createMessageCharEstimateCache() {
|
|
121
|
+
return new WeakMap();
|
|
122
|
+
}
|
|
123
|
+
function estimateMessageCharsCached(msg, cache) {
|
|
124
|
+
const hit = cache.get(msg);
|
|
125
|
+
if (hit !== undefined)
|
|
126
|
+
return hit;
|
|
127
|
+
const estimated = estimateMessageChars(msg);
|
|
128
|
+
cache.set(msg, estimated);
|
|
129
|
+
return estimated;
|
|
130
|
+
}
|
|
131
|
+
function estimateContextChars(messages, cache) {
|
|
132
|
+
return messages.reduce((sum, msg) => sum + estimateMessageCharsCached(msg, cache), 0);
|
|
133
|
+
}
|
|
134
|
+
function invalidateMessageCharsCacheEntry(cache, msg) {
|
|
135
|
+
cache.delete(msg);
|
|
136
|
+
}
|
|
137
|
+
// ── Truncation / compaction helpers ──────────────────────────────────────
|
|
138
|
+
export function truncateTextToBudget(text, maxChars) {
|
|
139
|
+
if (text.length <= maxChars)
|
|
140
|
+
return text;
|
|
141
|
+
if (maxChars <= 0)
|
|
142
|
+
return TRUNCATION_NOTICE;
|
|
143
|
+
const bodyBudget = Math.max(0, maxChars - TRUNCATION_SUFFIX.length);
|
|
144
|
+
if (bodyBudget <= 0)
|
|
145
|
+
return TRUNCATION_NOTICE;
|
|
146
|
+
let cutPoint = bodyBudget;
|
|
147
|
+
const newline = text.lastIndexOf("\n", bodyBudget);
|
|
148
|
+
if (newline > bodyBudget * 0.7) {
|
|
149
|
+
cutPoint = newline;
|
|
150
|
+
}
|
|
151
|
+
return text.slice(0, cutPoint) + TRUNCATION_SUFFIX;
|
|
152
|
+
}
|
|
153
|
+
function replaceToolResultText(msg, text) {
|
|
154
|
+
const content = msg.content;
|
|
155
|
+
const replacementContent = typeof content === "string" || content === undefined ? text : [{ type: "text", text }];
|
|
156
|
+
const sourceRecord = msg;
|
|
157
|
+
const { details: _details, ...rest } = sourceRecord;
|
|
158
|
+
return {
|
|
159
|
+
...rest,
|
|
160
|
+
content: replacementContent,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
function truncateToolResultToChars(msg, maxChars, cache) {
|
|
164
|
+
if (!isToolResultMessage(msg))
|
|
165
|
+
return msg;
|
|
166
|
+
const estimatedChars = estimateMessageCharsCached(msg, cache);
|
|
167
|
+
if (estimatedChars <= maxChars)
|
|
168
|
+
return msg;
|
|
169
|
+
const rawText = getToolResultText(msg);
|
|
170
|
+
if (!rawText)
|
|
171
|
+
return replaceToolResultText(msg, TRUNCATION_NOTICE);
|
|
172
|
+
const truncatedText = truncateTextToBudget(rawText, maxChars);
|
|
173
|
+
return replaceToolResultText(msg, truncatedText);
|
|
174
|
+
}
|
|
175
|
+
function applyMessageMutationInPlace(target, source, cache) {
|
|
176
|
+
if (target === source)
|
|
177
|
+
return;
|
|
178
|
+
const targetRecord = target;
|
|
179
|
+
const sourceRecord = source;
|
|
180
|
+
for (const key of Object.keys(targetRecord)) {
|
|
181
|
+
if (!(key in sourceRecord)) {
|
|
182
|
+
delete targetRecord[key];
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
Object.assign(targetRecord, sourceRecord);
|
|
186
|
+
if (cache) {
|
|
187
|
+
invalidateMessageCharsCacheEntry(cache, target);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
function compactExistingToolResultsInPlace(params) {
|
|
191
|
+
const { messages, charsNeeded, cache } = params;
|
|
192
|
+
if (charsNeeded <= 0)
|
|
193
|
+
return 0;
|
|
194
|
+
let reduced = 0;
|
|
195
|
+
for (let i = 0; i < messages.length; i++) {
|
|
196
|
+
const msg = messages[i];
|
|
197
|
+
if (!isToolResultMessage(msg))
|
|
198
|
+
continue;
|
|
199
|
+
const before = estimateMessageCharsCached(msg, cache);
|
|
200
|
+
if (before <= COMPACTION_PLACEHOLDER.length)
|
|
201
|
+
continue;
|
|
202
|
+
const compacted = replaceToolResultText(msg, COMPACTION_PLACEHOLDER);
|
|
203
|
+
applyMessageMutationInPlace(msg, compacted, cache);
|
|
204
|
+
const after = estimateMessageCharsCached(msg, cache);
|
|
205
|
+
if (after >= before)
|
|
206
|
+
continue;
|
|
207
|
+
reduced += before - after;
|
|
208
|
+
if (reduced >= charsNeeded)
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
return reduced;
|
|
212
|
+
}
|
|
213
|
+
// ── Main enforcement function ────────────────────────────────────────────
|
|
214
|
+
export function enforceToolResultContextBudgetInPlace(params) {
|
|
215
|
+
const { messages, contextBudgetChars, maxSingleToolResultChars } = params;
|
|
216
|
+
const estimateCache = createMessageCharEstimateCache();
|
|
217
|
+
// Ensure each tool result has an upper bound before considering total context usage.
|
|
218
|
+
for (const message of messages) {
|
|
219
|
+
if (!isToolResultMessage(message))
|
|
220
|
+
continue;
|
|
221
|
+
const truncated = truncateToolResultToChars(message, maxSingleToolResultChars, estimateCache);
|
|
222
|
+
applyMessageMutationInPlace(message, truncated, estimateCache);
|
|
223
|
+
}
|
|
224
|
+
let currentChars = estimateContextChars(messages, estimateCache);
|
|
225
|
+
if (currentChars <= contextBudgetChars)
|
|
226
|
+
return;
|
|
227
|
+
// Compact oldest tool outputs first until the context is back under budget.
|
|
228
|
+
compactExistingToolResultsInPlace({
|
|
229
|
+
messages,
|
|
230
|
+
charsNeeded: currentChars - contextBudgetChars,
|
|
231
|
+
cache: estimateCache,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
// ── Public API ───────────────────────────────────────────────────────────
|
|
235
|
+
/**
|
|
236
|
+
* Install a context guard that enforces tool result size budgets.
|
|
237
|
+
*
|
|
238
|
+
* Wraps `agent.transformContext` (private in pi-coding-agent, accessed via
|
|
239
|
+
* runtime cast) to truncate/compact tool results and trigger preemptive
|
|
240
|
+
* overflow when context is still too large.
|
|
241
|
+
*
|
|
242
|
+
* Returns an uninstall function that restores the original transformContext.
|
|
243
|
+
*/
|
|
244
|
+
export function installToolResultContextGuard(params) {
|
|
245
|
+
const contextWindowTokens = Math.max(1, Math.floor(params.contextWindowTokens));
|
|
246
|
+
const contextBudgetChars = Math.max(1_024, Math.floor(contextWindowTokens * CHARS_PER_TOKEN * CONTEXT_INPUT_HEADROOM_RATIO));
|
|
247
|
+
const maxSingleToolResultChars = Math.max(1_024, Math.floor(contextWindowTokens * TOOL_RESULT_CHARS_PER_TOKEN * SINGLE_TOOL_RESULT_CONTEXT_SHARE));
|
|
248
|
+
const preemptiveOverflowChars = Math.max(contextBudgetChars, Math.floor(contextWindowTokens * CHARS_PER_TOKEN * PREEMPTIVE_OVERFLOW_RATIO));
|
|
249
|
+
const mutableAgent = params.agent;
|
|
250
|
+
const originalTransformContext = mutableAgent.transformContext;
|
|
251
|
+
mutableAgent.transformContext = (async (messages, signal) => {
|
|
252
|
+
const transformed = originalTransformContext
|
|
253
|
+
? await originalTransformContext.call(mutableAgent, messages, signal)
|
|
254
|
+
: messages;
|
|
255
|
+
const contextMessages = Array.isArray(transformed) ? transformed : messages;
|
|
256
|
+
enforceToolResultContextBudgetInPlace({
|
|
257
|
+
messages: contextMessages,
|
|
258
|
+
contextBudgetChars,
|
|
259
|
+
maxSingleToolResultChars,
|
|
260
|
+
});
|
|
261
|
+
// After tool-result compaction, check if context still exceeds the high-water mark.
|
|
262
|
+
const postEnforcementChars = estimateContextChars(contextMessages, createMessageCharEstimateCache());
|
|
263
|
+
if (postEnforcementChars > preemptiveOverflowChars) {
|
|
264
|
+
throw new Error(PREEMPTIVE_CONTEXT_OVERFLOW_MESSAGE);
|
|
265
|
+
}
|
|
266
|
+
return contextMessages;
|
|
267
|
+
});
|
|
268
|
+
return () => {
|
|
269
|
+
mutableAgent.transformContext = originalTransformContext;
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=tool-result-context-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-result-context-guard.js","sourceRoot":"","sources":["../../src/core/tool-result-context-guard.ts"],"names":[],"mappings":"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"}
|