@positronic/cli 0.0.46 → 0.0.48
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.
|
@@ -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] : {};
|
|
@@ -88,6 +97,9 @@ function _object_spread_props(target, source) {
|
|
|
88
97
|
function _sliced_to_array(arr, i) {
|
|
89
98
|
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
90
99
|
}
|
|
100
|
+
function _to_consumable_array(arr) {
|
|
101
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
102
|
+
}
|
|
91
103
|
function _unsupported_iterable_to_array(o, minLen) {
|
|
92
104
|
if (!o) return;
|
|
93
105
|
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
@@ -99,8 +111,7 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
99
111
|
import React, { useState, useEffect, useRef } from 'react';
|
|
100
112
|
import { Text, Box, useStdout } from 'ink';
|
|
101
113
|
import { EventSource } from 'eventsource';
|
|
102
|
-
import { BRAIN_EVENTS } from '@positronic/core';
|
|
103
|
-
import { STATUS } from '@positronic/core';
|
|
114
|
+
import { BRAIN_EVENTS, STATUS, createBrainExecutionMachine, sendEvent } from '@positronic/core';
|
|
104
115
|
import { getApiBaseUrl, isApiLocalDevMode } from '../commands/helpers.js';
|
|
105
116
|
import { ErrorComponent } from './error.js';
|
|
106
117
|
// Get the index of the currently running step (or last completed if none running)
|
|
@@ -191,16 +202,18 @@ var StepWindow = function(param) {
|
|
|
191
202
|
}, getStatusChar(nextStep.status), " ", nextStep.title)));
|
|
192
203
|
};
|
|
193
204
|
var BrainSection = function(param) {
|
|
194
|
-
var brain = param.brain, _param_isInner = param.isInner, isInner = _param_isInner === void 0 ? false : _param_isInner,
|
|
205
|
+
var brain = param.brain, _param_isInner = param.isInner, isInner = _param_isInner === void 0 ? false : _param_isInner, brainStack = param.brainStack;
|
|
195
206
|
var indent = isInner ? 2 : 0;
|
|
196
207
|
var completed = getCompletedCount(brain.steps);
|
|
197
208
|
var total = brain.steps.length;
|
|
198
209
|
// Find the currently running step to check for inner brain
|
|
199
210
|
var currentIndex = getCurrentStepIndex(brain.steps);
|
|
200
211
|
var currentStep = brain.steps[currentIndex];
|
|
201
|
-
// Find any inner brain associated with the current step
|
|
202
|
-
|
|
203
|
-
|
|
212
|
+
// Find any inner brain associated with the current step (active inner brains are on the stack)
|
|
213
|
+
// Must exclude the current brain to prevent infinite recursion when a restarted brain
|
|
214
|
+
// has parentStepId matching its own step IDs
|
|
215
|
+
var innerBrain = currentStep ? brainStack.find(function(b) {
|
|
216
|
+
return b.parentStepId === currentStep.id && b !== brain;
|
|
204
217
|
}) : null;
|
|
205
218
|
return /*#__PURE__*/ React.createElement(Box, {
|
|
206
219
|
flexDirection: "column",
|
|
@@ -226,22 +239,20 @@ var BrainSection = function(param) {
|
|
|
226
239
|
}, /*#__PURE__*/ React.createElement(BrainSection, {
|
|
227
240
|
brain: innerBrain,
|
|
228
241
|
isInner: true,
|
|
229
|
-
|
|
242
|
+
brainStack: brainStack
|
|
230
243
|
})));
|
|
231
244
|
};
|
|
232
245
|
export var Watch = function(param) {
|
|
233
246
|
var runId = param.runId;
|
|
234
247
|
var write = useStdout().write;
|
|
235
|
-
//
|
|
236
|
-
var
|
|
248
|
+
// Use state machine to track brain execution state
|
|
249
|
+
var machineRef = useRef(createBrainExecutionMachine());
|
|
250
|
+
// Store brain stack in state to trigger re-renders when it changes
|
|
251
|
+
var _useState = _sliced_to_array(useState([]), 2), brainStack = _useState[0], setBrainStack = _useState[1];
|
|
237
252
|
var _useState1 = _sliced_to_array(useState(undefined), 2), brainError = _useState1[0], setBrainError = _useState1[1];
|
|
238
253
|
var _useState2 = _sliced_to_array(useState(null), 2), error = _useState2[0], setError = _useState2[1];
|
|
239
254
|
var _useState3 = _sliced_to_array(useState(false), 2), isConnected = _useState3[0], setIsConnected = _useState3[1];
|
|
240
255
|
var _useState4 = _sliced_to_array(useState(false), 2), isCompleted = _useState4[0], setIsCompleted = _useState4[1];
|
|
241
|
-
// Track the main brain's brainRunId to distinguish from inner brain events
|
|
242
|
-
var mainBrainRunIdRef = useRef(null);
|
|
243
|
-
// Track the currently running step ID to associate inner brains with their parent step
|
|
244
|
-
var runningStepIdRef = useRef(null);
|
|
245
256
|
// Enter alternate screen buffer on mount, exit on unmount
|
|
246
257
|
// Skip in test environment to avoid interfering with test output capture
|
|
247
258
|
useEffect(function() {
|
|
@@ -261,11 +272,13 @@ export var Watch = function(param) {
|
|
|
261
272
|
var baseUrl = getApiBaseUrl();
|
|
262
273
|
var url = "".concat(baseUrl, "/brains/runs/").concat(runId, "/watch");
|
|
263
274
|
var es = new EventSource(url);
|
|
275
|
+
// Reset state machine for new connection
|
|
276
|
+
machineRef.current = createBrainExecutionMachine();
|
|
264
277
|
setIsConnected(false);
|
|
265
278
|
setError(null);
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
279
|
+
setBrainStack([]);
|
|
280
|
+
setBrainError(undefined);
|
|
281
|
+
setIsCompleted(false);
|
|
269
282
|
es.onopen = function() {
|
|
270
283
|
setIsConnected(true);
|
|
271
284
|
setError(null);
|
|
@@ -273,68 +286,29 @@ export var Watch = function(param) {
|
|
|
273
286
|
es.onmessage = function(event) {
|
|
274
287
|
try {
|
|
275
288
|
var eventData = JSON.parse(event.data);
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
brainTitle: startEvent.brainTitle,
|
|
288
|
-
steps: [],
|
|
289
|
-
parentStepId: isMainBrain ? null : runningStepIdRef.current,
|
|
290
|
-
isComplete: false
|
|
289
|
+
var machine = machineRef.current;
|
|
290
|
+
// Feed event to state machine - it handles all the state tracking
|
|
291
|
+
sendEvent(machine, eventData);
|
|
292
|
+
// Update React state from machine context to trigger re-render
|
|
293
|
+
// Deep copy brainStack to ensure React detects the change
|
|
294
|
+
// Note: Only update if brainStack has entries - preserve last known state for completed brains
|
|
295
|
+
var currentStack = machine.context.brainStack;
|
|
296
|
+
if (currentStack.length > 0) {
|
|
297
|
+
setBrainStack(currentStack.map(function(entry) {
|
|
298
|
+
return _object_spread_props(_object_spread({}, entry), {
|
|
299
|
+
steps: _to_consumable_array(entry.steps)
|
|
291
300
|
});
|
|
292
|
-
|
|
293
|
-
});
|
|
294
|
-
setIsCompleted(false);
|
|
295
|
-
}
|
|
296
|
-
// Handle step status - update steps for the specific brain only
|
|
297
|
-
if (eventData.type === BRAIN_EVENTS.STEP_STATUS) {
|
|
298
|
-
var statusEvent = eventData;
|
|
299
|
-
setBrains(function(prev) {
|
|
300
|
-
var next = new Map(prev);
|
|
301
|
-
var brain = next.get(statusEvent.brainRunId);
|
|
302
|
-
if (brain) {
|
|
303
|
-
next.set(statusEvent.brainRunId, _object_spread_props(_object_spread({}, brain), {
|
|
304
|
-
steps: statusEvent.steps
|
|
305
|
-
}));
|
|
306
|
-
}
|
|
307
|
-
return next;
|
|
308
|
-
});
|
|
301
|
+
}));
|
|
309
302
|
}
|
|
310
|
-
//
|
|
311
|
-
if (
|
|
312
|
-
|
|
313
|
-
runningStepIdRef.current = stepEvent.stepId;
|
|
314
|
-
}
|
|
315
|
-
// Mark brain as complete when it completes
|
|
316
|
-
if (eventData.type === BRAIN_EVENTS.COMPLETE || eventData.type === BRAIN_EVENTS.ERROR) {
|
|
317
|
-
var completeEvent = eventData;
|
|
318
|
-
// Mark this brain as complete
|
|
319
|
-
setBrains(function(prev) {
|
|
320
|
-
var next = new Map(prev);
|
|
321
|
-
var brain = next.get(completeEvent.brainRunId);
|
|
322
|
-
if (brain) {
|
|
323
|
-
next.set(completeEvent.brainRunId, _object_spread_props(_object_spread({}, brain), {
|
|
324
|
-
isComplete: true
|
|
325
|
-
}));
|
|
326
|
-
}
|
|
327
|
-
return next;
|
|
328
|
-
});
|
|
329
|
-
// Only mark overall as complete when the main brain completes
|
|
330
|
-
if (completeEvent.brainRunId === mainBrainRunIdRef.current) {
|
|
331
|
-
setIsCompleted(true);
|
|
332
|
-
}
|
|
303
|
+
// Check for completion (outer brain)
|
|
304
|
+
if (machine.context.isComplete) {
|
|
305
|
+
setIsCompleted(true);
|
|
333
306
|
}
|
|
307
|
+
// Check for error (capture the error event for display)
|
|
334
308
|
if (eventData.type === BRAIN_EVENTS.ERROR) {
|
|
335
309
|
var errorEvent = eventData;
|
|
336
|
-
// Only show error for the main brain
|
|
337
|
-
if (
|
|
310
|
+
// Only show error for the main brain (isTopLevel check)
|
|
311
|
+
if (machine.context.brainRunId === errorEvent.brainRunId) {
|
|
338
312
|
setBrainError(errorEvent);
|
|
339
313
|
}
|
|
340
314
|
}
|
|
@@ -354,12 +328,13 @@ export var Watch = function(param) {
|
|
|
354
328
|
}, [
|
|
355
329
|
runId
|
|
356
330
|
]);
|
|
357
|
-
|
|
331
|
+
// Main brain is the first entry in the stack (outer brain)
|
|
332
|
+
var mainBrain = brainStack.length > 0 ? brainStack[0] : null;
|
|
358
333
|
return /*#__PURE__*/ React.createElement(Box, {
|
|
359
334
|
flexDirection: "column"
|
|
360
|
-
}, !isConnected &&
|
|
335
|
+
}, !isConnected && brainStack.length === 0 ? /*#__PURE__*/ React.createElement(Text, null, "Connecting to watch service...") : !mainBrain ? /*#__PURE__*/ React.createElement(Text, null, "Waiting for brain to start...") : /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(BrainSection, {
|
|
361
336
|
brain: mainBrain,
|
|
362
|
-
|
|
337
|
+
brainStack: brainStack
|
|
363
338
|
}), isCompleted && !error && !brainError && /*#__PURE__*/ React.createElement(Box, {
|
|
364
339
|
marginTop: 1,
|
|
365
340
|
borderStyle: "round",
|
|
@@ -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":"AAyLA,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,KAAK,GAAI,WAAW,UAAU,4CAyI1C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@positronic/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.48",
|
|
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.48",
|
|
27
|
+
"@positronic/spec": "^0.0.48",
|
|
28
|
+
"@positronic/template-new-project": "^0.0.48",
|
|
29
29
|
"caz": "^2.0.0",
|
|
30
30
|
"chokidar": "^3.6.0",
|
|
31
31
|
"dotenv": "^16.4.7",
|