@legioncodeinc/hive 0.1.0 → 0.2.0

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.
@@ -1,39 +0,0 @@
1
- /**
2
- * Portal readiness splash — PRD-002b (rs-AC-1 through rs-AC-9) · PRD-003c (m-AC-7, now the
3
- * content the `/buzzing` route mounts, per `main.tsx`).
4
- *
5
- * Polls `GET /api/fleet-status` until `isFleetReady()` passes, then mounts {@link LoginScreen}
6
- * once. Before the gate passes, LoginScreen is not mounted at all, so its `/setup/state` poll
7
- * cannot fire on a cold boot and misread a not-yet-ready honeycomb as "First time setup."
8
- *
9
- * PRD-003a's server-side gate is now the AUTHORITATIVE decision-maker for which URL an operator
10
- * lands on (health, then auth, per `the-hive/src/daemon/gate.ts`) — `/buzzing` itself is
11
- * gate-exempt, so this component's own ready→{@link LoginScreen} transition only matters for an
12
- * operator who is SITTING on `/buzzing` while the fleet comes up (an interim convenience this PRD
13
- * inherits from PRD-002b unchanged; PRD-004 will flesh out `/buzzing`'s full content and may revisit
14
- * this transition).
15
- *
16
- * Visual polish pass (ux-ui-worker-bee, deferred by PRD-002b's non-goals): a calm bordered panel,
17
- * a honey-tinted halo behind the brand mark, a distinct recessed treatment for the "hivedoctor
18
- * unreachable" state, and a `role="status" aria-live="polite"` region so assistive tech announces
19
- * state changes while the fleet boots. All values are existing design tokens; no poll/gate logic
20
- * below is touched.
21
- */
22
- import React from "react";
23
- import { type FleetHealth } from "../../shared/fleet-readiness.js";
24
- export { isFleetReady as isReady } from "../../shared/fleet-readiness.js";
25
- export type { FleetStatusResponse } from "../../shared/fleet-readiness.js";
26
- /** Per-daemon row state shown on the readiness splash (rs-AC-5). */
27
- export type DaemonDisplayState = "up" | "degraded" | "unreachable" | "starting";
28
- /** Maps hivedoctor `daemons[].health` to splash copy/state (rs-AC-5). */
29
- export declare function deriveDaemonDisplayState(health: FleetHealth): DaemonDisplayState;
30
- export interface ReadinessSplashProps {
31
- readonly assetBase: string;
32
- readonly pollMs?: number;
33
- }
34
- /**
35
- * Top-level readiness gate (rs-AC-1). Polls `/api/fleet-status` and mounts {@link LoginScreen} only
36
- * once the fleet is ready. The gate is sticky (rs-AC-9): after LoginScreen mounts, a later not-ready
37
- * poll does not unmount it.
38
- */
39
- export declare function ReadinessSplash({ assetBase, pollMs }: ReadinessSplashProps): React.JSX.Element;
@@ -1,201 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- /**
3
- * Portal readiness splash — PRD-002b (rs-AC-1 through rs-AC-9) · PRD-003c (m-AC-7, now the
4
- * content the `/buzzing` route mounts, per `main.tsx`).
5
- *
6
- * Polls `GET /api/fleet-status` until `isFleetReady()` passes, then mounts {@link LoginScreen}
7
- * once. Before the gate passes, LoginScreen is not mounted at all, so its `/setup/state` poll
8
- * cannot fire on a cold boot and misread a not-yet-ready honeycomb as "First time setup."
9
- *
10
- * PRD-003a's server-side gate is now the AUTHORITATIVE decision-maker for which URL an operator
11
- * lands on (health, then auth, per `the-hive/src/daemon/gate.ts`) — `/buzzing` itself is
12
- * gate-exempt, so this component's own ready→{@link LoginScreen} transition only matters for an
13
- * operator who is SITTING on `/buzzing` while the fleet comes up (an interim convenience this PRD
14
- * inherits from PRD-002b unchanged; PRD-004 will flesh out `/buzzing`'s full content and may revisit
15
- * this transition).
16
- *
17
- * Visual polish pass (ux-ui-worker-bee, deferred by PRD-002b's non-goals): a calm bordered panel,
18
- * a honey-tinted halo behind the brand mark, a distinct recessed treatment for the "hivedoctor
19
- * unreachable" state, and a `role="status" aria-live="polite"` region so assistive tech announces
20
- * state changes while the fleet boots. All values are existing design tokens; no poll/gate logic
21
- * below is touched.
22
- */
23
- import React from "react";
24
- import { isFleetReady, } from "../../shared/fleet-readiness.js";
25
- import { LoginScreen } from "./setup-gate.js";
26
- export { isFleetReady as isReady } from "../../shared/fleet-readiness.js";
27
- /** Maps hivedoctor `daemons[].health` to splash copy/state (rs-AC-5). */
28
- export function deriveDaemonDisplayState(health) {
29
- switch (health) {
30
- case "ok":
31
- return "up";
32
- case "degraded":
33
- return "degraded";
34
- case "unreachable":
35
- return "unreachable";
36
- case "unknown":
37
- return "starting";
38
- default: {
39
- const exhaustive = health;
40
- return exhaustive;
41
- }
42
- }
43
- }
44
- const DISPLAY_STATE_COLOR = {
45
- up: "var(--verified)",
46
- degraded: "var(--severity-warning)",
47
- unreachable: "var(--severity-critical)",
48
- starting: "var(--text-tertiary)",
49
- };
50
- function DaemonStatusDot({ displayState, name, }) {
51
- const pulsing = displayState === "starting";
52
- return (_jsx("span", { role: "img", "aria-label": `${name}: ${displayState}`, style: {
53
- width: 8,
54
- height: 8,
55
- borderRadius: "50%",
56
- flex: "none",
57
- background: DISPLAY_STATE_COLOR[displayState],
58
- animation: pulsing
59
- ? "hc-readiness-pulse var(--dur-pollinate) var(--ease-in-out) infinite alternate"
60
- : "none",
61
- } }));
62
- }
63
- /**
64
- * The distinct "hivedoctor unreachable" indicator (rs-AC-6). A single muted, recessed block rather
65
- * than a per-daemon row, so an operator can tell "the supervisor itself is down" apart from "the
66
- * supervisor is up and the fleet is booting" at a glance. Reuses the `starting` display-state color
67
- * (muted, not alarming) since a not-yet-reachable supervisor on a cold boot is expected, not an
68
- * error state.
69
- */
70
- function SupervisorUnreachableIndicator() {
71
- return (_jsxs("div", { "data-testid": "readiness-hivedoctor-unreachable", style: {
72
- display: "flex",
73
- flexDirection: "column",
74
- alignItems: "center",
75
- gap: 12,
76
- width: "100%",
77
- padding: "16px 20px",
78
- background: "var(--bg-inset)",
79
- border: "1px solid var(--border-subtle)",
80
- borderRadius: "var(--radius-lg)",
81
- }, children: [_jsx("span", { role: "img", "aria-label": "hivedoctor supervisor: unreachable", style: {
82
- width: 8,
83
- height: 8,
84
- borderRadius: "50%",
85
- flex: "none",
86
- background: DISPLAY_STATE_COLOR.starting,
87
- animation: "hc-readiness-pulse var(--dur-pollinate) var(--ease-in-out) infinite alternate",
88
- } }), _jsx("p", { style: { fontSize: "var(--text-sm)", color: "var(--text-secondary)", margin: 0, lineHeight: 1.5 }, children: "Waiting on hivedoctor. The fleet supervisor is not reachable yet." })] }));
89
- }
90
- function FleetSplashGrid({ status, assetBase, }) {
91
- const supervisorUnreachable = status?.supervisor === "unreachable";
92
- const daemons = status?.supervisor === "reachable" ? status.daemons : [];
93
- return (_jsxs("div", { "data-testid": "readiness-splash", style: {
94
- display: "flex",
95
- alignItems: "center",
96
- justifyContent: "center",
97
- minHeight: "100vh",
98
- padding: 32,
99
- background: "var(--bg-canvas)",
100
- textAlign: "center",
101
- }, children: [_jsxs("div", { style: {
102
- display: "flex",
103
- flexDirection: "column",
104
- alignItems: "center",
105
- gap: 24,
106
- width: "100%",
107
- maxWidth: 420,
108
- padding: "40px 32px",
109
- background: "var(--bg-surface)",
110
- border: "1px solid var(--border-default)",
111
- borderRadius: "var(--radius-xl)",
112
- }, children: [_jsx("span", { "aria-hidden": "true", style: {
113
- display: "inline-flex",
114
- alignItems: "center",
115
- justifyContent: "center",
116
- flex: "none",
117
- width: 88,
118
- height: 88,
119
- borderRadius: "50%",
120
- background: "var(--honey-subtle)",
121
- border: "1px solid var(--honey-border)",
122
- }, children: _jsx("img", { src: `${assetBase}/honeycomb-memory-cluster.svg`, width: 48, height: 48, alt: "" }) }), _jsx("h1", { className: "readiness-headline", style: {
123
- fontSize: "var(--text-xl)",
124
- fontWeight: 700,
125
- color: "var(--text-primary)",
126
- margin: 0,
127
- letterSpacing: "-0.02em",
128
- }, children: "Waiting for the hive\u2026" }), _jsxs("div", { "data-testid": "readiness-status-region", role: "status", "aria-live": "polite", style: { display: "flex", flexDirection: "column", alignItems: "center", gap: 20, width: "100%" }, children: [supervisorUnreachable ? (_jsx(SupervisorUnreachableIndicator, {})) : (_jsx("p", { style: { fontSize: "var(--text-sm)", color: "var(--text-secondary)", margin: 0, lineHeight: 1.5 }, children: "Starting required daemons. This usually takes a few seconds on a cold boot." })), daemons.length > 0 && (_jsx("ul", { "data-testid": "readiness-daemon-grid", style: {
129
- listStyle: "none",
130
- margin: 0,
131
- padding: 0,
132
- display: "flex",
133
- flexDirection: "column",
134
- gap: 10,
135
- width: "100%",
136
- textAlign: "left",
137
- }, children: daemons.map((daemon) => {
138
- const displayState = deriveDaemonDisplayState(daemon.health);
139
- return (_jsxs("li", { "data-testid": `readiness-daemon-${daemon.name}`, style: {
140
- display: "flex",
141
- alignItems: "center",
142
- gap: 10,
143
- padding: "10px 12px",
144
- borderRadius: "var(--radius-md)",
145
- border: "1px solid var(--border-subtle)",
146
- background: "var(--bg-elevated)",
147
- }, children: [_jsx(DaemonStatusDot, { displayState: displayState, name: daemon.name }), _jsx("span", { style: {
148
- flex: 1,
149
- fontSize: "var(--text-sm)",
150
- color: "var(--text-primary)",
151
- fontFamily: "var(--font-sans)",
152
- }, children: daemon.name }), _jsx("span", { style: {
153
- fontSize: "var(--text-xs)",
154
- color: "var(--text-secondary)",
155
- fontFamily: "var(--font-mono)",
156
- textTransform: "lowercase",
157
- }, children: displayState })] }, daemon.name));
158
- }) }))] })] }), _jsx("style", { children: "@keyframes hc-readiness-pulse { from { opacity: .45 } to { opacity: 1 } } " +
159
- "@keyframes hc-readiness-glow { from { opacity: .85 } to { opacity: 1 } } " +
160
- ".readiness-headline { animation: hc-readiness-glow var(--dur-pollinate) var(--ease-in-out) infinite alternate; }" })] }));
161
- }
162
- /**
163
- * Top-level readiness gate (rs-AC-1). Polls `/api/fleet-status` and mounts {@link LoginScreen} only
164
- * once the fleet is ready. The gate is sticky (rs-AC-9): after LoginScreen mounts, a later not-ready
165
- * poll does not unmount it.
166
- */
167
- export function ReadinessSplash({ assetBase, pollMs = 1500 }) {
168
- const [status, setStatus] = React.useState(null);
169
- const [fleetGated, setFleetGated] = React.useState(false);
170
- React.useEffect(() => {
171
- if (fleetGated)
172
- return;
173
- let alive = true;
174
- const tick = async () => {
175
- try {
176
- const response = await fetch("/api/fleet-status");
177
- const next = (await response.json());
178
- if (!alive)
179
- return;
180
- setStatus(next);
181
- if (isFleetReady(next)) {
182
- setFleetGated(true);
183
- }
184
- }
185
- catch {
186
- // Keep the splash visible; the next poll retries.
187
- }
188
- };
189
- void tick();
190
- const id = setInterval(() => void tick(), pollMs);
191
- return () => {
192
- alive = false;
193
- clearInterval(id);
194
- };
195
- }, [fleetGated, pollMs]);
196
- if (fleetGated) {
197
- return _jsx(LoginScreen, { assetBase: assetBase });
198
- }
199
- return _jsx(FleetSplashGrid, { status: status, assetBase: assetBase });
200
- }
201
- //# sourceMappingURL=readiness-splash.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"readiness-splash.js","sourceRoot":"","sources":["../../../src/dashboard/web/readiness-splash.tsx"],"names":[],"mappings":"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"}