@legioncodeinc/hive 0.1.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.
Files changed (190) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +262 -0
  3. package/dist/cli-commands.d.ts +41 -0
  4. package/dist/cli-commands.js +76 -0
  5. package/dist/cli-commands.js.map +1 -0
  6. package/dist/cli.d.ts +2 -0
  7. package/dist/cli.js +46 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/daemon/dashboard/app.js +118 -0
  10. package/dist/daemon/dashboard/host.d.ts +90 -0
  11. package/dist/daemon/dashboard/host.js +172 -0
  12. package/dist/daemon/dashboard/host.js.map +1 -0
  13. package/dist/daemon/dashboard/web-assets.d.ts +88 -0
  14. package/dist/daemon/dashboard/web-assets.js +195 -0
  15. package/dist/daemon/dashboard/web-assets.js.map +1 -0
  16. package/dist/daemon/fleet-status.d.ts +15 -0
  17. package/dist/daemon/fleet-status.js +56 -0
  18. package/dist/daemon/fleet-status.js.map +1 -0
  19. package/dist/daemon/gate.d.ts +55 -0
  20. package/dist/daemon/gate.js +128 -0
  21. package/dist/daemon/gate.js.map +1 -0
  22. package/dist/daemon/proxy.d.ts +38 -0
  23. package/dist/daemon/proxy.js +126 -0
  24. package/dist/daemon/proxy.js.map +1 -0
  25. package/dist/daemon/registry.d.ts +31 -0
  26. package/dist/daemon/registry.js +120 -0
  27. package/dist/daemon/registry.js.map +1 -0
  28. package/dist/daemon/server.d.ts +41 -0
  29. package/dist/daemon/server.js +126 -0
  30. package/dist/daemon/server.js.map +1 -0
  31. package/dist/daemon/setup-auth.d.ts +37 -0
  32. package/dist/daemon/setup-auth.js +51 -0
  33. package/dist/daemon/setup-auth.js.map +1 -0
  34. package/dist/daemon/telemetry-proxy.d.ts +47 -0
  35. package/dist/daemon/telemetry-proxy.js +63 -0
  36. package/dist/daemon/telemetry-proxy.js.map +1 -0
  37. package/dist/dashboard/contracts.d.ts +235 -0
  38. package/dist/dashboard/contracts.js +43 -0
  39. package/dist/dashboard/contracts.js.map +1 -0
  40. package/dist/dashboard/web/app.d.ts +44 -0
  41. package/dist/dashboard/web/app.js +179 -0
  42. package/dist/dashboard/web/app.js.map +1 -0
  43. package/dist/dashboard/web/boot-route.d.ts +23 -0
  44. package/dist/dashboard/web/boot-route.js +29 -0
  45. package/dist/dashboard/web/boot-route.js.map +1 -0
  46. package/dist/dashboard/web/build-graph-button.d.ts +46 -0
  47. package/dist/dashboard/web/build-graph-button.js +81 -0
  48. package/dist/dashboard/web/build-graph-button.js.map +1 -0
  49. package/dist/dashboard/web/buzzing-screen.d.ts +30 -0
  50. package/dist/dashboard/web/buzzing-screen.js +135 -0
  51. package/dist/dashboard/web/buzzing-screen.js.map +1 -0
  52. package/dist/dashboard/web/folder-picker.d.ts +54 -0
  53. package/dist/dashboard/web/folder-picker.js +125 -0
  54. package/dist/dashboard/web/folder-picker.js.map +1 -0
  55. package/dist/dashboard/web/graph-layout.d.ts +101 -0
  56. package/dist/dashboard/web/graph-layout.js +0 -0
  57. package/dist/dashboard/web/graph-layout.js.map +1 -0
  58. package/dist/dashboard/web/harness-strip.d.ts +38 -0
  59. package/dist/dashboard/web/harness-strip.js +65 -0
  60. package/dist/dashboard/web/harness-strip.js.map +1 -0
  61. package/dist/dashboard/web/health-rail.d.ts +26 -0
  62. package/dist/dashboard/web/health-rail.js +61 -0
  63. package/dist/dashboard/web/health-rail.js.map +1 -0
  64. package/dist/dashboard/web/main.d.ts +22 -0
  65. package/dist/dashboard/web/main.js +51 -0
  66. package/dist/dashboard/web/main.js.map +1 -0
  67. package/dist/dashboard/web/needs-project.d.ts +51 -0
  68. package/dist/dashboard/web/needs-project.js +69 -0
  69. package/dist/dashboard/web/needs-project.js.map +1 -0
  70. package/dist/dashboard/web/page-frame.d.ts +95 -0
  71. package/dist/dashboard/web/page-frame.js +98 -0
  72. package/dist/dashboard/web/page-frame.js.map +1 -0
  73. package/dist/dashboard/web/pages/coming-soon.d.ts +23 -0
  74. package/dist/dashboard/web/pages/coming-soon.js +19 -0
  75. package/dist/dashboard/web/pages/coming-soon.js.map +1 -0
  76. package/dist/dashboard/web/pages/dashboard.d.ts +32 -0
  77. package/dist/dashboard/web/pages/dashboard.js +205 -0
  78. package/dist/dashboard/web/pages/dashboard.js.map +1 -0
  79. package/dist/dashboard/web/pages/graph.d.ts +72 -0
  80. package/dist/dashboard/web/pages/graph.js +362 -0
  81. package/dist/dashboard/web/pages/graph.js.map +1 -0
  82. package/dist/dashboard/web/pages/harnesses.d.ts +65 -0
  83. package/dist/dashboard/web/pages/harnesses.js +210 -0
  84. package/dist/dashboard/web/pages/harnesses.js.map +1 -0
  85. package/dist/dashboard/web/pages/health.d.ts +22 -0
  86. package/dist/dashboard/web/pages/health.js +91 -0
  87. package/dist/dashboard/web/pages/health.js.map +1 -0
  88. package/dist/dashboard/web/pages/lifecycle-panel.d.ts +60 -0
  89. package/dist/dashboard/web/pages/lifecycle-panel.js +187 -0
  90. package/dist/dashboard/web/pages/lifecycle-panel.js.map +1 -0
  91. package/dist/dashboard/web/pages/logs.d.ts +55 -0
  92. package/dist/dashboard/web/pages/logs.js +311 -0
  93. package/dist/dashboard/web/pages/logs.js.map +1 -0
  94. package/dist/dashboard/web/pages/memories.d.ts +35 -0
  95. package/dist/dashboard/web/pages/memories.js +439 -0
  96. package/dist/dashboard/web/pages/memories.js.map +1 -0
  97. package/dist/dashboard/web/pages/projects.d.ts +38 -0
  98. package/dist/dashboard/web/pages/projects.js +325 -0
  99. package/dist/dashboard/web/pages/projects.js.map +1 -0
  100. package/dist/dashboard/web/pages/roi-chart.d.ts +52 -0
  101. package/dist/dashboard/web/pages/roi-chart.js +133 -0
  102. package/dist/dashboard/web/pages/roi-chart.js.map +1 -0
  103. package/dist/dashboard/web/pages/roi.d.ts +93 -0
  104. package/dist/dashboard/web/pages/roi.js +375 -0
  105. package/dist/dashboard/web/pages/roi.js.map +1 -0
  106. package/dist/dashboard/web/pages/settings.d.ts +103 -0
  107. package/dist/dashboard/web/pages/settings.js +420 -0
  108. package/dist/dashboard/web/pages/settings.js.map +1 -0
  109. package/dist/dashboard/web/pages/sync.d.ts +59 -0
  110. package/dist/dashboard/web/pages/sync.js +280 -0
  111. package/dist/dashboard/web/pages/sync.js.map +1 -0
  112. package/dist/dashboard/web/panels.d.ts +178 -0
  113. package/dist/dashboard/web/panels.js +471 -0
  114. package/dist/dashboard/web/panels.js.map +1 -0
  115. package/dist/dashboard/web/primitives.d.ts +80 -0
  116. package/dist/dashboard/web/primitives.js +208 -0
  117. package/dist/dashboard/web/primitives.js.map +1 -0
  118. package/dist/dashboard/web/readiness-splash.d.ts +39 -0
  119. package/dist/dashboard/web/readiness-splash.js +201 -0
  120. package/dist/dashboard/web/readiness-splash.js.map +1 -0
  121. package/dist/dashboard/web/registry.d.ts +96 -0
  122. package/dist/dashboard/web/registry.js +99 -0
  123. package/dist/dashboard/web/registry.js.map +1 -0
  124. package/dist/dashboard/web/router.d.ts +48 -0
  125. package/dist/dashboard/web/router.js +76 -0
  126. package/dist/dashboard/web/router.js.map +1 -0
  127. package/dist/dashboard/web/scope-context.d.ts +155 -0
  128. package/dist/dashboard/web/scope-context.js +266 -0
  129. package/dist/dashboard/web/scope-context.js.map +1 -0
  130. package/dist/dashboard/web/service-icons.d.ts +33 -0
  131. package/dist/dashboard/web/service-icons.js +80 -0
  132. package/dist/dashboard/web/service-icons.js.map +1 -0
  133. package/dist/dashboard/web/setup-gate.d.ts +116 -0
  134. package/dist/dashboard/web/setup-gate.js +272 -0
  135. package/dist/dashboard/web/setup-gate.js.map +1 -0
  136. package/dist/dashboard/web/sidebar.d.ts +63 -0
  137. package/dist/dashboard/web/sidebar.js +91 -0
  138. package/dist/dashboard/web/sidebar.js.map +1 -0
  139. package/dist/dashboard/web/use-fleet-telemetry.d.ts +111 -0
  140. package/dist/dashboard/web/use-fleet-telemetry.js +278 -0
  141. package/dist/dashboard/web/use-fleet-telemetry.js.map +1 -0
  142. package/dist/dashboard/web/wire.d.ts +1937 -0
  143. package/dist/dashboard/web/wire.js +1837 -0
  144. package/dist/dashboard/web/wire.js.map +1 -0
  145. package/dist/errors.d.ts +5 -0
  146. package/dist/errors.js +11 -0
  147. package/dist/errors.js.map +1 -0
  148. package/dist/install/registry.d.ts +35 -0
  149. package/dist/install/registry.js +110 -0
  150. package/dist/install/registry.js.map +1 -0
  151. package/dist/lock.d.ts +10 -0
  152. package/dist/lock.js +87 -0
  153. package/dist/lock.js.map +1 -0
  154. package/dist/service/commands.d.ts +15 -0
  155. package/dist/service/commands.js +49 -0
  156. package/dist/service/commands.js.map +1 -0
  157. package/dist/service/index.d.ts +38 -0
  158. package/dist/service/index.js +174 -0
  159. package/dist/service/index.js.map +1 -0
  160. package/dist/service/platform.d.ts +37 -0
  161. package/dist/service/platform.js +67 -0
  162. package/dist/service/platform.js.map +1 -0
  163. package/dist/service/templates.d.ts +10 -0
  164. package/dist/service/templates.js +120 -0
  165. package/dist/service/templates.js.map +1 -0
  166. package/dist/shared/constants.d.ts +15 -0
  167. package/dist/shared/constants.js +19 -0
  168. package/dist/shared/constants.js.map +1 -0
  169. package/dist/shared/daemon-routing.d.ts +11 -0
  170. package/dist/shared/daemon-routing.js +38 -0
  171. package/dist/shared/daemon-routing.js.map +1 -0
  172. package/dist/shared/fleet-readiness.d.ts +18 -0
  173. package/dist/shared/fleet-readiness.js +9 -0
  174. package/dist/shared/fleet-readiness.js.map +1 -0
  175. package/dist/shared/fleet-telemetry.d.ts +68 -0
  176. package/dist/shared/fleet-telemetry.js +61 -0
  177. package/dist/shared/fleet-telemetry.js.map +1 -0
  178. package/dist/shared/lifecycle-flags.d.ts +34 -0
  179. package/dist/shared/lifecycle-flags.js +39 -0
  180. package/dist/shared/lifecycle-flags.js.map +1 -0
  181. package/dist/shared/memory-types.d.ts +55 -0
  182. package/dist/shared/memory-types.js +75 -0
  183. package/dist/shared/memory-types.js.map +1 -0
  184. package/dist/shared/service-status.d.ts +82 -0
  185. package/dist/shared/service-status.js +97 -0
  186. package/dist/shared/service-status.js.map +1 -0
  187. package/dist/telemetry/emit.d.ts +197 -0
  188. package/dist/telemetry/emit.js +196 -0
  189. package/dist/telemetry/emit.js.map +1 -0
  190. package/package.json +50 -0
