4runr-os 1.0.23 → 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 (235) 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/events.d.ts +35 -0
  50. package/dist/events.d.ts.map +1 -0
  51. package/dist/events.js +89 -0
  52. package/dist/events.js.map +1 -0
  53. package/dist/index.js +301 -36
  54. package/dist/index.js.map +1 -1
  55. package/dist/models.d.ts +74 -0
  56. package/dist/models.d.ts.map +1 -0
  57. package/dist/models.js +7 -0
  58. package/dist/models.js.map +1 -0
  59. package/dist/state/getCollectorResults.d.ts +18 -0
  60. package/dist/state/getCollectorResults.d.ts.map +1 -0
  61. package/dist/state/getCollectorResults.js +25 -0
  62. package/dist/state/getCollectorResults.js.map +1 -0
  63. package/dist/state/historyStore.d.ts +35 -0
  64. package/dist/state/historyStore.d.ts.map +1 -0
  65. package/dist/state/historyStore.js +58 -0
  66. package/dist/state/historyStore.js.map +1 -0
  67. package/dist/state/uiStateBuilder.d.ts +12 -0
  68. package/dist/state/uiStateBuilder.d.ts.map +1 -0
  69. package/dist/state/uiStateBuilder.js +169 -0
  70. package/dist/state/uiStateBuilder.js.map +1 -0
  71. package/dist/state/uiStateScheduler.d.ts +43 -0
  72. package/dist/state/uiStateScheduler.d.ts.map +1 -0
  73. package/dist/state/uiStateScheduler.js +118 -0
  74. package/dist/state/uiStateScheduler.js.map +1 -0
  75. package/dist/store.d.ts +3 -1
  76. package/dist/store.d.ts.map +1 -1
  77. package/dist/store.js +2 -0
  78. package/dist/store.js.map +1 -1
  79. package/dist/system-state.d.ts +96 -0
  80. package/dist/system-state.d.ts.map +1 -0
  81. package/dist/system-state.js +273 -0
  82. package/dist/system-state.js.map +1 -0
  83. package/dist/ui/boot/sequence.d.ts +10 -0
  84. package/dist/ui/boot/sequence.d.ts.map +1 -0
  85. package/dist/ui/boot/sequence.js +173 -0
  86. package/dist/ui/boot/sequence.js.map +1 -0
  87. package/dist/ui/constraints/layoutSpec.d.ts +47 -0
  88. package/dist/ui/constraints/layoutSpec.d.ts.map +1 -0
  89. package/dist/ui/constraints/layoutSpec.js +60 -0
  90. package/dist/ui/constraints/layoutSpec.js.map +1 -0
  91. package/dist/ui/constraints/unknownHandling.d.ts +29 -0
  92. package/dist/ui/constraints/unknownHandling.d.ts.map +1 -0
  93. package/dist/ui/constraints/unknownHandling.js +60 -0
  94. package/dist/ui/constraints/unknownHandling.js.map +1 -0
  95. package/dist/ui/drilldowns/feed.d.ts +11 -0
  96. package/dist/ui/drilldowns/feed.d.ts.map +1 -0
  97. package/dist/ui/drilldowns/feed.js +68 -0
  98. package/dist/ui/drilldowns/feed.js.map +1 -0
  99. package/dist/ui/drilldowns/index.d.ts +7 -0
  100. package/dist/ui/drilldowns/index.d.ts.map +1 -0
  101. package/dist/ui/drilldowns/index.js +8 -0
  102. package/dist/ui/drilldowns/index.js.map +1 -0
  103. package/dist/ui/drilldowns/posture.d.ts +11 -0
  104. package/dist/ui/drilldowns/posture.d.ts.map +1 -0
  105. package/dist/ui/drilldowns/posture.js +74 -0
  106. package/dist/ui/drilldowns/posture.js.map +1 -0
  107. package/dist/ui/intelligence-posture-view.d.ts +22 -0
  108. package/dist/ui/intelligence-posture-view.d.ts.map +1 -0
  109. package/dist/ui/intelligence-posture-view.js +169 -0
  110. package/dist/ui/intelligence-posture-view.js.map +1 -0
  111. package/dist/ui/navigation/keymaps.d.ts +26 -0
  112. package/dist/ui/navigation/keymaps.d.ts.map +1 -0
  113. package/dist/ui/navigation/keymaps.js +135 -0
  114. package/dist/ui/navigation/keymaps.js.map +1 -0
  115. package/dist/ui/navigation/palette.d.ts +10 -0
  116. package/dist/ui/navigation/palette.d.ts.map +1 -0
  117. package/dist/ui/navigation/palette.js +133 -0
  118. package/dist/ui/navigation/palette.js.map +1 -0
  119. package/dist/ui/navigation/state.d.ts +47 -0
  120. package/dist/ui/navigation/state.d.ts.map +1 -0
  121. package/dist/ui/navigation/state.js +84 -0
  122. package/dist/ui/navigation/state.js.map +1 -0
  123. package/dist/ui/navigation/types.d.ts +38 -0
  124. package/dist/ui/navigation/types.d.ts.map +1 -0
  125. package/dist/ui/navigation/types.js +36 -0
  126. package/dist/ui/navigation/types.js.map +1 -0
  127. package/dist/ui/panels/active-assets.d.ts +12 -0
  128. package/dist/ui/panels/active-assets.d.ts.map +1 -0
  129. package/dist/ui/panels/active-assets.js +83 -0
  130. package/dist/ui/panels/active-assets.js.map +1 -0
  131. package/dist/ui/panels/capability-flags.d.ts +12 -0
  132. package/dist/ui/panels/capability-flags.d.ts.map +1 -0
  133. package/dist/ui/panels/capability-flags.js +59 -0
  134. package/dist/ui/panels/capability-flags.js.map +1 -0
  135. package/dist/ui/panels/command-surface.d.ts +12 -0
  136. package/dist/ui/panels/command-surface.d.ts.map +1 -0
  137. package/dist/ui/panels/command-surface.js +55 -0
  138. package/dist/ui/panels/command-surface.js.map +1 -0
  139. package/dist/ui/panels/network-origin.d.ts +12 -0
  140. package/dist/ui/panels/network-origin.d.ts.map +1 -0
  141. package/dist/ui/panels/network-origin.js +79 -0
  142. package/dist/ui/panels/network-origin.js.map +1 -0
  143. package/dist/ui/panels/operations-feed.d.ts +12 -0
  144. package/dist/ui/panels/operations-feed.d.ts.map +1 -0
  145. package/dist/ui/panels/operations-feed.js +90 -0
  146. package/dist/ui/panels/operations-feed.js.map +1 -0
  147. package/dist/ui/panels/posture.d.ts +12 -0
  148. package/dist/ui/panels/posture.d.ts.map +1 -0
  149. package/dist/ui/panels/posture.js +84 -0
  150. package/dist/ui/panels/posture.js.map +1 -0
  151. package/dist/ui/panels/resources.d.ts +11 -0
  152. package/dist/ui/panels/resources.d.ts.map +1 -0
  153. package/dist/ui/panels/resources.js +88 -0
  154. package/dist/ui/panels/resources.js.map +1 -0
  155. package/dist/ui/primitives/Panel.d.ts +25 -0
  156. package/dist/ui/primitives/Panel.d.ts.map +1 -0
  157. package/dist/ui/primitives/Panel.js +59 -0
  158. package/dist/ui/primitives/Panel.js.map +1 -0
  159. package/dist/ui/rendering/metricRenderer.d.ts +24 -0
  160. package/dist/ui/rendering/metricRenderer.d.ts.map +1 -0
  161. package/dist/ui/rendering/metricRenderer.js +86 -0
  162. package/dist/ui/rendering/metricRenderer.js.map +1 -0
  163. package/dist/ui/runtime/hub.d.ts +12 -0
  164. package/dist/ui/runtime/hub.d.ts.map +1 -0
  165. package/dist/ui/runtime/hub.js +468 -0
  166. package/dist/ui/runtime/hub.js.map +1 -0
  167. package/dist/ui/runtime/hubValidation.d.ts +23 -0
  168. package/dist/ui/runtime/hubValidation.d.ts.map +1 -0
  169. package/dist/ui/runtime/hubValidation.js +90 -0
  170. package/dist/ui/runtime/hubValidation.js.map +1 -0
  171. package/dist/ui/runtime/index.d.ts +29 -0
  172. package/dist/ui/runtime/index.d.ts.map +1 -0
  173. package/dist/ui/runtime/index.js +299 -0
  174. package/dist/ui/runtime/index.js.map +1 -0
  175. package/dist/ui/runtime/no-tui.d.ts +12 -0
  176. package/dist/ui/runtime/no-tui.d.ts.map +1 -0
  177. package/dist/ui/runtime/no-tui.js +77 -0
  178. package/dist/ui/runtime/no-tui.js.map +1 -0
  179. package/dist/ui/runtime/state-builder.d.ts +13 -0
  180. package/dist/ui/runtime/state-builder.d.ts.map +1 -0
  181. package/dist/ui/runtime/state-builder.js +114 -0
  182. package/dist/ui/runtime/state-builder.js.map +1 -0
  183. package/dist/ui/runtime/terminalSizeCheck.d.ts +10 -0
  184. package/dist/ui/runtime/terminalSizeCheck.d.ts.map +1 -0
  185. package/dist/ui/runtime/terminalSizeCheck.js +51 -0
  186. package/dist/ui/runtime/terminalSizeCheck.js.map +1 -0
  187. package/dist/ui/runtime/tuiLogGate.d.ts +22 -0
  188. package/dist/ui/runtime/tuiLogGate.d.ts.map +1 -0
  189. package/dist/ui/runtime/tuiLogGate.js +68 -0
  190. package/dist/ui/runtime/tuiLogGate.js.map +1 -0
  191. package/dist/ui/state/types.d.ts +72 -0
  192. package/dist/ui/state/types.d.ts.map +1 -0
  193. package/dist/ui/state/types.js +6 -0
  194. package/dist/ui/state/types.js.map +1 -0
  195. package/dist/ui/theme/borders.d.ts +20 -0
  196. package/dist/ui/theme/borders.d.ts.map +1 -0
  197. package/dist/ui/theme/borders.js +55 -0
  198. package/dist/ui/theme/borders.js.map +1 -0
  199. package/dist/ui/theme/tokens.d.ts +28 -0
  200. package/dist/ui/theme/tokens.d.ts.map +1 -0
  201. package/dist/ui/theme/tokens.js +50 -0
  202. package/dist/ui/theme/tokens.js.map +1 -0
  203. package/dist/ui/theme/typography.d.ts +14 -0
  204. package/dist/ui/theme/typography.d.ts.map +1 -0
  205. package/dist/ui/theme/typography.js +30 -0
  206. package/dist/ui/theme/typography.js.map +1 -0
  207. package/dist/ui/widgets/flagRow.d.ts +25 -0
  208. package/dist/ui/widgets/flagRow.d.ts.map +1 -0
  209. package/dist/ui/widgets/flagRow.js +57 -0
  210. package/dist/ui/widgets/flagRow.js.map +1 -0
  211. package/dist/ui/widgets/index.d.ts +9 -0
  212. package/dist/ui/widgets/index.d.ts.map +1 -0
  213. package/dist/ui/widgets/index.js +9 -0
  214. package/dist/ui/widgets/index.js.map +1 -0
  215. package/dist/ui/widgets/meter.d.ts +18 -0
  216. package/dist/ui/widgets/meter.d.ts.map +1 -0
  217. package/dist/ui/widgets/meter.js +38 -0
  218. package/dist/ui/widgets/meter.js.map +1 -0
  219. package/dist/ui/widgets/miniMap.d.ts +26 -0
  220. package/dist/ui/widgets/miniMap.d.ts.map +1 -0
  221. package/dist/ui/widgets/miniMap.js +94 -0
  222. package/dist/ui/widgets/miniMap.js.map +1 -0
  223. package/dist/ui/widgets/sparkline.d.ts +17 -0
  224. package/dist/ui/widgets/sparkline.d.ts.map +1 -0
  225. package/dist/ui/widgets/sparkline.js +63 -0
  226. package/dist/ui/widgets/sparkline.js.map +1 -0
  227. package/dist/ui-primitives.d.ts +5 -2
  228. package/dist/ui-primitives.d.ts.map +1 -1
  229. package/dist/ui-primitives.js +22 -9
  230. package/dist/ui-primitives.js.map +1 -1
  231. package/package.json +5 -4
  232. package/dist/ui/home-view.d.ts +0 -27
  233. package/dist/ui/home-view.d.ts.map +0 -1
  234. package/dist/ui/home-view.js +0 -127
  235. package/dist/ui/home-view.js.map +0 -1
