agileflow 2.90.0 → 2.90.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/README.md +3 -3
- package/lib/smart-json-file.js +33 -10
- package/lib/table-formatter.js +28 -13
- package/package.json +3 -4
- package/scripts/check-update.js +2 -1
- package/scripts/lib/sessionRegistry.js +4 -8
- package/scripts/tui/App.js +33 -58
- package/scripts/tui/index.js +2 -46
- package/scripts/tui/lib/crashRecovery.js +16 -14
- package/scripts/tui/lib/eventStream.js +8 -15
- package/scripts/tui/lib/keyboard.js +16 -7
- package/scripts/tui/lib/loopControl.js +9 -9
- package/scripts/tui/panels/OutputPanel.js +25 -61
- package/scripts/tui/panels/SessionPanel.js +4 -12
- package/scripts/tui/panels/TracePanel.js +27 -62
- package/scripts/tui/simple-tui.js +390 -0
- package/tools/cli/commands/config.js +0 -1
- package/tools/cli/commands/doctor.js +18 -9
- package/tools/cli/commands/status.js +14 -8
- package/tools/cli/commands/tui.js +59 -0
- package/tools/cli/commands/uninstall.js +4 -2
- package/tools/cli/lib/command-context.js +9 -1
- package/tools/cli/lib/npm-utils.js +2 -1
- package/src/core/commands/tui.md +0 -91
|
@@ -28,7 +28,7 @@ const DEFAULT_BINDINGS = {
|
|
|
28
28
|
session6: { key: '6', description: 'Session 6' },
|
|
29
29
|
session7: { key: '7', description: 'Session 7' },
|
|
30
30
|
session8: { key: '8', description: 'Session 8' },
|
|
31
|
-
session9: { key: '9', description: 'Session 9' }
|
|
31
|
+
session9: { key: '9', description: 'Session 9' },
|
|
32
32
|
};
|
|
33
33
|
|
|
34
34
|
/**
|
|
@@ -104,7 +104,7 @@ class KeyboardHandler extends EventEmitter {
|
|
|
104
104
|
this.keyHistory.push({
|
|
105
105
|
input,
|
|
106
106
|
key,
|
|
107
|
-
timestamp: Date.now()
|
|
107
|
+
timestamp: Date.now(),
|
|
108
108
|
});
|
|
109
109
|
|
|
110
110
|
// Trim history
|
|
@@ -198,10 +198,19 @@ function formatHelp(bindings = DEFAULT_BINDINGS) {
|
|
|
198
198
|
// Group bindings
|
|
199
199
|
const groups = {
|
|
200
200
|
'Loop Control': ['start', 'pause', 'resume'],
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
201
|
+
View: ['trace', 'help'],
|
|
202
|
+
Navigation: ['quit'],
|
|
203
|
+
Sessions: [
|
|
204
|
+
'session1',
|
|
205
|
+
'session2',
|
|
206
|
+
'session3',
|
|
207
|
+
'session4',
|
|
208
|
+
'session5',
|
|
209
|
+
'session6',
|
|
210
|
+
'session7',
|
|
211
|
+
'session8',
|
|
212
|
+
'session9',
|
|
213
|
+
],
|
|
205
214
|
};
|
|
206
215
|
|
|
207
216
|
for (const [groupName, actions] of Object.entries(groups)) {
|
|
@@ -248,5 +257,5 @@ module.exports = {
|
|
|
248
257
|
formatBindings,
|
|
249
258
|
formatHelp,
|
|
250
259
|
getDefaultHandler,
|
|
251
|
-
createKeyHandler
|
|
260
|
+
createKeyHandler,
|
|
252
261
|
};
|
|
@@ -87,7 +87,7 @@ function pause(sessionId = 'default', reason = 'user_request') {
|
|
|
87
87
|
const pauseData = {
|
|
88
88
|
paused_at: new Date().toISOString(),
|
|
89
89
|
reason,
|
|
90
|
-
session_id: sessionId
|
|
90
|
+
session_id: sessionId,
|
|
91
91
|
};
|
|
92
92
|
|
|
93
93
|
fs.writeFileSync(pauseFile, JSON.stringify(pauseData, null, 2));
|
|
@@ -141,7 +141,7 @@ function resume(sessionId = 'default') {
|
|
|
141
141
|
return {
|
|
142
142
|
resumed_at: new Date().toISOString(),
|
|
143
143
|
was_paused: pauseData !== null,
|
|
144
|
-
pause_data: pauseData
|
|
144
|
+
pause_data: pauseData,
|
|
145
145
|
};
|
|
146
146
|
}
|
|
147
147
|
|
|
@@ -158,7 +158,7 @@ function getLoopStatus() {
|
|
|
158
158
|
return {
|
|
159
159
|
active: false,
|
|
160
160
|
paused: false,
|
|
161
|
-
message: 'Loop not active'
|
|
161
|
+
message: 'Loop not active',
|
|
162
162
|
};
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -177,7 +177,7 @@ function getLoopStatus() {
|
|
|
177
177
|
coverageCurrent: loop.coverage_current || 0,
|
|
178
178
|
pausedAt: loop.paused_at,
|
|
179
179
|
pauseReason: loop.pause_reason,
|
|
180
|
-
startedAt: loop.started_at
|
|
180
|
+
startedAt: loop.started_at,
|
|
181
181
|
};
|
|
182
182
|
}
|
|
183
183
|
|
|
@@ -205,7 +205,7 @@ function stopLoop(reason = 'user_request') {
|
|
|
205
205
|
return {
|
|
206
206
|
stopped: true,
|
|
207
207
|
reason,
|
|
208
|
-
stopped_at: new Date().toISOString()
|
|
208
|
+
stopped_at: new Date().toISOString(),
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
211
|
|
|
@@ -276,7 +276,7 @@ class LoopController extends EventEmitter {
|
|
|
276
276
|
if (newStatus.paused) {
|
|
277
277
|
this.emit('paused', {
|
|
278
278
|
pausedAt: newStatus.pausedAt,
|
|
279
|
-
reason: newStatus.pauseReason
|
|
279
|
+
reason: newStatus.pauseReason,
|
|
280
280
|
});
|
|
281
281
|
} else {
|
|
282
282
|
this.emit('resumed');
|
|
@@ -292,14 +292,14 @@ class LoopController extends EventEmitter {
|
|
|
292
292
|
if (this.lastStatus.iteration !== newStatus.iteration) {
|
|
293
293
|
this.emit('iteration', {
|
|
294
294
|
iteration: newStatus.iteration,
|
|
295
|
-
maxIterations: newStatus.maxIterations
|
|
295
|
+
maxIterations: newStatus.maxIterations,
|
|
296
296
|
});
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
if (this.lastStatus.currentStory !== newStatus.currentStory) {
|
|
300
300
|
this.emit('storyChange', {
|
|
301
301
|
previousStory: this.lastStatus.currentStory,
|
|
302
|
-
currentStory: newStatus.currentStory
|
|
302
|
+
currentStory: newStatus.currentStory,
|
|
303
303
|
});
|
|
304
304
|
}
|
|
305
305
|
|
|
@@ -367,5 +367,5 @@ module.exports = {
|
|
|
367
367
|
stopLoop,
|
|
368
368
|
getPauseFilePath,
|
|
369
369
|
LoopController,
|
|
370
|
-
getDefaultController
|
|
370
|
+
getDefaultController,
|
|
371
371
|
};
|
|
@@ -24,7 +24,7 @@ function getAgentColor(agent) {
|
|
|
24
24
|
'agileflow-devops': 'blue',
|
|
25
25
|
'agileflow-database': 'white',
|
|
26
26
|
'agileflow-performance': 'cyan',
|
|
27
|
-
'agileflow-documentation': 'gray'
|
|
27
|
+
'agileflow-documentation': 'gray',
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
// Check for partial matches
|
|
@@ -69,29 +69,15 @@ function OutputRow({ event, showTimestamp = true }) {
|
|
|
69
69
|
Box,
|
|
70
70
|
{ flexDirection: 'row' },
|
|
71
71
|
// Timestamp
|
|
72
|
-
showTimestamp &&
|
|
73
|
-
|
|
74
|
-
{ dimColor: true },
|
|
75
|
-
`[${formatted.timestamp}] `
|
|
76
|
-
),
|
|
72
|
+
showTimestamp &&
|
|
73
|
+
formatted.timestamp &&
|
|
74
|
+
React.createElement(Text, { dimColor: true }, `[${formatted.timestamp}] `),
|
|
77
75
|
// Status indicator
|
|
78
|
-
React.createElement(
|
|
79
|
-
Text,
|
|
80
|
-
{ color: status.color },
|
|
81
|
-
`${status.symbol} `
|
|
82
|
-
),
|
|
76
|
+
React.createElement(Text, { color: status.color }, `${status.symbol} `),
|
|
83
77
|
// Agent name
|
|
84
|
-
React.createElement(
|
|
85
|
-
Text,
|
|
86
|
-
{ color: agentColor, bold: true },
|
|
87
|
-
`[${formatted.agent}] `
|
|
88
|
-
),
|
|
78
|
+
React.createElement(Text, { color: agentColor, bold: true }, `[${formatted.agent}] `),
|
|
89
79
|
// Message
|
|
90
|
-
React.createElement(
|
|
91
|
-
Text,
|
|
92
|
-
null,
|
|
93
|
-
formatted.message
|
|
94
|
-
)
|
|
80
|
+
React.createElement(Text, null, formatted.message)
|
|
95
81
|
);
|
|
96
82
|
}
|
|
97
83
|
|
|
@@ -102,7 +88,7 @@ function OutputPanel({
|
|
|
102
88
|
maxMessages = 100,
|
|
103
89
|
showTimestamp = true,
|
|
104
90
|
logPath = null,
|
|
105
|
-
title = 'AGENT OUTPUT'
|
|
91
|
+
title = 'AGENT OUTPUT',
|
|
106
92
|
}) {
|
|
107
93
|
const [messages, setMessages] = React.useState([]);
|
|
108
94
|
const [isConnected, setIsConnected] = React.useState(false);
|
|
@@ -111,13 +97,15 @@ function OutputPanel({
|
|
|
111
97
|
|
|
112
98
|
React.useEffect(() => {
|
|
113
99
|
// Create event stream
|
|
114
|
-
const options = logPath
|
|
100
|
+
const options = logPath
|
|
101
|
+
? { logPath, emitHistory: true, historyLimit: 10 }
|
|
102
|
+
: { emitHistory: true, historyLimit: 10 };
|
|
115
103
|
const stream = new EventStream(options);
|
|
116
104
|
streamRef.current = stream;
|
|
117
105
|
|
|
118
106
|
// Handle events
|
|
119
|
-
stream.on('event',
|
|
120
|
-
setMessages(
|
|
107
|
+
stream.on('event', event => {
|
|
108
|
+
setMessages(prev => {
|
|
121
109
|
const newMessages = [...prev, event];
|
|
122
110
|
// Limit to maxMessages
|
|
123
111
|
if (newMessages.length > maxMessages) {
|
|
@@ -136,7 +124,7 @@ function OutputPanel({
|
|
|
136
124
|
setIsConnected(false);
|
|
137
125
|
});
|
|
138
126
|
|
|
139
|
-
stream.on('error',
|
|
127
|
+
stream.on('error', err => {
|
|
140
128
|
setError(err.message);
|
|
141
129
|
});
|
|
142
130
|
|
|
@@ -164,37 +152,17 @@ function OutputPanel({
|
|
|
164
152
|
borderStyle: 'single',
|
|
165
153
|
borderColor: isConnected ? 'green' : 'gray',
|
|
166
154
|
padding: 1,
|
|
167
|
-
flexGrow: 1
|
|
155
|
+
flexGrow: 1,
|
|
168
156
|
},
|
|
169
157
|
// Header
|
|
170
158
|
React.createElement(
|
|
171
159
|
Box,
|
|
172
160
|
{ marginBottom: 1 },
|
|
173
|
-
React.createElement(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
)
|
|
178
|
-
React.createElement(
|
|
179
|
-
Text,
|
|
180
|
-
{ dimColor: true },
|
|
181
|
-
` (${messages.length}/${maxMessages})`
|
|
182
|
-
),
|
|
183
|
-
isConnected && React.createElement(
|
|
184
|
-
Text,
|
|
185
|
-
{ color: 'green' },
|
|
186
|
-
' ●'
|
|
187
|
-
),
|
|
188
|
-
!isConnected && !error && React.createElement(
|
|
189
|
-
Text,
|
|
190
|
-
{ color: 'yellow' },
|
|
191
|
-
' ○'
|
|
192
|
-
),
|
|
193
|
-
error && React.createElement(
|
|
194
|
-
Text,
|
|
195
|
-
{ color: 'red' },
|
|
196
|
-
' ✗'
|
|
197
|
-
)
|
|
161
|
+
React.createElement(Text, { bold: true, color: 'cyan' }, title),
|
|
162
|
+
React.createElement(Text, { dimColor: true }, ` (${messages.length}/${maxMessages})`),
|
|
163
|
+
isConnected && React.createElement(Text, { color: 'green' }, ' ●'),
|
|
164
|
+
!isConnected && !error && React.createElement(Text, { color: 'yellow' }, ' ○'),
|
|
165
|
+
error && React.createElement(Text, { color: 'red' }, ' ✗')
|
|
198
166
|
),
|
|
199
167
|
// Messages or placeholder
|
|
200
168
|
messages.length === 0
|
|
@@ -207,7 +175,7 @@ function OutputPanel({
|
|
|
207
175
|
React.createElement(OutputRow, {
|
|
208
176
|
key: `msg-${index}`,
|
|
209
177
|
event,
|
|
210
|
-
showTimestamp
|
|
178
|
+
showTimestamp,
|
|
211
179
|
})
|
|
212
180
|
)
|
|
213
181
|
);
|
|
@@ -225,8 +193,8 @@ function CompactOutput({ maxLines = 5, logPath = null }) {
|
|
|
225
193
|
const stream = new EventStream(options);
|
|
226
194
|
streamRef.current = stream;
|
|
227
195
|
|
|
228
|
-
stream.on('event',
|
|
229
|
-
setMessages(
|
|
196
|
+
stream.on('event', event => {
|
|
197
|
+
setMessages(prev => {
|
|
230
198
|
const newMessages = [...prev, event];
|
|
231
199
|
return newMessages.slice(-maxLines);
|
|
232
200
|
});
|
|
@@ -242,11 +210,7 @@ function CompactOutput({ maxLines = 5, logPath = null }) {
|
|
|
242
210
|
}, [logPath, maxLines]);
|
|
243
211
|
|
|
244
212
|
if (messages.length === 0) {
|
|
245
|
-
return React.createElement(
|
|
246
|
-
Text,
|
|
247
|
-
{ dimColor: true },
|
|
248
|
-
'No recent activity'
|
|
249
|
-
);
|
|
213
|
+
return React.createElement(Text, { dimColor: true }, 'No recent activity');
|
|
250
214
|
}
|
|
251
215
|
|
|
252
216
|
return React.createElement(
|
|
@@ -274,5 +238,5 @@ module.exports = {
|
|
|
274
238
|
OutputRow,
|
|
275
239
|
CompactOutput,
|
|
276
240
|
getAgentColor,
|
|
277
|
-
getStatusIndicator
|
|
241
|
+
getStatusIndicator,
|
|
278
242
|
};
|
|
@@ -25,7 +25,7 @@ function getThreadColor(threadType) {
|
|
|
25
25
|
chained: 'yellow',
|
|
26
26
|
fusion: 'magenta',
|
|
27
27
|
big: 'blue',
|
|
28
|
-
long: 'white'
|
|
28
|
+
long: 'white',
|
|
29
29
|
};
|
|
30
30
|
return colors[threadType] || 'gray';
|
|
31
31
|
}
|
|
@@ -56,7 +56,7 @@ function formatSession(session) {
|
|
|
56
56
|
story: story || 'none',
|
|
57
57
|
threadType: thread_type || 'base',
|
|
58
58
|
active,
|
|
59
|
-
current
|
|
59
|
+
current,
|
|
60
60
|
};
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -135,16 +135,8 @@ function SessionPanel({ refreshInterval = 5000 }) {
|
|
|
135
135
|
return React.createElement(
|
|
136
136
|
Box,
|
|
137
137
|
{ flexDirection: 'column', borderStyle: 'single', borderColor: 'gray', padding: 1 },
|
|
138
|
-
React.createElement(
|
|
139
|
-
|
|
140
|
-
{ bold: true, color: 'cyan' },
|
|
141
|
-
'SESSIONS'
|
|
142
|
-
),
|
|
143
|
-
React.createElement(
|
|
144
|
-
Text,
|
|
145
|
-
{ dimColor: true, italic: true },
|
|
146
|
-
'No active sessions'
|
|
147
|
-
)
|
|
138
|
+
React.createElement(Text, { bold: true, color: 'cyan' }, 'SESSIONS'),
|
|
139
|
+
React.createElement(Text, { dimColor: true, italic: true }, 'No active sessions')
|
|
148
140
|
);
|
|
149
141
|
}
|
|
150
142
|
|
|
@@ -22,7 +22,7 @@ const QUALITY_GATES = {
|
|
|
22
22
|
coverage: { name: 'Coverage', color: 'magenta', icon: '%' },
|
|
23
23
|
lint: { name: 'Lint', color: 'yellow', icon: '◆' },
|
|
24
24
|
types: { name: 'Types', color: 'blue', icon: '⬡' },
|
|
25
|
-
visual: { name: 'Visual', color: 'cyan', icon: '◉' }
|
|
25
|
+
visual: { name: 'Visual', color: 'cyan', icon: '◉' },
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
/**
|
|
@@ -111,26 +111,10 @@ function GateRow({ gate, status, value }) {
|
|
|
111
111
|
return React.createElement(
|
|
112
112
|
Box,
|
|
113
113
|
{ flexDirection: 'row', marginLeft: 2 },
|
|
114
|
-
React.createElement(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
),
|
|
119
|
-
React.createElement(
|
|
120
|
-
Text,
|
|
121
|
-
{ color: statusColor },
|
|
122
|
-
`${statusSymbol} `
|
|
123
|
-
),
|
|
124
|
-
React.createElement(
|
|
125
|
-
Text,
|
|
126
|
-
null,
|
|
127
|
-
`${gateConfig.name}`
|
|
128
|
-
),
|
|
129
|
-
value !== undefined && React.createElement(
|
|
130
|
-
Text,
|
|
131
|
-
{ dimColor: true },
|
|
132
|
-
`: ${value}`
|
|
133
|
-
)
|
|
114
|
+
React.createElement(Text, { color: gateConfig.color }, `${gateConfig.icon} `),
|
|
115
|
+
React.createElement(Text, { color: statusColor }, `${statusSymbol} `),
|
|
116
|
+
React.createElement(Text, null, `${gateConfig.name}`),
|
|
117
|
+
value !== undefined && React.createElement(Text, { dimColor: true }, `: ${value}`)
|
|
134
118
|
);
|
|
135
119
|
}
|
|
136
120
|
|
|
@@ -139,11 +123,7 @@ function GateRow({ gate, status, value }) {
|
|
|
139
123
|
*/
|
|
140
124
|
function LoopTrace({ loopStatus }) {
|
|
141
125
|
if (!loopStatus || !loopStatus.active) {
|
|
142
|
-
return React.createElement(
|
|
143
|
-
Text,
|
|
144
|
-
{ dimColor: true, italic: true },
|
|
145
|
-
'No active loop'
|
|
146
|
-
);
|
|
126
|
+
return React.createElement(Text, { dimColor: true, italic: true }, 'No active loop');
|
|
147
127
|
}
|
|
148
128
|
|
|
149
129
|
const {
|
|
@@ -155,7 +135,7 @@ function LoopTrace({ loopStatus }) {
|
|
|
155
135
|
coverageMode,
|
|
156
136
|
coverageThreshold,
|
|
157
137
|
coverageCurrent,
|
|
158
|
-
visualMode
|
|
138
|
+
visualMode,
|
|
159
139
|
} = loopStatus;
|
|
160
140
|
|
|
161
141
|
// Build gates list
|
|
@@ -165,7 +145,7 @@ function LoopTrace({ loopStatus }) {
|
|
|
165
145
|
gates.push({
|
|
166
146
|
gate: 'tests',
|
|
167
147
|
status: 'running',
|
|
168
|
-
value: null
|
|
148
|
+
value: null,
|
|
169
149
|
});
|
|
170
150
|
|
|
171
151
|
// Coverage if enabled
|
|
@@ -173,7 +153,7 @@ function LoopTrace({ loopStatus }) {
|
|
|
173
153
|
gates.push({
|
|
174
154
|
gate: 'coverage',
|
|
175
155
|
status: coverageCurrent >= coverageThreshold ? 'passed' : 'running',
|
|
176
|
-
value: `${coverageCurrent?.toFixed(1) || 0}% / ${coverageThreshold}
|
|
156
|
+
value: `${coverageCurrent?.toFixed(1) || 0}% / ${coverageThreshold}%`,
|
|
177
157
|
});
|
|
178
158
|
}
|
|
179
159
|
|
|
@@ -182,7 +162,7 @@ function LoopTrace({ loopStatus }) {
|
|
|
182
162
|
gates.push({
|
|
183
163
|
gate: 'visual',
|
|
184
164
|
status: 'pending',
|
|
185
|
-
value: null
|
|
165
|
+
value: null,
|
|
186
166
|
});
|
|
187
167
|
}
|
|
188
168
|
|
|
@@ -212,30 +192,27 @@ function LoopTrace({ loopStatus }) {
|
|
|
212
192
|
Box,
|
|
213
193
|
{ flexDirection: 'row', marginY: 1 },
|
|
214
194
|
React.createElement(Text, { dimColor: true }, 'Iteration: '),
|
|
215
|
-
React.createElement(
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
195
|
+
React.createElement(ProgressBar, {
|
|
196
|
+
value: iteration || 0,
|
|
197
|
+
max: maxIterations || 20,
|
|
198
|
+
width: 15,
|
|
199
|
+
}),
|
|
219
200
|
React.createElement(Text, { dimColor: true }, ` ${iteration || 0}/${maxIterations || 20}`)
|
|
220
201
|
),
|
|
221
202
|
// Coverage progress (if enabled)
|
|
222
|
-
coverageMode &&
|
|
223
|
-
Box,
|
|
224
|
-
{ flexDirection: 'row', marginBottom: 1 },
|
|
225
|
-
React.createElement(Text, { dimColor: true }, 'Coverage: '),
|
|
203
|
+
coverageMode &&
|
|
226
204
|
React.createElement(
|
|
227
|
-
|
|
228
|
-
{
|
|
229
|
-
|
|
230
|
-
|
|
205
|
+
Box,
|
|
206
|
+
{ flexDirection: 'row', marginBottom: 1 },
|
|
207
|
+
React.createElement(Text, { dimColor: true }, 'Coverage: '),
|
|
208
|
+
React.createElement(ProgressBar, { value: coverageCurrent || 0, max: 100, width: 15 })
|
|
209
|
+
),
|
|
231
210
|
// Quality gates
|
|
232
211
|
React.createElement(
|
|
233
212
|
Box,
|
|
234
213
|
{ flexDirection: 'column', marginTop: 1 },
|
|
235
214
|
React.createElement(Text, { dimColor: true }, 'Quality Gates:'),
|
|
236
|
-
gates.map((g, i) =>
|
|
237
|
-
React.createElement(GateRow, { key: `gate-${i}`, ...g })
|
|
238
|
-
)
|
|
215
|
+
gates.map((g, i) => React.createElement(GateRow, { key: `gate-${i}`, ...g }))
|
|
239
216
|
)
|
|
240
217
|
);
|
|
241
218
|
}
|
|
@@ -274,22 +251,14 @@ function TracePanel({ visible = true, refreshInterval = 2000 }) {
|
|
|
274
251
|
flexDirection: 'column',
|
|
275
252
|
borderStyle: 'single',
|
|
276
253
|
borderColor: 'blue',
|
|
277
|
-
padding: 1
|
|
254
|
+
padding: 1,
|
|
278
255
|
},
|
|
279
256
|
// Header
|
|
280
257
|
React.createElement(
|
|
281
258
|
Box,
|
|
282
259
|
{ marginBottom: 1 },
|
|
283
|
-
React.createElement(
|
|
284
|
-
|
|
285
|
-
{ bold: true, color: 'blue' },
|
|
286
|
-
'AGENT TRACE'
|
|
287
|
-
),
|
|
288
|
-
React.createElement(
|
|
289
|
-
Text,
|
|
290
|
-
{ dimColor: true },
|
|
291
|
-
' (T to toggle)'
|
|
292
|
-
)
|
|
260
|
+
React.createElement(Text, { bold: true, color: 'blue' }, 'AGENT TRACE'),
|
|
261
|
+
React.createElement(Text, { dimColor: true }, ' (T to toggle)')
|
|
293
262
|
),
|
|
294
263
|
// Loop trace
|
|
295
264
|
React.createElement(LoopTrace, { loopStatus })
|
|
@@ -301,11 +270,7 @@ function TracePanel({ visible = true, refreshInterval = 2000 }) {
|
|
|
301
270
|
*/
|
|
302
271
|
function CompactTrace({ loopStatus }) {
|
|
303
272
|
if (!loopStatus || !loopStatus.active) {
|
|
304
|
-
return React.createElement(
|
|
305
|
-
Text,
|
|
306
|
-
{ dimColor: true },
|
|
307
|
-
'Loop: inactive'
|
|
308
|
-
);
|
|
273
|
+
return React.createElement(Text, { dimColor: true }, 'Loop: inactive');
|
|
309
274
|
}
|
|
310
275
|
|
|
311
276
|
const { iteration, maxIterations, paused, currentStory } = loopStatus;
|
|
@@ -329,5 +294,5 @@ module.exports = {
|
|
|
329
294
|
CompactTrace,
|
|
330
295
|
getStatusColor,
|
|
331
296
|
getStatusSymbol,
|
|
332
|
-
QUALITY_GATES
|
|
297
|
+
QUALITY_GATES,
|
|
333
298
|
};
|