diff --git a/packages/cli/src/modules/mcp/__tests__/agent-tools.service.test.ts b/packages/cli/src/modules/mcp/__tests__/agent-tools.service.test.ts index 7e48ae655ea..a735f8ff02b 100644 --- a/packages/cli/src/modules/mcp/__tests__/agent-tools.service.test.ts +++ b/packages/cli/src/modules/mcp/__tests__/agent-tools.service.test.ts @@ -1783,17 +1783,22 @@ describe('McpAgentToolsService', () => { ], } as never); + // Two-element page from offset 0: only a real newest-first reversal + // yields [exec-3, exec-2]; a raw oldest-first slice would fail here. const result = await callTool('get_agent_session', { agentId: 'agent-1', sessionId: 'thread-1', - limit: 1, - offset: 1, + limit: 2, + offset: 0, }); expect(result.structuredContent).toMatchObject({ ok: true, - executions: [expect.objectContaining({ executionId: 'exec-2' })], - count: 1, + executions: [ + expect.objectContaining({ executionId: 'exec-3' }), + expect.objectContaining({ executionId: 'exec-2' }), + ], + count: 2, total: 3, nextOffset: 2, }); diff --git a/packages/cli/src/modules/mcp/tools/agents/agent-session-log.utils.ts b/packages/cli/src/modules/mcp/tools/agents/agent-session-log.utils.ts index 087bb49a378..8435c751ad4 100644 --- a/packages/cli/src/modules/mcp/tools/agents/agent-session-log.utils.ts +++ b/packages/cli/src/modules/mcp/tools/agents/agent-session-log.utils.ts @@ -86,11 +86,12 @@ export function truncateTimeline( } catch { serialized = String(value); } - if (serialized.length <= budget) return value; + // Scrub before slicing: a secret that straddles the cut would otherwise + // leave an unrecognized — and unscrubbed — prefix behind. + const scrubbed = scrubSecretsInText(serialized); + if (scrubbed.length <= budget) return scrubbed === serialized ? value : scrubbed; truncated = true; - return ( - scrubSecretsInText(serialized.slice(0, budget)) + truncationMarker(serialized.length - budget) - ); + return scrubbed.slice(0, budget) + truncationMarker(scrubbed.length - budget); }; const timeline = events.map((event): ShapedTimelineEvent => { @@ -120,6 +121,10 @@ export function truncateTimeline( return { ...event, response: capValue(event.response) }; case 'background-task-signal': return { ...event, signal: capValue(event.signal) }; + // Carries only a message reference — nothing to cap. No default case: + // a new event variant must fail the build until it gets a decision here. + case 'input': + return { ...event }; } });