@legioncodeinc/hive 0.6.2 → 0.6.3

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.
@@ -16,7 +16,13 @@ import { join } from "node:path";
16
16
  const InstalledPackageSchema = z.object({ version: z.string().optional() });
17
17
  /** Read the installed version of `packageName` from its global node_modules package.json, if present. */
18
18
  function readInstalledVersion(config, nodeModulesDir, packageName) {
19
- const raw = config.readTextFile(join(nodeModulesDir, packageName, "package.json"));
19
+ let raw = null;
20
+ try {
21
+ raw = config.readTextFile(join(nodeModulesDir, packageName, "package.json"));
22
+ }
23
+ catch {
24
+ return undefined;
25
+ }
20
26
  if (raw === null)
21
27
  return undefined;
22
28
  try {
@@ -66,7 +72,13 @@ export async function detectFleet(config, store) {
66
72
  const nodeModulesDir = prefix === null ? null : globalNodeModulesDir(prefix, config.platform);
67
73
  const products = {};
68
74
  for (const slug of PRODUCT_SLUGS) {
69
- products[slug] = detectProduct(config, store, nodeModulesDir, slug);
75
+ try {
76
+ products[slug] = detectProduct(config, store, nodeModulesDir, slug);
77
+ }
78
+ catch {
79
+ // A read/decode error for one product never drops that product or its siblings from the map.
80
+ products[slug] = { state: "not_installed" };
81
+ }
70
82
  }
71
83
  return { products };
72
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"detection.js","sourceRoot":"","sources":["../../../src/daemon/installer/detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAE5E,yGAAyG;AACzG,SAAS,oBAAoB,CAAC,MAAuB,EAAE,cAAsB,EAAE,WAAmB;IAChG,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IACnF,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,MAAuB,EACvB,cAA6B,EAC7B,IAAiB;IAEjB,IAAI,cAAc,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;IAC/D,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrF,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAC9F,CAAC;AAED,SAAS,aAAa,CACpB,MAAuB,EACvB,KAAwB,EACxB,cAA6B,EAC7B,IAAiB;IAEjB,gFAAgF;IAChF,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;IAEhF,6FAA6F;IAC7F,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,QAAQ,CAAC,MAAM,KAAK,aAAa;YAAE,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC;QAC/E,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,QAAQ,CAAC,KAAK,KAAK,SAAS;gBACjC,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE;gBAC7B,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzD,CAAC;IACH,CAAC;IAED,OAAO,qBAAqB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAuB,EAAE,IAAiB;IAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAC/C,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACtC,OAAO,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7G,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAuB,EAAE,KAAwB;IACjF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAC/C,MAAM,cAAc,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE9F,MAAM,QAAQ,GAAG,EAA2C,CAAC;IAC7D,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,CAAC;AACtB,CAAC"}
1
+ {"version":3,"file":"detection.js","sourceRoot":"","sources":["../../../src/daemon/installer/detection.ts"],"names":[],"mappings":"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"}
@@ -7,17 +7,14 @@
7
7
  * acts on a slug present in {@link INSTALLABLE_PRODUCTS}; `hive` is deliberately absent (it is the
8
8
  * running daemon, never a portal install target).
9
9
  */
10
- import type { InstallableProduct, ProductSlug } from "../../shared/onboarding-types.js";
11
- /** The four known product slugs (is-AC-3). The install allowlist is the installable subset below. */
12
- export declare const PRODUCT_SLUGS: readonly ["honeycomb", "doctor", "hive", "nectar"];
10
+ import { INSTALLABLE_PRODUCTS, PRODUCT_SLUGS, type InstallableProduct, type ProductSlug } from "../../shared/onboarding-types.js";
11
+ export { INSTALLABLE_PRODUCTS, PRODUCT_SLUGS };
13
12
  /**
14
13
  * The npm package name for each slug, used as LOCAL DETECTION evidence (the folder name under the
15
14
  * global node_modules). This is deliberately independent of the manifest so detection works before
16
15
  * any manifest is fetched (is-AC-1); the manifest remains the sole authority for INSTALL targets.
17
16
  */
18
17
  export declare const PRODUCT_PACKAGES: Record<ProductSlug, string>;
19
- /** The three portal-installable products; `hive` is excluded (not installable, 400). */
20
- export declare const INSTALLABLE_PRODUCTS: readonly ["doctor", "honeycomb", "nectar"];
21
18
  /** Per-product static facts: the npm bin name and the argv of its own post-install registration verb. */
22
19
  export interface ProductProfile {
23
20
  /** The npm bin name (equals the slug for every fleet product). */
@@ -7,8 +7,8 @@
7
7
  * acts on a slug present in {@link INSTALLABLE_PRODUCTS}; `hive` is deliberately absent (it is the
8
8
  * running daemon, never a portal install target).
9
9
  */
10
- /** The four known product slugs (is-AC-3). The install allowlist is the installable subset below. */
11
- export const PRODUCT_SLUGS = ["honeycomb", "doctor", "hive", "nectar"];
10
+ import { INSTALLABLE_PRODUCTS, PRODUCT_SLUGS } from "../../shared/onboarding-types.js";
11
+ export { INSTALLABLE_PRODUCTS, PRODUCT_SLUGS };
12
12
  /**
13
13
  * The npm package name for each slug, used as LOCAL DETECTION evidence (the folder name under the
14
14
  * global node_modules). This is deliberately independent of the manifest so detection works before
@@ -20,8 +20,6 @@ export const PRODUCT_PACKAGES = {
20
20
  hive: "@legioncodeinc/hive",
21
21
  nectar: "@legioncodeinc/nectar"
22
22
  };
23
- /** The three portal-installable products; `hive` is excluded (not installable, 400). */
24
- export const INSTALLABLE_PRODUCTS = ["doctor", "honeycomb", "nectar"];
25
23
  const PROFILES = {
26
24
  doctor: { binName: "doctor", registrationVerb: ["install-service"] },
27
25
  honeycomb: { binName: "honeycomb", registrationVerb: ["install"] },
@@ -1 +1 @@
1
- {"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/daemon/installer/products.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,qGAAqG;AACrG,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAEhF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC3D,SAAS,EAAE,0BAA0B;IACrC,MAAM,EAAE,uBAAuB;IAC/B,IAAI,EAAE,qBAAqB;IAC3B,MAAM,EAAE,uBAAuB;CAChC,CAAC;AAEF,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAC;AAU/E,MAAM,QAAQ,GAA+C;IAC3D,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,iBAAiB,CAAC,EAAE;IACpE,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IAClE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;CAC7D,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/daemon/installer/products.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,oBAAoB,EACpB,aAAa,EAGd,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC3D,SAAS,EAAE,0BAA0B;IACrC,MAAM,EAAE,uBAAuB;IAC/B,IAAI,EAAE,qBAAqB;IAC3B,MAAM,EAAE,uBAAuB;CAChC,CAAC;AAUF,MAAM,QAAQ,GAA+C;IAC3D,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,iBAAiB,CAAC,EAAE;IACpE,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;IAClE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,EAAE;CAC7D,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAQ,oBAA0C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,OAA2B;IACxD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC"}
@@ -14,6 +14,14 @@
14
14
  * `/api/fleet-status` fail-soft), rendered one tile per registered service via the shared
15
15
  * {@link ServiceStateIcon} vocabulary (PRD-004b). A single bad service only ever changes ITS
16
16
  * tile (sd-AC-8/sd-AC-9) — the tile list itself is keyed by name and independent per row.
17
+ *
18
+ * UX rework (operator report): the screen used to look stalled during a long wait, with no motion
19
+ * once a tile settled into one state, no sense of how long "a few seconds" really means, and
20
+ * nothing to read while waiting. This adds an always-running progress affordance, an honest time
21
+ * expectation (never a fake countdown) plus a calm "still working" note past a reasonable window,
22
+ * a legible summary of which service is the long pole, and a short "while you wait"/"what's next"
23
+ * pair so the wait teaches something instead of just sitting there. None of this changes what
24
+ * "ready" means: `isFleetReady()` and the dismissal poll below are untouched.
17
25
  */
18
26
  import React from "react";
19
27
  export interface BuzzingScreenProps {
@@ -15,13 +15,27 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
15
  * `/api/fleet-status` fail-soft), rendered one tile per registered service via the shared
16
16
  * {@link ServiceStateIcon} vocabulary (PRD-004b). A single bad service only ever changes ITS
17
17
  * tile (sd-AC-8/sd-AC-9) — the tile list itself is keyed by name and independent per row.
18
+ *
19
+ * UX rework (operator report): the screen used to look stalled during a long wait, with no motion
20
+ * once a tile settled into one state, no sense of how long "a few seconds" really means, and
21
+ * nothing to read while waiting. This adds an always-running progress affordance, an honest time
22
+ * expectation (never a fake countdown) plus a calm "still working" note past a reasonable window,
23
+ * a legible summary of which service is the long pole, and a short "while you wait"/"what's next"
24
+ * pair so the wait teaches something instead of just sitting there. None of this changes what
25
+ * "ready" means: `isFleetReady()` and the dismissal poll below are untouched.
18
26
  */
19
27
  import React from "react";
20
28
  import { isFleetReady } from "../../shared/fleet-readiness.js";
21
29
  import { SERVICE_STATE_COLOR, SERVICE_STATE_LABEL, ServiceStateIcon } from "./service-icons.js";
22
30
  import { useFleetTelemetry } from "./use-fleet-telemetry.js";
31
+ /** Past this many ms without readiness, the "still working" note appears (a calm, not-alarming note, never a claim of failure). */
32
+ const EXTENDED_WAIT_MS = 45_000;
23
33
  /** One service tile (bz-AC-3): the shared bee-state icon, the service name, and its state label. */
24
34
  function ServiceTile({ service }) {
35
+ // A lingering non-active state (starting/warming/degraded) still breathes, so a tile that sits
36
+ // unchanged for a while never reads as stalled; `error` and `active` are both terminal-for-now
37
+ // and stay still on purpose.
38
+ const stillWorking = service.state === "starting" || service.state === "warming" || service.state === "degraded";
25
39
  return (_jsxs("li", { "data-testid": `buzzing-tile-${service.name}`, "data-state": service.state, style: {
26
40
  display: "flex",
27
41
  alignItems: "center",
@@ -30,7 +44,12 @@ function ServiceTile({ service }) {
30
44
  borderRadius: "var(--radius-md)",
31
45
  border: "1px solid var(--border-subtle)",
32
46
  background: "var(--bg-elevated)",
33
- }, children: [_jsx("span", { style: { color: SERVICE_STATE_COLOR[service.state], display: "inline-flex", flex: "none" }, children: _jsx(ServiceStateIcon, { state: service.state }) }), _jsx("span", { style: { flex: 1, fontFamily: "var(--font-sans)", fontSize: "var(--text-sm)", color: "var(--text-primary)" }, children: service.name }), _jsx("span", { "data-testid": `buzzing-tile-state-${service.name}`, style: { fontFamily: "var(--font-mono)", fontSize: "var(--text-xs)", color: "var(--text-secondary)", textTransform: "lowercase" }, children: SERVICE_STATE_LABEL[service.state] })] }));
47
+ }, children: [_jsx("span", { style: {
48
+ color: SERVICE_STATE_COLOR[service.state],
49
+ display: "inline-flex",
50
+ flex: "none",
51
+ animation: stillWorking ? "hc-readiness-pulse var(--dur-pollinate) var(--ease-in-out) infinite alternate" : "none",
52
+ }, children: _jsx(ServiceStateIcon, { state: service.state }) }), _jsx("span", { style: { flex: 1, fontFamily: "var(--font-sans)", fontSize: "var(--text-sm)", color: "var(--text-primary)" }, children: service.name }), _jsx("span", { "data-testid": `buzzing-tile-state-${service.name}`, style: { fontFamily: "var(--font-mono)", fontSize: "var(--text-xs)", color: "var(--text-secondary)", textTransform: "lowercase" }, children: SERVICE_STATE_LABEL[service.state] })] }));
34
53
  }
35
54
  /** The distinct "no service enumerated yet" indicator (mirrors the old doctor-unreachable state). */
36
55
  function AwaitingRegistrationIndicator() {
@@ -46,6 +65,45 @@ function AwaitingRegistrationIndicator() {
46
65
  borderRadius: "var(--radius-lg)",
47
66
  }, children: [_jsx("span", { role: "img", "aria-label": "doctor supervisor: unreachable", style: { width: 8, height: 8, borderRadius: "50%", background: "var(--text-tertiary)", animation: "hc-readiness-pulse var(--dur-pollinate) var(--ease-in-out) infinite alternate" } }), _jsx("p", { style: { fontSize: "var(--text-sm)", color: "var(--text-secondary)", margin: 0, lineHeight: 1.5, textAlign: "center" }, children: "Waiting on doctor. No services are registered yet." })] }));
