@positronic/cli 0.0.55 → 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 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
- }).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');
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
- }).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');
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, _param_footer = param.footer, footer = _param_footer === void 0 ? 'x kill • esc quit' : _param_footer;
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 _useState = _sliced_to_array(useState(undefined), 2), brainError = _useState[0], setBrainError = _useState[1];
222
- var _useState1 = _sliced_to_array(useState(null), 2), connectionError = _useState1[0], setConnectionError = _useState1[1];
223
- var _useState2 = _sliced_to_array(useState(false), 2), isConnected = _useState2[0], setIsConnected = _useState2[1];
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 _useState3 = _sliced_to_array(useState(false), 2), confirmingKill = _useState3[0], setConfirmingKill = _useState3[1];
226
- var _useState4 = _sliced_to_array(useState(false), 2), isKilling = _useState4[0], setIsKilling = _useState4[1];
227
- var _useState5 = _sliced_to_array(useState(false), 2), isKilled = _useState5[0], setIsKilled = _useState5[1];
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
- if (input === 'x' && !isKilling && !isKilled && !isComplete) {
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...") : !rootBrain ? /*#__PURE__*/ React.createElement(Text, null, "Waiting for brain to start...") : /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement(BrainSection, {
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
- }, footer)));
400
+ }, displayFooter)));
360
401
  };
@@ -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,4BA0mC3C"}
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;CACpB;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,GACX,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"}
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;CACpB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,gBAAgB,kBAAkB,mDA4F/D,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":"AA4KA,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,KAAK,GAAI,uCAAoE,UAAU,4CA6KnG,CAAC"}
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.55",
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.55",
27
- "@positronic/spec": "^0.0.55",
28
- "@positronic/template-new-project": "^0.0.55",
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",