@legioncodeinc/hive 0.3.1 → 0.5.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.
- package/README.md +1 -1
- package/dist/daemon/dashboard/app.js +11 -11
- package/dist/daemon/gate.d.ts +10 -6
- package/dist/daemon/gate.js +20 -8
- package/dist/daemon/gate.js.map +1 -1
- package/dist/daemon/installer/config.d.ts +2 -0
- package/dist/daemon/installer/config.js +5 -3
- package/dist/daemon/installer/config.js.map +1 -1
- package/dist/daemon/installer/funnel-telemetry.d.ts +17 -2
- package/dist/daemon/installer/funnel-telemetry.js +34 -3
- package/dist/daemon/installer/funnel-telemetry.js.map +1 -1
- package/dist/daemon/installer/routes.js +6 -2
- package/dist/daemon/installer/routes.js.map +1 -1
- package/dist/daemon/installer/security.d.ts +9 -2
- package/dist/daemon/installer/security.js +8 -0
- package/dist/daemon/installer/security.js.map +1 -1
- package/dist/daemon/installer/token.d.ts +8 -7
- package/dist/daemon/installer/token.js +40 -18
- package/dist/daemon/installer/token.js.map +1 -1
- package/dist/daemon/registry.d.ts +6 -0
- package/dist/daemon/registry.js +15 -17
- package/dist/daemon/registry.js.map +1 -1
- package/dist/daemon/server.d.ts +14 -0
- package/dist/daemon/server.js +19 -0
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/setup-tenancy.d.ts +18 -0
- package/dist/daemon/setup-tenancy.js +37 -0
- package/dist/daemon/setup-tenancy.js.map +1 -0
- package/dist/dashboard/web/active-tenancy-display.d.ts +34 -0
- package/dist/dashboard/web/active-tenancy-display.js +84 -0
- package/dist/dashboard/web/active-tenancy-display.js.map +1 -0
- package/dist/dashboard/web/app.js +6 -2
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/onboarding/contracts.d.ts +1 -1
- package/dist/dashboard/web/onboarding/contracts.js +9 -1
- package/dist/dashboard/web/onboarding/contracts.js.map +1 -1
- package/dist/dashboard/web/onboarding/login-step.d.ts +3 -4
- package/dist/dashboard/web/onboarding/login-step.js +12 -18
- package/dist/dashboard/web/onboarding/login-step.js.map +1 -1
- package/dist/dashboard/web/onboarding/onboarding-screen.d.ts +8 -4
- package/dist/dashboard/web/onboarding/onboarding-screen.js +90 -13
- package/dist/dashboard/web/onboarding/onboarding-screen.js.map +1 -1
- package/dist/dashboard/web/onboarding/tenancy-client.d.ts +19 -0
- package/dist/dashboard/web/onboarding/tenancy-client.js +84 -0
- package/dist/dashboard/web/onboarding/tenancy-client.js.map +1 -0
- package/dist/dashboard/web/onboarding/tenancy-contracts.d.ts +119 -0
- package/dist/dashboard/web/onboarding/tenancy-contracts.js +79 -0
- package/dist/dashboard/web/onboarding/tenancy-contracts.js.map +1 -0
- package/dist/dashboard/web/onboarding/tenancy-step.d.ts +32 -0
- package/dist/dashboard/web/onboarding/tenancy-step.js +223 -0
- package/dist/dashboard/web/onboarding/tenancy-step.js.map +1 -0
- package/dist/dashboard/web/pages/hive-graph.js +138 -43
- package/dist/dashboard/web/pages/hive-graph.js.map +1 -1
- package/dist/dashboard/web/wire.d.ts +111 -14
- package/dist/dashboard/web/wire.js +105 -0
- package/dist/dashboard/web/wire.js.map +1 -1
- package/dist/install/registry.d.ts +2 -2
- package/dist/install/registry.js +14 -7
- package/dist/install/registry.js.map +1 -1
- package/dist/lock.d.ts +5 -2
- package/dist/lock.js +36 -1
- package/dist/lock.js.map +1 -1
- package/dist/service/index.d.ts +5 -0
- package/dist/service/index.js +9 -1
- package/dist/service/index.js.map +1 -1
- package/dist/service/templates.d.ts +22 -3
- package/dist/service/templates.js +47 -10
- package/dist/service/templates.js.map +1 -1
- package/dist/shared/apiary-root.d.ts +28 -0
- package/dist/shared/apiary-root.js +71 -0
- package/dist/shared/apiary-root.js.map +1 -0
- package/dist/shared/constants.d.ts +0 -1
- package/dist/shared/constants.js +3 -5
- package/dist/shared/constants.js.map +1 -1
- package/dist/shared/legacy-paths.d.ts +22 -0
- package/dist/shared/legacy-paths.js +48 -0
- package/dist/shared/legacy-paths.js.map +1 -0
- package/dist/shared/registry-paths.d.ts +19 -0
- package/dist/shared/registry-paths.js +52 -0
- package/dist/shared/registry-paths.js.map +1 -0
- package/dist/shared/state-migration.d.ts +13 -0
- package/dist/shared/state-migration.js +92 -0
- package/dist/shared/state-migration.js.map +1 -0
- package/dist/telemetry/emit.d.ts +27 -14
- package/dist/telemetry/emit.js +20 -4
- package/dist/telemetry/emit.js.map +1 -1
- package/package.json +1 -1
package/dist/daemon/gate.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The server-side PORTAL LANDING GATE — PRD-003a, implementing ADR-0004's precedence.
|
|
3
3
|
*
|
|
4
|
-
* On landing on ANY non-exempt route hive evaluates ONE ordered precedence, health then auth
|
|
5
|
-
* before deciding what to serve:
|
|
4
|
+
* On landing on ANY non-exempt route hive evaluates ONE ordered precedence, health then auth then
|
|
5
|
+
* tenancy, before deciding what to serve:
|
|
6
6
|
*
|
|
7
7
|
* 1. Fleet not healthy (per the EXISTING `isFleetReady()` projection, `fleet-status.ts`) →
|
|
8
8
|
* redirect to `/buzzing` (g-AC-3). Checked FIRST: an unhealthy fleet makes every other screen
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* 2. Else not logged in (the EXISTING proxied honeycomb `/setup/state` `authenticated` bit,
|
|
11
11
|
* `setup-auth.ts`) → redirect to `/login` (g-AC-4). A fetch failure/timeout reads as "not
|
|
12
12
|
* logged in" (l-AC-6) — never a fail-soft into the dashboard.
|
|
13
|
-
* 3. Else
|
|
13
|
+
* 3. Else tenancy unconfirmed (`GET /setup/tenancy` `selected` bit, `setup-tenancy.ts`) →
|
|
14
|
+
* redirect to `/onboarding` (PRD-011c tg-AC-1). Fails closed to unconfirmed on any read fault.
|
|
15
|
+
* 4. Else serve the requested route as-is (g-AC-5 / g-AC-6): `next()` falls through to the
|
|
14
16
|
* more specific route/catch-all registered after this middleware in `server.ts`.
|
|
15
17
|
*
|
|
16
18
|
* `/buzzing` and `/login` are a FIXED exemption set checked BEFORE the precedence above, so they
|
|
@@ -26,13 +28,13 @@
|
|
|
26
28
|
* same-origin", both depend on the proxy handling its own requests untouched).
|
|
27
29
|
*
|
|
28
30
|
* SECURITY (g-AC-11, open-redirect defense): every redirect this middleware issues targets a
|
|
29
|
-
* FIXED, hard-coded literal (`/buzzing
|
|
30
|
-
* `?next=`, no `Referer`, no request path echoed back).
|
|
31
|
-
* impossible here: there is no code path where an attacker-controlled string reaches `c.redirect`.
|
|
31
|
+
* FIXED, hard-coded literal (`/buzzing`, `/login`, or `/onboarding`), never a value derived from
|
|
32
|
+
* user input (no `?next=`, no `Referer`, no request path echoed back).
|
|
32
33
|
*/
|
|
33
34
|
import type { MiddlewareHandler } from "hono";
|
|
34
35
|
import { type FetchImpl as FleetFetchImpl } from "./fleet-status.js";
|
|
35
36
|
import { type SetupAuthFetchImpl } from "./setup-auth.js";
|
|
37
|
+
import { type SetupTenancyFetchImpl } from "./setup-tenancy.js";
|
|
36
38
|
/** The gate-exempt SCREENS (g-AC-7 / g-AC-8): always served directly, never redirected. */
|
|
37
39
|
export declare const GATE_EXEMPT_ROUTES: readonly ["/buzzing", "/login", "/onboarding"];
|
|
38
40
|
export interface CreatePortalGateOptions {
|
|
@@ -42,6 +44,8 @@ export interface CreatePortalGateOptions {
|
|
|
42
44
|
readonly doctorStatusUrl?: string;
|
|
43
45
|
/** The fetch used for the auth check (defaults to the global `fetch`; a test injects a fake). */
|
|
44
46
|
readonly setupAuthFetch?: SetupAuthFetchImpl;
|
|
47
|
+
/** The fetch used for the tenancy check (defaults to the global `fetch`; a test injects a fake). */
|
|
48
|
+
readonly setupTenancyFetch?: SetupTenancyFetchImpl;
|
|
45
49
|
/** Override the doctor registry file path the auth check resolves honeycomb's base from. */
|
|
46
50
|
readonly registryPath?: string;
|
|
47
51
|
}
|
package/dist/daemon/gate.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The server-side PORTAL LANDING GATE — PRD-003a, implementing ADR-0004's precedence.
|
|
3
3
|
*
|
|
4
|
-
* On landing on ANY non-exempt route hive evaluates ONE ordered precedence, health then auth
|
|
5
|
-
* before deciding what to serve:
|
|
4
|
+
* On landing on ANY non-exempt route hive evaluates ONE ordered precedence, health then auth then
|
|
5
|
+
* tenancy, before deciding what to serve:
|
|
6
6
|
*
|
|
7
7
|
* 1. Fleet not healthy (per the EXISTING `isFleetReady()` projection, `fleet-status.ts`) →
|
|
8
8
|
* redirect to `/buzzing` (g-AC-3). Checked FIRST: an unhealthy fleet makes every other screen
|
|
@@ -10,7 +10,9 @@
|
|
|
10
10
|
* 2. Else not logged in (the EXISTING proxied honeycomb `/setup/state` `authenticated` bit,
|
|
11
11
|
* `setup-auth.ts`) → redirect to `/login` (g-AC-4). A fetch failure/timeout reads as "not
|
|
12
12
|
* logged in" (l-AC-6) — never a fail-soft into the dashboard.
|
|
13
|
-
* 3. Else
|
|
13
|
+
* 3. Else tenancy unconfirmed (`GET /setup/tenancy` `selected` bit, `setup-tenancy.ts`) →
|
|
14
|
+
* redirect to `/onboarding` (PRD-011c tg-AC-1). Fails closed to unconfirmed on any read fault.
|
|
15
|
+
* 4. Else serve the requested route as-is (g-AC-5 / g-AC-6): `next()` falls through to the
|
|
14
16
|
* more specific route/catch-all registered after this middleware in `server.ts`.
|
|
15
17
|
*
|
|
16
18
|
* `/buzzing` and `/login` are a FIXED exemption set checked BEFORE the precedence above, so they
|
|
@@ -26,14 +28,14 @@
|
|
|
26
28
|
* same-origin", both depend on the proxy handling its own requests untouched).
|
|
27
29
|
*
|
|
28
30
|
* SECURITY (g-AC-11, open-redirect defense): every redirect this middleware issues targets a
|
|
29
|
-
* FIXED, hard-coded literal (`/buzzing
|
|
30
|
-
* `?next=`, no `Referer`, no request path echoed back).
|
|
31
|
-
* impossible here: there is no code path where an attacker-controlled string reaches `c.redirect`.
|
|
31
|
+
* FIXED, hard-coded literal (`/buzzing`, `/login`, or `/onboarding`), never a value derived from
|
|
32
|
+
* user input (no `?next=`, no `Referer`, no request path echoed back).
|
|
32
33
|
*/
|
|
33
34
|
import { DOCTOR_STATUS_URL } from "../shared/constants.js";
|
|
34
35
|
import { isFleetReady } from "../shared/fleet-readiness.js";
|
|
35
36
|
import { fetchFleetStatus } from "./fleet-status.js";
|
|
36
37
|
import { fetchSetupAuthenticated } from "./setup-auth.js";
|
|
38
|
+
import { fetchTenancySelected } from "./setup-tenancy.js";
|
|
37
39
|
/** The fixed redirect target for an unhealthy fleet (g-AC-3). A hard-coded literal, never derived. */
|
|
38
40
|
const BUZZING_ROUTE = "/buzzing";
|
|
39
41
|
/** The fixed redirect target for a logged-out operator (g-AC-4). A hard-coded literal, never derived. */
|
|
@@ -99,6 +101,7 @@ export function createPortalGate(options = {}) {
|
|
|
99
101
|
const fleetStatusFetch = options.fleetStatusFetch ?? fetch;
|
|
100
102
|
const doctorStatusUrl = options.doctorStatusUrl ?? DOCTOR_STATUS_URL;
|
|
101
103
|
const setupAuthFetch = options.setupAuthFetch ?? fetch;
|
|
104
|
+
const setupTenancyFetch = options.setupTenancyFetch ?? fetch;
|
|
102
105
|
const registryPath = options.registryPath;
|
|
103
106
|
return async (c, next) => {
|
|
104
107
|
const pathname = new URL(c.req.url).pathname;
|
|
@@ -130,8 +133,17 @@ export function createPortalGate(options = {}) {
|
|
|
130
133
|
if (!authenticated) {
|
|
131
134
|
return c.redirect(LOGIN_ROUTE, 302);
|
|
132
135
|
}
|
|
133
|
-
//
|
|
134
|
-
//
|
|
136
|
+
// PRD-011c tg-AC-1: tenancy third. Unconfirmed (or any read fault) → `/onboarding` to resume
|
|
137
|
+
// the tenancy step; never serve the dashboard while `selected` is false.
|
|
138
|
+
// tg-AC-6 (separate-fetch justification): this is deliberately a SECOND loopback fetch rather
|
|
139
|
+
// than a coalesced read, because honeycomb does not surface `selected` on `/setup/state`;
|
|
140
|
+
// the tenancy marker lives only on `GET /setup/tenancy` (the canonical 073c contract). One
|
|
141
|
+
// additional loopback round trip per gated page navigation is the accepted budget.
|
|
142
|
+
const tenancySelected = await fetchTenancySelected(setupTenancyFetch, { registryPath, signal: c.req.raw.signal });
|
|
143
|
+
if (!tenancySelected) {
|
|
144
|
+
return c.redirect(ONBOARDING_ROUTE, 302);
|
|
145
|
+
}
|
|
146
|
+
// g-AC-5 / g-AC-6 / g-AC-10: healthy + authenticated + tenancy confirmed, serve as-is.
|
|
135
147
|
await next();
|
|
136
148
|
return undefined;
|
|
137
149
|
};
|
package/dist/daemon/gate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/daemon/gate.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/daemon/gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,8 @@ export interface InstallerConfig {
|
|
|
34
34
|
readonly manifestTimeoutMs: number;
|
|
35
35
|
/** The onboarding token file path (read lazily, deleted on completion). */
|
|
36
36
|
readonly tokenPath: string;
|
|
37
|
+
/** Legacy-window onboarding token path (mg-AC-9 dual read). */
|
|
38
|
+
readonly legacyTokenPath: string;
|
|
37
39
|
/** Existence check (a fake map in tests). */
|
|
38
40
|
readonly fileExists: (path: string) => boolean;
|
|
39
41
|
/** UTF-8 read returning `null` on any error (a fake map in tests). */
|
|
@@ -8,9 +8,10 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { createRequire } from "node:module";
|
|
10
10
|
import { existsSync, readFileSync, rmSync } from "node:fs";
|
|
11
|
-
import { join } from "node:path";
|
|
12
11
|
import { platform as osPlatform } from "node:process";
|
|
13
|
-
import { HIVE_VERSION
|
|
12
|
+
import { HIVE_VERSION } from "../../shared/constants.js";
|
|
13
|
+
import { resolveOnboardingTokenPath } from "../../shared/apiary-root.js";
|
|
14
|
+
import { LEGACY_ONBOARDING_TOKEN_PATH } from "../../shared/legacy-paths.js";
|
|
14
15
|
import { createNodeSpawn } from "./spawn.js";
|
|
15
16
|
/** The primary fleet manifest URL served by the install site (MV-2). */
|
|
16
17
|
export const MANIFEST_URL = "https://get.theapiary.sh/hive-release.json";
|
|
@@ -20,7 +21,7 @@ export const MANIFEST_URL = "https://get.theapiary.sh/hive-release.json";
|
|
|
20
21
|
*/
|
|
21
22
|
export const MANIFEST_FALLBACK_URL = "https://raw.githubusercontent.com/legioncodeinc/the-apiary/main/hive-release.json";
|
|
22
23
|
/** The bootstrap-minted one-time onboarding token file (mode 0600), read lazily per request (is-AC-9). */
|
|
23
|
-
export const ONBOARDING_TOKEN_PATH =
|
|
24
|
+
export const ONBOARDING_TOKEN_PATH = resolveOnboardingTokenPath();
|
|
24
25
|
/** The bounded timeout for the single network manifest fetch before falling back to the snapshot. */
|
|
25
26
|
export const MANIFEST_TIMEOUT_MS = 5000;
|
|
26
27
|
function defaultReadTextFile(path) {
|
|
@@ -59,6 +60,7 @@ export function createInstallerConfig(overrides = {}) {
|
|
|
59
60
|
manifestFetch: overrides.manifestFetch ?? ((input, init) => fetch(input, init)),
|
|
60
61
|
manifestTimeoutMs: overrides.manifestTimeoutMs ?? MANIFEST_TIMEOUT_MS,
|
|
61
62
|
tokenPath: overrides.tokenPath ?? ONBOARDING_TOKEN_PATH,
|
|
63
|
+
legacyTokenPath: overrides.legacyTokenPath ?? LEGACY_ONBOARDING_TOKEN_PATH,
|
|
62
64
|
fileExists: overrides.fileExists ?? ((path) => existsSync(path)),
|
|
63
65
|
readTextFile: overrides.readTextFile ?? defaultReadTextFile,
|
|
64
66
|
deleteFile: overrides.deleteFile ?? defaultDeleteFile,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/daemon/installer/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/daemon/installer/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ import { z } from "zod";
|
|
|
9
9
|
import type { InstallableProduct, InstallStage } from "../../shared/onboarding-types.js";
|
|
10
10
|
import { type EmitDeps } from "../../telemetry/emit.js";
|
|
11
11
|
import type { InstallerConfig } from "./config.js";
|
|
12
|
-
/** UI-reported funnel events validated at the event route (tm-AC-1). */
|
|
13
|
-
export declare const UI_FUNNEL_EVENTS: readonly ["onboarding_started", "mode_selected", "login_shown", "dashboard_reached"];
|
|
12
|
+
/** UI-reported funnel events validated at the event route (tm-AC-1; PRD-011a ts-AC-13 tenancy set). */
|
|
13
|
+
export declare const UI_FUNNEL_EVENTS: readonly ["onboarding_started", "mode_selected", "login_shown", "tenancy_shown", "tenancy_selected", "workspace_created", "dashboard_reached"];
|
|
14
14
|
export type UiFunnelEvent = (typeof UI_FUNNEL_EVENTS)[number];
|
|
15
15
|
/** Closed zod schema for `POST /api/onboarding/event` bodies. */
|
|
16
16
|
export declare const OnboardingEventBodySchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
@@ -21,10 +21,25 @@ export declare const OnboardingEventBodySchema: z.ZodUnion<readonly [z.ZodObject
|
|
|
21
21
|
advanced: "advanced";
|
|
22
22
|
}>;
|
|
23
23
|
}, z.core.$strip>;
|
|
24
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
25
|
+
event: z.ZodLiteral<"tenancy_selected">;
|
|
26
|
+
properties: z.ZodObject<{
|
|
27
|
+
orgCount: z.ZodEnum<{
|
|
28
|
+
single: "single";
|
|
29
|
+
few: "few";
|
|
30
|
+
many: "many";
|
|
31
|
+
}>;
|
|
32
|
+
singleOrgConfirm: z.ZodEnum<{
|
|
33
|
+
true: "true";
|
|
34
|
+
false: "false";
|
|
35
|
+
}>;
|
|
36
|
+
}, z.core.$strip>;
|
|
24
37
|
}, z.core.$strip>, z.ZodObject<{
|
|
25
38
|
event: z.ZodEnum<{
|
|
26
39
|
onboarding_started: "onboarding_started";
|
|
27
40
|
login_shown: "login_shown";
|
|
41
|
+
tenancy_shown: "tenancy_shown";
|
|
42
|
+
workspace_created: "workspace_created";
|
|
28
43
|
dashboard_reached: "dashboard_reached";
|
|
29
44
|
}>;
|
|
30
45
|
properties: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
|
|
@@ -8,23 +8,42 @@
|
|
|
8
8
|
import { z } from "zod";
|
|
9
9
|
import { emitTelemetry, HIVE_STATE_DIR } from "../../telemetry/emit.js";
|
|
10
10
|
import { isSessionEventReported, loadOnboardingLedger, markSessionEventReported, sessionKeyFromToken } from "../../telemetry/onboarding-session-ledger.js";
|
|
11
|
-
/** UI-reported funnel events validated at the event route (tm-AC-1). */
|
|
11
|
+
/** UI-reported funnel events validated at the event route (tm-AC-1; PRD-011a ts-AC-13 tenancy set). */
|
|
12
12
|
export const UI_FUNNEL_EVENTS = [
|
|
13
13
|
"onboarding_started",
|
|
14
14
|
"mode_selected",
|
|
15
15
|
"login_shown",
|
|
16
|
+
"tenancy_shown",
|
|
17
|
+
"tenancy_selected",
|
|
18
|
+
"workspace_created",
|
|
16
19
|
"dashboard_reached"
|
|
17
20
|
];
|
|
18
21
|
const ModeSelectedBodySchema = z.object({
|
|
19
22
|
event: z.literal("mode_selected"),
|
|
20
23
|
properties: z.object({ mode: z.enum(["standard", "advanced"]) })
|
|
21
24
|
});
|
|
25
|
+
/**
|
|
26
|
+
* PRD-011a ts-AC-13: `tenancy_selected` carries ONLY a bucketed org count and the single-org-confirm
|
|
27
|
+
* flag (both closed enums; never an org/workspace id or name). Mirrors the UI emit in
|
|
28
|
+
* `src/dashboard/web/onboarding/tenancy-step.tsx`.
|
|
29
|
+
*/
|
|
30
|
+
const TenancySelectedBodySchema = z.object({
|
|
31
|
+
event: z.literal("tenancy_selected"),
|
|
32
|
+
properties: z.object({
|
|
33
|
+
orgCount: z.enum(["single", "few", "many"]),
|
|
34
|
+
singleOrgConfirm: z.enum(["true", "false"])
|
|
35
|
+
})
|
|
36
|
+
});
|
|
22
37
|
const SimpleUiEventBodySchema = z.object({
|
|
23
|
-
event: z.enum(["onboarding_started", "login_shown", "dashboard_reached"]),
|
|
38
|
+
event: z.enum(["onboarding_started", "login_shown", "tenancy_shown", "workspace_created", "dashboard_reached"]),
|
|
24
39
|
properties: z.record(z.string(), z.string()).optional()
|
|
25
40
|
});
|
|
26
41
|
/** Closed zod schema for `POST /api/onboarding/event` bodies. */
|
|
27
|
-
export const OnboardingEventBodySchema = z.union([
|
|
42
|
+
export const OnboardingEventBodySchema = z.union([
|
|
43
|
+
ModeSelectedBodySchema,
|
|
44
|
+
TenancySelectedBodySchema,
|
|
45
|
+
SimpleUiEventBodySchema
|
|
46
|
+
]);
|
|
28
47
|
const SESSION_ONCE_SET = new Set([
|
|
29
48
|
"onboarding_started",
|
|
30
49
|
"health_check_passed",
|
|
@@ -97,6 +116,18 @@ export function createFunnelTelemetry(deps) {
|
|
|
97
116
|
case "login_shown":
|
|
98
117
|
emit("login_shown");
|
|
99
118
|
break;
|
|
119
|
+
case "tenancy_shown":
|
|
120
|
+
emit("tenancy_shown");
|
|
121
|
+
break;
|
|
122
|
+
case "tenancy_selected":
|
|
123
|
+
emit("tenancy_selected", {
|
|
124
|
+
org_count: body.properties.orgCount,
|
|
125
|
+
single_org_confirm: body.properties.singleOrgConfirm
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
case "workspace_created":
|
|
129
|
+
emit("workspace_created");
|
|
130
|
+
break;
|
|
100
131
|
case "dashboard_reached":
|
|
101
132
|
emit("dashboard_reached", {}, true);
|
|
102
133
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"funnel-telemetry.js","sourceRoot":"","sources":["../../../src/daemon/installer/funnel-telemetry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EACL,aAAa,EACb,cAAc,EAMf,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EAEpB,MAAM,8CAA8C,CAAC;AAGtD,
|
|
1
|
+
{"version":3,"file":"funnel-telemetry.js","sourceRoot":"","sources":["../../../src/daemon/installer/funnel-telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -181,9 +181,13 @@ export function createInstallerService(options = {}) {
|
|
|
181
181
|
tokenStore.invalidate();
|
|
182
182
|
return c.body(null, 204);
|
|
183
183
|
});
|
|
184
|
-
// 6) Funnel events (PRD-009c):
|
|
184
|
+
// 6) Funnel events (PRD-009c): closed UI event set, emitted through the chokepoint. Token
|
|
185
|
+
// mode is "optional" (PRD-011 N-1): the tokenless gate-redirect resume path (C-1) must
|
|
186
|
+
// still be able to record tenancy_shown / tenancy_selected / dashboard_reached, or the
|
|
187
|
+
// resume cohort is silently undercounted; a presented token still validates as before.
|
|
188
|
+
// This route is telemetry-only (no state change), Host + Origin guarded like the rest.
|
|
185
189
|
app.post("/api/onboarding/event", async (c) => {
|
|
186
|
-
const rejection = guardInstallerRequest(c, tokenStore, "
|
|
190
|
+
const rejection = guardInstallerRequest(c, tokenStore, "optional");
|
|
187
191
|
if (rejection !== null)
|
|
188
192
|
return rejection;
|
|
189
193
|
const body = await readJsonBody(c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/daemon/installer/routes.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/daemon/installer/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,8 +15,15 @@ import type { Context } from "hono";
|
|
|
15
15
|
import type { TokenStore } from "./token.js";
|
|
16
16
|
/** The request header carrying the onboarding token (the SSE path uses the `t` query param instead). */
|
|
17
17
|
export declare const TOKEN_HEADER: "x-onboarding-token";
|
|
18
|
-
/**
|
|
19
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Token requirement per endpoint class:
|
|
20
|
+
* - `always`: a valid token is required unconditionally (state-changing installer endpoints).
|
|
21
|
+
* - `detect`: required only while an onboarding session is active (the is-AC-10 re-entry carve-out).
|
|
22
|
+
* - `optional`: a PRESENTED token must be valid, but absence is accepted (PRD-011 N-1: the
|
|
23
|
+
* telemetry-only event route, so the tokenless gate-redirect resume cohort is still counted;
|
|
24
|
+
* the Host + Origin checks remain the cross-origin defense on this route).
|
|
25
|
+
*/
|
|
26
|
+
export type TokenMode = "always" | "detect" | "optional";
|
|
20
27
|
/** True iff the `Host` header is the portal's own host (is-AC-8). */
|
|
21
28
|
export declare function hostAllowed(host: string | undefined): boolean;
|
|
22
29
|
/**
|
|
@@ -72,6 +72,14 @@ export function guardInstallerRequest(c, tokenStore, tokenMode) {
|
|
|
72
72
|
return unauthorized();
|
|
73
73
|
return null;
|
|
74
74
|
}
|
|
75
|
+
// "optional" (PRD-011 N-1): tokenless is accepted (the gate-redirect resume path has no token
|
|
76
|
+
// by design, ts-AC-12); a token that IS presented must still validate, so token-bearing
|
|
77
|
+
// behavior is unchanged and a wrong token never passes.
|
|
78
|
+
if (tokenMode === "optional") {
|
|
79
|
+
if (provided !== null && !tokenStore.requireValid(provided))
|
|
80
|
+
return unauthorized();
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
75
83
|
// "detect": token required only while an onboarding session is active (is-AC-10 carve-out).
|
|
76
84
|
if (tokenStore.isActive() && !tokenStore.requireValid(provided))
|
|
77
85
|
return unauthorized();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/daemon/installer/security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGjE,sFAAsF;AACtF,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,SAAS,IAAI,SAAS,EAAE,EAAE,aAAa,SAAS,EAAE,CAAC,CAAC,CAAC;AAE/F,0FAA0F;AAC1F,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,CAAC,UAAU,SAAS,IAAI,SAAS,EAAE,EAAE,oBAAoB,SAAS,EAAE,CAAC,CAAC,CAAC;AAE/G,wGAAwG;AACxG,MAAM,CAAC,MAAM,YAAY,GAAG,oBAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/daemon/installer/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PRD-009a: the daemon side of the one-time onboarding token contract (is-AC-9/10).
|
|
3
3
|
*
|
|
4
|
-
* The bootstrap mints the token and writes it to
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* The bootstrap mints the token and writes it to the hive onboarding-token path at mode 0600 BEFORE
|
|
5
|
+
* the daemon starts (PRD-009d). During the fleet-root migration window the daemon also reads the
|
|
6
|
+
* legacy path when the new path is absent (mg-AC-9). The daemon reads the token LAZILY at request
|
|
7
|
+
* time, not at startup, because on re-entry the daemon may already be running when a fresh bootstrap
|
|
8
|
+
* writes a new token. Comparison is constant time (`crypto.timingSafeEqual`). Completion invalidates
|
|
9
|
+
* the token: whichever path served it is deleted and an in-memory flag is set, so state-changing
|
|
10
|
+
* endpoints refuse all requests until a fresh bootstrap mints a new one (is-AC-10). The token is
|
|
11
|
+
* never logged, never returned, and never placed in an error body.
|
|
11
12
|
*/
|
|
12
13
|
import type { InstallerConfig } from "./config.js";
|
|
13
14
|
/** The token gate: whether onboarding is active, whether a presented token is valid, and invalidation. */
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PRD-009a: the daemon side of the one-time onboarding token contract (is-AC-9/10).
|
|
3
3
|
*
|
|
4
|
-
* The bootstrap mints the token and writes it to
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* The bootstrap mints the token and writes it to the hive onboarding-token path at mode 0600 BEFORE
|
|
5
|
+
* the daemon starts (PRD-009d). During the fleet-root migration window the daemon also reads the
|
|
6
|
+
* legacy path when the new path is absent (mg-AC-9). The daemon reads the token LAZILY at request
|
|
7
|
+
* time, not at startup, because on re-entry the daemon may already be running when a fresh bootstrap
|
|
8
|
+
* writes a new token. Comparison is constant time (`crypto.timingSafeEqual`). Completion invalidates
|
|
9
|
+
* the token: whichever path served it is deleted and an in-memory flag is set, so state-changing
|
|
10
|
+
* endpoints refuse all requests until a fresh bootstrap mints a new one (is-AC-10). The token is
|
|
11
|
+
* never logged, never returned, and never placed in an error body.
|
|
11
12
|
*/
|
|
12
13
|
import { timingSafeEqual } from "node:crypto";
|
|
13
14
|
/** Constant-time string comparison. Length is compared first (timingSafeEqual requires equal length). */
|
|
@@ -21,35 +22,56 @@ function constantTimeEquals(a, b) {
|
|
|
21
22
|
}
|
|
22
23
|
return timingSafeEqual(bufA, bufB);
|
|
23
24
|
}
|
|
25
|
+
function readTrimmed(config, path) {
|
|
26
|
+
const raw = config.readTextFile(path);
|
|
27
|
+
if (raw === null)
|
|
28
|
+
return null;
|
|
29
|
+
const trimmed = raw.trim();
|
|
30
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* mg-AC-9/10: new path first, legacy path second, and the fallback is ABSENCE-triggered only.
|
|
34
|
+
* When the new-path file EXISTS, the legacy path is never consulted, even if the new file is
|
|
35
|
+
* unreadable or empty (that reads as "no valid token", never as stale legacy data).
|
|
36
|
+
*/
|
|
37
|
+
function resolveTokenPathAndValue(config) {
|
|
38
|
+
if (config.fileExists(config.tokenPath)) {
|
|
39
|
+
const primary = readTrimmed(config, config.tokenPath);
|
|
40
|
+
return primary === null ? null : { path: config.tokenPath, value: primary };
|
|
41
|
+
}
|
|
42
|
+
const legacy = readTrimmed(config, config.legacyTokenPath);
|
|
43
|
+
if (legacy !== null)
|
|
44
|
+
return { path: config.legacyTokenPath, value: legacy };
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
24
47
|
/** Build the token store over the injected config seams. */
|
|
25
48
|
export function createTokenStore(config) {
|
|
26
49
|
let invalidated = false;
|
|
27
|
-
|
|
28
|
-
const raw = config.readTextFile(config.tokenPath);
|
|
29
|
-
if (raw === null)
|
|
30
|
-
return null;
|
|
31
|
-
const trimmed = raw.trim();
|
|
32
|
-
return trimmed.length > 0 ? trimmed : null;
|
|
33
|
-
};
|
|
50
|
+
let activePath = null;
|
|
34
51
|
return {
|
|
35
52
|
isActive() {
|
|
36
53
|
if (invalidated)
|
|
37
54
|
return false;
|
|
38
|
-
return
|
|
55
|
+
return resolveTokenPathAndValue(config) !== null;
|
|
39
56
|
},
|
|
40
57
|
requireValid(provided) {
|
|
41
58
|
if (invalidated)
|
|
42
59
|
return false;
|
|
43
60
|
if (provided === null || provided === undefined || provided.length === 0)
|
|
44
61
|
return false;
|
|
45
|
-
const
|
|
46
|
-
if (
|
|
62
|
+
const resolved = resolveTokenPathAndValue(config);
|
|
63
|
+
if (resolved === null)
|
|
47
64
|
return false;
|
|
48
|
-
|
|
65
|
+
activePath = resolved.path;
|
|
66
|
+
return constantTimeEquals(resolved.value, provided);
|
|
49
67
|
},
|
|
50
68
|
invalidate() {
|
|
51
69
|
invalidated = true;
|
|
52
70
|
config.deleteFile(config.tokenPath);
|
|
71
|
+
config.deleteFile(config.legacyTokenPath);
|
|
72
|
+
if (activePath !== null) {
|
|
73
|
+
config.deleteFile(activePath);
|
|
74
|
+
}
|
|
53
75
|
}
|
|
54
76
|
};
|
|
55
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/daemon/installer/token.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/daemon/installer/token.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { type DaemonBases, type DaemonName } from "../shared/daemon-routing.js";
|
|
2
|
+
/**
|
|
3
|
+
* Informational only: the fleet-root registry location snapshotted at module load. Readers must
|
|
4
|
+
* go through {@link readRegistryBody} (which applies the new-then-legacy window chain per call),
|
|
5
|
+
* never read this constant's path directly.
|
|
6
|
+
*/
|
|
2
7
|
export declare const DOCTOR_REGISTRY_PATH: string;
|
|
3
8
|
export interface ResolveDaemonBasesOptions {
|
|
4
9
|
readonly registryPath?: string;
|
|
@@ -29,3 +34,4 @@ export interface ResolveRegisteredServiceNamesOptions {
|
|
|
29
34
|
*/
|
|
30
35
|
export declare function resolveRegisteredServiceNames(options?: ResolveRegisteredServiceNamesOptions): readonly string[];
|
|
31
36
|
export declare function resolveDaemonBases(options?: ResolveDaemonBasesOptions): DaemonBases;
|
|
37
|
+
export { readRegistryBody } from "../shared/registry-paths.js";
|
package/dist/daemon/registry.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
1
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
2
|
+
import { resolveFleetRegistryPath } from "../shared/apiary-root.js";
|
|
3
|
+
import { readRegistryBody } from "../shared/registry-paths.js";
|
|
5
4
|
import { isLoopbackBaseUrl, normalizeDaemonBases } from "../shared/daemon-routing.js";
|
|
6
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Informational only: the fleet-root registry location snapshotted at module load. Readers must
|
|
7
|
+
* go through {@link readRegistryBody} (which applies the new-then-legacy window chain per call),
|
|
8
|
+
* never read this constant's path directly.
|
|
9
|
+
*/
|
|
10
|
+
export const DOCTOR_REGISTRY_PATH = resolveFleetRegistryPath();
|
|
7
11
|
const RegistryEntrySchema = z.object({
|
|
8
12
|
name: z.string().min(1),
|
|
9
13
|
healthUrl: z.string().url(),
|
|
@@ -97,24 +101,18 @@ export function parseRegisteredServiceNames(raw) {
|
|
|
97
101
|
* shows no tiles until the fleet-status/SSE feed enumerates services some other way).
|
|
98
102
|
*/
|
|
99
103
|
export function resolveRegisteredServiceNames(options = {}) {
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
return parseRegisteredServiceNames(readFile(registryPath));
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
104
|
+
const raw = readRegistryBody(options);
|
|
105
|
+
if (raw === null)
|
|
106
106
|
return [];
|
|
107
|
-
|
|
107
|
+
return parseRegisteredServiceNames(raw);
|
|
108
108
|
}
|
|
109
109
|
export function resolveDaemonBases(options = {}) {
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
try {
|
|
113
|
-
return normalizeDaemonBases(parseDoctorRegistry(readFile(registryPath)));
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
110
|
+
const raw = readRegistryBody(options);
|
|
111
|
+
if (raw === null) {
|
|
116
112
|
// Missing or unreadable registry means no daemon has registered yet. Use documented loopback defaults.
|
|
117
113
|
return normalizeDaemonBases();
|
|
118
114
|
}
|
|
115
|
+
return normalizeDaemonBases(parseDoctorRegistry(raw));
|
|
119
116
|
}
|
|
117
|
+
export { readRegistryBody } from "../shared/registry-paths.js";
|
|
120
118
|
//# sourceMappingURL=registry.js.map
|