@rizom/ops 0.2.0-alpha.55 → 0.2.0-alpha.551

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 (69) hide show
  1. package/README.md +82 -1
  2. package/dist/age-key-bootstrap.d.ts +1 -1
  3. package/dist/brains-ops.js +727 -216
  4. package/dist/capability-bundle-migration.d.ts +22 -0
  5. package/dist/cert-bootstrap.d.ts +4 -2
  6. package/dist/content-repo-ref.d.ts +10 -0
  7. package/dist/content-repo.d.ts +1 -1
  8. package/dist/deploy.js +111 -166
  9. package/dist/directory-sync-stress-system.d.ts +75 -0
  10. package/dist/directory-sync-stress.d.ts +117 -0
  11. package/dist/entries/deploy.d.ts +4 -2
  12. package/dist/health-watchdog-smoke.d.ts +54 -0
  13. package/dist/image-inventory.d.ts +4 -0
  14. package/dist/image-types.d.ts +7 -0
  15. package/dist/images.d.ts +88 -0
  16. package/dist/index.d.ts +8 -0
  17. package/dist/index.js +727 -204
  18. package/dist/legacy-pilot-migration.d.ts +11 -0
  19. package/dist/legacy-projection-job-recovery.d.ts +29 -0
  20. package/dist/load-registry.d.ts +62 -6
  21. package/dist/observed-status.d.ts +1 -1
  22. package/dist/parse-args.d.ts +2 -12
  23. package/dist/preview-domain.d.ts +9 -0
  24. package/dist/reconcile-dry-run.d.ts +9 -0
  25. package/dist/run-command.d.ts +20 -4
  26. package/dist/schema.d.ts +140 -163
  27. package/dist/secrets-encrypt.d.ts +7 -13
  28. package/dist/secrets-push.d.ts +1 -1
  29. package/dist/ssh-key-bootstrap.d.ts +1 -26
  30. package/dist/stage-legacy-crossover.d.ts +25 -0
  31. package/dist/stress-command.d.ts +14 -0
  32. package/dist/stress-git-checkout.d.ts +21 -0
  33. package/dist/stress-health-monitor.d.ts +46 -0
  34. package/dist/upgrade.d.ts +10 -0
  35. package/dist/user-offboard.d.ts +61 -0
  36. package/dist/verify-user.d.ts +22 -0
  37. package/package.json +51 -44
  38. package/templates/rover-pilot/.env.schema +20 -5
  39. package/templates/rover-pilot/.github/actions/varlock-env/action.yml +47 -0
  40. package/templates/rover-pilot/.github/workflows/build.yml +70 -17
  41. package/templates/rover-pilot/.github/workflows/deploy.yml +83 -69
  42. package/templates/rover-pilot/.github/workflows/directory-sync-stress.yml +119 -0
  43. package/templates/rover-pilot/.github/workflows/health-watchdog-smoke.yml +95 -0
  44. package/templates/rover-pilot/.github/workflows/offboard.yml +107 -0
  45. package/templates/rover-pilot/.github/workflows/reconcile.yml +10 -4
  46. package/templates/rover-pilot/.github/workflows/upgrade.yml +104 -0
  47. package/templates/rover-pilot/README.md +13 -5
  48. package/templates/rover-pilot/deploy/scripts/create-predeploy-backup.ts +948 -0
  49. package/templates/rover-pilot/deploy/scripts/decrypt-user-secrets.ts +80 -24
  50. package/templates/rover-pilot/deploy/scripts/helpers.ts +3 -0
  51. package/templates/rover-pilot/deploy/scripts/install-health-watchdog.ts +144 -0
  52. package/templates/rover-pilot/deploy/scripts/provision-server.ts +51 -21
  53. package/templates/rover-pilot/deploy/scripts/resolve-deploy-handles.ts +4 -0
  54. package/templates/rover-pilot/deploy/scripts/resolve-missing-images.ts +13 -0
  55. package/templates/rover-pilot/deploy/scripts/resolve-user-config.ts +51 -9
  56. package/templates/rover-pilot/deploy/scripts/sync-content-repo.ts +51 -47
  57. package/templates/rover-pilot/deploy/scripts/update-dns.ts +58 -12
  58. package/templates/rover-pilot/deploy/scripts/validate-secrets.ts +12 -1
  59. package/templates/rover-pilot/deploy/scripts/verify-runtime-image.ts +18 -0
  60. package/templates/rover-pilot/docs/canonical-crossover-record.md +107 -0
  61. package/templates/rover-pilot/docs/onboarding-checklist.md +23 -14
  62. package/templates/rover-pilot/docs/operator-playbook.md +355 -30
  63. package/templates/rover-pilot/docs/user-onboarding.md +48 -463
  64. package/templates/rover-pilot/package.json +1 -0
  65. package/templates/rover-pilot/pilot.yaml +6 -4
  66. package/dist/origin-ca.d.ts +0 -1
  67. package/dist/push-secrets.d.ts +0 -9
  68. package/dist/push-target.d.ts +0 -2
  69. package/dist/run-subprocess.d.ts +0 -6
