4runr-os 1.0.28 → 1.0.36

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.
Files changed (211) hide show
  1. package/dist/collectors/collector_assets.d.ts +19 -0
  2. package/dist/collectors/collector_assets.d.ts.map +1 -0
  3. package/dist/collectors/collector_assets.js +72 -0
  4. package/dist/collectors/collector_assets.js.map +1 -0
  5. package/dist/collectors/collector_capabilities.d.ts +19 -0
  6. package/dist/collectors/collector_capabilities.d.ts.map +1 -0
  7. package/dist/collectors/collector_capabilities.js +61 -0
  8. package/dist/collectors/collector_capabilities.js.map +1 -0
  9. package/dist/collectors/collector_feed.d.ts +30 -0
  10. package/dist/collectors/collector_feed.d.ts.map +1 -0
  11. package/dist/collectors/collector_feed.js +78 -0
  12. package/dist/collectors/collector_feed.js.map +1 -0
  13. package/dist/collectors/collector_geo.d.ts +12 -0
  14. package/dist/collectors/collector_geo.d.ts.map +1 -0
  15. package/dist/collectors/collector_geo.js +248 -0
  16. package/dist/collectors/collector_geo.js.map +1 -0
  17. package/dist/collectors/collector_network.d.ts +22 -0
  18. package/dist/collectors/collector_network.d.ts.map +1 -0
  19. package/dist/collectors/collector_network.js +83 -0
  20. package/dist/collectors/collector_network.js.map +1 -0
  21. package/dist/collectors/collector_posture.d.ts +25 -0
  22. package/dist/collectors/collector_posture.d.ts.map +1 -0
  23. package/dist/collectors/collector_posture.js +207 -0
  24. package/dist/collectors/collector_posture.js.map +1 -0
  25. package/dist/collectors/collector_resources.d.ts +21 -0
  26. package/dist/collectors/collector_resources.d.ts.map +1 -0
  27. package/dist/collectors/collector_resources.js +87 -0
  28. package/dist/collectors/collector_resources.js.map +1 -0
  29. package/dist/collectors/helpers.d.ts +21 -0
  30. package/dist/collectors/helpers.d.ts.map +1 -0
  31. package/dist/collectors/helpers.js +49 -0
  32. package/dist/collectors/helpers.js.map +1 -0
  33. package/dist/core/collectorRegistry.d.ts +43 -0
  34. package/dist/core/collectorRegistry.d.ts.map +1 -0
  35. package/dist/core/collectorRegistry.js +76 -0
  36. package/dist/core/collectorRegistry.js.map +1 -0
  37. package/dist/core/constants.d.ts +25 -0
  38. package/dist/core/constants.d.ts.map +1 -0
  39. package/dist/core/constants.js +33 -0
  40. package/dist/core/constants.js.map +1 -0
  41. package/dist/core/eventBus.d.ts +36 -0
  42. package/dist/core/eventBus.d.ts.map +1 -0
  43. package/dist/core/eventBus.js +52 -0
  44. package/dist/core/eventBus.js.map +1 -0
  45. package/dist/core/types.d.ts +128 -0
  46. package/dist/core/types.d.ts.map +1 -0
  47. package/dist/core/types.js +6 -0
  48. package/dist/core/types.js.map +1 -0
  49. package/dist/index.js +135 -5
  50. package/dist/index.js.map +1 -1
  51. package/dist/state/getCollectorResults.d.ts +18 -0
  52. package/dist/state/getCollectorResults.d.ts.map +1 -0
  53. package/dist/state/getCollectorResults.js +25 -0
  54. package/dist/state/getCollectorResults.js.map +1 -0
  55. package/dist/state/historyStore.d.ts +35 -0
  56. package/dist/state/historyStore.d.ts.map +1 -0
  57. package/dist/state/historyStore.js +58 -0
  58. package/dist/state/historyStore.js.map +1 -0
  59. package/dist/state/uiStateBuilder.d.ts +12 -0
  60. package/dist/state/uiStateBuilder.d.ts.map +1 -0
  61. package/dist/state/uiStateBuilder.js +169 -0
  62. package/dist/state/uiStateBuilder.js.map +1 -0
  63. package/dist/state/uiStateScheduler.d.ts +43 -0
  64. package/dist/state/uiStateScheduler.d.ts.map +1 -0
  65. package/dist/state/uiStateScheduler.js +118 -0
  66. package/dist/state/uiStateScheduler.js.map +1 -0
  67. package/dist/ui/boot/sequence.d.ts +10 -0
  68. package/dist/ui/boot/sequence.d.ts.map +1 -0
  69. package/dist/ui/boot/sequence.js +173 -0
  70. package/dist/ui/boot/sequence.js.map +1 -0
  71. package/dist/ui/constraints/layoutSpec.d.ts +47 -0
  72. package/dist/ui/constraints/layoutSpec.d.ts.map +1 -0
  73. package/dist/ui/constraints/layoutSpec.js +60 -0
  74. package/dist/ui/constraints/layoutSpec.js.map +1 -0
  75. package/dist/ui/constraints/unknownHandling.d.ts +29 -0
  76. package/dist/ui/constraints/unknownHandling.d.ts.map +1 -0
  77. package/dist/ui/constraints/unknownHandling.js +60 -0
  78. package/dist/ui/constraints/unknownHandling.js.map +1 -0
  79. package/dist/ui/drilldowns/feed.d.ts +11 -0
  80. package/dist/ui/drilldowns/feed.d.ts.map +1 -0
  81. package/dist/ui/drilldowns/feed.js +68 -0
  82. package/dist/ui/drilldowns/feed.js.map +1 -0
  83. package/dist/ui/drilldowns/index.d.ts +7 -0
  84. package/dist/ui/drilldowns/index.d.ts.map +1 -0
  85. package/dist/ui/drilldowns/index.js +8 -0
  86. package/dist/ui/drilldowns/index.js.map +1 -0
  87. package/dist/ui/drilldowns/posture.d.ts +11 -0
  88. package/dist/ui/drilldowns/posture.d.ts.map +1 -0
  89. package/dist/ui/drilldowns/posture.js +74 -0
  90. package/dist/ui/drilldowns/posture.js.map +1 -0
  91. package/dist/ui/navigation/keymaps.d.ts +26 -0
  92. package/dist/ui/navigation/keymaps.d.ts.map +1 -0
  93. package/dist/ui/navigation/keymaps.js +135 -0
  94. package/dist/ui/navigation/keymaps.js.map +1 -0
  95. package/dist/ui/navigation/palette.d.ts +10 -0
  96. package/dist/ui/navigation/palette.d.ts.map +1 -0
  97. package/dist/ui/navigation/palette.js +133 -0
  98. package/dist/ui/navigation/palette.js.map +1 -0
  99. package/dist/ui/navigation/state.d.ts +47 -0
  100. package/dist/ui/navigation/state.d.ts.map +1 -0
  101. package/dist/ui/navigation/state.js +84 -0
  102. package/dist/ui/navigation/state.js.map +1 -0
  103. package/dist/ui/navigation/types.d.ts +38 -0
  104. package/dist/ui/navigation/types.d.ts.map +1 -0
  105. package/dist/ui/navigation/types.js +36 -0
  106. package/dist/ui/navigation/types.js.map +1 -0
  107. package/dist/ui/panels/active-assets.d.ts +12 -0
  108. package/dist/ui/panels/active-assets.d.ts.map +1 -0
  109. package/dist/ui/panels/active-assets.js +83 -0
  110. package/dist/ui/panels/active-assets.js.map +1 -0
  111. package/dist/ui/panels/capability-flags.d.ts +12 -0
  112. package/dist/ui/panels/capability-flags.d.ts.map +1 -0
  113. package/dist/ui/panels/capability-flags.js +59 -0
  114. package/dist/ui/panels/capability-flags.js.map +1 -0
  115. package/dist/ui/panels/command-surface.d.ts +12 -0
  116. package/dist/ui/panels/command-surface.d.ts.map +1 -0
  117. package/dist/ui/panels/command-surface.js +55 -0
  118. package/dist/ui/panels/command-surface.js.map +1 -0
  119. package/dist/ui/panels/network-origin.d.ts +12 -0
  120. package/dist/ui/panels/network-origin.d.ts.map +1 -0
  121. package/dist/ui/panels/network-origin.js +79 -0
  122. package/dist/ui/panels/network-origin.js.map +1 -0
  123. package/dist/ui/panels/operations-feed.d.ts +12 -0
  124. package/dist/ui/panels/operations-feed.d.ts.map +1 -0
  125. package/dist/ui/panels/operations-feed.js +90 -0
  126. package/dist/ui/panels/operations-feed.js.map +1 -0
  127. package/dist/ui/panels/posture.d.ts +12 -0
  128. package/dist/ui/panels/posture.d.ts.map +1 -0
  129. package/dist/ui/panels/posture.js +84 -0
  130. package/dist/ui/panels/posture.js.map +1 -0
  131. package/dist/ui/panels/resources.d.ts +11 -0
  132. package/dist/ui/panels/resources.d.ts.map +1 -0
  133. package/dist/ui/panels/resources.js +88 -0
  134. package/dist/ui/panels/resources.js.map +1 -0
  135. package/dist/ui/primitives/Panel.d.ts +25 -0
  136. package/dist/ui/primitives/Panel.d.ts.map +1 -0
  137. package/dist/ui/primitives/Panel.js +59 -0
  138. package/dist/ui/primitives/Panel.js.map +1 -0
  139. package/dist/ui/rendering/metricRenderer.d.ts +24 -0
  140. package/dist/ui/rendering/metricRenderer.d.ts.map +1 -0
  141. package/dist/ui/rendering/metricRenderer.js +86 -0
  142. package/dist/ui/rendering/metricRenderer.js.map +1 -0
  143. package/dist/ui/runtime/hub.d.ts +12 -0
  144. package/dist/ui/runtime/hub.d.ts.map +1 -0
  145. package/dist/ui/runtime/hub.js +468 -0
  146. package/dist/ui/runtime/hub.js.map +1 -0
  147. package/dist/ui/runtime/hubValidation.d.ts +23 -0
  148. package/dist/ui/runtime/hubValidation.d.ts.map +1 -0
  149. package/dist/ui/runtime/hubValidation.js +90 -0
  150. package/dist/ui/runtime/hubValidation.js.map +1 -0
  151. package/dist/ui/runtime/index.d.ts +29 -0
  152. package/dist/ui/runtime/index.d.ts.map +1 -0
  153. package/dist/ui/runtime/index.js +299 -0
  154. package/dist/ui/runtime/index.js.map +1 -0
  155. package/dist/ui/runtime/no-tui.d.ts +12 -0
  156. package/dist/ui/runtime/no-tui.d.ts.map +1 -0
  157. package/dist/ui/runtime/no-tui.js +77 -0
  158. package/dist/ui/runtime/no-tui.js.map +1 -0
  159. package/dist/ui/runtime/state-builder.d.ts +13 -0
  160. package/dist/ui/runtime/state-builder.d.ts.map +1 -0
  161. package/dist/ui/runtime/state-builder.js +114 -0
  162. package/dist/ui/runtime/state-builder.js.map +1 -0
  163. package/dist/ui/runtime/terminalSizeCheck.d.ts +10 -0
  164. package/dist/ui/runtime/terminalSizeCheck.d.ts.map +1 -0
  165. package/dist/ui/runtime/terminalSizeCheck.js +51 -0
  166. package/dist/ui/runtime/terminalSizeCheck.js.map +1 -0
  167. package/dist/ui/runtime/tuiLogGate.d.ts +22 -0
  168. package/dist/ui/runtime/tuiLogGate.d.ts.map +1 -0
  169. package/dist/ui/runtime/tuiLogGate.js +68 -0
  170. package/dist/ui/runtime/tuiLogGate.js.map +1 -0
  171. package/dist/ui/state/types.d.ts +72 -0
  172. package/dist/ui/state/types.d.ts.map +1 -0
  173. package/dist/ui/state/types.js +6 -0
  174. package/dist/ui/state/types.js.map +1 -0
  175. package/dist/ui/theme/borders.d.ts +20 -0
  176. package/dist/ui/theme/borders.d.ts.map +1 -0
  177. package/dist/ui/theme/borders.js +55 -0
  178. package/dist/ui/theme/borders.js.map +1 -0
  179. package/dist/ui/theme/tokens.d.ts +28 -0
  180. package/dist/ui/theme/tokens.d.ts.map +1 -0
  181. package/dist/ui/theme/tokens.js +50 -0
  182. package/dist/ui/theme/tokens.js.map +1 -0
  183. package/dist/ui/theme/typography.d.ts +14 -0
  184. package/dist/ui/theme/typography.d.ts.map +1 -0
  185. package/dist/ui/theme/typography.js +30 -0
  186. package/dist/ui/theme/typography.js.map +1 -0
  187. package/dist/ui/widgets/flagRow.d.ts +25 -0
  188. package/dist/ui/widgets/flagRow.d.ts.map +1 -0
  189. package/dist/ui/widgets/flagRow.js +57 -0
  190. package/dist/ui/widgets/flagRow.js.map +1 -0
  191. package/dist/ui/widgets/index.d.ts +9 -0
  192. package/dist/ui/widgets/index.d.ts.map +1 -0
  193. package/dist/ui/widgets/index.js +9 -0
  194. package/dist/ui/widgets/index.js.map +1 -0
  195. package/dist/ui/widgets/meter.d.ts +18 -0
  196. package/dist/ui/widgets/meter.d.ts.map +1 -0
  197. package/dist/ui/widgets/meter.js +38 -0
  198. package/dist/ui/widgets/meter.js.map +1 -0
  199. package/dist/ui/widgets/miniMap.d.ts +26 -0
  200. package/dist/ui/widgets/miniMap.d.ts.map +1 -0
  201. package/dist/ui/widgets/miniMap.js +94 -0
  202. package/dist/ui/widgets/miniMap.js.map +1 -0
  203. package/dist/ui/widgets/sparkline.d.ts +17 -0
  204. package/dist/ui/widgets/sparkline.d.ts.map +1 -0
  205. package/dist/ui/widgets/sparkline.js +63 -0
  206. package/dist/ui/widgets/sparkline.js.map +1 -0
  207. package/package.json +5 -4
  208. package/dist/ui/home-view.d.ts +0 -27
  209. package/dist/ui/home-view.d.ts.map +0 -1
  210. package/dist/ui/home-view.js +0 -127
  211. package/dist/ui/home-view.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/runtime/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAiBnD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAsIjB;AA6ID;;;GAGG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CASxC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAEjD"}
