@@ -8,6 +8,7 @@ loaded.services_messaging_spec = true
88local messaging = require (' opencode.services.messaging' )
99local session_runtime = require (' opencode.services.session_runtime' )
1010local config_file = require (' opencode.config_file' )
11+ local context = require (' opencode.context' )
1112local state = require (' opencode.state' )
1213local Promise = require (' opencode.promise' )
1314local stub = require (' luassert.stub' )
@@ -280,6 +281,16 @@ describe('opencode.services.messaging', function()
280281 state .session .set_active ({ id = ' sess1' })
281282 state .session .set_user_message_count ({})
282283
284+ local original_context = vim .deepcopy (context .get_context ())
285+ context .get_context ().mentioned_files = { ' /tmp/attached.lua' }
286+ context .get_context ().selections = {
287+ {
288+ file = { path = ' /tmp/attached.lua' , name = ' attached.lua' , extension = ' lua' },
289+ content = ' selected' ,
290+ lines = ' 1, 2' ,
291+ },
292+ }
293+
283294 local count_before = state .user_message_count [' sess1' ] or 0
284295 local count_during = nil
285296
@@ -299,8 +310,79 @@ describe('opencode.services.messaging', function()
299310 assert .equal (0 , count_before )
300311 assert .equal (1 , count_during )
301312 assert .equal (0 , count_after )
313+ assert .same ({}, context .get_context ().mentioned_files )
314+ assert .same ({}, context .get_context ().selections )
302315
303316 state .api_client .create_message = orig
304317 session_runtime .cancel = orig_cancel
318+ for key , value in pairs (original_context ) do
319+ context .get_context ()[key ] = value
320+ end
321+ end )
322+
323+ it (' clears attachments before the request is sent' , function ()
324+ state .ui .set_windows ({ mock = ' windows' })
325+ state .session .set_active ({ id = ' sess1' })
326+
327+ local original_context = vim .deepcopy (context .get_context ())
328+ context .get_context ().mentioned_files = { ' /tmp/attached.lua' }
329+ context .get_context ().selections = {
330+ {
331+ file = { path = ' /tmp/attached.lua' , name = ' attached.lua' , extension = ' lua' },
332+ content = ' selected' ,
333+ lines = ' 1, 2' ,
334+ },
335+ }
336+
337+ local observed_context
338+ local original_create_message = state .api_client .create_message
339+ state .api_client .create_message = function (_ , _session_id , _params )
340+ observed_context = vim .deepcopy (context .get_context ())
341+ return Promise .new ():resolve ({ info = { id = ' m1' }, parts = {} })
342+ end
343+
344+ messaging .send_message (' hello world' ):wait ()
345+
346+ assert .same ({}, observed_context .mentioned_files )
347+ assert .same ({}, observed_context .selections )
348+
349+ state .api_client .create_message = original_create_message
350+ for key , value in pairs (original_context ) do
351+ context .get_context ()[key ] = value
352+ end
353+ end )
354+
355+ it (' clears sent attachments from the active context' , function ()
356+ state .session .set_active ({ id = ' sess1' })
357+
358+ local original_context = vim .deepcopy (context .get_context ())
359+ local sent_context = {
360+ current_file = nil ,
361+ cursor_data = nil ,
362+ linter_errors = nil ,
363+ mentioned_files = { ' /tmp/attached.lua' },
364+ mentioned_subagents = {},
365+ selections = {
366+ {
367+ file = { path = ' /tmp/attached.lua' , name = ' attached.lua' , extension = ' lua' },
368+ content = ' selected' ,
369+ lines = ' 1, 2' ,
370+ },
371+ },
372+ }
373+ for key , value in pairs (sent_context ) do
374+ context .get_context ()[key ] = value
375+ end
376+
377+ local delta_stub = stub (context , ' delta_context' )
378+ messaging .after_run (' hello' )
379+
380+ assert .same ({}, context .get_context ().mentioned_files )
381+ assert .same ({}, context .get_context ().selections )
382+
383+ delta_stub :revert ()
384+ for key , value in pairs (original_context ) do
385+ context .get_context ()[key ] = value
386+ end
305387 end )
306388end )
0 commit comments