Fix subagent verbose leak: force verboseLevel off + strip tool summaries

This commit is contained in:
Tyler Yust 2026-01-24 23:43:20 -08:00
parent c6cdbb630c
commit 297be11adf
2 changed files with 32 additions and 1 deletions

View File

@ -289,10 +289,33 @@ export function deriveChannel(params: {
}
export function stripToolMessages(messages: unknown[]): unknown[] {
const looksLikeToolSummary = (text: string) => {
const trimmed = text.trimStart();
if (!trimmed) return false;
// Common transcript leak formats.
if (/^Tool:\s*/i.test(trimmed)) return true;
// Emoji + label prefix, e.g. "🔧 Tool: ...", "🛠 Sessions: ...", "📎 Attachments: ...".
// We intentionally keep this somewhat strict to avoid stripping legitimate assistant text.
if (/^[\p{Extended_Pictographic}]\s*[A-Za-z][A-Za-z0-9 _/-]{0,60}:\s+/u.test(trimmed)) {
return true;
}
return false;
};
return messages.filter((msg) => {
if (!msg || typeof msg !== "object") return true;
const role = (msg as { role?: unknown }).role;
return role !== "toolResult";
if (role === "toolResult") return false;
if (role === "assistant") {
const text = extractAssistantText(msg);
if (text && looksLikeToolSummary(text)) return false;
}
return true;
});
}

View File

@ -156,6 +156,14 @@ export function createSessionsSpawnTool(opts?: {
}
}
const childSessionKey = `agent:${targetAgentId}:subagent:${crypto.randomUUID()}`;
// Ensure subagent runs never inherit verbose settings from the requester.
await callGateway({
method: "sessions.patch",
params: { key: childSessionKey, verboseLevel: "off" },
timeoutMs: 10_000,
});
const spawnedByKey = requesterInternalKey;
const targetAgentConfig = resolveAgentConfig(cfg, targetAgentId);
const resolvedModel =