@@ -0,0 +1,75 @@
1
+ import type { FetchLike } from "@brains/utils/fetch-like";
2
+ import { type DirectorySyncStressPhase, type DirectorySyncStressPlan, type DirectorySyncStressProfile, type DirectorySyncStressReport, type StressRuntimeSample } from "./directory-sync-stress";
3
+ import { type StressCommandRunner } from "./stress-command";
4
+ export { runStressCommand, type StressCommandOptions, type StressCommandResult, type StressCommandRunner, } from "./stress-command";
5
+ export interface DeployedDirectorySyncStressOptions {
6
+ rootDir: string;
7
+ handle: string;
8
+ profile: DirectorySyncStressProfile;
9
+ plan?: DirectorySyncStressPlan;
10
+ confirmation: string;
11
+ artifactsDir?: string;
12
+ env?: NodeJS.ProcessEnv;
13
+ fetchImpl?: FetchLike;
14
+ commandRunner?: StressCommandRunner;
15
+ logger?: (message: string) => void;
16
+ now?: () => Date;
17
+ sleep?: (milliseconds: number) => Promise<void>;
18
+ }
19
+ export interface VerifyDirectorySyncStressAccessOptions {
20
+ rootDir: string;
21
+ handle: string;
22
+ confirmation: string;
23
+ artifactsDir?: string;
24
+ env?: NodeJS.ProcessEnv;
25
+ commandRunner?: StressCommandRunner;
26
+ now?: () => Date;
27
+ }
28
+ export interface CleanupDirectorySyncStressOptions {
29
+ rootDir: string;
30
+ handle: string;
31
+ confirmation: string;
32
+ artifactsDir?: string;
33
+ env?: NodeJS.ProcessEnv;
34
+ commandRunner?: StressCommandRunner;
35
+ logger?: (message: string) => void;
36
+ now?: () => Date;
37
+ }
38
+ export interface DeployedDirectorySyncStressResult {
39
+ runId: string;
40
+ artifactsDir: string;
41
+ target: {
42
+ handle: string;
43
+ domain: string;
44
+ contentRepo: string;
45
+ };
46
+ startedAt: string;
47
+ completedAt: string;
48
+ report: DirectorySyncStressReport;
49
+ }
50
+ export interface VerifyDirectorySyncStressAccessResult {
51
+ success: true;
52
+ artifactsDir: string;
53
+ checkedAt: string;
54
+ remoteHead: string;
55
+ target: {
56
+ handle: string;
57
+ domain: string;
58
+ contentRepo: string;
59
+ };
60
+ }
61
+ export interface CleanupDirectorySyncStressResult {
62
+ success: boolean;
63
+ artifactsDir: string;
64
+ probesRemoved: number;
65
+ probesRemaining: number;
66
+ backupBranchesDeleted: string[];
67
+ cleanupCommit?: string;
68
+ }
69
+ export declare function runDeployedDirectorySyncStress(options: DeployedDirectorySyncStressOptions): Promise<DeployedDirectorySyncStressResult>;
70
+ export declare function verifyDirectorySyncStressAccess(options: VerifyDirectorySyncStressAccessOptions): Promise<VerifyDirectorySyncStressAccessResult>;
71
+ export declare function cleanupDirectorySyncStress(options: CleanupDirectorySyncStressOptions): Promise<CleanupDirectorySyncStressResult>;
72
+ export declare function applyDirectorySyncStressPhase(checkoutDir: string, phase: DirectorySyncStressPhase): Promise<void>;
73
+ export declare function listProbeFiles(checkoutDir: string): Promise<string[]>;
74
+ export declare function removeProbeFiles(checkoutDir: string): Promise<number>;
75
+ export declare function parseStressRuntimeSample(output: string, timestamp: string): StressRuntimeSample | undefined;
@@ -0,0 +1,117 @@
1
+ import type { FetchLike } from "@brains/utils/fetch-like";
2
+ import { z } from "@brains/utils/zod";
3
+ export declare const directorySyncStressProfileSchema: z.ZodEnum<{
4
+ regression: "regression";
5
+ load: "load";
6
+ stress: "stress";
7
+ }>;
8
+ export type DirectorySyncStressProfile = z.output<typeof directorySyncStressProfileSchema>;
9
+ export declare const directorySyncStressOperationSchema: z.ZodEnum<{
10
+ add: "add";
11
+ update: "update";
12
+ rename: "rename";
13
+ delete: "delete";
14
+ }>;
15
+ export type DirectorySyncStressOperation = z.output<typeof directorySyncStressOperationSchema>;
16
+ export declare const directorySyncStressPhaseSchema: z.ZodObject<{
17
+ id: z.ZodString;
18
+ operation: typeof directorySyncStressOperationSchema;
19
+ count: z.ZodNumber;
20
+ targetProbeCount: z.ZodNumber;
21
+ settleMs: z.ZodNumber;
22
+ }>;
23
+ export type DirectorySyncStressPhase = z.output<typeof directorySyncStressPhaseSchema>;
24
+ export declare const directorySyncStressPlanSchema: z.ZodObject<{
25
+ profile: typeof directorySyncStressProfileSchema;
26
+ maximumProbeCount: z.ZodNumber;
27
+ maximumExternalAiCalls: z.ZodOptional<z.ZodNumber>;
28
+ phases: z.ZodArray<typeof directorySyncStressPhaseSchema>;
29
+ }>;
30
+ export type DirectorySyncStressPlan = z.output<typeof directorySyncStressPlanSchema>;
31
+ export declare const stressBaselineSchema: z.ZodObject<{
32
+ entities: z.ZodNumber;
33
+ notes: z.ZodNumber;
34
+ version: z.ZodString;
35
+ }>;
36
+ export type StressBaseline = z.output<typeof stressBaselineSchema>;
37
+ export declare const stressHealthSampleSchema: z.ZodObject<{
38
+ timestamp: z.ZodISODateTime;
39
+ endpoint: z.ZodString;
40
+ status: z.ZodNumber;
41
+ durationMs: z.ZodNumber;
42
+ ok: z.ZodBoolean;
43
+ error: z.ZodOptional<z.ZodString>;
44
+ }>;
45
+ export type StressHealthSample = z.output<typeof stressHealthSampleSchema>;
46
+ export declare const stressRuntimeSampleSchema: z.ZodObject<{
47
+ timestamp: z.ZodISODateTime;
48
+ cpuPercent: z.ZodNumber;
49
+ memoryPercent: z.ZodNumber;
50
+ pids: z.ZodNumber;
51
+ }>;
52
+ export type StressRuntimeSample = z.output<typeof stressRuntimeSampleSchema>;
53
+ export declare const stressPhaseResultSchema: z.ZodObject<{
54
+ id: z.ZodString;
55
+ operation: typeof directorySyncStressOperationSchema;
56
+ count: z.ZodNumber;
57
+ success: z.ZodBoolean;
58
+ commitLatencyMs: z.ZodOptional<z.ZodNumber>;
59
+ persistenceLatencyMs: z.ZodOptional<z.ZodNumber>;
60
+ error: z.ZodOptional<z.ZodString>;
61
+ }>;
62
+ export type StressPhaseResult = z.output<typeof stressPhaseResultSchema>;
63
+ export declare const stressCleanupResultSchema: z.ZodObject<{
64
+ success: z.ZodBoolean;
65
+ probesRemaining: z.ZodNumber;
66
+ finalEntities: z.ZodOptional<z.ZodNumber>;
67
+ finalNotes: z.ZodOptional<z.ZodNumber>;
68
+ contentTreeRestored: z.ZodOptional<z.ZodBoolean>;
69
+ error: z.ZodOptional<z.ZodString>;
70
+ }>;
71
+ export type StressCleanupResult = z.output<typeof stressCleanupResultSchema>;
72
+ export declare const stressContainerStateSchema: z.ZodObject<{
73
+ status: z.ZodString;
74
+ restartCount: z.ZodNumber;
75
+ oomKilled: z.ZodBoolean;
76
+ }>;
77
+ export type StressContainerState = z.output<typeof stressContainerStateSchema>;
78
+ export declare const stressMetricsSchema: z.ZodObject<{
79
+ health: z.ZodArray<typeof stressHealthSampleSchema>;
80
+ runtime: z.ZodArray<typeof stressRuntimeSampleSchema>;
81
+ externalAiCalls: z.ZodOptional<z.ZodNumber>;
82
+ container: z.ZodOptional<typeof stressContainerStateSchema>;
83
+ }>;
84
+ export type StressMetrics = z.output<typeof stressMetricsSchema>;
85
+ export declare const directorySyncStressReportSchema: z.ZodObject<{
86
+ profile: typeof directorySyncStressProfileSchema;
87
+ success: z.ZodBoolean;
88
+ baseline: typeof stressBaselineSchema;
89
+ phases: z.ZodArray<typeof stressPhaseResultSchema>;
90
+ cleanup: typeof stressCleanupResultSchema;
91
+ metrics: typeof stressMetricsSchema;
92
+ failure: z.ZodOptional<z.ZodString>;
93
+ }>;
94
+ export type DirectorySyncStressReport = z.output<typeof directorySyncStressReportSchema>;
95
+ export interface DirectorySyncStressTarget {
96
+ handle: string;
97
+ domain: string;
98
+ contentRepo: string;
99
+ confirmation: string;
100
+ }
101
+ export interface DirectorySyncStressDriver {
102
+ prepare(plan: DirectorySyncStressPlan): Promise<StressBaseline>;
103
+ startMonitoring(): Promise<void>;
104
+ executePhase(phase: DirectorySyncStressPhase, baseline: StressBaseline): Promise<StressPhaseResult>;
105
+ cleanup(baseline: StressBaseline): Promise<StressCleanupResult>;
106
+ stopMonitoring(): Promise<StressMetrics>;
107
+ }
108
+ export declare function resolveDirectorySyncStressPlan(profile: DirectorySyncStressProfile): DirectorySyncStressPlan;
109
+ export declare function assertDirectorySyncStressTarget(target: DirectorySyncStressTarget): void;
110
+ export interface SampleStressHealthOptions {
111
+ fetchImpl?: FetchLike;
112
+ now?: () => Date;
113
+ timeoutMs?: number;
114
+ }
115
+ export declare function sampleStressHealth(url: string, options?: SampleStressHealthOptions): Promise<StressHealthSample>;
116
+ export declare function runDirectorySyncStressPlan(plan: DirectorySyncStressPlan, driver: DirectorySyncStressDriver): Promise<DirectorySyncStressReport>;
117
+ export declare function stressMetricsFailure(metrics: StressMetrics, maximumExternalAiCalls?: number): string | undefined;
@@ -1,2 +1,4 @@
1
- export { readJsonResponse, parseEnvFile, parseEnvSchema, parseEnvSchemaFile, requireEnv, writeGitHubOutput, writeGitHubEnv, } from "@brains/utils";
2
- export type { EnvSchemaEntry } from "@brains/utils";
1
+ export { readJsonResponse, parseEnvFile, parseEnvSchema, parseEnvSchemaFile, requireEnv, writeGitHubOutput, writeGitHubEnv, } from "@brains/deploy-support";
2
+ export { verifyRuntimeImage } from "../image-inventory";
3
+ export type { EnvSchemaEntry } from "@brains/deploy-support";
4
+ export { runtimeImageTag, sitePackagesFor, requiredImages, resolveImageBuilds, runResolveMissingImages, type ImageRequirementSource, type RequiredImage, type ResolveImageBuildsOptions, type RunResolveMissingImagesOptions, } from "../images";
@@ -0,0 +1,54 @@
1
+ import type { FetchLike } from "@brains/utils/fetch-like";
2
+ import { type StressCommandRunner } from "./stress-command";
3
+ export interface HealthWatchdogSmokeTarget {
4
+ handle: string;
5
+ domain: string;
6
+ confirmation: string;
7
+ runId: string;
8
+ }
9
+ export interface HealthWatchdogSmokeOptions {
10
+ rootDir: string;
11
+ handle: string;
12
+ confirmation: string;
13
+ runId: string;
14
+ artifactsDir?: string | undefined;
15
+ env?: NodeJS.ProcessEnv | undefined;
16
+ fetchImpl?: FetchLike | undefined;
17
+ commandRunner?: StressCommandRunner | undefined;
18
+ logger?: ((message: string) => void) | undefined;
19
+ }
20
+ export interface HealthWatchdogSmokeResult {
21
+ success: true;
22
+ runId: string;
23
+ artifactsDir: string;
24
+ target: {
25
+ handle: string;
26
+ domain: string;
27
+ serverIp: string;
28
+ };
29
+ }
30
+ export interface CleanupHealthWatchdogSmokeOptions {
31
+ rootDir: string;
32
+ handle: string;
33
+ confirmation: string;
34
+ runId: string;
35
+ artifactsDir?: string | undefined;
36
+ env?: NodeJS.ProcessEnv | undefined;
37
+ fetchImpl?: FetchLike | undefined;
38
+ commandRunner?: StressCommandRunner | undefined;
39
+ logger?: ((message: string) => void) | undefined;
40
+ }
41
+ export interface CleanupHealthWatchdogSmokeResult {
42
+ success: true;
43
+ runId: string;
44
+ artifactsDir: string;
45
+ target: {
46
+ handle: string;
47
+ domain: string;
48
+ serverIp: string;
49
+ };
50
+ }
51
+ export declare function assertHealthWatchdogSmokeTarget(target: HealthWatchdogSmokeTarget): void;
52
+ export declare function renderHealthWatchdogSmokeRemoteScript(): string;
53
+ export declare function runHealthWatchdogSmoke(options: HealthWatchdogSmokeOptions): Promise<HealthWatchdogSmokeResult>;
54
+ export declare function cleanupHealthWatchdogSmoke(options: CleanupHealthWatchdogSmokeOptions): Promise<CleanupHealthWatchdogSmokeResult>;
@@ -0,0 +1,4 @@
1
+ import type { RequiredImage } from "./image-types";
2
+ import { type RunCommand } from "@brains/deploy-support/run-subprocess";
3
+ /** Verify a published image without starting an app or touching a fleet host. */
4
+ export declare function verifyRuntimeImage(imageRepository: string, image: RequiredImage, run?: RunCommand): Promise<void>;
@@ -0,0 +1,7 @@
1
+ /** Exact runtime requirements shared by image planning and verification. */
2
+ export interface RequiredImage {
3
+ tag: string;
4
+ brainVersion: string;
5
+ /** Sorted, deduped package specs installed into this runtime image. */
6
+ sitePackages: string[];
7
+ }
@@ -0,0 +1,88 @@
1
+ import type { RequiredImage } from "./image-types";
2
+ export type { RequiredImage } from "./image-types";
3
+ import { type ResolvedSiteOverride } from "./load-registry";
4
+ import { type RunCommand } from "@brains/deploy-support/run-subprocess";
5
+ /**
6
+ * Name the immutable runtime image for a Brain version and the exact site
7
+ * packages installed into it: `brain-<version>` for an instance without site
8
+ * pins, else that followed by each pin, sorted, in registry-safe spelling
9
+ * (`@rizom/site-x@1.2.3` → `rizom-site-x-1.2.3`). A pin set too long to spell
10
+ * out is named by a digest of it instead. Every instance with the same Brain
11
+ * version and pins shares one image; a change of pins is a new image, so a
12
+ * site can move on its own. Build and Deploy both import this function so
13
+ * their tags can never disagree.
14
+ */
15
+ export declare function runtimeImageTag(brainVersion: string, sitePackages?: readonly string[]): string;
16
+ /**
17
+ * The npm packages a site override contributes to every new fleet image.
18
+ * A @rizom-scoped theme is independently published and installs at its own
19
+ * explicit version; @brains/* themes are bundled inside @rizom/brain and must
20
+ * not be npm-installed.
21
+ */
22
+ export declare function sitePackagesFor(siteOverride: ResolvedSiteOverride | undefined): string[];
23
+ /** The per-user slice of the registry that determines which image it runs. */
24
+ export interface ImageRequirementSource {
25
+ brainVersion: string;
26
+ siteOverride?: ResolvedSiteOverride | undefined;
27
+ }
28
+ /**
29
+ * Derive one immutable image per effective Brain version and site pin set:
30
+ * every instance runs the image named by its own version and pins, so a
31
+ * site's pin change builds that site's image and no other, and promoting an
32
+ * instance to a version keeps whatever image already carries its pins there.
33
+ */
34
+ export declare function requiredImages(users: ImageRequirementSource[]): RequiredImage[];
35
+ export interface ResolveImageBuildsOptions {
36
+ users: ImageRequirementSource[];
37
+ /**
38
+ * Explicit dispatch override — the manual/backfill path. When set, exactly
39
+ * one image is built: this version with exactly the dispatched pins.
40
+ * Published tags stay immutable: a same-tag rebuild from a newer Dockerfile
41
+ * can strand the tag boot-broken, so rebuilding needs allowTagOverwrite.
42
+ */
43
+ brainVersionInput?: string | undefined;
44
+ sitePackagesInput?: string | undefined;
45
+ allowTagOverwrite?: boolean | undefined;
46
+ imageExists: (tag: string) => Promise<boolean>;
47
+ /** Fail closed if a published image cannot serve its assigned instances. */
48
+ verifyImage: (image: RequiredImage) => Promise<void>;
49
+ }
50
+ /**
51
+ * Decide which images a Build run must produce: the declared required set
52
+ * filtered to tags the registry does not already hold, or the single image an
53
+ * explicit dispatch input forces.
54
+ */
55
+ export declare function resolveImageBuilds(options: ResolveImageBuildsOptions): Promise<RequiredImage[]>;
56
+ export interface RunResolveMissingImagesOptions {
57
+ rootDir: string;
58
+ /** e.g. `ghcr.io/rizom-ai/rover-pilot` */
59
+ imageRepository: string;
60
+ env?: NodeJS.ProcessEnv;
61
+ runCommand?: RunCommand;
62
+ writeOutput: (key: string, value: string) => void;
63
+ log?: (line: string) => void;
64
+ }
65
+ /**
66
+ * Whether the registry already holds this tag.
67
+ *
68
+ * `docker manifest inspect` exits non-zero when the manifest is unknown, so a
69
+ * command failure is the "absent" answer. A failure to run docker at all is
70
+ * not: answering false there would let resolveImageBuilds past its
71
+ * tag-immutability guard and overwrite a published tag, which is exactly what
72
+ * that guard exists to prevent. Those propagate.
73
+ *
74
+ * A non-zero exit caused by an auth or network problem is still read as
75
+ * absent — docker reports it the same way it reports an unknown manifest, and
76
+ * telling them apart means matching stderr text that shifts between versions.
77
+ */
78
+ export declare function imageTagExists(run: RunCommand, imageRepository: string, tag: string): Promise<boolean>;
79
+ /**
80
+ * The Build workflow's resolve step: derive the image set the declared fleet
81
+ * state (pilot.yaml + cohorts + users) requires, probe the container registry
82
+ * for each tag, and emit the missing ones as a GitHub Actions build matrix
83
+ * (`images_json`, entries `{tag, brain_version, site_packages}`). Dispatch
84
+ * inputs `BRAIN_VERSION_INPUT`/`SITE_PACKAGES_INPUT` force a single explicit
85
+ * build instead. Deriving and probing here means a config push builds exactly
86
+ * what it declares — nothing reactive, nothing manual.
87
+ */
88
+ export declare function runResolveMissingImages(options: RunResolveMissingImagesOptions): Promise<RequiredImage[]>;
package/dist/index.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  export { initPilotRepo } from "./init";
2
2
  export { loadPilotRegistry, type LoadPilotRegistryOptions, } from "./load-registry";