@@ -0,0 +1,273 @@
1
+ /**
2
+ * System State Intelligence Model
3
+ * Phase 5: UI-Driven Architecture Lock-In
4
+ *
5
+ * This is the authoritative system intelligence model.
6
+ * The UI reads from this, never computes values itself.
7
+ *
8
+ * Architecture:
9
+ * Runtime State (AppState) → System Intelligence (SystemState) → UI Rendering
10
+ *
11
+ * The 5 mandatory intelligence surfaces are:
12
+ * 1. system_posture
13
+ * 2. network_context
14
+ * 3. asset_registry_summary
15
+ * 4. operation_feed
16
+ * 5. capability_flags
17
+ */
18
+ /**
19
+ * System State Provider
20
+ * Computes SystemState from AppState
21
+ * This is the single source of truth for intelligence data
22
+ */
23
+ export class SystemStateProvider {
24
+ cachedState = null;
25
+ lastAppStateVersion = 0;
26
+ appStateVersion = 0;
27
+ /**
28
+ * Compute system posture from app state
29
+ * Phase 5: Centralized, deterministic computation
30
+ */
31
+ computeSystemPosture(state) {
32
+ // Determine overall posture
33
+ let overallPosture;
34
+ let sourceOfTruth;
35
+ if (!state.systemReady) {
36
+ overallPosture = 'CRITICAL';
37
+ sourceOfTruth = 'system_initialization';
38
+ }
39
+ else if (state.gatewayConnected && state.localMode) {
40
+ overallPosture = 'OPERATIONAL';
41
+ sourceOfTruth = 'hybrid_mode';
42
+ }
43
+ else if (state.gatewayConnected) {
44
+ overallPosture = 'OPERATIONAL';
45
+ sourceOfTruth = 'gateway_connection';
46
+ }
47
+ else if (state.localMode) {
48
+ overallPosture = 'OPERATIONAL';
49
+ sourceOfTruth = 'local_mode';
50
+ }
51
+ else {
52
+ overallPosture = 'DEGRADED';
53
+ sourceOfTruth = 'no_connection';
54
+ }
55
+ // Determine execution mode
56
+ let executionMode;
57
+ if (state.localMode && state.gatewayConnected) {
58
+ executionMode = 'HYBRID';
59
+ }
60
+ else if (state.localMode) {
61
+ executionMode = 'LOCAL';
62
+ }
63
+ else if (state.gatewayConnected) {
64
+ executionMode = 'REMOTE';
65
+ }
66
+ else {
67
+ executionMode = 'LOCAL'; // Fallback
68
+ }
69
+ // Determine risk level
70
+ let riskLevel;
71
+ if (overallPosture === 'CRITICAL') {
72
+ riskLevel = 'HIGH';
73
+ }
74
+ else if (overallPosture === 'DEGRADED') {
75
+ riskLevel = 'ELEVATED';
76
+ }
77
+ else {
78
+ riskLevel = 'LOW';
79
+ }
80
+ // Track last state change (would be tracked in state transitions)
81
+ // For v1, use current timestamp (would track actual state transitions)
82
+ const lastStateChange = Date.now();
83
+ return {
84
+ overallPosture,
85
+ executionMode,
86
+ riskLevel,
87
+ lastStateChange,
88
+ };
89
+ }
90
+ /**
91
+ * Compute network context from app state
92
+ * Phase 5: Spatial and infrastructural awareness
93
+ */
94
+ computeNetworkContext(state) {
95
+ // Operator origin (privacy-safe, approximate)
96
+ const operatorOrigin = {
97
+ region: process.env.OPERATOR_REGION || 'UNKNOWN',
98
+ networkType: (() => {
99
+ if (state.localMode)
100
+ return 'LOCAL';
101
+ if (state.gatewayUrl?.includes('localhost') || state.gatewayUrl?.includes('127.0.0.1')) {
102
+ return 'LOCAL';
103
+ }
104
+ if (state.gatewayUrl?.includes('vpn') || state.gatewayUrl?.includes('tunnel')) {
105
+ return 'VPN';
106
+ }
107
+ if (state.gatewayUrl) {
108
+ return 'CLOUD';
109
+ }
110
+ return 'UNKNOWN';
111
+ })(),
112
+ };
113
+ // Target infrastructure
114
+ const targetInfrastructure = {
115
+ gatewayRegion: state.gatewayUrl
116
+ ? this.extractRegionFromUrl(state.gatewayUrl)
117
+ : 'NONE',
118
+ databaseRegion: state.gatewayConnected
119
+ ? this.extractRegionFromUrl(state.gatewayUrl || '')
120
+ : 'NONE',
121
+ latencyClass: (() => {
122
+ // Simplified - would measure actual latency
123
+ if (state.localMode)
124
+ return 'LOW';
125
+ if (state.gatewayConnected)
126
+ return 'MEDIUM';
127
+ return 'HIGH';
128
+ })(),
129
+ };
130
+ return {
131
+ operatorOrigin,
132
+ targetInfrastructure,
133
+ };
134
+ }
135
+ /**
136
+ * Extract region from URL (simplified)
137
+ */
138
+ extractRegionFromUrl(url) {
139
+ if (url.includes('localhost') || url.includes('127.0.0.1'))
140
+ return 'LOCAL';
141
+ if (url.includes('us-'))
142
+ return 'US';
143
+ if (url.includes('eu-'))
144
+ return 'EU';
145
+ if (url.includes('ap-'))
146
+ return 'APAC';
147
+ return 'UNKNOWN';
148
+ }
149
+ /**
150
+ * Compute asset registry summary
151
+ * Phase 5: Deployed intelligence surface
152
+ */
153
+ computeAssetRegistrySummary(state) {
154
+ const total = state.customAgents.size;
155
+ // Count by status
156
+ const activeRuns = state.runHistory.filter(r => r.status === 'RUNNING');
157
+ const failedRuns = state.runHistory.filter(r => r.status === 'FAILED');
158
+ const active = activeRuns.length;
159
+ const error = failedRuns.length > 0 && failedRuns[0].timestamp > Date.now() - 60000 ? 1 : 0;
160
+ const idle = Math.max(0, total - active - error);
161
+ // Primary asset (last used or pinned)
162
+ let highlighted = null;
163
+ if (activeRuns.length > 0) {
164
+ const activeRun = activeRuns[activeRuns.length - 1];
165
+ const asset = Array.from(state.customAgents.values()).find(a => a.name === activeRun.agentName);
166
+ if (asset) {
167
+ highlighted = {
168
+ name: asset.name,
169
+ status: 'ACTIVE',
170
+ reason: 'Currently executing',
171
+ };
172
+ }
173
+ }
174
+ else if (state.runHistory.length > 0) {
175
+ const lastRun = state.runHistory[state.runHistory.length - 1];
176
+ const asset = Array.from(state.customAgents.values()).find(a => a.name === lastRun.agentName);
177
+ if (asset) {
178
+ highlighted = {
179
+ name: asset.name,
180
+ status: lastRun.status === 'FAILED' ? 'ERROR' : 'IDLE',
181
+ reason: lastRun.status === 'FAILED' ? 'Recent failure' : 'Last used',
182
+ };
183
+ }
184
+ }
185
+ else if (total > 0) {
186
+ const firstAsset = Array.from(state.customAgents.values())[0];
187
+ highlighted = {
188
+ name: firstAsset.name,
189
+ status: 'IDLE',
190
+ reason: 'Available',
191
+ };
192
+ }
193
+ return {
194
+ total,
195
+ active,
196
+ idle,
197
+ error,
198
+ highlighted,
199
+ };
200
+ }
201
+ /**
202
+ * Get operation feed
203
+ * Phase 5: Living operational pulse
204
+ */
205
+ getOperationFeed(state) {
206
+ // Return last 10 events (hard limit)
207
+ return state.operationEvents.slice(-10);
208
+ }
209
+ /**
210
+ * Compute capability flags
211
+ * Phase 5: What the system is capable of right now
212
+ */
213
+ computeCapabilityFlags(state) {
214
+ return {
215
+ gateway: state.gatewayConnected ? 'READY' : 'DEGRADED',
216
+ database: state.gatewayConnected ? 'READY' : 'NOT_INITIALIZED',
217
+ memoryLayer: state.gatewayConnected ? 'PERSISTENT' : 'IN_MEMORY',
218
+ security: state.currentUser ? 'JWT' : 'OPEN',
219
+ rateLimiting: 'DISABLED', // Would check actual config
220
+ };
221
+ }
222
+ /**
223
+ * Compute complete SystemState from AppState
224
+ * This is the single computation point
225
+ */
226
+ compute(state) {
227
+ // Increment version for cache invalidation
228
+ this.appStateVersion++;
229
+ const systemState = {
230
+ systemPosture: this.computeSystemPosture(state),
231
+ networkContext: this.computeNetworkContext(state),
232
+ assetRegistrySummary: this.computeAssetRegistrySummary(state),
233
+ operationFeed: this.getOperationFeed(state),
234
+ capabilityFlags: this.computeCapabilityFlags(state),
235
+ computedAt: Date.now(),
236
+ version: this.appStateVersion,
237
+ };
238
+ // Cache the result
239
+ this.cachedState = systemState;
240
+ this.lastAppStateVersion = this.appStateVersion;
241
+ return systemState;
242
+ }
243
+ /**
244
+ * Get cached state if available and valid
245
+ * Otherwise compute fresh
246
+ */
247
+ get(state, forceRefresh = false) {
248
+ if (!forceRefresh && this.cachedState && this.appStateVersion === this.lastAppStateVersion) {
249
+ return this.cachedState;
250
+ }
251
+ return this.compute(state);
252
+ }
253
+ /**
254
+ * Invalidate cache (call when state changes)
255
+ */
256
+ invalidate() {
257
+ this.cachedState = null;
258
+ this.lastAppStateVersion = 0;
259
+ }
260
+ }
261
+ /**
262
+ * Global system state provider instance
263
+ * Single source of truth for intelligence data
264
+ */
265
+ export const systemStateProvider = new SystemStateProvider();
266
+ /**
267
+ * Get current system state
268
+ * This is what the UI reads from
269
+ */
270
+ export function getSystemState(state, forceRefresh = false) {
271
+ return systemStateProvider.get(state, forceRefresh);
272
+ }
273
+ //# sourceMappingURL=system-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-state.js","sourceRoot":"","sources":["../src/system-state.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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Layout Specification
3
+ * Phase 8: Terminal fit & layout constraints
4
+ */
5
+ /**
6
+ * Terminal minimum size
7
+ */
8
+ export const TERMINAL_MIN_WIDTH = 120;
9
+ export const TERMINAL_MIN_HEIGHT = 35;
10
+ /**
11
+ * Panel line budgets
12
+ */
13
+ export const LINE_BUDGETS = {
14
+ SMALL_PANEL: 6, // Max content lines (excluding border + title)
15
+ OPERATIONS_FEED: 12, // Max feed entries
16
+ BOTTOM_BAR: 1, // Status strip
17
+ };
18
+ /**
19
+ * Layout specification
20
+ */
21
+ export const layoutSpec = {
22
+ terminal: {
23
+ minWidth: TERMINAL_MIN_WIDTH,
24
+ minHeight: TERMINAL_MIN_HEIGHT,
25
+ },
26
+ panels: {
27
+ small: {
28
+ maxContentLines: LINE_BUDGETS.SMALL_PANEL,
29
+ },
30
+ feed: {
31
+ maxEntries: LINE_BUDGETS.OPERATIONS_FEED,
32
+ },
33
+ bottomBar: {
34
+ height: LINE_BUDGETS.BOTTOM_BAR,
35
+ },
36
+ },
37
+ };
38
+ /**
39
+ * Check if terminal size meets minimum requirements
40
+ */
41
+ export function checkTerminalSize(width, height) {
42
+ const widthOk = width >= TERMINAL_MIN_WIDTH;
43
+ const heightOk = height >= TERMINAL_MIN_HEIGHT;
44
+ const valid = widthOk && heightOk;
45
+ if (!valid) {
46
+ const issues = [];
47
+ if (!widthOk)
48
+ issues.push(`width ${width} < ${TERMINAL_MIN_WIDTH}`);
49
+ if (!heightOk)
50
+ issues.push(`height ${height} < ${TERMINAL_MIN_HEIGHT}`);
51
+ return {
52
+ valid: false,
53
+ widthOk,
54
+ heightOk,
55
+ message: `Terminal too small: ${issues.join(', ')}`,
56
+ };
57
+ }
58
+ return { valid: true, widthOk: true, heightOk: true };
59
+ }
60
+ //# sourceMappingURL=layoutSpec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutSpec.js","sourceRoot":"","sources":["../../../src/ui/constraints/layoutSpec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAC;AACtC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,WAAW,EAAE,CAAC,EAAS,+CAA+C;IACtE,eAAe,EAAE,EAAE,EAAI,mBAAmB;IAC1C,UAAU,EAAE,CAAC,EAAU,eAAe;CAC9B,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ,EAAE;QACR,QAAQ,EAAE,kBAAkB;QAC5B,SAAS,EAAE,mBAAmB;KAC/B;IACD,MAAM,EAAE;QACN,KAAK,EAAE;YACL,eAAe,EAAE,YAAY,CAAC,WAAW;SAC1C;QACD,IAAI,EAAE;YACJ,UAAU,EAAE,YAAY,CAAC,eAAe;SACzC;QACD,SAAS,EAAE;YACT,MAAM,EAAE,YAAY,CAAC,UAAU;SAChC;KACF;CACO,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,MAAc;IAM7D,MAAM,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,IAAI,mBAAmB,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,IAAI,QAAQ,CAAC;IAElC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,kBAAkB,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,MAAM,MAAM,mBAAmB,EAAE,CAAC,CAAC;QACxE,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO;YACP,QAAQ;YACR,OAAO,EAAE,uBAAuB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACpD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Unknown Handling
3
+ * Phase 8: No fake data - all unknown values display as UNKNOWN
4
+ */
5
+ /**
6
+ * Format a value, ensuring unknown values display as "UNKNOWN"
7
+ *
8
+ * Rules:
9
+ * - null, undefined, "UNKNOWN" → "UNKNOWN"
10
+ * - Empty string → "UNKNOWN"
11
+ * - All other values → string representation
12
+ */
13
+ export declare function formatValue(value: any, options?: {
14
+ unknownLabel?: string;
15
+ allowEmpty?: boolean;
16
+ }): string;
17
+ /**
18
+ * Format value with optional cause code
19
+ * Example: "UNKNOWN (TIMEOUT)"
20
+ */
21
+ export declare function formatValueWithCause(value: any, cause?: string, options?: {
22
+ unknownLabel?: string;
23
+ }): string;
24
+ /**
25
+ * Validate that a value is not fake/placeholder
26
+ * Throws if value looks like a placeholder
27
+ */
28
+ export declare function validateNotPlaceholder(value: any): void;
29
+ //# sourceMappingURL=unknownHandling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknownHandling.d.ts","sourceRoot":"","sources":["../../../src/ui/constraints/unknownHandling.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,GAAG,EACV,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;CACjB,GACL,MAAM,CAyBR;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,GAAG,EACV,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,GAAE;IACP,YAAY,CAAC,EAAE,MAAM,CAAC;CAClB,GACL,MAAM,CAUR;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,CASvD"}