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,83 @@
1
+ /**
2
+ * Network Collector
3
+ * Phase 3: Origin class, public IP masked, latency, geo
4
+ * Runs slower (expensive checks)
5
+ */
6
+ import { getSystemState } from '../system-state.js';
7
+ /**
8
+ * Collect network context
9
+ * Expensive checks - should run slower (10-30s)
10
+ */
11
+ export async function collectNetwork(appState) {
12
+ try {
13
+ let systemState;
14
+ try {
15
+ systemState = getSystemState(appState, false);
16
+ }
17
+ catch {
18
+ systemState = null;
19
+ }
20
+ if (!systemState) {
21
+ return {
22
+ status: 'UNAVAILABLE',
23
+ asOf: Date.now(),
24
+ source: 'collector_network',
25
+ staleAfterMs: 30000, // Expensive - refresh every 30s
26
+ reasonCode: 'NO_SYSTEM_STATE',
27
+ message: 'System state not available',
28
+ action: 'system status',
29
+ };
30
+ }
31
+ const network = systemState.networkContext;
32
+ // Mask public IP (v1: return HIDDEN)
33
+ const publicIpMasked = "HIDDEN";
34
+ // Latency (simplified - would ping gateway)
35
+ const latencyMs = "UNKNOWN";
36
+ const data = {
37
+ originRegion: network.operatorOrigin.region || "UNKNOWN",
38
+ originClass: network.operatorOrigin.networkType,
39
+ gatewayRegion: network.targetInfrastructure.gatewayRegion || "UNKNOWN",
40
+ dbRegion: network.targetInfrastructure.databaseRegion || "NONE",
41
+ latencyMs,
42
+ latencyClass: network.targetInfrastructure.latencyClass,
43
+ publicIpMasked,
44
+ };
45
+ // Phase 9: Determine status
46
+ const now = Date.now();
47
+ let status = 'LIVE';
48
+ let reasonCode;
49
+ let message;
50
+ let action;
51
+ if (!appState.gatewayConnected) {
52
+ status = 'UNAVAILABLE';
53
+ reasonCode = 'GATEWAY_NOT_CONNECTED';
54
+ message = 'Gateway not connected';
55
+ action = 'system connect';
56
+ }
57
+ else {
58
+ status = 'LIVE';
59
+ }
60
+ return {
61
+ status,
62
+ asOf: now,
63
+ data,
64
+ source: 'collector_network',
65
+ staleAfterMs: 30000, // Expensive - refresh every 30s
66
+ reasonCode,
67
+ message,
68
+ action,
69
+ };
70
+ }
71
+ catch (error) {
72
+ return {
73
+ status: 'UNAVAILABLE',
74
+ asOf: Date.now(),
75
+ source: 'collector_network',
76
+ staleAfterMs: 30000,
77
+ reasonCode: 'COLLECTION_ERROR',
78
+ message: error.message || 'Unknown error',
79
+ action: 'system status',
80
+ };
81
+ }
82
+ }
83
+ //# sourceMappingURL=collector_network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector_network.js","sourceRoot":"","sources":["../../src/collectors/collector_network.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAYpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAkB;IACrD,IAAI,CAAC;QACH,IAAI,WAAW,CAAC;QAChB,IAAI,CAAC;YACH,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;gBACL,MAAM,EAAE,aAAgC;gBACxC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;gBAChB,MAAM,EAAE,mBAAmB;gBAC3B,YAAY,EAAE,KAAK,EAAE,gCAAgC;gBACrD,UAAU,EAAE,iBAAiB;gBAC7B,OAAO,EAAE,4BAA4B;gBACrC,MAAM,EAAE,eAAe;aACxB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC;QAE3C,qCAAqC;QACrC,MAAM,cAAc,GAAW,QAAQ,CAAC;QAExC,4CAA4C;QAC5C,MAAM,SAAS,GAAuB,SAAS,CAAC;QAEhD,MAAM,IAAI,GAAgB;YACxB,YAAY,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,IAAI,SAAS;YACxD,WAAW,EAAE,OAAO,CAAC,cAAc,CAAC,WAAW;YAC/C,aAAa,EAAE,OAAO,CAAC,oBAAoB,CAAC,aAAa,IAAI,SAAS;YACtE,QAAQ,EAAE,OAAO,CAAC,oBAAoB,CAAC,cAAc,IAAI,MAAM;YAC/D,SAAS;YACT,YAAY,EAAE,OAAO,CAAC,oBAAoB,CAAC,YAAY;YACvD,cAAc;SACf,CAAC;QAEF,4BAA4B;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,MAAM,GAAoB,MAAM,CAAC;QACrC,IAAI,UAA8B,CAAC;QACnC,IAAI,OAA2B,CAAC;QAChC,IAAI,MAA0B,CAAC;QAE/B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YAC/B,MAAM,GAAG,aAAa,CAAC;YACvB,UAAU,GAAG,uBAAuB,CAAC;YACrC,OAAO,GAAG,uBAAuB,CAAC;YAClC,MAAM,GAAG,gBAAgB,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;QAED,OAAO;YACL,MAAM;YACN,IAAI,EAAE,GAAG;YACT,IAAI;YACJ,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAE,KAAK,EAAE,gCAAgC;YACrD,UAAU;YACV,OAAO;YACP,MAAM;SACP,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;YAChB,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;YACzC,MAAM,EAAE,eAAe;SACxB,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Posture Collector
3
+ * Phase 3: Derive dependencies, posture, risk, cause
4
+ */
5
+ import type { CollectorResult } from '../core/types.js';
6
+ import type { AppState } from '../store.js';
7
+ export type PostureData = {
8
+ posture: "OPERATIONAL" | "DEGRADED" | "OFFLINE" | "CRITICAL" | "UNKNOWN";
9
+ risk: "LOW" | "ELEVATED" | "HIGH" | "UNKNOWN";
10
+ connected: boolean | "UNKNOWN";
11
+ target: string | "UNKNOWN";
12
+ lastChange: number | "UNKNOWN";
13
+ cause: string | "UNKNOWN";
14
+ dependencies: {
15
+ config: "OK" | "WARN" | "ERROR" | "UNKNOWN";
16
+ gateway: "OK" | "WARN" | "ERROR" | "UNKNOWN";
17
+ database: "OK" | "WARN" | "ERROR" | "UNKNOWN";
18
+ registry: "OK" | "WARN" | "ERROR" | "UNKNOWN";
19
+ };
20
+ };
21
+ /**
22
+ * Collect posture data
23
+ */
24
+ export declare function collectPosture(appState: AppState): Promise<CollectorResult<PostureData>>;
25
+ //# sourceMappingURL=collector_posture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector_posture.d.ts","sourceRoot":"","sources":["../../src/collectors/collector_posture.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,aAAa,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACzE,IAAI,EAAE,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,YAAY,EAAE;QACZ,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;QAC5C,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;QAC7C,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;QAC9C,QAAQ,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;KAC/C,CAAC;CACH,CAAC;AAmIF;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAiF9F"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Posture Collector
3
+ * Phase 3: Derive dependencies, posture, risk, cause
4
+ */
5
+ // Track last posture change timestamp
6
+ let lastPostureChange = null;
7
+ let lastPosture = null;
8
+ /**
9
+ * Derive dependencies from app state
10
+ */
11
+ function deriveDependencies(appState) {
12
+ const deps = {
13
+ config: "UNKNOWN",
14
+ gateway: "UNKNOWN",
15
+ database: "UNKNOWN",
16
+ registry: "UNKNOWN",
17
+ };
18
+ // Config: Check if system is ready
19
+ if (appState.systemReady) {
20
+ deps.config = "OK";
21
+ }
22
+ else {
23
+ deps.config = "ERROR";
24
+ }
25
+ // Gateway: Check connection
26
+ if (appState.gatewayConnected && appState.gatewayClient) {
27
+ deps.gateway = "OK";
28
+ }
29
+ else if (appState.localMode) {
30
+ deps.gateway = "OK"; // Local mode doesn't need gateway
31
+ }
32
+ else if (appState.gatewayUrl) {
33
+ deps.gateway = "WARN"; // Has URL but not connected
34
+ }
35
+ else {
36
+ deps.gateway = "ERROR";
37
+ }
38
+ // Database: Check if persistence is available
39
+ if (appState.gatewayConnected) {
40
+ deps.database = "OK";
41
+ }
42
+ else if (appState.localMode) {
43
+ deps.database = "WARN"; // Local mode = in-memory
44
+ }
45
+ else {
46
+ deps.database = "ERROR";
47
+ }
48
+ // Registry: Check if agents are loaded
49
+ if (appState.customAgents.size >= 0) {
50
+ deps.registry = "OK";
51
+ }
52
+ else {
53
+ deps.registry = "WARN";
54
+ }
55
+ return deps;
56
+ }
57
+ /**
58
+ * Derive posture from dependencies
59
+ * Deterministic rules
60
+ */
61
+ function derivePosture(dependencies, connected) {
62
+ // If gateway=ERROR OR database=ERROR → posture = CRITICAL
63
+ if (dependencies.gateway === "ERROR" || dependencies.database === "ERROR") {
64
+ return "CRITICAL";
65
+ }
66
+ // Else if any dependency is WARN/ERROR → posture = DEGRADED
67
+ if (dependencies.config === "WARN" || dependencies.config === "ERROR" ||
68
+ dependencies.gateway === "WARN" ||
69
+ dependencies.database === "WARN" ||
70
+ dependencies.registry === "WARN" || dependencies.registry === "ERROR") {
71
+ return "DEGRADED";
72
+ }
73
+ // Else if connected=false → posture = OFFLINE (unless critical)
74
+ if (!connected) {
75
+ return "OFFLINE";
76
+ }
77
+ // Else posture = OPERATIONAL
78
+ return "OPERATIONAL";
79
+ }
80
+ /**
81
+ * Derive risk from posture
82
+ */
83
+ function deriveRisk(posture) {
84
+ if (posture === "CRITICAL")
85
+ return "HIGH";
86
+ if (posture === "DEGRADED")
87
+ return "ELEVATED";
88
+ if (posture === "OPERATIONAL")
89
+ return "LOW";
90
+ if (posture === "OFFLINE")
91
+ return "ELEVATED";
92
+ return "UNKNOWN";
93
+ }
94
+ /**
95
+ * Derive cause from dependencies and posture
96
+ */
97
+ function deriveCause(dependencies, posture) {
98
+ if (posture === "OPERATIONAL") {
99
+ return "UNKNOWN"; // Blank if operational
100
+ }
101
+ // Prioritize error messages
102
+ if (dependencies.gateway === "ERROR") {
103
+ return "Gateway connection failed";
104
+ }
105
+ if (dependencies.database === "ERROR") {
106
+ return "Database unavailable";
107
+ }
108
+ if (dependencies.config === "ERROR") {
109
+ return "Configuration error";
110
+ }
111
+ if (dependencies.registry === "ERROR") {
112
+ return "Registry load failed";
113
+ }
114
+ if (dependencies.gateway === "WARN") {
115
+ return "Gateway not connected";
116
+ }
117
+ if (dependencies.database === "WARN") {
118
+ return "Database not initialized";
119
+ }
120
+ return "UNKNOWN";
121
+ }
122
+ /**
123
+ * Collect posture data
124
+ */
125
+ export async function collectPosture(appState) {
126
+ try {
127
+ const dependencies = deriveDependencies(appState);
128
+ const connected = appState.gatewayConnected || appState.localMode;
129
+ const posture = derivePosture(dependencies, connected);
130
+ const risk = deriveRisk(posture);
131
+ const cause = deriveCause(dependencies, posture);
132
+ // Track last change
133
+ if (lastPosture !== null && lastPosture !== posture) {
134
+ lastPostureChange = Date.now();
135
+ }
136
+ lastPosture = posture;
137
+ const data = {
138
+ posture,
139
+ risk,
140
+ connected: connected ? true : false,
141
+ target: appState.gatewayUrl?.replace(/^https?:\/\//, '').substring(0, 30) || "UNKNOWN",
142
+ lastChange: lastPostureChange || "UNKNOWN",
143
+ cause,
144
+ dependencies,
145
+ };
146
+ // Phase 9: Determine status
147
+ const now = Date.now();
148
+ let status = 'LIVE';
149
+ let reasonCode;
150
+ let message;
151
+ let action;
152
+ if (dependencies.gateway === "ERROR" || dependencies.database === "ERROR") {
153
+ status = 'UNAVAILABLE';
154
+ reasonCode = dependencies.gateway === "ERROR" ? 'GATEWAY_ERROR' : 'DB_ERROR';
155
+ message = dependencies.gateway === "ERROR"
156
+ ? 'Gateway connection failed'
157
+ : 'Database connection failed';
158
+ action = dependencies.gateway === "ERROR"
159
+ ? 'system gateway status'
160
+ : 'system connect-db';
161
+ }
162
+ else if (!connected) {
163
+ status = 'UNAVAILABLE';
164
+ reasonCode = 'GATEWAY_NOT_CONNECTED';
165
+ message = 'Not connected to gateway';
166
+ action = 'system connect';
167
+ }
168
+ else if (dependencies.config === "ERROR") {
169
+ status = 'UNAVAILABLE';
170
+ reasonCode = 'CONFIG_ERROR';
171
+ message = 'Configuration error';
172
+ action = 'system config';
173
+ }
174
+ else {
175
+ // Check if stale
176
+ const age = now - (lastPostureChange || now);
177
+ if (age > 2000) {
178
+ status = 'STALE';
179
+ }
180
+ else {
181
+ status = 'LIVE';
182
+ }
183
+ }
184
+ return {
185
+ status,
186
+ asOf: now,
187
+ data,
188
+ source: 'collector_posture',
189
+ staleAfterMs: 2000,
190
+ reasonCode,
191
+ message,
192
+ action,
193
+ };
194
+ }
195
+ catch (error) {
196
+ return {
197
+ status: 'UNAVAILABLE',
198
+ asOf: Date.now(),
199
+ source: 'collector_posture',
200
+ staleAfterMs: 2000,
201
+ reasonCode: 'COLLECTION_ERROR',
202
+ message: error.message || 'Unknown error',
203
+ action: 'system status',
204
+ };
205
+ }
206
+ }
207
+ //# sourceMappingURL=collector_posture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector_posture.js","sourceRoot":"","sources":["../../src/collectors/collector_posture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Resources Collector
3
+ * Phase 3: Read CPU%, load, RAM, disk, uptime, proc count
4
+ */
5
+ import type { CollectorResult } from '../core/types.js';
6
+ export type ResourcesData = {
7
+ cpuPercent: number | "UNKNOWN";
8
+ load1m: number | "UNKNOWN";
9
+ ramUsedMb: number | "UNKNOWN";
10
+ ramTotalMb: number | "UNKNOWN";
11
+ diskUsedGb: number | "UNKNOWN";
12
+ diskTotalGb: number | "UNKNOWN";
13
+ uptimeSec: number | "UNKNOWN";
14
+ procCount: number | "UNKNOWN";
15
+ };
16
+ /**
17
+ * Collect system resources
18
+ * Must work on Linux + degrade gracefully elsewhere
19
+ */
20
+ export declare function collectResources(): Promise<CollectorResult<ResourcesData>>;
21
+ //# sourceMappingURL=collector_resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector_resources.d.ts","sourceRoot":"","sources":["../../src/collectors/collector_resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,kBAAkB,CAAC;AAEzE,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CA+EhF"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Resources Collector
3
+ * Phase 3: Read CPU%, load, RAM, disk, uptime, proc count
4
+ */
5
+ import * as os from 'os';
6
+ /**
7
+ * Collect system resources
8
+ * Must work on Linux + degrade gracefully elsewhere
9
+ */
10
+ export async function collectResources() {
11
+ try {
12
+ const data = {
13
+ // CPU - simplified (would need actual monitoring)
14
+ cpuPercent: "UNKNOWN",
15
+ // Load average (1 minute)
16
+ load1m: (() => {
17
+ try {
18
+ const load = os.loadavg();
19
+ if (load && load.length > 0) {
20
+ return load[0];
21
+ }
22
+ }
23
+ catch {
24
+ // Not available on Windows
25
+ }
26
+ return "UNKNOWN";
27
+ })(),
28
+ // RAM
29
+ ramUsedMb: (() => {
30
+ try {
31
+ const total = os.totalmem();
32
+ const free = os.freemem();
33
+ const used = total - free;
34
+ return Math.round(used / 1024 / 1024);
35
+ }
36
+ catch {
37
+ return "UNKNOWN";
38
+ }
39
+ })(),
40
+ ramTotalMb: (() => {
41
+ try {
42
+ const total = os.totalmem();
43
+ return Math.round(total / 1024 / 1024);
44
+ }
45
+ catch {
46
+ return "UNKNOWN";
47
+ }
48
+ })(),
49
+ // Disk - simplified (would need actual disk monitoring)
50
+ diskUsedGb: "UNKNOWN",
51
+ diskTotalGb: "UNKNOWN",
52
+ // Uptime
53
+ uptimeSec: (() => {
54
+ try {
55
+ return os.uptime();
56
+ }
57
+ catch {
58
+ return "UNKNOWN";
59
+ }
60
+ })(),
61
+ // Process count - simplified
62
+ procCount: "UNKNOWN",
63
+ };
64
+ // Phase 9: Resources are usually LIVE if collected successfully
65
+ const now = Date.now();
66
+ const status = 'LIVE';
67
+ return {
68
+ status,
69
+ asOf: now,
70
+ data,
71
+ source: 'collector_resources',
72
+ staleAfterMs: 2000, // Refresh every 2s
73
+ };
74
+ }
75
+ catch (error) {
76
+ return {
77
+ status: 'UNAVAILABLE',
78
+ asOf: Date.now(),
79
+ source: 'collector_resources',
80
+ staleAfterMs: 2000,
81
+ reasonCode: 'COLLECTION_ERROR',
82
+ message: error.message || 'Unknown error',
83
+ action: 'system resources',
84
+ };
85
+ }
86
+ }
87
+ //# sourceMappingURL=collector_resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector_resources.js","sourceRoot":"","sources":["../../src/collectors/collector_resources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAczB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,MAAM,IAAI,GAAkB;YAC1B,kDAAkD;YAClD,UAAU,EAAE,SAAS;YAErB,0BAA0B;YAC1B,MAAM,EAAE,CAAC,GAAG,EAAE;gBACZ,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;oBAC1B,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,2BAA2B;gBAC7B,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC,EAAE;YAEJ,MAAM;YACN,SAAS,EAAE,CAAC,GAAG,EAAE;gBACf,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;oBAC5B,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;oBAC1B,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;oBAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;gBACxC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,EAAE;YAEJ,UAAU,EAAE,CAAC,GAAG,EAAE;gBAChB,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,EAAE;YAEJ,wDAAwD;YACxD,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,SAAS;YAEtB,SAAS;YACT,SAAS,EAAE,CAAC,GAAG,EAAE;gBACf,IAAI,CAAC;oBACH,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,EAAE;YAEJ,6BAA6B;YAC7B,SAAS,EAAE,SAAS;SACrB,CAAC;QAEF,gEAAgE;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAoB,MAAM,CAAC;QAEvC,OAAO;YACL,MAAM;YACN,IAAI,EAAE,GAAG;YACT,IAAI;YACJ,MAAM,EAAE,qBAAqB;YAC7B,YAAY,EAAE,IAAI,EAAE,mBAAmB;SACxC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;YAChB,MAAM,EAAE,qBAAqB;YAC7B,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,eAAe;YACzC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Collector Helpers
3
+ * Phase 9: Helper functions for collector contract compliance
4
+ */
5
+ import type { CollectorResult, CollectorStatus } from '../core/types.js';
6
+ /**
7
+ * Convert old-style collector result to new contract
8
+ * Temporary migration helper
9
+ */
10
+ export declare function toNewCollectorResult<T>(oldResult: {
11
+ ok: boolean;
12
+ data?: T;
13
+ ts: number;
14
+ source: string;
15
+ staleAfterMs: number;
16
+ error?: {
17
+ code: string;
18
+ message: string;
19
+ };
20
+ }, determineStatus?: (oldResult: any) => CollectorStatus): CollectorResult<T>;
21
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/collectors/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,SAAS,EAAE;IACT,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C,EACD,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,KAAK,eAAe,GACpD,eAAe,CAAC,CAAC,CAAC,CAyCpB"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Collector Helpers
3
+ * Phase 9: Helper functions for collector contract compliance
4
+ */
5
+ /**
6
+ * Convert old-style collector result to new contract
7
+ * Temporary migration helper
8
+ */
9
+ export function toNewCollectorResult(oldResult, determineStatus) {
10
+ const now = Date.now();
11
+ // Determine status
12
+ let status;
13
+ if (determineStatus) {
14
+ status = determineStatus(oldResult);
15
+ }
16
+ else if (!oldResult.ok) {
17
+ status = 'UNAVAILABLE';
18
+ }
19
+ else {
20
+ // Check if stale
21
+ const age = now - oldResult.ts;
22
+ if (age > oldResult.staleAfterMs) {
23
+ status = 'STALE';
24
+ }
25
+ else {
26
+ status = 'LIVE';
27
+ }
28
+ }
29
+ // Build new result
30
+ const result = {
31
+ status,
32
+ asOf: oldResult.ts,
33
+ source: oldResult.source,
34
+ staleAfterMs: oldResult.staleAfterMs,
35
+ };
36
+ // Add data for LIVE/STALE
37
+ if (status === 'LIVE' || status === 'STALE') {
38
+ result.data = oldResult.data;
39
+ }
40
+ // Add reasonCode/message/action for UNAVAILABLE/DISABLED
41
+ if (status === 'UNAVAILABLE' || status === 'DISABLED') {
42
+ if (oldResult.error) {
43
+ result.reasonCode = oldResult.error.code;
44
+ result.message = oldResult.error.message;
45
+ }
46
+ }
47
+ return result;
48
+ }
49
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/collectors/helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAOC,EACD,eAAqD;IAErD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEvB,mBAAmB;IACnB,IAAI,MAAuB,CAAC;IAC5B,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;SAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;QACzB,MAAM,GAAG,aAAa,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,iBAAiB;QACjB,MAAM,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC;QAC/B,IAAI,GAAG,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAAuB;QACjC,MAAM;QACN,IAAI,EAAE,SAAS,CAAC,EAAE;QAClB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,YAAY,EAAE,SAAS,CAAC,YAAY;KACrC,CAAC;IAEF,0BAA0B;IAC1B,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC;IAC/B,CAAC;IAED,yDAAyD;IACzD,IAAI,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QACtD,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACpB,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;YACzC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Collector Registry
3
+ * Phase 8: Panel-to-collector integrity
4
+ */
5
+ import { collectPosture } from '../collectors/collector_posture.js';
6
+ import { collectNetwork } from '../collectors/collector_network.js';
7
+ import { collectResources } from '../collectors/collector_resources.js';
8
+ import { collectAssets } from '../collectors/collector_assets.js';
9
+ import { collectCapabilities } from '../collectors/collector_capabilities.js';
10
+ import { collectFeed } from '../collectors/collector_feed.js';
11
+ import { collectGeo } from '../collectors/collector_geo.js';
12
+ import type { AppState } from '../store.js';
13
+ import type { CollectorResult } from './types.js';
14
+ /**
15
+ * Collector registry - single source of truth
16
+ * Maps panel IDs to collector functions
17
+ */
18
+ export declare const collectorRegistry: {
19
+ readonly posture: typeof collectPosture;
20
+ readonly network: typeof collectNetwork;
21
+ readonly resources: typeof collectResources;
22
+ readonly assets: typeof collectAssets;
23
+ readonly capabilities: typeof collectCapabilities;
24
+ readonly feed: typeof collectFeed;
25
+ readonly geo: typeof collectGeo;
26
+ };
27
+ /**
28
+ * Panel-to-collector mapping
29
+ * Every panel must reference a valid collector key
30
+ */
31
+ export declare const panelToCollectorMap: Record<string, keyof typeof collectorRegistry>;
32
+ /**
33
+ * Validate that all hub panels reference valid collectors
34
+ */
35
+ export declare function validatePanelCollectorIntegrity(panelIds: string[], throwOnError?: boolean): {
36
+ valid: boolean;
37
+ errors: string[];
38
+ };
39
+ /**
40
+ * Get collector function for a panel
41
+ */
42
+ export declare function getCollectorForPanel(panelId: string): ((appState: AppState) => Promise<CollectorResult<any>>) | null;
43
+ //# sourceMappingURL=collectorRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectorRegistry.d.ts","sourceRoot":"","sources":["../../src/core/collectorRegistry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;CAQpB,CAAC;AAEX;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,iBAAiB,CASrE,CAAC;AAEX;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,MAAM,EAAE,EAClB,YAAY,GAAE,OAAe,GAC5B;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAwBtC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAYpH"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Collector Registry
3
+ * Phase 8: Panel-to-collector integrity
4
+ */
5
+ import { collectPosture } from '../collectors/collector_posture.js';
6
+ import { collectNetwork } from '../collectors/collector_network.js';
7
+ import { collectResources } from '../collectors/collector_resources.js';
8
+ import { collectAssets } from '../collectors/collector_assets.js';
9
+ import { collectCapabilities } from '../collectors/collector_capabilities.js';
10
+ import { collectFeed } from '../collectors/collector_feed.js';
11
+ import { collectGeo } from '../collectors/collector_geo.js';
12
+ /**
13
+ * Collector registry - single source of truth
14
+ * Maps panel IDs to collector functions
15
+ */
16
+ export const collectorRegistry = {
17
+ posture: collectPosture,
18
+ network: collectNetwork,
19
+ resources: collectResources,
20
+ assets: collectAssets,
21
+ capabilities: collectCapabilities,
22
+ feed: collectFeed,
23
+ geo: collectGeo,
24
+ };
25
+ /**
26
+ * Panel-to-collector mapping
27
+ * Every panel must reference a valid collector key
28
+ */
29
+ export const panelToCollectorMap = {
30
+ POSTURE: 'posture',
31
+ RESOURCES: 'resources',
32
+ ASSETS: 'assets',
33
+ FEED: 'feed',
34
+ NETWORK: 'network',
35
+ CAPABILITIES: 'capabilities',
36
+ // GEO INTEL uses 'geo' collector
37
+ 'GEO INTEL': 'geo',
38
+ };
39
+ /**
40
+ * Validate that all hub panels reference valid collectors
41
+ */
42
+ export function validatePanelCollectorIntegrity(panelIds, throwOnError = false) {
43
+ const errors = [];
44
+ panelIds.forEach(panelId => {
45
+ const collectorKey = panelToCollectorMap[panelId];
46
+ if (!collectorKey) {
47
+ errors.push(`Panel "${panelId}" has no collector mapping`);
48
+ return;
49
+ }
50
+ if (!collectorRegistry[collectorKey]) {
51
+ errors.push(`Panel "${panelId}" references missing collector "${collectorKey}"`);
52
+ }
53
+ });
54
+ if (errors.length > 0 && throwOnError) {
55
+ throw new Error(`Panel-collector integrity check failed:\n${errors.join('\n')}`);
56
+ }
57
+ return {
58
+ valid: errors.length === 0,
59
+ errors,
60
+ };
61
+ }
62
+ /**
63
+ * Get collector function for a panel
64
+ */
65
+ export function getCollectorForPanel(panelId) {
66
+ const collectorKey = panelToCollectorMap[panelId];
67
+ if (!collectorKey) {
68
+ return null;
69
+ }
70
+ const collector = collectorRegistry[collectorKey];
71
+ if (!collector) {
72
+ return null;
73
+ }
74
+ return collector;
75
+ }
76
+ //# sourceMappingURL=collectorRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectorRegistry.js","sourceRoot":"","sources":["../../src/core/collectorRegistry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAK5D;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,cAAc;IACvB,OAAO,EAAE,cAAc;IACvB,SAAS,EAAE,gBAAgB;IAC3B,MAAM,EAAE,aAAa;IACrB,YAAY,EAAE,mBAAmB;IACjC,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,UAAU;CACP,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAmD;IACjF,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,YAAY,EAAE,cAAc;IAC5B,iCAAiC;IACjC,WAAW,EAAE,KAAK;CACV,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,+BAA+B,CAC7C,QAAkB,EAClB,eAAwB,KAAK;IAE7B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACzB,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAElD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,4BAA4B,CAAC,CAAC;YAC3D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,UAAU,OAAO,mCAAmC,YAAY,GAAG,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,4CAA4C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,SAAkE,CAAC;AAC5E,CAAC"}