@@ -120,6 +120,7 @@ vi.mock("./session-updates.runtime.js", () => ({
120120} ) ) ;
121121
122122vi . mock ( "./session-system-events.js" , ( ) => ( {
123+ drainFormattedSystemEventBlock : vi . fn ( ) . mockResolvedValue ( undefined ) ,
123124 drainFormattedSystemEvents : vi . fn ( ) . mockResolvedValue ( undefined ) ,
124125} ) ) ;
125126
@@ -130,7 +131,7 @@ vi.mock("./typing-mode.js", () => ({
130131let runPreparedReply : typeof import ( "./get-reply-run.js" ) . runPreparedReply ;
131132let runReplyAgent : typeof import ( "./agent-runner.runtime.js" ) . runReplyAgent ;
132133let routeReply : typeof import ( "./route-reply.runtime.js" ) . routeReply ;
133- let drainFormattedSystemEvents : typeof import ( "./session-system-events.js" ) . drainFormattedSystemEvents ;
134+ let drainFormattedSystemEventBlock : typeof import ( "./session-system-events.js" ) . drainFormattedSystemEventBlock ;
134135let resolveTypingMode : typeof import ( "./typing-mode.js" ) . resolveTypingMode ;
135136let buildDirectChatContext : typeof import ( "./groups.js" ) . buildDirectChatContext ;
136137let buildGroupChatContext : typeof import ( "./groups.js" ) . buildGroupChatContext ;
@@ -277,7 +278,7 @@ describe("runPreparedReply media-only handling", () => {
277278 ( { runPreparedReply } = await import ( "./get-reply-run.js" ) ) ;
278279 ( { runReplyAgent } = await import ( "./agent-runner.runtime.js" ) ) ;
279280 ( { routeReply } = await import ( "./route-reply.runtime.js" ) ) ;
280- ( { drainFormattedSystemEvents } = await import ( "./session-system-events.js" ) ) ;
281+ ( { drainFormattedSystemEventBlock } = await import ( "./session-system-events.js" ) ) ;
281282 ( { resolveTypingMode } = await import ( "./typing-mode.js" ) ) ;
282283 ( { buildDirectChatContext, buildGroupChatContext } = await import ( "./groups.js" ) ) ;
283284 ( { buildInboundUserContextPrefix, resolveInboundUserContextPromptJoiner } =
@@ -1517,9 +1518,15 @@ describe("runPreparedReply media-only handling", () => {
15171518 it ( "re-drains system events after waiting behind an active run" , async ( ) => {
15181519 const queueSettings = await import ( "./queue/settings-runtime.js" ) ;
15191520 vi . mocked ( queueSettings . resolveQueueSettings ) . mockReturnValueOnce ( { mode : "interrupt" } ) ;
1520- vi . mocked ( drainFormattedSystemEvents )
1521- . mockResolvedValueOnce ( "System: [t] Initial event." )
1522- . mockResolvedValueOnce ( "System: [t] Post-compaction context." ) ;
1521+ vi . mocked ( drainFormattedSystemEventBlock )
1522+ . mockResolvedValueOnce ( {
1523+ text : "System: [t] Initial event." ,
1524+ forceSenderIsOwnerFalse : false ,
1525+ } )
1526+ . mockResolvedValueOnce ( {
1527+ text : "System: [t] Post-compaction context." ,
1528+ forceSenderIsOwnerFalse : false ,
1529+ } ) ;
15231530
15241531 const previousRun = createReplyOperation ( {
15251532 sessionId : "session-events-after-wait" ,
@@ -2224,7 +2231,10 @@ describe("runPreparedReply media-only handling", () => {
22242231 } ) ;
22252232
22262233 it ( "routes queued system events into user prompt text, not system prompt context" , async ( ) => {
2227- vi . mocked ( drainFormattedSystemEvents ) . mockResolvedValueOnce ( "System: [t] Model switched." ) ;
2234+ vi . mocked ( drainFormattedSystemEventBlock ) . mockResolvedValueOnce ( {
2235+ text : "System: [t] Model switched." ,
2236+ forceSenderIsOwnerFalse : false ,
2237+ } ) ;
22282238
22292239 await runPreparedReply ( baseParams ( ) ) ;
22302240
@@ -2304,7 +2314,10 @@ describe("runPreparedReply media-only handling", () => {
23042314 } ) ;
23052315
23062316 it ( "keeps sender ownership when drained system events are present" , async ( ) => {
2307- vi . mocked ( drainFormattedSystemEvents ) . mockResolvedValueOnce ( "System: [t] Trusted event." ) ;
2317+ vi . mocked ( drainFormattedSystemEventBlock ) . mockResolvedValueOnce ( {
2318+ text : "System: [t] Trusted event." ,
2319+ forceSenderIsOwnerFalse : false ,
2320+ } ) ;
23082321 const params = ownerParams ( ) ;
23092322
23102323 await runPreparedReply ( params ) ;
@@ -2314,9 +2327,10 @@ describe("runPreparedReply media-only handling", () => {
23142327 } ) ;
23152328
23162329 it ( "does not downgrade sender ownership when event text contains the untrusted marker" , async ( ) => {
2317- vi . mocked ( drainFormattedSystemEvents ) . mockResolvedValueOnce (
2318- "System: [t] Relay text mentions System (untrusted): but event is trusted." ,
2319- ) ;
2330+ vi . mocked ( drainFormattedSystemEventBlock ) . mockResolvedValueOnce ( {
2331+ text : "System: [t] Relay text mentions System (untrusted): but event is trusted." ,
2332+ forceSenderIsOwnerFalse : false ,
2333+ } ) ;
23202334 const params = ownerParams ( ) ;
23212335
23222336 await runPreparedReply ( params ) ;
@@ -2329,7 +2343,10 @@ describe("runPreparedReply media-only handling", () => {
23292343 // drainFormattedSystemEvents returns the events block; the caller prepends it.
23302344 // The hint must be extracted from the user body BEFORE prepending, so "System:"
23312345 // does not shadow the low|medium|high shorthand.
2332- vi . mocked ( drainFormattedSystemEvents ) . mockResolvedValueOnce ( "System: [t] Node connected." ) ;
2346+ vi . mocked ( drainFormattedSystemEventBlock ) . mockResolvedValueOnce ( {
2347+ text : "System: [t] Node connected." ,
2348+ forceSenderIsOwnerFalse : false ,
2349+ } ) ;
23332350
23342351 await runPreparedReply (
23352352 baseParams ( {
@@ -2352,7 +2369,10 @@ describe("runPreparedReply media-only handling", () => {
23522369 it ( "carries system events into followupRun.prompt for deferred turns" , async ( ) => {
23532370 // drainFormattedSystemEvents returns the events block; the caller prepends it to
23542371 // effectiveBaseBody for the queue path so deferred turns see events.
2355- vi . mocked ( drainFormattedSystemEvents ) . mockResolvedValueOnce ( "System: [t] Node connected." ) ;
2372+ vi . mocked ( drainFormattedSystemEventBlock ) . mockResolvedValueOnce ( {
2373+ text : "System: [t] Node connected." ,
2374+ forceSenderIsOwnerFalse : false ,
2375+ } ) ;
23562376
23572377 await runPreparedReply ( baseParams ( ) ) ;
23582378
@@ -2363,7 +2383,7 @@ describe("runPreparedReply media-only handling", () => {
23632383 it ( "does not strip think-hint token from deferred queue body" , async ( ) => {
23642384 // In steer mode the inferred thinkLevel is never consumed, so the first token
23652385 // must not be stripped from the queue/steer body (followupRun.prompt).
2366- vi . mocked ( drainFormattedSystemEvents ) . mockResolvedValueOnce ( undefined ) ;
2386+ vi . mocked ( drainFormattedSystemEventBlock ) . mockResolvedValueOnce ( undefined ) ;
23672387
23682388 await runPreparedReply (
23692389 baseParams ( {
0 commit comments