48
67
  }
68
+ /** An always-running indeterminate progress affordance: motion the operator can see regardless of tile state. */
69
+ function IndeterminateProgressBar() {
70
+ return (_jsx("div", { "data-testid": "buzzing-progress-bar", role: "progressbar", "aria-label": "Fleet still starting", style: {
71
+ width: "100%",
72
+ height: 6,
73
+ borderRadius: "var(--radius-full)",
74
+ background: "var(--bg-inset)",
75
+ border: "1px solid var(--border-subtle)",
76
+ overflow: "hidden",
77
+ position: "relative",
78
+ }, children: _jsx("div", { style: {
79
+ position: "absolute",
80
+ inset: 0,
81
+ width: "40%",
82
+ borderRadius: "var(--radius-full)",
83
+ background: "linear-gradient(90deg, transparent, var(--honey), transparent)",
84
+ animation: "hc-shimmer-sweep 1.6s var(--ease-in-out) infinite",
85
+ } }) }));
86
+ }
87
+ function whileYouWaitEntries(assetBase) {
88
+ return [
89
+ { name: "Hive", blurb: "Your one dashboard: the front door to the whole fleet.", icon: "/assets/brand/hive-mark.svg" },
90
+ { name: "Honeycomb", blurb: "Shared AI memory your coding tools carry across sessions.", icon: `${assetBase}/honeycomb-memory-cluster.svg` },
91
+ { name: "Nectar", blurb: "Gives every file a stable identity, so recall survives renames.", icon: "/assets/brand/nectar-mark.svg" },
92
+ { name: "Doctor", blurb: "The watchdog that restarts crashed daemons and keeps the fleet healthy.", icon: "/assets/brand/doctor-mark.svg" },
93
+ ];
94
+ }
95
+ /** The compact, skimmable "while you wait" primer (one line per product, never a wall of text). */
96
+ function WhileYouWait({ assetBase }) {
97
+ return (_jsxs("div", { "data-testid": "buzzing-while-you-wait", style: { display: "flex", flexDirection: "column", gap: 10, width: "100%", textAlign: "left" }, children: [_jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: "var(--text-xs)", textTransform: "uppercase", letterSpacing: "0.08em", color: "var(--text-tertiary)" }, children: "While you wait" }), _jsx("ul", { style: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: 8 }, children: whileYouWaitEntries(assetBase).map((entry) => (_jsxs("li", { style: { display: "flex", alignItems: "center", gap: 10 }, children: [_jsx("img", { src: entry.icon, width: 18, height: 18, alt: "", "aria-hidden": "true", style: { flex: "none" } }), _jsxs("span", { style: { fontFamily: "var(--font-sans)", fontSize: "var(--text-xs)", color: "var(--text-secondary)", lineHeight: 1.4 }, children: [_jsxs("strong", { style: { color: "var(--text-primary)" }, children: [entry.name, ":"] }), " ", entry.blurb] })] }, entry.name))) })] }));
98
+ }
99
+ /** A legible one-line summary of which services are still not settled (never claims failure). */
100
+ function longPoleSummary(services) {
101
+ const notReady = services.filter((service) => service.state !== "active");
102
+ if (notReady.length === 0)
103
+ return null;
104
+ const parts = notReady.map((service) => `${service.name} (${SERVICE_STATE_LABEL[service.state]})`);
105
+ return notReady.length === 1 ? `Still settling: ${parts[0]}.` : `Still settling: ${parts.join(", ")}.`;
106
+ }
49
107
  /**
50
108
  * The `/buzzing` readiness screen. Uses the shared telemetry hook for the tile grid and its own,
51
109
  * independent `isFleetReady()` poll for dismissal (see module doc for why the two are separate).
@@ -53,6 +111,16 @@ function AwaitingRegistrationIndicator() {
53
111
  export function BuzzingScreen({ assetBase, pollMs = 1500, onReady }) {
54
112
  const telemetry = useFleetTelemetry();
55
113
  const [ready, setReady] = React.useState(false);
114
+ const [elapsedMs, setElapsedMs] = React.useState(0);
115
+ // A plain wall-clock tick, independent of any poll: the "still working" note and the honest
116
+ // time-expectation copy read real elapsed time, never a fabricated countdown.
117
+ React.useEffect(() => {
118
+ if (ready)
119
+ return;
120
+ const startedAt = Date.now();
121
+ const id = setInterval(() => setElapsedMs(Date.now() - startedAt), 1000);
122
+ return () => clearInterval(id);
123
+ }, [ready]);
56
124
  // bz-AC-9/bz-AC-10: reuse the pinned `isFleetReady()` rule so dismissal means the same thing
57
125
  // here as it does in the server gate. Stops polling once ready (sticky, mirrors the retired
58
126
  // ReadinessSplash's rs-AC-7/rs-AC-9 discipline).
@@ -101,6 +169,7 @@ export function BuzzingScreen({ assetBase, pollMs = 1500, onReady }) {
101
169
  if (typeof window !== "undefined")
102
170
  window.location.assign("/");
103
171
  }, [ready, onReady]);
172
+ const longPole = longPoleSummary(telemetry.services);
104
173
  return (_jsxs("div", { "data-testid": "buzzing-screen", style: {
105
174
  display: "flex",
106
175
  alignItems: "center",
@@ -115,7 +184,7 @@ export function BuzzingScreen({ assetBase, pollMs = 1500, onReady }) {
115
184
  alignItems: "center",
116
185
  gap: 24,
117
186
  width: "100%",
118
- maxWidth: 460,
187
+ maxWidth: 560,
119
188
  padding: "40px 32px",
120
189
  background: "var(--bg-surface)",
121
190
  border: "1px solid var(--border-default)",
@@ -130,6 +199,11 @@ export function BuzzingScreen({ assetBase, pollMs = 1500, onReady }) {
130
199
  borderRadius: "50%",
131
200
  background: "var(--honey-subtle)",
132
201
  border: "1px solid var(--honey-border)",
133
- }, children: _jsx("img", { src: `${assetBase}/honeycomb-memory-cluster.svg`, width: 48, height: 48, alt: "" }) }), _jsx("h1", { style: { fontSize: "var(--text-xl)", fontWeight: 700, color: "var(--text-primary)", margin: 0, letterSpacing: "-0.02em" }, children: "Waiting for the hive\u2026" }), _jsxs("div", { "data-testid": "buzzing-status-region", role: "status", "aria-live": "polite", style: { display: "flex", flexDirection: "column", alignItems: "center", gap: 12, width: "100%" }, children: [_jsx("p", { style: { fontSize: "var(--text-sm)", color: "var(--text-secondary)", margin: 0, lineHeight: 1.5 }, children: "Starting required services. This usually takes a few seconds on a cold boot." }), telemetry.services.length === 0 ? (_jsx(AwaitingRegistrationIndicator, {})) : (_jsx("ul", { "data-testid": "buzzing-tile-grid", style: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: 8, width: "100%", textAlign: "left" }, children: telemetry.services.map((service) => (_jsx(ServiceTile, { service: service }, service.name))) }))] })] }), _jsx("style", { children: "@keyframes hc-readiness-pulse { from { opacity: .45 } to { opacity: 1 } }" })] }));
202
+ animation: "hc-badge-breathe 2.4s var(--ease-in-out) infinite alternate",
203
+ }, children: _jsx("img", { src: `${assetBase}/honeycomb-memory-cluster.svg`, width: 48, height: 48, alt: "" }) }), _jsx("h1", { style: { fontSize: "var(--text-xl)", fontWeight: 700, color: "var(--text-primary)", margin: 0, letterSpacing: "-0.02em" }, children: "Waiting for the hive\u2026" }), _jsxs("div", { "data-testid": "buzzing-status-region", role: "status", "aria-live": "polite", style: { display: "flex", flexDirection: "column", alignItems: "center", gap: 12, width: "100%" }, children: [_jsx("p", { style: { fontSize: "var(--text-sm)", color: "var(--text-secondary)", margin: 0, lineHeight: 1.5 }, children: "Starting required services." }), _jsx("p", { "data-testid": "buzzing-time-expectation", style: { fontSize: "var(--text-xs)", color: "var(--text-tertiary)", margin: 0, lineHeight: 1.5 }, children: "This usually takes about 20 to 40 seconds on a fresh install; a cold boot can take a minute." }), elapsedMs > EXTENDED_WAIT_MS && (_jsx("p", { "data-testid": "buzzing-still-working", role: "note", style: { fontSize: "var(--text-xs)", color: "var(--severity-info)", margin: 0, lineHeight: 1.5 }, children: "Still working. Some services take longer on first run; this is not stuck." })), _jsx(IndeterminateProgressBar, {}), telemetry.services.length === 0 ? (_jsx(AwaitingRegistrationIndicator, {})) : (_jsx("ul", { "data-testid": "buzzing-tile-grid", style: { listStyle: "none", margin: 0, padding: 0, display: "flex", flexDirection: "column", gap: 8, width: "100%", textAlign: "left" }, children: telemetry.services.map((service) => (_jsx(ServiceTile, { service: service }, service.name))) })), longPole !== null && (_jsx("p", { "data-testid": "buzzing-long-pole", style: { fontSize: "var(--text-xs)", color: "var(--text-tertiary)", margin: 0, lineHeight: 1.5 }, children: longPole }))] }), _jsx(WhileYouWait, { assetBase: assetBase }), _jsx("p", { "data-testid": "buzzing-whats-next", style: { fontSize: "var(--text-xs)", color: "var(--text-secondary)", margin: 0, lineHeight: 1.5 }, children: "Once every service reports ready, you will land straight on your dashboard, already linked to Deeplake. From there, the Apiary keeps your whole local AI fleet visible and healthy, day to day." })] }), _jsx("style", { children: [
204
+ "@keyframes hc-readiness-pulse { from { opacity: .45 } to { opacity: 1 } }",
205
+ "@keyframes hc-badge-breathe { from { transform: scale(1); opacity: 0.9 } to { transform: scale(1.05); opacity: 1 } }",
206
+ "@keyframes hc-shimmer-sweep { 0% { transform: translateX(-120%) } 100% { transform: translateX(340%) } }",
207
+ ].join("\n") })] }));
134
208
  }
135
209
  //# sourceMappingURL=buzzing-screen.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"buzzing-screen.js","sourceRoot":"","sources":["../../../src/dashboard/web/buzzing-screen.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buzzing-screen.js","sourceRoot":"","sources":["../../../src/dashboard/web/buzzing-screen.tsx"],"names":[],"mappings":"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"}
@@ -41,8 +41,9 @@ declare const ProductDetectionSchema: z.ZodObject<{
41
41
  export type ProductDetection = z.infer<typeof ProductDetectionSchema>;
42
42
  /** The safe default for a product the response omitted (never assume installed). */
