@marinoscar/platform-web 0.1.0-next.19 → 0.1.0-next.21

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 (174) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +5 -3
  3. package/dist/alerts/headless/client.d.ts +134 -0
  4. package/dist/alerts/headless/client.d.ts.map +1 -0
  5. package/dist/alerts/headless/client.js +105 -0
  6. package/dist/alerts/headless/client.js.map +1 -0
  7. package/dist/alerts/headless/format.d.ts +95 -0
  8. package/dist/alerts/headless/format.d.ts.map +1 -0
  9. package/dist/alerts/headless/format.js +164 -0
  10. package/dist/alerts/headless/format.js.map +1 -0
  11. package/dist/alerts/headless/hooks.d.ts +245 -0
  12. package/dist/alerts/headless/hooks.d.ts.map +1 -0
  13. package/dist/alerts/headless/hooks.js +315 -0
  14. package/dist/alerts/headless/hooks.js.map +1 -0
  15. package/dist/alerts/headless/index.d.ts +9 -0
  16. package/dist/alerts/headless/index.d.ts.map +1 -0
  17. package/dist/alerts/headless/index.js +9 -0
  18. package/dist/alerts/headless/index.js.map +1 -0
  19. package/dist/alerts/headless/rule-draft.d.ts +175 -0
  20. package/dist/alerts/headless/rule-draft.d.ts.map +1 -0
  21. package/dist/alerts/headless/rule-draft.js +261 -0
  22. package/dist/alerts/headless/rule-draft.js.map +1 -0
  23. package/dist/alerts/ui/AlertIncidentDrawer.d.ts +30 -0
  24. package/dist/alerts/ui/AlertIncidentDrawer.d.ts.map +1 -0
  25. package/dist/alerts/ui/AlertIncidentDrawer.js +33 -0
  26. package/dist/alerts/ui/AlertIncidentDrawer.js.map +1 -0
  27. package/dist/alerts/ui/AlertRuleDialog.d.ts +47 -0
  28. package/dist/alerts/ui/AlertRuleDialog.d.ts.map +1 -0
  29. package/dist/alerts/ui/AlertRuleDialog.js +124 -0
  30. package/dist/alerts/ui/AlertRuleDialog.js.map +1 -0
  31. package/dist/alerts/ui/AlertRuleTestResult.d.ts +23 -0
  32. package/dist/alerts/ui/AlertRuleTestResult.d.ts.map +1 -0
  33. package/dist/alerts/ui/AlertRuleTestResult.js +30 -0
  34. package/dist/alerts/ui/AlertRuleTestResult.js.map +1 -0
  35. package/dist/alerts/ui/AlertsPage.d.ts +41 -0
  36. package/dist/alerts/ui/AlertsPage.d.ts.map +1 -0
  37. package/dist/alerts/ui/AlertsPage.js +238 -0
  38. package/dist/alerts/ui/AlertsPage.js.map +1 -0
  39. package/dist/alerts/ui/FiringAlertsBanner.d.ts +28 -0
  40. package/dist/alerts/ui/FiringAlertsBanner.d.ts.map +1 -0
  41. package/dist/alerts/ui/FiringAlertsBanner.js +45 -0
  42. package/dist/alerts/ui/FiringAlertsBanner.js.map +1 -0
  43. package/dist/alerts/ui/copy.d.ts +15 -0
  44. package/dist/alerts/ui/copy.d.ts.map +1 -0
  45. package/dist/alerts/ui/copy.js +14 -0
  46. package/dist/alerts/ui/copy.js.map +1 -0
  47. package/dist/alerts/ui/index.d.ts +14 -0
  48. package/dist/alerts/ui/index.d.ts.map +1 -0
  49. package/dist/alerts/ui/index.js +12 -0
  50. package/dist/alerts/ui/index.js.map +1 -0
  51. package/dist/alerts/ui/parts.d.ts +26 -0
  52. package/dist/alerts/ui/parts.d.ts.map +1 -0
  53. package/dist/alerts/ui/parts.js +27 -0
  54. package/dist/alerts/ui/parts.js.map +1 -0
  55. package/dist/alerts/ui/settings.d.ts +27 -0
  56. package/dist/alerts/ui/settings.d.ts.map +1 -0
  57. package/dist/alerts/ui/settings.js +37 -0
  58. package/dist/alerts/ui/settings.js.map +1 -0
  59. package/dist/nodes/headless/api.d.ts +3 -1
  60. package/dist/nodes/headless/api.d.ts.map +1 -1
  61. package/dist/nodes/headless/api.js +22 -0
  62. package/dist/nodes/headless/api.js.map +1 -1
  63. package/dist/nodes/headless/index.d.ts +7 -2
  64. package/dist/nodes/headless/index.d.ts.map +1 -1
  65. package/dist/nodes/headless/index.js +4 -1
  66. package/dist/nodes/headless/index.js.map +1 -1
  67. package/dist/nodes/headless/node-events.d.ts +43 -0
  68. package/dist/nodes/headless/node-events.d.ts.map +1 -0
  69. package/dist/nodes/headless/node-events.js +150 -0
  70. package/dist/nodes/headless/node-events.js.map +1 -0
  71. package/dist/nodes/headless/power.d.ts +43 -0
  72. package/dist/nodes/headless/power.d.ts.map +1 -0
  73. package/dist/nodes/headless/power.js +74 -0
  74. package/dist/nodes/headless/power.js.map +1 -0
  75. package/dist/nodes/headless/types.d.ts +40 -3
  76. package/dist/nodes/headless/types.d.ts.map +1 -1
  77. package/dist/nodes/headless/types.js +1 -1
  78. package/dist/nodes/headless/types.js.map +1 -1
  79. package/dist/nodes/headless/use-node-events.d.ts +59 -0
  80. package/dist/nodes/headless/use-node-events.d.ts.map +1 -0
  81. package/dist/nodes/headless/use-node-events.js +159 -0
  82. package/dist/nodes/headless/use-node-events.js.map +1 -0
  83. package/dist/nodes/ui/NodeEventsTimeline.d.ts +39 -0
  84. package/dist/nodes/ui/NodeEventsTimeline.d.ts.map +1 -0
  85. package/dist/nodes/ui/NodeEventsTimeline.js +63 -0
  86. package/dist/nodes/ui/NodeEventsTimeline.js.map +1 -0
  87. package/dist/nodes/ui/NodePowerBadge.d.ts +27 -0
  88. package/dist/nodes/ui/NodePowerBadge.d.ts.map +1 -0
  89. package/dist/nodes/ui/NodePowerBadge.js +48 -0
  90. package/dist/nodes/ui/NodePowerBadge.js.map +1 -0
  91. package/dist/nodes/ui/NodeVitalsDialog.d.ts +11 -1
  92. package/dist/nodes/ui/NodeVitalsDialog.d.ts.map +1 -1
  93. package/dist/nodes/ui/NodeVitalsDialog.js +14 -5
  94. package/dist/nodes/ui/NodeVitalsDialog.js.map +1 -1
  95. package/dist/nodes/ui/WorkersPage.d.ts.map +1 -1
  96. package/dist/nodes/ui/WorkersPage.js +2 -1
  97. package/dist/nodes/ui/WorkersPage.js.map +1 -1
  98. package/dist/nodes/ui/workerVitals.d.ts +17 -1
  99. package/dist/nodes/ui/workerVitals.d.ts.map +1 -1
  100. package/dist/nodes/ui/workerVitals.js +43 -0
  101. package/dist/nodes/ui/workerVitals.js.map +1 -1
  102. package/dist/nodes/ui/workersTable.d.ts.map +1 -1
  103. package/dist/nodes/ui/workersTable.js +2 -1
  104. package/dist/nodes/ui/workersTable.js.map +1 -1
  105. package/dist/telemetry/headless/hooks/useTelemetryDashboard.d.ts +1 -1
  106. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts +11 -0
  107. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.d.ts.map +1 -1
  108. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js +17 -2
  109. package/dist/telemetry/ui/components/dashboard/metrics/MetricSections.js.map +1 -1
  110. package/dist/webhooks/headless/client.d.ts +101 -0
  111. package/dist/webhooks/headless/client.d.ts.map +1 -0
  112. package/dist/webhooks/headless/client.js +105 -0
  113. package/dist/webhooks/headless/client.js.map +1 -0
  114. package/dist/webhooks/headless/event-selection.d.ts +119 -0
  115. package/dist/webhooks/headless/event-selection.d.ts.map +1 -0
  116. package/dist/webhooks/headless/event-selection.js +225 -0
  117. package/dist/webhooks/headless/event-selection.js.map +1 -0
  118. package/dist/webhooks/headless/format.d.ts +84 -0
  119. package/dist/webhooks/headless/format.d.ts.map +1 -0
  120. package/dist/webhooks/headless/format.js +142 -0
  121. package/dist/webhooks/headless/format.js.map +1 -0
  122. package/dist/webhooks/headless/hooks.d.ts +199 -0
  123. package/dist/webhooks/headless/hooks.d.ts.map +1 -0
  124. package/dist/webhooks/headless/hooks.js +249 -0
  125. package/dist/webhooks/headless/hooks.js.map +1 -0
  126. package/dist/webhooks/headless/index.d.ts +9 -0
  127. package/dist/webhooks/headless/index.d.ts.map +1 -0
  128. package/dist/webhooks/headless/index.js +9 -0
  129. package/dist/webhooks/headless/index.js.map +1 -0
  130. package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts +32 -0
  131. package/dist/webhooks/ui/WebhookDeliveryDrawer.d.ts.map +1 -0
  132. package/dist/webhooks/ui/WebhookDeliveryDrawer.js +64 -0
  133. package/dist/webhooks/ui/WebhookDeliveryDrawer.js.map +1 -0
  134. package/dist/webhooks/ui/WebhookEndpointDetail.d.ts +21 -0
  135. package/dist/webhooks/ui/WebhookEndpointDetail.d.ts.map +1 -0
  136. package/dist/webhooks/ui/WebhookEndpointDetail.js +96 -0
  137. package/dist/webhooks/ui/WebhookEndpointDetail.js.map +1 -0
  138. package/dist/webhooks/ui/WebhookEndpointDialog.d.ts +39 -0
  139. package/dist/webhooks/ui/WebhookEndpointDialog.d.ts.map +1 -0
  140. package/dist/webhooks/ui/WebhookEndpointDialog.js +79 -0
  141. package/dist/webhooks/ui/WebhookEndpointDialog.js.map +1 -0
  142. package/dist/webhooks/ui/WebhookEventPicker.d.ts +30 -0
  143. package/dist/webhooks/ui/WebhookEventPicker.d.ts.map +1 -0
  144. package/dist/webhooks/ui/WebhookEventPicker.js +33 -0
  145. package/dist/webhooks/ui/WebhookEventPicker.js.map +1 -0
  146. package/dist/webhooks/ui/WebhookSecretDialog.d.ts +27 -0
  147. package/dist/webhooks/ui/WebhookSecretDialog.d.ts.map +1 -0
  148. package/dist/webhooks/ui/WebhookSecretDialog.js +52 -0
  149. package/dist/webhooks/ui/WebhookSecretDialog.js.map +1 -0
  150. package/dist/webhooks/ui/WebhookSignatureHelp.d.ts +18 -0
  151. package/dist/webhooks/ui/WebhookSignatureHelp.d.ts.map +1 -0
  152. package/dist/webhooks/ui/WebhookSignatureHelp.js +40 -0
  153. package/dist/webhooks/ui/WebhookSignatureHelp.js.map +1 -0
  154. package/dist/webhooks/ui/WebhooksPage.d.ts +47 -0
  155. package/dist/webhooks/ui/WebhooksPage.d.ts.map +1 -0
  156. package/dist/webhooks/ui/WebhooksPage.js +172 -0
  157. package/dist/webhooks/ui/WebhooksPage.js.map +1 -0
  158. package/dist/webhooks/ui/copy.d.ts +24 -0
  159. package/dist/webhooks/ui/copy.d.ts.map +1 -0
  160. package/dist/webhooks/ui/copy.js +34 -0
  161. package/dist/webhooks/ui/copy.js.map +1 -0
  162. package/dist/webhooks/ui/index.d.ts +15 -0
  163. package/dist/webhooks/ui/index.d.ts.map +1 -0
  164. package/dist/webhooks/ui/index.js +12 -0
  165. package/dist/webhooks/ui/index.js.map +1 -0
  166. package/dist/webhooks/ui/parts.d.ts +25 -0
  167. package/dist/webhooks/ui/parts.d.ts.map +1 -0
  168. package/dist/webhooks/ui/parts.js +28 -0
  169. package/dist/webhooks/ui/parts.js.map +1 -0
  170. package/dist/webhooks/ui/settings.d.ts +58 -0
  171. package/dist/webhooks/ui/settings.d.ts.map +1 -0
  172. package/dist/webhooks/ui/settings.js +79 -0
  173. package/dist/webhooks/ui/settings.js.map +1 -0
  174. package/package.json +18 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-events.js","sourceRoot":"","sources":["../../../src/nodes/headless/node-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { NodePower } from './types.js';
