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,369 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream response wrappers for pi-agent streamFn.
|
|
3
|
+
*
|
|
4
|
+
* These wrap the RETURN VALUE of streamFn (the stream object) to intercept
|
|
5
|
+
* and repair stream events in-flight. Unlike input wrappers that modify
|
|
6
|
+
* context.messages before the API call, these modify the response.
|
|
7
|
+
*
|
|
8
|
+
* Ported from OpenClaw's src/agents/pi-embedded-runner/run/attempt.ts.
|
|
9
|
+
*/
|
|
10
|
+
// ── Tool call block type detection ───────────────────────────────────────
|
|
11
|
+
function isToolCallBlockType(type) {
|
|
12
|
+
return type === "toolCall" || type === "toolUse" || type === "functionCall";
|
|
13
|
+
}
|
|
14
|
+
// ── Tool call name trimming ──────────────────────────────────────────────
|
|
15
|
+
/**
|
|
16
|
+
* Normalize tool call IDs in a message: trim whitespace, assign fallback IDs
|
|
17
|
+
* for duplicates or missing IDs.
|
|
18
|
+
*/
|
|
19
|
+
function normalizeToolCallIdsInMessage(message) {
|
|
20
|
+
if (!message || typeof message !== "object")
|
|
21
|
+
return;
|
|
22
|
+
const content = message.content;
|
|
23
|
+
if (!Array.isArray(content))
|
|
24
|
+
return;
|
|
25
|
+
const usedIds = new Set();
|
|
26
|
+
for (const block of content) {
|
|
27
|
+
if (!block || typeof block !== "object")
|
|
28
|
+
continue;
|
|
29
|
+
const typedBlock = block;
|
|
30
|
+
if (!isToolCallBlockType(typedBlock.type) || typeof typedBlock.id !== "string")
|
|
31
|
+
continue;
|
|
32
|
+
const trimmedId = typedBlock.id.trim();
|
|
33
|
+
if (!trimmedId)
|
|
34
|
+
continue;
|
|
35
|
+
usedIds.add(trimmedId);
|
|
36
|
+
}
|
|
37
|
+
let fallbackIndex = 1;
|
|
38
|
+
const assignedIds = new Set();
|
|
39
|
+
for (const block of content) {
|
|
40
|
+
if (!block || typeof block !== "object")
|
|
41
|
+
continue;
|
|
42
|
+
const typedBlock = block;
|
|
43
|
+
if (!isToolCallBlockType(typedBlock.type))
|
|
44
|
+
continue;
|
|
45
|
+
if (typeof typedBlock.id === "string") {
|
|
46
|
+
const trimmedId = typedBlock.id.trim();
|
|
47
|
+
if (trimmedId) {
|
|
48
|
+
if (!assignedIds.has(trimmedId)) {
|
|
49
|
+
if (typedBlock.id !== trimmedId) {
|
|
50
|
+
typedBlock.id = trimmedId;
|
|
51
|
+
}
|
|
52
|
+
assignedIds.add(trimmedId);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
let fallbackId = "";
|
|
58
|
+
while (!fallbackId || usedIds.has(fallbackId) || assignedIds.has(fallbackId)) {
|
|
59
|
+
fallbackId = `call_auto_${fallbackIndex++}`;
|
|
60
|
+
}
|
|
61
|
+
typedBlock.id = fallbackId;
|
|
62
|
+
usedIds.add(fallbackId);
|
|
63
|
+
assignedIds.add(fallbackId);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Trim whitespace from tool call names in a message and normalize IDs.
|
|
68
|
+
* Simplified from OpenClaw: only trims whitespace (no structured name resolution).
|
|
69
|
+
*/
|
|
70
|
+
function trimWhitespaceFromToolCallNamesInMessage(message) {
|
|
71
|
+
if (!message || typeof message !== "object")
|
|
72
|
+
return;
|
|
73
|
+
const content = message.content;
|
|
74
|
+
if (!Array.isArray(content))
|
|
75
|
+
return;
|
|
76
|
+
for (const block of content) {
|
|
77
|
+
if (!block || typeof block !== "object")
|
|
78
|
+
continue;
|
|
79
|
+
const typedBlock = block;
|
|
80
|
+
if (!isToolCallBlockType(typedBlock.type))
|
|
81
|
+
continue;
|
|
82
|
+
if (typeof typedBlock.name === "string") {
|
|
83
|
+
const trimmed = typedBlock.name.trim();
|
|
84
|
+
if (trimmed !== typedBlock.name) {
|
|
85
|
+
typedBlock.name = trimmed;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
normalizeToolCallIdsInMessage(message);
|
|
90
|
+
}
|
|
91
|
+
function wrapStreamTrimToolCallNames(stream) {
|
|
92
|
+
const originalResult = stream.result.bind(stream);
|
|
93
|
+
stream.result = async () => {
|
|
94
|
+
const message = await originalResult();
|
|
95
|
+
trimWhitespaceFromToolCallNamesInMessage(message);
|
|
96
|
+
return message;
|
|
97
|
+
};
|
|
98
|
+
const originalAsyncIterator = stream[Symbol.asyncIterator].bind(stream);
|
|
99
|
+
stream[Symbol.asyncIterator] = function () {
|
|
100
|
+
const iterator = originalAsyncIterator();
|
|
101
|
+
return {
|
|
102
|
+
async next() {
|
|
103
|
+
const result = await iterator.next();
|
|
104
|
+
if (!result.done && result.value && typeof result.value === "object") {
|
|
105
|
+
const event = result.value;
|
|
106
|
+
trimWhitespaceFromToolCallNamesInMessage(event.partial);
|
|
107
|
+
trimWhitespaceFromToolCallNamesInMessage(event.message);
|
|
108
|
+
}
|
|
109
|
+
return result;
|
|
110
|
+
},
|
|
111
|
+
async return(value) {
|
|
112
|
+
return iterator.return?.(value) ?? { done: true, value: undefined };
|
|
113
|
+
},
|
|
114
|
+
async throw(error) {
|
|
115
|
+
return iterator.throw?.(error) ?? { done: true, value: undefined };
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
return stream;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Wrap streamFn to trim whitespace from tool call names in stream events.
|
|
123
|
+
* Also assigns fallback IDs to tool calls with missing/duplicate IDs.
|
|
124
|
+
*/
|
|
125
|
+
export function wrapStreamFnTrimToolCallNames(baseFn) {
|
|
126
|
+
return (model, context, options) => {
|
|
127
|
+
const maybeStream = baseFn(model, context, options);
|
|
128
|
+
if (maybeStream && typeof maybeStream === "object" && "then" in maybeStream) {
|
|
129
|
+
return Promise.resolve(maybeStream).then((stream) => wrapStreamTrimToolCallNames(stream));
|
|
130
|
+
}
|
|
131
|
+
return wrapStreamTrimToolCallNames(maybeStream);
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
// ── Malformed tool call argument repair ──────────────────────────────────
|
|
135
|
+
const MAX_TOOLCALL_REPAIR_BUFFER_CHARS = 64_000;
|
|
136
|
+
const MAX_TOOLCALL_REPAIR_TRAILING_CHARS = 3;
|
|
137
|
+
const TOOLCALL_REPAIR_ALLOWED_TRAILING_RE = /^[^\s{}[\]":,\\]{1,3}$/;
|
|
138
|
+
/**
|
|
139
|
+
* Extract the first balanced JSON object/array from a raw string.
|
|
140
|
+
* Returns null if no balanced structure is found.
|
|
141
|
+
*/
|
|
142
|
+
export function extractBalancedJsonPrefix(raw) {
|
|
143
|
+
let start = 0;
|
|
144
|
+
while (start < raw.length && /\s/.test(raw[start] ?? "")) {
|
|
145
|
+
start += 1;
|
|
146
|
+
}
|
|
147
|
+
const startChar = raw[start];
|
|
148
|
+
if (startChar !== "{" && startChar !== "[") {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
let depth = 0;
|
|
152
|
+
let inString = false;
|
|
153
|
+
let escaped = false;
|
|
154
|
+
for (let i = start; i < raw.length; i += 1) {
|
|
155
|
+
const char = raw[i];
|
|
156
|
+
if (char === undefined)
|
|
157
|
+
break;
|
|
158
|
+
if (inString) {
|
|
159
|
+
if (escaped) {
|
|
160
|
+
escaped = false;
|
|
161
|
+
}
|
|
162
|
+
else if (char === "\\") {
|
|
163
|
+
escaped = true;
|
|
164
|
+
}
|
|
165
|
+
else if (char === '"') {
|
|
166
|
+
inString = false;
|
|
167
|
+
}
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (char === '"') {
|
|
171
|
+
inString = true;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (char === "{" || char === "[") {
|
|
175
|
+
depth += 1;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (char === "}" || char === "]") {
|
|
179
|
+
depth -= 1;
|
|
180
|
+
if (depth === 0) {
|
|
181
|
+
return raw.slice(start, i + 1);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if we should attempt to repair malformed tool call arguments.
|
|
189
|
+
* Triggers on closing braces/brackets or short trailing content.
|
|
190
|
+
*/
|
|
191
|
+
export function shouldAttemptMalformedToolCallRepair(partialJson, delta) {
|
|
192
|
+
if (/[}\]]/.test(delta)) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
const trimmedDelta = delta.trim();
|
|
196
|
+
return (trimmedDelta.length > 0 &&
|
|
197
|
+
trimmedDelta.length <= MAX_TOOLCALL_REPAIR_TRAILING_CHARS &&
|
|
198
|
+
/[}\]]/.test(partialJson));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Try to parse and repair malformed tool call arguments.
|
|
202
|
+
* Returns undefined if the JSON is already valid or cannot be repaired.
|
|
203
|
+
*/
|
|
204
|
+
export function tryParseMalformedToolCallArguments(raw) {
|
|
205
|
+
if (!raw.trim())
|
|
206
|
+
return undefined;
|
|
207
|
+
try {
|
|
208
|
+
JSON.parse(raw);
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
const jsonPrefix = extractBalancedJsonPrefix(raw);
|
|
213
|
+
if (!jsonPrefix)
|
|
214
|
+
return undefined;
|
|
215
|
+
const suffix = raw.slice(raw.indexOf(jsonPrefix) + jsonPrefix.length).trim();
|
|
216
|
+
if (suffix.length === 0 ||
|
|
217
|
+
suffix.length > MAX_TOOLCALL_REPAIR_TRAILING_CHARS ||
|
|
218
|
+
!TOOLCALL_REPAIR_ALLOWED_TRAILING_RE.test(suffix)) {
|
|
219
|
+
return undefined;
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const parsed = JSON.parse(jsonPrefix);
|
|
223
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
224
|
+
? { args: parsed, trailingSuffix: suffix }
|
|
225
|
+
: undefined;
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function repairToolCallArgumentsInMessage(message, contentIndex, repairedArgs) {
|
|
233
|
+
if (!message || typeof message !== "object")
|
|
234
|
+
return;
|
|
235
|
+
const content = message.content;
|
|
236
|
+
if (!Array.isArray(content))
|
|
237
|
+
return;
|
|
238
|
+
const block = content[contentIndex];
|
|
239
|
+
if (!block || typeof block !== "object")
|
|
240
|
+
return;
|
|
241
|
+
const typedBlock = block;
|
|
242
|
+
if (!isToolCallBlockType(typedBlock.type))
|
|
243
|
+
return;
|
|
244
|
+
typedBlock.arguments = repairedArgs;
|
|
245
|
+
}
|
|
246
|
+
function clearToolCallArgumentsInMessage(message, contentIndex) {
|
|
247
|
+
if (!message || typeof message !== "object")
|
|
248
|
+
return;
|
|
249
|
+
const content = message.content;
|
|
250
|
+
if (!Array.isArray(content))
|
|
251
|
+
return;
|
|
252
|
+
const block = content[contentIndex];
|
|
253
|
+
if (!block || typeof block !== "object")
|
|
254
|
+
return;
|
|
255
|
+
const typedBlock = block;
|
|
256
|
+
if (!isToolCallBlockType(typedBlock.type))
|
|
257
|
+
return;
|
|
258
|
+
typedBlock.arguments = {};
|
|
259
|
+
}
|
|
260
|
+
function repairMalformedToolCallArgumentsInMessage(message, repairedArgsByIndex) {
|
|
261
|
+
if (!message || typeof message !== "object")
|
|
262
|
+
return;
|
|
263
|
+
const content = message.content;
|
|
264
|
+
if (!Array.isArray(content))
|
|
265
|
+
return;
|
|
266
|
+
for (const [index, repairedArgs] of repairedArgsByIndex.entries()) {
|
|
267
|
+
repairToolCallArgumentsInMessage(message, index, repairedArgs);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
function wrapStreamRepairMalformedToolCallArguments(stream) {
|
|
271
|
+
const partialJsonByIndex = new Map();
|
|
272
|
+
const repairedArgsByIndex = new Map();
|
|
273
|
+
const disabledIndices = new Set();
|
|
274
|
+
const loggedRepairIndices = new Set();
|
|
275
|
+
const originalResult = stream.result.bind(stream);
|
|
276
|
+
stream.result = async () => {
|
|
277
|
+
const message = await originalResult();
|
|
278
|
+
repairMalformedToolCallArgumentsInMessage(message, repairedArgsByIndex);
|
|
279
|
+
partialJsonByIndex.clear();
|
|
280
|
+
repairedArgsByIndex.clear();
|
|
281
|
+
disabledIndices.clear();
|
|
282
|
+
loggedRepairIndices.clear();
|
|
283
|
+
return message;
|
|
284
|
+
};
|
|
285
|
+
const originalAsyncIterator = stream[Symbol.asyncIterator].bind(stream);
|
|
286
|
+
stream[Symbol.asyncIterator] = function () {
|
|
287
|
+
const iterator = originalAsyncIterator();
|
|
288
|
+
return {
|
|
289
|
+
async next() {
|
|
290
|
+
const result = await iterator.next();
|
|
291
|
+
if (!result.done && result.value && typeof result.value === "object") {
|
|
292
|
+
const event = result.value;
|
|
293
|
+
if (typeof event.contentIndex === "number" &&
|
|
294
|
+
Number.isInteger(event.contentIndex) &&
|
|
295
|
+
event.type === "toolcall_delta" &&
|
|
296
|
+
typeof event.delta === "string") {
|
|
297
|
+
if (disabledIndices.has(event.contentIndex)) {
|
|
298
|
+
return result;
|
|
299
|
+
}
|
|
300
|
+
const nextPartialJson = (partialJsonByIndex.get(event.contentIndex) ?? "") + event.delta;
|
|
301
|
+
if (nextPartialJson.length > MAX_TOOLCALL_REPAIR_BUFFER_CHARS) {
|
|
302
|
+
partialJsonByIndex.delete(event.contentIndex);
|
|
303
|
+
repairedArgsByIndex.delete(event.contentIndex);
|
|
304
|
+
disabledIndices.add(event.contentIndex);
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
partialJsonByIndex.set(event.contentIndex, nextPartialJson);
|
|
308
|
+
if (shouldAttemptMalformedToolCallRepair(nextPartialJson, event.delta)) {
|
|
309
|
+
const repair = tryParseMalformedToolCallArguments(nextPartialJson);
|
|
310
|
+
if (repair) {
|
|
311
|
+
repairedArgsByIndex.set(event.contentIndex, repair.args);
|
|
312
|
+
repairToolCallArgumentsInMessage(event.partial, event.contentIndex, repair.args);
|
|
313
|
+
repairToolCallArgumentsInMessage(event.message, event.contentIndex, repair.args);
|
|
314
|
+
if (!loggedRepairIndices.has(event.contentIndex)) {
|
|
315
|
+
loggedRepairIndices.add(event.contentIndex);
|
|
316
|
+
console.warn(`[stream-wrappers] repairing malformed tool call arguments after ${repair.trailingSuffix.length} trailing chars`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
repairedArgsByIndex.delete(event.contentIndex);
|
|
321
|
+
clearToolCallArgumentsInMessage(event.partial, event.contentIndex);
|
|
322
|
+
clearToolCallArgumentsInMessage(event.message, event.contentIndex);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (typeof event.contentIndex === "number" &&
|
|
327
|
+
Number.isInteger(event.contentIndex) &&
|
|
328
|
+
event.type === "toolcall_end") {
|
|
329
|
+
const repairedArgs = repairedArgsByIndex.get(event.contentIndex);
|
|
330
|
+
if (repairedArgs) {
|
|
331
|
+
if (event.toolCall && typeof event.toolCall === "object") {
|
|
332
|
+
event.toolCall.arguments = repairedArgs;
|
|
333
|
+
}
|
|
334
|
+
repairToolCallArgumentsInMessage(event.partial, event.contentIndex, repairedArgs);
|
|
335
|
+
repairToolCallArgumentsInMessage(event.message, event.contentIndex, repairedArgs);
|
|
336
|
+
}
|
|
337
|
+
partialJsonByIndex.delete(event.contentIndex);
|
|
338
|
+
disabledIndices.delete(event.contentIndex);
|
|
339
|
+
loggedRepairIndices.delete(event.contentIndex);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return result;
|
|
343
|
+
},
|
|
344
|
+
async return(value) {
|
|
345
|
+
return iterator.return?.(value) ?? { done: true, value: undefined };
|
|
346
|
+
},
|
|
347
|
+
async throw(error) {
|
|
348
|
+
return iterator.throw?.(error) ?? { done: true, value: undefined };
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
};
|
|
352
|
+
return stream;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Wrap streamFn to repair malformed JSON in tool call arguments.
|
|
356
|
+
*
|
|
357
|
+
* Intercepts `toolcall_delta` events, accumulates partial JSON, and attempts
|
|
358
|
+
* to extract a balanced JSON prefix when trailing non-JSON characters appear.
|
|
359
|
+
*/
|
|
360
|
+
export function wrapStreamFnRepairMalformedToolCallArguments(baseFn) {
|
|
361
|
+
return (model, context, options) => {
|
|
362
|
+
const maybeStream = baseFn(model, context, options);
|
|
363
|
+
if (maybeStream && typeof maybeStream === "object" && "then" in maybeStream) {
|
|
364
|
+
return Promise.resolve(maybeStream).then((stream) => wrapStreamRepairMalformedToolCallArguments(stream));
|
|
365
|
+
}
|
|
366
|
+
return wrapStreamRepairMalformedToolCallArguments(maybeStream);
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
//# sourceMappingURL=stream-wrappers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-wrappers.js","sourceRoot":"","sources":["../../src/core/stream-wrappers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,4EAA4E;AAE5E,SAAS,mBAAmB,CAAC,IAAa;IACxC,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,cAAc,CAAC;AAC9E,CAAC;AAED,4EAA4E;AAE5E;;;GAGG;AACH,SAAS,6BAA6B,CAAC,OAAgB;IACrD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO;IACpD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IAEpC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,UAAU,GAAG,KAAyC,CAAC;QAC7D,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,UAAU,CAAC,EAAE,KAAK,QAAQ;YAAE,SAAS;QACzF,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,UAAU,GAAG,KAAyC,CAAC;QAC7D,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,IAAI,OAAO,UAAU,CAAC,EAAE,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;oBAChC,IAAI,UAAU,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;wBAChC,UAAU,CAAC,EAAE,GAAG,SAAS,CAAC;oBAC5B,CAAC;oBACD,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAC3B,SAAS;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7E,UAAU,GAAG,aAAa,aAAa,EAAE,EAAE,CAAC;QAC9C,CAAC;QACD,UAAU,CAAC,EAAE,GAAG,UAAU,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,wCAAwC,CAAC,OAAgB;IAChE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO;IACpD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IAEpC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,UAAU,GAAG,KAA2C,CAAC;QAC/D,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACpD,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACvC,IAAI,OAAO,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC;gBAChC,UAAU,CAAC,IAAI,GAAG,OAAO,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IACD,6BAA6B,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,2BAA2B,CAAC,MAAW;IAC9C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,wCAAwC,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;QAC7B,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAiD,CAAC;oBACvE,wCAAwC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBACxD,wCAAwC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,KAAe;gBAC1B,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC/E,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,KAAe;gBACzB,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC9E,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAW;IACvD,OAAO,CAAC,KAAU,EAAE,OAAY,EAAE,OAAY,EAAE,EAAE;QAChD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;YAC5E,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CACvD,2BAA2B,CAAC,MAAM,CAAC,CACpC,CAAC;QACJ,CAAC;QACD,OAAO,2BAA2B,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAE5E,MAAM,gCAAgC,GAAG,MAAM,CAAC;AAChD,MAAM,kCAAkC,GAAG,CAAC,CAAC;AAC7C,MAAM,mCAAmC,GAAG,wBAAwB,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACzD,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QAC3C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,IAAI,KAAK,SAAS;YAAE,MAAM;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;iBAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACzB,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACxB,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;YACD,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,CAAC;YACX,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAAC,WAAmB,EAAE,KAAa;IACrF,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAClC,OAAO,CACL,YAAY,CAAC,MAAM,GAAG,CAAC;QACvB,YAAY,CAAC,MAAM,IAAI,kCAAkC;QACzD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAC1B,CAAC;AACJ,CAAC;AAOD;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAAC,GAAW;IAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChB,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,UAAU,GAAG,yBAAyB,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU;YAAE,OAAO,SAAS,CAAC;QAClC,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7E,IACE,MAAM,CAAC,MAAM,KAAK,CAAC;YACnB,MAAM,CAAC,MAAM,GAAG,kCAAkC;YAClD,CAAC,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,EACjD,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY,CAAC;YACjD,OAAO,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACnE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAiC,EAAE,cAAc,EAAE,MAAM,EAAE;gBACrE,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gCAAgC,CACvC,OAAgB,EAChB,YAAoB,EACpB,YAAqC;IAErC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO;IACpD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO;IAChD,MAAM,UAAU,GAAG,KAAgD,CAAC;IACpE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAClD,UAAU,CAAC,SAAS,GAAG,YAAY,CAAC;AACtC,CAAC;AAED,SAAS,+BAA+B,CAAC,OAAgB,EAAE,YAAoB;IAC7E,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO;IACpD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO;IAChD,MAAM,UAAU,GAAG,KAAgD,CAAC;IACpE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO;IAClD,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,yCAAyC,CAChD,OAAgB,EAChB,mBAAyD;IAEzD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO;IACpD,MAAM,OAAO,GAAI,OAAiC,CAAC,OAAO,CAAC;IAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IACpC,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC;QAClE,gCAAgC,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,SAAS,0CAA0C,CAAC,MAAW;IAC7D,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACvE,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;QACzB,MAAM,OAAO,GAAG,MAAM,cAAc,EAAE,CAAC;QACvC,yCAAyC,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;QACxE,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC3B,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAC5B,eAAe,CAAC,KAAK,EAAE,CAAC;QACxB,mBAAmB,CAAC,KAAK,EAAE,CAAC;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG;QAC7B,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;QACzC,OAAO;YACL,KAAK,CAAC,IAAI;gBACR,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACrC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;oBACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAOpB,CAAC;oBACF,IACE,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;wBACtC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC;wBACpC,KAAK,CAAC,IAAI,KAAK,gBAAgB;wBAC/B,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,EAC/B,CAAC;wBACD,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;4BAC5C,OAAO,MAAM,CAAC;wBAChB,CAAC;wBACD,MAAM,eAAe,GACnB,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;wBACnE,IAAI,eAAe,CAAC,MAAM,GAAG,gCAAgC,EAAE,CAAC;4BAC9D,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;4BAC9C,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;4BAC/C,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;4BACxC,OAAO,MAAM,CAAC;wBAChB,CAAC;wBACD,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;wBAC5D,IAAI,oCAAoC,CAAC,eAAe,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;4BACvE,MAAM,MAAM,GAAG,kCAAkC,CAAC,eAAe,CAAC,CAAC;4BACnE,IAAI,MAAM,EAAE,CAAC;gCACX,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gCACzD,gCAAgC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gCACjF,gCAAgC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gCACjF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;oCACjD,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oCAC5C,OAAO,CAAC,IAAI,CACV,mEAAmE,MAAM,CAAC,cAAc,CAAC,MAAM,iBAAiB,CACjH,CAAC;gCACJ,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gCAC/C,+BAA+B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;gCACnE,+BAA+B,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;4BACrE,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,IACE,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;wBACtC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC;wBACpC,KAAK,CAAC,IAAI,KAAK,cAAc,EAC7B,CAAC;wBACD,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBACjE,IAAI,YAAY,EAAE,CAAC;4BACjB,IAAI,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gCACxD,KAAK,CAAC,QAAoC,CAAC,SAAS,GAAG,YAAY,CAAC;4BACvE,CAAC;4BACD,gCAAgC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;4BAClF,gCAAgC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;wBACpF,CAAC;wBACD,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBAC9C,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBAC3C,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBACjD,CAAC;gBACH,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,KAAe;gBAC1B,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC/E,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,KAAe;gBACzB,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAa,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YAC9E,CAAC;SACF,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,4CAA4C,CAAC,MAAW;IACtE,OAAO,CAAC,KAAU,EAAE,OAAY,EAAE,OAAY,EAAE,EAAE;QAChD,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;YAC5E,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CACvD,0CAA0C,CAAC,MAAM,CAAC,CACnD,CAAC;QACJ,CAAC;QACD,OAAO,0CAA0C,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip thinking blocks from assistant messages before sending to API.
|
|
3
|
+
*
|
|
4
|
+
* Some providers choke on `type: "thinking"` blocks in the conversation
|
|
5
|
+
* history. This utility removes them while preserving turn structure.
|
|
6
|
+
*
|
|
7
|
+
* Ported from OpenClaw's src/agents/pi-embedded-runner/thinking.ts.
|
|
8
|
+
*/
|
|
9
|
+
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|
10
|
+
/**
|
|
11
|
+
* Strip all `type: "thinking"` content blocks from assistant messages.
|
|
12
|
+
*
|
|
13
|
+
* If an assistant message becomes empty after stripping, it is replaced with
|
|
14
|
+
* a synthetic `{ type: "text", text: "" }` block to preserve turn structure
|
|
15
|
+
* (some providers require strict user/assistant alternation).
|
|
16
|
+
*
|
|
17
|
+
* Returns the original array reference when nothing was changed (callers can
|
|
18
|
+
* use reference equality to skip downstream work).
|
|
19
|
+
*/
|
|
20
|
+
export declare function dropThinkingBlocks(messages: AgentMessage[]): AgentMessage[];
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
function isAssistantMessageWithContent(message) {
|
|
2
|
+
return (!!message &&
|
|
3
|
+
typeof message === "object" &&
|
|
4
|
+
message.role === "assistant" &&
|
|
5
|
+
Array.isArray(message.content));
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Strip all `type: "thinking"` content blocks from assistant messages.
|
|
9
|
+
*
|
|
10
|
+
* If an assistant message becomes empty after stripping, it is replaced with
|
|
11
|
+
* a synthetic `{ type: "text", text: "" }` block to preserve turn structure
|
|
12
|
+
* (some providers require strict user/assistant alternation).
|
|
13
|
+
*
|
|
14
|
+
* Returns the original array reference when nothing was changed (callers can
|
|
15
|
+
* use reference equality to skip downstream work).
|
|
16
|
+
*/
|
|
17
|
+
export function dropThinkingBlocks(messages) {
|
|
18
|
+
let touched = false;
|
|
19
|
+
const out = [];
|
|
20
|
+
for (const msg of messages) {
|
|
21
|
+
if (!isAssistantMessageWithContent(msg)) {
|
|
22
|
+
out.push(msg);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const nextContent = [];
|
|
26
|
+
let changed = false;
|
|
27
|
+
for (const block of msg.content) {
|
|
28
|
+
if (block && typeof block === "object" && block.type === "thinking") {
|
|
29
|
+
touched = true;
|
|
30
|
+
changed = true;
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
nextContent.push(block);
|
|
34
|
+
}
|
|
35
|
+
if (!changed) {
|
|
36
|
+
out.push(msg);
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
// Preserve the assistant turn even if all blocks were thinking-only.
|
|
40
|
+
const content = nextContent.length > 0 ? nextContent : [{ type: "text", text: "" }];
|
|
41
|
+
out.push({ ...msg, content });
|
|
42
|
+
}
|
|
43
|
+
return touched ? out : messages;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=thinking-blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thinking-blocks.js","sourceRoot":"","sources":["../../src/core/thinking-blocks.ts"],"names":[],"mappings":"AAaA,SAAS,6BAA6B,CAAC,OAAqB;IAC1D,OAAO,CACL,CAAC,CAAC,OAAO;QACT,OAAO,OAAO,KAAK,QAAQ;QAC3B,OAAO,CAAC,IAAI,KAAK,WAAW;QAC5B,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAwB;IACzD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,6BAA6B,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,WAAW,GAA4B,EAAE,CAAC;QAChD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAA4B,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC5F,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,GAAG,IAAI,CAAC;gBACf,SAAS;YACX,CAAC;YACD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QACD,qEAAqE;QACrE,MAAM,OAAO,GACX,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAA2B,CAAC,CAAC;QAC/F,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentMessage } from "@mariozechner/pi-agent-core";
|
|
2
|
+
export type ToolCallIdMode = "strict" | "strict9";
|
|
3
|
+
/**
|
|
4
|
+
* Sanitize a tool call ID to be compatible with various providers.
|
|
5
|
+
*
|
|
6
|
+
* - "strict" mode: only [a-zA-Z0-9]
|
|
7
|
+
* - "strict9" mode: only [a-zA-Z0-9], length 9 (Mistral tool call requirement)
|
|
8
|
+
*/
|
|
9
|
+
export declare function sanitizeToolCallId(id: string, mode?: ToolCallIdMode): string;
|
|
10
|
+
export declare function isValidCloudCodeAssistToolId(id: string, mode?: ToolCallIdMode): boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Sanitize tool call IDs for provider compatibility.
|
|
13
|
+
*
|
|
14
|
+
* Sanitization can introduce collisions, and some providers also reject raw
|
|
15
|
+
* duplicate tool-call IDs. Track assistant occurrences in-order so repeated
|
|
16
|
+
* raw IDs receive distinct rewritten IDs, while matching tool results consume
|
|
17
|
+
* the same rewritten IDs in encounter order.
|
|
18
|
+
*
|
|
19
|
+
* @param messages - The messages to sanitize
|
|
20
|
+
* @param mode - "strict" (alphanumeric only) or "strict9" (alphanumeric length 9)
|
|
21
|
+
*/
|
|
22
|
+
export declare function sanitizeToolCallIdsForCloudCodeAssist(messages: AgentMessage[], mode?: ToolCallIdMode): AgentMessage[];
|