@@ -0,0 +1,299 @@
1
+ /**
2
+ * UI Runtime Layer
3
+ * Phase 1: TUI console app initialization and management
4
+ */
5
+ import blessed from 'neo-blessed';
6
+ import { navigationState } from '../navigation/state.js';
7
+ import { handleGlobalKey, handleHubKey, handleDrilldownKey, handlePaletteKey } from '../navigation/keymaps.js';
8
+ import { fuzzyMatch } from '../navigation/palette.js';
9
+ import { renderPostureDrilldown, renderFeedDrilldown } from '../drilldowns/index.js';
10
+ import { checkAndRenderTerminalSize } from './terminalSizeCheck.js';
11
+ import { initTuiLogGate, restoreConsoleMethods } from './tuiLogGate.js';
12
+ import { validatePanelCollectorIntegrity } from '../../core/collectorRegistry.js';
13
+ // Type assertion for blessed
14
+ const blessedLib = blessed;
15
+ let screen = null;
16
+ let currentUiState = null;
17
+ let paletteInput = '';
18
+ let lastPanelStates = new Map(); // Phase 7: Dirty panel tracking
19
+ /**
20
+ * Create and initialize the console app
21
+ * Handles clean exit and prevents terminal from being left in broken state
22
+ */
23
+ export function createConsoleApp(options) {
24
+ // Phase 8: Initialize TUI log gate
25
+ const isDev = process.env.NODE_ENV === 'development' || process.env.DEV === '1';
26
+ initTuiLogGate(isDev);
27
+ // Phase 8: Validate panel-collector integrity at startup
28
+ const hubPanels = ['POSTURE', 'RESOURCES', 'ASSETS', 'FEED', 'NETWORK', 'CAPABILITIES'];
29
+ const integrityCheck = validatePanelCollectorIntegrity(hubPanels, isDev);
30
+ if (!integrityCheck.valid) {
31
+ if (isDev) {
32
+ throw new Error(`Panel-collector integrity check failed:\n${integrityCheck.errors.join('\n')}`);
33
+ }
34
+ else {
35
+ // In prod, log but continue (will show SAFE HOLD if needed)
36
+ console.error(`[SAFE HOLD] Panel-collector integrity issues: ${integrityCheck.errors.join(', ')}`);
37
+ }
38
+ }
39
+ // Create blessed screen
40
+ screen = blessedLib.screen({
41
+ smartCSR: true,
42
+ title: options?.title || '4Runr OS Intelligence Console',
43
+ fullUnicode: options?.fullUnicode || false,
44
+ autoPadding: true,
45
+ cursor: {
46
+ artificial: true,
47
+ shape: 'line',
48
+ blink: true,
49
+ },
50
+ });
51
+ // Phase 8: Check terminal size
52
+ if (!screen || !checkAndRenderTerminalSize(screen)) {
53
+ // Terminal too small - fallback screen already rendered
54
+ return screen;
55
+ }
56
+ // Set up key handlers
57
+ if (screen) {
58
+ // Global keys
59
+ screen.key(['escape', 'q', 'C-c', ':', '?'], (ch, key) => {
60
+ const screenState = navigationState.getScreen();
61
+ const keyName = key.name || ch;
62
+ if (handleGlobalKey(keyName, screenState)) {
63
+ renderCurrentScreen();
64
+ return;
65
+ }
66
+ if (screenState.name === "HUB" && handleHubKey(keyName, screenState)) {
67
+ renderCurrentScreen();
68
+ return;
69
+ }
70
+ if (screenState.name === "DRILLDOWN" && handleDrilldownKey(keyName, screenState)) {
71
+ renderCurrentScreen();
72
+ return;
73
+ }
74
+ if (screenState.name === "PALETTE") {
75
+ const result = handlePaletteKey(keyName, screenState, paletteInput);
76
+ if (result.handled) {
77
+ if (result.newInput !== undefined) {
78
+ paletteInput = result.newInput;
79
+ const suggestions = fuzzyMatch(paletteInput);
80
+ navigationState.goToPalette(paletteInput, suggestions);
81
+ }
82
+ if (result.execute) {
83
+ const suggestions = fuzzyMatch(paletteInput);
84
+ if (suggestions.length > 0) {
85
+ suggestions[0].action();
86
+ paletteInput = '';
87
+ }
88
+ }
89
+ renderCurrentScreen();
90
+ return;
91
+ }
92
+ // Handle character input for palette
93
+ if (ch && ch.length === 1 && ch >= ' ') {
94
+ paletteInput += ch;
95
+ const suggestions = fuzzyMatch(paletteInput);
96
+ navigationState.goToPalette(paletteInput, suggestions);
97
+ renderCurrentScreen();
98
+ return;
99
+ }
100
+ }
101
+ });
102
+ // Tab key
103
+ screen.key(['tab', 'S-tab'], (ch, key) => {
104
+ const screenState = navigationState.getScreen();
105
+ if (screenState.name === "HUB") {
106
+ handleHubKey(key.name === 'S-tab' ? 'S-tab' : 'tab', screenState);
107
+ renderCurrentScreen();
108
+ }
109
+ });
110
+ // Enter key
111
+ screen.key(['enter'], () => {
112
+ const screenState = navigationState.getScreen();
113
+ if (screenState.name === "HUB") {
114
+ handleHubKey('enter', screenState);
115
+ renderCurrentScreen();
116
+ }
117
+ });
118
+ // Arrow keys for drilldowns
119
+ screen.key(['up', 'down', 'left', 'right', 'k', 'j'], (ch, key) => {
120
+ const screenState = navigationState.getScreen();
121
+ if (screenState.name === "DRILLDOWN") {
122
+ handleDrilldownKey(key.name || ch, screenState);
123
+ renderCurrentScreen();
124
+ }
125
+ });
126
+ // Character input for palette (handle in global key handler)
127
+ // Note: Character input is handled via the ':' key opening palette, then regular keypress events
128
+ }
129
+ // Subscribe to navigation changes
130
+ navigationState.subscribe(() => {
131
+ renderCurrentScreen();
132
+ });
133
+ // Prevent terminal from being left in broken state
134
+ process.on('SIGINT', () => {
135
+ destroyConsoleApp();
136
+ });
137
+ process.on('SIGTERM', () => {
138
+ destroyConsoleApp();
139
+ });
140
+ return screen; // Non-null assertion - we just set it above
141
+ }
142
+ /**
143
+ * Render current screen based on navigation state
144
+ * Phase 7: Implements dirty panel rendering (minimize repaint)
145
+ */
146
+ function renderCurrentScreen() {
147
+ if (!screen || !currentUiState)
148
+ return;
149
+ const screenState = navigationState.getScreen();
150
+ // Phase 7: Check if state changed (dirty panel optimization)
151
+ const stateHash = JSON.stringify({
152
+ ts: currentUiState.ts,
153
+ posture: currentUiState.posture.posture,
154
+ focused: screenState.name === "HUB" ? screenState.focusedPanelId : null,
155
+ });
156
+ const lastHash = lastPanelStates.get('hub');
157
+ const isDirty = lastHash !== stateHash;
158
+ if (!isDirty && screenState.name === "HUB") {
159
+ // State unchanged, skip full re-render (micro-motion policy)
160
+ return;
161
+ }
162
+ // Clear screen
163
+ screen.children.forEach((child) => child.destroy());
164
+ if (screenState.name === "HUB") {
165
+ // Render hub with focus
166
+ const { renderHub } = require('./hub.js');
167
+ renderHub(screen, currentUiState, screenState.focusedPanelId);
168
+ lastPanelStates.set('hub', stateHash);
169
+ }
170
+ else if (screenState.name === "DRILLDOWN") {
171
+ // Render drilldown
172
+ let drilldown;
173
+ if (screenState.panelId === "POSTURE") {
174
+ drilldown = renderPostureDrilldown(screen, currentUiState, screenState.cursor, screenState.filter);
175
+ }
176
+ else if (screenState.panelId === "FEED") {
177
+ drilldown = renderFeedDrilldown(screen, currentUiState, screenState.cursor, screenState.filter);
178
+ }
179
+ else {
180
+ // Placeholder for other drilldowns
181
+ const { createPanel } = require('../primitives/Panel.js');
182
+ drilldown = createPanel(screen, {
183
+ title: screenState.panelId,
184
+ top: 0,
185
+ left: 0,
186
+ width: screen.width,
187
+ height: screen.height,
188
+ content: [`NOT IMPLEMENTED: ${screenState.panelId} drilldown`],
189
+ });
190
+ }
191
+ screen.append(drilldown);
192
+ }
193
+ else if (screenState.name === "PALETTE") {
194
+ // Render palette
195
+ renderPalette(screen, screenState.input, screenState.suggestions);
196
+ }
197
+ else if (screenState.name === "HELP") {
198
+ // Render help
199
+ renderHelp(screen);
200
+ }
201
+ screen.render();
202
+ }
203
+ /**
204
+ * Render command palette
205
+ */
206
+ function renderPalette(screen, input, suggestions) {
207
+ const { getBlessedColor } = require('../theme/tokens.js');
208
+ const blessed = require('neo-blessed');
209
+ const blessedLib = blessed;
210
+ const width = screen.width;
211
+ const height = screen.height;
212
+ const paletteHeight = Math.min(12, height);
213
+ const paletteTop = Math.floor((height - paletteHeight) / 2);
214
+ // Palette box
215
+ const paletteBox = blessedLib.box({
216
+ top: paletteTop,
217
+ left: Math.floor((width - 60) / 2),
218
+ width: 60,
219
+ height: paletteHeight,
220
+ border: { type: 'line' },
221
+ style: {
222
+ border: { fg: getBlessedColor('primaryPurple') },
223
+ },
224
+ tags: true,
225
+ });
226
+ const content = [];
227
+ content.push(`{${getBlessedColor('primaryPurple')}-fg}COMMAND PALETTE{/}`);
228
+ content.push('');
229
+ content.push(`:{${getBlessedColor('accentCyan')}-fg}${input}{/}_`);
230
+ content.push('');
231
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Suggestions:{/}`);
232
+ suggestions.slice(0, 6).forEach((item, idx) => {
233
+ const prefix = idx === 0 ? '→ ' : ' ';
234
+ content.push(`${prefix}{${getBlessedColor('accentCyan')}-fg}${item.command}{/} {${getBlessedColor('mutedGrey')}-fg}${item.description}{/}`);
235
+ });
236
+ content.push('');
237
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Enter: execute | Esc: cancel{/}`);
238
+ paletteBox.setContent(content.join('\n'));
239
+ screen.append(paletteBox);
240
+ }
241
+ /**
242
+ * Render help screen
243
+ */
244
+ function renderHelp(screen) {
245
+ const { createPanel } = require('../primitives/Panel.js');
246
+ const { getBlessedColor } = require('../theme/tokens.js');
247
+ const content = [];
248
+ content.push(`{${getBlessedColor('primaryPurple')}-fg}KEY BINDINGS{/}`);
249
+ content.push('');
250
+ content.push('Tab Next panel focus');
251
+ content.push('Enter Open drilldown');
252
+ content.push('Esc Back to hub');
253
+ content.push(': Command palette');
254
+ content.push('/ Search (when FEED focused)');
255
+ content.push('? Toggle help');
256
+ content.push('q Quit');
257
+ content.push('');
258
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Press Esc to return{/}`);
259
+ const panel = createPanel(screen, {
260
+ title: 'HELP',
261
+ top: 0,
262
+ left: 0,
263
+ width: screen.width,
264
+ height: screen.height,
265
+ content,
266
+ });
267
+ screen.append(panel);
268
+ }
269
+ /**
270
+ * Render the hub grid layout
271
+ * Phase 6: Render from UiState snapshot with focus support
272
+ */
273
+ export async function renderHubLayout(uiState) {
274
+ if (!screen) {
275
+ throw new Error('Console app not initialized. Call createConsoleApp() first.');
276
+ }
277
+ currentUiState = uiState;
278
+ renderCurrentScreen();
279
+ }
280
+ /**
281
+ * Destroy console app and restore terminal
282
+ * Safely exits and returns terminal to normal state
283
+ */
284
+ export function destroyConsoleApp() {
285
+ // Phase 8: Restore console methods
286
+ restoreConsoleMethods();
287
+ if (screen) {
288
+ screen.destroy();
289
+ screen = null;
290
+ }
291
+ process.exit(0);
292
+ }
293
+ /**
294
+ * Get current screen instance
295
+ */
296
+ export function getScreen() {
297
+ return screen;
298
+ }
299
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/runtime/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * NO_TUI Fallback Mode
3
+ * Phase 1: Text-based hub when NO_TUI=1 is set
4
+ */
5
+ import type { UiState } from '../../core/types.js';
6
+ /**
7
+ * Render text-based hub (NO_TUI mode)
8
+ * Prints a simple hub summary using plain text
9
+ * Must follow "no fake data": print UNKNOWN values explicitly
10
+ */
11
+ export declare function renderTextHub(state: UiState): void;
12
+ //# sourceMappingURL=no-tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-tui.d.ts","sourceRoot":"","sources":["../../../src/ui/runtime/no-tui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAsElD"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * NO_TUI Fallback Mode
3
+ * Phase 1: Text-based hub when NO_TUI=1 is set
4
+ */
5
+ /**
6
+ * Render text-based hub (NO_TUI mode)
7
+ * Prints a simple hub summary using plain text
8
+ * Must follow "no fake data": print UNKNOWN values explicitly
9
+ */
10
+ export function renderTextHub(state) {
11
+ console.clear();
12
+ console.log('═══════════════════════════════════════════════════════════════');
13
+ console.log(' 4Runr OS Intelligence Console (NO_TUI Mode)');
14
+ console.log('═══════════════════════════════════════════════════════════════');
15
+ console.log();
16
+ // System Posture
17
+ console.log('SYSTEM POSTURE');
18
+ console.log('───────────────────────────────────────────────────────────────');
19
+ console.log(` POSTURE: ${state.posture.posture}`);
20
+ console.log(` RISK: ${state.posture.risk}`);
21
+ console.log(` CONNECTED: ${state.posture.connected}`);
22
+ console.log();
23
+ // Network Context
24
+ console.log('NETWORK CONTEXT');
25
+ console.log('───────────────────────────────────────────────────────────────');
26
+ if (state.geo) {
27
+ console.log(` ORIGIN: ${state.geo.originLabel}`);
28
+ console.log(` ROUTE: ${state.geo.routeLabel}`);
29
+ console.log(` GATEWAY: ${state.geo.gatewayRegion}`);
30
+ console.log(` DATABASE: ${state.geo.dbRegion}`);
31
+ console.log(` PING: ${state.geo.pingMs !== 'UNKNOWN' ? `${state.geo.pingMs}ms ${state.geo.pingClass}` : 'UNKNOWN'}`);
32
+ }
33
+ else {
34
+ console.log(` ORIGIN: ${state.network.originRegion}`);
35
+ console.log(` GATEWAY: ${state.network.gatewayRegion}`);
36
+ console.log(` DATABASE: ${state.network.dbRegion}`);
37
+ console.log(` LATENCY: ${state.network.latencyClass}`);
38
+ }
39
+ console.log();
40
+ // Asset Registry
41
+ console.log('ASSET REGISTRY');
42
+ console.log('───────────────────────────────────────────────────────────────');
43
+ console.log(` TOTAL: ${state.assets.total}`);
44
+ console.log(` ACTIVE: ${state.assets.active}`);
45
+ console.log(` IDLE: ${state.assets.idle}`);
46
+ console.log(` ERROR: ${state.assets.error}`);
47
+ if (state.assets.highlight !== 'UNKNOWN') {
48
+ console.log(` HIGHLIGHTED: ${state.assets.highlight}`);
49
+ }
50
+ console.log();
51
+ // Operation Feed
52
+ console.log('OPERATION FEED');
53
+ console.log('───────────────────────────────────────────────────────────────');
54
+ if (state.feed.events.length > 0) {
55
+ state.feed.events.forEach(event => {
56
+ const time = new Date(event.ts).toLocaleTimeString();
57
+ console.log(` [${time}] [${event.tag}] ${event.msg}`);
58
+ });
59
+ }
60
+ else {
61
+ console.log(' No recent operations');
62
+ }
63
+ console.log();
64
+ // Capability Flags
65
+ console.log('CAPABILITY FLAGS');
66
+ console.log('───────────────────────────────────────────────────────────────');
67
+ console.log(` GATEWAY: ${state.capabilities.gateway}`);
68
+ console.log(` DATABASE: ${state.capabilities.database}`);
69
+ console.log(` MEMORY: ${state.capabilities.memory}`);
70
+ console.log(` SECURITY: ${state.capabilities.security}`);
71
+ console.log(` RATE LIMIT: ${state.capabilities.rateLimit}`);
72
+ console.log();
73
+ console.log('═══════════════════════════════════════════════════════════════');
74
+ console.log(' Set NO_TUI=0 to enable TUI mode');
75
+ console.log('═══════════════════════════════════════════════════════════════');
76
+ }
77
+ //# sourceMappingURL=no-tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-tui.js","sourceRoot":"","sources":["../../../src/ui/runtime/no-tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * State Builder
3
+ * Phase 1: Build UiState from AppState (or use UNKNOWN if not available)
4
+ */
5
+ import type { AppState } from '../../store.js';
6
+ import type { UiState } from '../state/types.js';
7
+ /**
8
+ * Build UI state from application state
9
+ * Uses real values if available, otherwise UNKNOWN
10
+ * NO FAKE DATA - this is a hard requirement
11
+ */
12
+ export declare function buildUiState(appState: AppState): UiState;
13
+ //# sourceMappingURL=state-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-builder.d.ts","sourceRoot":"","sources":["../../../src/ui/runtime/state-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAGjD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CA2GxD"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * State Builder
3
+ * Phase 1: Build UiState from AppState (or use UNKNOWN if not available)
4
+ */
5
+ import { getSystemState } from '../../system-state.js';
6
+ /**
7
+ * Build UI state from application state
8
+ * Uses real values if available, otherwise UNKNOWN
9
+ * NO FAKE DATA - this is a hard requirement
10
+ */
11
+ export function buildUiState(appState) {
12
+ // Try to get system state if available
13
+ let systemState;
14
+ try {
15
+ systemState = getSystemState(appState, false);
16
+ }
17
+ catch {
18
+ systemState = null;
19
+ }
20
+ // System Posture
21
+ const system_posture = systemState
22
+ ? {
23
+ overallPosture: systemState.systemPosture.overallPosture,
24
+ executionMode: systemState.systemPosture.executionMode,
25
+ riskLevel: systemState.systemPosture.riskLevel,
26
+ }
27
+ : {
28
+ overallPosture: 'UNKNOWN',
29
+ executionMode: 'UNKNOWN',
30
+ riskLevel: 'UNKNOWN',
31
+ };
32
+ // Network Context
33
+ const network_context = systemState
34
+ ? {
35
+ operatorOrigin: {
36
+ region: systemState.networkContext.operatorOrigin.region || 'UNKNOWN',
37
+ networkType: systemState.networkContext.operatorOrigin.networkType,
38
+ },
39
+ targetInfrastructure: {
40
+ gatewayRegion: systemState.networkContext.targetInfrastructure.gatewayRegion || 'UNKNOWN',
41
+ databaseRegion: systemState.networkContext.targetInfrastructure.databaseRegion || 'UNKNOWN',
42
+ latencyClass: systemState.networkContext.targetInfrastructure.latencyClass,
43
+ },
44
+ }
45
+ : {
46
+ operatorOrigin: {
47
+ region: 'UNKNOWN',
48
+ networkType: 'UNKNOWN',
49
+ },
50
+ targetInfrastructure: {
51
+ gatewayRegion: 'UNKNOWN',
52
+ databaseRegion: 'UNKNOWN',
53
+ latencyClass: 'UNKNOWN',
54
+ },
55
+ };
56
+ // Asset Registry Summary
57
+ const asset_registry_summary = systemState
58
+ ? {
59
+ total: systemState.assetRegistrySummary.total,
60
+ active: systemState.assetRegistrySummary.active,
61
+ idle: systemState.assetRegistrySummary.idle,
62
+ error: systemState.assetRegistrySummary.error,
63
+ highlighted: systemState.assetRegistrySummary.highlighted
64
+ ? {
65
+ name: systemState.assetRegistrySummary.highlighted.name,
66
+ status: systemState.assetRegistrySummary.highlighted.status,
67
+ }
68
+ : null,
69
+ }
70
+ : {
71
+ total: 0,
72
+ active: 0,
73
+ idle: 0,
74
+ error: 0,
75
+ highlighted: null,
76
+ };
77
+ // Operation Feed
78
+ const operation_feed = systemState
79
+ ? {
80
+ events: systemState.operationFeed.map(e => ({
81
+ type: e.type,
82
+ description: e.description,
83
+ timestamp: e.timestamp,
84
+ severity: e.severity,
85
+ })),
86
+ }
87
+ : {
88
+ events: [],
89
+ };
90
+ // Capability Flags
91
+ const capability_flags = systemState
92
+ ? {
93
+ gateway: systemState.capabilityFlags.gateway,
94
+ database: systemState.capabilityFlags.database,
95
+ memoryLayer: systemState.capabilityFlags.memoryLayer,
96
+ security: systemState.capabilityFlags.security,
97
+ rateLimiting: systemState.capabilityFlags.rateLimiting,
98
+ }
99
+ : {
100
+ gateway: 'UNKNOWN',
101
+ database: 'UNKNOWN',
102
+ memoryLayer: 'UNKNOWN',
103
+ security: 'UNKNOWN',
104
+ rateLimiting: 'UNKNOWN',
105
+ };
106
+ return {
107
+ system_posture,
108
+ network_context,
109
+ asset_registry_summary,
110
+ operation_feed,
111
+ capability_flags,
112
+ };
113
+ }
114
+ //# sourceMappingURL=state-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-builder.js","sourceRoot":"","sources":["../../../src/ui/runtime/state-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Terminal Size Check
3
+ * Phase 8: Runtime check for terminal size
4
+ */
5
+ import type { Widgets } from 'neo-blessed';
6
+ /**
7
+ * Check terminal size and render fallback if too small
8
+ */
9
+ export declare function checkAndRenderTerminalSize(screen: Widgets.Screen): boolean;
10
+ //# sourceMappingURL=terminalSizeCheck.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalSizeCheck.d.ts","sourceRoot":"","sources":["../../../src/ui/runtime/terminalSizeCheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAY1E"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Terminal Size Check
3
+ * Phase 8: Runtime check for terminal size
4
+ */
5
+ import { checkTerminalSize } from '../constraints/layoutSpec.js';
6
+ import { getBlessedColor } from '../theme/tokens.js';
7
+ /**
8
+ * Check terminal size and render fallback if too small
9
+ */
10
+ export function checkAndRenderTerminalSize(screen) {
11
+ const width = screen.width;
12
+ const height = screen.height;
13
+ const check = checkTerminalSize(width, height);
14
+ if (!check.valid) {
15
+ renderTerminalTooSmallScreen(screen, width, height, check.message);
16
+ return false;
17
+ }
18
+ return true;
19
+ }
20
+ /**
21
+ * Render fallback screen when terminal is too small
22
+ */
23
+ function renderTerminalTooSmallScreen(screen, currentWidth, currentHeight, message) {
24
+ const blessed = require('neo-blessed');
25
+ const blessedLib = blessed;
26
+ // Clear screen
27
+ screen.children.forEach((child) => child.destroy());
28
+ const fallbackBox = blessedLib.box({
29
+ top: 0,
30
+ left: 0,
31
+ width: screen.width,
32
+ height: screen.height,
33
+ border: { type: 'line' },
34
+ style: {
35
+ border: { fg: getBlessedColor('warnAmber') },
36
+ },
37
+ tags: true,
38
+ });
39
+ const content = [];
40
+ content.push('');
41
+ content.push(`{${getBlessedColor('warnAmber')}-fg}{bold}TERMINAL TOO SMALL{/bold}`);
42
+ content.push('');
43
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Current size: ${currentWidth}x${currentHeight}{/}`);
44
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Required: 120x35{/}`);
45
+ content.push('');
46
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Hint: resize terminal or set NO_TUI=1{/}`);
47
+ fallbackBox.setContent(content.join('\n'));
48
+ screen.append(fallbackBox);
49
+ screen.render();
50
+ }
51
+ //# sourceMappingURL=terminalSizeCheck.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminalSizeCheck.js","sourceRoot":"","sources":["../../../src/ui/runtime/terminalSizeCheck.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAsB;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAe,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAgB,CAAC;IAEvC,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAE/C,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,4BAA4B,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,OAAQ,CAAC,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B,CACnC,MAAsB,EACtB,YAAoB,EACpB,aAAqB,EACrB,OAAe;IAEf,MAAM,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,UAAU,GAAQ,OAAO,CAAC;IAEhC,eAAe;IACf,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAEzD,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;QACjC,GAAG,EAAE,CAAC;QACN,IAAI,EAAE,CAAC;QACP,KAAK,EAAE,MAAM,CAAC,KAAe;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAgB;QAC/B,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QACxB,KAAK,EAAE;YACL,MAAM,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,WAAW,CAAC,EAAE;SAC7C;QACD,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC;IACpF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,WAAW,CAAC,qBAAqB,YAAY,IAAI,aAAa,KAAK,CAAC,CAAC;IACtG,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,WAAW,CAAC,8CAA8C,CAAC,CAAC;IAE7F,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;AAClB,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * TUI Log Gate
3
+ * Phase 8: Prevent unstructured prints during TUI mode
4
+ */
5
+ /**
6
+ * Initialize TUI log gate
7
+ * Overrides console methods to prevent unstructured prints
8
+ */
9
+ export declare function initTuiLogGate(isDev?: boolean): void;
10
+ /**
11
+ * Restore original console methods
12
+ */
13
+ export declare function restoreConsoleMethods(): void;
14
+ /**
15
+ * Get debug buffer (for optional debug panel)
16
+ */
17
+ export declare function getDebugBuffer(): string[];
18
+ /**
19
+ * Clear debug buffer
20
+ */
21
+ export declare function clearDebugBuffer(): void;
22
+ //# sourceMappingURL=tuiLogGate.d.ts.map