3
+ export { runtimeImageTag, sitePackagesFor, requiredImages, resolveImageBuilds, runResolveMissingImages, type ImageRequirementSource, type RequiredImage, type ResolveImageBuildsOptions, type RunResolveMissingImagesOptions, } from "./images";
4
+ export { derivePreviewDomain, type PreviewDomainOptions, } from "./preview-domain";
3
5
  export { writeUsersTable } from "./render-users-table";
4
6
  export { onboardUser } from "./onboard-user";
5
7
  export { addPilotUser } from "./user-add";
8
+ export { assertPilotUsersRemoved, createPilotOffboardDriver, offboardPilotUsers, type OffboardPilotUserPlan, type OffboardPilotUsersOptions, type OffboardPilotUsersResult, type PilotOffboardDnsRecord, type PilotOffboardDriver, type PilotOffboardInspection, type PilotOffboardServer, type PilotOffboardTarget, } from "./user-offboard";
6
9
  export { reconcileCohort } from "./reconcile-cohort";
7
10
  export { reconcileAll } from "./reconcile-all";
8
11
  export { parseArgs, type ParsedArgs } from "./parse-args";
@@ -11,4 +14,9 @@ export { bootstrapPilotSshKey, runPilotSshKeyBootstrap, } from "./ssh-key-bootst
11
14
  export { bootstrapPilotOriginCertificate, runPilotCertBootstrap, } from "./cert-bootstrap";
