(line string)
| 63 | } |
| 64 | |
| 65 | func ParseLineOpenCode(line string) *Event { |
| 66 | line = strings.TrimSpace(line) |
| 67 | if line == "" { |
| 68 | return nil |
| 69 | } |
| 70 | |
| 71 | var ev opencodeEvent |
| 72 | if err := json.Unmarshal([]byte(line), &ev); err != nil { |
| 73 | return nil |
| 74 | } |
| 75 | |
| 76 | switch ev.Type { |
| 77 | case "step_start": |
| 78 | return &Event{Type: EventIterationStart} |
| 79 | |
| 80 | case "tool_use": |
| 81 | if ev.Part == nil { |
| 82 | return nil |
| 83 | } |
| 84 | if ev.Part.State != nil && ev.Part.State.Status == "completed" { |
| 85 | return &Event{ |
| 86 | Type: EventToolResult, |
| 87 | Tool: ev.Part.Tool, |
| 88 | Text: ev.Part.State.Output, |
| 89 | } |
| 90 | } |
| 91 | // Tool starting or in-progress |
| 92 | return &Event{ |
| 93 | Type: EventToolStart, |
| 94 | Tool: ev.Part.Tool, |
| 95 | } |
| 96 | |
| 97 | case "text": |
| 98 | if ev.Part == nil { |
| 99 | return nil |
| 100 | } |
| 101 | if strings.Contains(ev.Part.Text, "<chief-done/>") { |
| 102 | return &Event{ |
| 103 | Type: EventStoryDone, |
| 104 | Text: ev.Part.Text, |
| 105 | } |
| 106 | } |
| 107 | return &Event{ |
| 108 | Type: EventAssistantText, |
| 109 | Text: ev.Part.Text, |
| 110 | } |
| 111 | |
| 112 | case "step_finish": |
| 113 | if ev.Part == nil { |
| 114 | return nil |
| 115 | } |
| 116 | if ev.Part.Reason == "stop" { |
| 117 | return &Event{Type: EventComplete} |
| 118 | } |
| 119 | return nil |
| 120 | |
| 121 | case "error": |
| 122 | msg := "unknown error" |
no outgoing calls