@@ -0,0 +1,208 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * The Honeycomb design-system PRIMITIVES, ported to TSX — PRD-024 Wave 2 (AC-1, D-5).
4
+ *
5
+ * These are the SAME five primitives the design system exposes at runtime as
6
+ * `window.HoneycombDesignSystem_d60529` (`assets/components/core/*` +
7
+ * `assets/components/honeycomb/*`). The UI kit's `index.html` pulls them from that global
8
+ * via in-browser Babel; D-1 forbids that (no CDN React, no `@babel/standalone`). So we PORT
9
+ * the JSX sources into real typed TSX modules that esbuild compiles at build time and
10
+ * bundles — the design is reused verbatim (same tokens, same markup, same variants), not
11
+ * forked. Every visual value comes from a `var(--…)` design token (`assets/styles.css`).
12
+ */
13
+ import React from "react";
14
+ /**
15
+ * The Honeycomb button (ported from `assets/components/core/Button.jsx`). One primary (honey)
16
+ * action per region; `pollinate` is reserved for the Pollinating trigger. The hover/press handlers
17
+ * mutate inline style exactly as the DS source does.
18
+ */
19
+ export function Button({ children, variant = "primary", size = "md", disabled = false, iconLeft, iconRight, onClick, type = "button", style, ...rest }) {
20
+ const sizes = {
21
+ sm: { height: 32, padding: "0 12px", font: "var(--text-sm)", gap: 6 },
22
+ md: { height: 40, padding: "0 16px", font: "var(--text-sm)", gap: 8 },
23
+ lg: { height: 48, padding: "0 22px", font: "var(--text-base)", gap: 8 },
24
+ };
25
+ const s = sizes[size] ?? sizes.md;
26
+ const variants = {
27
+ primary: { background: "var(--honey)", color: "var(--honey-on)", border: "1px solid transparent" },
28
+ secondary: { background: "var(--bg-elevated)", color: "var(--text-primary)", border: "1px solid var(--border-strong)" },
29
+ ghost: { background: "transparent", color: "var(--text-secondary)", border: "1px solid transparent" },
30
+ pollinate: { background: "var(--pollinate)", color: "#FFFFFF", border: "1px solid transparent" },
31
+ danger: { background: "var(--severity-critical-bg)", color: "var(--severity-critical)", border: "1px solid var(--severity-critical)" },
32
+ };
33
+ const v = variants[variant] ?? variants.primary;
34
+ const base = {
35
+ display: "inline-flex",
36
+ alignItems: "center",
37
+ justifyContent: "center",
38
+ gap: s.gap,
39
+ height: s.height,
40
+ padding: s.padding,
41
+ fontFamily: "var(--font-sans)",
42
+ fontSize: s.font,
43
+ fontWeight: 600,
44
+ letterSpacing: "-0.01em",
45
+ lineHeight: 1,
46
+ borderRadius: "var(--radius-md)",
47
+ cursor: disabled ? "not-allowed" : "pointer",
48
+ opacity: disabled ? 0.45 : 1,
49
+ transition: "background var(--dur-fast) var(--ease-out), transform var(--dur-fast) var(--ease-out), border-color var(--dur-fast) var(--ease-out)",
50
+ whiteSpace: "nowrap",
51
+ userSelect: "none",
52
+ ...v,
53
+ ...style,
54
+ };
55
+ const hoverBg = {
56
+ primary: "var(--honey-hover)",
57
+ secondary: "var(--bg-subtle)",
58
+ ghost: "var(--bg-elevated)",
59
+ pollinate: "var(--pollinate-hover)",
60
+ danger: "var(--severity-critical-bg)",
61
+ };
62
+ const onEnter = (e) => {
63
+ if (!disabled)
64
+ e.currentTarget.style.background = hoverBg[variant] ?? hoverBg.primary;
65
+ };
66
+ const onLeave = (e) => {
67
+ if (!disabled)
68
+ e.currentTarget.style.background = String(v.background);
69
+ };
70
+ const onDown = (e) => {
71
+ if (!disabled)
72
+ e.currentTarget.style.transform = "translateY(1px)";
73
+ };
74
+ const onUp = (e) => {
75
+ if (!disabled)
76
+ e.currentTarget.style.transform = "none";
77
+ };
78
+ return (_jsxs("button", { type: type, disabled: disabled, onClick: onClick, style: base, onMouseEnter: onEnter, onMouseLeave: onLeave, onMouseDown: onDown, onMouseUp: onUp, ...rest, children: [iconLeft, children, iconRight] }));
79
+ }
80
+ /** The Honeycomb status pill (ported from `assets/components/core/Badge.jsx`). */
81
+ export function Badge({ children, tone = "neutral", mono = false, dot = false, style }) {
82
+ const tones = {
83
+ neutral: { bg: "var(--bg-subtle)", fg: "var(--text-secondary)", bd: "var(--border-strong)" },
84
+ honey: { bg: "var(--honey-subtle)", fg: "var(--honey)", bd: "var(--honey-border)" },
85
+ verified: { bg: "var(--severity-success-bg)", fg: "var(--verified)", bd: "var(--verified)" },
86
+ pollinate: { bg: "var(--pollinate-subtle)", fg: "var(--pollinate)", bd: "var(--pollinate-border)" },
87
+ info: { bg: "var(--severity-info-bg)", fg: "var(--severity-info)", bd: "var(--severity-info)" },
88
+ warning: { bg: "var(--severity-warning-bg)", fg: "var(--severity-warning)", bd: "var(--severity-warning)" },
89
+ critical: { bg: "var(--severity-critical-bg)", fg: "var(--severity-critical)", bd: "var(--severity-critical)" },
90
+ };
91
+ const t = tones[tone] ?? tones.neutral;
92
+ return (_jsxs("span", { style: {
93
+ display: "inline-flex",
94
+ alignItems: "center",
95
+ gap: 6,
96
+ height: 22,
97
+ padding: "0 9px",
98
+ background: t.bg,
99
+ color: t.fg,
100
+ border: `1px solid ${t.bd}`,
101
+ borderRadius: "var(--radius-full)",
102
+ fontFamily: mono ? "var(--font-mono)" : "var(--font-sans)",
103
+ fontSize: "var(--text-xs)",
104
+ fontWeight: 600,
105
+ letterSpacing: mono ? "0.02em" : "0",
106
+ lineHeight: 1,
107
+ whiteSpace: "nowrap",
108
+ ...style,
109
+ }, children: [dot && _jsx("span", { style: { width: 6, height: 6, borderRadius: "50%", background: t.fg, flex: "none" } }), children] }));
110
+ }
111
+ /** The Honeycomb text input (ported from `assets/components/core/Input.jsx`). Focus lights the honey ring. */
112
+ export function Input({ value, defaultValue, onChange, placeholder, mono = false, size = "md", disabled = false, iconLeft, type = "text", style, ...rest }) {
113
+ const [focused, setFocused] = React.useState(false);
114
+ const heights = { sm: 32, md: 40, lg: 48 };
115
+ const h = heights[size] ?? 40;
116
+ return (_jsxs("div", { style: {
117
+ display: "flex",
118
+ alignItems: "center",
119
+ gap: 8,
120
+ height: h,
121
+ padding: "0 12px",
122
+ background: "var(--bg-surface)",
123
+ border: `1px solid ${focused ? "var(--honey)" : "var(--border-default)"}`,
124
+ borderRadius: "var(--radius-md)",
125
+ boxShadow: focused ? "0 0 0 3px var(--honey-subtle)" : "none",
126
+ transition: "border-color var(--dur-fast) var(--ease-out), box-shadow var(--dur-fast) var(--ease-out)",
127
+ opacity: disabled ? 0.5 : 1,
128
+ ...style,
129
+ }, children: [iconLeft && _jsx("span", { style: { display: "inline-flex", color: "var(--text-tertiary)", flex: "none" }, children: iconLeft }), _jsx("input", { type: type, value: value, defaultValue: defaultValue, onChange: onChange, placeholder: placeholder, disabled: disabled, onFocus: () => setFocused(true), onBlur: () => setFocused(false), style: {
130
+ flex: 1,
131
+ minWidth: 0,
132
+ background: "transparent",
133
+ border: "none",
134
+ outline: "none",
135
+ color: "var(--text-primary)",
136
+ fontFamily: mono ? "var(--font-mono)" : "var(--font-sans)",
137
+ fontSize: mono ? "var(--text-sm)" : "var(--text-base)",
138
+ letterSpacing: mono ? "0.01em" : "0",
139
+ }, ...rest })] }));
140
+ }
141
+ /** The dashboard metric tile (ported from `assets/components/honeycomb/Kpi.jsx`). */
142
+ export function Kpi({ label, value, unit, delta, accent = "honey", style }) {
143
+ const accents = {
144
+ honey: "var(--honey)",
145
+ pollinate: "var(--pollinate)",
146
+ verified: "var(--verified)",
147
+ neutral: "var(--text-primary)",
148
+ };
149
+ const c = accents[accent] ?? accents.honey;
150
+ const deltaUp = typeof delta === "number" ? delta >= 0 : null;
151
+ return (_jsxs("div", { style: {
152
+ display: "flex",
153
+ flexDirection: "column",
154
+ gap: 8,
155
+ padding: 18,
156
+ background: "var(--bg-elevated)",
157
+ border: "1px solid var(--border-default)",
158
+ borderRadius: "var(--radius-lg)",
159
+ ...style,
160
+ }, children: [_jsx("span", { style: {
161
+ fontFamily: "var(--font-mono)",
162
+ fontSize: "var(--text-xs)",
163
+ textTransform: "uppercase",
164
+ letterSpacing: "0.08em",
165
+ color: "var(--text-tertiary)",
166
+ }, children: label }), _jsxs("div", { style: { display: "flex", alignItems: "baseline", gap: 6 }, children: [_jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 30, fontWeight: 700, lineHeight: 1, color: c, letterSpacing: "-0.01em" }, children: value }), unit && _jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: "var(--text-sm)", color: "var(--text-tertiary)" }, children: unit })] }), delta !== undefined && delta !== null && (_jsxs("span", { style: { fontFamily: "var(--font-mono)", fontSize: 12, color: deltaUp ? "var(--verified)" : "var(--severity-critical)" }, children: [deltaUp ? "▲" : "▼", " ", Math.abs(delta), " this week"] }))] }));
167
+ }
168
+ /** The signature Honeycomb surface (ported from `assets/components/honeycomb/MemoryCard.jsx`). */
169
+ export function MemoryCard({ memoryKey, snippet, source, score, scope = "personal", verified = false, pollinating = false, kind, secondary = false, style, }) {
170
+ const accent = pollinating ? "var(--pollinate)" : verified ? "var(--verified)" : "var(--honey)";
171
+ return (_jsxs("div", { style: {
172
+ display: "flex",
173
+ gap: 14,
174
+ padding: 16,
175
+ background: "var(--bg-elevated)",
176
+ border: "1px solid var(--border-default)",
177
+ borderRadius: "var(--radius-lg)",
178
+ transition: "border-color var(--dur-base) var(--ease-out)",
179
+ // PRD-027 AC-4: a raw-session drill-down hit is visually demoted (dimmed) below
180
+ // the distilled facts the engine ranked above it — the score+order are the engine's.
181
+ opacity: secondary ? 0.72 : 1,
182
+ ...style,
183
+ }, children: [_jsx("div", { style: { flex: "none", paddingTop: 2 }, children: _jsx("div", { style: {
184
+ width: 34,
185
+ height: 38,
186
+ clipPath: "polygon(50% 0, 100% 25%, 100% 75%, 50% 100%, 0 75%, 0 25%)",
187
+ background: accent,
188
+ opacity: pollinating ? 0.9 : 1,
189
+ animation: pollinating ? "hc-pollinate-pulse var(--dur-pollinate) var(--ease-in-out) infinite alternate" : "none",
190
+ } }) }), _jsxs("div", { style: { flex: 1, minWidth: 0, display: "flex", flexDirection: "column", gap: 7 }, children: [_jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8 }, children: [_jsx("span", { style: {
191
+ fontFamily: "var(--font-mono)",
192
+ fontSize: "var(--text-sm)",
193
+ fontWeight: 600,
194
+ color: accent,
195
+ whiteSpace: "nowrap",
196
+ overflow: "hidden",
197
+ textOverflow: "ellipsis",
198
+ }, children: memoryKey }), verified && !pollinating && (_jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--verified)", flex: "none" }, children: "\u2713 verified" })), (secondary || kind === "session") && !pollinating && (_jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-tertiary)", flex: "none" }, children: "session" })), pollinating && _jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--pollinate)", flex: "none" }, children: "pollinating\u2026" })] }), _jsx("div", { style: { fontSize: "var(--text-sm)", lineHeight: "20px", color: "var(--text-primary)" }, children: snippet }), _jsxs("div", { style: { display: "flex", alignItems: "center", gap: 10, marginTop: 1 }, children: [source && (_jsx("span", { style: {
199
+ fontFamily: "var(--font-mono)",
200
+ fontSize: 11,
201
+ color: "var(--text-tertiary)",
202
+ whiteSpace: "nowrap",
203
+ overflow: "hidden",
204
+ textOverflow: "ellipsis",
205
+ maxWidth: 220,
206
+ }, children: source })), _jsx("span", { style: { flex: 1 } }), _jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 11, color: "var(--text-tertiary)" }, children: scope }), typeof score === "number" && (_jsx("span", { style: { fontFamily: "var(--font-mono)", fontSize: 11, fontWeight: 600, color: "var(--text-secondary)" }, children: score.toFixed(2) }))] })] }), _jsx("style", { children: "@keyframes hc-pollinate-pulse { from { opacity: .5 } to { opacity: 1 } }" })] }));
207
+ }
208
+ //# sourceMappingURL=primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"primitives.js","sourceRoot":"","sources":["../../../src/dashboard/web/primitives.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
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;
@@ -0,0 +1,201 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"readiness-splash.js","sourceRoot":"","sources":["../../../src/dashboard/web/readiness-splash.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * The dashboard ROUTE REGISTRY — PRD-037c (the single extension point, D-7).
3
+ *
4
+ * ONE ordered list of `{ route, label, icon, component, dynamic? }` entries that BOTH the sidebar
5
+ * (037a, for its nav items) and the router outlet (037b, to mount the active page) read. Adding a
6
+ * page (PRDs 038-044) is ONE entry here plus one component that drops into `<PageFrame>` — no
7
+ * sidebar edit, no router edit (037c AC-6 proves that seam: a throwaway entry appears in the nav
8
+ * AND routes without touching `sidebar.tsx`/`router.tsx`).
9
+ *
10
+ * ── How to add a dashboard page (the contract PRDs 038-044 consume) ──────────────
11
+ * 1. Write a page component: `function MyPage({ wire, daemonUp, assetBase }: PageProps) { … }`
12
+ * wrapping its content in `<PageFrame title="…">` and hydrating via `usePoll` / the shared
13
+ * `wire` (never `createWireClient` — the shell passes ONE down).
14
+ * 2. Add ONE `RouteEntry` to {@link ROUTES} in nav order: `{ route, label, icon, component }`.
15
+ * The sidebar renders the nav item; the outlet routes the path to the component. Done.
16
+ * 3. A DYNAMIC group (per-installed-harness items under Harnesses, PRD-039) sets `dynamic:
17
+ * { resolve: (live) => SubItem[] }` — its CHILD items are computed from live install state at
18
+ * render, distinct from the seven static top-level routes. The registry DEFINES this contract;
19
+ * the live data source is the consuming PRD's call (parent OQ-3).
20
+ *
21
+ * The fuller version of this note lives in `library/knowledge/private/dashboard/adding-a-page.md`
22
+ * (037c AC-7), code-near here and discoverable there.
23
+ *
24
+ * Icons are inline-SVG `ReactNode`s (037c OQ-1 — a ReactNode, NOT an icon-font/registry), matching
25
+ * the panels' inline-SVG style and the no-new-dependency posture. Every stroke uses
26
+ * `currentColor`, so the sidebar tints an icon by setting `color` on its row (honey when active,
27
+ * `--text-secondary` at rest) — no per-icon color logic.
28
+ */
29
+ import React from "react";
30
+ import type { PageProps } from "./page-frame.js";
31
+ /**
32
+ * One dynamically-resolved sub-item under a registry entry — e.g. a per-installed-harness item
33
+ * under Harnesses (PRD-039). Its `route` is the deep path the sidebar navigates to; `label` is the
34
+ * nav text. These are NOT top-level routes: they are CHILDREN of a static entry, computed at render
35
+ * from live install state. The registry defines this shape; the live data is the consuming PRD's.
36
+ */
37
+ export interface SubItem {
38
+ /** The deep path this sub-item navigates to (e.g. `/harnesses/claude-code`). */
39
+ readonly route: string;
40
+ /** The nav label for this sub-item (e.g. `Claude Code`). */
41
+ readonly label: string;
42
+ }
43
+ /**
44
+ * The dynamic-group resolver a registry entry may carry (037c). `resolve` is handed whatever live
45
+ * install/state object the shell provides and returns the CHILD sub-items to render under the parent
46
+ * nav item. The type parameter is `unknown` here because the registry is the CONTRACT, not the data
47
+ * source — the consuming PRD (039) narrows `live` to its own shape. A `dynamic` entry whose
48
+ * `resolve` returns `[]` simply renders no children (the parent stays a plain nav item).
49
+ */
50
+ export interface DynamicGroup {
51
+ /** Compute the child sub-items from live install/render state (parent OQ-3 — data is 039's call). */
52
+ readonly resolve: (live: unknown) => readonly SubItem[];
53
+ }
54
+ /**
55
+ * One registry entry (D-7). `route` is the real, server-served path (PRD-003c, e.g. `/graph`);
56
+ * `label` + `icon` are the nav presentation; `component` is the page the outlet mounts (every page
57
+ * takes {@link PageProps}); `dynamic` (optional) marks an entry whose CHILDREN are resolved from
58
+ * live state — its presence is what distinguishes a STATIC top-level route from a
59
+ * DYNAMICALLY-LOADED group (the parent's explicit static-vs-dynamic ask).
60
+ */
61
+ export interface RouteEntry {
62
+ /** The path this entry owns (`/` is the default Dashboard route). */
63
+ readonly route: string;
64
+ /** The nav label (sidebar text + per-route document title source, 037c OQ-2). */
65
+ readonly label: string;
66
+ /** The nav icon — an inline-SVG ReactNode using `currentColor` (037c OQ-1). */
67
+ readonly icon: React.ReactNode;
68
+ /** The page component the outlet mounts for this route (takes the shared {@link PageProps}). */
69
+ readonly component: React.ComponentType<PageProps>;
70
+ /** Present iff this entry's CHILDREN come from live state (a dynamic group — PRD-039). */
71
+ readonly dynamic?: DynamicGroup;
72
+ }
73
+ /**
74
+ * The seven STATIC top-level routes in nav order (037c AC-2). Each is always present and hard-listed
75
+ * here; their content owners are the cross-referenced page PRDs:
76
+ * Dashboard (`/`) → PRD-038 (lift-and-shift today, reorganized there)
77
+ * Harnesses (`/harnesses`) → PRD-039 (may carry a dynamic per-harness group)
78
+ * Memories (`/memories`) → PRD-040
79
+ * Graph (`/graph`) → PRD-041
80
+ * Sync (`/sync`) → PRD-042
81
+ * Logs (`/logs`) → PRD-043
82
+ * Settings (`/settings`) → PRD-044
83
+ */
84
+ /** The Projects page route (PRD-059c) — exported so the first-run CTA can navigate to it (b-AC-4). */
85
+ export declare const PROJECTS_ROUTE: "/projects";
86
+ export declare const ROUTES: readonly RouteEntry[];
87
+ /** The Dashboard entry — the default every unknown path falls back to (037c AC-3 / 037b AC-4). */
88
+ export declare const DEFAULT_ROUTE: RouteEntry;
89
+ /**
90
+ * Resolve a path to its registry entry, defaulting to the Dashboard entry on no match (037c AC-3,
91
+ * feeding 037b AC-4 "unknown route → Dashboard, no blank screen"). The match is exact on the entry
92
+ * `route` — a deep sub-route (e.g. `/harnesses/claude-code` from a dynamic group) resolves to its
93
+ * top-level parent by prefix so the correct page still mounts. `routes` is injectable so a test can
94
+ * prove the plug-in seam with a throwaway entry (037c AC-6) without mutating the global list.
95
+ */
96
+ export declare function matchRoute(pathname: string, routes?: readonly RouteEntry[]): RouteEntry;