12
15
  export { encryptPilotSecrets } from "./secrets-encrypt";
13
16
  export { pushPilotSecrets } from "./secrets-push";
17
+ export { verifyPilotUser } from "./verify-user";
18
+ export { assertDirectorySyncStressTarget, directorySyncStressPlanSchema, directorySyncStressProfileSchema, directorySyncStressReportSchema, resolveDirectorySyncStressPlan, runDirectorySyncStressPlan, sampleStressHealth, stressMetricsFailure, type DirectorySyncStressDriver, type DirectorySyncStressPhase, type DirectorySyncStressPlan, type DirectorySyncStressProfile, type DirectorySyncStressReport, } from "./directory-sync-stress";
19
+ export { cleanupDirectorySyncStress, runDeployedDirectorySyncStress, verifyDirectorySyncStressAccess, type CleanupDirectorySyncStressOptions, type CleanupDirectorySyncStressResult, type DeployedDirectorySyncStressOptions, type DeployedDirectorySyncStressResult, type VerifyDirectorySyncStressAccessOptions, type VerifyDirectorySyncStressAccessResult, } from "./directory-sync-stress-system";
20
+ export { assertHealthWatchdogSmokeTarget, cleanupHealthWatchdogSmoke, renderHealthWatchdogSmokeRemoteScript, runHealthWatchdogSmoke, type CleanupHealthWatchdogSmokeOptions, type CleanupHealthWatchdogSmokeResult, type HealthWatchdogSmokeOptions, type HealthWatchdogSmokeResult, type HealthWatchdogSmokeTarget, } from "./health-watchdog-smoke";
14
21
  export { runCommand, type CommandResult } from "./run-command";
22
+ export { pilotSchema, cohortSchema, canonicalBundleIdSchema, CAPABILITY_BUNDLE_CONTRACT, type PilotConfig, type CohortConfig, } from "./schema";