@@ -2,6 +2,7 @@ package cli
2
2
3
3
import (
4
4
"bytes"
5
+ "context"
5
6
"encoding/json"
6
7
"fmt"
7
8
"strconv"
@@ -12,6 +13,7 @@ import (
12
13
tea "github.com/charmbracelet/bubbletea"
13
14
"github.com/gofrs/uuid"
14
15
"github.com/siyul-park/uniflow/cmd/pkg/resource"
16
+ "github.com/siyul-park/uniflow/pkg/agent"
15
17
"github.com/siyul-park/uniflow/pkg/debug"
16
18
"github.com/siyul-park/uniflow/pkg/port"
17
19
"github.com/siyul-park/uniflow/pkg/process"
@@ -27,11 +29,10 @@ type Debugger struct {
27
29
28
30
// debugModel represents the state and logic for the debugger UI.
29
31
type debugModel struct {
30
- view debugView
31
- input textinput.Model
32
- debugger * debug.Debugger
33
- queue []* debug.Breakpoint
34
- breakpoints []* debug.Breakpoint
32
+ view debugView
33
+ input textinput.Model
34
+ agent * agent.Agent
35
+ debugger * debug.Debugger
35
36
}
36
37
37
38
// debugView defines an interface for different debug view types.
@@ -42,8 +43,8 @@ type debugView interface {
42
43
// Various debug view types
43
44
type (
44
45
errDebugView struct { err error }
45
- frameDebugView struct { frame * debug .Frame }
46
- framesDebugView struct { frames []* debug .Frame }
46
+ frameDebugView struct { frame * agent .Frame }
47
+ framesDebugView struct { frames []* agent .Frame }
47
48
breakpointDebugView struct {
48
49
id int
49
50
breakpoint * debug.Breakpoint
@@ -66,14 +67,15 @@ var _ debugView = (*processDebugView)(nil)
66
67
var _ debugView = (* processesDebugView )(nil )
67
68
68
69
// NewDebugger initializes a new Debugger with an input model and UI.
69
- func NewDebugger (debugger * debug. Debugger , options ... tea.ProgramOption ) * Debugger {
70
+ func NewDebugger (agent * agent. Agent , options ... tea.ProgramOption ) * Debugger {
70
71
ti := textinput .New ()
71
72
ti .Prompt = "(debug) "
72
73
ti .Focus ()
73
74
74
75
model := & debugModel {
75
76
input : ti ,
76
- debugger : debugger ,
77
+ agent : agent ,
78
+ debugger : debug .NewDebugger (agent ),
77
79
}
78
80
program := tea .NewProgram (model , options ... )
79
81
@@ -157,181 +159,132 @@ func (m *debugModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
157
159
}
158
160
}
159
161
160
- breakpoint := debug .NewBreakpoint (
162
+ bp := debug .NewBreakpoint (
161
163
debug .WithSymbol (sb ),
162
164
debug .WithInPort (inPort ),
163
165
debug .WithOutPort (outPort ),
164
166
)
165
- m .debugger .Watch ( breakpoint )
167
+ m .debugger .AddBreakpoint ( bp )
166
168
167
- m . breakpoints = append ( m . breakpoints , breakpoint )
168
- m .view = & breakpointDebugView {id : len (m . breakpoints ) - 1 , breakpoint : breakpoint }
169
+ bps := m . debugger . Breakpoints ( )
170
+ m .view = & breakpointDebugView {id : len (bps ) - 1 , breakpoint : bp }
169
171
170
- return m , m .nextFrame (breakpoint )
172
+ return m , tea .Cmd (func () tea.Msg {
173
+ if m .debugger .Pause (context .Background ()) {
174
+ if m .debugger .Breakpoint () == bp {
175
+ return m .debugger .Frame ()
176
+ }
177
+ }
178
+ return nil
179
+ })
171
180
case "continue" , "c" :
172
- var breakpoint * debug.Breakpoint
173
- if len (m .queue ) > 0 {
174
- breakpoint = m .queue [0 ]
175
- m .queue = m .queue [1 :]
176
- }
177
- if breakpoint == nil {
178
- m .view = nil
179
- return m , nil
180
- }
181
-
182
- var frame * debug.Frame
183
- if len (m .queue ) > 0 {
184
- breakpoint := m .queue [0 ]
185
- frame = breakpoint .Frame ()
186
- }
187
-
188
- if frame == nil {
189
- m .view = nil
190
- } else {
191
- m .view = & frameDebugView {frame : frame }
192
- }
181
+ m .view = nil
193
182
194
- return m , m .nextFrame (breakpoint )
183
+ return m , tea .Cmd (func () tea.Msg {
184
+ if m .debugger .Step (context .Background ()) {
185
+ return m .debugger .Frame ()
186
+ }
187
+ return nil
188
+ })
195
189
case "delete" , "d" :
196
- var breakpoint * debug.Breakpoint
190
+ bps := m .debugger .Breakpoints ()
191
+
192
+ var bp * debug.Breakpoint
197
193
if len (args ) > 1 {
198
- if i , err := strconv .Atoi (args [1 ]); err == nil && i < len (m . breakpoints ) {
199
- breakpoint = m . breakpoints [i ]
194
+ if i , err := strconv .Atoi (args [1 ]); err == nil && i < len (bps ) {
195
+ bp = bps [i ]
200
196
}
201
- } else if len (m .queue ) > 0 {
202
- breakpoint = m .queue [0 ]
203
- }
204
- if breakpoint == nil {
205
- m .view = nil
206
- return m , nil
197
+ } else {
198
+ bp = m .debugger .Breakpoint ()
207
199
}
208
200
209
- m .debugger .Unwatch (breakpoint )
210
- breakpoint .Close ()
211
-
212
- for i := 0 ; i < len (m .queue ); i ++ {
213
- b := m .queue [i ]
214
- if b == breakpoint {
215
- m .queue = append (m .queue [:i ], m .queue [i + 1 :]... )
216
- i --
217
- }
218
- }
219
- for i := 0 ; i < len (m .breakpoints ); i ++ {
220
- b := m .breakpoints [i ]
221
- if b == breakpoint {
222
- m .breakpoints = append (m .breakpoints [:i ], m .breakpoints [i + 1 :]... )
223
- i --
224
- }
225
- }
201
+ m .debugger .RemoveBreakpoint (bp )
226
202
227
203
m .view = nil
228
204
return m , nil
229
205
case "breakpoints" , "bps" :
230
- m .view = & breakpointsDebugView {breakpoints : m .breakpoints }
206
+ bps := m .debugger .Breakpoints ()
207
+
208
+ m .view = & breakpointsDebugView {breakpoints : bps }
231
209
return m , nil
232
210
case "breakpoint" , "bp" :
233
- var breakpoint * debug.Breakpoint
211
+ bps := m .debugger .Breakpoints ()
212
+
213
+ var bp * debug.Breakpoint
234
214
if len (args ) > 1 {
235
- if i , err := strconv .Atoi (args [1 ]); err == nil && i < len (m . breakpoints ) {
236
- breakpoint = m . breakpoints [i ]
215
+ if i , err := strconv .Atoi (args [1 ]); err == nil && i < len (bps ) {
216
+ bp = bps [i ]
237
217
}
238
- } else if len ( m . queue ) > 0 {
239
- breakpoint = m .queue [ 0 ]
218
+ } else {
219
+ bp = m .debugger . Breakpoint ()
240
220
}
241
- if breakpoint == nil {
221
+ if bp == nil {
242
222
m .view = nil
243
223
return m , nil
244
224
}
245
- m .view = & breakpointDebugView {breakpoint : breakpoint }
225
+
226
+ m .view = & breakpointDebugView {breakpoint : bp }
246
227
return m , nil
247
228
case "symbols" , "sbs" :
248
- var symbols []* symbol.Symbol
249
- for _ , id := range m .debugger .Symbols () {
250
- if sb , ok := m .debugger .Symbol (id ); ok {
251
- symbols = append (symbols , sb )
252
- }
253
- }
254
- m .view = & symbolsDebugView {symbols : symbols }
229
+ sbs := m .agent .Symbols ()
230
+
231
+ m .view = & symbolsDebugView {symbols : sbs }
255
232
return m , nil
256
233
case "symbol" , "sb" :
257
234
var sb * symbol.Symbol
258
235
if len (args ) > 1 {
259
236
sb = m .findSymbol (args [1 ])
260
- } else if len (m .queue ) > 0 {
261
- breakpoint := m .queue [0 ]
262
- frame := breakpoint .Frame ()
263
- if frame != nil {
264
- sb = frame .Symbol
265
- } else {
266
- sb = breakpoint .Symbol ()
267
- }
237
+ } else {
238
+ sb = m .debugger .Symbol ()
268
239
}
269
240
if sb == nil {
270
241
m .view = nil
271
242
return m , nil
272
243
}
244
+
273
245
m .view = & symbolDebugView {symbol : sb }
274
246
return m , nil
275
247
case "processes" , "procs" :
276
- var procs []* process.Process
277
- for _ , id := range m .debugger .Processes () {
278
- if proc , ok := m .debugger .Process (id ); ok {
279
- procs = append (procs , proc )
280
- }
281
- }
248
+ procs := m .agent .Processes ()
249
+
282
250
m .view = & processesDebugView {processes : procs }
283
251
return m , nil
284
-
285
252
case "process" , "proc" :
286
253
var proc * process.Process
287
254
if len (args ) > 1 {
288
255
id , _ := uuid .FromString (args [1 ])
289
- proc , _ = m .debugger .Process (id )
290
- } else if len (m .queue ) > 0 {
291
- breakpoint := m .queue [0 ]
292
- frame := breakpoint .Frame ()
293
- if frame != nil {
294
- proc = frame .Process
295
- } else {
296
- proc = breakpoint .Process ()
297
- }
256
+ proc , _ = m .agent .Process (id )
257
+ } else {
258
+ proc = m .debugger .Process ()
298
259
}
299
260
if proc == nil {
300
261
m .view = nil
301
262
return m , nil
302
263
}
264
+
303
265
m .view = & processDebugView {process : proc }
304
266
return m , nil
305
267
case "frame" , "frm" :
306
- var frame * debug.Frame
307
- if len (m .queue ) > 0 {
308
- breakpoint := m .queue [0 ]
309
- frame = breakpoint .Frame ()
310
- }
268
+ frame := m .debugger .Frame ()
311
269
if frame == nil {
312
270
m .view = nil
313
271
return m , nil
314
272
}
273
+
315
274
m .view = & frameDebugView {frame : frame }
316
275
return m , nil
317
276
case "frames" , "frms" :
318
277
var proc * process.Process
319
278
if len (args ) > 1 {
320
279
id , _ := uuid .FromString (args [1 ])
321
- proc , _ = m .debugger .Process (id )
322
- } else if len (m .queue ) > 0 {
323
- breakpoint := m .queue [0 ]
324
- frame := breakpoint .Frame ()
325
- if frame != nil {
326
- proc = frame .Process
327
- } else {
328
- proc = breakpoint .Process ()
329
- }
280
+ proc , _ = m .agent .Process (id )
281
+ } else {
282
+ proc = m .debugger .Process ()
330
283
}
331
284
332
- var frames []* debug .Frame
285
+ var frames []* agent .Frame
333
286
if proc != nil {
334
- frames , _ = m .debugger .Frames (proc .ID ())
287
+ frames , _ = m .agent .Frames (proc .ID ())
335
288
}
336
289
337
290
if frames == nil {
@@ -342,15 +295,11 @@ func (m *debugModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
342
295
return m , nil
343
296
}
344
297
}
345
- case * debug.Breakpoint :
346
- m .queue = append (m .queue , msg )
347
- if len (m .queue ) == 1 {
348
- frame := msg .Frame ()
349
- if frame == nil {
350
- m .view = nil
351
- } else {
352
- m .view = & frameDebugView {frame : frame }
353
- }
298
+ case * agent.Frame :
299
+ if msg == nil {
300
+ m .view = nil
301
+ } else {
302
+ m .view = & frameDebugView {frame : msg }
354
303
}
355
304
return m , nil
356
305
}
@@ -360,14 +309,9 @@ func (m *debugModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
360
309
361
310
// Close resets the model state and stops watching the current breakpoint.
362
311
func (m * debugModel ) Close () {
363
- for _ , b := range m .breakpoints {
364
- m .debugger .Unwatch (b )
365
- b .Close ()
366
- }
367
-
368
312
m .view = nil
369
- m .queue = nil
370
- m .breakpoints = nil
313
+ m .debugger . Close ()
314
+ m .agent . Close ()
371
315
}
372
316
373
317
func (m * debugModel ) nextInput (msg tea.Msg ) tea.Cmd {
@@ -376,16 +320,9 @@ func (m *debugModel) nextInput(msg tea.Msg) tea.Cmd {
376
320
return cmd
377
321
}
378
322
379
- func (m * debugModel ) nextFrame (breakpoint * debug.Breakpoint ) tea.Cmd {
380
- return tea .Cmd (func () tea.Msg {
381
- breakpoint .Next ()
382
- return breakpoint
383
- })
384
- }
385
-
386
323
func (m * debugModel ) findSymbol (key string ) * symbol.Symbol {
387
- for _ , id := range m .debugger .Symbols () {
388
- if sb , ok := m . debugger . Symbol ( id ); ok && ( sb . ID ().String () == key || sb .Name () == key ) {
324
+ for _ , sb := range m .agent .Symbols () {
325
+ if sb . ID ().String () == key || sb .Name () == key {
389
326
return sb
390
327
}
391
328
}
0 commit comments