43
43
  export declare const DEFAULT_PRODUCT_DETECTION: ProductDetection;
44
+ type DetectProducts = Record<OnboardingProduct, ProductDetection>;
44
45
  export declare const DetectResponseSchema: z.ZodObject<{
45
- products: z.ZodCatch<z.ZodObject<{
46
+ products: z.ZodCatch<z.ZodPipe<z.ZodCatch<z.ZodObject<{
46
47
  honeycomb: z.ZodOptional<z.ZodObject<{
47
48
  state: z.ZodCatch<z.ZodEnum<{
48
49
  not_installed: "not_installed";
@@ -95,12 +96,45 @@ export declare const DetectResponseSchema: z.ZodObject<{
95
96
  summary: z.ZodCatch<z.ZodString>;
96
97
  }, z.core.$strip>>;
97
98
  }, z.core.$strip>>;
98
- }, z.core.$strip>>;
99
+ }, z.core.$strip>>, z.ZodTransform<DetectProducts, {
100
+ honeycomb?: {
101
+ state: "not_installed" | "installed" | "install_in_progress" | "install_failed";
102
+ version?: string | undefined;
103
+ error?: {
104
+ stage: string;
105
+ summary: string;
106
+ } | undefined;
107
+ } | undefined;
108
+ doctor?: {
109
+ state: "not_installed" | "installed" | "install_in_progress" | "install_failed";
110
+ version?: string | undefined;
111
+ error?: {
112
+ stage: string;
113
+ summary: string;
114
+ } | undefined;
115
+ } | undefined;
116
+ hive?: {
117
+ state: "not_installed" | "installed" | "install_in_progress" | "install_failed";
118
+ version?: string | undefined;
119
+ error?: {
120
+ stage: string;
121
+ summary: string;
122
+ } | undefined;
123
+ } | undefined;
124
+ nectar?: {
125
+ state: "not_installed" | "installed" | "install_in_progress" | "install_failed";
126
+ version?: string | undefined;
127
+ error?: {
128
+ stage: string;
129
+ summary: string;
130
+ } | undefined;
131
+ } | undefined;
132
+ }>>>;
99
133
  }, z.core.$strip>;
100
134
  export type DetectResponse = z.infer<typeof DetectResponseSchema>;
101
135
  /** The honest "nothing detected yet" default (a fetch failure never fabricates an installed product). */
102
136
  export declare const EMPTY_DETECTION: DetectResponse;
103
- /** Read one product's detection, defaulting to {@link DEFAULT_PRODUCT_DETECTION} when omitted. */
137
+ /** Read one product's detection from the normalized four-product map. */
104
138
  export declare function detectionFor(detection: DetectResponse, product: OnboardingProduct): ProductDetection;
105
139
  /** ob-AC-3, every one of the four products reports `installed`. */
106
140
  export declare function isFleetFullyInstalled(detection: DetectResponse): boolean;
@@ -10,13 +10,14 @@
10
10
  * React (the onboarding screen is the FIRST thing a new operator sees: it must never white-screen).
11
11
  */
12
12
  import { z } from "zod";
13
+ import { INSTALLABLE_PRODUCTS as SHARED_INSTALLABLE_PRODUCTS, PRODUCT_SLUGS as SHARED_PRODUCT_SLUGS, } from "../../../shared/onboarding-types.js";
13
14
  // ─────────────────────────────────────────────────────────────────────────────
14
15
  // Product identity
15
16
  // ─────────────────────────────────────────────────────────────────────────────
16
17
  /** Every product the daemon reports detection for (hive is always present; it is the caller). */
17
- export const ONBOARDING_PRODUCTS = ["honeycomb", "doctor", "hive", "nectar"];
18
+ export const ONBOARDING_PRODUCTS = SHARED_PRODUCT_SLUGS;
18
19
  /** The three INSTALLABLE products, in the fixed order the guided flow walks them (ob-AC-6). */
19
- export const FIXED_PRODUCT_ORDER = ["doctor", "honeycomb", "nectar"];
20
+ export const FIXED_PRODUCT_ORDER = SHARED_INSTALLABLE_PRODUCTS;
20
21
  export function isInstallableProduct(value) {
21
22
  return FIXED_PRODUCT_ORDER.includes(value);
22
23
  }
@@ -35,25 +36,32 @@ const ProductDetectionSchema = z.object({
35
36
  });
36
37
  /** The safe default for a product the response omitted (never assume installed). */
37
38
  export const DEFAULT_PRODUCT_DETECTION = Object.freeze({ state: "not_installed" });
38
- // Every product key is OPTIONAL (a partial object, not a `z.record` over the enum): the daemon
39
- // contract never guarantees all four keys ride every response, and "omitted" must degrade to
40
- // {@link DEFAULT_PRODUCT_DETECTION} per-product rather than failing the WHOLE `products` object
41
- // (which a zod `z.record` over a finite enum key would do, since that shape requires every key).
39
+ const DetectProductsInputSchema = z
40
+ .object({
41
+ honeycomb: ProductDetectionSchema.optional(),
42
+ doctor: ProductDetectionSchema.optional(),
43
+ hive: ProductDetectionSchema.optional(),
44
+ nectar: ProductDetectionSchema.optional(),
45
+ })
46
+ .catch({});
47
+ function normalizeDetectProducts(products) {
48
+ return {
49
+ honeycomb: products.honeycomb ?? DEFAULT_PRODUCT_DETECTION,
50
+ doctor: products.doctor ?? DEFAULT_PRODUCT_DETECTION,
51
+ hive: products.hive ?? DEFAULT_PRODUCT_DETECTION,
52
+ nectar: products.nectar ?? DEFAULT_PRODUCT_DETECTION,
53
+ };
54
+ }
55
+ const DEFAULT_DETECT_PRODUCTS = Object.freeze(normalizeDetectProducts({}));
56
+ // The wire response is normalized to all four products, even if a malformed/legacy payload omits keys.
42
57
  export const DetectResponseSchema = z.object({
43
- products: z
44
- .object({
45
- honeycomb: ProductDetectionSchema.optional(),
46
- doctor: ProductDetectionSchema.optional(),
47
- hive: ProductDetectionSchema.optional(),
48
- nectar: ProductDetectionSchema.optional(),
49
- })
50
- .catch({}),
58
+ products: DetectProductsInputSchema.transform((products) => normalizeDetectProducts(products)).catch(DEFAULT_DETECT_PRODUCTS),
51
59
  });
52
60
  /** The honest "nothing detected yet" default (a fetch failure never fabricates an installed product). */
53
- export const EMPTY_DETECTION = Object.freeze({ products: {} });
54
- /** Read one product's detection, defaulting to {@link DEFAULT_PRODUCT_DETECTION} when omitted. */
61
+ export const EMPTY_DETECTION = Object.freeze({ products: DEFAULT_DETECT_PRODUCTS });
62
+ /** Read one product's detection from the normalized four-product map. */
55
63
  export function detectionFor(detection, product) {
56
- return detection.products[product] ?? DEFAULT_PRODUCT_DETECTION;
64
+ return detection.products[product];
57
65
  }
58
66
  /** ob-AC-3, every one of the four products reports `installed`. */
59
67
  export function isFleetFullyInstalled(detection) {
@@ -1 +1 @@
1
- {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../src/dashboard/web/onboarding/contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../../src/dashboard/web/onboarding/contracts.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,13 @@
3
3
  * fleet reads ready, rendering one row per reported daemon using the SAME bee-state vocabulary
4
4
  * `/buzzing` renders (`service-icons.tsx` / `service-status.ts`), so a health-conscious operator
5
5
  * sees a consistent visual language across the whole onboarding-to-dashboard journey.
6
+ *
7
+ * UX rework (operator report): mirrors `/buzzing`'s rework (`buzzing-screen.tsx`) so the two
8
+ * "please wait" screens in this journey read as the same product: an always-running progress
9
+ * affordance, an honest (never faked) time expectation plus a calm "still working" note past a
10
+ * reasonable window, a legible summary of which daemon is the long pole, and a short "while you
11
+ * wait"/"what's next" pair so the wait teaches something. The polling and `onReady` advance below
12
+ * are untouched: none of this changes what "ready" means.
6
13
  */
7
14
  import React from "react";
8
15
  import type { OnboardingClient } from "./onboarding-client.js";
@@ -12,6 +19,8 @@ export interface HealthViewProps {
12
19
  readonly onReady: () => void;
13
20
  /** Overrides the poll interval (ms). Defaults to 1500, mirroring `/buzzing`'s dismissal poll. */
14
21
  readonly pollMs?: number;
22
+ /** The host-served asset base (mirrors every sibling onboarding step). Defaults to the same empty base the production host serves at. */
23
+ readonly assetBase?: string;
15
24
  }
16
25
  /** ob-AC-13, the fleet reads ready only once; this screen stops polling the instant it does. */
17
- export declare function HealthView({ client, onReady, pollMs }: HealthViewProps): React.JSX.Element;
26
+ export declare function HealthView({ client, onReady, pollMs, assetBase }: HealthViewProps): React.JSX.Element;