@legioncodeinc/hive 0.2.1 → 0.3.1
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.
- package/README.md +2 -2
- package/assets/brand/activeloop-full-mark-logo-on-dark.svg +209 -0
- package/assets/brand/activeloop-full-mark-logo.svg +208 -0
- package/assets/brand/divider-major.svg +1 -0
- package/assets/brand/divider-minor.svg +1 -0
- package/assets/brand/doctor-mark.svg +1 -0
- package/assets/brand/hive-mark.svg +1 -0
- package/assets/brand/hive-wordmark-black.svg +1 -0
- package/assets/brand/hive-wordmark-on-dark.svg +1 -0
- package/assets/brand/legion-logo-dark.svg +16 -0
- package/assets/brand/legion-logo-light.svg +16 -0
- package/assets/brand/nectar-mark.svg +1 -0
- package/assets/logos/fonts/Inter-Italic-VariableFont_opsz_wght.ttf +0 -0
- package/assets/logos/fonts/Inter-VariableFont_opsz_wght.ttf +0 -0
- package/assets/logos/fonts/JetBrainsMono-Bold.woff2 +0 -0
- package/assets/logos/fonts/JetBrainsMono-Medium.woff2 +0 -0
- package/assets/logos/fonts/JetBrainsMono-Regular.woff2 +0 -0
- package/assets/logos/fonts/JetBrainsMono-SemiBold.woff2 +0 -0
- package/assets/logos/honeycomb-memory-cluster.svg +17 -0
- package/assets/styles.css +11 -0
- package/assets/tokens/base.css +76 -0
- package/assets/tokens/colors.css +111 -0
- package/assets/tokens/fonts.css +32 -0
- package/assets/tokens/spacing.css +48 -0
- package/assets/tokens/typography.css +38 -0
- package/dist/daemon/dashboard/app.js +26 -25
- package/dist/daemon/dashboard/host.d.ts +7 -0
- package/dist/daemon/dashboard/host.js +16 -0
- package/dist/daemon/dashboard/host.js.map +1 -1
- package/dist/daemon/dashboard/web-assets.d.ts +2 -0
- package/dist/daemon/dashboard/web-assets.js +19 -0
- package/dist/daemon/dashboard/web-assets.js.map +1 -1
- package/dist/daemon/gate.d.ts +2 -2
- package/dist/daemon/gate.js +15 -4
- package/dist/daemon/gate.js.map +1 -1
- package/dist/daemon/installer/bin-resolver.d.ts +34 -0
- package/dist/daemon/installer/bin-resolver.js +107 -0
- package/dist/daemon/installer/bin-resolver.js.map +1 -0
- package/dist/daemon/installer/config.d.ts +63 -0
- package/dist/daemon/installer/config.js +74 -0
- package/dist/daemon/installer/config.js.map +1 -0
- package/dist/daemon/installer/detection.d.ts +20 -0
- package/dist/daemon/installer/detection.js +73 -0
- package/dist/daemon/installer/detection.js.map +1 -0
- package/dist/daemon/installer/funnel-telemetry.d.ts +54 -0
- package/dist/daemon/installer/funnel-telemetry.js +134 -0
- package/dist/daemon/installer/funnel-telemetry.js.map +1 -0
- package/dist/daemon/installer/index.d.ts +12 -0
- package/dist/daemon/installer/index.js +10 -0
- package/dist/daemon/installer/index.js.map +1 -0
- package/dist/daemon/installer/install-state.d.ts +56 -0
- package/dist/daemon/installer/install-state.js +159 -0
- package/dist/daemon/installer/install-state.js.map +1 -0
- package/dist/daemon/installer/manifest-snapshot.json +25 -0
- package/dist/daemon/installer/manifest.d.ts +47 -0
- package/dist/daemon/installer/manifest.js +103 -0
- package/dist/daemon/installer/manifest.js.map +1 -0
- package/dist/daemon/installer/products.d.ts +33 -0
- package/dist/daemon/installer/products.js +42 -0
- package/dist/daemon/installer/products.js.map +1 -0
- package/dist/daemon/installer/routes.d.ts +43 -0
- package/dist/daemon/installer/routes.js +201 -0
- package/dist/daemon/installer/routes.js.map +1 -0
- package/dist/daemon/installer/security.d.ts +33 -0
- package/dist/daemon/installer/security.js +80 -0
- package/dist/daemon/installer/security.js.map +1 -0
- package/dist/daemon/installer/spawn.d.ts +49 -0
- package/dist/daemon/installer/spawn.js +63 -0
- package/dist/daemon/installer/spawn.js.map +1 -0
- package/dist/daemon/installer/token.d.ts +23 -0
- package/dist/daemon/installer/token.js +56 -0
- package/dist/daemon/installer/token.js.map +1 -0
- package/dist/daemon/server.d.ts +6 -0
- package/dist/daemon/server.js +7 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/dashboard/web/app.js +42 -20
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/boot-route.d.ts +11 -7
- package/dist/dashboard/web/boot-route.js +12 -6
- package/dist/dashboard/web/boot-route.js.map +1 -1
- package/dist/dashboard/web/main.js +2 -1
- package/dist/dashboard/web/main.js.map +1 -1
- package/dist/dashboard/web/onboarding/advanced-picker.d.ts +16 -0
- package/dist/dashboard/web/onboarding/advanced-picker.js +59 -0
- package/dist/dashboard/web/onboarding/advanced-picker.js.map +1 -0
- package/dist/dashboard/web/onboarding/contracts.d.ts +188 -0
- package/dist/dashboard/web/onboarding/contracts.js +161 -0
- package/dist/dashboard/web/onboarding/contracts.js.map +1 -0
- package/dist/dashboard/web/onboarding/health-view.d.ts +17 -0
- package/dist/dashboard/web/onboarding/health-view.js +79 -0
- package/dist/dashboard/web/onboarding/health-view.js.map +1 -0
- package/dist/dashboard/web/onboarding/install-card.d.ts +28 -0
- package/dist/dashboard/web/onboarding/install-card.js +171 -0
- package/dist/dashboard/web/onboarding/install-card.js.map +1 -0
- package/dist/dashboard/web/onboarding/login-step.d.ts +29 -0
- package/dist/dashboard/web/onboarding/login-step.js +104 -0
- package/dist/dashboard/web/onboarding/login-step.js.map +1 -0
- package/dist/dashboard/web/onboarding/onboarding-client.d.ts +52 -0
- package/dist/dashboard/web/onboarding/onboarding-client.js +133 -0
- package/dist/dashboard/web/onboarding/onboarding-client.js.map +1 -0
- package/dist/dashboard/web/onboarding/onboarding-hero.d.ts +24 -0
- package/dist/dashboard/web/onboarding/onboarding-hero.js +70 -0
- package/dist/dashboard/web/onboarding/onboarding-hero.js.map +1 -0
- package/dist/dashboard/web/onboarding/onboarding-screen.d.ts +43 -0
- package/dist/dashboard/web/onboarding/onboarding-screen.js +193 -0
- package/dist/dashboard/web/onboarding/onboarding-screen.js.map +1 -0
- package/dist/dashboard/web/onboarding/onboarding-selection-store.d.ts +20 -0
- package/dist/dashboard/web/onboarding/onboarding-selection-store.js +76 -0
- package/dist/dashboard/web/onboarding/onboarding-selection-store.js.map +1 -0
- package/dist/dashboard/web/onboarding/product-copy.d.ts +40 -0
- package/dist/dashboard/web/onboarding/product-copy.js +70 -0
- package/dist/dashboard/web/onboarding/product-copy.js.map +1 -0
- package/dist/dashboard/web/onboarding/use-install-dwell.d.ts +27 -0
- package/dist/dashboard/web/onboarding/use-install-dwell.js +42 -0
- package/dist/dashboard/web/onboarding/use-install-dwell.js.map +1 -0
- package/dist/dashboard/web/onboarding/use-onboarding-token.d.ts +14 -0
- package/dist/dashboard/web/onboarding/use-onboarding-token.js +41 -0
- package/dist/dashboard/web/onboarding/use-onboarding-token.js.map +1 -0
- package/dist/dashboard/web/route-daemon-owner.d.ts +7 -0
- package/dist/dashboard/web/route-daemon-owner.js +15 -0
- package/dist/dashboard/web/route-daemon-owner.js.map +1 -0
- package/dist/dashboard/web/wire.d.ts +1 -1
- package/dist/shared/onboarding-types.d.ts +79 -0
- package/dist/shared/onboarding-types.js +12 -0
- package/dist/shared/onboarding-types.js.map +1 -0
- package/dist/telemetry/emit.d.ts +30 -3
- package/dist/telemetry/emit.js +25 -2
- package/dist/telemetry/emit.js.map +1 -1
- package/dist/telemetry/onboarding-session-ledger.d.ts +31 -0
- package/dist/telemetry/onboarding-session-ledger.js +78 -0
- package/dist/telemetry/onboarding-session-ledger.js.map +1 -0
- package/package.json +6 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { DaemonName } from "../../shared/daemon-routing.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve which workload daemon owns the active dashboard route's data plane. Used by the shell's
|
|
4
|
+
* per-owner connectivity gate (PRD-001c c-AC-3): only pages owned by a down daemon swap for the
|
|
5
|
+
* ConnectivityBanner; sibling routes keep rendering via their own fail-soft panels.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveRouteDaemonOwner(route: string): DaemonName;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Dashboard routes whose primary wire endpoints are owned by nectar (hive-graph proxy). */
|
|
2
|
+
const NECTAR_ROUTE_PREFIXES = ["/hive-graph"];
|
|
3
|
+
/**
|
|
4
|
+
* Resolve which workload daemon owns the active dashboard route's data plane. Used by the shell's
|
|
5
|
+
* per-owner connectivity gate (PRD-001c c-AC-3): only pages owned by a down daemon swap for the
|
|
6
|
+
* ConnectivityBanner; sibling routes keep rendering via their own fail-soft panels.
|
|
7
|
+
*/
|
|
8
|
+
export function resolveRouteDaemonOwner(route) {
|
|
9
|
+
for (const prefix of NECTAR_ROUTE_PREFIXES) {
|
|
10
|
+
if (route === prefix || route.startsWith(`${prefix}/`))
|
|
11
|
+
return "nectar";
|
|
12
|
+
}
|
|
13
|
+
return "honeycomb";
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=route-daemon-owner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-daemon-owner.js","sourceRoot":"","sources":["../../../src/dashboard/web/route-daemon-owner.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,MAAM,qBAAqB,GAAG,CAAC,aAAa,CAAU,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACpD,KAAK,MAAM,MAAM,IAAI,qBAAqB,EAAE,CAAC;QAC5C,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC;IACzE,CAAC;IACD,OAAO,WAAW,CAAC;AACpB,CAAC"}
|
|
@@ -1311,9 +1311,9 @@ export declare const SetupStateSchema: z.ZodObject<{
|
|
|
1311
1311
|
hivemind: z.ZodCatch<z.ZodBoolean>;
|
|
1312
1312
|
}, z.core.$strip>>;
|
|
1313
1313
|
phase: z.ZodCatch<z.ZodEnum<{
|
|
1314
|
+
linking: "linking";
|
|
1314
1315
|
installed: "installed";
|
|
1315
1316
|
fresh: "fresh";
|
|
1316
|
-
linking: "linking";
|
|
1317
1317
|
linked: "linked";
|
|
1318
1318
|
migrating: "migrating";
|
|
1319
1319
|
migrated: "migrated";
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-009a: the LOCKED API contract for the `/api/onboarding/*` installer surface.
|
|
3
|
+
*
|
|
4
|
+
* These types are the single shared contract between the daemon-side installer service
|
|
5
|
+
* (`src/daemon/installer/`) and the onboarding UI (`src/dashboard/web/onboarding/`, owned by
|
|
6
|
+
* PRD-009b). The UI builds against this exact shape, so any change here is a contract change.
|
|
7
|
+
*
|
|
8
|
+
* Nothing in this module reaches persistence: the installer's only durable artifact is the
|
|
9
|
+
* one-time onboarding token file, and even that is out of band from these wire types.
|
|
10
|
+
*/
|
|
11
|
+
import type { FleetStatusResponse } from "./fleet-readiness.js";
|
|
12
|
+
/** The four fleet product slugs (is-AC-3). The install allowlist is derived from this closed set. */
|
|
13
|
+
export type ProductSlug = "honeycomb" | "doctor" | "hive" | "nectar";
|
|
14
|
+
/**
|
|
15
|
+
* The three installable-via-portal products. `hive` is intentionally excluded: it is the daemon
|
|
16
|
+
* serving this very endpoint, so it is never a portal install target (a request for it is a 400).
|
|
17
|
+
*/
|
|
18
|
+
export type InstallableProduct = "doctor" | "honeycomb" | "nectar";
|
|
19
|
+
/** The closed set of install stages streamed over SSE (is-AC-11). Never a percentage (is-AC-12). */
|
|
20
|
+
export type InstallStage = "resolving" | "downloading" | "linking" | "registering_service" | "completed" | "failed";
|
|
21
|
+
/** The closed detection state set for a product (is-AC-2). */
|
|
22
|
+
export type ProductDetectionState = "not_installed" | "installed" | "install_in_progress" | "install_failed";
|
|
23
|
+
/** A bounded, truthful failure record: the stage it failed at plus a summary (is-AC-17). */
|
|
24
|
+
export interface InstallError {
|
|
25
|
+
readonly stage: InstallStage;
|
|
26
|
+
readonly summary: string;
|
|
27
|
+
}
|
|
28
|
+
/** One product's detection result: its state, the installed version when known, and any last error. */
|
|
29
|
+
export interface ProductDetection {
|
|
30
|
+
readonly state: ProductDetectionState;
|
|
31
|
+
readonly version?: string;
|
|
32
|
+
readonly error?: InstallError;
|
|
33
|
+
}
|
|
34
|
+
/** `GET /api/onboarding/detect` -> the per-product detection map (is-AC-1/2). */
|
|
35
|
+
export interface DetectResponse {
|
|
36
|
+
readonly products: Record<ProductSlug, ProductDetection>;
|
|
37
|
+
}
|
|
38
|
+
/** `POST /api/onboarding/install` body. Only the product slug crosses the wire (is-AC-4). */
|
|
39
|
+
export interface InstallRequest {
|
|
40
|
+
readonly product: InstallableProduct;
|
|
41
|
+
}
|
|
42
|
+
/** `POST /api/onboarding/install` -> 202 when an install was started (or attached to). */
|
|
43
|
+
export interface InstallAcceptedResponse {
|
|
44
|
+
readonly product: InstallableProduct;
|
|
45
|
+
readonly state: "install_in_progress";
|
|
46
|
+
}
|
|
47
|
+
/** `POST /api/onboarding/install` -> 200 short-circuit when already installed at the pinned version (is-AC-15). */
|
|
48
|
+
export interface InstallShortCircuitResponse {
|
|
49
|
+
readonly product: InstallableProduct;
|
|
50
|
+
readonly state: "installed";
|
|
51
|
+
}
|
|
52
|
+
export type InstallResponse = InstallAcceptedResponse | InstallShortCircuitResponse;
|
|
53
|
+
/**
|
|
54
|
+
* `POST /api/onboarding/install` -> 409 refusal (is-AC-5). `unpublished`: the manifest marks the
|
|
55
|
+
* product `published:false`. `manifest_unresolved`: neither the network manifest nor the bundled
|
|
56
|
+
* snapshot yields a shape-valid `packageName@version`. Never a fall-through to `@latest`.
|
|
57
|
+
*/
|
|
58
|
+
export interface InstallRefusalResponse {
|
|
59
|
+
readonly error: "unpublished" | "manifest_unresolved";
|
|
60
|
+
}
|
|
61
|
+
/** One SSE progress frame (is-AC-11). `detail` is an optional bounded human string, never a percent. */
|
|
62
|
+
export interface ProgressEvent {
|
|
63
|
+
readonly stage: InstallStage;
|
|
64
|
+
readonly detail?: string;
|
|
65
|
+
}
|
|
66
|
+
/** `GET /api/onboarding/health` -> the fleet readiness projection reused from fleet-status (is-AC-18). */
|
|
67
|
+
export interface HealthResponse {
|
|
68
|
+
readonly ready: boolean;
|
|
69
|
+
readonly status: FleetStatusResponse;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* `POST /api/onboarding/event` body: a funnel event name plus optional flat string properties.
|
|
73
|
+
* The daemon validates the token and records the call; wiring it to telemetry emission is Wave 2
|
|
74
|
+
* (PRD-009c), so nothing is emitted here yet.
|
|
75
|
+
*/
|
|
76
|
+
export interface OnboardingEventRequest {
|
|
77
|
+
readonly event: string;
|
|
78
|
+
readonly properties?: Record<string, string>;
|
|
79
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-009a: the LOCKED API contract for the `/api/onboarding/*` installer surface.
|
|
3
|
+
*
|
|
4
|
+
* These types are the single shared contract between the daemon-side installer service
|
|
5
|
+
* (`src/daemon/installer/`) and the onboarding UI (`src/dashboard/web/onboarding/`, owned by
|
|
6
|
+
* PRD-009b). The UI builds against this exact shape, so any change here is a contract change.
|
|
7
|
+
*
|
|
8
|
+
* Nothing in this module reaches persistence: the installer's only durable artifact is the
|
|
9
|
+
* one-time onboarding token file, and even that is out of band from these wire types.
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=onboarding-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-types.js","sourceRoot":"","sources":["../../src/shared/onboarding-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
package/dist/telemetry/emit.d.ts
CHANGED
|
@@ -74,17 +74,44 @@ export declare const LEDGER_FILENAME: "telemetry.json";
|
|
|
74
74
|
* path at all, so nothing else can egress.
|
|
75
75
|
*/
|
|
76
76
|
export declare const ALLOWED_PROPERTY_KEYS: readonly ["package", "version", "os", "arch", "node"];
|
|
77
|
+
/** Funnel-only property keys extending the lifecycle allow-list (PRD-009c tm-AC-4). */
|
|
78
|
+
export declare const FUNNEL_PROPERTY_KEYS: readonly ["mode", "product", "failure_stage"];
|
|
77
79
|
/** One allow-listed property key. */
|
|
78
80
|
export type AllowedPropertyKey = (typeof ALLOWED_PROPERTY_KEYS)[number];
|
|
81
|
+
/** One funnel-specific property key. */
|
|
82
|
+
export type FunnelPropertyKey = (typeof FUNNEL_PROPERTY_KEYS)[number];
|
|
79
83
|
/** The allow-listed property bag: the EXACT shape that may leave the machine. */
|
|
80
84
|
export type AllowedProperties = Record<AllowedPropertyKey, string>;
|
|
85
|
+
/** The full telemetry property bag: lifecycle keys plus optional closed funnel keys. */
|
|
86
|
+
export type TelemetryProperties = AllowedProperties & Partial<Record<FunnelPropertyKey, string>>;
|
|
81
87
|
/**
|
|
82
88
|
* Assemble the allow-listed payload: the package name, the build version, and coarse platform facts
|
|
83
89
|
* (OS family, CPU arch, node version). Never a hostname, a path, or any machine-identifying string.
|
|
84
90
|
*/
|
|
85
91
|
export declare function buildAllowedProperties(version: string): AllowedProperties;
|
|
86
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* Merge validated funnel extras into the base allow-listed payload. Unknown keys are dropped; invalid
|
|
94
|
+
* enum values are dropped. Lifecycle events pass no extras.
|
|
95
|
+
*/
|
|
96
|
+
export declare function buildTelemetryProperties(version: string, extras?: FunnelExtras): TelemetryProperties;
|
|
97
|
+
/** The four hive lifecycle events. */
|
|
87
98
|
export type HiveTelemetryEvent = "hive_installed" | "hive_uninstalled" | "hive_first_run" | "hive_updated";
|
|
99
|
+
/** Onboarding funnel events (PRD-009c). Emitted daemon-side through this same chokepoint. */
|
|
100
|
+
export type OnboardingFunnelEvent = "onboarding_started" | "mode_selected" | "login_shown" | "dashboard_reached" | "product_install_started" | "product_install_completed" | "product_install_failed" | "health_check_passed" | "login_completed";
|
|
101
|
+
/** The closed event vocabulary that may egress through {@link emitTelemetry}. */
|
|
102
|
+
export type TelemetryEvent = HiveTelemetryEvent | OnboardingFunnelEvent;
|
|
103
|
+
/** Closed funnel `mode` values (tm-AC-4). */
|
|
104
|
+
export type FunnelMode = "standard" | "advanced";
|
|
105
|
+
/** Closed funnel product slugs for install events (tm-AC-4). */
|
|
106
|
+
export type FunnelProduct = "doctor" | "honeycomb" | "nectar";
|
|
107
|
+
/** Closed failure-stage discriminators on `product_install_failed` (tm-AC-4). */
|
|
108
|
+
export type FunnelFailureStage = "resolving" | "downloading" | "linking" | "registering_service";
|
|
109
|
+
/** Optional funnel extras validated before they join the allow-listed payload. */
|
|
110
|
+
export interface FunnelExtras {
|
|
111
|
+
readonly mode?: FunnelMode;
|
|
112
|
+
readonly product?: FunnelProduct;
|
|
113
|
+
readonly failure_stage?: FunnelFailureStage;
|
|
114
|
+
}
|
|
88
115
|
/**
|
|
89
116
|
* The dedupe ledger persisted at `${stateDir}/telemetry.json`. `reported` maps a dedupe key (an event
|
|
90
117
|
* name, or `event@version` for `hive_updated`) to the ISO timestamp it was sent. `lastSeenVersion`
|
|
@@ -156,7 +183,7 @@ export interface EmitOutcome {
|
|
|
156
183
|
/** When `sent` is false, why. Absent when `sent` is true. */
|
|
157
184
|
readonly skipped?: EmitSkipReason;
|
|
158
185
|
/** The allow-listed payload that was built (present whether or not it was sent). */
|
|
159
|
-
readonly properties:
|
|
186
|
+
readonly properties: TelemetryProperties;
|
|
160
187
|
}
|
|
161
188
|
/** The per-emit options. */
|
|
162
189
|
export interface EmitOptions {
|
|
@@ -173,7 +200,7 @@ export interface EmitOptions {
|
|
|
173
200
|
* 2xx the dedupe key (when supplied) is recorded in the ledger. NEVER throws and NEVER changes a CLI
|
|
174
201
|
* verb's exit code: it resolves an {@link EmitOutcome} the caller may inspect or ignore.
|
|
175
202
|
*/
|
|
176
|
-
export declare function emitTelemetry(event:
|
|
203
|
+
export declare function emitTelemetry(event: TelemetryEvent, opts?: EmitOptions, deps?: EmitDeps, extras?: FunnelExtras): Promise<EmitOutcome>;
|
|
177
204
|
/** Emit `hive_installed` after a successful `install-service`. Deduped once per machine. */
|
|
178
205
|
export declare function emitInstalled(deps?: EmitDeps): Promise<EmitOutcome>;
|
|
179
206
|
/**
|
package/dist/telemetry/emit.js
CHANGED
|
@@ -22,6 +22,7 @@ const SHARED_INSTALL_ID_PATH = join(HONEYCOMB_HOME_DIR, "install-id");
|
|
|
22
22
|
const INSTALL_ID_FILENAME = "install-id";
|
|
23
23
|
const LEDGER_FILENAME = "telemetry.json";
|
|
24
24
|
const ALLOWED_PROPERTY_KEYS = ["package", "version", "os", "arch", "node"];
|
|
25
|
+
const FUNNEL_PROPERTY_KEYS = ["mode", "product", "failure_stage"];
|
|
25
26
|
function buildAllowedProperties(version) {
|
|
26
27
|
return {
|
|
27
28
|
package: "hive",
|
|
@@ -31,6 +32,26 @@ function buildAllowedProperties(version) {
|
|
|
31
32
|
node: process.version
|
|
32
33
|
};
|
|
33
34
|
}
|
|
35
|
+
function buildTelemetryProperties(version, extras = {}) {
|
|
36
|
+
const base = buildAllowedProperties(version);
|
|
37
|
+
const out = { ...base };
|
|
38
|
+
if (extras.mode !== void 0 && FUNNEL_MODES.has(extras.mode))
|
|
39
|
+
out.mode = extras.mode;
|
|
40
|
+
if (extras.product !== void 0 && FUNNEL_PRODUCTS.has(extras.product))
|
|
41
|
+
out.product = extras.product;
|
|
42
|
+
if (extras.failure_stage !== void 0 && FUNNEL_FAILURE_STAGES.has(extras.failure_stage)) {
|
|
43
|
+
out.failure_stage = extras.failure_stage;
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
const FUNNEL_MODES = /* @__PURE__ */ new Set(["standard", "advanced"]);
|
|
48
|
+
const FUNNEL_PRODUCTS = /* @__PURE__ */ new Set(["doctor", "honeycomb", "nectar"]);
|
|
49
|
+
const FUNNEL_FAILURE_STAGES = /* @__PURE__ */ new Set([
|
|
50
|
+
"resolving",
|
|
51
|
+
"downloading",
|
|
52
|
+
"linking",
|
|
53
|
+
"registering_service"
|
|
54
|
+
]);
|
|
34
55
|
function emptyLedger() {
|
|
35
56
|
return { reported: {} };
|
|
36
57
|
}
|
|
@@ -84,11 +105,11 @@ function resolveDistinctId(deps = {}) {
|
|
|
84
105
|
return generated;
|
|
85
106
|
}
|
|
86
107
|
const DEFAULT_EMIT_TIMEOUT_MS = 2e3;
|
|
87
|
-
async function emitTelemetry(event, opts = {}, deps = {}) {
|
|
108
|
+
async function emitTelemetry(event, opts = {}, deps = {}, extras = {}) {
|
|
88
109
|
const env = deps.env ?? process.env;
|
|
89
110
|
const key = deps.posthogKey ?? POSTHOG_KEY;
|
|
90
111
|
const version = deps.version ?? HIVE_VERSION;
|
|
91
|
-
const properties =
|
|
112
|
+
const properties = buildTelemetryProperties(version, extras);
|
|
92
113
|
if (key.length === 0)
|
|
93
114
|
return { sent: false, skipped: "disabled", properties };
|
|
94
115
|
if (isOptedOut(env))
|
|
@@ -176,6 +197,7 @@ export {
|
|
|
176
197
|
DEFAULT_EMIT_TIMEOUT_MS,
|
|
177
198
|
ENV_DO_NOT_TRACK,
|
|
178
199
|
ENV_TELEMETRY,
|
|
200
|
+
FUNNEL_PROPERTY_KEYS,
|
|
179
201
|
HIVE_STATE_DIR,
|
|
180
202
|
INSTALL_ID_FILENAME,
|
|
181
203
|
LEDGER_FILENAME,
|
|
@@ -184,6 +206,7 @@ export {
|
|
|
184
206
|
POSTHOG_KEY,
|
|
185
207
|
SHARED_INSTALL_ID_PATH,
|
|
186
208
|
buildAllowedProperties,
|
|
209
|
+
buildTelemetryProperties,
|
|
187
210
|
captureUrl,
|
|
188
211
|
emitInstalled,
|
|
189
212
|
emitTelemetry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/telemetry/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE1E,+EAA+E;AAC/E,gFAAgF;AAChF,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAW,OAAO,yBAAyB,KAAK,QAAQ,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;AAElH;;;;GAIG;AACH,MAAM,CAAC,MAAM,YAAY,GACvB,OAAO,0BAA0B,KAAK,QAAQ,IAAI,0BAA0B,CAAC,MAAM,GAAG,CAAC;IACrF,CAAC,CAAC,0BAA0B;IAC5B,CAAC,CAAC,0BAA0B,CAAC;AAEjC,gGAAgG;AAChG,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAmB,CAAC;AAExD,8FAA8F;AAC9F,MAAM,UAAU,UAAU,CAAC,OAAe,YAAY;IACpD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,oBAAoB,EAAE,CAAC;AAC9D,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,0FAA0F;AAC1F,MAAM,CAAC,MAAM,aAAa,GAAG,qBAA8B,CAAC;AAC5D,iGAAiG;AACjG,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAuB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAClC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC;AACxD,CAAC;AAED,+EAA+E;AAC/E,4EAA4E;AAC5E,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE/D;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;AAE7E,iFAAiF;AACjF,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC;AAEzD,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAyB,CAAC;AAEzD,+EAA+E;AAC/E,kCAAkC;AAClC,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/telemetry/emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-009c tm-AC-2: per-onboarding-session dedupe ledger.
|
|
3
|
+
*
|
|
4
|
+
* Once-per-session funnel milestones (`onboarding_started`, `health_check_passed`,
|
|
5
|
+
* `login_completed`, `dashboard_reached`) are recorded here, keyed by a SHA-256 digest of the
|
|
6
|
+
* one-time onboarding token. The token itself is never written to disk or emitted; only the digest
|
|
7
|
+
* scopes dedupe within a session.
|
|
8
|
+
*/
|
|
9
|
+
/** Filename of the session-scoped funnel dedupe ledger under {@link HIVE_STATE_DIR}. */
|
|
10
|
+
export declare const ONBOARDING_LEDGER_FILENAME: "onboarding-telemetry.json";
|
|
11
|
+
/** Events that emit at most once per onboarding session (tm-AC-2). */
|
|
12
|
+
export declare const SESSION_ONCE_EVENTS: readonly ["onboarding_started", "health_check_passed", "login_completed", "dashboard_reached"];
|
|
13
|
+
export type SessionOnceEvent = (typeof SESSION_ONCE_EVENTS)[number];
|
|
14
|
+
export interface OnboardingSessionLedger {
|
|
15
|
+
readonly sessions: Record<string, {
|
|
16
|
+
readonly reported: Record<string, string>;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
/** Derive a session key from the raw token without persisting or logging the token (tm-AC-5). */
|
|
20
|
+
export declare function sessionKeyFromToken(token: string): string;
|
|
21
|
+
/** Load the onboarding session ledger. Any IO or parse problem yields an empty ledger (fail-soft). */
|
|
22
|
+
export declare function loadOnboardingLedger(stateDir: string): OnboardingSessionLedger;
|
|
23
|
+
/** True when `event` was already reported for this session digest. */
|
|
24
|
+
export declare function isSessionEventReported(ledger: OnboardingSessionLedger, sessionKey: string, event: SessionOnceEvent): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Record a session-scoped dedupe mark after a successful send. Reloads before write so concurrent
|
|
27
|
+
* marks are not clobbered. Throws on IO failure; callers wrap in fail-soft try/catch.
|
|
28
|
+
*/
|
|
29
|
+
export declare function markSessionEventReported(stateDir: string, sessionKey: string, event: SessionOnceEvent, clock: () => string): void;
|
|
30
|
+
/** Default state dir when tests do not inject one. */
|
|
31
|
+
export declare const DEFAULT_ONBOARDING_LEDGER_DIR: string;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD-009c tm-AC-2: per-onboarding-session dedupe ledger.
|
|
3
|
+
*
|
|
4
|
+
* Once-per-session funnel milestones (`onboarding_started`, `health_check_passed`,
|
|
5
|
+
* `login_completed`, `dashboard_reached`) are recorded here, keyed by a SHA-256 digest of the
|
|
6
|
+
* one-time onboarding token. The token itself is never written to disk or emitted; only the digest
|
|
7
|
+
* scopes dedupe within a session.
|
|
8
|
+
*/
|
|
9
|
+
import { createHash } from "node:crypto";
|
|
10
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { HIVE_STATE_DIR } from "./emit.js";
|
|
13
|
+
/** Filename of the session-scoped funnel dedupe ledger under {@link HIVE_STATE_DIR}. */
|
|
14
|
+
export const ONBOARDING_LEDGER_FILENAME = "onboarding-telemetry.json";
|
|
15
|
+
/** Events that emit at most once per onboarding session (tm-AC-2). */
|
|
16
|
+
export const SESSION_ONCE_EVENTS = [
|
|
17
|
+
"onboarding_started",
|
|
18
|
+
"health_check_passed",
|
|
19
|
+
"login_completed",
|
|
20
|
+
"dashboard_reached"
|
|
21
|
+
];
|
|
22
|
+
function emptyLedger() {
|
|
23
|
+
return { sessions: {} };
|
|
24
|
+
}
|
|
25
|
+
/** Derive a session key from the raw token without persisting or logging the token (tm-AC-5). */
|
|
26
|
+
export function sessionKeyFromToken(token) {
|
|
27
|
+
return createHash("sha256").update(token, "utf8").digest("hex");
|
|
28
|
+
}
|
|
29
|
+
/** Load the onboarding session ledger. Any IO or parse problem yields an empty ledger (fail-soft). */
|
|
30
|
+
export function loadOnboardingLedger(stateDir) {
|
|
31
|
+
try {
|
|
32
|
+
const raw = JSON.parse(readFileSync(join(stateDir, ONBOARDING_LEDGER_FILENAME), "utf8"));
|
|
33
|
+
if (typeof raw !== "object" || raw === null)
|
|
34
|
+
return emptyLedger();
|
|
35
|
+
const record = raw;
|
|
36
|
+
const sessions = {};
|
|
37
|
+
if (typeof record["sessions"] === "object" && record["sessions"] !== null) {
|
|
38
|
+
for (const [sessionKey, bucket] of Object.entries(record["sessions"])) {
|
|
39
|
+
if (typeof bucket !== "object" || bucket === null)
|
|
40
|
+
continue;
|
|
41
|
+
const reported = {};
|
|
42
|
+
const reportedRaw = bucket["reported"];
|
|
43
|
+
if (typeof reportedRaw === "object" && reportedRaw !== null) {
|
|
44
|
+
for (const [eventKey, ts] of Object.entries(reportedRaw)) {
|
|
45
|
+
if (typeof ts === "string")
|
|
46
|
+
reported[eventKey] = ts;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
sessions[sessionKey] = { reported };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return { sessions };
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return emptyLedger();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** True when `event` was already reported for this session digest. */
|
|
59
|
+
export function isSessionEventReported(ledger, sessionKey, event) {
|
|
60
|
+
return ledger.sessions[sessionKey]?.reported[event] !== undefined;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Record a session-scoped dedupe mark after a successful send. Reloads before write so concurrent
|
|
64
|
+
* marks are not clobbered. Throws on IO failure; callers wrap in fail-soft try/catch.
|
|
65
|
+
*/
|
|
66
|
+
export function markSessionEventReported(stateDir, sessionKey, event, clock) {
|
|
67
|
+
mkdirSync(stateDir, { recursive: true, mode: 0o700 });
|
|
68
|
+
const fresh = loadOnboardingLedger(stateDir);
|
|
69
|
+
const prior = fresh.sessions[sessionKey]?.reported ?? {};
|
|
70
|
+
const sessions = {
|
|
71
|
+
...fresh.sessions,
|
|
72
|
+
[sessionKey]: { reported: { ...prior, [event]: clock() } }
|
|
73
|
+
};
|
|
74
|
+
writeFileSync(join(stateDir, ONBOARDING_LEDGER_FILENAME), `${JSON.stringify({ sessions }, null, 2)}\n`, "utf8");
|
|
75
|
+
}
|
|
76
|
+
/** Default state dir when tests do not inject one. */
|
|
77
|
+
export const DEFAULT_ONBOARDING_LEDGER_DIR = HIVE_STATE_DIR;
|
|
78
|
+
//# sourceMappingURL=onboarding-session-ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboarding-session-ledger.js","sourceRoot":"","sources":["../../src/telemetry/onboarding-session-ledger.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@legioncodeinc/hive",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Hive portal daemon",
|
|
5
5
|
"license": "AGPL-3.0-or-later",
|
|
6
6
|
"type": "module",
|
|
@@ -21,7 +21,11 @@
|
|
|
21
21
|
"hive": "dist/cli.js"
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
|
-
"dist"
|
|
24
|
+
"dist",
|
|
25
|
+
"assets/styles.css",
|
|
26
|
+
"assets/tokens",
|
|
27
|
+
"assets/logos",
|
|
28
|
+
"assets/brand"
|
|
25
29
|
],
|
|
26
30
|
"scripts": {
|
|
27
31
|
"build": "tsc && node esbuild.config.mjs",
|