Skip to content

Commit 0ac96fc

Browse files
committed
fix(file-transfer): preserve UTF-16 pairs in bounded stderr tails
1 parent 4d55b11 commit 0ac96fc

2 files changed

Lines changed: 4 additions & 2 deletions

File tree

extensions/file-transfer/src/shared/node-invoke-policy.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66
OpenClawPluginNodeInvokePolicyContext,
77
OpenClawPluginNodeInvokePolicyResult,
88
} from "openclaw/plugin-sdk/plugin-entry";
9+
import { sliceUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
910
import { appendFileTransferAudit, type FileTransferAuditOp } from "./audit.js";
1011
import { consumeChildOutput } from "./child-output.js";
1112
import {
@@ -33,7 +34,7 @@ function asRecord(value: unknown): Record<string, unknown> {
3334

3435
function appendBoundedTextTail(current: string, chunk: Buffer, maxChars: number): string {
3536
const next = current + chunk.toString();
36-
return next.length > maxChars ? next.slice(-maxChars) : next;
37+
return next.length > maxChars ? sliceUtf16Safe(next, -maxChars) : next;
3738
}
3839

3940
function readPath(params: Record<string, unknown>): string {

extensions/file-transfer/src/tools/dir-fetch-tool.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import fs from "node:fs/promises";
55
import path from "node:path";
66
import type { AnyAgentTool } from "openclaw/plugin-sdk/agent-harness-runtime";
77
import { saveMediaBuffer } from "openclaw/plugin-sdk/media-store";
8+
import { sliceUtf16Safe } from "openclaw/plugin-sdk/text-utility-runtime";
89
import { appendFileTransferAudit } from "../shared/audit.js";
910
import { consumeChildOutput } from "../shared/child-output.js";
1011
import { IMAGE_MIME_INLINE_SET, mimeFromExtension } from "../shared/mime.js";
@@ -42,7 +43,7 @@ const DIR_FETCH_MAX_SINGLE_FILE_BYTES = 16 * 1024 * 1024;
4243

4344
function appendBoundedTextTail(current: string, chunk: Buffer, maxChars: number): string {
4445
const next = current + chunk.toString();
45-
return next.length > maxChars ? next.slice(-maxChars) : next;
46+
return next.length > maxChars ? sliceUtf16Safe(next, -maxChars) : next;
4647
}
4748

4849
async function listTarOutputLines<T>(input: {

0 commit comments

Comments
 (0)