4runr-os 1.0.28 → 1.0.37

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 +3 -2
  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,94 @@
1
+ /**
2
+ * Mini Map Widget
3
+ * Phase 5: ASCII world map with operator/gateway/database positions
4
+ */
5
+ /**
6
+ * World bounding box for projection
7
+ */
8
+ const WORLD_BBOX = {
9
+ latMin: -60,
10
+ latMax: 80,
11
+ lonMin: -180,
12
+ lonMax: 180,
13
+ };
14
+ /**
15
+ * Convert lat/lon to grid coordinates
16
+ */
17
+ function latLonToGrid(lat, lon, width, height) {
18
+ // Clamp lat/lon to world bounds
19
+ const clampedLat = Math.max(WORLD_BBOX.latMin, Math.min(WORLD_BBOX.latMax, lat));
20
+ const clampedLon = Math.max(WORLD_BBOX.lonMin, Math.min(WORLD_BBOX.lonMax, lon));
21
+ // Convert to grid coordinates
22
+ // x: longitude -> [0, width-1]
23
+ const x = Math.floor(((clampedLon - WORLD_BBOX.lonMin) / (WORLD_BBOX.lonMax - WORLD_BBOX.lonMin)) * (width - 1));
24
+ // y: latitude -> [0, height-1] (inverted because top is north)
25
+ const y = Math.floor(((WORLD_BBOX.latMax - clampedLat) / (WORLD_BBOX.latMax - WORLD_BBOX.latMin)) * (height - 1));
26
+ // Clamp to grid bounds
27
+ return {
28
+ x: Math.max(0, Math.min(width - 1, x)),
29
+ y: Math.max(0, Math.min(height - 1, y)),
30
+ };
31
+ }
32
+ /**
33
+ * Render mini map
34
+ * Returns array of strings, each exactly width characters
35
+ */
36
+ export function renderMiniMap(input) {
37
+ const { width, height, origin, gateway, db } = input;
38
+ // Check if we have required coordinates
39
+ const hasOrigin = origin && origin !== "UNKNOWN" && typeof origin === 'object';
40
+ const hasGateway = gateway && gateway !== "UNKNOWN" && typeof gateway === 'object';
41
+ if (!hasOrigin || !hasGateway) {
42
+ // Return GEO UNAVAILABLE message
43
+ const lines = [];
44
+ lines.push('MINI-MAP: GEO UNAVAILABLE');
45
+ // Fill remaining lines
46
+ while (lines.length < height) {
47
+ lines.push(' '.repeat(width));
48
+ }
49
+ return lines.slice(0, height);
50
+ }
51
+ // Initialize grid with spaces
52
+ const grid = [];
53
+ for (let y = 0; y < height; y++) {
54
+ grid[y] = [];
55
+ for (let x = 0; x < width; x++) {
56
+ grid[y][x] = ' ';
57
+ }
58
+ }
59
+ // Place markers (precedence: G > O > D)
60
+ const markers = [];
61
+ // Gateway (highest precedence)
62
+ if (hasGateway) {
63
+ const pos = latLonToGrid(gateway.lat, gateway.lon, width, height);
64
+ markers.push({ pos, char: 'G' });
65
+ }
66
+ // Origin
67
+ if (hasOrigin) {
68
+ const pos = latLonToGrid(origin.lat, origin.lon, width, height);
69
+ markers.push({ pos, char: 'O' });
70
+ }
71
+ // Database (lowest precedence)
72
+ if (db && db !== "UNKNOWN" && typeof db === 'object') {
73
+ const pos = latLonToGrid(db.lat, db.lon, width, height);
74
+ markers.push({ pos, char: 'D' });
75
+ }
76
+ // Place markers (later markers overwrite earlier ones if collision)
77
+ markers.forEach(marker => {
78
+ grid[marker.pos.y][marker.pos.x] = marker.char;
79
+ });
80
+ // Convert grid to lines
81
+ const lines = grid.map(row => row.join(''));
82
+ // Ensure exactly height lines, each exactly width chars
83
+ while (lines.length < height) {
84
+ lines.push(' '.repeat(width));
85
+ }
86
+ return lines.slice(0, height).map(line => {
87
+ // Pad or truncate to exact width
88
+ if (line.length < width) {
89
+ return line + ' '.repeat(width - line.length);
90
+ }
91
+ return line.substring(0, width);
92
+ });
93
+ }
94
+ //# sourceMappingURL=miniMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miniMap.js","sourceRoot":"","sources":["../../../src/ui/widgets/miniMap.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,MAAM,UAAU,GAAG;IACjB,MAAM,EAAE,CAAC,EAAE;IACX,MAAM,EAAE,EAAE;IACV,MAAM,EAAE,CAAC,GAAG;IACZ,MAAM,EAAE,GAAG;CACZ,CAAC;AAEF;;GAEG;AACH,SAAS,YAAY,CACnB,GAAW,EACX,GAAW,EACX,KAAa,EACb,MAAc;IAEd,gCAAgC;IAChC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACjF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IAEjF,8BAA8B;IAC9B,+BAA+B;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;IAEjH,+DAA+D;IAC/D,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAElH,uBAAuB;IACvB,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;KACxC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC;IAErD,wCAAwC;IACxC,MAAM,SAAS,GAAG,MAAM,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC;IAC/E,MAAM,UAAU,GAAG,OAAO,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;IAEnF,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,EAAE,CAAC;QAC9B,iCAAiC;QACjC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxC,uBAAuB;QACvB,OAAO,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,8BAA8B;IAC9B,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACnB,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,MAAM,OAAO,GAA2D,EAAE,CAAC;IAE3E,+BAA+B;IAC/B,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,SAAS;IACT,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,+BAA+B;IAC/B,IAAI,EAAE,IAAI,EAAE,KAAK,SAAS,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,oEAAoE;IACpE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5C,wDAAwD;IACxD,OAAO,KAAK,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QACvC,iCAAiC;QACjC,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;YACxB,OAAO,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Sparkline Widget
3
+ * Phase 4: 1-line trend visualization
4
+ */
5
+ export type SparklineInput = {
6
+ samples: Array<number | null>;
7
+ min?: number;
8
+ max?: number;
9
+ width: number;
10
+ unknownLabel?: string;
11
+ };
12
+ /**
13
+ * Render sparkline
14
+ * Returns a string of exactly `width` characters
15
+ */
16
+ export declare function renderSparkline(input: SparklineInput): string;
17
+ //# sourceMappingURL=sparkline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkline.d.ts","sourceRoot":"","sources":["../../../src/ui/widgets/sparkline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAOF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAoE7D"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Sparkline Widget
3
+ * Phase 4: 1-line trend visualization
4
+ */
5
+ /**
6
+ * Unicode sparkline characters (8 levels)
7
+ */
8
+ const SPARKLINE_CHARS = '▁▂▃▄▅▆▇█';
9
+ /**
10
+ * Render sparkline
11
+ * Returns a string of exactly `width` characters
12
+ */
13
+ export function renderSparkline(input) {
14
+ const { samples, min = 0, max = 100, width, unknownLabel = '—', } = input;
15
+ // If no samples or all null, return placeholder
16
+ if (samples.length === 0 || samples.every(s => s === null)) {
17
+ return unknownLabel.repeat(width);
18
+ }
19
+ // Filter out nulls and get valid samples
20
+ const validSamples = samples.filter((s) => s !== null);
21
+ if (validSamples.length === 0) {
22
+ return unknownLabel.repeat(width);
23
+ }
24
+ // Downsample or upsample to exactly width
25
+ const normalized = [];
26
+ const step = validSamples.length / width;
27
+ for (let i = 0; i < width; i++) {
28
+ const startIdx = Math.floor(i * step);
29
+ const endIdx = Math.floor((i + 1) * step);
30
+ // Average samples in this range
31
+ let sum = 0;
32
+ let count = 0;
33
+ for (let j = startIdx; j < endIdx && j < validSamples.length; j++) {
34
+ sum += validSamples[j];
35
+ count++;
36
+ }
37
+ if (count > 0) {
38
+ normalized.push(sum / count);
39
+ }
40
+ else {
41
+ normalized.push(null); // Will be handled as gap
42
+ }
43
+ }
44
+ // Map to sparkline characters
45
+ const range = max - min;
46
+ const result = [];
47
+ for (const value of normalized) {
48
+ if (value === null || isNaN(value)) {
49
+ result.push(unknownLabel);
50
+ continue;
51
+ }
52
+ // Clamp to [min, max]
53
+ const clamped = Math.max(min, Math.min(max, value));
54
+ // Map to [0, 1]
55
+ const normalizedValue = range > 0 ? (clamped - min) / range : 0;
56
+ // Map to character index [0, 7]
57
+ const charIndex = Math.floor(normalizedValue * (SPARKLINE_CHARS.length - 1));
58
+ const char = SPARKLINE_CHARS[charIndex];
59
+ result.push(char);
60
+ }
61
+ return result.join('');
62
+ }
63
+ //# sourceMappingURL=sparkline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sparkline.js","sourceRoot":"","sources":["../../../src/ui/widgets/sparkline.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "4runr-os",
3
- "version": "1.0.28",
3
+ "version": "1.0.37",
4
4
  "type": "module",
