@@ -261,6 +261,31 @@ describe("Messages", () => {
261261 expect ( openFileLinkMock ) . toHaveBeenCalledWith ( linkedPath ) ;
262262 } ) ;
263263
264+ it ( "decodes percent-encoded href file paths before opening" , ( ) => {
265+ const items : ConversationItem [ ] = [
266+ {
267+ id : "msg-file-href-encoded-link" ,
268+ kind : "message" ,
269+ role : "assistant" ,
270+ text : "Open [guide](./docs/My%20Guide.md)" ,
271+ } ,
272+ ] ;
273+
274+ render (
275+ < Messages
276+ items = { items }
277+ threadId = "thread-1"
278+ workspaceId = "ws-1"
279+ isThinking = { false }
280+ openTargets = { [ ] }
281+ selectedOpenAppId = ""
282+ /> ,
283+ ) ;
284+
285+ fireEvent . click ( screen . getByText ( "guide" ) ) ;
286+ expect ( openFileLinkMock ) . toHaveBeenCalledWith ( "./docs/My Guide.md" ) ;
287+ } ) ;
288+
264289 it ( "keeps non-file relative links as normal markdown links" , ( ) => {
265290 const items : ConversationItem [ ] = [
266291 {
@@ -288,6 +313,33 @@ describe("Messages", () => {
288313 expect ( openFileLinkMock ) . not . toHaveBeenCalled ( ) ;
289314 } ) ;
290315
316+ it ( "keeps dot-relative non-file links as normal markdown links" , ( ) => {
317+ const items : ConversationItem [ ] = [
318+ {
319+ id : "msg-help-dot-relative-href-link" ,
320+ kind : "message" ,
321+ role : "assistant" ,
322+ text : "See [Help](./help/getting-started)" ,
323+ } ,
324+ ] ;
325+
326+ render (
327+ < Messages
328+ items = { items }
329+ threadId = "thread-1"
330+ workspaceId = "ws-1"
331+ isThinking = { false }
332+ openTargets = { [ ] }
333+ selectedOpenAppId = ""
334+ /> ,
335+ ) ;
336+
337+ const helpLink = screen . getByText ( "Help" ) . closest ( "a" ) ;
338+ expect ( helpLink ?. getAttribute ( "href" ) ) . toBe ( "./help/getting-started" ) ;
339+ fireEvent . click ( screen . getByText ( "Help" ) ) ;
340+ expect ( openFileLinkMock ) . not . toHaveBeenCalled ( ) ;
341+ } ) ;
342+
291343 it ( "does not crash or navigate on malformed codex-file links" , ( ) => {
292344 const items : ConversationItem [ ] = [
293345 {
0 commit comments