2
+ /**
3
+ * At or under this battery charge the badge reads in the warning colour.
4
+ *
5
+ * @stability experimental
6
+ */
7
+ export declare const NODE_BATTERY_WARNING_PERCENT = 20;
8
+ /**
9
+ * At or under this battery charge the badge reads in the error colour.
10
+ *
11
+ * @stability experimental
12
+ */
13
+ export declare const NODE_BATTERY_CRITICAL_PERCENT = 10;
14
+ /**
15
+ * A node's power state, ready to draw.
16
+ *
17
+ * @stability experimental
18
+ */
19
+ export interface NodePowerDescription {
20
+ /** Where power comes from (`unknown` is never described). */
21
+ source: 'ac' | 'battery';
22
+ /** Battery charge, rounded to a whole percent, or `null` when not reported. */
23
+ percent: number | null;
24
+ /** Whether the battery is charging, or `null` when not reported. */
25
+ charging: boolean | null;
26
+ /** `warning` at or under 20%, `error` at or under 10%, on battery only. */
27
+ level: 'normal' | 'warning' | 'error';
28
+ /** The short visible text: `42%`, `AC`. */
29
+ text: string;
30
+ /** The full sentence, the accessible label: "On battery, 42%, discharging". */
31
+ label: string;
32
+ }
33
+ /**
34
+ * The badge's words and level for a node's reported power, or `null` when
35
+ * there is nothing to draw (no report, or source `unknown`).
36
+ *
37
+ * @param power - `lastVitals.power`, if any.
38
+ * @returns the description, or `null`.
39
+ *
40
+ * @stability experimental
41
+ */
42
+ export declare function describeNodePower(power: NodePower | null | undefined): NodePowerDescription | null;
43
+ //# sourceMappingURL=power.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/power.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,6DAA6D;IAC7D,MAAM,EAAE,IAAI,GAAG,SAAS,CAAC;IACzB,+EAA+E;IAC/E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oEAAoE;IACpE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,2EAA2E;IAC3E,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACtC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,oBAAoB,GAAG,IAAI,CAkClG"}
@@ -0,0 +1,74 @@
1
+ // =============================================================================
2
+ // A node's power state, as the Worker Nodes page words it (issue #1045)
3
+ // =============================================================================
4
+ //
5
+ // A node on a laptop reports `vitals.power` (source, battery charge, charging);
6
+ // the fleet table shows a badge for it. This module is the badge's words and
7
+ // level, without markup: the UI draws the icon and the colour from the level,
8
+ // and the SAME sentence is its accessible label, so nothing rests on colour.
9
+ //
10
+ // Display only: a node on battery is not "unhealthy", and nothing here turns
11
+ // the reading into a health verdict (health is the API's, from the heartbeat).
12
+ // An `unknown` or absent source draws nothing: a desktop that cannot tell is not
13
+ // worth a badge on every row.
14
+ // =============================================================================
15
+ /**
16
+ * At or under this battery charge the badge reads in the warning colour.
17
+ *
18
+ * @stability experimental
19
+ */
20
+ export const NODE_BATTERY_WARNING_PERCENT = 20;
21
+ /**
22
+ * At or under this battery charge the badge reads in the error colour.
23
+ *
24
+ * @stability experimental
25
+ */
26
+ export const NODE_BATTERY_CRITICAL_PERCENT = 10;
27
+ /**
28
+ * The badge's words and level for a node's reported power, or `null` when
29
+ * there is nothing to draw (no report, or source `unknown`).
30
+ *
31
+ * @param power - `lastVitals.power`, if any.
32
+ * @returns the description, or `null`.
33
+ *
34
+ * @stability experimental
35
+ */
36
+ export function describeNodePower(power) {
37
+ if (!power || typeof power !== 'object')
38
+ return null;
39
+ const percent = typeof power.batteryPercent === 'number' && Number.isFinite(power.batteryPercent)
40
+ ? Math.round(Math.min(100, Math.max(0, power.batteryPercent)))
41
+ : null;
42
+ const charging = typeof power.charging === 'boolean' ? power.charging : null;
43
+ if (power.source === 'ac') {
44
+ const parts = ['On AC power'];
45
+ if (percent !== null)
46
+ parts.push(`battery ${percent}%`);
47
+ if (charging === true)
48
+ parts.push('charging');
49
+ return { source: 'ac', percent, charging, level: 'normal', text: 'AC', label: parts.join(', ') };
50
+ }
51
+ if (power.source !== 'battery')
52
+ return null;
53
+ const level = percent !== null && percent <= NODE_BATTERY_CRITICAL_PERCENT
54
+ ? 'error'
55
+ : percent !== null && percent <= NODE_BATTERY_WARNING_PERCENT
56
+ ? 'warning'
57
+ : 'normal';
58
+ const parts = ['On battery'];
59
+ if (percent !== null)
60
+ parts.push(`${percent}%`);
61
+ if (charging !== null)
62
+ parts.push(charging ? 'charging' : 'discharging');
63
+ if (power.lowPowerMode === true)
64
+ parts.push('low power mode');
65
+ return {
66
+ source: 'battery',
67
+ percent,
68
+ charging,
69
+ level,
70
+ text: percent !== null ? `${percent}%` : 'Battery',
71
+ label: parts.join(', '),
72
+ };
73
+ }
74
+ //# sourceMappingURL=power.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"power.js","sourceRoot":"","sources":["../../../src/nodes/headless/power.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,wEAAwE;AACxE,gFAAgF;AAChF,EAAE;AACF,gFAAgF;AAChF,6EAA6E;AAC7E,8EAA8E;AAC9E,6EAA6E;AAC7E,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,iFAAiF;AACjF,8BAA8B;AAC9B,gFAAgF;AAIhF;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,CAAC;AAsBhD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmC;IACnE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,OAAO,GACX,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC;QAC/E,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7E,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,CAAC,aAAa,CAAC,CAAC;QAC9B,IAAI,OAAO,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC;QACxD,IAAI,QAAQ,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC9C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;IACnG,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,KAAK,GACT,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,6BAA6B;QAC1D,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,IAAI,4BAA4B;YAC3D,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,QAAQ,CAAC;IACjB,MAAM,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC;IAC7B,IAAI,OAAO,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAChD,IAAI,QAAQ,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACzE,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC9D,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,OAAO;QACP,QAAQ;QACR,KAAK;QACL,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS;QAClD,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;KACxB,CAAC;AACJ,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type { z } from 'zod';
2
- import type { AdminNode, AdminNodeCredential, NodeCredentialCreated, NodeHealth, NodeJobCounts, NodeOwner, NodeStatus, NodeVitals, NodeVitalsCounters, createNodeCredentialSchema } from '@marinoscar/platform-contract/nodes';
3
- export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
4
- export type { NodeCredentialCreated, NodeHealth, NodeJobCounts, NodeOwner, NodeStatus, NodeVitals, NodeVitalsCounters, };
2
+ import type { AdminNode, AdminNodeCredential, AdminNodeEvent, AdminNodeEventList, NodeCredentialCreated, NodeHealth, NodeHostVitals, NodeJobCounts, NodeOwner, NodePower, NodeStatus, NodeVitals, NodeVitalsCounters, createNodeCredentialSchema } from '@marinoscar/platform-contract/nodes';
3
+ export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_EVENT_TYPES, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
4
+ export type { NodeCredentialCreated, NodeHealth, NodeHostVitals, NodeJobCounts, NodeOwner, NodePower, NodeStatus, NodeVitals, NodeVitalsCounters, };
5
5
  /**
6
6
  * One node as `GET /api/admin/nodes` returns it (`AdminNodeDto`,
7
7
  * `adminNodeSchema`).
@@ -9,6 +9,43 @@ export type { NodeCredentialCreated, NodeHealth, NodeJobCounts, NodeOwner, NodeS
9
9
  * @stability experimental
10
10
  */
