@positronic/cli 0.0.54 → 0.0.56
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/dist/src/cli.js +12 -2
- package/dist/src/commands/brain.js +3 -2
- package/dist/src/components/events-view.js +183 -0
- package/dist/src/components/watch-resolver.js +3 -2
- package/dist/src/components/watch.js +51 -10
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/commands/brain.d.ts +2 -1
- package/dist/types/commands/brain.d.ts.map +1 -1
- package/dist/types/components/events-view.d.ts +11 -0
- package/dist/types/components/events-view.d.ts.map +1 -0
- package/dist/types/components/watch-resolver.d.ts +2 -1
- package/dist/types/components/watch-resolver.d.ts.map +1 -1
- package/dist/types/components/watch.d.ts +2 -1
- package/dist/types/components/watch.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/src/cli.js
CHANGED
|
@@ -451,7 +451,12 @@ export function buildCli(options) {
|
|
|
451
451
|
describe: 'Brain name or run ID to watch',
|
|
452
452
|
type: 'string',
|
|
453
453
|
demandOption: true
|
|
454
|
-
}).
|
|
454
|
+
}).option('events', {
|
|
455
|
+
describe: 'Start in events view instead of progress view',
|
|
456
|
+
type: 'boolean',
|
|
457
|
+
alias: 'e',
|
|
458
|
+
default: false
|
|
459
|
+
}).example('$0 watch my-brain', "Watch the latest run of the brain named 'my-brain'").example('$0 watch abc123def', 'Watch a specific brain run by its ID').example('$0 watch my-brain --events', 'Watch with events log view');
|
|
455
460
|
}, function(argv) {
|
|
456
461
|
var element = brainCommand.watch(argv);
|
|
457
462
|
render(element);
|
|
@@ -548,7 +553,12 @@ export function buildCli(options) {
|
|
|
548
553
|
describe: 'Brain name or run ID to watch',
|
|
549
554
|
type: 'string',
|
|
550
555
|
demandOption: true
|
|
551
|
-
}).
|
|
556
|
+
}).option('events', {
|
|
557
|
+
describe: 'Start in events view instead of progress view',
|
|
558
|
+
type: 'boolean',
|
|
559
|
+
alias: 'e',
|
|
560
|
+
default: false
|
|
561
|
+
}).example('$0 brain watch my-brain', "Watch the latest run of the brain named 'my-brain'").example('$0 brain watch abc123def', 'Watch a specific brain run by its ID').example('$0 brain watch my-brain --events', 'Watch with events log view');
|
|
552
562
|
}, function(argv) {
|
|
553
563
|
var element = brainCommand.watch(argv);
|
|
554
564
|
render(element);
|
|
@@ -114,9 +114,10 @@ export var BrainCommand = /*#__PURE__*/ function() {
|
|
|
114
114
|
{
|
|
115
115
|
key: "watch",
|
|
116
116
|
value: function watch(param) {
|
|
117
|
-
var identifier = param.identifier;
|
|
117
|
+
var identifier = param.identifier, events = param.events;
|
|
118
118
|
return React.createElement(WatchResolver, {
|
|
119
|
-
identifier: identifier
|
|
119
|
+
identifier: identifier,
|
|
120
|
+
startWithEvents: events
|
|
120
121
|
});
|
|
121
122
|
}
|
|
122
123
|
},
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Text, Box, useStdout } from 'ink';
|
|
3
|
+
import { BRAIN_EVENTS } from '@positronic/core';
|
|
4
|
+
// Format relative timestamp
|
|
5
|
+
function formatTimestamp(timestamp) {
|
|
6
|
+
var now = Date.now();
|
|
7
|
+
var diff = now - timestamp.getTime();
|
|
8
|
+
var seconds = Math.floor(diff / 1000);
|
|
9
|
+
if (seconds < 60) {
|
|
10
|
+
return "".concat(seconds, "s ago");
|
|
11
|
+
}
|
|
12
|
+
var minutes = Math.floor(seconds / 60);
|
|
13
|
+
if (minutes < 60) {
|
|
14
|
+
var secs = seconds % 60;
|
|
15
|
+
return secs > 0 ? "".concat(minutes, "m ").concat(secs, "s ago") : "".concat(minutes, "m ago");
|
|
16
|
+
}
|
|
17
|
+
var hours = Math.floor(minutes / 60);
|
|
18
|
+
var mins = minutes % 60;
|
|
19
|
+
return mins > 0 ? "".concat(hours, "h ").concat(mins, "m ago") : "".concat(hours, "h ago");
|
|
20
|
+
}
|
|
21
|
+
// Truncate text to a max length
|
|
22
|
+
function truncate(text, maxLength) {
|
|
23
|
+
if (text.length <= maxLength) return text;
|
|
24
|
+
return text.slice(0, maxLength - 3) + '...';
|
|
25
|
+
}
|
|
26
|
+
// Format event for display
|
|
27
|
+
function formatEvent(event) {
|
|
28
|
+
switch(event.type){
|
|
29
|
+
case BRAIN_EVENTS.START:
|
|
30
|
+
return {
|
|
31
|
+
symbol: '[>]',
|
|
32
|
+
text: 'Brain started: "'.concat(event.brainTitle, '"'),
|
|
33
|
+
color: 'yellow'
|
|
34
|
+
};
|
|
35
|
+
case BRAIN_EVENTS.RESTART:
|
|
36
|
+
return {
|
|
37
|
+
symbol: '[>>]',
|
|
38
|
+
text: 'Brain restarted: "'.concat(event.brainTitle, '"'),
|
|
39
|
+
color: 'yellow'
|
|
40
|
+
};
|
|
41
|
+
case BRAIN_EVENTS.COMPLETE:
|
|
42
|
+
return {
|
|
43
|
+
symbol: '[ok]',
|
|
44
|
+
text: 'Brain completed: "'.concat(event.brainTitle, '"'),
|
|
45
|
+
color: 'green'
|
|
46
|
+
};
|
|
47
|
+
case BRAIN_EVENTS.ERROR:
|
|
48
|
+
return {
|
|
49
|
+
symbol: '[!!]',
|
|
50
|
+
text: "Error: ".concat(event.error.message),
|
|
51
|
+
color: 'red'
|
|
52
|
+
};
|
|
53
|
+
case BRAIN_EVENTS.CANCELLED:
|
|
54
|
+
return {
|
|
55
|
+
symbol: '[x]',
|
|
56
|
+
text: 'Brain cancelled: "'.concat(event.brainTitle, '"'),
|
|
57
|
+
color: 'red'
|
|
58
|
+
};
|
|
59
|
+
case BRAIN_EVENTS.STEP_START:
|
|
60
|
+
return {
|
|
61
|
+
symbol: '[.]',
|
|
62
|
+
text: 'Step started: "'.concat(event.stepTitle, '"'),
|
|
63
|
+
color: 'yellow'
|
|
64
|
+
};
|
|
65
|
+
case BRAIN_EVENTS.STEP_COMPLETE:
|
|
66
|
+
return {
|
|
67
|
+
symbol: '[+]',
|
|
68
|
+
text: 'Step completed: "'.concat(event.stepTitle, '"'),
|
|
69
|
+
color: 'green'
|
|
70
|
+
};
|
|
71
|
+
case BRAIN_EVENTS.STEP_RETRY:
|
|
72
|
+
return {
|
|
73
|
+
symbol: '[?]',
|
|
74
|
+
text: 'Step retry: "'.concat(event.stepTitle, '" (attempt ').concat(event.attempt, ")"),
|
|
75
|
+
color: 'yellow'
|
|
76
|
+
};
|
|
77
|
+
case BRAIN_EVENTS.STEP_STATUS:
|
|
78
|
+
return {
|
|
79
|
+
symbol: '[-]',
|
|
80
|
+
text: "Step status update (".concat(event.steps.length, " steps)"),
|
|
81
|
+
color: 'gray'
|
|
82
|
+
};
|
|
83
|
+
case BRAIN_EVENTS.WEBHOOK:
|
|
84
|
+
return {
|
|
85
|
+
symbol: '[~]',
|
|
86
|
+
text: "Waiting for webhook",
|
|
87
|
+
color: 'cyan'
|
|
88
|
+
};
|
|
89
|
+
case BRAIN_EVENTS.WEBHOOK_RESPONSE:
|
|
90
|
+
return {
|
|
91
|
+
symbol: '[<]',
|
|
92
|
+
text: "Webhook response received",
|
|
93
|
+
color: 'cyan'
|
|
94
|
+
};
|
|
95
|
+
case BRAIN_EVENTS.AGENT_START:
|
|
96
|
+
return {
|
|
97
|
+
symbol: '[A]',
|
|
98
|
+
text: 'Agent started: "'.concat(event.stepTitle, '"'),
|
|
99
|
+
color: 'yellow'
|
|
100
|
+
};
|
|
101
|
+
case BRAIN_EVENTS.AGENT_ITERATION:
|
|
102
|
+
return {
|
|
103
|
+
symbol: '[#]',
|
|
104
|
+
text: "Agent iteration ".concat(event.iteration),
|
|
105
|
+
color: 'gray'
|
|
106
|
+
};
|
|
107
|
+
case BRAIN_EVENTS.AGENT_TOOL_CALL:
|
|
108
|
+
return {
|
|
109
|
+
symbol: '[T]',
|
|
110
|
+
text: "Tool call: ".concat(event.toolName),
|
|
111
|
+
color: 'white'
|
|
112
|
+
};
|
|
113
|
+
case BRAIN_EVENTS.AGENT_TOOL_RESULT:
|
|
114
|
+
return {
|
|
115
|
+
symbol: '[R]',
|
|
116
|
+
text: "Tool result: ".concat(event.toolName),
|
|
117
|
+
color: 'white'
|
|
118
|
+
};
|
|
119
|
+
case BRAIN_EVENTS.AGENT_ASSISTANT_MESSAGE:
|
|
120
|
+
return {
|
|
121
|
+
symbol: '[M]',
|
|
122
|
+
text: "Assistant: ".concat(truncate(event.content, 50)),
|
|
123
|
+
color: 'white'
|
|
124
|
+
};
|
|
125
|
+
case BRAIN_EVENTS.AGENT_COMPLETE:
|
|
126
|
+
return {
|
|
127
|
+
symbol: '[A]',
|
|
128
|
+
text: 'Agent completed: "'.concat(event.terminalToolName, '" (').concat(event.totalIterations, " iterations)"),
|
|
129
|
+
color: 'green'
|
|
130
|
+
};
|
|
131
|
+
case BRAIN_EVENTS.AGENT_TOKEN_LIMIT:
|
|
132
|
+
return {
|
|
133
|
+
symbol: '[!]',
|
|
134
|
+
text: "Token limit reached: ".concat(event.totalTokens, "/").concat(event.maxTokens),
|
|
135
|
+
color: 'red'
|
|
136
|
+
};
|
|
137
|
+
case BRAIN_EVENTS.AGENT_WEBHOOK:
|
|
138
|
+
return {
|
|
139
|
+
symbol: '[W]',
|
|
140
|
+
text: "Agent webhook: ".concat(event.toolName),
|
|
141
|
+
color: 'cyan'
|
|
142
|
+
};
|
|
143
|
+
default:
|
|
144
|
+
return {
|
|
145
|
+
symbol: '[?]',
|
|
146
|
+
text: "Unknown event: ".concat(event.type),
|
|
147
|
+
color: 'gray'
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
var EventLine = function(param) {
|
|
152
|
+
var stored = param.stored;
|
|
153
|
+
var _formatEvent = formatEvent(stored.event), symbol = _formatEvent.symbol, text = _formatEvent.text, color = _formatEvent.color;
|
|
154
|
+
var timestamp = formatTimestamp(stored.timestamp);
|
|
155
|
+
return /*#__PURE__*/ React.createElement(Box, null, /*#__PURE__*/ React.createElement(Text, {
|
|
156
|
+
dimColor: true
|
|
157
|
+
}, timestamp.padEnd(12), " "), /*#__PURE__*/ React.createElement(Text, {
|
|
158
|
+
color: color
|
|
159
|
+
}, symbol, " "), /*#__PURE__*/ React.createElement(Text, null, text));
|
|
160
|
+
};
|
|
161
|
+
export var EventsView = function(param) {
|
|
162
|
+
var events = param.events;
|
|
163
|
+
var stdout = useStdout().stdout;
|
|
164
|
+
var terminalHeight = (stdout === null || stdout === void 0 ? void 0 : stdout.rows) || 24;
|
|
165
|
+
// Reserve lines for header, footer, margins
|
|
166
|
+
var maxVisible = Math.max(5, terminalHeight - 6);
|
|
167
|
+
// Show most recent events at bottom (scrolling up)
|
|
168
|
+
var visibleEvents = events.slice(-maxVisible);
|
|
169
|
+
return /*#__PURE__*/ React.createElement(Box, {
|
|
170
|
+
flexDirection: "column"
|
|
171
|
+
}, /*#__PURE__*/ React.createElement(Box, {
|
|
172
|
+
marginBottom: 1
|
|
173
|
+
}, /*#__PURE__*/ React.createElement(Text, {
|
|
174
|
+
bold: true
|
|
175
|
+
}, "Events (", events.length, " total)")), visibleEvents.length === 0 ? /*#__PURE__*/ React.createElement(Text, {
|
|
176
|
+
dimColor: true
|
|
177
|
+
}, "Waiting for events...") : visibleEvents.map(function(stored, index) {
|
|
178
|
+
return /*#__PURE__*/ React.createElement(EventLine, {
|
|
179
|
+
key: index,
|
|
180
|
+
stored: stored
|
|
181
|
+
});
|
|
182
|
+
}));
|
|
183
|
+
};
|
|
@@ -521,7 +521,7 @@ var createResolverMachine = function(identifier) {
|
|
|
521
521
|
* 2. If no brain matches, try as a run ID
|
|
522
522
|
* 3. If neither works, show an error
|
|
523
523
|
*/ export var WatchResolver = function(param) {
|
|
524
|
-
var identifier = param.identifier;
|
|
524
|
+
var identifier = param.identifier, startWithEvents = param.startWithEvents;
|
|
525
525
|
var machine = useMemo(function() {
|
|
526
526
|
return createResolverMachine(identifier);
|
|
527
527
|
}, [
|
|
@@ -584,7 +584,8 @@ var createResolverMachine = function(identifier) {
|
|
|
584
584
|
}) : null;
|
|
585
585
|
case 'resolved':
|
|
586
586
|
return resolvedRunId ? /*#__PURE__*/ React.createElement(Watch, {
|
|
587
|
-
runId: resolvedRunId
|
|
587
|
+
runId: resolvedRunId,
|
|
588
|
+
startWithEvents: startWithEvents
|
|
588
589
|
}) : null;
|
|
589
590
|
default:
|
|
590
591
|
return null;
|
|
@@ -6,6 +6,9 @@ function _array_like_to_array(arr, len) {
|
|
|
6
6
|
function _array_with_holes(arr) {
|
|
7
7
|
if (Array.isArray(arr)) return arr;
|
|
8
8
|
}
|
|
9
|
+
function _array_without_holes(arr) {
|
|
10
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
11
|
+
}
|
|
9
12
|
function _define_property(obj, key, value) {
|
|
10
13
|
if (key in obj) {
|
|
11
14
|
Object.defineProperty(obj, key, {
|
|
@@ -19,6 +22,9 @@ function _define_property(obj, key, value) {
|
|
|
19
22
|
}
|
|
20
23
|
return obj;
|
|
21
24
|
}
|
|
25
|
+
function _iterable_to_array(iter) {
|
|
26
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
|
|
27
|
+
}
|
|
22
28
|
function _iterable_to_array_limit(arr, i) {
|
|
23
29
|
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
24
30
|
if (_i == null) return;
|
|
@@ -46,6 +52,9 @@ function _iterable_to_array_limit(arr, i) {
|
|
|
46
52
|
function _non_iterable_rest() {
|
|
47
53
|
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
48
54
|
}
|
|
55
|
+
function _non_iterable_spread() {
|
|
56
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
57
|
+
}
|
|
49
58
|
function _object_spread(target) {
|
|
50
59
|
for(var i = 1; i < arguments.length; i++){
|
|
51
60
|
var source = arguments[i] != null ? arguments[i] : {};
|
|
@@ -64,6 +73,9 @@ function _object_spread(target) {
|
|
|
64
73
|
function _sliced_to_array(arr, i) {
|
|
65
74
|
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
66
75
|
}
|
|
76
|
+
function _to_consumable_array(arr) {
|
|
77
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
78
|
+
}
|
|
67
79
|
function _unsupported_iterable_to_array(o, minLen) {
|
|
68
80
|
if (!o) return;
|
|
69
81
|
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
@@ -80,6 +92,7 @@ import { useBrainMachine } from '../hooks/useBrainMachine.js';
|
|
|
80
92
|
import { getApiBaseUrl, isApiLocalDevMode } from '../commands/helpers.js';
|
|
81
93
|
import { useApiDelete } from '../hooks/useApi.js';
|
|
82
94
|
import { ErrorComponent } from './error.js';
|
|
95
|
+
import { EventsView } from './events-view.js';
|
|
83
96
|
// Get the index of the currently running step (or last completed if none running)
|
|
84
97
|
var getCurrentStepIndex = function(steps) {
|
|
85
98
|
var runningIndex = steps.findIndex(function(s) {
|
|
@@ -200,9 +213,12 @@ var BrainSection = function(param) {
|
|
|
200
213
|
})));
|
|
201
214
|
};
|
|
202
215
|
export var Watch = function(param) {
|
|
203
|
-
var runId = param.runId, _param_manageScreenBuffer = param.manageScreenBuffer, manageScreenBuffer = _param_manageScreenBuffer === void 0 ? true : _param_manageScreenBuffer,
|
|
216
|
+
var runId = param.runId, _param_manageScreenBuffer = param.manageScreenBuffer, manageScreenBuffer = _param_manageScreenBuffer === void 0 ? true : _param_manageScreenBuffer, footer = param.footer, _param_startWithEvents = param.startWithEvents, startWithEvents = _param_startWithEvents === void 0 ? false : _param_startWithEvents;
|
|
204
217
|
var write = useStdout().write;
|
|
205
218
|
var exit = useApp().exit;
|
|
219
|
+
// View mode state (progress view vs events log)
|
|
220
|
+
var _useState = _sliced_to_array(useState(startWithEvents ? 'events' : 'progress'), 2), viewMode = _useState[0], setViewMode = _useState[1];
|
|
221
|
+
var _useState1 = _sliced_to_array(useState([]), 2), events = _useState1[0], setEvents = _useState1[1];
|
|
206
222
|
// Use state machine to track brain execution state
|
|
207
223
|
// Machine is recreated when runId changes, giving us fresh context
|
|
208
224
|
var _useBrainMachine = _sliced_to_array(useBrainMachine(runId), 2), current = _useBrainMachine[0], send = _useBrainMachine[1];
|
|
@@ -218,13 +234,13 @@ export var Watch = function(param) {
|
|
|
218
234
|
// Read brain state directly from machine context - useMachine handles re-renders
|
|
219
235
|
var _current_context = current.context, rootBrain = _current_context.rootBrain, isComplete = _current_context.isComplete;
|
|
220
236
|
// Additional state for connection and errors (not part of the brain state machine)
|
|
221
|
-
var
|
|
222
|
-
var
|
|
223
|
-
var
|
|
237
|
+
var _useState2 = _sliced_to_array(useState(undefined), 2), brainError = _useState2[0], setBrainError = _useState2[1];
|
|
238
|
+
var _useState3 = _sliced_to_array(useState(null), 2), connectionError = _useState3[0], setConnectionError = _useState3[1];
|
|
239
|
+
var _useState4 = _sliced_to_array(useState(false), 2), isConnected = _useState4[0], setIsConnected = _useState4[1];
|
|
224
240
|
// Kill state
|
|
225
|
-
var
|
|
226
|
-
var
|
|
227
|
-
var
|
|
241
|
+
var _useState5 = _sliced_to_array(useState(false), 2), confirmingKill = _useState5[0], setConfirmingKill = _useState5[1];
|
|
242
|
+
var _useState6 = _sliced_to_array(useState(false), 2), isKilling = _useState6[0], setIsKilling = _useState6[1];
|
|
243
|
+
var _useState7 = _sliced_to_array(useState(false), 2), isKilled = _useState7[0], setIsKilled = _useState7[1];
|
|
228
244
|
var _useApiDelete = useApiDelete('brain'), killBrain = _useApiDelete.execute, killError = _useApiDelete.error;
|
|
229
245
|
// Enter alternate screen buffer on mount, exit on unmount
|
|
230
246
|
// Skip in test environment or when parent manages screen buffer
|
|
@@ -258,6 +274,16 @@ export var Watch = function(param) {
|
|
|
258
274
|
es.onmessage = function(event) {
|
|
259
275
|
try {
|
|
260
276
|
var eventData = JSON.parse(event.data);
|
|
277
|
+
// Store event for events view (keep last 500 events to prevent memory issues)
|
|
278
|
+
setEvents(function(prev) {
|
|
279
|
+
var newEvents = _to_consumable_array(prev).concat([
|
|
280
|
+
{
|
|
281
|
+
timestamp: new Date(),
|
|
282
|
+
event: eventData
|
|
283
|
+
}
|
|
284
|
+
]);
|
|
285
|
+
return newEvents.slice(-500);
|
|
286
|
+
});
|
|
261
287
|
// Send event to state machine - useMachine handles re-renders automatically
|
|
262
288
|
// Use ref to ensure we always call the latest send function
|
|
263
289
|
sendRef.current(eventData);
|
|
@@ -296,7 +322,12 @@ export var Watch = function(param) {
|
|
|
296
322
|
setConfirmingKill(false);
|
|
297
323
|
}
|
|
298
324
|
} else {
|
|
299
|
-
|
|
325
|
+
// View toggle
|
|
326
|
+
if (input === 'e') {
|
|
327
|
+
setViewMode('events');
|
|
328
|
+
} else if (input === 'w') {
|
|
329
|
+
setViewMode('progress');
|
|
330
|
+
} else if (input === 'x' && !isKilling && !isKilled && !isComplete) {
|
|
300
331
|
setConfirmingKill(true);
|
|
301
332
|
} else if ((input === 'q' || key.escape) && manageScreenBuffer) {
|
|
302
333
|
// Only handle quit when standalone (manageScreenBuffer=true)
|
|
@@ -320,9 +351,19 @@ export var Watch = function(param) {
|
|
|
320
351
|
message: killError.message,
|
|
321
352
|
details: killError.details
|
|
322
353
|
} : null;
|
|
354
|
+
// Dynamic footer showing view toggle hint
|
|
355
|
+
var viewToggle = viewMode === 'progress' ? 'e events' : 'w progress';
|
|
356
|
+
var defaultFooter = "".concat(viewToggle, " | x kill | esc quit");
|
|
357
|
+
var displayFooter = footer !== null && footer !== void 0 ? footer : defaultFooter;
|
|
323
358
|
return /*#__PURE__*/ React.createElement(Box, {
|
|
324
359
|
flexDirection: "column"
|
|
325
|
-
}, !isConnected && !rootBrain ? /*#__PURE__*/ React.createElement(Text, null, "Connecting to watch service...") :
|
|
360
|
+
}, !isConnected && !rootBrain ? /*#__PURE__*/ React.createElement(Text, null, "Connecting to watch service...") : viewMode === 'events' ? /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(EventsView, {
|
|
361
|
+
events: events
|
|
362
|
+
}), connectionErrorProps && /*#__PURE__*/ React.createElement(ErrorComponent, {
|
|
363
|
+
error: connectionErrorProps
|
|
364
|
+
}), brainErrorProps && /*#__PURE__*/ React.createElement(ErrorComponent, {
|
|
365
|
+
error: brainErrorProps
|
|
366
|
+
})) : !rootBrain ? /*#__PURE__*/ React.createElement(Text, null, "Waiting for brain to start...") : /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(BrainSection, {
|
|
326
367
|
brain: rootBrain
|
|
327
368
|
}), confirmingKill && /*#__PURE__*/ React.createElement(Box, {
|
|
328
369
|
marginTop: 1
|
|
@@ -356,5 +397,5 @@ export var Watch = function(param) {
|
|
|
356
397
|
marginTop: 1
|
|
357
398
|
}, /*#__PURE__*/ React.createElement(Text, {
|
|
358
399
|
dimColor: true
|
|
359
|
-
},
|
|
400
|
+
}, displayFooter)));
|
|
360
401
|
};
|
package/dist/types/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAK5D,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC;CAC9C;AAoBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAK5D,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,KAAK,GAAG,CAAC;CAC9C;AAoBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,4BA8nC3C"}
|
|
@@ -24,6 +24,7 @@ interface BrainRunArgs {
|
|
|
24
24
|
}
|
|
25
25
|
interface BrainWatchArgs {
|
|
26
26
|
identifier: string;
|
|
27
|
+
events?: boolean;
|
|
27
28
|
}
|
|
28
29
|
interface BrainKillArgs {
|
|
29
30
|
runId: string;
|
|
@@ -38,7 +39,7 @@ export declare class BrainCommand {
|
|
|
38
39
|
show({ brain, runId, steps, }: ArgumentsCamelCase<BrainShowArgs>): React.ReactElement;
|
|
39
40
|
rerun({ brain, runId, startsAt, stopsAfter, }: ArgumentsCamelCase<BrainRerunArgs>): React.ReactElement;
|
|
40
41
|
run({ brain, watch, options }: ArgumentsCamelCase<BrainRunArgs>): React.ReactElement;
|
|
41
|
-
watch({ identifier, }: ArgumentsCamelCase<BrainWatchArgs>): React.ReactElement;
|
|
42
|
+
watch({ identifier, events, }: ArgumentsCamelCase<BrainWatchArgs>): React.ReactElement;
|
|
42
43
|
kill({ runId, force, }: ArgumentsCamelCase<BrainKillArgs>): React.ReactElement;
|
|
43
44
|
top({ brain }: ArgumentsCamelCase<BrainTopArgs>): React.ReactElement;
|
|
44
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../../src/commands/brain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,UAAU,aAAa;CAAG;AAC1B,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AACD,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AACD,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"brain.d.ts","sourceRoot":"","sources":["../../../src/commands/brain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAa1B,UAAU,aAAa;CAAG;AAC1B,UAAU,gBAAgB;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AACD,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AACD,UAAU,cAAc;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AACD,UAAU,aAAa;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AACD,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACvB,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;IAIjE,OAAO,CAAC,EACN,KAAK,EACL,KAAK,GACN,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,KAAK,CAAC,YAAY;IAQ5D,IAAI,CAAC,EACH,KAAK,EACL,KAAK,EACL,KAAK,GACN,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;IAqBzD,KAAK,CAAC,EACJ,KAAK,EACL,KAAK,EACL,QAAQ,EACR,UAAU,GACX,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,YAAY;IAa1D,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,YAAY;IAQpF,KAAK,CAAC,EACJ,UAAU,EACV,MAAM,GACP,EAAE,kBAAkB,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,YAAY;IAI1D,IAAI,CAAC,EACH,KAAK,EACL,KAAK,GACN,EAAE,kBAAkB,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,YAAY;IAIzD,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,kBAAkB,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,YAAY;CAGrE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { BrainEvent } from '@positronic/core';
|
|
2
|
+
export interface StoredEvent {
|
|
3
|
+
timestamp: Date;
|
|
4
|
+
event: BrainEvent;
|
|
5
|
+
}
|
|
6
|
+
interface EventsViewProps {
|
|
7
|
+
events: StoredEvent[];
|
|
8
|
+
}
|
|
9
|
+
export declare const EventsView: ({ events }: EventsViewProps) => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=events-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events-view.d.ts","sourceRoot":"","sources":["../../../src/components/events-view.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AAgLD,eAAO,MAAM,UAAU,GAAI,YAAY,eAAe,4CAwBrD,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
interface WatchResolverProps {
|
|
2
2
|
identifier: string;
|
|
3
|
+
startWithEvents?: boolean;
|
|
3
4
|
}
|
|
4
5
|
/**
|
|
5
6
|
* WatchResolver - Resolves an identifier to either a brain name or run ID and starts watching.
|
|
@@ -10,6 +11,6 @@ interface WatchResolverProps {
|
|
|
10
11
|
* 2. If no brain matches, try as a run ID
|
|
11
12
|
* 3. If neither works, show an error
|
|
12
13
|
*/
|
|
13
|
-
export declare const WatchResolver: ({ identifier }: WatchResolverProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
14
|
+
export declare const WatchResolver: ({ identifier, startWithEvents }: WatchResolverProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
14
15
|
export {};
|
|
15
16
|
//# sourceMappingURL=watch-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch-resolver.d.ts","sourceRoot":"","sources":["../../../src/components/watch-resolver.tsx"],"names":[],"mappings":"AAmRA,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"watch-resolver.d.ts","sourceRoot":"","sources":["../../../src/components/watch-resolver.tsx"],"names":[],"mappings":"AAmRA,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,iCAAiC,kBAAkB,mDA4FhF,CAAC"}
|
|
@@ -2,7 +2,8 @@ interface WatchProps {
|
|
|
2
2
|
runId: string;
|
|
3
3
|
manageScreenBuffer?: boolean;
|
|
4
4
|
footer?: string;
|
|
5
|
+
startWithEvents?: boolean;
|
|
5
6
|
}
|
|
6
|
-
export declare const Watch: ({ runId, manageScreenBuffer, footer }: WatchProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
export declare const Watch: ({ runId, manageScreenBuffer, footer, startWithEvents }: WatchProps) => import("react/jsx-runtime").JSX.Element;
|
|
7
8
|
export {};
|
|
8
9
|
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/components/watch.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/components/watch.tsx"],"names":[],"mappings":"AA+KA,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,KAAK,GAAI,wDAAuE,UAAU,4CAuMtG,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@positronic/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.56",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"clean": "rm -rf tsconfig.tsbuildinfo dist node_modules"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@positronic/core": "^0.0.
|
|
27
|
-
"@positronic/spec": "^0.0.
|
|
28
|
-
"@positronic/template-new-project": "^0.0.
|
|
26
|
+
"@positronic/core": "^0.0.56",
|
|
27
|
+
"@positronic/spec": "^0.0.56",
|
|
28
|
+
"@positronic/template-new-project": "^0.0.56",
|
|
29
29
|
"caz": "^2.0.0",
|
|
30
30
|
"chokidar": "^3.6.0",
|
|
31
31
|
"dotenv": "^16.4.7",
|