5
5
  "description": "4Runr AI Agent OS - Interactive terminal for managing AI agents",
6
6
  "main": "dist/index.js",
@@ -25,7 +25,8 @@
25
25
  "author": "4Runr Team",
26
26
  "license": "MIT",
27
27
  "dependencies": {
28
- "axios": "^1.6.0"
28
+ "axios": "^1.6.0",
29
+ "neo-blessed": "^0.2.0"
29
30
  },
30
31
  "devDependencies": {
31
32
  "@types/node": "^20.8.0",
@@ -1,27 +0,0 @@
1
- /**
2
- * HOME View Renderer
3
- *
4
- * EXTENSION EXAMPLE: This is the pattern all view renderers should follow
5
- *
6
- * Rules:
7
- * - Pure function: receives state → returns rendered string
8
- * - No side effects, no console.log, no state mutations
9
- * - Use UI primitives (Section, Table, Alert, etc.)
10
- * - Import types with `import type` (not regular import)
11
- *
12
- * To create a new view:
13
- * 1. Create file: src/ui/my-view.ts
14
- * 2. Export function: renderMyView(state: AppState): string
15
- * 3. Use UI primitives to build output
16
- * 4. Return joined string (ready for console.log)
17
- *
18
- * See CONTRIBUTING-CLI.md for full extension recipe
19
- */
20
- import type { AppState } from '../store.js';
21
- /**
22
- * Render HOME view
23
- * @param state - Current application state
24
- * @returns Rendered view as string (ready to console.log)
25
- */
26
- export declare function renderHomeView(state: AppState): string;
27
- //# sourceMappingURL=home-view.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"home-view.d.ts","sourceRoot":"","sources":["../../src/ui/home-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAM5C;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CA8GtD"}
@@ -1,127 +0,0 @@
1
- /**
2
- * HOME View Renderer
3
- *
4
- * EXTENSION EXAMPLE: This is the pattern all view renderers should follow
5
- *
6
- * Rules:
7
- * - Pure function: receives state → returns rendered string
8
- * - No side effects, no console.log, no state mutations
9
- * - Use UI primitives (Section, Table, Alert, etc.)
10
- * - Import types with `import type` (not regular import)
11
- *
12
- * To create a new view:
13
- * 1. Create file: src/ui/my-view.ts
14
- * 2. Export function: renderMyView(state: AppState): string
15
- * 3. Use UI primitives to build output
16
- * 4. Return joined string (ready for console.log)
17
- *
18
- * See CONTRIBUTING-CLI.md for full extension recipe
19
- */
20
- import { Section, Table, StatusBar, truncateText } from '../ui-primitives.js';
21
- import { C_ACCENT, C_SUCCESS, C_WARN, C_MUTED, C_LINK, RESET } from '../theme.js';
22
- import { isZeroState } from '../state.js';
23
- import { formatRelativeTime, truncateId } from '../utils.js';
24
- /**
25
- * Render HOME view
26
- * @param state - Current application state
27
- * @returns Rendered view as string (ready to console.log)
28
- */
29
- export function renderHomeView(state) {
30
- const lines = [];
31
- // Check for zero state (first-time experience)
32
- const zeroState = isZeroState() && state.customAgents.size === 0;
33
- if (zeroState) {
34
- // Zero state: calm message, clear status, 3 primary actions
35
- const statusLines = [];
36
- statusLines.push(`MODE: ${state.localMode ? C_SUCCESS + 'LOCAL' : C_WARN + 'NOT CONNECTED' + RESET}`);
37
- statusLines.push(`CONNECTION: ${state.gatewayConnected ? C_SUCCESS + 'Connected' : C_WARN + 'Not Connected' + RESET}`);
38
- statusLines.push(`AGENTS: ${C_ACCENT}0${RESET}`);
39
- lines.push(Section('SYSTEM STATUS', statusLines));
40
- lines.push('');
41
- lines.push('Welcome to 4Runr OS');
42
- lines.push('Get started with one of the actions below');
43
- lines.push('');
44
- const actionLines = [];
45
- actionLines.push(`${C_LINK}connect${RESET} ${C_MUTED}Attach gateway / remote${RESET}`);
46
- actionLines.push(`${C_LINK}start${RESET} ${C_MUTED}Begin doing useful work${RESET}`);
47
- actionLines.push(`${C_LINK}help${RESET} ${C_MUTED}Explain system${RESET}`);
48
- lines.push(Section('GET STARTED', actionLines));
49
- lines.push('');
50
- }
51
- else {
52
- // Normal state: full mission control
53
- // 1. SESSION
54
- const sessionLines = [];
55
- const mode = state.localMode ? 'LOCAL' : (state.gatewayConnected ? 'REMOTE' : 'OFFLINE');
56
- sessionLines.push(`Mode: ${C_ACCENT}${mode}${RESET}`);
57
- const workspace = state.currentUser?.username || 'default';
58
- sessionLines.push(`Workspace: ${C_ACCENT}${workspace}${RESET}`);
59
- const connectionStatus = state.gatewayConnected ? `${C_SUCCESS}CONNECTED${RESET}` : `${C_WARN}DISCONNECTED${RESET}`;
60
- const target = state.gatewayConnected ? truncateText(state.gatewayUrl || '', 30) : 'none';
61
- sessionLines.push(`Connection: ${connectionStatus} Target: ${C_MUTED}${target}${RESET}`);
62
- // Uptime would be calculated from boot time in state
63
- sessionLines.push(`Uptime: ${C_MUTED}0m${RESET}`);
64
- lines.push(Section('SESSION', sessionLines));
65
- lines.push('');
66
- // 2. AGENTS
67
- const agentCount = state.customAgents.size;
68
- const agentRows = [];
69
- if (agentCount > 0) {
70
- const topAgents = Array.from(state.customAgents.values()).slice(0, 3);
71
- topAgents.forEach(agent => {
72
- agentRows.push([
73
- truncateText(agent.name, 20),
74
- truncateText(agent.baseAgent, 15),
75
- 'IDLE'
76
- ]);
77
- });
78
- }
79
- const agentTable = agentCount > 0
80
- ? Table(['NAME', 'MODEL', 'STATUS'], agentRows, 3)
81
- : `${C_MUTED} No agents configured${RESET}`;
82
- lines.push(Section('AGENTS', [`Total count: ${C_ACCENT}${agentCount}${RESET}`, agentTable]));
83
- lines.push('');
84
- // 3. RECENT RUNS
85
- const recentRuns = state.runHistory.slice(-3).reverse();
86
- const runRows = [];
87
- if (recentRuns.length > 0) {
88
- recentRuns.forEach(run => {
89
- runRows.push([
90
- truncateId(run.runId, 8),
91
- truncateText(run.agentName, 15),
92
- run.status === 'SUCCESS' ? `${C_SUCCESS}SUCCESS${RESET}` :
93
- run.status === 'FAILED' ? `${C_WARN}FAILED${RESET}` :
94
- `${C_ACCENT}RUNNING${RESET}`,
95
- formatRelativeTime(run.timestamp)
96
- ]);
97
- });
98
- }
99
- const runTable = recentRuns.length > 0
100
- ? Table(['ID', 'AGENT', 'STATUS', 'TIMESTAMP'], runRows, 3)
101
- : `${C_MUTED} No runs yet${RESET}`;
102
- lines.push(Section('RECENT RUNS', [runTable]));
103
- lines.push('');
104
- // 4. QUICK ACTIONS (Footer)
105
- const quickActionLines = [];
106
- quickActionLines.push(`${C_LINK}start${RESET} ${C_MUTED}Begin execution${RESET}`);
107
- quickActionLines.push(`${C_LINK}build${RESET} ${C_MUTED}Create or edit agent${RESET}`);
108
- quickActionLines.push(`${C_LINK}metrics${RESET} ${C_MUTED}View performance${RESET}`);
109
- quickActionLines.push(`${C_LINK}system${RESET} ${C_MUTED}Infrastructure status${RESET}`);
110
- quickActionLines.push(`${C_LINK}help${RESET} ${C_MUTED}Show available commands${RESET}`);
111
- lines.push(Section('QUICK ACTIONS', quickActionLines));
112
- lines.push('');
113
- }
114
- // StatusBar
115
- const mode = state.localMode ? 'LOCAL' : (state.gatewayConnected ? 'REMOTE' : 'OFFLINE');
116
- const statusBar = StatusBar({
117
- mode: mode,
118
- connected: state.gatewayConnected,
119
- target: state.gatewayUrl ? truncateText(state.gatewayUrl, 30) : undefined,
120
- workspace: state.currentUser?.username,
121
- lastAction: 'home',
122
- });
123
- lines.push(statusBar);
124
- lines.push('');
125
- return lines.join('\n');
126
- }
127
- //# sourceMappingURL=home-view.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"home-view.js","sourceRoot":"","sources":["../../src/ui/home-view.ts"],"names":[],"mappings":"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"}