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":"uiStateBuilder.d.ts","sourceRoot":"","sources":["../../src/state/uiStateBuilder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAe5C;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAsKvE"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * UiState Builder
3
+ * Phase 3: Merge collector results into single UiState snapshot
4
+ */
5
+ import { collectPosture } from '../collectors/collector_posture.js';
6
+ import { collectNetwork } from '../collectors/collector_network.js';
7
+ import { collectResources } from '../collectors/collector_resources.js';
8
+ import { collectAssets } from '../collectors/collector_assets.js';
9
+ import { collectCapabilities } from '../collectors/collector_capabilities.js';
10
+ import { collectFeed } from '../collectors/collector_feed.js';
11
+ import { collectGeo } from '../collectors/collector_geo.js';
12
+ import { historyStore } from './historyStore.js';
13
+ import { setCollectorResults } from './getCollectorResults.js';
14
+ // Cache for expensive collectors
15
+ let cachedNetwork = null;
16
+ const NETWORK_CACHE_MS = 30000; // 30 seconds
17
+ /**
18
+ * Build UiState from collectors
19
+ * Pure-ish and testable
20
+ */
21
+ export async function buildUiState(appState) {
22
+ const now = Date.now();
23
+ // Collect all data (some cached, some fresh)
24
+ const [postureResult, networkResult, resourcesResult, assetsResult, capabilitiesResult, feedResult, geoResult,] = await Promise.all([
25
+ collectPosture(appState),
26
+ (async () => {
27
+ // Cache network collector (expensive)
28
+ if (cachedNetwork && (now - cachedNetwork.ts) < NETWORK_CACHE_MS) {
29
+ return cachedNetwork.result;
30
+ }
31
+ const result = await collectNetwork(appState);
32
+ cachedNetwork = { result, ts: now };
33
+ return result;
34
+ })(),
35
+ collectResources(),
36
+ collectAssets(appState),
37
+ collectCapabilities(appState),
38
+ collectFeed(),
39
+ collectGeo(appState),
40
+ ]);
41
+ // Phase 9: Calculate freshness from asOf (new contract) or ts (legacy)
42
+ const freshness = {
43
+ posture: (now - (postureResult.asOf || postureResult.ts || now)) < postureResult.staleAfterMs ? "FRESH" : "STALE",
44
+ network: (now - (networkResult.asOf || networkResult.ts || now)) < networkResult.staleAfterMs ? "FRESH" : "STALE",
45
+ resources: (now - (resourcesResult.asOf || resourcesResult.ts || now)) < resourcesResult.staleAfterMs ? "FRESH" : "STALE",
46
+ assets: (now - (assetsResult.asOf || assetsResult.ts || now)) < assetsResult.staleAfterMs ? "FRESH" : "STALE",
47
+ capabilities: (now - (capabilitiesResult.asOf || capabilitiesResult.ts || now)) < capabilitiesResult.staleAfterMs ? "FRESH" : "STALE",
48
+ };
49
+ // Phase 9: Store collector results for validation
50
+ const resultsMap = new Map();
51
+ resultsMap.set('posture', postureResult);
52
+ resultsMap.set('network', networkResult);
53
+ resultsMap.set('resources', resourcesResult);
54
+ resultsMap.set('assets', assetsResult);
55
+ resultsMap.set('capabilities', capabilitiesResult);
56
+ resultsMap.set('feed', feedResult);
57
+ resultsMap.set('geo', geoResult);
58
+ setCollectorResults(resultsMap);
59
+ // Phase 9: Validate collector results before building UiState
60
+ // Check that all collectors have status and asOf
61
+ const collectorResults = [
62
+ { name: 'posture', result: postureResult },
63
+ { name: 'network', result: networkResult },
64
+ { name: 'resources', result: resourcesResult },
65
+ { name: 'assets', result: assetsResult },
66
+ { name: 'capabilities', result: capabilitiesResult },
67
+ { name: 'feed', result: feedResult },
68
+ { name: 'geo', result: geoResult },
69
+ ];
70
+ const invalidCollectors = collectorResults.filter(cr => !cr.result.status || !cr.result.asOf);
71
+ if (invalidCollectors.length > 0) {
72
+ // If in dev, throw; otherwise, log and continue with degraded state
73
+ const errorMsg = `Collector validation failed: ${invalidCollectors.map(c => c.name).join(', ')}`;
74
+ if (process.env.NODE_ENV === 'development' || process.env.DEV === '1') {
75
+ throw new Error(errorMsg);
76
+ }
77
+ else {
78
+ console.error(`[SAFE HOLD] ${errorMsg}`);
79
+ }
80
+ }
81
+ // Get history for sparklines
82
+ const history = {
83
+ cpu: historyStore.getSamples('cpu'),
84
+ ram: historyStore.getSamples('ram'),
85
+ latency: historyStore.getSamples('latency'),
86
+ };
87
+ // Phase 9: Build UiState (only include data if status is LIVE or STALE)
88
+ const uiState = {
89
+ ts: now,
90
+ posture: (postureResult.status === 'LIVE' || postureResult.status === 'STALE')
91
+ ? postureResult.data
92
+ : {
93
+ posture: 'UNKNOWN',
94
+ risk: 'UNKNOWN',
95
+ connected: 'UNKNOWN',
96
+ target: 'UNKNOWN',
97
+ lastChange: 'UNKNOWN',
98
+ cause: 'UNKNOWN',
99
+ dependencies: {
100
+ config: 'UNKNOWN',
101
+ gateway: 'UNKNOWN',
102
+ database: 'UNKNOWN',
103
+ registry: 'UNKNOWN',
104
+ },
105
+ },
106
+ network: (networkResult.status === 'LIVE' || networkResult.status === 'STALE')
107
+ ? networkResult.data
108
+ : {
109
+ originRegion: 'UNKNOWN',
110
+ originClass: 'UNKNOWN',
111
+ gatewayRegion: 'UNKNOWN',
112
+ dbRegion: 'UNKNOWN',
113
+ latencyMs: 'UNKNOWN',
114
+ latencyClass: 'UNKNOWN',
115
+ publicIpMasked: 'UNKNOWN',
116
+ },
117
+ resources: (resourcesResult.status === 'LIVE' || resourcesResult.status === 'STALE')
118
+ ? resourcesResult.data
119
+ : {
120
+ cpuPercent: 'UNKNOWN',
121
+ load1m: 'UNKNOWN',
122
+ ramUsedMb: 'UNKNOWN',
123
+ ramTotalMb: 'UNKNOWN',
124
+ diskUsedGb: 'UNKNOWN',
125
+ diskTotalGb: 'UNKNOWN',
126
+ uptimeSec: 'UNKNOWN',
127
+ procCount: 'UNKNOWN',
128
+ },
129
+ assets: (assetsResult.status === 'LIVE' || assetsResult.status === 'STALE')
130
+ ? assetsResult.data
131
+ : {
132
+ total: 'UNKNOWN',
133
+ active: 'UNKNOWN',
134
+ idle: 'UNKNOWN',
135
+ error: 'UNKNOWN',
136
+ highlight: 'UNKNOWN',
137
+ lastAction: 'UNKNOWN',
138
+ },
139
+ capabilities: (capabilitiesResult.status === 'LIVE' || capabilitiesResult.status === 'STALE')
140
+ ? capabilitiesResult.data
141
+ : {
142
+ gateway: 'UNKNOWN',
143
+ database: 'UNKNOWN',
144
+ memory: 'UNKNOWN',
145
+ security: 'UNKNOWN',
146
+ rateLimit: 'UNKNOWN',
147
+ },
148
+ feed: (feedResult.status === 'LIVE' || feedResult.status === 'STALE')
149
+ ? feedResult.data
150
+ : { events: [] },
151
+ geo: (geoResult.status === 'LIVE' || geoResult.status === 'STALE')
152
+ ? geoResult.data
153
+ : {
154
+ originLabel: 'UNKNOWN',
155
+ originRegion: 'UNKNOWN',
156
+ gatewayRegion: 'UNKNOWN',
157
+ dbRegion: 'UNKNOWN',
158
+ routeLabel: 'UNKNOWN',
159
+ pingMs: 'UNKNOWN',
160
+ pingClass: 'UNKNOWN',
161
+ confidence: 'UNKNOWN',
162
+ source: 'NONE',
163
+ },
164
+ freshness,
165
+ history,
166
+ };
167
+ return uiState;
168
+ }
169
+ //# sourceMappingURL=uiStateBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiStateBuilder.js","sourceRoot":"","sources":["../../src/state/uiStateBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * UiState Scheduler
3
+ * Phase 3: Rebuild UiState on steady cadence, handle expensive checks slower
4
+ */
5
+ import type { AppState } from '../store.js';
6
+ import type { UiState } from '../core/types.js';
7
+ type UiStateUpdateHandler = (uiState: UiState) => void;
8
+ declare class UiStateScheduler {
9
+ private interval;
10
+ private handler;
11
+ private getAppState;
12
+ private refreshIntervalMs;
13
+ private networkIntervalMs;
14
+ constructor(refreshIntervalMs?: number, networkIntervalMs?: number);
15
+ /**
16
+ * Start scheduler
17
+ * getAppState is a function that returns current AppState (allows dynamic updates)
18
+ */
19
+ start(getAppState: () => AppState, handler: UiStateUpdateHandler): void;
20
+ /**
21
+ * Refresh UiState (rebuild from collectors)
22
+ */
23
+ private refresh;
24
+ /**
25
+ * Stop scheduler
26
+ */
27
+ stop(): void;
28
+ }
29
+ /**
30
+ * Get or create scheduler
31
+ */
32
+ export declare function getScheduler(): UiStateScheduler;
33
+ /**
34
+ * Start scheduler
35
+ * getAppState is a function that returns current AppState (allows dynamic updates)
36
+ */
37
+ export declare function startScheduler(getAppState: () => AppState, handler: UiStateUpdateHandler): void;
38
+ /**
39
+ * Stop scheduler
40
+ */
41
+ export declare function stopScheduler(): void;
42
+ export {};
43
+ //# sourceMappingURL=uiStateScheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiStateScheduler.d.ts","sourceRoot":"","sources":["../../src/state/uiStateScheduler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAKhD,KAAK,oBAAoB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AAEvD,cAAM,gBAAgB;IACpB,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;gBAGhC,iBAAiB,GAAE,MAAa,EAChC,iBAAiB,GAAE,MAAc;IAMnC;;;OAGG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,QAAQ,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAmBvE;;OAEG;YACW,OAAO;IAoCrB;;OAEG;IACH,IAAI,IAAI,IAAI;CAQb;AAOD;;GAEG;AACH,wBAAgB,YAAY,IAAI,gBAAgB,CAO/C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,QAAQ,EAAE,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAG/F;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAKpC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * UiState Scheduler
3
+ * Phase 3: Rebuild UiState on steady cadence, handle expensive checks slower
4
+ */
5
+ import { buildUiState } from './uiStateBuilder.js';
6
+ import { eventBus } from '../core/eventBus.js';
7
+ import { historyStore } from './historyStore.js';
8
+ class UiStateScheduler {
9
+ interval = null;
10
+ handler = null;
11
+ getAppState = null;
12
+ refreshIntervalMs;
13
+ networkIntervalMs;
14
+ constructor(refreshIntervalMs = 1500, networkIntervalMs = 30000) {
15
+ this.refreshIntervalMs = refreshIntervalMs;
16
+ this.networkIntervalMs = networkIntervalMs;
17
+ }
18
+ /**
19
+ * Start scheduler
20
+ * getAppState is a function that returns current AppState (allows dynamic updates)
21
+ */
22
+ start(getAppState, handler) {
23
+ this.getAppState = getAppState;
24
+ this.handler = handler;
25
+ // Initial build
26
+ this.refresh();
27
+ // Regular refresh loop
28
+ this.interval = setInterval(() => {
29
+ this.refresh();
30
+ }, this.refreshIntervalMs);
31
+ // Subscribe to feed events for instant updates
32
+ eventBus.subscribe(() => {
33
+ // Feed event occurred - rebuild UiState immediately
34
+ this.refresh();
35
+ });
36
+ }
37
+ /**
38
+ * Refresh UiState (rebuild from collectors)
39
+ */
40
+ async refresh() {
41
+ if (!this.getAppState || !this.handler) {
42
+ return;
43
+ }
44
+ try {
45
+ const appState = this.getAppState(); // Get fresh AppState
46
+ const uiState = await buildUiState(appState);
47
+ // Update history store for sparklines
48
+ if (typeof uiState.resources.cpuPercent === 'number') {
49
+ historyStore.addSample('cpu', uiState.resources.cpuPercent);
50
+ }
51
+ else {
52
+ historyStore.addSample('cpu', null);
53
+ }
54
+ if (typeof uiState.resources.ramUsedMb === 'number' && typeof uiState.resources.ramTotalMb === 'number') {
55
+ const ramPercent = (uiState.resources.ramUsedMb / uiState.resources.ramTotalMb) * 100;
56
+ historyStore.addSample('ram', ramPercent);
57
+ }
58
+ else {
59
+ historyStore.addSample('ram', null);
60
+ }
61
+ if (typeof uiState.network.latencyMs === 'number') {
62
+ historyStore.addSample('latency', uiState.network.latencyMs);
63
+ }
64
+ else {
65
+ historyStore.addSample('latency', null);
66
+ }
67
+ this.handler(uiState);
68
+ }
69
+ catch (error) {
70
+ // Silently fail - don't break scheduler
71
+ console.error('[UiStateScheduler] Build error:', error);
72
+ }
73
+ }
74
+ /**
75
+ * Stop scheduler
76
+ */
77
+ stop() {
78
+ if (this.interval) {
79
+ clearInterval(this.interval);
80
+ this.interval = null;
81
+ }
82
+ this.handler = null;
83
+ this.getAppState = null;
84
+ }
85
+ }
86
+ /**
87
+ * Global scheduler instance
88
+ */
89
+ let scheduler = null;
90
+ /**
91
+ * Get or create scheduler
92
+ */
93
+ export function getScheduler() {
94
+ if (!scheduler) {
95
+ const refreshMs = parseInt(process.env.UI_REFRESH_MS || '1500', 10);
96
+ const networkMs = parseInt(process.env.NETWORK_REFRESH_MS || '30000', 10);
97
+ scheduler = new UiStateScheduler(refreshMs, networkMs);
98
+ }
99
+ return scheduler;
100
+ }
101
+ /**
102
+ * Start scheduler
103
+ * getAppState is a function that returns current AppState (allows dynamic updates)
104
+ */
105
+ export function startScheduler(getAppState, handler) {
106
+ const sched = getScheduler();
107
+ sched.start(getAppState, handler);
108
+ }
109
+ /**
110
+ * Stop scheduler
111
+ */
112
+ export function stopScheduler() {
113
+ if (scheduler) {
114
+ scheduler.stop();
115
+ scheduler = null;
116
+ }
117
+ }
118
+ //# sourceMappingURL=uiStateScheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiStateScheduler.js","sourceRoot":"","sources":["../../src/state/uiStateScheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Boot Sequence
3
+ * Phase 7: Scan page → Hub transition
4
+ */
5
+ import type { Widgets } from 'neo-blessed';
6
+ /**
7
+ * Render boot screen
8
+ */
9
+ export declare function renderBootScreen(screen: Widgets.Screen): Promise<void>;
10
+ //# sourceMappingURL=sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../../src/ui/boot/sequence.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAU3C;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+I5E"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * Boot Sequence
3
+ * Phase 7: Scan page → Hub transition
4
+ */
5
+ import { getBlessedColor } from '../theme/tokens.js';
6
+ import { navigationState } from '../navigation/state.js';
7
+ /**
8
+ * Render boot screen
9
+ */
10
+ export async function renderBootScreen(screen) {
11
+ const blessed = require('neo-blessed');
12
+ const blessedLib = blessed;
13
+ const noAnimations = process.env.NO_ANIMATIONS === '1';
14
+ const bootDuration = parseInt(process.env.BOOT_DURATION_MS || '2000', 10);
15
+ const startTime = Date.now();
16
+ // Create boot container
17
+ const bootBox = blessedLib.box({
18
+ top: 0,
19
+ left: 0,
20
+ width: screen.width,
21
+ height: screen.height,
22
+ border: { type: 'line' },
23
+ style: {
24
+ border: { fg: getBlessedColor('primaryPurple') },
25
+ },
26
+ tags: true,
27
+ });
28
+ screen.append(bootBox);
29
+ screen.render();
30
+ // Header
31
+ const header = `{${getBlessedColor('primaryPurple')}-fg}{bold}4Runr OS Intelligence Console{/bold}`;
32
+ const version = `{${getBlessedColor('mutedGrey')}-fg}v1.0.34{/}`;
33
+ // Boot checks
34
+ const checks = [
35
+ { label: 'CONFIG', status: 'checking' },
36
+ { label: 'GATEWAY', status: 'checking' },
37
+ { label: 'DB', status: 'checking' },
38
+ { label: 'SECURITY', status: 'checking' },
39
+ { label: 'CAPABILITIES', status: 'checking' },
40
+ ];
41
+ // Simulate checks (in real implementation, these would be actual checks)
42
+ const checkInterval = 200; // ms per check
43
+ let checkIndex = 0;
44
+ const updateBootScreen = () => {
45
+ const content = [];
46
+ content.push('');
47
+ content.push(` ${header}`);
48
+ content.push(` ${version}`);
49
+ content.push('');
50
+ content.push(`{${getBlessedColor('accentCyan')}-fg} BOOT SEQUENCE{/}`);
51
+ content.push('');
52
+ checks.forEach((check, idx) => {
53
+ let statusText = '';
54
+ let statusColor = getBlessedColor('mutedGrey');
55
+ if (check.status === 'checking') {
56
+ if (noAnimations) {
57
+ statusText = '...';
58
+ }
59
+ else {
60
+ // Simple spinner: cycle through | / - \
61
+ const spinnerChars = ['|', '/', '-', '\\'];
62
+ const spinnerIndex = Math.floor((Date.now() - startTime) / 150) % spinnerChars.length;
63
+ statusText = spinnerChars[spinnerIndex];
64
+ }
65
+ statusColor = getBlessedColor('accentCyan');
66
+ }
67
+ else if (check.status === 'ok') {
68
+ statusText = 'OK';
69
+ statusColor = getBlessedColor('successGreen');
70
+ }
71
+ else if (check.status === 'degraded') {
72
+ statusText = 'DEGRADED';
73
+ statusColor = getBlessedColor('warnAmber');
74
+ }
75
+ else if (check.status === 'error') {
76
+ statusText = 'ERROR';
77
+ statusColor = getBlessedColor('criticalRed');
78
+ }
79
+ else if (check.status === 'timeout') {
80
+ statusText = 'TIMEOUT';
81
+ statusColor = getBlessedColor('warnAmber');
82
+ }
83
+ const message = check.message ? ` (${check.message})` : '';
84
+ content.push(` {${getBlessedColor('mutedGrey')}-fg}${check.label.padEnd(12)}{/} {${statusColor}-fg}${statusText}{/}${message}`);
85
+ });
86
+ content.push('');
87
+ // Transition message when all checks complete
88
+ const allComplete = checks.every(c => c.status !== 'checking');
89
+ if (allComplete) {
90
+ content.push(`{${getBlessedColor('accentCyan')}-fg} TRANSITION → INTELLIGENCE CONSOLE{/}`);
91
+ }
92
+ bootBox.setContent(content.join('\n'));
93
+ screen.render();
94
+ };
95
+ // Initial render
96
+ updateBootScreen();
97
+ // Simulate checks
98
+ const checkTimer = setInterval(() => {
99
+ if (checkIndex < checks.length) {
100
+ // Simulate check result (in real implementation, perform actual checks)
101
+ const check = checks[checkIndex];
102
+ const elapsed = Date.now() - startTime;
103
+ // Simulate timeout if check takes too long
104
+ if (elapsed > 1000 && check.status === 'checking') {
105
+ check.status = 'timeout';
106
+ }
107
+ else if (check.status === 'checking') {
108
+ // Most checks succeed
109
+ if (check.label === 'GATEWAY') {
110
+ check.status = 'degraded';
111
+ check.message = 'not connected';
112
+ }
113
+ else if (check.label === 'DB') {
114
+ check.status = 'ok';
115
+ check.message = 'in-memory';
116
+ }
117
+ else {
118
+ check.status = 'ok';
119
+ }
120
+ }
121
+ checkIndex++;
122
+ updateBootScreen();
123
+ }
124
+ else {
125
+ clearInterval(checkTimer);
126
+ }
127
+ }, checkInterval);
128
+ // Wait for boot duration
129
+ await new Promise(resolve => setTimeout(resolve, bootDuration));
130
+ // Clean up
131
+ clearInterval(checkTimer);
132
+ bootBox.destroy();
133
+ // Check for fatal errors
134
+ const hasFatalError = checks.some(c => c.status === 'error');
135
+ if (hasFatalError) {
136
+ // Show safe hold screen
137
+ renderSafeHoldScreen(screen);
138
+ }
139
+ else {
140
+ // Transition to hub
141
+ navigationState.goToHub();
142
+ }
143
+ }
144
+ /**
145
+ * Render safe hold screen (fatal config error)
146
+ */
147
+ function renderSafeHoldScreen(screen) {
148
+ const blessed = require('neo-blessed');
149
+ const blessedLib = blessed;
150
+ const { getBlessedColor } = require('../theme/tokens.js');
151
+ const safeHoldBox = blessedLib.box({
152
+ top: 0,
153
+ left: 0,
154
+ width: screen.width,
155
+ height: screen.height,
156
+ border: { type: 'line' },
157
+ style: {
158
+ border: { fg: getBlessedColor('criticalRed') },
159
+ },
160
+ tags: true,
161
+ });
162
+ const content = [];
163
+ content.push('');
164
+ content.push(`{${getBlessedColor('criticalRed')}-fg}{bold}SAFE HOLD{/bold}`);
165
+ content.push('');
166
+ content.push(`POSTURE: {${getBlessedColor('criticalRed')}-fg}OFFLINE{/}`);
167
+ content.push('');
168
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Action: : system or : help{/}`);
169
+ safeHoldBox.setContent(content.join('\n'));
170
+ screen.append(safeHoldBox);
171
+ screen.render();
172
+ }
173
+ //# sourceMappingURL=sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../../src/ui/boot/sequence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Layout Specification
3
+ * Phase 8: Terminal fit & layout constraints
4
+ */
5
+ /**
6
+ * Terminal minimum size
7
+ */
8
+ export declare const TERMINAL_MIN_WIDTH = 120;
9
+ export declare const TERMINAL_MIN_HEIGHT = 35;
10
+ /**
11
+ * Panel line budgets
12
+ */
13
+ export declare const LINE_BUDGETS: {
14
+ readonly SMALL_PANEL: 6;
15
+ readonly OPERATIONS_FEED: 12;
16
+ readonly BOTTOM_BAR: 1;
17
+ };
18
+ /**
19
+ * Layout specification
20
+ */
21
+ export declare const layoutSpec: {
22
+ readonly terminal: {
23
+ readonly minWidth: 120;
24
+ readonly minHeight: 35;
25
+ };
26
+ readonly panels: {
27
+ readonly small: {
28
+ readonly maxContentLines: 6;
29
+ };
30
+ readonly feed: {
31
+ readonly maxEntries: 12;
32
+ };
33
+ readonly bottomBar: {
34
+ readonly height: 1;
35
+ };
36
+ };
37
+ };
38
+ /**
39
+ * Check if terminal size meets minimum requirements
40
+ */
41
+ export declare function checkTerminalSize(width: number, height: number): {
42
+ valid: boolean;
43
+ widthOk: boolean;
44
+ heightOk: boolean;
45
+ message?: string;
46
+ };
47
+ //# sourceMappingURL=layoutSpec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutSpec.d.ts","sourceRoot":"","sources":["../../../src/ui/constraints/layoutSpec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC;;GAEG;AACH,eAAO,MAAM,YAAY;;;;CAIf,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;CAgBb,CAAC;AAEX;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAChE,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAkBA"}