@@ -10,6 +10,7 @@ import type {
1010 AgentSessionCreateResponse ,
1111 AgentToolResultRequest
1212} from "./types" ;
13+ import type { LangType } from "~/types" ;
1314import { desktopInvoke } from "~/shared/desktop/bridge" ;
1415import { getWebApiHeaders , getWebApiMutationHeaders , isDesktopRuntime , withWebSitePrefix } from "~/utils/runtime" ;
1516import { normalizeAgentEvent } from "./agentSse" ;
@@ -78,6 +79,7 @@ interface AgentBinding {
7879 surface : string ;
7980 profile : string ;
8081 contextVersion : number ;
82+ context : Record < string , unknown > ;
8183 heartbeat : ReturnType < typeof setInterval > ;
8284}
8385
@@ -161,9 +163,24 @@ export class AgentClient {
161163 private readonly instanceByResource = new Map < string , string > ( ) ;
162164 private readonly usersByResource = new Map < string , number > ( ) ;
163165 private readonly bindings = new Map < string , AgentBinding > ( ) ;
166+ private responseLanguage ?: LangType ;
164167
165168 constructor ( private readonly request : AgentRequest = defaultAgentRequest ) { }
166169
170+ setResponseLanguage ( language : LangType ) {
171+ this . responseLanguage = language ;
172+ }
173+
174+ private contextWithResponseLanguage ( context : Record < string , unknown > = { } ) : Record < string , unknown > {
175+ // Keep the uploaded snapshot independent of reactive workspace state.
176+ return JSON . parse (
177+ JSON . stringify ( {
178+ ...context ,
179+ ...( this . responseLanguage ? { response_language : this . responseLanguage } : { } )
180+ } )
181+ ) ;
182+ }
183+
167184 retainResource ( resourceSessionId : string ) {
168185 this . usersByResource . set ( resourceSessionId , ( this . usersByResource . get ( resourceSessionId ) || 0 ) + 1 ) ;
169186 }
@@ -243,7 +260,8 @@ export class AgentClient {
243260 }
244261 } ) ;
245262 let contextVersion = 0 ;
246- if ( manifest . context ) {
263+ const contextData = this . contextWithResponseLanguage ( manifest . context ) ;
264+ if ( manifest . context || this . responseLanguage ) {
247265 const context = await this . request < KaelContext > ( {
248266 method : "PUT" ,
249267 path : sessionPath ( panel . id , "context" ) ,
@@ -252,7 +270,7 @@ export class AgentClient {
252270 domain : manifest . profile ,
253271 surface,
254272 sensitivity : "restricted" ,
255- data : manifest . context
273+ data : contextData
256274 }
257275 } ) ;
258276 contextVersion = Math . max ( 0 , Math . floor ( Number ( context . version ) || 1 ) ) ;
@@ -285,6 +303,7 @@ export class AgentClient {
285303 surface,
286304 profile : manifest . profile ,
287305 contextVersion,
306+ context : contextData ,
288307 heartbeat
289308 } ) ;
290309 const registrationIds = Object . fromEntries (
@@ -314,6 +333,9 @@ export class AgentClient {
314333 message : AgentMessageRequest
315334 ) : Promise < AgentMessageResponse > {
316335 const binding = this . binding ( sessionId , resourceSessionId ) ;
336+ if ( this . responseLanguage && binding . context . response_language !== this . responseLanguage ) {
337+ await this . updateContext ( sessionId , resourceSessionId , binding . context ) ;
338+ }
317339 const created = await this . request < KaelMessage > ( {
318340 method : "POST" ,
319341 path : `${ KAEL_API_ROOT } /conversations/${ binding . conversationId } /messages` ,
@@ -342,6 +364,7 @@ export class AgentClient {
342364
343365 async updateContext ( sessionId : string , resourceSessionId : string , context : Record < string , unknown > ) {
344366 const binding = this . binding ( sessionId , resourceSessionId ) ;
367+ const contextData = this . contextWithResponseLanguage ( context ) ;
345368 const response = await this . request < KaelContext > ( {
346369 method : "PUT" ,
347370 path : sessionPath ( binding . panelId , "context" ) ,
@@ -350,10 +373,11 @@ export class AgentClient {
350373 domain : binding . profile ,
351374 surface : binding . surface ,
352375 sensitivity : "restricted" ,
353- data : context
376+ data : contextData
354377 }
355378 } ) ;
356379 binding . contextVersion = Math . max ( binding . contextVersion + 1 , Math . floor ( Number ( response . version ) || 0 ) ) ;
380+ binding . context = contextData ;
357381 }
358382
359383 async resolveApproval (
0 commit comments