4runr-os 1.3.62 → 1.4.0

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.
@@ -4,5 +4,5 @@
4
4
  *
5
5
  * Phase 1: Layout Skeleton + Dedicated Command Line
6
6
  */
7
- export { startPhase1Runtime } from './ui/phase1Runtime.js';
7
+ export { startPhase1Runtime } from './ui/phase1RuntimeClean.js';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/v3/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/v3/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -5,7 +5,7 @@
5
5
  * Phase 1: Layout Skeleton + Dedicated Command Line
6
6
  */
7
7
  // Export for use as a library
8
- export { startPhase1Runtime } from './ui/phase1Runtime.js';
8
+ export { startPhase1Runtime } from './ui/phase1RuntimeClean.js';
9
9
  // If run directly (not imported), start the TUI
10
10
  const isMainModule = import.meta.url === `file://${process.argv[1]?.replace(/\\/g, '/')}` ||
11
11
  process.argv[1]?.endsWith('index.js') ||
@@ -20,7 +20,7 @@ if (isMainModule) {
20
20
  }
21
21
  else {
22
22
  // TUI mode (Phase 1)
23
- const { startPhase1Runtime } = await import('./ui/phase1Runtime.js');
23
+ const { startPhase1Runtime } = await import('./ui/phase1RuntimeClean.js');
24
24
  startPhase1Runtime().catch((error) => {
25
25
  console.error('FATAL: TUI failed to start:', error);
26
26
  process.exit(1);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/v3/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,gDAAgD;AAChD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;IACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE3D,IAAI,YAAY,EAAE,CAAC;IACjB,wBAAwB;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAElF,IAAI,KAAK,EAAE,CAAC;QACV,oCAAoC;QACpC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACrE,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/v3/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,8BAA8B;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,gDAAgD;AAChD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;IACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;AAE3D,IAAI,YAAY,EAAE,CAAC;IACjB,wBAAwB;IACxB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;IAElF,IAAI,KAAK,EAAE,CAAC;QACV,oCAAoC;QACpC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC;QAC1E,kBAAkB,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACnC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Phase 1 Runtime - CLEAN IMPLEMENTATION
3
+ *
4
+ * Following strict lifecycle rules:
5
+ * - Single instance guard
6
+ * - Resize updates layout only (no recreate)
7
+ * - Zero stdout writes
8
+ * - Clean unbinding
9
+ */
10
+ /**
11
+ * Step 1: Single instance guard
12
+ */
13
+ export declare function startPhase1Runtime(): Promise<void>;
14
+ //# sourceMappingURL=phase1RuntimeClean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase1RuntimeClean.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/ui/phase1RuntimeClean.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+CH;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAsJxD"}
@@ -0,0 +1,578 @@
1
+ /**
2
+ * Phase 1 Runtime - CLEAN IMPLEMENTATION
3
+ *
4
+ * Following strict lifecycle rules:
5
+ * - Single instance guard
6
+ * - Resize updates layout only (no recreate)
7
+ * - Zero stdout writes
8
+ * - Clean unbinding
9
+ */
10
+ import blessed from 'neo-blessed';
11
+ import { computePhase1Layout, MIN_WIDTH, MIN_HEIGHT } from './layout/phase1Layout.js';
12
+ import { isUIMounted, setUIRuntime, getUIRuntime, destroyUIRuntime } from './uiRuntime.js';
13
+ import { feedStore } from '../core/feedStore.js';
14
+ import { eventBus } from '../core/eventBus.js';
15
+ import { logger, enableTuiMode, disableBootPhase } from '../core/logger.js';
16
+ import { buildUiState } from '../state/uiStateBuilder.js';
17
+ import { defaultUiState } from '../state/defaultState.js';
18
+ import { initializePostureState } from '../state/initializePostureState.js';
19
+ import { renderResourcesPanel } from './panels/ResourcesPanel.js';
20
+ import { renderPosturePanel } from './panels/PosturePanel.js';
21
+ import { renderAssetsPanel } from './panels/AssetsPanel.js';
22
+ import { renderNetworkPanel } from './panels/NetworkPanel.js';
23
+ import { renderCapabilitiesPanel } from './panels/CapabilitiesPanel.js';
24
+ import { isAvailable } from '../state/value.js';
25
+ import { parse, execute, UiAction } from '../commands/commandEngine.js';
26
+ const blessedLib = blessed;
27
+ const PROMPT = '4runr> ';
28
+ // Current UI state
29
+ let currentUiState = {
30
+ ...defaultUiState,
31
+ posture: initializePostureState()
32
+ };
33
+ // Command history
34
+ const commandHistory = [];
35
+ let historyIndex = -1;
36
+ // Input state
37
+ let commandInputValue = PROMPT;
38
+ let cursorPosition = PROMPT.length;
39
+ let scrollOffset = 0;
40
+ // Resize debounce
41
+ let resizeDebounceTimer = null;
42
+ const RESIZE_DEBOUNCE_MS = 100;
43
+ let lastResizeWidth = 0;
44
+ let lastResizeHeight = 0;
45
+ /**
46
+ * Step 1: Single instance guard
47
+ */
48
+ export async function startPhase1Runtime() {
49
+ // HARD GUARD: If UI already mounted, return immediately
50
+ if (isUIMounted()) {
51
+ logger.error('UI already mounted - cannot mount twice');
52
+ return;
53
+ }
54
+ // Step 5: Enable TUI mode (routes console.log to eventBus)
55
+ enableTuiMode();
56
+ // Set up raw input
57
+ if (process.stdin.isTTY) {
58
+ process.stdin.setRawMode(true);
59
+ process.stdin.resume();
60
+ process.stdin.setEncoding('utf8');
61
+ }
62
+ // Create screen (ONCE)
63
+ const screen = blessedLib.screen({
64
+ smartCSR: false,
65
+ fastCSR: false,
66
+ title: '4Runr OS',
67
+ fullUnicode: true,
68
+ sendFocus: false,
69
+ warnings: false,
70
+ autoPadding: false,
71
+ dockBorders: false,
72
+ });
73
+ if (!screen) {
74
+ throw new Error('Failed to create screen');
75
+ }
76
+ // Hide cursor
77
+ if (screen.program?.hideCursor) {
78
+ screen.program.hideCursor();
79
+ }
80
+ // Check terminal size
81
+ const width = screen.width;
82
+ const height = screen.height;
83
+ const layoutResult = computePhase1Layout(width, height);
84
+ if (!layoutResult.ok || !layoutResult.layout) {
85
+ const errorMsg = layoutResult.errorMessage || 'Terminal too small';
86
+ screen.destroy();
87
+ throw new Error(errorMsg);
88
+ }
89
+ const layout = layoutResult.layout;
90
+ // Create all widgets ONCE
91
+ const widgets = {
92
+ posture: createPanel(screen, layout.posture, 'POSTURE'),
93
+ resources: createPanel(screen, layout.resources, 'RESOURCES'),
94
+ assets: createPanel(screen, layout.assets, 'ASSETS'),
95
+ operations: createPanel(screen, layout.operations, 'OPERATIONS'),
96
+ network: createPanel(screen, layout.network, 'NETWORK'),
97
+ capabilities: createPanel(screen, layout.capabilities, 'CAPABILITIES'),
98
+ statusStrip: createStatusStrip(screen, layout),
99
+ commandLine: createCommandLine(screen, layout),
100
+ };
101
+ // Append all widgets ONCE
102
+ screen.append(widgets.posture);
103
+ screen.append(widgets.resources);
104
+ screen.append(widgets.assets);
105
+ screen.append(widgets.operations);
106
+ screen.append(widgets.network);
107
+ screen.append(widgets.capabilities);
108
+ screen.append(widgets.statusStrip);
109
+ screen.append(widgets.commandLine);
110
+ // Store unbind functions
111
+ const unbindFns = [];
112
+ // Step 6: Error handlers
113
+ const uncaughtHandler = (error) => {
114
+ eventBus.emit({
115
+ tag: 'ERR',
116
+ msg: `Uncaught: ${error.message}`,
117
+ level: 'ERROR'
118
+ });
119
+ };
120
+ const unhandledHandler = (reason) => {
121
+ eventBus.emit({
122
+ tag: 'ERR',
123
+ msg: `Unhandled rejection: ${reason}`,
124
+ level: 'ERROR'
125
+ });
126
+ };
127
+ process.on('uncaughtException', uncaughtHandler);
128
+ process.on('unhandledRejection', unhandledHandler);
129
+ unbindFns.push(() => {
130
+ process.removeListener('uncaughtException', uncaughtHandler);
131
+ process.removeListener('unhandledRejection', unhandledHandler);
132
+ });
133
+ // Setup input handling
134
+ setupInputHandling(screen, widgets.commandLine, unbindFns);
135
+ // Step 2 & 3: Setup resize handling (layout update only)
136
+ setupResizeHandling(screen, widgets, unbindFns);
137
+ // Setup signal handlers
138
+ const sigintHandler = () => cleanExit(0);
139
+ const sigtermHandler = () => cleanExit(0);
140
+ process.on('SIGINT', sigintHandler);
141
+ process.on('SIGTERM', sigtermHandler);
142
+ unbindFns.push(() => {
143
+ process.removeListener('SIGINT', sigintHandler);
144
+ process.removeListener('SIGTERM', sigtermHandler);
145
+ });
146
+ // Store runtime
147
+ const runtime = {
148
+ screen,
149
+ widgets,
150
+ isMounted: true,
151
+ unbindFns,
152
+ };
153
+ setUIRuntime(runtime);
154
+ // Subscribe to eventBus for Operations panel
155
+ eventBus.subscribe((event) => {
156
+ feedStore.push(event);
157
+ updateOperationsPanel(widgets.operations);
158
+ screen.render();
159
+ });
160
+ // Initial content update
161
+ updateAllPanels(widgets);
162
+ // Initial render
163
+ lastResizeWidth = width;
164
+ lastResizeHeight = height;
165
+ screen.render();
166
+ // Disable boot phase (enable strict stdout blocking)
167
+ disableBootPhase();
168
+ // Start background state updates
169
+ startBackgroundUpdates(widgets, screen);
170
+ // Log boot
171
+ eventBus.emit({
172
+ tag: 'SYS',
173
+ msg: 'TUI initialized',
174
+ level: 'INFO'
175
+ });
176
+ }
177
+ /**
178
+ * Step 2: Resize handler - UPDATE LAYOUT ONLY
179
+ */
180
+ function setupResizeHandling(screen, widgets, unbindFns) {
181
+ const resizeHandler = () => {
182
+ const newWidth = screen.width;
183
+ const newHeight = screen.height;
184
+ // Step 3: Ignore no-op resizes
185
+ if (newWidth === lastResizeWidth && newHeight === lastResizeHeight) {
186
+ return;
187
+ }
188
+ // Step 3: Debounce
189
+ if (resizeDebounceTimer) {
190
+ clearTimeout(resizeDebounceTimer);
191
+ }
192
+ resizeDebounceTimer = setTimeout(() => {
193
+ resizeDebounceTimer = null;
194
+ // Double-check dimensions
195
+ const currentWidth = screen.width;
196
+ const currentHeight = screen.height;
197
+ if (currentWidth === lastResizeWidth && currentHeight === lastResizeHeight) {
198
+ return;
199
+ }
200
+ lastResizeWidth = currentWidth;
201
+ lastResizeHeight = currentHeight;
202
+ // Recompute layout
203
+ const newLayoutResult = computePhase1Layout(currentWidth, currentHeight);
204
+ if (!newLayoutResult.ok || !newLayoutResult.layout) {
205
+ eventBus.emit({
206
+ tag: 'SYS',
207
+ msg: `Terminal too small: ${currentWidth}x${currentHeight} (need ${MIN_WIDTH}x${MIN_HEIGHT})`,
208
+ level: 'WARN'
209
+ });
210
+ return;
211
+ }
212
+ const newLayout = newLayoutResult.layout;
213
+ // Step 2: Update widget positions/sizes ONLY (no recreate, no re-append)
214
+ updateWidgetLayout(widgets.posture, newLayout.posture);
215
+ updateWidgetLayout(widgets.resources, newLayout.resources);
216
+ updateWidgetLayout(widgets.assets, newLayout.assets);
217
+ updateWidgetLayout(widgets.operations, newLayout.operations);
218
+ updateWidgetLayout(widgets.network, newLayout.network);
219
+ updateWidgetLayout(widgets.capabilities, newLayout.capabilities);
220
+ // Update status strip and command line
221
+ const statusWidth = Math.floor(newLayout.commandLine.width * 0.2);
222
+ updateWidgetLayout(widgets.statusStrip, {
223
+ top: newLayout.commandLine.top,
224
+ left: newLayout.commandLine.left,
225
+ width: statusWidth,
226
+ height: newLayout.commandLine.height,
227
+ });
228
+ updateWidgetLayout(widgets.commandLine, {
229
+ top: newLayout.commandLine.top,
230
+ left: newLayout.commandLine.left + statusWidth + 1,
231
+ width: newLayout.commandLine.width - statusWidth - 1,
232
+ height: newLayout.commandLine.height,
233
+ });
234
+ // Update all panel content (may need to reflow for new width)
235
+ updateAllPanels(widgets);
236
+ // Render
237
+ screen.render();
238
+ eventBus.emit({
239
+ tag: 'SYS',
240
+ msg: `Resized to ${currentWidth}x${currentHeight}`,
241
+ level: 'INFO'
242
+ });
243
+ }, RESIZE_DEBOUNCE_MS);
244
+ };
245
+ screen.on('resize', resizeHandler);
246
+ unbindFns.push(() => {
247
+ // Use off() method (EventEmitter API) instead of removeListener
248
+ screen.off('resize', resizeHandler);
249
+ if (resizeDebounceTimer) {
250
+ clearTimeout(resizeDebounceTimer);
251
+ }
252
+ });
253
+ }
254
+ /**
255
+ * Update widget layout (geometry only)
256
+ */
257
+ function updateWidgetLayout(widget, rect) {
258
+ widget.top = rect.top;
259
+ widget.left = rect.left;
260
+ widget.width = rect.width;
261
+ widget.height = rect.height;
262
+ }
263
+ /**
264
+ * Create a read-only panel
265
+ */
266
+ function createPanel(screen, rect, title) {
267
+ const panel = blessedLib.box({
268
+ top: rect.top,
269
+ left: rect.left,
270
+ width: rect.width,
271
+ height: rect.height,
272
+ border: { type: 'line' },
273
+ tags: true,
274
+ content: '',
275
+ style: {
276
+ border: { fg: 'cyan' },
277
+ },
278
+ wrap: false,
279
+ scrollable: false,
280
+ clickable: false,
281
+ keys: false,
282
+ mouse: false,
283
+ input: false,
284
+ focusable: false,
285
+ });
286
+ panel.setLabel(` {cyan-fg}${title}{/}`);
287
+ return panel;
288
+ }
289
+ /**
290
+ * Create status strip
291
+ */
292
+ function createStatusStrip(screen, layout) {
293
+ const statusWidth = Math.floor(layout.commandLine.width * 0.2);
294
+ const strip = blessedLib.box({
295
+ top: layout.commandLine.top,
296
+ left: layout.commandLine.left,
297
+ width: statusWidth,
298
+ height: layout.commandLine.height,
299
+ border: { type: 'line' },
300
+ tags: true,
301
+ content: ' OFFLINE',
302
+ style: {
303
+ border: { fg: 'grey' },
304
+ fg: 'grey',
305
+ },
306
+ clickable: false,
307
+ keys: false,
308
+ mouse: false,
309
+ input: false,
310
+ focusable: false,
311
+ });
312
+ strip.setLabel(' {grey-fg}STATUS{/}');
313
+ return strip;
314
+ }
315
+ /**
316
+ * Create command line
317
+ */
318
+ function createCommandLine(screen, layout) {
319
+ const statusWidth = Math.floor(layout.commandLine.width * 0.2);
320
+ const cmdLine = blessedLib.box({
321
+ top: layout.commandLine.top,
322
+ left: layout.commandLine.left + statusWidth + 1,
323
+ width: layout.commandLine.width - statusWidth - 1,
324
+ height: layout.commandLine.height,
325
+ border: { type: 'line' },
326
+ tags: true,
327
+ content: PROMPT,
328
+ style: {
329
+ border: { fg: 'cyan' },
330
+ fg: 'white',
331
+ },
332
+ focusable: true,
333
+ keyable: true,
334
+ input: false,
335
+ keys: false,
336
+ });
337
+ cmdLine.setLabel(' {cyan-fg}COMMAND LINE{/}');
338
+ return cmdLine;
339
+ }
340
+ /**
341
+ * Setup input handling
342
+ */
343
+ function setupInputHandling(screen, commandLine, unbindFns) {
344
+ const updateDisplay = () => {
345
+ const availableWidth = commandLine.width - 4;
346
+ const fullText = commandInputValue;
347
+ const cursorIndex = cursorPosition;
348
+ if (cursorIndex - scrollOffset >= availableWidth - 1) {
349
+ scrollOffset = cursorIndex - availableWidth + 2;
350
+ }
351
+ if (cursorIndex < scrollOffset) {
352
+ scrollOffset = Math.max(0, cursorIndex - 5);
353
+ }
354
+ const visibleStart = scrollOffset;
355
+ const visibleEnd = Math.min(fullText.length, visibleStart + availableWidth - 1);
356
+ let visibleText = fullText.substring(visibleStart, visibleEnd);
357
+ const cursorPosInVisible = cursorIndex - visibleStart;
358
+ const beforeCursor = visibleText.substring(0, cursorPosInVisible);
359
+ const afterCursor = visibleText.substring(cursorPosInVisible);
360
+ const displayValue = beforeCursor + '{inverse} {/}' + afterCursor;
361
+ commandLine.setContent(displayValue);
362
+ screen.render();
363
+ };
364
+ const handleSubmit = async (value) => {
365
+ const commandPart = value.startsWith(PROMPT) ? value.slice(PROMPT.length).trim() : value.trim();
366
+ if (!commandPart) {
367
+ return;
368
+ }
369
+ // Add to history
370
+ commandHistory.push(commandPart);
371
+ if (commandHistory.length > 100) {
372
+ commandHistory.shift();
373
+ }
374
+ historyIndex = -1;
375
+ // Clear input
376
+ commandInputValue = PROMPT;
377
+ cursorPosition = PROMPT.length;
378
+ scrollOffset = 0;
379
+ updateDisplay();
380
+ // Emit command event
381
+ eventBus.emit({
382
+ tag: 'CMD',
383
+ msg: commandPart,
384
+ level: 'INFO'
385
+ });
386
+ // Execute command
387
+ const parsed = parse(commandPart);
388
+ if (!parsed.name)
389
+ return;
390
+ const ctx = {};
391
+ try {
392
+ const result = await execute(parsed, ctx);
393
+ // Emit result events
394
+ for (const event of result.events) {
395
+ eventBus.emit(event);
396
+ }
397
+ // Handle UI state update
398
+ if (result.uiStateUpdate) {
399
+ currentUiState = result.uiStateUpdate(currentUiState);
400
+ const runtime = getUIRuntime();
401
+ updateAllPanels(runtime.widgets);
402
+ runtime.screen.render();
403
+ }
404
+ // Handle actions
405
+ if (result.action === UiAction.EXIT) {
406
+ cleanExit(0);
407
+ }
408
+ else if (result.action === UiAction.CLEAR_FEED) {
409
+ feedStore.clear();
410
+ }
411
+ }
412
+ catch (error) {
413
+ eventBus.emit({
414
+ tag: 'ERR',
415
+ msg: `Command error: ${error.message}`,
416
+ level: 'ERROR'
417
+ });
418
+ }
419
+ };
420
+ const stdinListener = (data) => {
421
+ const input = data.toString();
422
+ if (input === '\x03') { // Ctrl+C
423
+ cleanExit(0);
424
+ return;
425
+ }
426
+ if (input === '\r' || input === '\n') { // Enter
427
+ const cmd = commandInputValue.startsWith(PROMPT)
428
+ ? commandInputValue.slice(PROMPT.length).trim()
429
+ : commandInputValue.trim();
430
+ if (cmd) {
431
+ handleSubmit(commandInputValue).catch(err => {
432
+ eventBus.emit({
433
+ tag: 'ERR',
434
+ msg: `Handler error: ${err.message}`,
435
+ level: 'ERROR'
436
+ });
437
+ });
438
+ }
439
+ else {
440
+ commandInputValue = PROMPT;
441
+ cursorPosition = PROMPT.length;
442
+ updateDisplay();
443
+ }
444
+ return;
445
+ }
446
+ if (input === '\x7f' || input === '\x08') { // Backspace
447
+ if (cursorPosition > PROMPT.length) {
448
+ commandInputValue = commandInputValue.substring(0, cursorPosition - 1) + commandInputValue.substring(cursorPosition);
449
+ cursorPosition--;
450
+ updateDisplay();
451
+ }
452
+ return;
453
+ }
454
+ if (input === '\x1b[D') { // Left arrow
455
+ if (cursorPosition > PROMPT.length) {
456
+ cursorPosition--;
457
+ updateDisplay();
458
+ }
459
+ return;
460
+ }
461
+ if (input === '\x1b[C') { // Right arrow
462
+ if (cursorPosition < commandInputValue.length) {
463
+ cursorPosition++;
464
+ updateDisplay();
465
+ }
466
+ return;
467
+ }
468
+ // Printable characters
469
+ if (input.length === 1 && input >= ' ' && input <= '~') {
470
+ commandInputValue = commandInputValue.substring(0, cursorPosition) + input + commandInputValue.substring(cursorPosition);
471
+ cursorPosition++;
472
+ updateDisplay();
473
+ }
474
+ };
475
+ process.stdin.on('data', stdinListener);
476
+ unbindFns.push(() => {
477
+ process.stdin.removeListener('data', stdinListener);
478
+ });
479
+ // Focus command line
480
+ commandLine.focus();
481
+ screen.focused = commandLine;
482
+ }
483
+ /**
484
+ * Update all panel content
485
+ */
486
+ function updateAllPanels(widgets) {
487
+ updatePanel(widgets.posture, renderPosturePanel(currentUiState.posture));
488
+ updatePanel(widgets.resources, renderResourcesPanel(currentUiState.resources));
489
+ updatePanel(widgets.assets, renderAssetsPanel(currentUiState.assets));
490
+ updateOperationsPanel(widgets.operations);
491
+ updatePanel(widgets.network, renderNetworkPanel(currentUiState.network));
492
+ updatePanel(widgets.capabilities, renderCapabilitiesPanel(currentUiState.capabilities));
493
+ // Update status strip
494
+ const statusValue = currentUiState.statusStrip;
495
+ if (isAvailable(statusValue)) {
496
+ const data = statusValue.value;
497
+ widgets.statusStrip.setContent(` ${data.left} | ${data.right} `);
498
+ }
499
+ else {
500
+ widgets.statusStrip.setContent(' OFFLINE');
501
+ }
502
+ }
503
+ /**
504
+ * Update a panel with content lines
505
+ */
506
+ function updatePanel(panel, lines) {
507
+ const panelWidth = panel.width;
508
+ const panelHeight = panel.height;
509
+ const innerWidth = Math.max(1, panelWidth - 4);
510
+ const innerHeight = Math.max(1, panelHeight - 2);
511
+ const truncatedLines = lines.slice(0, innerHeight).map(line => {
512
+ if (line.length > innerWidth) {
513
+ return line.substring(0, innerWidth - 3) + '...';
514
+ }
515
+ return line;
516
+ });
517
+ const content = '\n ' + truncatedLines.join('\n ');
518
+ panel.setContent(content);
519
+ }
520
+ /**
521
+ * Update operations panel
522
+ */
523
+ function updateOperationsPanel(panel) {
524
+ const panelHeight = panel.height;
525
+ const panelWidth = panel.width;
526
+ const innerHeight = Math.max(1, panelHeight - 2);
527
+ const innerWidth = Math.max(1, panelWidth - 2);
528
+ const events = feedStore.getLatest(innerHeight);
529
+ const lines = [];
530
+ if (events.length === 0) {
531
+ lines.push('No operations yet');
532
+ }
533
+ else {
534
+ for (const event of events.slice(-innerHeight)) {
535
+ const time = new Date(event.ts).toLocaleTimeString();
536
+ const line = `${time} [${event.tag}] ${event.msg}`;
537
+ if (line.length > innerWidth) {
538
+ lines.push(line.substring(0, innerWidth - 3) + '...');
539
+ }
540
+ else {
541
+ lines.push(line);
542
+ }
543
+ }
544
+ }
545
+ const content = '\n ' + lines.join('\n ');
546
+ panel.setContent(content);
547
+ }
548
+ /**
549
+ * Start background state updates
550
+ */
551
+ function startBackgroundUpdates(widgets, screen) {
552
+ const interval = setInterval(async () => {
553
+ try {
554
+ const newState = await buildUiState(currentUiState);
555
+ currentUiState = newState;
556
+ updateAllPanels(widgets);
557
+ screen.render();
558
+ }
559
+ catch (error) {
560
+ // Ignore errors
561
+ }
562
+ }, 1500);
563
+ const runtime = getUIRuntime();
564
+ runtime.unbindFns.push(() => clearInterval(interval));
565
+ }
566
+ /**
567
+ * Step 4: Clean exit
568
+ */
569
+ function cleanExit(code) {
570
+ destroyUIRuntime();
571
+ // Restore terminal
572
+ if (process.stdout.isTTY) {
573
+ process.stdout.write('\x1b[?25h'); // Show cursor
574
+ process.stdout.write('\x1b[?1049l'); // Exit alternate screen
575
+ }
576
+ process.exit(code);
577
+ }
578
+ //# sourceMappingURL=phase1RuntimeClean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase1RuntimeClean.js","sourceRoot":"","sources":["../../../../src/ui/v3/ui/phase1RuntimeClean.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * UI Runtime Singleton
3
+ *
4
+ * Single instance guard and lifecycle management for the TUI.
5
+ * Ensures only one UI instance exists and handles clean shutdown.
6
+ */
7
+ import type { Widgets } from 'neo-blessed';
8
+ export interface UIWidgets {
9
+ posture: Widgets.Box;
10
+ resources: Widgets.Box;
11
+ assets: Widgets.Box;
12
+ operations: Widgets.Box;
13
+ network: Widgets.Box;
14
+ capabilities: Widgets.Box;
15
+ statusStrip: Widgets.Box;
16
+ commandLine: Widgets.Box;
17
+ }
18
+ export interface UIRuntime {
19
+ screen: Widgets.Screen;
20
+ widgets: UIWidgets;
21
+ isMounted: boolean;
22
+ unbindFns: Array<() => void>;
23
+ }
24
+ /**
25
+ * Check if UI is already mounted
26
+ */
27
+ export declare function isUIMounted(): boolean;
28
+ /**
29
+ * Get the current UI runtime (throws if not mounted)
30
+ */
31
+ export declare function getUIRuntime(): UIRuntime;
32
+ /**
33
+ * Set the UI runtime (only allowed once)
34
+ */
35
+ export declare function setUIRuntime(runtime: UIRuntime): void;
36
+ /**
37
+ * Destroy the UI runtime and reset singleton
38
+ */
39
+ export declare function destroyUIRuntime(): void;
40
+ //# sourceMappingURL=uiRuntime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiRuntime.d.ts","sourceRoot":"","sources":["../../../../src/ui/v3/ui/uiRuntime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;CAC9B;AAKD;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,SAAS,CAKxC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAKrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAuBvC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * UI Runtime Singleton
3
+ *
4
+ * Single instance guard and lifecycle management for the TUI.
5
+ * Ensures only one UI instance exists and handles clean shutdown.
6
+ */
7
+ // Global singleton guard
8
+ let uiRuntime = null;
9
+ /**
10
+ * Check if UI is already mounted
11
+ */
12
+ export function isUIMounted() {
13
+ return uiRuntime !== null && uiRuntime.isMounted;
14
+ }
15
+ /**
16
+ * Get the current UI runtime (throws if not mounted)
17
+ */
18
+ export function getUIRuntime() {
19
+ if (!uiRuntime || !uiRuntime.isMounted) {
20
+ throw new Error('UI not mounted');
21
+ }
22
+ return uiRuntime;
23
+ }
24
+ /**
25
+ * Set the UI runtime (only allowed once)
26
+ */
27
+ export function setUIRuntime(runtime) {
28
+ if (uiRuntime !== null) {
29
+ throw new Error('UI already mounted - cannot mount twice');
30
+ }
31
+ uiRuntime = runtime;
32
+ }
33
+ /**
34
+ * Destroy the UI runtime and reset singleton
35
+ */
36
+ export function destroyUIRuntime() {
37
+ if (!uiRuntime)
38
+ return;
39
+ // Call all unbind functions
40
+ for (const unbind of uiRuntime.unbindFns) {
41
+ try {
42
+ unbind();
43
+ }
44
+ catch (e) {
45
+ // Ignore errors during cleanup
46
+ }
47
+ }
48
+ // Destroy screen
49
+ try {
50
+ if (uiRuntime.screen) {
51
+ uiRuntime.screen.destroy();
52
+ }
53
+ }
54
+ catch (e) {
55
+ // Ignore errors
56
+ }
57
+ // Reset singleton
58
+ uiRuntime = null;
59
+ }
60
+ //# sourceMappingURL=uiRuntime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiRuntime.js","sourceRoot":"","sources":["../../../../src/ui/v3/ui/uiRuntime.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,yBAAyB;AACzB,IAAI,SAAS,GAAqB,IAAI,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,SAAS,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAkB;IAC7C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IACD,SAAS,GAAG,OAAO,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC,SAAS;QAAE,OAAO;IAEvB,4BAA4B;IAC5B,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC;QACX,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,+BAA+B;QACjC,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC;QACH,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,gBAAgB;IAClB,CAAC;IAED,kBAAkB;IAClB,SAAS,GAAG,IAAI,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "4runr-os",
3
- "version": "1.3.62",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "description": "4Runr AI Agent OS - Interactive terminal for managing AI agents",
6
6
  "main": "dist/index.js",