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,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"}
@@ -0,0 +1,60 @@
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 function formatValue(value, options = {}) {
14
+ const { unknownLabel = "UNKNOWN", allowEmpty = false } = options;
15
+ // Handle null/undefined
16
+ if (value === null || value === undefined) {
17
+ return unknownLabel;
18
+ }
19
+ // Handle string "UNKNOWN"
20
+ if (value === "UNKNOWN" || value === "unknown") {
21
+ return unknownLabel;
22
+ }
23
+ // Handle empty string
24
+ if (value === "" && !allowEmpty) {
25
+ return unknownLabel;
26
+ }
27
+ // Handle number NaN
28
+ if (typeof value === "number" && isNaN(value)) {
29
+ return unknownLabel;
30
+ }
31
+ // Convert to string
32
+ return String(value);
33
+ }
34
+ /**
35
+ * Format value with optional cause code
36
+ * Example: "UNKNOWN (TIMEOUT)"
37
+ */
38
+ export function formatValueWithCause(value, cause, options = {}) {
39
+ const formatted = formatValue(value, options);
40
+ if (formatted === options.unknownLabel || formatted === "UNKNOWN") {
41
+ if (cause) {
42
+ return `${formatted} (${cause})`;
43
+ }
44
+ }
45
+ return formatted;
46
+ }
47
+ /**
48
+ * Validate that a value is not fake/placeholder
49
+ * Throws if value looks like a placeholder
50
+ */
51
+ export function validateNotPlaceholder(value) {
52
+ const placeholders = ["N/A", "—", "??", "TBD", "TODO", "null", "undefined"];
53
+ if (typeof value === "string") {
54
+ const upper = value.toUpperCase();
55
+ if (placeholders.some(p => upper.includes(p))) {
56
+ throw new Error(`Value appears to be a placeholder: ${value}`);
57
+ }
58
+ }
59
+ }
60
+ //# sourceMappingURL=unknownHandling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unknownHandling.js","sourceRoot":"","sources":["../../../src/ui/constraints/unknownHandling.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,KAAU,EACV,UAGI,EAAE;IAEN,MAAM,EAAE,YAAY,GAAG,SAAS,EAAE,UAAU,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEjE,wBAAwB;IACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,0BAA0B;IAC1B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,sBAAsB;IACtB,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,oBAAoB;IACpB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,oBAAoB;IACpB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAU,EACV,KAAc,EACd,UAEI,EAAE;IAEN,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAE9C,IAAI,SAAS,KAAK,OAAO,CAAC,YAAY,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,GAAG,SAAS,KAAK,KAAK,GAAG,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAU;IAC/C,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IAE5E,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * FEED Drilldown
3
+ * Phase 6: Full event log with search
4
+ */
5
+ import type { Widgets } from 'neo-blessed';
6
+ import type { UiState } from '../../core/types.js';
7
+ /**
8
+ * Render FEED drilldown
9
+ */
10
+ export declare function renderFeedDrilldown(screen: Widgets.Screen, uiState: UiState, cursor?: number, filter?: string): Widgets.Box;
11
+ //# sourceMappingURL=feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../../../src/ui/drilldowns/feed.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAoBnD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,CAiDb"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * FEED Drilldown
3
+ * Phase 6: Full event log with search
4
+ */
5
+ import { createPanel } from '../primitives/Panel.js';
6
+ import { getBlessedColor } from '../theme/tokens.js';
7
+ /**
8
+ * Filter events by search string
9
+ */
10
+ function filterEvents(events, filter) {
11
+ if (!filter || filter.trim() === '') {
12
+ return events;
13
+ }
14
+ const lowerFilter = filter.toLowerCase();
15
+ return events.filter(event => {
16
+ const tag = event.tag.toLowerCase();
17
+ const msg = event.msg.toLowerCase();
18
+ return tag.includes(lowerFilter) || msg.includes(lowerFilter);
19
+ });
20
+ }
21
+ /**
22
+ * Render FEED drilldown
23
+ */
24
+ export function renderFeedDrilldown(screen, uiState, cursor, filter) {
25
+ const content = [];
26
+ // Header
27
+ content.push(`{${getBlessedColor('primaryPurple')}-fg}{bold}FEED DRILLDOWN{/bold}`);
28
+ if (filter !== undefined) {
29
+ content.push(`{${getBlessedColor('accentCyan')}-fg}Filter: ${filter || ''}{/}_`);
30
+ }
31
+ content.push('');
32
+ // Filter events
33
+ const filteredEvents = filterEvents(uiState.feed.events, filter);
34
+ const resultCount = filteredEvents.length;
35
+ if (filter !== undefined) {
36
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}${resultCount} results{/}`);
37
+ content.push('');
38
+ }
39
+ // Events (most recent at top) - Phase 7: Color only tag, not entire line
40
+ if (filteredEvents.length > 0) {
41
+ filteredEvents.slice().reverse().forEach((event, idx) => {
42
+ const time = new Date(event.ts).toLocaleTimeString();
43
+ // Tag colored, message neutral
44
+ const tagColor = event.tag === 'SEC' || event.tag === 'DB'
45
+ ? getBlessedColor('criticalRed')
46
+ : event.tag === 'NET'
47
+ ? getBlessedColor('warnAmber')
48
+ : getBlessedColor('accentCyan');
49
+ const prefix = cursor === idx ? '→ ' : ' ';
50
+ content.push(`${prefix}{${getBlessedColor('mutedGrey')}-fg}[${time}]{/} {${tagColor}-fg}[${event.tag}]{/} ${event.msg}`);
51
+ });
52
+ }
53
+ else {
54
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}NO EVENTS${filter ? ' MATCHING FILTER' : ''}{/}`);
55
+ }
56
+ // Footer
57
+ content.push('');
58
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Esc: back | /: search | :: palette{/}`);
59
+ return createPanel(screen, {
60
+ title: 'FEED',
61
+ top: 0,
62
+ left: 0,
63
+ width: screen.width,
64
+ height: screen.height,
65
+ content,
66
+ });
67
+ }
68
+ //# sourceMappingURL=feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.js","sourceRoot":"","sources":["../../../src/ui/drilldowns/feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Drilldowns Index
3
+ * Phase 6: Export all drilldown renderers
4
+ */
5
+ export { renderPostureDrilldown } from './posture.js';
6
+ export { renderFeedDrilldown } from './feed.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/drilldowns/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Drilldowns Index
3
+ * Phase 6: Export all drilldown renderers
4
+ */
5
+ export { renderPostureDrilldown } from './posture.js';
6
+ export { renderFeedDrilldown } from './feed.js';
7
+ // Additional drilldowns will be added here
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ui/drilldowns/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,2CAA2C"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * POSTURE Drilldown
3
+ * Phase 6: Full health report
4
+ */
5
+ import type { Widgets } from 'neo-blessed';
6
+ import type { UiState } from '../../core/types.js';
7
+ /**
8
+ * Render POSTURE drilldown
9
+ */
10
+ export declare function renderPostureDrilldown(screen: Widgets.Screen, uiState: UiState, cursor?: number, filter?: string): Widgets.Box;
11
+ //# sourceMappingURL=posture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posture.d.ts","sourceRoot":"","sources":["../../../src/ui/drilldowns/posture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAMnD;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,GAAG,CAuEb"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * POSTURE Drilldown
3
+ * Phase 6: Full health report
4
+ */
5
+ import { createPanel } from '../primitives/Panel.js';
6
+ import { getBlessedColor } from '../theme/tokens.js';
7
+ import { formatLabelValue } from '../theme/typography.js';
8
+ import { statusToSeverity } from '../theme/borders.js';
9
+ /**
10
+ * Render POSTURE drilldown
11
+ */
12
+ export function renderPostureDrilldown(screen, uiState, cursor, filter) {
13
+ const content = [];
14
+ const posture = uiState.posture;
15
+ // Header
16
+ content.push(`{${getBlessedColor('primaryPurple')}-fg}{bold}POSTURE DRILLDOWN{/bold}`);
17
+ content.push('');
18
+ // Overall posture + risk (Phase 7: severity color discipline)
19
+ const postureSeverity = statusToSeverity(posture.posture);
20
+ const postureColor = postureSeverity === 'OK' ? getBlessedColor('successGreen') :
21
+ postureSeverity === 'CRITICAL' ? getBlessedColor('criticalRed') :
22
+ postureSeverity === 'WARNING' ? getBlessedColor('warnAmber') : getBlessedColor('mutedGrey');
23
+ content.push(formatLabelValue('POSTURE', posture.posture, 14, postureColor));
24
+ const riskSeverity = posture.risk === 'LOW' ? 'OK' : posture.risk === 'HIGH' ? 'CRITICAL' : 'WARNING';
25
+ const riskColor = riskSeverity === 'OK' ? getBlessedColor('successGreen') :
26
+ riskSeverity === 'CRITICAL' ? getBlessedColor('criticalRed') :
27
+ riskSeverity === 'WARNING' ? getBlessedColor('warnAmber') : getBlessedColor('mutedGrey');
28
+ content.push(formatLabelValue('RISK', posture.risk, 14, riskColor));
29
+ content.push('');
30
+ // Last change + cause
31
+ const lastChange = posture.lastChange !== 'UNKNOWN'
32
+ ? new Date(posture.lastChange).toLocaleString()
33
+ : 'UNKNOWN';
34
+ content.push(formatLabelValue('LAST CHANGE', lastChange, 14));
35
+ if (posture.cause !== 'UNKNOWN') {
36
+ content.push(formatLabelValue('CAUSE', posture.cause, 14, getBlessedColor('warnAmber')));
37
+ }
38
+ content.push('');
39
+ // Health checks table
40
+ content.push(`{${getBlessedColor('accentCyan')}-fg}HEALTH CHECKS{/}`);
41
+ content.push('─'.repeat(60));
42
+ const deps = posture.dependencies;
43
+ const checks = [
44
+ { name: 'Config', status: deps.config },
45
+ { name: 'Gateway', status: deps.gateway },
46
+ { name: 'Database', status: deps.database },
47
+ { name: 'Registry', status: deps.registry },
48
+ ];
49
+ checks.forEach(check => {
50
+ const statusSeverity = check.status === 'OK' ? 'OK' : check.status === 'ERROR' ? 'CRITICAL' : 'WARNING';
51
+ const statusColor = statusSeverity === 'OK' ? getBlessedColor('successGreen') :
52
+ statusSeverity === 'CRITICAL' ? getBlessedColor('criticalRed') :
53
+ statusSeverity === 'WARNING' ? getBlessedColor('warnAmber') : getBlessedColor('mutedGrey');
54
+ content.push(formatLabelValue(check.name, check.status, 14, statusColor));
55
+ });
56
+ // Remediation hint (if any dependency down)
57
+ const hasError = Object.values(deps).some(s => s === 'ERROR' || s === 'WARN');
58
+ if (hasError) {
59
+ content.push('');
60
+ content.push(`{${getBlessedColor('warnAmber')}-fg}REMEDIATION: Check gateway connection and database status{/}`);
61
+ }
62
+ // Footer
63
+ content.push('');
64
+ content.push(`{${getBlessedColor('mutedGrey')}-fg}Esc: back | /: search | :: palette{/}`);
65
+ return createPanel(screen, {
66
+ title: 'POSTURE',
67
+ top: 0,
68
+ left: 0,
69
+ width: screen.width,
70
+ height: screen.height,
71
+ content,
72
+ });
73
+ }
74
+ //# sourceMappingURL=posture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posture.js","sourceRoot":"","sources":["../../../src/ui/drilldowns/posture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Key Maps
3
+ * Phase 6: Centralized key binding handlers
4
+ */
5
+ import type { Screen } from './types.js';
6
+ /**
7
+ * Global keymap (works on all screens)
8
+ */
9
+ export declare function handleGlobalKey(key: string, screen: Screen): boolean;
10
+ /**
11
+ * Hub keymap
12
+ */
13
+ export declare function handleHubKey(key: string, screen: Screen): boolean;
14
+ /**
15
+ * Drilldown keymap
16
+ */
17
+ export declare function handleDrilldownKey(key: string, screen: Screen): boolean;
18
+ /**
19
+ * Palette keymap
20
+ */
21
+ export declare function handlePaletteKey(key: string, screen: Screen, input: string): {
22
+ handled: boolean;
23
+ newInput?: string;
24
+ execute?: boolean;
25
+ };
26
+ //# sourceMappingURL=keymaps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymaps.d.ts","sourceRoot":"","sources":["../../../src/ui/navigation/keymaps.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,YAAY,CAAC;AAIlD;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAqCpE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA8BjE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA+BvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CA0BvI"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Key Maps
3
+ * Phase 6: Centralized key binding handlers
4
+ */
5
+ import { getNextPanel, getPreviousPanel } from './types.js';
6
+ import { navigationState } from './state.js';
7
+ /**
8
+ * Global keymap (works on all screens)
9
+ */
10
+ export function handleGlobalKey(key, screen) {
11
+ switch (key) {
12
+ case 'escape':
13
+ case 'C-c':
14
+ // Esc: back to hub (from DRILLDOWN/PALETTE/HELP)
15
+ if (screen.name !== "HUB") {
16
+ navigationState.goToHub();
17
+ return true;
18
+ }
19
+ // Ctrl+C: quit
20
+ if (key === 'C-c') {
21
+ process.exit(0);
22
+ return true;
23
+ }
24
+ break;
25
+ case 'q':
26
+ // Quit (optional)
27
+ process.exit(0);
28
+ return true;
29
+ case ':':
30
+ // Open palette
31
+ navigationState.goToPalette();
32
+ return true;
33
+ case '?':
34
+ // Help toggle
35
+ if (screen.name === "HELP") {
36
+ navigationState.goToHub();
37
+ }
38
+ else {
39
+ navigationState.goToHelp();
40
+ }
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ /**
46
+ * Hub keymap
47
+ */
48
+ export function handleHubKey(key, screen) {
49
+ if (screen.name !== "HUB")
50
+ return false;
51
+ switch (key) {
52
+ case 'tab':
53
+ // Next panel
54
+ const next = getNextPanel(screen.focusedPanelId);
55
+ navigationState.setScreen({ ...screen, focusedPanelId: next });
56
+ return true;
57
+ case 'S-tab':
58
+ // Previous panel (if supported)
59
+ const prev = getPreviousPanel(screen.focusedPanelId);
60
+ navigationState.setScreen({ ...screen, focusedPanelId: prev });
61
+ return true;
62
+ case 'enter':
63
+ // Open drilldown
64
+ navigationState.goToDrilldown(screen.focusedPanelId);
65
+ return true;
66
+ case '/':
67
+ // Search (if FEED is focused)
68
+ if (screen.focusedPanelId === "FEED") {
69
+ navigationState.goToDrilldown("FEED", undefined, "");
70
+ }
71
+ return true;
72
+ }
73
+ return false;
74
+ }
75
+ /**
76
+ * Drilldown keymap
77
+ */
78
+ export function handleDrilldownKey(key, screen) {
79
+ if (screen.name !== "DRILLDOWN")
80
+ return false;
81
+ switch (key) {
82
+ case '/':
83
+ // Toggle search/filter
84
+ if (screen.filter === undefined) {
85
+ navigationState.goToDrilldown(screen.panelId, screen.cursor, "");
86
+ }
87
+ else {
88
+ navigationState.goToDrilldown(screen.panelId, screen.cursor, undefined);
89
+ }
90
+ return true;
91
+ case 'up':
92
+ case 'k':
93
+ // Scroll up
94
+ if (screen.cursor !== undefined) {
95
+ navigationState.goToDrilldown(screen.panelId, Math.max(0, (screen.cursor || 0) - 1), screen.filter);
96
+ }
97
+ return true;
98
+ case 'down':
99
+ case 'j':
100
+ // Scroll down
101
+ if (screen.cursor !== undefined) {
102
+ navigationState.goToDrilldown(screen.panelId, (screen.cursor || 0) + 1, screen.filter);
103
+ }
104
+ return true;
105
+ }
106
+ return false;
107
+ }
108
+ /**
109
+ * Palette keymap
110
+ */
111
+ export function handlePaletteKey(key, screen, input) {
112
+ if (screen.name !== "PALETTE")
113
+ return { handled: false };
114
+ switch (key) {
115
+ case 'up':
116
+ // Select previous suggestion (would need to track selection index)
117
+ return { handled: true };
118
+ case 'down':
119
+ // Select next suggestion
120
+ return { handled: true };
121
+ case 'enter':
122
+ // Execute selected command
123
+ return { handled: true, execute: true };
124
+ default:
125
+ // Character input
126
+ if (key.length === 1) {
127
+ return { handled: true, newInput: input + key };
128
+ }
129
+ if (key === 'backspace' || key === 'C-h') {
130
+ return { handled: true, newInput: input.slice(0, -1) };
131
+ }
132
+ return { handled: false };
133
+ }
134
+ }
135
+ //# sourceMappingURL=keymaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymaps.js","sourceRoot":"","sources":["../../../src/ui/navigation/keymaps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Command Palette
3
+ * Phase 6: Fuzzy matching command palette
4
+ */
5
+ import type { PaletteItem } from './types.js';
6
+ /**
7
+ * Fuzzy match commands
8
+ */
9
+ export declare function fuzzyMatch(input: string, maxResults?: number): PaletteItem[];
10
+ //# sourceMappingURL=palette.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"palette.d.ts","sourceRoot":"","sources":["../../../src/ui/navigation/palette.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAiF9C;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,MAAW,GAAG,WAAW,EAAE,CAkDhF"}