@@ -4,62 +4,77 @@ import (
44 "strings"
55)
66
7- func removeClaudeMessageBox (msg string ) string {
8- lines := strings .Split (msg , "\n " )
9- lastLine := func () string {
10- if len (lines ) > 0 {
11- return lines [len (lines )- 1 ]
12- }
13- return ""
14- }
15- trimmedLastLine := func () string {
16- return strings .TrimSpace (lastLine ())
17- }
18- popLine := func () {
19- if len (lines ) > 0 {
20- lines = lines [:len (lines )- 1 ]
7+ // Usually something like
8+ // ───────────────
9+ // >
10+ // ───────────────
11+ // Used by Claude Code, Goose, and Aider.
12+ func findGreaterThanMessageBox (lines []string ) int {
13+ for i := len (lines ) - 1 ; i >= max (len (lines )- 6 , 0 ); i -- {
14+ if strings .Contains (lines [i ], ">" ) {
15+ if i > 0 && strings .Contains (lines [i - 1 ], "───────────────" ) {
16+ return i - 1
17+ }
18+ return i
2119 }
2220 }
21+ return - 1
22+ }
2323
24- // The ">" symbol is often used to indicate the user input line.
25- // We remove all lines including and after the last ">" symbol
26- // in the message.
27- greaterThanLineIdx := - 1
28- for i := len (lines ) - 1 ; i >= max (len (lines )- 6 , 0 ); i -- {
29- if strings .Contains (lines [i ], ">" ) {
30- greaterThanLineIdx = i
31- break
24+ // Usually something like
25+ // ───────────────
26+ // |
27+ // ───────────────
28+ // Used by OpenAI Codex.
29+ func findGenericSlimMessageBox (lines []string ) int {
30+ for i := len (lines ) - 3 ; i >= max (len (lines )- 9 , 0 ); i -- {
31+ if strings .Contains (lines [i ], "───────────────" ) &&
32+ (strings .Contains (lines [i + 1 ], "|" ) || strings .Contains (lines [i + 1 ], "│" )) &&
33+ strings .Contains (lines [i + 2 ], "───────────────" ) {
34+ return i
3235 }
3336 }
34- if greaterThanLineIdx >= 0 {
35- lines = lines [:greaterThanLineIdx ]
37+ return - 1
38+ }
39+
40+ func removeMessageBox (msg string ) string {
41+ lines := strings .Split (msg , "\n " )
42+
43+ messageBoxStartIdx := findGreaterThanMessageBox (lines )
44+ if messageBoxStartIdx == - 1 {
45+ messageBoxStartIdx = findGenericSlimMessageBox (lines )
3646 }
3747
38- msgBoxEdge := "───────────────"
39- if strings .Contains (trimmedLastLine (), msgBoxEdge ) {
40- popLine ()
48+ if messageBoxStartIdx != - 1 {
49+ lines = lines [:messageBoxStartIdx ]
4150 }
4251
4352 return strings .Join (lines , "\n " )
4453}
4554
46- func formatClaudeMessage (message string , userInput string ) string {
55+ func formatGenericMessage (message string , userInput string ) string {
4756 message = RemoveUserInput (message , userInput )
48- message = removeClaudeMessageBox (message )
57+ message = removeMessageBox (message )
4958 message = trimEmptyLines (message )
5059 return message
5160}
5261
62+ func formatClaudeMessage (message string , userInput string ) string {
63+ return formatGenericMessage (message , userInput )
64+ }
65+
5366func formatGooseMessage (message string , userInput string ) string {
54- // The current formatClaudeMessage implementation is so generic
55- // that it works with both Goose and Aider too.
56- return formatClaudeMessage (message , userInput )
67+ return formatGenericMessage (message , userInput )
5768}
5869
5970func formatAiderMessage (message string , userInput string ) string {
60- return formatClaudeMessage (message , userInput )
71+ return formatGenericMessage (message , userInput )
72+ }
73+
74+ func formatCodexMessage (message string , userInput string ) string {
75+ return formatGenericMessage (message , userInput )
6176}
6277
6378func formatCustomMessage (message string , userInput string ) string {
64- return formatClaudeMessage (message , userInput )
79+ return formatGenericMessage (message , userInput )
6580}
0 commit comments