11
11
  export type WorkerNode = AdminNode;
12
+ /**
13
+ * One stored node event as `GET /api/admin/nodes/:id/events` returns it
14
+ * (`adminNodeEventSchema`, #1045): a power change, a low battery, a wake from
15
+ * sleep, a low disk. `type` is an OPEN dotted string (`NODE_EVENT_TYPES` names
16
+ * the platform's own); `occurredAt` is the node's clock, `receivedAt` the server's.
17
+ *
18
+ * @stability experimental
19
+ */
20
+ export type WorkerNodeEvent = AdminNodeEvent;
21
+ /**
22
+ * A page of node events (`adminNodeEventListSchema`), newest first.
23
+ *
24
+ * @stability experimental
25
+ */
26
+ export type WorkerNodeEventList = AdminNodeEventList;
27
+ /**
28
+ * How loud a node event is: `info`, `warning` or `critical`.
29
+ *
30
+ * @stability experimental
31
+ */
32
+ export type NodeEventSeverity = AdminNodeEvent['severity'];
33
+ /**
34
+ * The query `GET /api/admin/nodes/:id/events` takes. Every member optional; an absent
35
+ * one is left out of the query string (the API's defaults apply).
36
+ *
37
+ * @stability experimental
38
+ */
39
+ export interface NodeEventsQuery {
40
+ /** 1-based page. */
41
+ page?: number;
42
+ /** Events per page. */
43
+ pageSize?: number;
44
+ /** Only events of this exact type (`power.battery_low`). */
45
+ type?: string;
46
+ /** Only events of this severity. */
47
+ severity?: NodeEventSeverity;
48
+ }
12
49
  /**
13
50
  * One credential as `GET /api/admin/nodes/credentials` returns it
14
51
  * (`AdminNodeCredentialDto`, `adminNodeCredentialSchema`). No `token`, no hash;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,EACZ,aAAa,GACd,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC;AAEnC;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,EAC3D,GAAG,GAAE,IAAiB,GACrB,oBAAoB,CAStB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EACV,SAAS,EACT,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,EAClB,0BAA0B,EAC3B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,aAAa,GACd,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,aAAa,EACb,SAAS,EACT,SAAS,EACT,UAAU,EACV,UAAU,EACV,kBAAkB,GACnB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,CAAC;AAE7C;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,CAAC;AAErD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,oBAAoB;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAEnF;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEpE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,GAAG,WAAW,CAAC,EAC3D,GAAG,GAAE,IAAiB,GACrB,oBAAoB,CAStB"}
@@ -19,7 +19,7 @@
19
19
  // heartbeat against the `nodes.staleHeartbeatSeconds` system setting, which
20
20
  // the browser does not read), so nothing in this slice recomputes it.
21
21
  // =============================================================================
22
- export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
22
+ export { MAX_NODE_CREDENTIAL_DAYS, MAX_NODE_CREDENTIAL_NAME_LENGTH, NODE_EVENT_TYPES, NODE_HEALTHS, NODE_STATUSES, } from '@marinoscar/platform-contract/nodes';
23
23
  /**
24
24
  * Whether a credential can still authenticate a node right now.
25
25
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,sEAAsE;AACtE,gFAAgF;AAChF,EAAE;AACF,wFAAwF;AACxF,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,eAAe;AACf,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,mCAAmC;AACnC,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,gFAAgF;AAgBhF,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,YAAY,EACZ,aAAa,GACd,MAAM,qCAAqC,CAAC;AA2C7C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA2D,EAC3D,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,UAAU,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,0EAA0E;IAC1E,yEAAyE;IACzE,gDAAgD;IAChD,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACtF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/nodes/headless/types.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,sEAAsE;AACtE,gFAAgF;AAChF,EAAE;AACF,wFAAwF;AACxF,gFAAgF;AAChF,8EAA8E;AAC9E,+EAA+E;AAC/E,eAAe;AACf,EAAE;AACF,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,qEAAqE;AACrE,2EAA2E;AAC3E,mCAAmC;AACnC,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,gFAAgF;AAoBhF,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,gBAAgB,EAChB,YAAY,EACZ,aAAa,GACd,MAAM,qCAAqC,CAAC;AAsF7C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAA2D,EAC3D,MAAY,IAAI,IAAI,EAAE;IAEtB,IAAI,UAAU,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,0EAA0E;IAC1E,yEAAyE;IACzE,gDAAgD;IAChD,IAAI,UAAU,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QACtF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * One node's recent events (issue #1045): `GET /api/admin/nodes/:id/events`, newest
3
+ * first, with "load more".
4
+ *
5
+ * The same contract as the fleet hooks (`use-worker-nodes.ts`): every function
6
+ * resolves rather than throws, and a failure is a STRING the caller renders.
7
+ *
8
+ * The first page is asked for when the node or the filters change; `loadMore`
9
+ * appends the next page; `refresh` re-reads from the first page WITHOUT raising
10
+ * the loading flag (the list stays on screen). An event that arrives between a
11
+ * first page and a "load more" shifts the pages by one, so an appended page is
12
+ * de-duplicated by id rather than trusted to start where the last one ended.
13
+ *
14
+ * The query is read member by member (`page`, `pageSize`, `type`, `severity`),
15
+ * so an inline object literal does not re-fetch on every render.
16
+ */
17
+ import type { NodesApi } from './api.js';
18
+ import type { NodeEventsQuery, WorkerNodeEvent } from './types.js';
19
+ /**
20
+ * What {@link useNodeEvents} returns.
21
+ *
22
+ * @stability experimental
23
+ */
24
+ export interface UseNodeEventsResult {
25
+ /** The events read so far, newest first; emptied on an error or with no node. */
26
+ events: WorkerNodeEvent[];
27
+ /** How many events the node has in total (for the filters), `0` before an answer. */
28
+ total: number;
29
+ /** Whether a further page exists. */
30
+ hasMore: boolean;
31
+ /** The first page is in flight. */
32
+ isLoading: boolean;
33
+ /** A `loadMore` page is in flight. */
34
+ isLoadingMore: boolean;
35
+ /** The last failure as a sentence, or `null`. */
36
+ error: string | null;
37
+ /** Re-read from the first page without raising the loading flag. */
38
+ refresh: () => Promise<void>;
39
+ /** Append the next page. A no-op while one is in flight or when there is none. */
40
+ loadMore: () => Promise<void>;
41
+ }
42
+ /**
43
+ * `GET /api/admin/nodes/:id/events`: a node's events, newest first, page by page.
44
+ *
45
+ * @param nodeId - the node id, or `null` to ask for nothing.
46
+ * @param query - the first page, its size and the filters (every member optional).
47
+ * @param api - a client to use instead of the adapters' or the host's.
48
+ * @returns the events and their state.
49
+ *
50
+ * @example
51
+ * ```tsx
52
+ * const { events, hasMore, loadMore } = useNodeEvents(node.id, { pageSize: 20, severity: 'critical' });
53
+ * ```
54
+ *
55
+ * @extensionPoint hook
56
+ * @stability experimental
57
+ */
58
+ export declare function useNodeEvents(nodeId: string | null, query?: NodeEventsQuery, api?: NodesApi): UseNodeEventsResult;
59
+ //# sourceMappingURL=use-node-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-node-events.d.ts","sourceRoot":"","sources":["../../../src/nodes/headless/use-node-events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAuB,MAAM,YAAY,CAAC;AAExF;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,iFAAiF;IACjF,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,qFAAqF;IACrF,KAAK,EAAE,MAAM,CAAC;IACd,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,aAAa,EAAE,OAAO,CAAC;IACvB,iDAAiD;IACjD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,oEAAoE;IACpE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,kFAAkF;IAClF,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AA2BD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,GAAE,eAAoB,EAAE,GAAG,CAAC,EAAE,QAAQ,GAAG,mBAAmB,CAqGrH"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * One node's recent events (issue #1045): `GET /api/admin/nodes/:id/events`, newest
3
+ * first, with "load more".
4
+ *
5
+ * The same contract as the fleet hooks (`use-worker-nodes.ts`): every function
6
+ * resolves rather than throws, and a failure is a STRING the caller renders.
7
+ *
8
+ * The first page is asked for when the node or the filters change; `loadMore`
9
+ * appends the next page; `refresh` re-reads from the first page WITHOUT raising
10
+ * the loading flag (the list stays on screen). An event that arrives between a
11
+ * first page and a "load more" shifts the pages by one, so an appended page is
12
+ * de-duplicated by id rather than trusted to start where the last one ended.
13
+ *
14
+ * The query is read member by member (`page`, `pageSize`, `type`, `severity`),
15
+ * so an inline object literal does not re-fetch on every render.
16
+ */
17
+ import { useCallback, useEffect, useRef, useState } from 'react';
18
+ import { isPlatformApiError } from '../../core/index.js';
19
+ import { useIsMounted } from '../internal/use-is-mounted.js';
20
+ import { useNodesApi } from './adapters.js';
21
+ /**
22
+ * The page as the hook keeps it. A malformed answer (no `items` array: a
23
+ * transport that resolved nothing, an older server's unrelated body) reads as
24
+ * an empty page rather than crashing the dialog that shows it.
25
+ */
26
+ function normalized(data) {
27
+ const items = data && Array.isArray(data.items) ? data.items : [];
28
+ const num = (value, fallback) => (typeof value === 'number' && Number.isFinite(value) ? value : fallback);
29
+ return {
30
+ items,
31
+ total: num(data?.total, items.length),
32
+ page: num(data?.page, 1),
33
+ pageSize: num(data?.pageSize, items.length),
34
+ totalPages: num(data?.totalPages, items.length > 0 ? 1 : 0),
35
+ };
36
+ }
37
+ function messageFor(err) {
38
+ if (isPlatformApiError(err)) {
39
+ if (err.status === 403)
40
+ return 'You do not have permission to view worker node events';
41
+ return err.message;
42
+ }
43
+ return 'Failed to load node events';
44
+ }
45
+ /**
46
+ * `GET /api/admin/nodes/:id/events`: a node's events, newest first, page by page.
47
+ *
48
+ * @param nodeId - the node id, or `null` to ask for nothing.
49
+ * @param query - the first page, its size and the filters (every member optional).
50
+ * @param api - a client to use instead of the adapters' or the host's.
51
+ * @returns the events and their state.
52
+ *
53
+ * @example
54
+ * ```tsx
55
+ * const { events, hasMore, loadMore } = useNodeEvents(node.id, { pageSize: 20, severity: 'critical' });
56
+ * ```
57
+ *
58
+ * @extensionPoint hook
59
+ * @stability experimental
60
+ */
61
+ export function useNodeEvents(nodeId, query = {}, api) {
62
+ const client = useNodesApi(api);
63
+ const { page: firstPage = 1, pageSize, type, severity } = query;
64
+ const [events, setEvents] = useState([]);
65
+ const [total, setTotal] = useState(0);
66
+ const [lastPage, setLastPage] = useState(0);
67
+ const [totalPages, setTotalPages] = useState(0);
68
+ const [isLoading, setIsLoading] = useState(nodeId !== null);
69
+ const [isLoadingMore, setIsLoadingMore] = useState(false);
70
+ const [error, setError] = useState(null);
71
+ const isMounted = useIsMounted();
72
+ // Bumped by every first-page read, so a "load more" that settles after the
73
+ // node or the filters changed is dropped instead of appended to the new list.
74
+ const generation = useRef(0);
75
+ const loadingMore = useRef(false);
76
+ const pageQuery = useCallback((page) => ({
77
+ page,
78
+ ...(pageSize !== undefined ? { pageSize } : {}),
79
+ ...(type ? { type } : {}),
80
+ ...(severity ? { severity } : {}),
81
+ }), [pageSize, type, severity]);
82
+ const load = useCallback(async (showLoading) => {
83
+ const run = ++generation.current;
84
+ if (nodeId === null) {
85
+ setEvents([]);
86
+ setTotal(0);
87
+ setLastPage(0);
88
+ setTotalPages(0);
89
+ setError(null);
90
+ setIsLoading(false);
91
+ return;
92
+ }
93
+ if (showLoading)
94
+ setIsLoading(true);
95
+ try {
96
+ const data = normalized(await client.listNodeEvents(nodeId, pageQuery(firstPage)));
97
+ if (isMounted() && run === generation.current) {
98
+ setEvents(data.items);
99
+ setTotal(data.total);
100
+ setLastPage(data.page);
101
+ setTotalPages(data.totalPages);
102
+ setError(null);
103
+ }
104
+ }
105
+ catch (err) {
106
+ if (isMounted() && run === generation.current) {
107
+ setError(messageFor(err));
108
+ setEvents([]);
109
+ setTotal(0);
110
+ setLastPage(0);
111
+ setTotalPages(0);
112
+ }
113
+ }
114
+ finally {
115
+ if (isMounted() && showLoading && run === generation.current)
116
+ setIsLoading(false);
117
+ }
118
+ }, [client, nodeId, firstPage, pageQuery, isMounted]);
119
+ useEffect(() => {
120
+ void load(true);
121
+ }, [load]);
122
+ const refresh = useCallback(async () => {
123
+ await load(false);
124
+ }, [load]);
125
+ const hasMore = nodeId !== null && lastPage > 0 && lastPage < totalPages;
126
+ const loadMore = useCallback(async () => {
127
+ if (nodeId === null || loadingMore.current || !(lastPage > 0 && lastPage < totalPages))
128
+ return;
129
+ const run = generation.current;
130
+ loadingMore.current = true;
131
+ setIsLoadingMore(true);
132
+ try {
133
+ const data = normalized(await client.listNodeEvents(nodeId, pageQuery(lastPage + 1)));
134
+ if (isMounted() && run === generation.current) {
135
+ setEvents((current) => {
136
+ const seen = new Set(current.map((event) => event.id));
137
+ return [...current, ...data.items.filter((event) => !seen.has(event.id))];
138
+ });
139
+ setTotal(data.total);
140
+ setLastPage(data.page);
141
+ setTotalPages(data.totalPages);
142
+ setError(null);
143
+ }
144
+ }
145
+ catch (err) {
146
+ // The events already shown stay: they are a history, not a verdict that
147
+ // a failed read would make wrong.
148
+ if (isMounted() && run === generation.current)
149
+ setError(messageFor(err));
150
+ }
151
+ finally {
152
+ loadingMore.current = false;
153
+ if (isMounted())
154
+ setIsLoadingMore(false);
155
+ }
156
+ }, [client, nodeId, lastPage, totalPages, pageQuery, isMounted]);
157
+ return { events, total, hasMore, isLoading, isLoadingMore, error, refresh, loadMore };
158
+ }
159
+ //# sourceMappingURL=use-node-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-node-events.js","sourceRoot":"","sources":["../../../src/nodes/headless/use-node-events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A node's recent events (issue #1045), the "Events" section of the node's
3
+ * detail dialog: newest first, a severity chip, the event's label, a one-line
4
+ * summary of its attributes, and when it happened (relative, with the absolute
5
+ * time on the node's clock and the server's receipt in the tooltip).
6
+ *
7
+ * Reads `GET /api/admin/nodes/:id/events` through `useNodeEvents`, page by page
8
+ * ("Load more"). Re-reads the first page when the page's poll ticks (`now`
9
+ * changes), but only while the first page is all that is shown: a poll must not
10
+ * throw away the pages an operator asked for.
11
+ *
12
+ * ACCESSIBILITY: a labelled list; severity is a word in a chip (the colour is
13
+ * the second cue); the relative time is a `<time>` with its ISO `dateTime`.
14
+ */
15
+ import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
16
+ import type { ChipProps } from '@mui/material';
17
+ import type { ReactElement } from 'react';
18
+ import type { NodeEventSeverity } from '../headless/index.js';
19
+ /** Events per page in the dialog. */
20
+ export declare const NODE_EVENTS_PAGE_SIZE = 20;
21
+ /** How each severity is drawn: a word, a colour, an icon. */
22
+ export declare const NODE_EVENT_SEVERITY_CHIPS: Record<NodeEventSeverity, {
23
+ label: string;
24
+ color: ChipProps['color'];
25
+ variant: ChipProps['variant'];
26
+ Icon: typeof InfoOutlinedIcon;
27
+ }>;
28
+ interface NodeEventsTimelineProps {
29
+ /** The node whose events to list. */
30
+ nodeId: string;
31
+ /** The page's render clock; a change re-reads the first page. */
32
+ now: Date;
33
+ /** Events per page. Default {@link NODE_EVENTS_PAGE_SIZE}. */
34
+ pageSize?: number;
35
+ }
36
+ /** The "Events" section of a node's detail dialog. */
37
+ export declare function NodeEventsTimeline({ nodeId, now, pageSize }: NodeEventsTimelineProps): ReactElement;
38
+ export {};
39
+ //# sourceMappingURL=NodeEventsTimeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeEventsTimeline.d.ts","sourceRoot":"","sources":["../../../src/nodes/ui/NodeEventsTimeline.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,gBAAgB,MAAM,kCAAkC,CAAC;AAGhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAI1C,OAAO,KAAK,EAAE,iBAAiB,EAAmB,MAAM,sBAAsB,CAAC;AAG/E,qCAAqC;AACrC,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC,6DAA6D;AAC7D,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,iBAAiB,EACjB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;IAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,gBAAgB,CAAA;CAAE,CAK3G,CAAC;AAwCF,UAAU,uBAAuB;IAC/B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,EAAE,IAAI,CAAC;IACV,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sDAAsD;AACtD,wBAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,QAAgC,EAAE,EAAE,uBAAuB,GAAG,YAAY,CAmE3H"}
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ /**
3
+ * A node's recent events (issue #1045), the "Events" section of the node's
4
+ * detail dialog: newest first, a severity chip, the event's label, a one-line
5
+ * summary of its attributes, and when it happened (relative, with the absolute
6
+ * time on the node's clock and the server's receipt in the tooltip).
7
+ *
8
+ * Reads `GET /api/admin/nodes/:id/events` through `useNodeEvents`, page by page
9
+ * ("Load more"). Re-reads the first page when the page's poll ticks (`now`
10
+ * changes), but only while the first page is all that is shown: a poll must not
11
+ * throw away the pages an operator asked for.
12
+ *
13
+ * ACCESSIBILITY: a labelled list; severity is a word in a chip (the colour is
14
+ * the second cue); the relative time is a `<time>` with its ISO `dateTime`.
15
+ */
16
+ import ErrorOutlineIcon from '@mui/icons-material/ErrorOutlineOutlined';
17
+ import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
18
+ import WarningAmberIcon from '@mui/icons-material/WarningAmber';
19
+ import { Alert, Box, Button, Chip, CircularProgress, Stack, Tooltip, Typography } from '@mui/material';
20
+ import { useEffect, useId, useRef } from 'react';
21
+ import { formatDateTime, nodeEventLabel, nodeEventSummary, useNodeEvents } from '../headless/index.js';
22
+ import { formatRelativeTime } from '../internal/relative-time.js';
23
+ /** Events per page in the dialog. */
24
+ export const NODE_EVENTS_PAGE_SIZE = 20;
25
+ /** How each severity is drawn: a word, a colour, an icon. */
26
+ export const NODE_EVENT_SEVERITY_CHIPS = {
27
+ info: { label: 'Info', color: 'default', variant: 'outlined', Icon: InfoOutlinedIcon },
28
+ warning: { label: 'Warning', color: 'warning', variant: 'filled', Icon: WarningAmberIcon },
29
+ critical: { label: 'Critical', color: 'error', variant: 'filled', Icon: ErrorOutlineIcon },
30
+ };
31
+ function severityChip(severity) {
32
+ // A severity the API does not know yet reads as info rather than crashing.
33
+ const spec = NODE_EVENT_SEVERITY_CHIPS[severity] ?? NODE_EVENT_SEVERITY_CHIPS.info;
34
+ const { Icon } = spec;
35
+ return (_jsx(Chip, { size: "small", label: spec.label, color: spec.color, variant: spec.variant, icon: _jsx(Icon, { fontSize: "small" }) }));
36
+ }
37
+ function EventRow({ event, now }) {
38
+ const summary = nodeEventSummary(event);
39
+ const absolute = `Occurred ${formatDateTime(event.occurredAt)} (node clock) · received ${formatDateTime(event.receivedAt)}`;
40
+ return (_jsxs(Box, { component: "li", "data-testid": `node-event-${event.id}`, sx: { py: 1, borderBottom: 1, borderColor: 'divider', '&:last-of-type': { borderBottom: 0 } }, children: [_jsxs(Stack, { direction: "row", spacing: 1, useFlexGap: true, sx: { alignItems: 'center', flexWrap: 'wrap' }, children: [severityChip(event.severity), _jsx(Typography, { variant: "body2", sx: { fontWeight: 600 }, children: nodeEventLabel(event.type) }), _jsx(Tooltip, { title: absolute, children: _jsx(Typography, { variant: "caption", color: "text.secondary", component: "time", dateTime: event.occurredAt, sx: { ml: 'auto' }, children: formatRelativeTime(event.occurredAt, now) }) })] }), summary && (_jsx(Typography, { variant: "body2", color: "text.secondary", sx: { mt: 0.25, overflowWrap: 'anywhere' }, children: summary }))] }));
41
+ }
42
+ /** The "Events" section of a node's detail dialog. */
43
+ export function NodeEventsTimeline({ nodeId, now, pageSize = NODE_EVENTS_PAGE_SIZE }) {
44
+ const headingId = useId();
45
+ const { events, total, hasMore, isLoading, isLoadingMore, error, refresh, loadMore } = useNodeEvents(nodeId, { pageSize });
46
+ // Follow the page's poll, but only while one page is shown (see the header).
47
+ // The latest `refresh` and page count are read through a ref at the tick, so
48
+ // the tick alone triggers the read.
49
+ const latest = useRef({ refresh, onlyFirstPage: true });
50
+ latest.current = { refresh, onlyFirstPage: events.length <= pageSize };
51
+ const firstTick = useRef(true);
52
+ const nowMs = now.getTime();
53
+ useEffect(() => {
54
+ if (firstTick.current) {
55
+ firstTick.current = false;
56
+ return;
57
+ }
58
+ if (latest.current.onlyFirstPage)
59
+ void latest.current.refresh();
60
+ }, [nowMs]);
61
+ return (_jsxs(Box, { component: "section", "aria-labelledby": headingId, "data-testid": "node-events", children: [_jsx(Typography, { variant: "subtitle2", component: "h3", id: headingId, gutterBottom: true, children: "Events" }), isLoading && (_jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: 'center' }, children: [_jsx(CircularProgress, { size: 16, "aria-label": "Loading events" }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: "Loading events\u2026" })] })), !isLoading && error && (_jsx(Alert, { severity: "error", sx: { mb: 1 }, children: error })), !isLoading && !error && events.length === 0 && (_jsx(Typography, { variant: "body2", color: "text.secondary", "data-testid": "node-events-empty", children: "This node has not reported any events. Nodes running an older CLI do not send them." })), !isLoading && events.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Box, { component: "ul", "aria-labelledby": headingId, sx: { listStyle: 'none', m: 0, p: 0 }, children: events.map((event) => (_jsx(EventRow, { event: event, now: now }, event.id))) }), _jsxs(Stack, { direction: "row", spacing: 1, sx: { alignItems: 'center', mt: 1 }, children: [_jsxs(Typography, { variant: "caption", color: "text.secondary", children: ["Showing ", events.length, " of ", total] }), hasMore && (_jsx(Button, { size: "small", onClick: () => void loadMore(), disabled: isLoadingMore, children: isLoadingMore ? 'Loading…' : 'Load more' }))] })] }))] }));
62
+ }
63
+ //# sourceMappingURL=NodeEventsTimeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeEventsTimeline.js","sourceRoot":"","sources":["../../../src/nodes/ui/NodeEventsTimeline.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A node's power badge (issue #1045): a battery with its charge on battery, a
3
+ * plug on AC, nothing when the node did not say.
4
+ *
5
+ * The words come from `describeNodePower` (`/nodes/headless`); the badge only
6
+ * draws them. The charge is printed, the state is in the icon AND in the
7
+ * accessible label ("On battery, 42%, discharging"), and the colour (warning at
8
+ * 20% or under, error at 10% or under) is the secondary cue, never the only one.
9
+ */
10
+ import type { ReactElement } from 'react';
11
+ import type { NodePower } from '../headless/index.js';
12
+ interface NodePowerBadgeProps {
13
+ /** `lastVitals.power`, if any. */
14
+ power: NodePower | null | undefined;
15
+ /** Dims the badge with the vitals of a node that is not healthy. */
16
+ stale?: boolean;
17
+ /** Beside a printed sentence: hidden from assistive technology, no tooltip. */
18
+ decorative?: boolean;
19
+ /** A test id for the badge's root. */
20
+ 'data-testid'?: string;
21
+ }
22
+ /**
23
+ * The badge, or `null` when there is nothing to draw (no report, `unknown`).
24
+ */
25
+ export declare function NodePowerBadge({ power, stale, decorative, 'data-testid': testId, }: NodePowerBadgeProps): ReactElement | null;
26
+ export {};
27
+ //# sourceMappingURL=NodePowerBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodePowerBadge.d.ts","sourceRoot":"","sources":["../../../src/nodes/ui/NodePowerBadge.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAG1C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD,UAAU,mBAAmB;IAC3B,kCAAkC;IAClC,KAAK,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,oEAAoE;IACpE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sCAAsC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAQD;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,KAAa,EACb,UAAkB,EAClB,aAAa,EAAE,MAAM,GACtB,EAAE,mBAAmB,GAAG,YAAY,GAAG,IAAI,CAsC3C"}