11local state = require (' opencode.state' )
22
3- --- @class MessageRenderData
4- --- @field message_ref OpencodeMessage Direct reference to message in state.messages
3+ --- @class RenderedMessage
4+ --- @field message OpencodeMessage Direct reference to message in state.messages
55--- @field line_start integer ? Line where message header starts
66--- @field line_end integer ? Line where message header ends
77
8- --- @class PartRenderData
9- --- @field part_ref MessagePart Direct reference to part in state.messages
8+ --- @class RenderedPart
9+ --- @field part MessagePart Direct reference to part in state.messages
1010--- @field message_id string ID of parent message
1111--- @field line_start integer ? Line where part starts
1212--- @field line_end integer ? Line where part ends
@@ -17,8 +17,8 @@ local state = require('opencode.state')
1717--- @field line_to_message table<integer , string> Maps line number to message ID
1818
1919--- @class RenderState
20- --- @field _messages table<string , MessageRenderData > Message ID to render data
21- --- @field _parts table<string , PartRenderData > Part ID to render data
20+ --- @field _messages table<string , RenderedMessage > Message ID to render data
21+ --- @field _parts table<string , RenderedPart > Part ID to render data
2222--- @field _line_index LineIndex Line number to ID mappings
2323local RenderState = {}
2424RenderState .__index = RenderState
4141
4242--- Get message render data by ID
4343--- @param message_id string Message ID
44- --- @return MessageRenderData ?
44+ --- @return RenderedMessage ?
4545function RenderState :get_message (message_id )
4646 return self ._messages [message_id ]
4747end
4848
4949--- Get part render data by ID
5050--- @param part_id string Part ID
51- --- @return PartRenderData ?
51+ --- @return RenderedPart ?
5252function RenderState :get_part (part_id )
5353 return self ._parts [part_id ]
5454end
5858--- @param message_id ? string Optional message ID to limit search scope
5959--- @return string ? part_id Part ID if found
6060function RenderState :get_part_by_call_id (call_id , message_id )
61- if message_id then
62- local msg_data = self ._messages [message_id ]
63- if msg_data and msg_data .message_ref and msg_data .message_ref .parts then
64- for _ , part in ipairs (msg_data .message_ref .parts ) do
65- if part .callID == call_id then
66- return part .id
67- end
68- end
69- end
70- return nil
71- end
72-
73- for i = # state .messages , 1 , - 1 do
74- local msg_wrapper = state .messages [i ]
75- if msg_wrapper .parts then
76- for j = # msg_wrapper .parts , 1 , - 1 do
77- local part = msg_wrapper .parts [j ]
78- if part .callID == call_id then
79- return part .id
80- end
61+ local rendered_message = self ._messages [message_id ]
62+ if rendered_message and rendered_message .message and rendered_message .message .parts then
63+ for _ , part in ipairs (rendered_message .message .parts ) do
64+ if part .callID == call_id then
65+ return part .id
8166 end
8267 end
8368 end
8671
8772--- Get part at specific line
8873--- @param line integer Line number (1-indexed )
89- --- @return PartRenderData ?, string ? part_data , part_id
74+ --- @return RenderedPart ?
9075function RenderState :get_part_at_line (line )
9176 local part_id = self ._line_index .line_to_part [line ]
9277 if not part_id then
93- return nil , nil
78+ return nil
9479 end
95- return self ._parts [part_id ], part_id
80+ return self ._parts [part_id ]
9681end
9782
9883--- Get message at specific line
9984--- @param line integer Line number (1-indexed )
100- --- @return MessageRenderData ?, string ? message_data , message_id
85+ --- @return RenderedMessage ?
10186function RenderState :get_message_at_line (line )
10287 local message_id = self ._line_index .line_to_message [line ]
10388 if not message_id then
104- return nil , nil
89+ return nil
10590 end
106- return self ._messages [message_id ], message_id
91+ return self ._messages [message_id ]
10792end
10893
10994--- Get actions at specific line
@@ -137,13 +122,13 @@ end
137122function RenderState :set_message (message_id , message_ref , line_start , line_end )
138123 if not self ._messages [message_id ] then
139124 self ._messages [message_id ] = {
140- message_ref = message_ref ,
125+ message = message_ref ,
141126 line_start = line_start ,
142127 line_end = line_end ,
143128 }
144129 else
145130 local msg_data = self ._messages [message_id ]
146- msg_data .message_ref = message_ref
131+ msg_data .message = message_ref
147132 if line_start then
148133 msg_data .line_start = line_start
149134 end
@@ -161,28 +146,28 @@ end
161146
162147--- Set or update part render data
163148--- @param part_id string Part ID
164- --- @param part_ref MessagePart Direct reference to part
149+ --- @param part MessagePart Direct reference to part
165150--- @param message_id string Parent message ID
166151--- @param line_start integer ? Line where part starts
167152--- @param line_end integer ? Line where part ends
168- function RenderState :set_part (part_id , part_ref , message_id , line_start , line_end )
153+ function RenderState :set_part (part_id , part , message_id , line_start , line_end )
169154 if not self ._parts [part_id ] then
170155 self ._parts [part_id ] = {
171- part_ref = part_ref ,
156+ part = part ,
172157 message_id = message_id ,
173158 line_start = line_start ,
174159 line_end = line_end ,
175160 actions = {},
176161 }
177162 else
178- local part_data = self ._parts [part_id ]
179- part_data . part_ref = part_ref
180- part_data .message_id = message_id
163+ local render_part = self ._parts [part_id ]
164+ render_part . part = part
165+ render_part .message_id = message_id
181166 if line_start then
182- part_data .line_start = line_start
167+ render_part .line_start = line_start
183168 end
184169 if line_end then
185- part_data .line_end = line_end
170+ render_part .line_end = line_end
186171 end
187172 end
188173
@@ -231,29 +216,35 @@ end
231216--- Update part data reference
232217--- @param part_id string Part ID
233218--- @param part_ref MessagePart New part reference
234- --- @param text string ? New text content
235- function RenderState :update_part_data (part_id , part_ref , text )
219+ function RenderState :update_part_data (part_id , part_ref )
236220 local part_data = self ._parts [part_id ]
237221 if not part_data then
238222 return
239223 end
240224
241- part_data .part_ref = part_ref
242- if text then
243- part_data .text = text
244- end
225+ part_data .part = part_ref
245226end
246227
247228--- Add actions to a part
248229--- @param part_id string Part ID
249230--- @param actions table[] Actions to add
250- function RenderState :add_actions (part_id , actions )
231+ --- @param offset ? integer Optional line offset to apply to actions
232+ function RenderState :add_actions (part_id , actions , offset )
251233 local part_data = self ._parts [part_id ]
252234 if not part_data then
253235 return
254236 end
255237
238+ offset = offset or 0
239+
256240 for _ , action in ipairs (actions ) do
241+ if offset ~= 0 then
242+ action .display_line = action .display_line + offset
243+ if action .range then
244+ action .range .from = action .range .from + offset
245+ action .range .to = action .range .to + offset
246+ end
247+ end
257248 table.insert (part_data .actions , action )
258249 end
259250end
0 commit comments