@crvouga/mockingbird-service-slack 3.5.0 → 3.6.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/CHANGELOG.md +7 -1
- package/dist/chunk-4JPRLFNZ.js +1 -1
- package/dist/{chunk-DHAINBRN.js → chunk-TMQCTVOT.js} +214 -41
- package/dist/chunk-TMQCTVOT.js.map +7 -0
- package/dist/cli.js +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-DHAINBRN.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../adapters/node/src/cli.ts", "../../../adapters/node/src/fleet.ts", "../../../adapters/node/src/fleet-management.ts", "../../../adapters/node/src/fleet-archive.ts", "../../../adapters/node/src/fleet-bindings.ts", "../../../adapters/node/src/fleet-instrumentation.ts", "../../../adapters/node/src/fleet-journal.ts", "../../../adapters/node/src/fleet-observations.ts", "../../../adapters/node/src/fleet-proxy.ts", "../../../adapters/node/src/fleet-time.ts", "../../../adapters/node/src/fleet-preflight.ts", "../../../adapters/node/dist/fleet-config.schema.json", "../../../adapters/node/src/fleet-schema.ts", "../../../adapters/node/src/serve.ts", "../../../adapters/node/src/listen.ts", "../../../adapters/node/src/fleet-loader.ts", "../../../adapters/node/src/fleet-tools.ts", "../../../adapters/node/src/fleet-client.ts", "../../../adapters/node/src/fixtures.ts", "../src/socket-server.ts", "../src/server.ts"],
|
|
4
|
+
"sourcesContent": ["import type { EventEmitter } from \"node:events\"\nimport { readFile } from \"node:fs/promises\"\nimport { type ParseArgsConfig, parseArgs } from \"node:util\"\nimport type {\n MockControls,\n RequestLog,\n ServiceInstance,\n ServiceRuntime,\n} from \"@crvouga/mockingbird-service\"\nimport {\n normalizeBootControls,\n parseFaultHeader,\n resolveAdminPrefix,\n} from \"@crvouga/mockingbird-service\"\nimport { type FleetTarget, type ProtocolTarget, startFleet } from \"./fleet.js\"\nimport { createInstalledServiceLoader } from \"./fleet-loader.js\"\nimport { fleetCommands } from \"./fleet-tools.js\"\nimport { type Listening, listen } from \"./listen.js\"\n\nexport type CliOption = {\n type: \"string\" | \"boolean\"\n description: string\n /** Shown in help; the value placeholder, e.g. `<port>`. */\n value?: string\n default?: string | boolean\n}\n\nexport type CliValues = Record<string, string | boolean | undefined>\n\nexport type CliCommand = {\n fleetTarget?: FleetTarget\n summary: string\n usage?: string\n options?: Record<string, CliOption>\n /** Resolves to an exit code; a server command resolves only when it stops. */\n run(values: CliValues, positionals: string[]): Promise<number>\n}\n\nexport type CliSpec = {\n bin: string\n description: string\n commands: Record<string, CliCommand>\n}\n\nconst optionHelp = (options: Record<string, CliOption>): string[] =>\n Object.entries(options).map(([name, option]) => {\n const flag = `--${name}${option.type === \"string\" ? ` ${option.value ?? \"<value>\"}` : \"\"}`\n const fallback = option.default !== undefined ? ` (default: ${String(option.default)})` : \"\"\n return ` ${flag.padEnd(30)} ${option.description}${fallback}`\n })\n\nconst help = (spec: CliSpec): string =>\n [\n `${spec.bin} \u2014 ${spec.description}`,\n \"\",\n \"Usage:\",\n ` ${spec.bin} <command> [options]`,\n \"\",\n \"Commands:\",\n ...Object.entries(spec.commands).map(([name, c]) => ` ${name.padEnd(30)} ${c.summary}`),\n \"\",\n `Run \\`${spec.bin} <command> --help\\` for a command's options.`,\n ].join(\"\\n\")\n\nconst commandHelp = (spec: CliSpec, name: string, command: CliCommand): string =>\n [\n `${spec.bin} ${name} \u2014 ${command.summary}`,\n \"\",\n \"Usage:\",\n ` ${command.usage ?? `${spec.bin} ${name} [options]`}`,\n ...(command.options ? [\"\", \"Options:\", ...optionHelp(command.options)] : []),\n ].join(\"\\n\")\n\n/** Parse `argv` against `spec` and run the chosen command. Resolves to an exit code. */\nexport const runCli = async (spec: CliSpec, argv: string[]): Promise<number> => {\n const own = spec.commands.serve?.fleetTarget\n if (own)\n spec = {\n ...spec,\n commands: { ...fleetCommands((name) => loadTarget(name, own)), ...spec.commands },\n }\n // Two-word commands (`corpus pull`) win over one-word ones.\n const pair = argv.length >= 2 ? `${argv[0]} ${argv[1]}` : undefined\n const words = pair !== undefined && spec.commands[pair] ? 2 : 1\n const name = words === 2 ? pair : argv[0]\n const rest = argv.slice(words)\n if (name === undefined || name === \"--help\" || name === \"-h\" || name === \"help\") {\n console.log(help(spec))\n return 0\n }\n const command = spec.commands[name]\n if (!command) {\n console.error(`${spec.bin}: unknown command ${JSON.stringify(name)}\\n\\n${help(spec)}`)\n return 2\n }\n if (rest.includes(\"--help\") || rest.includes(\"-h\")) {\n console.log(commandHelp(spec, name, command))\n return 0\n }\n let parsed: { values: CliValues; positionals: string[] }\n try {\n parsed = parseArgs({\n args: rest,\n allowPositionals: true,\n strict: true,\n options: Object.fromEntries(\n Object.entries(command.options ?? {}).map(([key, option]) => [\n key,\n {\n type: option.type,\n ...(option.default !== undefined ? { default: option.default } : {}),\n },\n ]),\n ) as ParseArgsConfig[\"options\"],\n }) as { values: CliValues; positionals: string[] }\n } catch (error) {\n console.error(\n `${spec.bin} ${name}: ${error instanceof Error ? error.message : String(error)}\\n\\n${commandHelp(spec, name, command)}`,\n )\n return 2\n }\n return command.run(parsed.values, parsed.positionals)\n}\n\n// \u2500\u2500 serve \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport type LogFormat = \"pretty\" | \"json\" | \"off\"\n\nexport type CommonServeOptions = {\n adminPrefix?: string\n adminKey: string | undefined\n seed: string | undefined\n onLog: ((entry: RequestLog) => void) | undefined\n /** Admin controls to boot with: clock, latency, faults, a starting snapshot. */\n adminControls?: MockControls\n /** Synthetic provider fixture objects supplied by a fleet entry. */\n fixtures?: Record<string, unknown>\n baseUrl?: string\n}\n\n/**\n * What a service contributes to `serve`: how to build its runtime from CLI flags,\n * and what to say at startup. Every service's `./server` entry exports one as\n * `serveTarget`, which is also how `serve --config` finds services by name.\n */\nexport type ServeTarget = {\n packageVersion?: string\n name: string\n defaultPort: number\n /** Serve flags beyond the common ones. */\n options?: Record<string, CliOption>\n create(\n values: CliValues,\n common: CommonServeOptions,\n ): Promise<ServiceRuntime<ServiceInstance>> | ServiceRuntime<ServiceInstance>\n /** Startup lines after the listen address, e.g. the loaded corpus version. */\n banner?(runtime: ServiceRuntime<ServiceInstance>): string[]\n /** After the HTTP server is bound. A service that speaks more than HTTP attaches it here. */\n listening?(server: Listening): void\n}\n\nconst COMMON_SERVE_OPTIONS: Record<string, CliOption> = {\n port: { type: \"string\", value: \"<port>\", description: \"Port to listen on\" },\n host: { type: \"string\", value: \"<host>\", description: \"Interface to bind\", default: \"127.0.0.1\" },\n \"admin-prefix\": {\n type: \"string\",\n value: \"<path>\",\n description: \"Internal API prefix (default /__admin; env MOCKINGBIRD_ADMIN_PREFIX)\",\n },\n \"admin-key\": {\n type: \"string\",\n value: \"<key>\",\n description: \"Require x-mockingbird-admin-key on /__admin/* (env MOCKINGBIRD_ADMIN_KEY)\",\n },\n seed: {\n type: \"string\",\n value: \"<seed>\",\n description: \"Seed for every random choice (env MOCKINGBIRD_SEED)\",\n },\n \"admin-controls\": {\n type: \"string\",\n value: \"<json|file>\",\n description:\n \"Admin controls to boot with, as JSON or a JSON file: clock, latency, faults, snapshot, namespaces (env MOCKINGBIRD_ADMIN_CONTROLS)\",\n },\n clock: {\n type: \"string\",\n value: \"<instant>\",\n description: \"Start the clock at this instant (epoch ms or ISO-8601)\",\n },\n freeze: { type: \"boolean\", description: \"Freeze the clock: it moves only when told to\" },\n \"auto-advance\": {\n type: \"string\",\n value: \"<duration>\",\n description: \"Step the clock this much before every request (e.g. 1s)\",\n },\n latency: {\n type: \"string\",\n value: \"<duration>\",\n description: \"Baseline response time for every request (e.g. 250ms)\",\n },\n jitter: {\n type: \"string\",\n value: \"<duration>\",\n description: \"Seeded extra latency between 0 and this\",\n },\n \"virtual-time\": {\n type: \"boolean\",\n description: \"Spend latency, delays and timeouts on the mock clock instead of really waiting\",\n },\n fault: {\n type: \"string\",\n value: \"<fault>\",\n description:\n 'A fault to boot with, as in x-mockingbird-fault: 503, rate_limited, \"status=503; delay=2s\"',\n },\n snapshot: {\n type: \"string\",\n value: \"<file>\",\n description: \"Start from a snapshot document (GET /__admin/snapshots/:id)\",\n },\n log: {\n type: \"string\",\n value: \"<pretty|json|off>\",\n description: \"Request log format\",\n default: \"pretty\",\n },\n \"log-requests\": {\n type: \"boolean\",\n description:\n \"One JSON line per request: namespace, operationId, status, ids touched (never bodies). Same as --log json\",\n },\n config: {\n type: \"string\",\n value: \"<file>\",\n description: \"Serve every service in a mockingbird.json config instead\",\n },\n \"ready-file\": {\n type: \"string\",\n description: \"Atomically publish fleet endpoint JSON\",\n value: \"<file>\",\n },\n \"connections-file\": {\n type: \"string\",\n description: \"Write private connection URLs with mode 0600\",\n value: \"<file>\",\n },\n \"ready-json\": {\n type: \"boolean\",\n description: \"Emit one public JSON record after fleet readiness\",\n },\n}\n\nconst formatLog = (format: LogFormat) => {\n if (format === \"off\") return undefined\n if (format === \"json\") return (entry: RequestLog) => console.log(JSON.stringify(entry))\n return (entry: RequestLog) => {\n const op = entry.operationId ?? (entry.unmatched ? \"UNMATCHED\" : \"-\")\n const ns = entry.namespace === \"default\" ? \"\" : ` [${entry.namespace}]`\n const fault = entry.faultId ? ` fault=${entry.faultId}` : \"\"\n const adopted = entry.adopted ? \" adopted\" : \"\"\n // A rejection says what arrived (never the body) and why the service refused it.\n const received = entry.request\n ? ` received=${entry.request.bodyBytes === null ? \"?\" : `${entry.request.bodyBytes}B`} ct=${entry.request.contentType ?? \"-\"}${\n entry.request.transferEncoding ? ` te=${entry.request.transferEncoding}` : \"\"\n }`\n : \"\"\n const issues = entry.issues?.length\n ? ` issues=${entry.issues\n .slice(0, 3)\n .map((issue) => `${issue.path || \"$\"}: ${issue.message}`)\n .join(\"; \")}${entry.issues.length > 3 ? ` (+${entry.issues.length - 3})` : \"\"}`\n : \"\"\n console.log(\n `${entry.service} ${entry.method} ${entry.path} ${entry.status} ${op} ${entry.durationMs}ms${ns}${fault}${adopted}${received}${issues}`,\n )\n }\n}\n\nconst asString = (value: string | boolean | undefined): string | undefined =>\n typeof value === \"string\" ? value : undefined\n\nconst readJsonFile = async (path: string, label: string): Promise<unknown> => {\n try {\n return JSON.parse(await readFile(path, \"utf8\")) as unknown\n } catch (error) {\n throw new Error(\n `${label}: cannot read ${path}: ${error instanceof Error ? error.message : error}`,\n )\n }\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\n/**\n * The boot controls a `serve` invocation asks for: `--admin-controls` (or `MOCKINGBIRD_ADMIN_CONTROLS`) as\n * the base document, with the single-purpose flags on top. Checked here, so a bad value stops\n * the command before a port is bound. `undefined` when nothing was asked for.\n */\nexport const resolveServeControls = async (\n values: CliValues,\n env: Record<string, string | undefined> = process.env,\n base?: unknown,\n): Promise<MockControls | undefined> => {\n const source = asString(values[\"admin-controls\"]) ?? env.MOCKINGBIRD_ADMIN_CONTROLS\n let document: Record<string, unknown> = isObject(base) ? { ...base } : {}\n if (source !== undefined && source.trim() !== \"\") {\n let parsed: unknown\n if (source.trim().startsWith(\"{\")) {\n try {\n parsed = JSON.parse(source)\n } catch {\n throw new Error(\"--admin-controls: not valid JSON\")\n }\n } else parsed = await readJsonFile(source, \"--admin-controls\")\n if (!isObject(parsed)) throw new Error(\"--admin-controls: expected a JSON object\")\n document = { ...document, ...parsed }\n }\n const clock: Record<string, unknown> = isObject(document.clock) ? { ...document.clock } : {}\n const now = asString(values.clock)\n if (now !== undefined) clock.now = now\n if (values.freeze === true) clock.frozen = true\n const autoAdvance = asString(values[\"auto-advance\"])\n if (autoAdvance !== undefined) clock.autoAdvance = autoAdvance\n if (Object.keys(clock).length > 0) document.clock = clock\n const delay = asString(values.latency)\n const jitter = asString(values.jitter)\n if (delay !== undefined || jitter !== undefined) {\n const latency: Record<string, unknown> = isObject(document.latency)\n ? { ...document.latency }\n : document.latency !== undefined\n ? { delay: document.latency }\n : {}\n if (delay !== undefined) latency.delay = delay\n if (jitter !== undefined) latency.jitter = jitter\n document.latency = latency\n }\n if (values[\"virtual-time\"] === true) document.virtualTime = true\n const fault = asString(values.fault)\n if (fault !== undefined)\n document.faults = [\n ...(Array.isArray(document.faults) ? document.faults : []),\n parseFaultHeader(fault, \"--fault\"),\n ]\n const snapshot = asString(values.snapshot)\n if (snapshot !== undefined) document.snapshot = await readJsonFile(snapshot, \"--snapshot\")\n if (Object.keys(document).length === 0) return undefined\n normalizeBootControls(document, \"adminControls\")\n return document as MockControls\n}\n\n/** A service entry in `mockingbird.json`. */\nexport type ConfigService = {\n /** Stable config key is the instance identity; target defaults to that key. */\n target?: string\n publicOrigin?: string\n publicPath?: string\n dependsOn?: string[]\n protocol?: \"http\" | \"postgres\" | \"redis\"\n port?: number\n host?: string\n adminPrefix?: string\n adminKey?: string\n seed?: string\n /** Admin controls this service boots with. A key given here replaces the fleet-wide one. */\n adminControls?: MockControls\n fixtures?: Record<string, unknown>\n baseUrl?: string\n password?: string\n user?: string\n database?: string\n /** Protocol namespace selectors: database names for Postgres, logical DB indexes for Redis. */\n namespaces?: Record<string, string | number>\n /** Service-specific serve flags, by long name: `{ \"webhook-url\": \"\u2026\" }`. */\n options?: Record<string, string | boolean>\n}\n\nexport type MockingbirdConfig = {\n $schema?: string\n schemaVersion?: 1\n extensions?: Record<string, unknown>\n cors?: { origins: string[]; methods?: string[]; headers?: string[] }\n /** Keyed by service name: `junction` loads `@crvouga/mockingbird-service-junction`. */\n services: Record<string, ConfigService>\n log?: LogFormat\n adminPrefix?: string\n adminKey?: string\n /** Admin controls every HTTP service in the fleet boots with. */\n adminControls?: MockControls\n namespace?: string\n control?: { host?: string; port?: number }\n}\n\nconst loadTarget = (name: string, own: FleetTarget): Promise<FleetTarget> =>\n createInstalledServiceLoader({ projectRoot: process.cwd(), services: [name], targets: [own] })(\n name,\n )\n\nconst start = async (\n target: ServeTarget,\n values: CliValues,\n config: {\n port: number\n host: string\n adminPrefix?: string\n adminKey?: string\n seed?: string\n adminControls?: MockControls\n log: LogFormat\n },\n): Promise<Listening> => {\n const adminPrefix = resolveAdminPrefix(config.adminPrefix)\n const runtime = await target.create(values, {\n adminPrefix,\n adminKey: config.adminKey,\n seed: config.seed,\n onLog: formatLog(config.log),\n ...(config.adminControls !== undefined ? { adminControls: config.adminControls } : {}),\n })\n const listening = await listen(runtime, { port: config.port, host: config.host })\n target.listening?.(listening)\n console.log(`${target.name} emulator listening on ${listening.url}`)\n console.log(`${target.name} health: GET ${listening.url}${adminPrefix}/health`)\n console.log(\n `${target.name} admin: ${listening.url}${adminPrefix} (${config.adminKey ? \"x-mockingbird-admin-key required\" : \"open \u2014 pass --admin-key to lock\"})`,\n )\n console.log(`${target.name} admin ui: ${listening.url}${adminPrefix}/ui`)\n for (const line of target.banner?.(runtime) ?? [])\n console.log(`${target.name} ${line.replaceAll(\"/__admin\", adminPrefix)}`)\n return listening\n}\n\nconst untilSignal = async (servers: { close(): Promise<void> }[]): Promise<number> =>\n new Promise((resolve) => {\n const stop = async () => {\n ;(process as EventEmitter).removeListener(\"SIGINT\", stop)\n ;(process as EventEmitter).removeListener(\"SIGTERM\", stop)\n const results = await Promise.allSettled(servers.map((s) => s.close()))\n for (const result of results)\n if (result.status === \"rejected\")\n console.error(\n result.reason instanceof Error ? result.reason.message : String(result.reason),\n )\n resolve(results.some((r) => r.status === \"rejected\") ? 1 : 0)\n }\n process.once(\"SIGINT\", stop)\n process.once(\"SIGTERM\", stop)\n })\n\n/** The standard `serve` command for a service, including multi-service `--config`. */\nexport const serveCommand = (target: ServeTarget | ProtocolTarget): CliCommand => ({\n fleetTarget: target,\n summary: `Serve the ${target.name} emulator or a configured fleet`,\n options: { ...COMMON_SERVE_OPTIONS, ...(\"options\" in target ? target.options : {}) },\n async run(values) {\n const log = (\n values[\"log-requests\"] === true ? \"json\" : (asString(values.log) ?? \"pretty\")\n ) as LogFormat\n if (![\"pretty\", \"json\", \"off\"].includes(log)) {\n console.error(`--log must be pretty, json or off (got ${log})`)\n return 2\n }\n const configPath = asString(values.config)\n if (configPath !== undefined) {\n try {\n const config = JSON.parse(await readFile(configPath, \"utf8\")) as MockingbirdConfig\n config.adminPrefix = resolveAdminPrefix(\n config.adminPrefix ??\n asString(values[\"admin-prefix\"]) ??\n process.env.MOCKINGBIRD_ADMIN_PREFIX,\n )\n const adminKey =\n config.adminKey ?? asString(values[\"admin-key\"]) ?? process.env.MOCKINGBIRD_ADMIN_KEY\n if (adminKey !== undefined) config.adminKey = adminKey\n // Flags and MOCKINGBIRD_ADMIN_CONTROLS apply on top of the config file's own controls.\n const adminControls = await resolveServeControls(values, process.env, config.adminControls)\n if (adminControls !== undefined) config.adminControls = adminControls\n const fleet = await startFleet(config, {\n load: (name) => loadTarget(name, target),\n onLog: formatLog(config.log ?? log),\n ...(asString(values[\"ready-file\"]) ? { readyFile: asString(values[\"ready-file\"]) } : {}),\n ...(asString(values[\"connections-file\"])\n ? { connectionsFile: asString(values[\"connections-file\"]) }\n : {}),\n onReady: (manifest) => {\n if (values[\"ready-json\"]) console.log(JSON.stringify(manifest))\n else\n for (const [name, endpoint] of Object.entries(manifest.services))\n console.log(`${name} emulator listening on ${endpoint.url}`)\n },\n })\n return untilSignal([fleet])\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error))\n return 1\n }\n }\n if (\"start\" in target) {\n console.error(\"Use --config to supervise protocol services with this command\")\n return 2\n }\n const port = asString(values.port)\n const adminKey = asString(values[\"admin-key\"]) ?? process.env.MOCKINGBIRD_ADMIN_KEY\n const seed = asString(values.seed) ?? process.env.MOCKINGBIRD_SEED\n let listening: Listening\n try {\n const adminControls = await resolveServeControls(values)\n listening = await start(target, values, {\n ...(adminControls !== undefined ? { adminControls } : {}),\n adminPrefix: resolveAdminPrefix(\n asString(values[\"admin-prefix\"]) ?? process.env.MOCKINGBIRD_ADMIN_PREFIX,\n ),\n port: port === undefined ? target.defaultPort : Number.parseInt(port, 10),\n host: asString(values.host) ?? \"127.0.0.1\",\n ...(adminKey !== undefined ? { adminKey } : {}),\n ...(seed !== undefined ? { seed } : {}),\n log,\n })\n } catch (error) {\n console.error(error instanceof Error ? error.message : String(error))\n return 1\n }\n return untilSignal([listening])\n },\n})\n", "import { AsyncLocalStorage } from \"node:async_hooks\"\nimport { createHash, randomUUID } from \"node:crypto\"\nimport { chmod, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport type { FetchAPI } from \"@crvouga/mockingbird-core\"\nimport type {\n Clock,\n RequestLog,\n ServiceInstance,\n ServiceRuntime,\n} from \"@crvouga/mockingbird-service\"\nimport {\n createClock,\n normalizeBootControls,\n ownedTransport,\n parseDuration,\n resolveAdminPrefix,\n restoreClock,\n} from \"@crvouga/mockingbird-service\"\nimport type { CommonServeOptions, ConfigService, MockingbirdConfig, ServeTarget } from \"./cli.js\"\nimport { FleetManagement, type ManagementOptions } from \"./fleet-management.js\"\nimport type { EndpointManifest } from \"./fleet-manifest.js\"\nimport { preflightFleet } from \"./fleet-preflight.js\"\nimport { advertisedHttpBase } from \"./fleet-proxy.js\"\nimport { type Listening, listen } from \"./listen.js\"\n\nexport type { EndpointManifest } from \"./fleet-manifest.js\"\n\nexport type FleetDiagnostics = {\n activeRequests: number\n activeConnections: number\n blockedCommands: number\n pendingJobs: number\n activeJobs?: number\n pendingWebhooks: number\n unmatchedRequests: number\n}\n\n/** Protocol packages own their state, listeners, credentials and namespace selection. */\nexport type FleetChild = {\n targetName?: string\n dependencies?: string[]\n coverage?: { included: string[]; excluded: string[] }\n outboundPolicy?: \"webhook-hub\" | \"unsupported\"\n packageVersion?: string\n protocol: \"http\" | \"postgres\" | \"redis\" | \"external\"\n url: string\n connection?: string\n connections?: Record<string, string>\n healthUrl?: string\n adminUrl?: string\n namespaces: Record<string, unknown>\n ready(): Promise<boolean>\n close(): Promise<void>\n /** Fence new work synchronously; diagnostics must also account for work already in flight. */\n lock(namespace: string): () => void\n diagnostics(namespace: string): FleetDiagnostics\n checkpoint(namespace: string): Promise<unknown>\n restore(namespace: string, checkpoint: unknown): Promise<void>\n reset(namespace: string): Promise<void>\n clock(namespace: string): Clock\n nextEvent?(namespace: string): number | undefined | Promise<number | undefined>\n settle?(namespace: string, signal?: AbortSignal): Promise<void>\n exportCheckpoint?(namespace: string, checkpoint: unknown): Promise<unknown>\n importCheckpoint?(namespace: string, document: unknown): Promise<unknown>\n createNamespace?(namespace: string): Promise<void>\n deleteNamespace?(namespace: string): Promise<void>\n inspect?(\n namespace: string,\n options: { offset: number; limit: number; collection?: string },\n ): Promise<unknown>\n configure?(namespace: string, controls: Record<string, unknown>): Promise<unknown>\n unmatched?(namespace: string, limit: number): { entries: unknown[]; truncated: boolean }\n lastActivity?(namespace: string): number\n setAdmission?(allow: (namespace: string) => boolean): void\n initializationAccess?(): Promise<{ connections: Record<string, string>; close(): Promise<void> }>\n}\n\nexport type ProtocolTarget = {\n packageVersion?: string\n name: string\n protocol: \"postgres\" | \"redis\" | \"external\"\n defaultPort: number\n start(entry: ConfigService): Promise<FleetChild>\n}\n/** Bundled service declarations contain distinct private runtime classes. The loader boundary\n * accepts their opaque runtime and validates the fleet protocol before starting a listener. */\nexport type FleetHttpTarget = Pick<\n ServeTarget,\n \"name\" | \"defaultPort\" | \"options\" | \"packageVersion\" | \"listening\"\n> & {\n create(values: Parameters<ServeTarget[\"create\"]>[0], common: CommonServeOptions): unknown\n}\nexport type FleetTarget = FleetHttpTarget | ProtocolTarget\n\nexport type FleetOptions = ManagementOptions & {\n participants?: Record<string, FleetChild>\n load(name: string): Promise<FleetTarget>\n onLog?: CommonServeOptions[\"onLog\"]\n readyFile?: string | undefined\n connectionsFile?: string | undefined\n onReady?(manifest: EndpointManifest): void\n initialize?(context: {\n manifest: EndpointManifest\n connections: Record<string, unknown>\n headers: Record<string, string>\n signal: AbortSignal\n }): Promise<void>\n initializationTimeoutMs?: number\n beforeClose?(context: {\n manifest: EndpointManifest\n signal: AbortSignal\n capture(namespaces: string[]): Promise<unknown>\n }): Promise<void>\n shutdownTimeoutMs?: number\n shutdownFailure?: \"abort\" | \"close\"\n}\n\nconst EMPTY: FleetDiagnostics = {\n activeRequests: 0,\n activeConnections: 0,\n blockedCommands: 0,\n pendingJobs: 0,\n pendingWebhooks: 0,\n unmatchedRequests: 0,\n}\nconst NS = /^[A-Za-z0-9_.-]{1,64}$/\nconst json = (status: number, value: unknown) => {\n if (status >= 400 && isObject(value)) {\n const message =\n typeof value.error === \"string\"\n ? value.error\n : typeof value.message === \"string\"\n ? value.message\n : value.status === \"failed\"\n ? \"fleet operation failed\"\n : \"fleet request rejected\"\n return Response.json(\n {\n ...value,\n error: {\n type: \"mockingbird_admin\",\n code:\n (\n {\n 400: \"invalid_request\",\n 401: \"unauthorized\",\n 404: \"not_found\",\n 409: \"conflict\",\n 500: \"operation_failed\",\n } as Record<number, string>\n )[status] ?? \"request_failed\",\n message,\n },\n },\n { status },\n )\n }\n return Response.json(value, { status })\n}\nconst isObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\nconst pending = (d: FleetDiagnostics) =>\n d.activeRequests + d.blockedCommands + d.pendingJobs + d.pendingWebhooks\n\nconst publicUrl = (raw: string): string => {\n const url = new URL(raw)\n url.password = \"\"\n return url.href\n}\n\n/** Atomic publication; credentials only go in an explicitly requested 0600 file. */\nconst atomicWrite = async (path: string, value: unknown) => {\n const temp = `${path}.${randomUUID()}.tmp`\n try {\n await writeFile(temp, `${JSON.stringify(value, null, 2)}\\n`, { mode: 0o600, flag: \"wx\" })\n await chmod(temp, 0o600)\n await rename(temp, path)\n } finally {\n await rm(temp, { force: true })\n }\n}\n\nconst removeOwned = async (path: string | undefined, id: string) => {\n if (!path) return\n try {\n const value: unknown = JSON.parse(await readFile(path, \"utf8\"))\n if (isObject(value) && value.id === id) await rm(path, { force: true })\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error\n }\n}\n\nconst httpChild = async (\n target: FleetHttpTarget,\n entry: ConfigService,\n options: FleetOptions,\n admission: (namespace: string, request: Request) => Response | undefined,\n generation: (namespace: string) => string | undefined,\n privateAccess: (namespace: string, request: Request) => boolean,\n observer: {\n begin(namespace: string, request: Request): unknown\n finish(\n namespace: string,\n request: Request,\n response: Response,\n log: RequestLog,\n token: unknown,\n ): Promise<void>\n delivery(event: { namespace: string; state: string; deliveryId: string }): void\n },\n): Promise<FleetChild> => {\n const requestLog = new AsyncLocalStorage<{ entry?: RequestLog }>()\n const created: unknown = await target.create(entry.options ?? {}, {\n adminPrefix: resolveAdminPrefix(entry.adminPrefix),\n adminKey: entry.adminKey,\n seed: entry.seed,\n onLog: (entry) => {\n const current = requestLog.getStore()\n if (current) current.entry = entry\n options.onLog?.(entry)\n },\n ...(entry.adminControls !== undefined ? { adminControls: entry.adminControls } : {}),\n ...(entry.fixtures !== undefined ? { fixtures: entry.fixtures } : {}),\n ...((advertisedHttpBase(entry) ?? entry.baseUrl) !== undefined\n ? { baseUrl: advertisedHttpBase(entry) ?? entry.baseUrl }\n : {}),\n })\n if (\n !isObject(created) ||\n [\n \"fetch\",\n \"fleetSnapshot\",\n \"fleetRestore\",\n \"fleetExport\",\n \"fleetImport\",\n \"namespaceOf\",\n \"instance\",\n \"namespaceClock\",\n \"reset\",\n \"configure\",\n \"dropNamespace\",\n ].some((method) => typeof created[method] !== \"function\")\n )\n throw new Error(\n \"HTTP target does not implement the fleet runtime protocol; build/install matching supported service versions\",\n )\n const runtime = created as unknown as ServiceRuntime<ServiceInstance>\n const unobserve = runtime.webhooks?.observeDeliveries(observer.delivery)\n if (options.outbound && runtime.webhooks)\n runtime.webhooks.setTransportPolicy(ownedTransport(options.outbound))\n const adminPrefix = resolveAdminPrefix(entry.adminPrefix)\n const locked = new Set<string>()\n const active = new Map<string, number>()\n const activity = new Map<string, number>()\n const api: FetchAPI = {\n async fetch(request) {\n const namespace = runtime.namespaceOf(request)\n if (locked.has(namespace) && !privateAccess(namespace, request))\n return json(409, { error: \"fleet control in progress\", namespace })\n if (!new URL(request.url).pathname.endsWith(`${adminPrefix}/health`)) {\n const refused = admission(namespace, request)\n if (refused) return refused\n }\n activity.set(namespace, Date.now())\n active.set(namespace, (active.get(namespace) ?? 0) + 1)\n let complete = false\n const finish = () => {\n if (complete) return\n complete = true\n active.set(namespace, (active.get(namespace) ?? 1) - 1)\n request.signal.removeEventListener(\"abort\", finish)\n }\n request.signal.addEventListener(\"abort\", finish, { once: true })\n try {\n const log: { entry?: RequestLog } = {},\n traceToken = observer.begin(namespace, request),\n started = performance.now()\n const response = await requestLog.run(log, () => runtime.fetch(request))\n await observer.finish(\n namespace,\n request,\n response,\n log.entry ?? {\n service: target.name,\n namespace,\n operationId: undefined,\n method: request.method,\n path: new URL(request.url).pathname,\n status: response.status,\n durationMs: performance.now() - started,\n unmatched: response.status === 404,\n },\n traceToken,\n )\n if (!response.body) {\n finish()\n return response\n }\n const reader = response.body.getReader()\n const headers = new Headers(response.headers)\n const epoch = generation(namespace)\n if (epoch) headers.set(\"x-mockingbird-generation\", epoch)\n return new Response(\n new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const next = await reader.read()\n if (next.done) {\n finish()\n controller.close()\n reader.releaseLock()\n } else controller.enqueue(next.value)\n } catch (error) {\n finish()\n controller.error(error)\n }\n },\n async cancel(reason) {\n try {\n await reader.cancel(reason)\n } finally {\n finish()\n reader.releaseLock()\n }\n },\n }),\n { status: response.status, statusText: response.statusText, headers },\n )\n } catch (error) {\n finish()\n throw error\n }\n },\n }\n let server: Listening | undefined\n try {\n server = await listen(api, {\n port: entry.port ?? target.defaultPort,\n host: entry.host ?? \"127.0.0.1\",\n })\n target.listening?.(server)\n } catch (error) {\n unobserve?.()\n runtime.stop?.()\n await server?.close()\n runtime.webhooks?.clear()\n await runtime.webhooks?.idle()\n throw error\n }\n return {\n protocol: \"http\",\n outboundPolicy: runtime.webhooks ? \"webhook-hub\" : \"unsupported\",\n url: server.url,\n healthUrl: `${server.url}${adminPrefix}/health`,\n adminUrl: `${server.url}${adminPrefix}`,\n namespaces: { header: \"x-mockingbird-namespace\", path: `${adminPrefix}/ns/{name}` },\n ready: async () => {\n try {\n return (\n await fetch(`${server.url}${adminPrefix}/health`, { signal: AbortSignal.timeout(2000) })\n ).ok\n } catch {\n return false\n }\n },\n async close() {\n unobserve?.()\n runtime.stop?.()\n runtime.webhooks?.clear()\n await server.close()\n await runtime.webhooks?.idle()\n },\n lock(namespace) {\n if (locked.has(namespace)) throw new Error(\"namespace already locked\")\n locked.add(namespace)\n return () => locked.delete(namespace)\n },\n diagnostics(namespace) {\n return {\n ...EMPTY,\n activeRequests: active.get(namespace) ?? 0,\n pendingWebhooks: runtime.webhooks?.pending(namespace) ?? 0,\n unmatchedRequests: runtime.metrics\n .report(namespace)\n .unmatched.reduce((n, r) => n + r.count, 0),\n }\n },\n async checkpoint(namespace) {\n return runtime.fleetSnapshot(namespace)\n },\n async restore(namespace, checkpoint) {\n runtime.fleetRestore(checkpoint, namespace)\n },\n reset: (namespace) => runtime.reset(namespace),\n clock: (namespace) => runtime.namespaceClock(namespace),\n unmatched(namespace, limit) {\n const entries = runtime.metrics.report(namespace).unmatched\n return {\n entries: entries.slice(0, limit).map(({ method, path, count }) => ({\n method,\n pathFingerprint: createHash(\"sha256\").update(path).digest(\"hex\"),\n count,\n })),\n truncated: entries.length > limit,\n }\n },\n lastActivity: (namespace) => activity.get(namespace) ?? 0,\n async exportCheckpoint(_namespace, point) {\n return runtime.fleetExport(point)\n },\n async importCheckpoint(namespace, document) {\n return runtime.fleetImport(namespace, document)\n },\n async createNamespace(namespace) {\n runtime.instance(namespace)\n },\n deleteNamespace: (namespace) => runtime.dropNamespace(namespace),\n async configure(namespace, controls) {\n return runtime.configure(controls, namespace)\n },\n async inspect(namespace, { offset, limit, collection }) {\n const doc = runtime.fleetExport(runtime.fleetSnapshot(namespace))\n const rows = collection\n ? doc.records.filter((row) => row.collection === collection)\n : doc.records\n return {\n total: rows.length,\n offset,\n records: rows.slice(offset, offset + limit),\n collections: [...new Set(doc.records.map((row) => row.collection))],\n }\n },\n ...(typeof (runtime.instance() as ServiceInstance & { nextEvent?: unknown }).nextEvent ===\n \"function\"\n ? {\n nextEvent: (namespace: string) =>\n (\n runtime.instance(namespace) as ServiceInstance & { nextEvent(): number | undefined }\n ).nextEvent(),\n }\n : {}),\n async settle(namespace) {\n const instance = runtime.instance(namespace) as ServiceInstance & { tick?(): unknown }\n await instance.tick?.()\n await runtime.webhooks?.idle(namespace)\n },\n }\n}\n\nexport type Fleet = {\n readonly manifest: EndpointManifest\n readonly children: ReadonlyMap<string, FleetChild>\n fetch(request: Request): Promise<Response>\n close(): Promise<void>\n}\n\n/** Resolves only after every child and the aggregate control listener are healthy. */\nexport async function startFleet(config: MockingbirdConfig, options: FleetOptions): Promise<Fleet> {\n if (config.cors && options.cors === undefined) options = { ...options, cors: config.cors }\n const targets = await preflightFleet(config, options)\n const id = randomUUID()\n const startedAt = new Date().toISOString()\n const children = new Map<string, FleetChild>()\n const clocks = new Map<string, Clock>()\n const checkpoints = new Map<\n string,\n { namespace: string; values: Map<string, unknown>; clock: ReturnType<Clock[\"state\"]> }\n >()\n let supervisor: Listening | undefined\n let management: FleetManagement | undefined\n let manifest: EndpointManifest\n const privateConnections = () =>\n Object.fromEntries(\n [...children].map(([name, child]) => [\n name,\n { url: child.connection ?? child.url, namespaces: child.connections },\n ]),\n )\n const publish = async () => {\n if (!manifest || (management && management.lifecycle !== \"ready\")) return\n manifest.state = recovery.size ? \"recovery-required\" : \"ready\"\n for (const [name, child] of children)\n if (manifest.services[name]) manifest.services[name].namespaces = child.namespaces\n if (options.connectionsFile)\n await atomicWrite(options.connectionsFile, {\n version: 1,\n id,\n pid: process.pid,\n services: privateConnections(),\n })\n if (options.readyFile) await atomicWrite(options.readyFile, manifest)\n }\n let stopped = false\n const controlling = new Map<string, string>()\n const recovery = new Map<string, (() => void)[]>()\n let closing: Promise<void> | undefined\n const close = (): Promise<void> => {\n if (closing) return closing\n closing = (async () => {\n management?.stopPolicies()\n let gateFailure: unknown\n if (options.beforeClose && management && [\"ready\", \"failed\"].includes(management.lifecycle)) {\n management.lifecycle = \"draining\"\n const signal = AbortSignal.timeout(options.shutdownTimeoutMs ?? 30000)\n try {\n await Promise.race([\n options.beforeClose({\n manifest,\n signal,\n capture: (namespaces) => (management as FleetManagement).capture(namespaces),\n }),\n new Promise<never>((_, reject) =>\n signal.addEventListener(\n \"abort\",\n () => reject(new Error(\"pre-shutdown hook timed out\")),\n { once: true },\n ),\n ),\n ])\n } catch (error) {\n management.lifecycle = \"failed\"\n if (options.shutdownFailure !== \"close\") {\n closing = undefined\n throw error\n }\n gateFailure = error\n }\n }\n stopped = true\n if (management) management.lifecycle = \"stopped\"\n const entries = [...children]\n const results: PromiseSettledResult<void>[] = []\n for (const [, child] of [...entries].reverse()) {\n try {\n await child.close()\n results.unshift({ status: \"fulfilled\", value: undefined })\n } catch (reason) {\n results.unshift({ status: \"rejected\", reason })\n }\n }\n const cleanup = await Promise.allSettled([\n supervisor?.close(),\n removeOwned(options.readyFile, id),\n removeOwned(options.connectionsFile, id),\n ])\n const failures = results.flatMap((r, i) =>\n r.status === \"rejected\" ? [{ service: entries[i]?.[0], cause: r.reason }] : [],\n )\n if (gateFailure) failures.push({ service: \"pre-shutdown\", cause: gateFailure })\n failures.push(\n ...cleanup.flatMap((r) =>\n r.status === \"rejected\" ? [{ service: \"controller\", cause: r.reason }] : [],\n ),\n )\n if (failures.length)\n throw new AggregateError(\n failures.map((f) => f.cause),\n `fleet shutdown failed: ${failures.map((f) => f.service).join(\", \")}`,\n )\n })()\n return closing\n }\n // Invalidate a previous process's artifacts before attempting startup.\n if (options.readyFile) await rm(options.readyFile, { force: true })\n if (options.connectionsFile) await rm(options.connectionsFile, { force: true })\n\n const clock = (namespace: string) => {\n let value = clocks.get(namespace)\n if (!value) {\n value = createClock()\n const plan = normalizeBootControls(config.adminControls)\n const boot = { ...plan.shared.clock, ...plan.namespaces[namespace]?.clock }\n if (boot.frozen) value.freeze()\n if (boot.now !== undefined) value.set(boot.now)\n clocks.set(namespace, value)\n }\n return value\n }\n const select = (body: Record<string, unknown>): Map<string, FleetChild> => {\n if (body.services === undefined) return children\n if (!Array.isArray(body.services) || body.services.length === 0)\n throw new Error(\"services must be a nonempty list\")\n const selected = new Map<string, FleetChild>()\n for (const name of body.services) {\n if (typeof name !== \"string\" || !children.has(name))\n throw new Error(\"unknown service in selection\")\n selected.set(name, children.get(name) as FleetChild)\n }\n return selected\n }\n const diagnostics = (namespace: string, selected: Map<string, FleetChild> = children) =>\n Object.fromEntries([...selected].map(([name, child]) => [name, child.diagnostics(namespace)]))\n const missingNamespace = (namespace: string, selected: Map<string, FleetChild>) => {\n const missing = [...selected]\n .filter(\n ([, c]) =>\n c.protocol !== \"http\" &&\n !Object.hasOwn((c.namespaces.endpoints ?? {}) as object, namespace),\n )\n .map(([name]) => name)\n return missing.length\n ? json(404, { error: \"namespace is not configured\", namespace, services: missing })\n : undefined\n }\n const transaction = async (\n namespace: string,\n selected: Map<string, FleetChild>,\n run: (name: string, child: FleetChild) => Promise<unknown>,\n recover = false,\n ): Promise<Response> => {\n const unavailable = missingNamespace(namespace, selected)\n if (unavailable) return unavailable\n if (management?.topologyBusy(namespace))\n return json(409, { error: \"namespace topology operation in progress\" })\n if (controlling.has(namespace))\n return json(409, {\n error: \"another fleet operation is in progress\",\n operationId: controlling.get(namespace),\n })\n if (recovery.has(namespace) && !recover)\n return json(409, {\n error: \"namespace requires explicit reset or restore recovery\",\n namespace,\n })\n const held = recovery.get(namespace)\n if (held) {\n for (const unlock of held.reverse()) unlock()\n recovery.delete(namespace)\n }\n controlling.set(namespace, management?.operationId(namespace) ?? randomUUID())\n const release: (() => void)[] = []\n let keepFence = false\n const before = new Map<string, unknown>()\n const results: Record<string, unknown> = {}\n let failure: string | undefined\n try {\n if (![...selected.keys()].every((name) => management?.environmentFence(namespace, name)))\n await management?.hook(\"prepare\", namespace, selected)\n management?.phase(namespace, \"checkpointing\")\n for (const [name, child] of selected) {\n failure = name\n if (!management?.environmentFence(namespace, name)) release.push(child.lock(namespace))\n }\n const busy = Object.fromEntries(\n [...selected]\n .filter(([, child]) => {\n const state = child.diagnostics(namespace)\n return (\n state.activeRequests +\n state.blockedCommands +\n state.pendingWebhooks +\n (state.activeJobs ?? 0) >\n 0\n )\n })\n .map(([name, child]) => [name, child.diagnostics(namespace)]),\n )\n if (Object.keys(busy).length)\n return json(409, { error: \"namespace is not quiescent\", services: busy })\n for (const [name, child] of selected) {\n failure = name\n management?.phase(namespace, \"checkpointing\", before.size, selected.size, name)\n before.set(name, await child.checkpoint(namespace))\n }\n management?.checkCancelled(namespace)\n management?.phase(namespace, \"committing\")\n for (const [name, child] of selected) {\n failure = name\n management?.phase(namespace, \"committing\", Object.keys(results).length, selected.size, name)\n results[name] = { status: \"ok\", result: await run(name, child) }\n management?.phase(namespace, \"committing\", Object.keys(results).length, selected.size)\n }\n await management?.hook(\"verify\", namespace, selected)\n try {\n await management?.hook(\"resume\", namespace, selected)\n } catch (error) {\n keepFence = true\n throw error\n }\n return json(200, { status: \"ok\", namespace, services: results })\n } catch (error) {\n if ((error as { code?: string }).code === \"MOCKINGBIRD_WORKLOAD_UNCERTAIN\") keepFence = true\n const rollback: Record<string, string> = {}\n // Roll back even the child whose mutation failed; it may have partially changed state.\n for (const [name, point] of before) {\n try {\n management?.phase(namespace, \"rolling-back\", undefined, undefined, name)\n await selected.get(name)?.restore(namespace, point)\n rollback[name] = \"restored\"\n } catch {\n rollback[name] = \"failed\"\n management?.phase(namespace, \"rollback-failed\", undefined, undefined, name)\n }\n }\n keepFence = keepFence || Object.values(rollback).includes(\"failed\") || held !== undefined\n if (!keepFence)\n try {\n await management?.hook(\"resume\", namespace, selected)\n } catch {\n keepFence = true\n }\n if (keepFence && release.length === 0)\n for (const child of selected.values())\n try {\n release.push(child.lock(namespace))\n } catch {}\n return json(500, {\n error: error instanceof Error ? error.message : \"fleet operation failed\",\n status: \"failed\",\n namespace,\n failedService: failure,\n services: results,\n rollback,\n rolledBack:\n before.size > 0 && Object.values(rollback).every((value) => value === \"restored\"),\n })\n } finally {\n if (keepFence) recovery.set(namespace, release)\n else for (const unlock of release.reverse()) unlock()\n controlling.delete(namespace)\n }\n }\n\n const coreApi: FetchAPI = {\n async fetch(request) {\n const url = new URL(request.url)\n const adminPrefix = resolveAdminPrefix(config.adminPrefix)\n const path = url.pathname.startsWith(`${adminPrefix}/`)\n ? url.pathname.slice(adminPrefix.length)\n : \"\"\n if (path === \"/health\" && request.method === \"GET\") {\n const states = await Promise.all(\n [...children].map(async ([name, child]) => {\n let protocolReady = false\n try {\n protocolReady = await child.ready()\n } catch {\n /* reported as failed */\n }\n return [\n name,\n {\n processReady: !stopped,\n protocolReady,\n status: protocolReady ? \"ready\" : \"failed\",\n url: publicUrl(child.url),\n },\n ]\n }),\n )\n const ready =\n !stopped &&\n states.every(([, state]) => (state as { protocolReady: boolean }).protocolReady)\n return json(ready ? 200 : 503, {\n status: ready ? \"ready\" : \"failed\",\n id,\n services: Object.fromEntries(states),\n })\n }\n if (!path.startsWith(\"/fleet/\")) return json(404, { error: \"not found\" })\n const route = /^\\/fleet\\/namespaces\\/([^/]+)\\/(reset|snapshots)(?:\\/([^/]+)\\/restore)?$/.exec(\n path,\n )\n let namespace: string\n try {\n namespace = route\n ? decodeURIComponent(route[1] as string)\n : (url.searchParams.get(\"namespace\") ??\n request.headers.get(\"x-mockingbird-namespace\") ??\n config.namespace ??\n \"default\")\n } catch {\n return json(400, { error: \"invalid namespace encoding\" })\n }\n if (!NS.test(namespace)) return json(400, { error: \"invalid namespace\" })\n if (request.method === \"GET\") {\n const unavailable = missingNamespace(namespace, children)\n if (unavailable) return unavailable\n }\n if (request.method === \"GET\" && path === \"/fleet/metrics\")\n return json(200, { namespace, services: diagnostics(namespace) })\n if (request.method === \"GET\" && path === \"/fleet/clock\")\n return json(200, {\n namespace,\n ...clock(namespace).state(),\n services: Object.fromEntries(\n [...children].map(([name, child]) => [name, child.clock(namespace).state()]),\n ),\n })\n if (request.method !== \"POST\") return json(405, { error: \"method not allowed\" })\n let body: Record<string, unknown>\n try {\n const text = await request.text()\n const value: unknown = text ? JSON.parse(text) : {}\n if (!isObject(value)) throw new Error(\"expected object\")\n body = value\n } catch {\n return json(400, { error: \"expected JSON object\" })\n }\n let selected: Map<string, FleetChild>\n try {\n selected = select(body)\n } catch (error) {\n return json(400, { error: error instanceof Error ? error.message : \"bad selection\" })\n }\n const allowed = route?.[3]\n ? []\n : path === \"/fleet/clock\"\n ? [\"services\", \"set\", \"advance\", \"freeze\"]\n : route?.[2] === \"snapshots\"\n ? [\"services\", \"label\"]\n : [\"services\"]\n if (Object.keys(body).some((key) => !allowed.includes(key)))\n return json(400, { error: \"unknown control field\" })\n if (body.label !== undefined && (typeof body.label !== \"string\" || body.label.length > 256))\n return json(400, { error: \"label must be a string of at most 256 characters\" })\n const unavailable = missingNamespace(namespace, selected)\n if (unavailable) return unavailable\n if (path === \"/fleet/wait-until-idle\") {\n const services = diagnostics(namespace, selected)\n const idle = Object.values(services).every((d) => pending(d) === 0)\n return json(idle ? 200 : 409, { status: idle ? \"idle\" : \"busy\", namespace, services })\n }\n if (path === \"/fleet/clock\") {\n const current = clock(namespace)\n if (body.set === undefined && body.advance === undefined && body.freeze === undefined)\n return json(200, {\n namespace,\n ...current.state(),\n services: Object.fromEntries(\n [...selected].map(([name, child]) => [name, child.clock(namespace).state()]),\n ),\n })\n let target = current.now()\n if (body.set !== undefined) {\n target =\n typeof body.set === \"number\"\n ? body.set\n : typeof body.set === \"string\"\n ? Date.parse(body.set)\n : NaN\n if (!Number.isFinite(target))\n return json(400, { error: \"set must be epoch ms or ISO-8601\" })\n }\n if (body.advance !== undefined) {\n const delta = parseDuration(body.advance)\n if (delta === undefined) return json(400, { error: \"invalid advance\" })\n target += delta\n }\n const frozen = body.freeze === undefined ? current.state().frozen : body.freeze\n if (typeof frozen !== \"boolean\") return json(400, { error: \"freeze must be boolean\" })\n const response = await transaction(namespace, selected, async (_name, child) => {\n const childClock = child.clock(namespace)\n restoreClock(childClock, {\n now:\n body.set !== undefined\n ? target\n : childClock.now() +\n (body.advance !== undefined ? (parseDuration(body.advance) ?? 0) : 0),\n frozen: body.freeze === undefined ? childClock.state().frozen : frozen,\n })\n await child.settle?.(namespace)\n return childClock.state()\n })\n if (response.ok) restoreClock(current, { now: target, frozen })\n return response\n }\n if (!route) return json(404, { error: \"not found\" })\n if (route[2] === \"reset\") {\n if (route[3]) return json(404, { error: \"not found\" })\n const response = await transaction(\n namespace,\n selected,\n async (_name, child) => child.reset(namespace),\n true,\n )\n if (response.ok && selected.size === children.size) {\n clocks.delete(namespace)\n clock(namespace)\n }\n return response\n }\n if (route[3]) {\n const point = checkpoints.get(route[3])\n if (!point || point.namespace !== namespace)\n return json(404, { error: \"no snapshot in this namespace\" })\n const restored = new Map(\n [...point.values].map(([name]) => [name, children.get(name) as FleetChild]),\n )\n const response = await transaction(\n namespace,\n restored,\n async (name, child) => child.restore(namespace, point.values.get(name)),\n true,\n )\n if (response.ok) restoreClock(clock(namespace), point.clock)\n return response\n }\n const snapshotId = randomUUID()\n const values = new Map<string, unknown>()\n const response = await transaction(namespace, selected, async (name, child) => {\n values.set(name, await child.checkpoint(namespace))\n return { checkpoint: `${snapshotId}:${name}` }\n })\n if (!response.ok) return response\n checkpoints.set(snapshotId, { namespace, values, clock: clock(namespace).state() })\n return json(201, {\n ...((await response.json()) as Record<string, unknown>),\n id: snapshotId,\n label: body.label,\n })\n },\n }\n try {\n const adminPrefix = resolveAdminPrefix(config.adminPrefix)\n if (!isObject(config.services) || targets.size === 0)\n throw new Error(\"config must contain at least one service\")\n for (const [name, target] of targets) {\n const entry = config.services[name] ?? {}\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name)) throw new Error(\"invalid service name\")\n // Checked before the child starts, so a bad document is reported by name.\n if (config.adminControls !== undefined || entry.adminControls !== undefined)\n normalizeBootControls(\n { ...config.adminControls, ...entry.adminControls },\n `services.${name}.adminControls`,\n )\n try {\n if (entry.protocol && entry.protocol !== (\"protocol\" in target ? target.protocol : \"http\"))\n throw new Error(\"configured protocol does not match target\")\n const adminKey = entry.adminKey ?? config.adminKey ?? process.env.MOCKINGBIRD_ADMIN_KEY\n const child =\n \"start\" in target\n ? await target.start({\n ...entry,\n ...(config.adminControls !== undefined || entry.adminControls !== undefined\n ? { adminControls: { ...config.adminControls, ...entry.adminControls } }\n : {}),\n })\n : await httpChild(\n target,\n {\n ...entry,\n adminPrefix: resolveAdminPrefix(entry.adminPrefix ?? adminPrefix),\n ...(adminKey !== undefined ? { adminKey } : {}),\n // Fleet-wide controls, with the service's own keys replacing them.\n ...(config.adminControls !== undefined || entry.adminControls !== undefined\n ? { adminControls: { ...config.adminControls, ...entry.adminControls } }\n : {}),\n },\n options,\n (namespace, request) => management?.admit(namespace, request),\n (namespace) => management?.generation(namespace),\n (namespace, request) => management?.privateRequest(namespace, request) ?? false,\n {\n begin: (namespace, request) => management?.beginRequest(name, namespace, request),\n finish: async (namespace, request, response, log, token) => {\n await management?.finishRequest(name, namespace, request, response, log, token)\n },\n delivery: (event) => management?.observeDelivery(name, event),\n },\n )\n child.targetName = entry.target ?? name\n if (target.packageVersion) child.packageVersion = target.packageVersion\n children.set(name, child)\n if (!(await child.ready())) throw new Error(\"protocol readiness failed\")\n } catch (error) {\n throw new Error(\n `service ${name} failed to start; all started listeners were closed: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n )\n }\n }\n management = new FleetManagement({\n id,\n config: { ...config, adminPrefix },\n options,\n children,\n checkpoints,\n clock,\n transaction,\n manifest: () => manifest,\n publish,\n recovery,\n controlling,\n })\n const api: FetchAPI = {\n fetch: (request) =>\n (management as FleetManagement).dispatch(request, () => coreApi.fetch(request)),\n }\n supervisor = await listen(api, {\n port: config.control?.port ?? 0,\n host: config.control?.host ?? \"127.0.0.1\",\n })\n manifest = {\n version: 1,\n capabilityVersion: 1,\n state: \"ready\",\n pid: process.pid,\n id,\n startedAt,\n adminBase: `${supervisor.url}${adminPrefix}/fleet`,\n healthUrl: `${supervisor.url}${adminPrefix}/health`,\n services: Object.fromEntries(\n [...children].map(([name, child]) => [\n name,\n {\n protocol: child.protocol,\n url: advertisedHttpBase(config.services[name] ?? {}) ?? publicUrl(child.url),\n healthUrl: child.healthUrl ?? `${supervisor?.url}${adminPrefix}/health`,\n adminUrl: child.adminUrl ?? `${supervisor?.url}${adminPrefix}/fleet`,\n namespaces: child.namespaces,\n processReady: true,\n protocolReady: true,\n },\n ]),\n ),\n }\n await management.recoverOperations()\n if (options.initialize) {\n management.lifecycle = \"initializing\"\n const access: { connections: Record<string, string>; close(): Promise<void> }[] = []\n const connections = privateConnections()\n try {\n for (const [name, child] of children)\n if (child.initializationAccess) {\n const privateAccess = await child.initializationAccess()\n access.push(privateAccess)\n connections[name] = {\n url: privateAccess.connections.default ?? child.connection ?? child.url,\n namespaces: privateAccess.connections,\n }\n }\n const signal = AbortSignal.timeout(options.initializationTimeoutMs ?? 30000)\n await Promise.race([\n options.initialize({\n manifest,\n connections,\n headers: { \"x-mockingbird-initializer\": management.initializationToken },\n signal,\n }),\n new Promise<never>((_, reject) =>\n signal.addEventListener(\n \"abort\",\n () => reject(new Error(\"fleet initialization timed out\")),\n { once: true },\n ),\n ),\n ])\n } finally {\n await Promise.all(access.map((entry) => entry.close()))\n }\n }\n await management.startPolicies()\n await publish()\n if (manifest.state === \"ready\") options.onReady?.(manifest)\n return { manifest, children, fetch: api.fetch, close }\n } catch (error) {\n try {\n await close()\n } catch (cleanup) {\n throw new AggregateError(\n [error, cleanup],\n `fleet startup and cleanup failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n throw error\n }\n}\n", "import { AsyncLocalStorage } from \"node:async_hooks\"\nimport { createHash, randomBytes, randomUUID } from \"node:crypto\"\nimport type { OutboundPolicy, RequestLog } from \"@crvouga/mockingbird-service\"\nimport { type Clock, normalizeControls, restoreClock } from \"@crvouga/mockingbird-service\"\nimport type { MockingbirdConfig } from \"./cli.js\"\nimport type { EndpointManifest, FleetChild } from \"./fleet.js\"\nimport {\n type ArchiveCompatibilityPolicy,\n assertArchiveCompatibility,\n canonical,\n diffArchives,\n digest,\n type FleetArchive,\n inspectArchive,\n sealArchive,\n validateArchive,\n} from \"./fleet-archive.js\"\nimport {\n planRestoreBindings,\n type RestoreBindings,\n rebaseArchiveNamespace,\n} from \"./fleet-bindings.js\"\nimport { FleetInstrumentation, type InstrumentationOptions } from \"./fleet-instrumentation.js\"\nimport { type JournalRecord, type OperationJournal, reconcileOperation } from \"./fleet-journal.js\"\nimport { type AssertionAllowance, FleetObservations } from \"./fleet-observations.js\"\nimport type { ArchiveProtector } from \"./fleet-protection.js\"\nimport { ingressSupport, supportsPublicIngress } from \"./fleet-proxy.js\"\nimport type { ArchiveRepository } from \"./fleet-repository.js\"\nimport { type ClockSynchronization, FleetTimeController } from \"./fleet-time.js\"\n\nexport type Operation = {\n scope?: string[]\n participant?: string\n actor?: string\n services?: string[]\n id: string\n namespace: string\n action: string\n phase: string\n startedAt: string\n finishedAt?: string\n status: \"running\" | \"succeeded\" | \"failed\" | \"cancelled\"\n completed: number\n total: number\n result?: unknown\n}\nexport type WorkloadContext = {\n namespace: string\n services: string[]\n signal: AbortSignal\n operationId: string\n}\nexport type WorkloadAdapter = {\n prepare?(context: WorkloadContext): Promise<void>\n verify?(context: WorkloadContext): Promise<void>\n resume?(context: WorkloadContext): Promise<void>\n}\nexport type ScenarioBundle = {\n format: \"mockingbird.scenario/v1\"\n version: number\n description?: string\n services: Record<\n string,\n { protocol: FleetChild[\"protocol\"]; controls?: Record<string, unknown>; fixtures?: unknown }\n >\n seed?: string | number\n clock?: { now: string | number; frozen?: boolean }\n seedApplication?(\n context: WorkloadContext & {\n manifest: EndpointManifest\n connections: Record<string, { url: string; namespaces: Record<string, string> }>\n headers: Record<string, string>\n },\n ): Promise<void>\n}\nexport type ManagementOptions = InstrumentationOptions & {\n trace?: boolean\n journal?: OperationJournal\n synchronizeClock?: ClockSynchronization\n outbound?: OutboundPolicy\n archiveCompatibility?: ArchiveCompatibilityPolicy\n archiveProtection?: ArchiveProtector\n resolveArchiveSecret?(reference: string): Promise<string>\n cors?: { origins: string[]; methods?: string[]; headers?: string[] }\n retention?: { maxCount?: number; ttlMs?: number }\n limits?: { maxNamespaces?: number; maxListeners?: number; connections?: number }\n workload?: WorkloadAdapter\n hookTimeoutMs?: number\n profiles?: Record<string, Record<string, Record<string, unknown>>>\n scenarios?: Record<string, ScenarioBundle>\n repository?: ArchiveRepository\n backupPolicy?: { intervalMs: number; namespaces?: string[]; keep?: number }\n expiry?: { idleMs: number; intervalMs?: number; finalBackup?: boolean }\n memberStatus?: boolean\n}\ntype Point = {\n namespace: string\n values: Map<string, unknown>\n clock: ReturnType<Clock[\"state\"]>\n createdAt?: string\n label?: unknown\n}\ntype Context = {\n id: string\n config: MockingbirdConfig\n options: ManagementOptions\n children: Map<string, FleetChild>\n checkpoints: Map<string, Point>\n clock(namespace: string): Clock\n transaction(\n namespace: string,\n selected: Map<string, FleetChild>,\n run: (name: string, child: FleetChild) => Promise<unknown>,\n recover?: boolean,\n ): Promise<Response>\n manifest(): EndpointManifest\n publish(): Promise<void>\n recovery: Map<string, (() => void)[]>\n controlling: Map<string, string>\n}\nconst object = (v: unknown): v is Record<string, unknown> =>\n v !== null && typeof v === \"object\" && !Array.isArray(v)\nexport const fleetError = (status: number, message: string, extra: Record<string, unknown> = {}) =>\n Response.json(\n {\n ...extra,\n error: {\n type: \"mockingbird_admin\",\n code:\n (\n {\n 400: \"invalid_request\",\n 401: \"unauthorized\",\n 403: \"forbidden\",\n 404: \"not_found\",\n 409: \"conflict\",\n 413: \"too_large\",\n 429: \"quota_exceeded\",\n 500: \"operation_failed\",\n 503: \"unavailable\",\n } as Record<number, string>\n )[status] ?? \"request_failed\",\n message,\n },\n },\n { status },\n )\nconst checked = (body: Record<string, unknown>, keys: string[]) => {\n const unknown = Object.keys(body).filter((k) => !keys.includes(k))\n if (unknown.length) throw new Error(`unknown fields: ${unknown.join(\", \")}`)\n}\nconst namePattern = /^[A-Za-z0-9_.-]{1,64}$/\n\nexport class FleetManagement {\n private readonly operationContext = new AsyncLocalStorage<Operation>()\n private readonly interrupted = new Map<string, JournalRecord>()\n private readonly durable = new Map<string, JournalRecord>()\n async recoverOperations() {\n if (!this.ctx.options.journal) return\n if (!this.ctx.options.repository)\n throw new Error(\"durable journal requires a portable archive repository\")\n let records: JournalRecord[]\n try {\n records = await this.ctx.options.journal.load()\n } catch {\n throw new Error(\"durable operation journal unavailable\")\n }\n for (const record of records) {\n const decision = await reconcileOperation(record, this.ctx.options.repository)\n if (decision.status === \"terminal\") continue\n if (\n decision.status === \"abandoned-before-commit\" ||\n decision.status === \"verified-publication\"\n ) {\n if (decision.status === \"verified-publication\")\n await this.restoreArchive(await this.ctx.options.repository.get(decision.archive))\n await this.ctx.options.journal.write({\n ...record,\n revision: record.revision + 1,\n phase: \"resolved\",\n resolution: decision.status,\n timestamp: new Date().toISOString(),\n })\n continue\n }\n this.interrupted.set(record.operationId, record)\n for (const namespace of record.scope) {\n if (!this.namespaces.has(namespace)) {\n const result = await this.createNamespace(namespace)\n if (!result.ok) throw new Error(\"cannot prepare interrupted namespace for recovery\")\n }\n if (this.ctx.recovery.has(namespace)) continue\n const releases: (() => void)[] = []\n for (const child of this.ctx.children.values())\n try {\n releases.push(child.lock(namespace))\n } catch {}\n this.ctx.recovery.set(namespace, releases)\n }\n }\n }\n private fenceNamespaces(scope: string[]) {\n for (const namespace of scope) {\n const releases = this.ctx.recovery.get(namespace) ?? []\n for (const child of this.ctx.children.values())\n try {\n releases.push(child.lock(namespace))\n } catch {}\n this.ctx.recovery.set(namespace, releases)\n }\n }\n private async journalPhase(\n operationId: string,\n phase: JournalRecord[\"phase\"],\n extra: Partial<Pick<JournalRecord, \"after\" | \"writerGeneration\" | \"resolution\">> = {},\n ) {\n const current = this.durable.get(operationId)\n if (!current || !this.ctx.options.journal) return\n const next = {\n ...current,\n ...extra,\n revision: current.revision + 1,\n phase,\n timestamp: new Date().toISOString(),\n }\n await this.ctx.options.journal.write(next)\n this.durable.set(operationId, next)\n }\n readonly observations: FleetObservations\n private requestPath(service: string, request: Request) {\n const prefix =\n this.ctx.config.services[service]?.adminPrefix ?? this.ctx.config.adminPrefix ?? \"/__admin\"\n let path = new URL(request.url).pathname\n if (path.startsWith(`${prefix}/ns/`)) {\n const tail = path.slice(`${prefix}/ns/`.length),\n slash = tail.indexOf(\"/\")\n path = slash < 0 ? \"/\" : tail.slice(slash)\n }\n return { path, admin: path === prefix || path.startsWith(`${prefix}/`) }\n }\n beginRequest(service: string, namespace: string, request: Request) {\n const route = this.requestPath(service, request)\n return route.admin\n ? undefined\n : this.observations.beginHTTP(namespace, service, request, route.path)\n }\n async finishRequest(\n service: string,\n namespace: string,\n _request: Request,\n response: Response,\n log: RequestLog,\n token: unknown,\n ) {\n if (this.requestPath(service, _request).admin) return\n const pathFingerprint = createHash(\"sha256\").update(log.path).digest(\"hex\")\n this.observations.record({\n namespace,\n service,\n kind: \"http\",\n method: log.method,\n pathFingerprint,\n status: log.status,\n unmatched: log.unmatched,\n fault: log.faultId !== undefined,\n ...(log.operationId ? { operationId: log.operationId } : {}),\n })\n await this.observations.finishHTTP(\n token as Parameters<FleetObservations[\"finishHTTP\"]>[0],\n response,\n )\n }\n observeDelivery(\n service: string,\n event: { namespace: string; state: string; deliveryId: string },\n ) {\n this.observations.record({\n namespace: event.namespace,\n service,\n kind: \"webhook\",\n deliveryState: event.state,\n })\n }\n readonly instrumentation: FleetInstrumentation\n readonly initializationToken = randomBytes(32).toString(\"base64url\")\n private readonly environmentContext = new AsyncLocalStorage<string>()\n private environment: { id: string; fences: Map<string, Map<string, () => void>> } | undefined\n private ownsEnvironment() {\n return (\n this.environment !== undefined && this.environmentContext.getStore() === this.environment.id\n )\n }\n topologyBusy(namespace: string) {\n return (\n this.topology.has(namespace) || (this.environment !== undefined && !this.ownsEnvironment())\n )\n }\n environmentFence(namespace: string, service: string) {\n return this.ownsEnvironment() && this.environment?.fences.get(namespace)?.has(service) === true\n }\n checkCancelled(namespace: string) {\n const id = this.operationId(namespace)\n if (id && this.aborts.get(id)?.signal.aborted)\n throw new Error(\"operation cancelled before commit\")\n }\n private activeOperation(namespace: string) {\n const current = this.operationContext.getStore()\n return current?.status === \"running\"\n ? current\n : [...this.operations.values()].find(\n (operation) => operation.namespace === namespace && operation.status === \"running\",\n )\n }\n operationId(namespace: string) {\n return this.activeOperation(namespace)?.id\n }\n private async withEnvironment<T>(\n namespaces: string[],\n selected: Map<string, FleetChild>,\n run: () => Promise<T>,\n ): Promise<T> {\n if (this.ownsEnvironment()) return run()\n if (this.environment || this.ctx.controlling.size || this.topology.size)\n throw new Error(\"environment operation conflicts with active namespace work\")\n const env = { id: randomUUID(), fences: new Map<string, Map<string, () => void>>() }\n this.environment = env\n return this.environmentContext.run(env.id, async () => {\n try {\n for (const ns of namespaces) {\n if (!this.namespaces.has(ns)) continue\n await this.hook(\"prepare\", ns, selected)\n const fences = new Map<string, () => void>()\n env.fences.set(ns, fences)\n for (const [name, child] of selected) {\n if (\n child.protocol !== \"http\" &&\n !Object.hasOwn((child.namespaces.endpoints ?? {}) as object, ns)\n )\n continue\n if (this.ctx.recovery.has(ns)) continue\n fences.set(name, child.lock(ns))\n }\n if (this.busy(ns, selected).length) throw new Error(`namespace ${ns} is not quiescent`)\n }\n return await run()\n } finally {\n for (const [ns, fences] of env.fences) {\n if (this.ctx.recovery.has(ns)) this.ctx.recovery.get(ns)?.push(...fences.values())\n else for (const unlock of [...fences.values()].reverse()) unlock()\n }\n this.environment = undefined\n }\n })\n }\n readonly operations = new Map<string, Operation>()\n readonly namespaces = new Map<\n string,\n {\n generation: string\n createdAt: number\n activityAt: number\n pinned: boolean\n expiresAt?: number\n }\n >()\n private readonly credentials = new Map<\n string,\n { id: string; namespaces: string[]; actions: string[]; expiresAt: number }\n >()\n private readonly retries = new Map<\n string,\n { fingerprint: string; expires: number; response: Promise<Response> }\n >()\n private readonly events: { id: string; namespace: string; operation: Operation }[] = []\n private readonly subscribers = new Set<{\n namespace: string\n member: boolean\n push(event: string): void\n }>()\n private readonly aborts = new Map<string, AbortController>()\n private readonly topology = new Set<string>()\n private readonly privateRequests = new Map<string, string>()\n privateRequest(namespace: string, request: Request) {\n const token = request.headers.get(\"x-mockingbird-initializer\")\n return (\n token !== null &&\n (this.privateRequests.get(namespace) === token ||\n (this.lifecycle === \"initializing\" && token === this.initializationToken))\n )\n }\n private sequence = 0\n private timer: ReturnType<typeof setInterval> | undefined\n private expiryTimer: ReturnType<typeof setInterval> | undefined\n private backupRunning = false\n private backupStatus: {\n lastAttempt?: string\n lastSuccess?: string\n lastFailure?: string\n nextRun?: string\n archiveId?: string\n } = {}\n lifecycle: \"starting\" | \"initializing\" | \"ready\" | \"draining\" | \"failed\" | \"stopped\" = \"starting\"\n constructor(private readonly ctx: Context) {\n this.instrumentation = new FleetInstrumentation(ctx.options)\n this.observations = new FleetObservations(ctx.id)\n this.remember(\"default\")\n for (const child of ctx.children.values())\n for (const ns of Object.keys((child.namespaces.endpoints ?? {}) as object)) this.remember(ns)\n for (const value of Object.values(ctx.options.limits ?? {}))\n if (!Number.isSafeInteger(value) || value < 0)\n throw new Error(\"limits must be nonnegative integers\")\n for (const child of ctx.children.values())\n child.setAdmission?.((namespace) => {\n const entry = this.namespaces.get(namespace)\n if (entry) entry.activityAt = Date.now()\n if (\n this.lifecycle === \"initializing\" ||\n this.lifecycle === \"draining\" ||\n this.lifecycle === \"failed\" ||\n this.environment ||\n this.topology.has(namespace) ||\n this.ctx.recovery.has(namespace)\n )\n return false\n const limit = this.ctx.options.limits?.connections\n if (limit === undefined) return true\n let connections = 0\n for (const c of ctx.children.values()) {\n if (\n c.protocol !== \"http\" &&\n !Object.hasOwn((c.namespaces.endpoints ?? {}) as object, namespace)\n )\n continue\n const d = c.diagnostics(namespace)\n connections += d.activeConnections + (c.protocol === \"http\" ? d.activeRequests : 0)\n }\n return connections < limit\n })\n const retention = ctx.options.retention\n if (\n retention?.maxCount !== undefined &&\n (!Number.isSafeInteger(retention.maxCount) || retention.maxCount < 1)\n )\n throw new Error(\"retention maxCount must be positive\")\n if (\n retention?.ttlMs !== undefined &&\n (!Number.isFinite(retention.ttlMs) || retention.ttlMs < 1)\n )\n throw new Error(\"retention ttlMs must be positive\")\n }\n remember(namespace: string) {\n if (!this.namespaces.has(namespace))\n this.namespaces.set(namespace, {\n generation: randomUUID(),\n createdAt: Date.now(),\n activityAt: Date.now(),\n pinned: false,\n })\n return this.namespaces.get(namespace) as NonNullable<ReturnType<typeof this.namespaces.get>>\n }\n generation(namespace: string) {\n return this.remember(namespace).generation\n }\n admit(namespace: string, request: Request): Response | undefined {\n if (this.privateRequest(namespace, request)) return undefined\n if (this.topology.has(namespace) || this.environment)\n return fleetError(409, \"namespace lifecycle operation in progress\", { namespace })\n if (\n this.lifecycle === \"initializing\" &&\n request.headers.get(\"x-mockingbird-initializer\") === this.initializationToken\n )\n return undefined\n if (this.lifecycle !== \"ready\" && this.lifecycle !== \"starting\")\n return fleetError(503, `fleet is ${this.lifecycle}`)\n if (\n !this.namespaces.has(namespace) &&\n this.ctx.options.limits?.maxNamespaces !== undefined &&\n this.namespaces.size + this.topology.size >= this.ctx.options.limits.maxNamespaces\n )\n return fleetError(429, \"maximum namespaces reached\")\n const entry = this.remember(namespace)\n entry.activityAt = Date.now()\n const expected = request.headers.get(\"x-mockingbird-generation\")\n if (\n ![\"GET\", \"HEAD\", \"OPTIONS\"].includes(request.method) &&\n expected !== null &&\n expected !== entry.generation\n )\n return fleetError(409, \"stale namespace generation\", { generation: entry.generation })\n const limits = this.ctx.options.limits\n if (limits)\n for (const child of this.ctx.children.values()) {\n if (\n child.protocol !== \"http\" &&\n !Object.hasOwn((child.namespaces.endpoints ?? {}) as object, namespace)\n )\n continue\n const usage = child.diagnostics(namespace)\n if (\n limits.connections !== undefined &&\n usage.activeConnections + usage.activeRequests >= limits.connections\n )\n return fleetError(429, \"namespace admission quota reached\", { namespace })\n }\n return undefined\n }\n private emit(operation: Operation) {\n this.instrumentation.phase(\n operation,\n (operation.scope ?? [operation.namespace]).some((namespace) =>\n this.ctx.recovery.has(namespace),\n ),\n )\n const event = {\n id: `${this.ctx.id}:${++this.sequence}`,\n namespace: operation.namespace,\n operation: structuredClone(operation),\n }\n this.events.push(event)\n if (this.events.length > 500) this.events.shift()\n for (const sub of this.subscribers)\n if (sub.namespace === operation.namespace) {\n const data = sub.member\n ? {\n id: event.id,\n namespace: event.namespace,\n operation: {\n id: operation.id,\n phase: operation.phase,\n status: operation.status,\n completed: operation.completed,\n total: operation.total,\n },\n }\n : event\n sub.push(`id: ${event.id}\\nevent: lifecycle\\ndata: ${JSON.stringify(data)}\\n\\n`)\n }\n }\n phase(\n namespace: string,\n phase: string,\n completed?: number,\n total?: number,\n participant?: string,\n ) {\n const operation = this.activeOperation(namespace)\n if (operation) {\n operation.phase = phase\n if (participant) operation.participant = participant\n else delete operation.participant\n if (completed !== undefined) operation.completed = completed\n if (total !== undefined) operation.total = total\n this.emit(operation)\n }\n }\n private prune() {\n const { maxCount = 50, ttlMs = 24 * 3600000 } = this.ctx.options.retention ?? {}\n const entries = [...this.ctx.checkpoints]\n for (const [id, point] of entries)\n if (Date.now() - Date.parse(point.createdAt ?? new Date().toISOString()) > ttlMs)\n this.ctx.checkpoints.delete(id)\n while (this.ctx.checkpoints.size > maxCount)\n this.ctx.checkpoints.delete(this.ctx.checkpoints.keys().next().value as string)\n }\n private select(body: Record<string, unknown>) {\n if (body.services === undefined) return this.ctx.children\n if (\n !Array.isArray(body.services) ||\n !body.services.length ||\n body.services.some((n) => typeof n !== \"string\" || !this.ctx.children.has(n))\n )\n throw new Error(\"services must be a nonempty list of configured service names\")\n return new Map(\n (body.services as string[]).map((n) => [n, this.ctx.children.get(n) as FleetChild]),\n )\n }\n private scope(namespace: string, selected: Map<string, FleetChild>) {\n for (const [name, child] of selected)\n if (\n child.protocol !== \"http\" &&\n !Object.hasOwn((child.namespaces.endpoints ?? {}) as object, namespace)\n )\n throw new Error(`namespace ${namespace} is not configured for ${name}`)\n }\n private capability() {\n return {\n version: 1,\n archiveFormat: \"mockingbird.fleet/v1\",\n archiveProtection: this.ctx.options.archiveProtection?.policy ?? { format: \"none\" },\n processId: this.ctx.id,\n authentication: [\"admin-key\", \"scoped-credential\"],\n scopes: [\"namespace\", \"services\", \"environment\"],\n routes: [\n [\"GET\", \"\"],\n [\"GET\", \"/namespaces\"],\n [\"POST\", \"/namespaces/{namespace}/fork\"],\n [\"GET\", \"/audit\"],\n [\"GET\", \"/telemetry\"],\n [\"GET\", \"/recovery\"],\n [\"POST\", \"/recovery/{id}/rollback\"],\n [\"POST\", \"/time/step-next\"],\n [\"POST\", \"/time/run-until\"],\n [\"POST\", \"/assertions/baseline\"],\n [\"POST\", \"/assertions/{id}/check\"],\n [\"POST\", \"/trace/start\"],\n [\"POST\", \"/trace/stop\"],\n [\"GET\", \"/trace\"],\n [\"POST\", \"/archives/bindings\"],\n [\"POST\", \"/namespaces/{namespace}\"],\n [\"DELETE\", \"/namespaces/{namespace}\"],\n [\"GET\", \"/namespaces/{namespace}/snapshots\"],\n [\"POST\", \"/namespaces/{namespace}/snapshots\"],\n [\"GET\", \"/namespaces/{namespace}/snapshots/{id}\"],\n [\"DELETE\", \"/namespaces/{namespace}/snapshots/{id}\"],\n [\"POST\", \"/namespaces/{namespace}/snapshots/{id}/restore\"],\n [\"GET\", \"/metrics\"],\n [\"GET\", \"/clock\"],\n [\"POST\", \"/clock\"],\n [\"POST\", \"/can-checkpoint\"],\n [\"POST\", \"/wait-until-idle\"],\n [\"POST\", \"/archives/export\"],\n [\"POST\", \"/archives/import\"],\n [\"POST\", \"/archives/inspect\"],\n [\"POST\", \"/archives/diff\"],\n [\"GET\", \"/operations\"],\n [\"GET\", \"/operations/{id}\"],\n [\"POST\", \"/operations/{id}/cancel\"],\n [\"GET\", \"/events\"],\n [\"POST\", \"/profiles/apply\"],\n [\"POST\", \"/profiles/baseline\"],\n [\"GET\", \"/scenarios\"],\n [\"POST\", \"/scenarios/{name}/apply\"],\n [\"GET\", \"/inspect\"],\n [\"GET\", \"/diagnostics\"],\n [\"POST\", \"/credentials\"],\n [\"DELETE\", \"/credentials/{id}\"],\n [\"POST\", \"/backups\"],\n [\"GET\", \"/backups\"],\n [\"GET\", \"/cleanup\"],\n [\"POST\", \"/cleanup\"],\n [\"POST\", \"/namespaces/{namespace}/policy\"],\n ].map(([method, path]) => ({ method, path })),\n services: Object.fromEntries(\n [...this.ctx.children].map(([name, c]) => [\n name,\n {\n protocol: c.protocol,\n coverage: c.coverage,\n ingress: supportsPublicIngress(c.targetName ?? \"\")\n ? ingressSupport[c.targetName as \"stripe\" | \"cognito\" | \"medplum\"]\n : ingressSupport.other,\n target: c.targetName,\n outboundPolicy: c.outboundPolicy ?? \"unsupported\",\n version: 1,\n packageVersion: c.packageVersion,\n nextEvent: Boolean(c.nextEvent),\n externalWorkerClock: \"requires explicit harness synchronization\",\n checkpoint: true,\n portable: Boolean(c.exportCheckpoint && c.importCheckpoint),\n provisioning: Boolean(c.createNamespace && c.deleteNamespace),\n inspect: Boolean(c.inspect),\n controls: c.protocol === \"http\" ? [\"clock\", \"faults\", \"latency\", \"seed\"] : [\"clock\"],\n stalePrecondition: c.protocol === \"http\",\n },\n ]),\n ),\n limits: {\n usage: {\n namespaces: this.namespaces.size,\n listeners: [...this.ctx.children.values()].reduce(\n (n, c) =>\n n +\n (c.protocol === \"http\"\n ? 1\n : Object.keys((c.namespaces.endpoints ?? {}) as object).length),\n 1,\n ),\n },\n headroom: {\n namespaces:\n this.ctx.options.limits?.maxNamespaces === undefined\n ? null\n : this.ctx.options.limits.maxNamespaces - this.namespaces.size,\n },\n checkpoints: this.ctx.options.retention?.maxCount ?? 50,\n eventHistory: 500,\n operationHistory: 200,\n idempotencyMs: 3600000,\n supportedBudgets: [\"maxNamespaces\", \"maxListeners\", \"connections\"],\n unsupportedBudgets: [\"objectBytes\", \"records\", \"pendingJobs\"],\n ...this.ctx.options.limits,\n },\n }\n }\n private action(path: string, method: string) {\n if ([\"GET\", \"HEAD\"].includes(method)) return \"read\"\n if (/\\/credentials/.test(path)) return \"credentials\"\n if (/\\/reset$/.test(path)) return \"reset\"\n if (/\\/restore$/.test(path) || path.endsWith(\"/archives/import\")) return \"restore\"\n if (/\\/snapshots/.test(path) || path.endsWith(\"/archives/export\")) return \"snapshot\"\n if (/\\/namespaces\\/[^/]+$/.test(path)) return \"namespace\"\n return \"control\"\n }\n private auth(\n request: Request,\n namespace: string,\n action: string,\n path: string,\n ): string | Response {\n const key = request.headers.get(\"x-mockingbird-admin-key\")\n const adminKey = this.ctx.config.adminKey ?? process.env.MOCKINGBIRD_ADMIN_KEY\n if (key !== null && (adminKey === undefined || key !== adminKey)) {\n const credential = this.credentials.get(digest(key))\n if (credential && credential.expiresAt > Date.now()) {\n if (\n !credential.namespaces.includes(namespace) ||\n !credential.actions.includes(action) ||\n /\\/(credentials|cleanup|backups)(\\/|$)/.test(path) ||\n [\"/fleet\", \"/fleet/namespaces\"].includes(path) ||\n path === \"/fleet/archives/import\" ||\n path === \"/fleet/archives/export\"\n )\n return fleetError(403, \"credential does not permit this scope or action\")\n return credential.id\n }\n return fleetError(401, \"invalid or expired credential\")\n }\n if (adminKey !== undefined && key !== adminKey) return fleetError(401, \"admin key required\")\n return \"admin\"\n }\n async dispatch(request: Request, fallback: () => Promise<Response>): Promise<Response> {\n const cors = this.ctx.options.cors\n const url = new URL(request.url),\n prefix = this.ctx.config.adminPrefix ?? \"/__admin\"\n const controlled =\n url.pathname === `${prefix}/fleet` ||\n url.pathname.startsWith(`${prefix}/fleet/`) ||\n url.pathname === `${prefix}/ui`\n const origin = request.headers.get(\"origin\")\n const allowed =\n controlled && cors !== undefined && origin !== null && cors.origins.includes(origin)\n const methods = cors?.methods ?? [\"GET\", \"POST\", \"DELETE\", \"OPTIONS\"]\n const headers = cors?.headers ?? [\n \"content-type\",\n \"x-mockingbird-admin-key\",\n \"x-mockingbird-namespace\",\n \"idempotency-key\",\n \"last-event-id\",\n ]\n if (controlled && cors && request.method === \"OPTIONS\" && origin !== null) {\n const method = request.headers.get(\"access-control-request-method\")\n const requested = (request.headers.get(\"access-control-request-headers\") ?? \"\")\n .split(\",\")\n .map((h) => h.trim().toLowerCase())\n .filter(Boolean)\n if (\n !allowed ||\n !method ||\n !methods.includes(method) ||\n requested.some((h) => !headers.map((v) => v.toLowerCase()).includes(h))\n )\n return fleetError(403, \"CORS preflight denied\")\n return new Response(null, {\n status: 204,\n headers: {\n \"access-control-allow-origin\": origin,\n \"access-control-allow-methods\": methods.join(\", \"),\n \"access-control-allow-headers\": headers.join(\", \"),\n vary: \"Origin, Access-Control-Request-Method, Access-Control-Request-Headers\",\n },\n })\n }\n const response = await this.dispatchControl(request, fallback)\n if (controlled && cors) {\n response.headers.append(\"vary\", \"Origin\")\n if (allowed && origin) response.headers.set(\"access-control-allow-origin\", origin)\n }\n return response\n }\n private async dispatchControl(\n request: Request,\n fallback: () => Promise<Response>,\n ): Promise<Response> {\n const url = new URL(request.url),\n prefix = this.ctx.config.adminPrefix ?? \"/__admin\"\n if (!url.pathname.startsWith(`${prefix}/`) && url.pathname !== prefix) return fallback()\n const path = url.pathname.slice(prefix.length).replace(/\\/$/, \"\")\n if (path === \"/live\" && request.method === \"GET\")\n return Response.json(\n { status: this.lifecycle === \"stopped\" ? \"stopped\" : \"alive\", id: this.ctx.id },\n { status: this.lifecycle === \"stopped\" ? 503 : 200 },\n )\n if (\n path === \"/health\" &&\n (this.lifecycle !== \"ready\" ||\n this.ctx.controlling.size ||\n this.ctx.recovery.size ||\n this.environment)\n )\n return Response.json(\n {\n status: this.ctx.recovery.size\n ? \"failed\"\n : this.ctx.controlling.size || this.environment\n ? \"maintenance\"\n : this.lifecycle,\n alive: this.lifecycle !== \"stopped\",\n operations: [...this.ctx.controlling].map(([namespace, operationId]) => ({\n namespace,\n operationId,\n })),\n fenced: [...this.ctx.recovery.keys()],\n },\n { status: 503 },\n )\n if (!path.startsWith(\"/fleet\") && path !== \"/ui\") return fallback()\n let namespace: string\n try {\n namespace = /^\\/fleet\\/namespaces\\/([^/]+)/.test(path)\n ? decodeURIComponent(path.split(\"/\")[3] as string)\n : (url.searchParams.get(\"namespace\") ??\n request.headers.get(\"x-mockingbird-namespace\") ??\n this.ctx.config.namespace ??\n \"default\")\n } catch {\n return fleetError(400, \"invalid namespace encoding\")\n }\n if (!namePattern.test(namespace)) return fleetError(400, \"invalid namespace\")\n const action = this.action(path, request.method),\n caller = this.auth(request, namespace, action, path)\n const member =\n path === \"/fleet/events\" && request.method === \"GET\" && this.ctx.options.memberStatus === true\n if (caller instanceof Response && !member) {\n const audited = await this.instrumentation.audit({\n actor: \"unauthorized\",\n namespace,\n action: `${request.method} ${this.action(path, request.method)}`,\n services: [],\n stage: \"denied\",\n })\n if (!audited) return fleetError(503, \"required audit sink unavailable\")\n return caller\n }\n let body: Record<string, unknown> = {}\n if (![\"GET\", \"HEAD\", \"DELETE\"].includes(request.method)) {\n try {\n const text = await request.clone().text()\n const parsed: unknown = text ? JSON.parse(text) : {}\n if (!object(parsed)) throw new Error()\n body = parsed\n } catch {\n return fleetError(400, \"expected JSON object\")\n }\n }\n this.prune()\n const mutating = ![\"GET\", \"HEAD\"].includes(request.method)\n const run = async () => {\n let operation: Operation | undefined\n if (\n mutating &&\n !path.includes(\"/operations/\") &&\n !path.endsWith(\"/can-checkpoint\") &&\n !path.endsWith(\"/wait-until-idle\")\n ) {\n operation = {\n id: randomUUID(),\n scope: body.allNamespaces === true ? [...this.namespaces.keys()] : [namespace],\n actor: typeof caller === \"string\" ? caller : \"member\",\n services:\n Array.isArray(body.services) &&\n body.services.every((s) => typeof s === \"string\" && this.ctx.children.has(s))\n ? (body.services as string[])\n : [...this.ctx.children.keys()],\n namespace,\n action: `${request.method} ${path}`,\n phase: \"validating\",\n startedAt: new Date().toISOString(),\n status: \"running\",\n completed: 0,\n total: this.ctx.children.size,\n }\n this.operations.set(operation.id, operation)\n this.aborts.set(operation.id, new AbortController())\n this.emit(operation)\n }\n const execute = async () => {\n try {\n if (\n operation &&\n !(await this.instrumentation.audit({\n actor: operation.actor ?? \"admin\",\n namespace,\n action,\n services: operation.services ?? [],\n operationId: operation.id,\n stage: \"attempt\",\n }))\n )\n throw new Error(\"required audit sink unavailable before mutation\")\n if (\n operation &&\n this.ctx.options.journal &&\n !path.startsWith(\"/fleet/recovery\") &&\n !path.includes(\"/assertions/\") &&\n !path.startsWith(\"/fleet/trace\")\n ) {\n if (!this.ctx.options.repository)\n throw new Error(\"durable journal requires a repository\")\n let before: string | undefined\n if (this.namespaces.has(namespace) && !this.ctx.recovery.has(namespace)) {\n const archive = await this.capture(\n body.allNamespaces === true ? [...this.namespaces.keys()] : [namespace],\n this.select(body),\n )\n before = await this.ctx.options.repository.put(archive)\n await this.ctx.options.repository.get(before)\n }\n const record: JournalRecord = {\n version: 1,\n revision: 1,\n operationId: operation.id,\n controller: this.ctx.id,\n namespace,\n scope: body.allNamespaces === true ? [...this.namespaces.keys()] : [namespace],\n action,\n phase: \"prepared\",\n timestamp: new Date().toISOString(),\n requestFingerprint: digest({ path, body, method: request.method }),\n ...(before ? { before } : {}),\n }\n await this.ctx.options.journal.write(record)\n this.durable.set(operation.id, record)\n await this.journalPhase(operation.id, \"committing\")\n }\n const result =\n (await this.handle(\n request,\n path,\n namespace,\n body,\n caller === \"admin\" && (!member || request.headers.has(\"x-mockingbird-admin-key\")),\n )) ?? (await fallback())\n if (operation) {\n operation.status = this.aborts.get(operation.id)?.signal.aborted\n ? \"cancelled\"\n : result.ok\n ? \"succeeded\"\n : \"failed\"\n operation.phase = operation.status\n operation.finishedAt = new Date().toISOString()\n const payload: unknown = await result\n .clone()\n .json()\n .catch(() => undefined)\n operation.result = object(payload)\n ? Object.fromEntries(\n Object.entries(payload).filter(([key]) =>\n [\n \"status\",\n \"id\",\n \"namespace\",\n \"failedService\",\n \"rollback\",\n \"rolledBack\",\n \"error\",\n \"sha256\",\n ].includes(key),\n ),\n )\n : { status: result.status }\n if (result.ok) operation.completed = operation.total\n await this.journalPhase(\n operation.id,\n result.ok\n ? \"succeeded\"\n : this.ctx.recovery.has(namespace)\n ? \"recovery-required\"\n : \"failed\",\n )\n if (result.ok && (action === \"reset\" || action === \"restore\")) {\n for (const record of this.interrupted.values())\n if (record.scope.includes(namespace)) {\n const scope = record.scope.filter((ns) => ns !== namespace)\n const resolved: JournalRecord = {\n ...record,\n scope,\n revision: record.revision + 1,\n phase: scope.length ? \"recovery-required\" : \"resolved\",\n resolution: `explicit-${action}`,\n timestamp: new Date().toISOString(),\n }\n try {\n await this.ctx.options.journal?.write(resolved)\n } catch (error) {\n this.fenceNamespaces(record.scope)\n throw error\n }\n if (scope.length) this.interrupted.set(record.operationId, resolved)\n else this.interrupted.delete(record.operationId)\n }\n await this.ctx.publish()\n }\n if (\n !(await this.instrumentation.audit({\n actor: operation.actor ?? \"admin\",\n namespace,\n action,\n services: operation.services ?? [],\n operationId: operation.id,\n stage: \"terminal\",\n result:\n operation.status === \"succeeded\"\n ? \"succeeded\"\n : operation.status === \"cancelled\"\n ? \"cancelled\"\n : \"failed\",\n }))\n ) {\n const fences: (() => void)[] = []\n for (const name of operation.services ?? [])\n try {\n const release = this.ctx.children.get(name)?.lock(namespace)\n if (release) fences.push(release)\n } catch {}\n this.ctx.recovery.set(namespace, fences)\n await this.journalPhase(operation.id, \"recovery-required\")\n throw new Error(\"required terminal audit unavailable; recovery required\")\n }\n result.headers.set(\"x-mockingbird-operation-id\", operation.id)\n this.emit(operation)\n if (\n result.ok &&\n request.method !== \"DELETE\" &&\n (action === \"restore\" || action === \"reset\" || action === \"namespace\")\n )\n this.remember(namespace).generation = randomUUID()\n }\n if (result.ok && request.method === \"POST\") {\n if (path === \"/fleet/clock\") this.observations.control(namespace, \"clock\", body)\n else if (/^\\/fleet\\/namespaces\\/[^/]+\\/reset$/.test(path))\n this.observations.control(namespace, \"reset\", body)\n else if (!path.startsWith(\"/fleet/trace\") && !path.includes(\"/assertions/\"))\n this.observations.unsupportedControl(namespace, action)\n }\n for (const point of this.ctx.checkpoints.values())\n if (!point.createdAt) {\n point.createdAt = new Date().toISOString()\n if (body.label !== undefined) point.label = body.label\n }\n this.prune()\n if (this.ctx.recovery.size) await this.ctx.publish()\n return result\n } catch (error) {\n if (\n operation &&\n [\"committing\", \"uploading\", \"publishing\"].includes(\n this.durable.get(operation.id)?.phase ?? \"\",\n )\n ) {\n const releases = this.ctx.recovery.get(namespace) ?? []\n for (const child of this.ctx.children.values())\n try {\n releases.push(child.lock(namespace))\n } catch {}\n this.ctx.recovery.set(namespace, releases)\n }\n if (operation) {\n operation.status = \"failed\"\n operation.phase = \"failed\"\n operation.finishedAt = new Date().toISOString()\n operation.result = {\n message: error instanceof Error ? error.message : \"operation failed\",\n }\n this.emit(operation)\n }\n if (this.ctx.recovery.size) await this.ctx.publish().catch(() => {})\n return fleetError(400, error instanceof Error ? error.message : \"invalid control\")\n } finally {\n if (operation) this.aborts.delete(operation.id)\n while (this.operations.size > 200) {\n const entry = [...this.operations].find(([, o]) => o.status !== \"running\")\n if (!entry) break\n this.operations.delete(entry[0])\n }\n }\n }\n return operation ? this.operationContext.run(operation, execute) : execute()\n }\n const key = request.headers.get(\"idempotency-key\")\n if (!key || !mutating) return run()\n if (key.length > 256) return fleetError(400, \"idempotency key too long\")\n for (const [id, kept] of this.retries) if (kept.expires < Date.now()) this.retries.delete(id)\n const scope = `${typeof caller === \"string\" ? caller : \"member\"}:${namespace}:${key}`\n const fingerprint = digest({ path, method: request.method, body })\n const existing = this.retries.get(scope)\n if (existing)\n return existing.fingerprint === fingerprint\n ? (await existing.response).clone()\n : fleetError(409, \"idempotency key reused with different request\")\n if (this.retries.size >= 1000) return fleetError(429, \"idempotency retention capacity reached\")\n const response = Promise.resolve().then(run)\n this.retries.set(scope, { fingerprint, expires: Date.now() + 3600000, response })\n return (await response).clone()\n }\n private async handle(\n request: Request,\n path: string,\n namespace: string,\n body: Record<string, unknown>,\n admin: boolean,\n ): Promise<Response | undefined> {\n const route = path.slice(\"/fleet\".length),\n method = request.method\n if (path === \"/ui\")\n return new Response(fleetConsole(this.ctx.config.adminPrefix ?? \"/__admin\"), {\n headers: { \"content-type\": \"text/html; charset=utf-8\" },\n })\n if (route === \"\" && method === \"GET\")\n return Response.json({\n ...this.capability(),\n manifest: this.ctx.manifest(),\n namespaces: this.namespaceStatus(),\n })\n if (route === \"/recovery\" && method === \"GET\")\n return admin\n ? Response.json({\n version: 1,\n interrupted: [...this.interrupted.values()],\n resumable: Boolean(this.ctx.options.journal),\n })\n : fleetError(403, \"recovery administration required\")\n const recovery = /^\\/recovery\\/([^/]+)\\/rollback$/.exec(route)\n if (recovery && method === \"POST\") {\n checked(body, [])\n if (!admin) return fleetError(403, \"recovery administration required\")\n const record = this.interrupted.get(recovery[1] as string)\n if (!record?.before || !this.ctx.options.repository || !this.ctx.options.journal)\n throw new Error(\n \"interrupted operation has no verified portable before-state; explicit namespace reset is required\",\n )\n const beforeArchive = await this.ctx.options.repository.get(record.before)\n const { sha256: _identity, ...content } = beforeArchive\n await this.restoreArchive(\n sealArchive({\n ...content,\n namespaces: Object.fromEntries(\n Object.entries(beforeArchive.namespaces).filter(([namespace]) =>\n record.scope.includes(namespace),\n ),\n ),\n }),\n )\n try {\n await this.ctx.options.journal.write({\n ...record,\n revision: record.revision + 1,\n phase: \"resolved\",\n resolution: \"explicit-restore-before\",\n timestamp: new Date().toISOString(),\n })\n } catch (error) {\n this.fenceNamespaces(record.scope)\n throw error\n }\n\n this.interrupted.delete(record.operationId)\n await this.ctx.publish()\n return Response.json({\n status: \"resolved\",\n operationId: record.operationId,\n resolution: \"restored-before-state\",\n })\n }\n if (route === \"/telemetry\" && method === \"GET\")\n return admin\n ? Response.json(this.instrumentation.snapshot())\n : fleetError(403, \"operator telemetry requires administrator scope\")\n if (route === \"/audit\" && method === \"GET\")\n return admin\n ? Response.json(this.instrumentation.auditTrail())\n : fleetError(403, \"audit trail requires administrator scope\")\n if (route === \"/namespaces\" && method === \"GET\")\n return Response.json({ namespaces: this.namespaceStatus() })\n const fork = /^\\/namespaces\\/[^/]+\\/fork$/.test(route)\n if (fork && method === \"POST\") {\n checked(body, [\"destination\", \"bindings\"])\n if (!admin) return fleetError(403, \"namespace fork requires administrator scope\")\n if (typeof body.destination !== \"string\" || !namePattern.test(body.destination))\n throw new Error(\"destination namespace required\")\n const destination = body.destination\n if (this.namespaces.has(destination))\n return fleetError(409, \"destination namespace already exists\")\n return this.withEnvironment([namespace, destination], this.ctx.children, async () => {\n let archive = await this.capture([namespace])\n let bindings: unknown = {\n changes: [],\n limitations: [\"opaque namespace-bearing keys and application credentials are unchanged\"],\n }\n if (body.bindings !== undefined) {\n const prepared = await planRestoreBindings(\n archive,\n body.bindings as RestoreBindings,\n this.ctx.options.resolveArchiveSecret,\n )\n archive = prepared.archive\n bindings = prepared.report\n }\n await this.restoreArchive(rebaseArchiveNamespace(archive, namespace, destination))\n return Response.json(\n {\n namespace: destination,\n generation: this.generation(destination),\n manifest: this.ctx.manifest(),\n bindings,\n connections: Object.fromEntries(\n [...this.ctx.children].map(([name, child]) => [\n name,\n child.connections?.[destination] ??\n `${child.url}${this.ctx.config.adminPrefix ?? \"/__admin\"}/ns/${destination}`,\n ]),\n ),\n },\n { status: 201 },\n )\n })\n }\n if (route === \"/archives/bindings\" && method === \"POST\") {\n if (!admin) return fleetError(403, \"restore binding plans require administrator scope\")\n checked(body, [\"archive\", \"plan\"])\n const prepared = await planRestoreBindings(\n body.archive,\n body.plan as RestoreBindings,\n this.ctx.options.resolveArchiveSecret,\n )\n return Response.json(prepared.report)\n }\n if (route === \"/assertions/baseline\" && method === \"POST\") {\n checked(body, [\"services\"])\n const selected = this.select(body)\n this.scope(namespace, selected)\n return Response.json(this.observations.baseline(namespace, [...selected.keys()]))\n }\n const assertion = /^\\/assertions\\/([^/]+)\\/check$/.exec(route)\n if (assertion && method === \"POST\") {\n checked(body, [\"allowances\", \"allowCheckpointablePending\"])\n if (\n body.allowCheckpointablePending !== undefined &&\n typeof body.allowCheckpointablePending !== \"boolean\"\n )\n throw new Error(\"allowCheckpointablePending must be boolean\")\n const diagnostics = Object.fromEntries(\n [...this.ctx.children]\n .filter(\n ([, child]) =>\n child.protocol === \"http\" ||\n Object.hasOwn((child.namespaces.endpoints ?? {}) as object, namespace),\n )\n .map(([name, child]) => [name, child.diagnostics(namespace)]),\n )\n const report = this.observations.assertClean(\n assertion[1] as string,\n namespace,\n diagnostics,\n body as { allowances?: AssertionAllowance[]; allowCheckpointablePending?: boolean },\n )\n return Response.json(report, { status: report.clean ? 200 : 409 })\n }\n if (route.startsWith(\"/trace\")) {\n if (!admin) return fleetError(403, \"trace capture requires administrator scope\")\n if (!this.ctx.options.trace) return fleetError(400, \"trace capture is not enabled\")\n if (route === \"/trace/start\" && method === \"POST\") {\n checked(body, [\"includeBodies\"])\n if (body.includeBodies !== undefined && typeof body.includeBodies !== \"boolean\")\n throw new Error(\"includeBodies must be boolean\")\n const baseline = await this.capture([namespace])\n const limitations = [...this.ctx.children.values()].some(\n (child) => child.protocol !== \"http\",\n )\n ? [\"protocol/external interactions are not captured\"]\n : []\n return Response.json(\n this.observations.startTrace(\n namespace,\n baseline,\n body.includeBodies === true,\n limitations,\n ),\n )\n }\n if (route === \"/trace\" && method === \"GET\")\n return Response.json(this.observations.trace(namespace))\n if (route === \"/trace/stop\" && method === \"POST\") {\n checked(body, [])\n return Response.json(this.observations.trace(namespace, true))\n }\n }\n const nsRoute = /^\\/namespaces\\/([^/]+)$/.exec(route)\n if (nsRoute && method === \"POST\") {\n checked(body, [\"baseline\"])\n if (body.baseline !== undefined && typeof body.baseline !== \"string\")\n throw new Error(\"baseline must be a checkpoint id\")\n return this.createNamespace(namespace, body.baseline as string | undefined)\n }\n if (nsRoute && method === \"DELETE\") return this.deleteNamespace(namespace)\n if (/^\\/namespaces\\/[^/]+\\/policy$/.test(route) && method === \"POST\") {\n checked(body, [\"pinned\", \"expiresInMs\"])\n if (body.pinned !== undefined && typeof body.pinned !== \"boolean\")\n throw new Error(\"pinned must be boolean\")\n if (\n body.expiresInMs !== undefined &&\n (typeof body.expiresInMs !== \"number\" ||\n !Number.isSafeInteger(body.expiresInMs) ||\n body.expiresInMs < 1 ||\n body.expiresInMs > 86400000)\n )\n throw new Error(\"expiry must be within one host day\")\n if (body.pinned === undefined && body.expiresInMs === undefined)\n throw new Error(\"namespace policy required\")\n if (typeof body.pinned === \"boolean\") this.remember(namespace).pinned = body.pinned\n if (typeof body.expiresInMs === \"number\") {\n this.remember(namespace).expiresAt = Date.now() + body.expiresInMs\n if (!this.expiryTimer) {\n this.expiryTimer = setInterval(\n () => {\n for (const entry of this.cleanupPreview())\n if (entry.eligible) void this.deleteNamespace(entry.namespace).catch(() => {})\n },\n Math.max(10, Math.min(60000, body.expiresInMs as number)),\n )\n this.expiryTimer.unref?.()\n }\n }\n return Response.json({ namespace, ...this.remember(namespace) })\n }\n const snapshot = /^\\/namespaces\\/[^/]+\\/snapshots(?:\\/([^/]+))?$/.exec(route)\n if (snapshot && (method === \"GET\" || method === \"DELETE\")) {\n const info = (id: string, p: Point) => ({\n id,\n namespace: p.namespace,\n label: p.label,\n createdAt: p.createdAt,\n services: [...p.values.keys()],\n portable: [...p.values.keys()].every((s) =>\n Boolean(this.ctx.children.get(s)?.exportCheckpoint),\n ),\n })\n if (!snapshot[1]) {\n if (method !== \"GET\") return fleetError(405, \"select a checkpoint to delete\")\n return Response.json({\n snapshots: [...this.ctx.checkpoints]\n .filter(([, p]) => p.namespace === namespace)\n .map(([id, p]) => info(id, p)),\n })\n }\n const point = this.ctx.checkpoints.get(snapshot[1])\n if (!point || point.namespace !== namespace)\n return fleetError(404, \"no checkpoint in this namespace\")\n if (method === \"DELETE\") this.ctx.checkpoints.delete(snapshot[1])\n return Response.json(\n method === \"DELETE\" ? { status: \"deleted\", id: snapshot[1] } : info(snapshot[1], point),\n )\n }\n if ((route === \"/time/step-next\" || route === \"/time/run-until\") && method === \"POST\") {\n checked(body, [\"services\", \"condition\", \"maxEvents\", \"maxAdvanceMs\", \"timeoutMs\"])\n const selected = this.select(body)\n this.scope(namespace, selected)\n const controller = new FleetTimeController({\n clock: this.ctx.clock,\n transaction: this.ctx.transaction,\n phase: (ns, phase, done, total) => this.phase(ns, phase, done, total),\n recovery: this.ctx.recovery,\n ...(this.ctx.options.synchronizeClock\n ? { synchronize: this.ctx.options.synchronizeClock }\n : {}),\n })\n return controller.run(namespace, selected, body, route === \"/time/step-next\")\n }\n if (route === \"/can-checkpoint\" && method === \"POST\") {\n checked(body, [\"services\", \"timeoutMs\"])\n if (\n body.timeoutMs !== undefined &&\n (typeof body.timeoutMs !== \"number\" || body.timeoutMs < 0 || body.timeoutMs > 30000)\n )\n throw new Error(\"timeoutMs must be between 0 and 30000\")\n const selected = this.select(body)\n this.scope(namespace, selected)\n const until = Date.now() + ((body.timeoutMs as number) ?? 0)\n for (;;) {\n const services = Object.fromEntries(\n [...selected].map(([n, c]) => {\n const d = c.diagnostics(namespace)\n return [\n n,\n {\n ...d,\n checkpointReady:\n d.activeRequests + d.blockedCommands + d.pendingWebhooks + (d.activeJobs ?? 0) ===\n 0,\n idle:\n d.activeRequests + d.blockedCommands + d.pendingWebhooks + d.pendingJobs === 0,\n },\n ]\n }),\n )\n const ready =\n !this.ctx.controlling.has(namespace) &&\n !this.ctx.recovery.has(namespace) &&\n Object.values(services).every((d) => d.checkpointReady)\n if (ready || Date.now() >= until)\n return Response.json(\n { namespace, checkpointReady: ready, services },\n { status: ready ? 200 : 409 },\n )\n await new Promise((r) => setTimeout(r, 10))\n }\n }\n if (route === \"/operations\" && method === \"GET\")\n return Response.json({\n operations: [...this.operations.values()].filter((o) => o.namespace === namespace),\n })\n const operationRoute = /^\\/operations\\/([^/]+)(\\/cancel)?$/.exec(route)\n if (operationRoute) {\n const op = this.operations.get(operationRoute[1] as string)\n if (!op || op.namespace !== namespace) return fleetError(404, \"operation not found\")\n if (operationRoute[2] && method === \"POST\") {\n checked(body, [])\n if (\n op.status !== \"running\" ||\n ![\"validating\", \"preparing\", \"checkpointing\"].includes(op.phase)\n )\n return fleetError(409, \"operation has passed cancellable phase\")\n this.aborts.get(op.id)?.abort()\n return Response.json({ id: op.id, cancellationRequested: true })\n }\n if (method === \"GET\") return Response.json(op)\n }\n if (route === \"/events\" && method === \"GET\") {\n const cursor = request.headers.get(\"last-event-id\")\n const encode = new TextEncoder()\n let subscription: { namespace: string; member: boolean; push(event: string): void }\n let heartbeat: ReturnType<typeof setInterval>\n const cleanup = () => {\n if (subscription) this.subscribers.delete(subscription)\n clearInterval(heartbeat)\n }\n const stream = new ReadableStream<Uint8Array>({\n start: (controller) => {\n subscription = {\n namespace,\n member: this.ctx.options.memberStatus === true && !admin,\n push: (event) => {\n if ((controller.desiredSize ?? 0) < -32) {\n cleanup()\n controller.close()\n } else controller.enqueue(encode.encode(event))\n },\n }\n this.subscribers.add(subscription)\n const at = this.events.findIndex((e) => e.id === cursor)\n if (cursor === null || at < 0)\n subscription.push(\n `event: resync\\ndata: ${JSON.stringify({ processId: this.ctx.id, namespace, generation: this.generation(namespace), lifecycle: this.lifecycle })}\\n\\n`,\n )\n for (const event of this.events.slice(at < 0 ? 0 : at + 1))\n if (event.namespace === namespace) {\n const data =\n this.ctx.options.memberStatus && !admin\n ? {\n id: event.id,\n namespace,\n operation: {\n id: event.operation.id,\n phase: event.operation.phase,\n status: event.operation.status,\n completed: event.operation.completed,\n total: event.operation.total,\n },\n }\n : event\n subscription.push(\n `id: ${event.id}\\nevent: lifecycle\\ndata: ${JSON.stringify(data)}\\n\\n`,\n )\n }\n heartbeat = setInterval(() => subscription.push(\": heartbeat\\n\\n\"), 15000)\n heartbeat.unref?.()\n request.signal.addEventListener(\n \"abort\",\n () => {\n cleanup()\n try {\n controller.close()\n } catch {}\n },\n { once: true },\n )\n },\n cancel: cleanup,\n })\n return new Response(stream, {\n headers: { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-cache\" },\n })\n }\n if (route === \"/archives/export\" && method === \"POST\") {\n checked(body, [\"services\", \"allNamespaces\"])\n if (body.allNamespaces !== undefined && typeof body.allNamespaces !== \"boolean\")\n throw new Error(\"allNamespaces must be boolean\")\n const archive = await this.capture(\n body.allNamespaces === true ? [...this.namespaces.keys()] : [namespace],\n this.select(body),\n )\n return Response.json(\n this.ctx.options.archiveProtection\n ? await this.ctx.options.archiveProtection.seal(archive)\n : archive,\n )\n }\n if (route === \"/archives/import\" && method === \"POST\") {\n checked(body, [\"archive\", \"namespace\", \"bindings\"])\n let archive = this.ctx.options.archiveProtection\n ? await this.ctx.options.archiveProtection.open(body.archive)\n : validateArchive(body.archive)\n if (\n body.namespace !== undefined &&\n (typeof body.namespace !== \"string\" || !namePattern.test(body.namespace))\n )\n throw new Error(\"invalid selected archive namespace\")\n if (body.bindings !== undefined)\n archive = (\n await planRestoreBindings(\n archive,\n body.bindings as RestoreBindings,\n this.ctx.options.resolveArchiveSecret,\n )\n ).archive\n await this.restoreArchive(archive, body.namespace as string | undefined)\n return Response.json({\n status: \"restored\",\n sha256: archive.sha256,\n namespaces: body.namespace ? [body.namespace] : Object.keys(archive.namespaces),\n })\n }\n if (route === \"/archives/inspect\" && method === \"POST\") {\n checked(body, [\"archive\"])\n return Response.json(inspectArchive(body.archive))\n }\n if (route === \"/archives/diff\" && method === \"POST\") {\n checked(body, [\"left\", \"right\", \"namespace\", \"service\", \"values\", \"limit\"])\n if (\n (body.values !== undefined && typeof body.values !== \"boolean\") ||\n (body.limit !== undefined &&\n (typeof body.limit !== \"number\" ||\n !Number.isInteger(body.limit) ||\n body.limit < 1 ||\n body.limit > 1000))\n )\n throw new Error(\"invalid diff options\")\n return Response.json(\n diffArchives(\n body.left,\n body.right,\n body as { namespace?: string; service?: string; values?: boolean; limit?: number },\n ),\n )\n }\n if (route === \"/profiles/apply\" && method === \"POST\") {\n checked(body, [\"name\", \"profile\"])\n const profile =\n typeof body.name === \"string\" ? this.ctx.options.profiles?.[body.name] : body.profile\n return this.applyProfile(namespace, profile)\n }\n if (route === \"/profiles/baseline\" && method === \"POST\") {\n checked(body, [\"services\"])\n return this.applyProfile(\n namespace,\n Object.fromEntries(\n [...this.select(body)].map(([name, c]) => [\n name,\n c.protocol === \"http\" ? { faults: [], latency: 0 } : {},\n ]),\n ),\n )\n }\n if (route === \"/scenarios\" && method === \"GET\")\n return Response.json({\n scenarios: Object.entries(this.ctx.options.scenarios ?? {}).map(([name, b]) => ({\n name,\n format: b.format,\n version: b.version,\n description: b.description,\n services: Object.keys(b.services),\n })),\n })\n const scenario = /^\\/scenarios\\/([^/]+)\\/apply$/.exec(route)\n if (scenario && method === \"POST\") {\n checked(body, [])\n const bundle = this.ctx.options.scenarios?.[scenario[1] as string]\n if (\n bundle?.format !== \"mockingbird.scenario/v1\" ||\n !Number.isSafeInteger(bundle.version) ||\n bundle.version < 1\n )\n throw new Error(\"unknown or incompatible scenario bundle\")\n for (const [name, entry] of Object.entries(bundle.services))\n if (this.ctx.children.get(name)?.protocol !== entry.protocol)\n throw new Error(`incompatible scenario service ${name}`)\n for (const [name, entry] of Object.entries(bundle.services))\n if (entry.fixtures !== undefined) {\n const child = this.ctx.children.get(name)\n if (entry.protocol !== \"http\" || !child?.importCheckpoint)\n throw new Error(`scenario fixtures unsupported for ${name}`)\n await child.importCheckpoint(namespace, {\n format: \"mockingbird.snapshot/v1\",\n service: name,\n records: entry.fixtures,\n })\n }\n const profile = Object.fromEntries(\n Object.entries(bundle.services).map(([name, entry]) => [\n name,\n {\n ...entry.controls,\n ...(bundle.seed !== undefined && entry.protocol === \"http\"\n ? { seed: bundle.seed }\n : {}),\n ...(bundle.clock ? { clock: bundle.clock } : {}),\n },\n ]),\n )\n const response = await this.applyProfile(\n namespace,\n profile,\n async (name, child) => {\n const fixtures = bundle.services[name]?.fixtures\n if (fixtures !== undefined) {\n if (!child.configure) throw new Error(`fixtures unsupported for ${name}`)\n const document = { format: \"mockingbird.snapshot/v1\", service: name, records: fixtures }\n await child.configure(namespace, { snapshot: document })\n }\n },\n bundle.seedApplication,\n )\n return response\n }\n if (route === \"/inspect\" && method === \"GET\") {\n const url = new URL(request.url),\n service = url.searchParams.get(\"service\")\n const child = service ? this.ctx.children.get(service) : undefined\n if (!child?.inspect) return fleetError(400, \"service inspection is unsupported\")\n const offset = Number(url.searchParams.get(\"offset\") ?? 0),\n limit = Number(url.searchParams.get(\"limit\") ?? 100)\n if (\n !Number.isInteger(offset) ||\n offset < 0 ||\n !Number.isInteger(limit) ||\n limit < 1 ||\n limit > 1000\n )\n throw new Error(\"invalid pagination\")\n this.scope(namespace, new Map([[service as string, child]]))\n const collection = url.searchParams.get(\"collection\")\n return Response.json({\n namespace,\n service,\n result: await child.inspect(namespace, {\n offset,\n limit,\n ...(collection !== null ? { collection } : {}),\n }),\n })\n }\n if (route === \"/diagnostics\" && method === \"GET\") {\n const selected = new URL(request.url).searchParams.getAll(\"service\")\n const children = selected.length ? this.select({ services: selected }) : this.ctx.children\n this.scope(namespace, children)\n return Response.json({\n format: \"mockingbird.diagnostics/v1\",\n createdAt: new Date().toISOString(),\n processId: this.ctx.id,\n namespace,\n generation: this.generation(namespace),\n configurationFingerprint: digest(this.ctx.config),\n capabilities: this.capability(),\n services: Object.fromEntries(\n [...children].map(([name, c]) => [\n name,\n {\n protocol: c.protocol,\n diagnostics: c.diagnostics(namespace),\n unmatched: c.unmatched?.(namespace, 50),\n },\n ]),\n ),\n operations: [...this.operations.values()]\n .filter((o) => o.namespace === namespace)\n .slice(-50)\n .map(({ id, phase, action, status, startedAt, finishedAt }) => ({\n id,\n phase,\n action,\n status,\n startedAt,\n finishedAt,\n })),\n truncated:\n [...this.operations.values()].filter((o) => o.namespace === namespace).length > 50,\n excluded: [\"credentials\", \"requestBodies\", \"records\", \"modelText\", \"operationPayloads\"],\n })\n }\n if (route === \"/credentials\" && method === \"POST\") {\n checked(body, [\"namespaces\", \"actions\", \"ttlMs\"])\n if (!admin) return fleetError(403, \"admin credential required\")\n if (\n !Array.isArray(body.namespaces) ||\n !body.namespaces.length ||\n body.namespaces.some((n) => typeof n !== \"string\" || !namePattern.test(n)) ||\n !Array.isArray(body.actions) ||\n !body.actions.length ||\n body.actions.some(\n (a) => ![\"read\", \"reset\", \"restore\", \"snapshot\", \"control\"].includes(String(a)),\n ) ||\n typeof body.ttlMs !== \"number\" ||\n body.ttlMs <= 0 ||\n body.ttlMs > 86400000\n )\n throw new Error(\"expected namespaces, actions and ttlMs (at most one day)\")\n const credential = randomBytes(32).toString(\"base64url\"),\n id = randomUUID(),\n expiresAt = Date.now() + body.ttlMs\n this.credentials.set(digest(credential), {\n id,\n namespaces: body.namespaces as string[],\n actions: body.actions as string[],\n expiresAt,\n })\n return Response.json({ id, credential, expiresAt }, { status: 201 })\n }\n const credential = /^\\/credentials\\/([^/]+)$/.exec(route)\n if (credential && method === \"DELETE\") {\n if (!admin) return fleetError(403, \"admin credential required\")\n for (const [key, c] of this.credentials)\n if (c.id === credential[1]) {\n this.credentials.delete(key)\n return Response.json({ status: \"revoked\", id: c.id })\n }\n return fleetError(404, \"credential not found\")\n }\n if (route === \"/backups\" && method === \"GET\")\n return Response.json({\n ...this.backupStatus,\n running: this.backupRunning,\n archives: (await this.ctx.options.repository?.list()) ?? [],\n })\n if (route === \"/backups\" && method === \"POST\") {\n checked(body, [\"allNamespaces\"])\n return Response.json(\n await this.backup(\n body.allNamespaces === true ? [...this.namespaces.keys()] : [namespace],\n [...this.operations.values()]\n .reverse()\n .find((o) => o.status === \"running\" && o.namespace === namespace)?.id,\n ),\n )\n }\n if (route === \"/cleanup\" && method === \"GET\")\n return Response.json({ candidates: this.cleanupPreview() })\n if (route === \"/cleanup\" && method === \"POST\") {\n checked(body, [])\n const results: Record<string, unknown> = {}\n for (const entry of this.cleanupPreview())\n if (entry.eligible) {\n try {\n if (this.ctx.options.expiry?.finalBackup) await this.backup([entry.namespace])\n const response = await this.deleteNamespace(entry.namespace)\n results[entry.namespace] = { status: response.status, result: await response.json() }\n } catch (error) {\n results[entry.namespace] = {\n status: \"failed\",\n message: error instanceof Error ? error.message : \"cleanup failed\",\n }\n }\n }\n return Response.json({ results })\n }\n return undefined\n }\n private namespaceStatus() {\n return [...this.namespaces].map(([namespace, state]) => ({\n namespace,\n ...state,\n status: this.ctx.recovery.has(namespace)\n ? \"failed\"\n : this.ctx.controlling.has(namespace) || this.topology.has(namespace)\n ? \"maintenance\"\n : \"ready\",\n operationId: this.ctx.controlling.get(namespace),\n expiresAt:\n state.expiresAt ??\n (this.ctx.options.expiry\n ? Math.max(\n state.activityAt,\n ...[...this.ctx.children.values()].map((c) => c.lastActivity?.(namespace) ?? 0),\n ) + this.ctx.options.expiry.idleMs\n : undefined),\n }))\n }\n private busy(namespace: string, selected = this.ctx.children) {\n return [...selected]\n .filter(([, c]) => {\n const d = c.diagnostics(namespace)\n return d.activeRequests + d.blockedCommands + d.pendingWebhooks + (d.activeJobs ?? 0) > 0\n })\n .map(([name]) => name)\n }\n async hook(\n phase: \"prepare\" | \"verify\" | \"resume\",\n namespace: string,\n selected: Map<string, FleetChild>,\n ) {\n const hook = this.ctx.options.workload?.[phase]\n const op = this.activeOperation(namespace)\n this.phase(\n namespace,\n phase === \"prepare\" ? \"preparing\" : phase === \"verify\" ? \"verifying\" : \"resuming\",\n )\n const controller = op ? this.aborts.get(op.id) : new AbortController()\n if (controller?.signal.aborted && phase !== \"resume\")\n throw new Error(\"operation cancelled before commit\")\n if (!hook) return\n const timeout = AbortSignal.timeout(this.ctx.options.hookTimeoutMs ?? 30000)\n const signal =\n controller && !controller.signal.aborted\n ? AbortSignal.any([controller.signal, timeout])\n : timeout\n await Promise.race([\n hook({\n namespace,\n services: [...selected.keys()],\n signal,\n operationId: op?.id ?? randomUUID(),\n }),\n new Promise<never>((_, reject) =>\n signal.addEventListener(\n \"abort\",\n () => reject(new Error(`${phase} hook aborted or timed out`)),\n { once: true },\n ),\n ),\n ])\n }\n async createNamespace(namespace: string, baseline?: string): Promise<Response> {\n if (this.environment && !this.ownsEnvironment())\n return fleetError(409, \"environment operation in progress\")\n if (this.namespaces.has(namespace) || this.topology.has(namespace))\n return fleetError(409, \"namespace already exists or is provisioning\")\n if (this.ctx.controlling.has(namespace))\n return fleetError(409, \"namespace operation in progress\", {\n operationId: this.ctx.controlling.get(namespace),\n })\n const limits = this.ctx.options.limits\n if (\n limits?.maxNamespaces !== undefined &&\n this.namespaces.size + this.topology.size >= limits.maxNamespaces\n )\n return fleetError(429, \"maximum namespaces reached\")\n const protocolCount = [...this.ctx.children.values()].filter(\n (c) => c.protocol !== \"http\",\n ).length\n const listenerCount = [...this.ctx.children.values()].reduce(\n (n, c) =>\n n +\n (c.protocol === \"external\"\n ? 0\n : c.protocol === \"http\"\n ? 1\n : Object.keys((c.namespaces.endpoints ?? {}) as object).length),\n 1,\n )\n if (\n limits?.maxListeners !== undefined &&\n listenerCount + (this.topology.size + 1) * protocolCount > limits.maxListeners\n )\n return fleetError(429, \"maximum listeners reached\")\n for (const [name, c] of this.ctx.children)\n if (!c.createNamespace || !c.deleteNamespace)\n throw new Error(`namespace provisioning unsupported for ${name}`)\n const point = baseline ? this.ctx.checkpoints.get(baseline) : undefined\n if (baseline && !point) throw new Error(\"baseline checkpoint not found\")\n this.topology.add(namespace)\n const created: FleetChild[] = []\n try {\n this.phase(namespace, \"provisioning\")\n // Decode a baseline through each child's portable format so namespace identities are rebased.\n const docs = new Map<string, unknown>()\n if (point)\n for (const [name, value] of point.values) {\n const child = this.ctx.children.get(name)\n if (!child?.exportCheckpoint || !child.importCheckpoint)\n throw new Error(`portable baseline unsupported for ${name}`)\n docs.set(name, await child.exportCheckpoint(point.namespace, value))\n }\n for (const [name, child] of this.ctx.children) {\n await child.createNamespace?.(namespace)\n created.push(child)\n if (docs.has(name))\n await child.restore(namespace, await child.importCheckpoint?.(namespace, docs.get(name)))\n }\n if (point) restoreClock(this.ctx.clock(namespace), point.clock)\n this.remember(namespace)\n await this.ctx.publish()\n return Response.json(\n {\n namespace,\n generation: this.generation(namespace),\n manifest: this.ctx.manifest(),\n connections: Object.fromEntries(\n [...this.ctx.children].map(([n, c]) => [\n n,\n c.connections?.[namespace] ??\n `${c.url}${this.ctx.config.adminPrefix ?? \"/__admin\"}/ns/${encodeURIComponent(namespace)}`,\n ]),\n ),\n },\n { status: 201 },\n )\n } catch (error) {\n const results = await Promise.allSettled(\n created.reverse().map((c) => c.deleteNamespace?.(namespace)),\n )\n this.namespaces.delete(namespace)\n if (results.some((r) => r.status === \"rejected\"))\n return fleetError(500, \"namespace provisioning cleanup failed\", {\n namespace,\n recoveryRequired: true,\n })\n throw error\n } finally {\n this.topology.delete(namespace)\n }\n }\n private async deleteNamespace(namespace: string): Promise<Response> {\n if (this.environment && !this.ownsEnvironment())\n return fleetError(409, \"environment operation in progress\")\n if (namespace === \"default\") return fleetError(409, \"default namespace cannot be deleted\")\n if (!this.namespaces.has(namespace)) return fleetError(404, \"namespace not found\")\n if (this.remember(namespace).pinned) return fleetError(409, \"namespace is pinned\")\n if (\n this.topology.has(namespace) ||\n this.ctx.controlling.has(namespace) ||\n this.ctx.recovery.has(namespace)\n )\n return fleetError(409, \"namespace is busy or requires recovery\")\n this.scope(namespace, this.ctx.children)\n const busy = this.busy(namespace)\n // Connections are rejected on deletion, even for otherwise checkpointable idle Redis clients.\n for (const [name, c] of this.ctx.children)\n if (c.diagnostics(namespace).activeConnections) busy.push(name)\n if (busy.length)\n return fleetError(409, \"namespace has active work or clients\", {\n services: [...new Set(busy)],\n })\n const selected = this.ctx.children\n for (const [name, child] of selected)\n if (\n !child.deleteNamespace ||\n !child.createNamespace ||\n !child.exportCheckpoint ||\n !child.importCheckpoint\n )\n throw new Error(`transactional namespace deletion unsupported for ${name}`)\n this.topology.add(namespace)\n const release: (() => void)[] = []\n const documents = new Map<string, unknown>()\n const deleted = new Set<string>()\n const original = { ...this.remember(namespace) }\n try {\n for (const child of selected.values()) release.push(child.lock(namespace))\n if (this.busy(namespace).length)\n return fleetError(409, \"namespace acquired active work before deletion\")\n for (const [name, child] of selected)\n documents.set(\n name,\n await child.exportCheckpoint?.(namespace, await child.checkpoint(namespace)),\n )\n for (const [name, child] of selected) {\n await child.deleteNamespace?.(namespace)\n deleted.add(name)\n }\n this.namespaces.delete(namespace)\n await this.ctx.publish()\n for (const [id, p] of this.ctx.checkpoints)\n if (p.namespace === namespace) this.ctx.checkpoints.delete(id)\n return Response.json({ status: \"deleted\", namespace })\n } catch (error) {\n const rollback: Record<string, string> = {}\n for (const [name, child] of selected)\n if (documents.has(name)) {\n try {\n if (\n deleted.has(name) ||\n (child.protocol !== \"http\" &&\n !Object.hasOwn((child.namespaces.endpoints ?? {}) as object, namespace))\n )\n await child.createNamespace?.(namespace)\n await child.restore(\n namespace,\n await child.importCheckpoint?.(namespace, documents.get(name)),\n )\n rollback[name] = \"restored\"\n } catch {\n rollback[name] = \"failed\"\n }\n }\n this.namespaces.set(namespace, original)\n if (Object.values(rollback).includes(\"failed\")) {\n const fences: (() => void)[] = []\n for (const child of selected.values())\n try {\n fences.push(child.lock(namespace))\n } catch {}\n this.ctx.recovery.set(namespace, fences)\n }\n await this.ctx.publish().catch(() => {})\n return fleetError(500, error instanceof Error ? error.message : \"namespace deletion failed\", {\n namespace,\n rollback,\n rolledBack: Object.values(rollback).every((v) => v === \"restored\"),\n })\n } finally {\n for (const unlock of release.reverse()) unlock()\n this.topology.delete(namespace)\n }\n }\n\n async capture(namespaces: string[], selected = this.ctx.children): Promise<FleetArchive> {\n if (namespaces.length > 1 && !this.ownsEnvironment())\n return this.withEnvironment(namespaces, selected, () => this.capture(namespaces, selected))\n const contents: FleetArchive[\"namespaces\"] = {}\n for (const [name, child] of selected)\n if (!child.exportCheckpoint || !child.importCheckpoint)\n throw new Error(`portable snapshots unsupported for ${name}`)\n for (const namespace of namespaces) {\n this.scope(namespace, selected)\n const services: FleetArchive[\"namespaces\"][string][\"services\"] = {}\n const response = await this.ctx.transaction(namespace, selected, async (name, child) => {\n const point = await child.checkpoint(namespace)\n services[name] = {\n protocol: child.protocol,\n target: child.targetName ?? name,\n version: 1,\n ...(child.packageVersion ? { packageVersion: child.packageVersion } : {}),\n state: await child.exportCheckpoint?.(namespace, point),\n }\n })\n if (!response.ok)\n throw new Error(`capture ${namespace} refused: ${canonical(await response.json())}`)\n contents[namespace] = { clock: this.ctx.clock(namespace).state(), services }\n }\n return sealArchive({\n format: \"mockingbird.fleet/v1\",\n createdAt: new Date().toISOString(),\n sourceId: this.ctx.id,\n ...(this.ctx.options.archiveCompatibility\n ? { compatibility: structuredClone(this.ctx.options.archiveCompatibility.tags) }\n : {}),\n namespaces: contents,\n })\n }\n async restoreArchive(input: FleetArchive, selectedNamespace?: string): Promise<void> {\n const archive = assertArchiveCompatibility(input, this.ctx.options.archiveCompatibility)\n const entries = Object.entries(archive.namespaces).filter(\n ([ns]) => selectedNamespace === undefined || ns === selectedNamespace,\n )\n if (!entries.length) throw new Error(\"selected namespace absent from archive\")\n if (entries.length > 1 && !this.ownsEnvironment()) {\n const selected = new Map(\n [...new Set(entries.flatMap(([, ns]) => Object.keys(ns.services)))].map((name) => [\n name,\n this.ctx.children.get(name) as FleetChild,\n ]),\n )\n for (const [name, child] of selected)\n if (!child) throw new Error(`unsupported archive service ${name}`)\n return this.withEnvironment(\n entries.map(([ns]) => ns),\n selected,\n () => this.restoreArchive(archive, selectedNamespace),\n )\n }\n // Decode every child before creating a namespace or changing any live state.\n for (const [namespace, ns] of entries)\n for (const [name, state] of Object.entries(ns.services)) {\n const child = this.ctx.children.get(name)\n if (\n !child ||\n child.protocol !== state.protocol ||\n !child.importCheckpoint ||\n (state.target ?? name) !== (child.targetName ?? name)\n )\n throw new Error(`unsupported archive service ${name}`)\n await child.importCheckpoint(namespace, state.state)\n }\n const rollback: {\n namespace: string\n selected: Map<string, FleetChild>\n values: Map<string, unknown>\n clock: ReturnType<Clock[\"state\"]>\n }[] = []\n const created: string[] = []\n try {\n for (const [namespace, ns] of entries) {\n if (!this.namespaces.has(namespace)) {\n const response = await this.createNamespace(namespace)\n if (!response.ok)\n throw new Error(`namespace creation refused: ${canonical(await response.json())}`)\n created.push(namespace)\n }\n const selected = new Map(\n Object.keys(ns.services).map((name) => [name, this.ctx.children.get(name) as FleetChild]),\n )\n const values = new Map<string, unknown>()\n const oldClock = this.ctx.clock(namespace).state()\n const response = await this.ctx.transaction(\n namespace,\n selected,\n async (name, child) => {\n values.set(name, await child.checkpoint(namespace))\n await child.restore(\n namespace,\n await child.importCheckpoint?.(namespace, ns.services[name]?.state),\n )\n },\n true,\n )\n if (!response.ok)\n throw new Error(`restore ${namespace} failed: ${canonical(await response.json())}`)\n rollback.push({ namespace, selected, values, clock: oldClock })\n restoreClock(this.ctx.clock(namespace), ns.clock)\n this.remember(namespace).generation = randomUUID()\n }\n } catch (error) {\n const failures: string[] = []\n for (const point of rollback.reverse()) {\n const response = await this.ctx.transaction(\n point.namespace,\n point.selected,\n async (name, child) => child.restore(point.namespace, point.values.get(name)),\n true,\n )\n if (!response.ok) failures.push(point.namespace)\n else restoreClock(this.ctx.clock(point.namespace), point.clock)\n }\n for (const namespace of created.reverse()) {\n const response = await this.deleteNamespace(namespace)\n if (!response.ok) failures.push(namespace)\n }\n if (failures.length)\n throw new Error(`archive rollback requires recovery for ${failures.join(\", \")}`, {\n cause: error,\n })\n throw error\n }\n }\n private async applyProfile(\n namespace: string,\n input: unknown,\n extra?: (name: string, child: FleetChild) => Promise<void>,\n seedApplication?: ScenarioBundle[\"seedApplication\"],\n ) {\n if (!object(input) || !Object.keys(input).length)\n throw new Error(\"expected nonempty service control profile\")\n const selected = this.select({ services: Object.keys(input) })\n for (const [name, child] of selected) {\n const controls = input[name]\n if (!object(controls)) throw new Error(`expected controls for ${name}`)\n normalizeControls(controls, `profile.${name}`)\n if (child.protocol !== \"http\" && Object.keys(controls).some((key) => key !== \"clock\"))\n throw new Error(`unsupported protocol controls for ${name}`)\n }\n return this.ctx.transaction(namespace, selected, async (name, child) => {\n const controls = input[name] as Record<string, unknown>\n if (child.configure) await child.configure(namespace, controls)\n else {\n const plan = normalizeControls(controls)\n if (plan.clock?.frozen === true) child.clock(namespace).freeze()\n if (plan.clock?.now !== undefined) child.clock(namespace).set(plan.clock.now)\n if (plan.clock?.frozen === false) child.clock(namespace).unfreeze()\n }\n await extra?.(name, child)\n if (name === [...selected.keys()].at(-1) && seedApplication) {\n const operation = [...this.operations.values()].find(\n (o) => o.namespace === namespace && o.status === \"running\",\n )\n const token = randomBytes(32).toString(\"base64url\")\n this.privateRequests.set(namespace, token)\n const access: { connections: Record<string, string>; close(): Promise<void> }[] = []\n const connections: Record<string, { url: string; namespaces: Record<string, string> }> = {}\n try {\n for (const [service, target] of selected) {\n if (target.initializationAccess) {\n const seedAccess = await target.initializationAccess()\n access.push(seedAccess)\n const url = seedAccess.connections[namespace]\n if (url) connections[service] = { url, namespaces: { [namespace]: url } }\n } else connections[service] = { url: target.url, namespaces: {} }\n }\n const signal = AbortSignal.timeout(this.ctx.options.hookTimeoutMs ?? 30000)\n await Promise.race([\n seedApplication({\n namespace,\n services: [...selected.keys()],\n operationId: operation?.id ?? randomUUID(),\n signal,\n manifest: this.ctx.manifest(),\n connections,\n headers: { \"x-mockingbird-initializer\": token, \"x-mockingbird-namespace\": namespace },\n }),\n new Promise<never>((_, reject) =>\n signal.addEventListener(\n \"abort\",\n () => reject(new Error(\"application seed hook timed out\")),\n { once: true },\n ),\n ),\n ])\n } catch (error) {\n throw Object.assign(\n new Error(\"application seed hook failed; recovery required\", { cause: error }),\n { code: \"MOCKINGBIRD_WORKLOAD_UNCERTAIN\" },\n )\n } finally {\n this.privateRequests.delete(namespace)\n await Promise.all(access.map((a) => a.close()))\n }\n }\n })\n }\n async backup(namespaces: string[], operationId?: string) {\n if (!this.ctx.options.repository) throw new Error(\"archive repository is not configured\")\n if (this.backupRunning) throw new Error(\"backup is already running; overlapping run skipped\")\n this.backupRunning = true\n this.backupStatus.lastAttempt = new Date().toISOString()\n try {\n const archive = await this.capture(namespaces)\n for (const namespace of namespaces) this.phase(namespace, \"uploading\")\n if (operationId) await this.journalPhase(operationId, \"uploading\", { after: archive.sha256 })\n const id = await this.ctx.options.repository.put(archive)\n for (const namespace of namespaces) this.phase(namespace, \"verifying-upload\")\n const verified = validateArchive(await this.ctx.options.repository.get(id))\n if (verified.sha256 !== archive.sha256) throw new Error(\"backup verification failed\")\n if (operationId)\n await this.journalPhase(\n operationId,\n \"publishing\",\n this.ctx.options.repository.writerGeneration !== undefined\n ? { writerGeneration: this.ctx.options.repository.writerGeneration }\n : {},\n )\n for (const namespace of namespaces) this.phase(namespace, \"publishing\")\n await this.ctx.options.repository.publishLatest(id)\n const publication = await this.ctx.options.repository.publicationMetadata?.()\n if (operationId && publication)\n await this.journalPhase(operationId, \"publishing\", {\n writerGeneration: publication.generation,\n })\n this.backupStatus.lastSuccess = new Date().toISOString()\n this.backupStatus.archiveId = id\n delete this.backupStatus.lastFailure\n const keep = this.ctx.options.backupPolicy?.keep\n if (keep !== undefined) {\n const archives = await this.ctx.options.repository.list()\n for (const old of archives.slice(0, Math.max(0, archives.length - keep)))\n if (old !== id) await this.ctx.options.repository.delete(old)\n }\n return { id, sha256: archive.sha256, verified: true }\n } catch (error) {\n this.backupStatus.lastFailure = error instanceof Error ? error.message : \"backup failed\"\n throw error\n } finally {\n this.backupRunning = false\n }\n }\n private cleanupPreview() {\n return this.namespaceStatus()\n .filter((entry) => entry.namespace !== \"default\")\n .map((entry) => {\n let busy = true\n try {\n busy =\n this.busy(entry.namespace).length > 0 ||\n [...this.ctx.children.values()].some(\n (c) => c.diagnostics(entry.namespace).activeConnections > 0,\n )\n } catch {}\n return {\n namespace: entry.namespace,\n expiresAt: entry.expiresAt,\n pinned: entry.pinned,\n eligible:\n entry.expiresAt !== undefined &&\n !entry.pinned &&\n !busy &&\n entry.status === \"ready\" &&\n !this.topology.has(entry.namespace) &&\n Date.now() >= (entry.expiresAt ?? Infinity),\n }\n })\n }\n async startPolicies() {\n if (this.ctx.options.repository && this.ctx.options.backupPolicy) {\n try {\n const id = await this.ctx.options.repository.latest()\n if (id) {\n await this.ctx.options.repository.get(id)\n this.backupStatus.archiveId = id\n this.backupStatus.lastSuccess = new Date().toISOString()\n }\n } catch (error) {\n this.backupStatus.lastFailure =\n error instanceof Error ? error.message : \"repository recovery failed\"\n }\n }\n this.lifecycle = \"ready\"\n const policy = this.ctx.options.backupPolicy\n if (policy) {\n if (!Number.isFinite(policy.intervalMs) || policy.intervalMs < 10)\n throw new Error(\"backup intervalMs must be at least 10\")\n const schedule = () => {\n this.backupStatus.nextRun = new Date(Date.now() + policy.intervalMs).toISOString()\n if (!this.backupRunning)\n void this.backup(policy.namespaces ?? [...this.namespaces.keys()]).catch(() => {})\n }\n this.backupStatus.nextRun = new Date(Date.now() + policy.intervalMs).toISOString()\n this.timer = setInterval(schedule, policy.intervalMs)\n this.timer.unref?.()\n }\n const expiry = this.ctx.options.expiry\n if (expiry) {\n if (!Number.isFinite(expiry.idleMs) || expiry.idleMs < 1)\n throw new Error(\"expiry idleMs must be positive\")\n this.expiryTimer = setInterval(() => {\n for (const entry of this.cleanupPreview())\n if (entry.eligible)\n void (async () => {\n if (expiry.finalBackup) await this.backup([entry.namespace])\n await this.deleteNamespace(entry.namespace)\n })().catch(() => {})\n }, expiry.intervalMs ?? 60000)\n this.expiryTimer.unref?.()\n }\n }\n stopPolicies() {\n clearInterval(this.timer)\n clearInterval(this.expiryTimer)\n }\n}\n\nconst fleetConsole = (prefix: string) =>\n `<!doctype html><html lang=\"en\"><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width\"><title>Mockingbird Fleet</title><style>body{font:16px system-ui;max-width:1000px;margin:3rem auto;padding:1rem;background:#10151b;color:#e0e9f2}input,select,button{padding:.7rem;margin:.3rem;background:#233142;color:inherit;border:1px solid #60768b;border-radius:5px}pre{white-space:pre-wrap;overflow-wrap:anywhere}a{color:#9fdbff}</style><h1>Mockingbird Fleet</h1><label>Admin key <input id=\"key\" type=\"password\" autocomplete=\"off\"></label><label>Namespace <input id=\"ns\" value=\"default\"></label><button id=\"refresh\">Refresh</button><section id=\"children\"></section><label>Action <select id=\"action\"><option value=\"snapshots\">Capture checkpoint</option><option value=\"reset\">Reset namespace</option></select></label><button id=\"run\">Run</button><h2>Lifecycle and operations</h2><pre id=\"result\"></pre><script type=\"module\">const base=${JSON.stringify(`${prefix}/fleet`)};const key=document.querySelector('#key'),ns=document.querySelector('#ns'),result=document.querySelector('#result');async function api(path,method='GET',body){const r=await fetch(base+path,{method,headers:{'content-type':'application/json','x-mockingbird-admin-key':key.value},...(body?{body:JSON.stringify(body)}:{})});const data=await r.json();result.textContent=JSON.stringify(data,null,2);return data}document.querySelector('#refresh').onclick=async()=>{const data=await api('');const host=document.querySelector('#children');host.replaceChildren();for(const [name,child]of Object.entries(data.manifest?.services??{})){const link=document.createElement('a');link.href=child.adminUrl;link.textContent=name+' ('+child.protocol+') ';host.append(link)}await api('/operations?namespace='+encodeURIComponent(ns.value))};document.querySelector('#run').onclick=()=>api('/namespaces/'+encodeURIComponent(ns.value)+'/'+document.querySelector('#action').value,'POST',{});</script></html>`\n", "import { createHash } from \"node:crypto\"\n\nexport type FleetArchive = {\n format: \"mockingbird.fleet/v1\"\n createdAt: string\n sourceId: string\n /** Application-owned non-secret tags, independent of participant codecs. */\n compatibility?: ArchiveCompatibilityTags\n namespaces: Record<\n string,\n {\n clock: { now: number; frozen: boolean }\n services: Record<\n string,\n {\n protocol: \"http\" | \"postgres\" | \"redis\" | \"external\"\n version: 1\n packageVersion?: string\n target?: string\n state: unknown\n }\n >\n }\n >\n sha256: string\n}\n\nexport type ArchiveCompatibilityTags = Readonly<Record<string, string>>\nexport type ArchiveCompatibilityPolicy = {\n tags: ArchiveCompatibilityTags\n /** Legacy archives are rejected by default when tags are required. */\n missing?: \"reject\" | \"allow\"\n}\nexport function validateCompatibilityTags(tags: unknown): asserts tags is ArchiveCompatibilityTags {\n if (!tags || typeof tags !== \"object\" || Array.isArray(tags))\n throw new Error(\"invalid archive compatibility tags\")\n const entries = Object.entries(tags)\n if (\n entries.length > 32 ||\n entries.some(\n ([key, value]) =>\n !/^[A-Za-z0-9_.-]{1,64}$/.test(key) ||\n typeof value !== \"string\" ||\n value.length < 1 ||\n value.length > 256 ||\n [...value].some(\n (character) => character.charCodeAt(0) < 32 || character.charCodeAt(0) === 127,\n ),\n )\n )\n throw new Error(\"invalid archive compatibility tags\")\n}\nexport function assertCompatibilityTags(tags: unknown, policy?: ArchiveCompatibilityPolicy): void {\n if (tags !== undefined) validateCompatibilityTags(tags)\n if (!policy) return\n validateCompatibilityTags(policy.tags)\n if (policy.missing !== undefined && ![\"allow\", \"reject\"].includes(policy.missing))\n throw new Error(\"invalid missing compatibility policy\")\n if (tags === undefined && policy.missing === \"allow\") return\n if (canonical(tags) !== canonical(policy.tags))\n throw new Error(\"application archive compatibility mismatch\")\n}\nexport function assertArchiveCompatibility(\n input: unknown,\n policy?: ArchiveCompatibilityPolicy,\n): FleetArchive {\n const archive = validateArchive(input)\n assertCompatibilityTags(archive.compatibility, policy)\n return archive\n}\n/** An explicit application migration works on a clone and produces a new verified identity. */\nexport async function migrateApplicationArchive(\n input: unknown,\n migration: {\n from: ArchiveCompatibilityPolicy\n to: ArchiveCompatibilityTags\n transform(archive: FleetArchive): FleetArchive | Promise<FleetArchive>\n },\n): Promise<FleetArchive> {\n const source = assertArchiveCompatibility(input, migration.from)\n validateCompatibilityTags(migration.to)\n const transformed = await migration.transform(structuredClone(source))\n const { sha256: _sha, ...content } = transformed\n return validateArchive(sealArchive({ ...content, compatibility: structuredClone(migration.to) }))\n}\n\nexport const canonical = (value: unknown): string => {\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`\n if (value !== null && typeof value === \"object\")\n return `{${Object.entries(value)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`)\n .join(\",\")}}`\n return JSON.stringify(value)\n}\nexport const digest = (value: unknown) =>\n createHash(\"sha256\").update(canonical(value)).digest(\"hex\")\nexport const sealArchive = (content: Omit<FleetArchive, \"sha256\">): FleetArchive => ({\n ...content,\n sha256: digest(content),\n})\nexport function validateArchive(value: unknown): FleetArchive {\n if (!value || typeof value !== \"object\") throw new Error(\"expected fleet archive\")\n const doc = value as FleetArchive\n const { sha256, ...content } = doc\n if (\n doc.format !== \"mockingbird.fleet/v1\" ||\n typeof doc.sourceId !== \"string\" ||\n typeof doc.createdAt !== \"string\" ||\n !doc.namespaces ||\n typeof doc.namespaces !== \"object\" ||\n Array.isArray(doc.namespaces) ||\n sha256 !== digest(content)\n )\n throw new Error(\"unsupported or corrupt fleet archive\")\n if (doc.compatibility !== undefined) validateCompatibilityTags(doc.compatibility)\n for (const [namespace, entry] of Object.entries(doc.namespaces)) {\n if (\n !/^[A-Za-z0-9_.-]{1,64}$/.test(namespace) ||\n !entry ||\n !Number.isFinite(entry.clock?.now) ||\n typeof entry.clock?.frozen !== \"boolean\" ||\n !entry.services ||\n !Object.keys(entry.services).length\n )\n throw new Error(\"invalid archive namespace\")\n for (const [name, child] of Object.entries(entry.services))\n if (\n !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name) ||\n !child ||\n child.version !== 1 ||\n ![\"http\", \"postgres\", \"redis\", \"external\"].includes(child.protocol)\n )\n throw new Error(\"unsupported archive service/version\")\n }\n return doc\n}\n\n/** Read-only semantic summaries; values are omitted unless explicitly requested. */\nexport function inspectArchive(input: unknown) {\n const archive = validateArchive(input)\n return {\n format: archive.format,\n createdAt: archive.createdAt,\n sha256: archive.sha256,\n ...(archive.compatibility ? { compatibility: archive.compatibility } : {}),\n namespaces: Object.fromEntries(\n Object.entries(archive.namespaces).map(([name, ns]) => [\n name,\n {\n clock: ns.clock,\n services: Object.fromEntries(\n Object.entries(ns.services).map(([service, state]) => [\n service,\n {\n protocol: state.protocol,\n version: state.version,\n bytes: Buffer.byteLength(canonical(state.state)),\n },\n ]),\n ),\n },\n ]),\n ),\n }\n}\nexport function diffArchives(\n left: unknown,\n right: unknown,\n options: { namespace?: string; service?: string; values?: boolean; limit?: number } = {},\n) {\n const a = validateArchive(left),\n b = validateArchive(right)\n const limit = Math.min(1000, Math.max(1, options.limit ?? 100))\n const changes: {\n namespace: string\n service: string\n path: string\n kind: string\n before?: unknown\n after?: unknown\n }[] = []\n let total = 0\n const walk = (\n namespace: string,\n service: string,\n path: string,\n before: unknown,\n after: unknown,\n ) => {\n if (canonical(before) === canonical(after)) return\n if (\n before &&\n after &&\n typeof before === \"object\" &&\n typeof after === \"object\" &&\n !Array.isArray(before) &&\n !Array.isArray(after)\n ) {\n for (const key of new Set([...Object.keys(before), ...Object.keys(after)]))\n walk(\n namespace,\n service,\n `${path}/${key}`,\n (before as Record<string, unknown>)[key],\n (after as Record<string, unknown>)[key],\n )\n return\n }\n total++\n if (changes.length < limit)\n changes.push({\n namespace,\n service,\n path,\n kind: before === undefined ? \"added\" : after === undefined ? \"removed\" : \"changed\",\n ...(options.values ? { before, after } : {}),\n })\n }\n for (const ns of new Set([...Object.keys(a.namespaces), ...Object.keys(b.namespaces)])) {\n if (options.namespace !== undefined && options.namespace !== ns) continue\n const an = a.namespaces[ns],\n bn = b.namespaces[ns]\n walk(ns, \"$clock\", \"/clock\", an?.clock, bn?.clock)\n for (const service of new Set([\n ...Object.keys(an?.services ?? {}),\n ...Object.keys(bn?.services ?? {}),\n ])) {\n if (options.service !== undefined && options.service !== service) continue\n const x = an?.services[service],\n y = bn?.services[service]\n if (x && y && (x.protocol !== y.protocol || x.version !== y.version))\n throw new Error(\"incompatible snapshot comparison\")\n const normalize = (state: unknown): unknown => {\n if (state && typeof state === \"object\") {\n const obj = state as Record<string, unknown>\n if (obj.format === \"mockingbird.postgres/v1\" && obj.inventory) {\n if (options.values)\n throw new Error(\n \"raw PostgreSQL row diff is unsupported; use bounded namespace inspection\",\n )\n const { databases: _databases, ...metadata } = obj\n return metadata\n }\n if (obj.$redis === \"map\" && Array.isArray(obj.value))\n return Object.fromEntries(\n obj.value.map((pair: [unknown, unknown]) => [\n typeof pair[0] === \"string\" ? pair[0] : canonical(pair[0]),\n normalize(pair[1]),\n ]),\n )\n if (Array.isArray(state))\n return Object.fromEntries(\n state.map((value, index) => [String(index), normalize(value)]),\n )\n }\n if (\n state &&\n typeof state === \"object\" &&\n Array.isArray((state as { records?: unknown }).records)\n ) {\n const { records, ...rest } = state as { records: { collection: string; id: string }[] }\n return {\n ...rest,\n records: Object.fromEntries(records.map((r) => [`${r.collection}/${r.id}`, r])),\n }\n }\n if (state && typeof state === \"object\" && !Array.isArray(state))\n return Object.fromEntries(Object.entries(state).map(([k, v]) => [k, normalize(v)]))\n return state\n }\n walk(ns, service, \"/state\", normalize(x?.state), normalize(y?.state))\n }\n }\n return { format: \"mockingbird.fleet-diff/v1\", total, truncated: total > changes.length, changes }\n}\n", "import { digest, type FleetArchive, sealArchive, validateArchive } from \"./fleet-archive.js\"\n\nexport type RestoreBinding = {\n namespace: string\n service: string\n endpointId: string\n endpointRef: string\n secretRef?: string\n signing?: \"preserve\" | \"replace\"\n signingRef?: string\n}\nexport type RestoreBindings = { bindings: RestoreBinding[]; endpoints: Record<string, string> }\nconst object = (v: unknown): v is Record<string, unknown> =>\n v !== null && typeof v === \"object\" && !Array.isArray(v)\n/** Explicitly relocates declared webhook configuration; opaque payloads/tokens are never rewritten. */\nexport async function planRestoreBindings(\n input: unknown,\n plan: RestoreBindings,\n resolveSecret?: (reference: string) => Promise<string>,\n) {\n const source = validateArchive(input),\n copy = structuredClone(source)\n if (!plan || !Array.isArray(plan.bindings) || !object(plan.endpoints))\n throw new Error(\"expected explicit restore bindings and endpoint references\")\n const changes: {\n namespace: string\n service: string\n endpointId: string\n endpointRef: string\n secretRef?: string\n previousFingerprint: string\n destinationFingerprint: string\n signing: string\n }[] = []\n const seen = new Set<string>()\n const endpoint = (reference: string) => {\n const value = plan.endpoints[reference]\n if (typeof value !== \"string\") throw new Error(`unresolved endpoint reference ${reference}`)\n const url = new URL(value)\n if (![\"http:\", \"https:\"].includes(url.protocol) || url.username || url.password)\n throw new Error(`invalid endpoint reference ${reference}`)\n return url.href\n }\n for (const binding of plan.bindings) {\n const identity = `${binding.namespace}/${binding.service}/${binding.endpointId}`\n if (seen.has(identity)) throw new Error(`ambiguous binding ${identity}`)\n seen.add(identity)\n const section = copy.namespaces[binding.namespace]?.services[binding.service]\n if (\n section?.protocol !== \"http\" ||\n !object(section.state) ||\n !object(section.state.webhooks) ||\n !Array.isArray(section.state.webhooks.endpoints)\n )\n throw new Error(`unsupported callback binding ${identity}`)\n const hub = section.state.webhooks\n const matches = (hub.endpoints as unknown[]).filter(\n (e) => object(e) && e.id === binding.endpointId,\n ) as Record<string, unknown>[]\n if (matches.length !== 1) throw new Error(`unresolved or ambiguous endpoint ${identity}`)\n const current = matches[0] as Record<string, unknown>,\n old = String(current.url),\n destination = endpoint(binding.endpointRef)\n if (current.signUrl !== undefined && binding.signing === undefined)\n throw new Error(`signing policy required for ${identity}`)\n if (binding.signing !== undefined && ![\"preserve\", \"replace\"].includes(binding.signing))\n throw new Error(`unsupported signing policy ${identity}`)\n const signUrl =\n binding.signing === \"replace\"\n ? endpoint(binding.signingRef ?? binding.endpointRef)\n : current.signUrl\n let secret: string | undefined\n if (binding.secretRef !== undefined) {\n if (!resolveSecret) throw new Error(`unresolved secret reference ${binding.secretRef}`)\n try {\n secret = await resolveSecret(binding.secretRef)\n if (typeof secret !== \"string\" || !secret) throw new Error()\n } catch {\n throw new Error(`unresolved secret reference ${binding.secretRef}`)\n }\n }\n const apply = (value: Record<string, unknown>) => {\n value.url = destination\n if (signUrl !== undefined) value.signUrl = signUrl\n if (secret !== undefined) value.secret = secret\n }\n apply(current)\n if (Array.isArray(hub.payloads))\n for (const pair of hub.payloads)\n if (\n Array.isArray(pair) &&\n object(pair[1]) &&\n object(pair[1].endpoint) &&\n pair[1].endpoint.id === binding.endpointId\n )\n apply(pair[1].endpoint)\n if (Array.isArray(hub.deliveries))\n for (const pair of hub.deliveries)\n if (Array.isArray(pair) && object(pair[1]) && pair[1].endpointId === binding.endpointId)\n pair[1].url = destination\n if (Array.isArray(section.state.records))\n for (const row of section.state.records)\n if (\n object(row) &&\n row.collection === \"runtime_webhook_endpoints\" &&\n object(row.value) &&\n row.value.id === binding.endpointId\n )\n apply(row.value)\n changes.push({\n namespace: binding.namespace,\n service: binding.service,\n endpointId: binding.endpointId,\n endpointRef: binding.endpointRef,\n ...(binding.secretRef ? { secretRef: binding.secretRef } : {}),\n previousFingerprint: digest(old),\n destinationFingerprint: digest(destination),\n signing: binding.signing ?? \"not-configured\",\n })\n }\n const { sha256: _sha, ...content } = copy\n return {\n report: {\n version: 1,\n source: source.sha256,\n changes,\n limitations: [\n \"opaque payloads, tokens, issuer material and application URLs are unchanged\",\n \"protocol key rebinding requires a registered participant transformation\",\n ],\n },\n archive: sealArchive(content),\n }\n}\nexport const rebaseArchiveNamespace = (\n input: FleetArchive,\n source: string,\n destination: string,\n): FleetArchive => {\n const archive = validateArchive(input)\n if (!/^[A-Za-z0-9_.-]{1,64}$/.test(destination) || !archive.namespaces[source])\n throw new Error(\"invalid namespace fork\")\n const { sha256: _sha, ...content } = archive\n return sealArchive({\n ...content,\n namespaces: { [destination]: structuredClone(archive.namespaces[source]) },\n })\n}\n", "import { randomUUID } from \"node:crypto\"\n\nexport type AuditEvent = {\n id: string\n actor: string\n namespace: string\n action: string\n services: string[]\n operationId?: string\n stage: \"denied\" | \"attempt\" | \"terminal\"\n timestamp: string\n result?: \"succeeded\" | \"failed\" | \"cancelled\"\n durable?: boolean\n}\nexport type AuditPolicy = {\n write(event: AuditEvent): Promise<void>\n failurePolicy: \"open\" | \"closed\"\n}\nexport type TelemetryEvent = {\n participant?: string\n operationId: string\n phase: string\n action: string\n services: string[]\n status: string\n elapsedMs: number\n recoveryRequired: boolean\n}\nexport type InstrumentationOptions = {\n audit?: AuditPolicy\n telemetry?(event: TelemetryEvent): void | Promise<void>\n}\nexport class FleetInstrumentation {\n private readonly auditEntries: AuditEvent[] = []\n private readonly started = new Map<string, number>()\n private readonly terminal = new Set<string>()\n private readonly metrics = {\n started: 0,\n succeeded: 0,\n failed: 0,\n cancelled: 0,\n recoveryRequired: 0,\n phaseEvents: 0,\n auditFailures: 0,\n rollbackAttempts: 0,\n rollbackFailures: 0,\n telemetryFailures: 0,\n durationsMs: { count: 0, sum: 0, max: 0 },\n }\n constructor(private readonly options: InstrumentationOptions = {}) {}\n async audit(input: Omit<AuditEvent, \"id\" | \"timestamp\" | \"durable\">): Promise<boolean> {\n const event: AuditEvent = { ...input, id: randomUUID(), timestamp: new Date().toISOString() }\n let accepted = true\n try {\n if (this.options.audit) {\n await this.options.audit.write(event)\n event.durable = true\n } else event.durable = false\n } catch {\n this.metrics.auditFailures++\n event.durable = false\n accepted = this.options.audit?.failurePolicy !== \"closed\"\n }\n this.auditEntries.push(event)\n if (this.auditEntries.length > 200) this.auditEntries.shift()\n return accepted\n }\n phase(\n operation: {\n id: string\n participant?: string\n phase: string\n action: string\n services?: string[]\n status: string\n },\n recoveryRequired: boolean,\n ) {\n if (!this.started.has(operation.id)) {\n this.started.set(operation.id, performance.now())\n this.metrics.started++\n }\n const elapsedMs = Math.max(0, performance.now() - (this.started.get(operation.id) as number))\n this.metrics.phaseEvents++\n if (operation.phase === \"rolling-back\") this.metrics.rollbackAttempts++\n if (operation.phase === \"rollback-failed\") this.metrics.rollbackFailures++\n if (operation.status !== \"running\" && !this.terminal.has(operation.id)) {\n this.terminal.add(operation.id)\n if (operation.status === \"succeeded\") this.metrics.succeeded++\n else if (operation.status === \"cancelled\") this.metrics.cancelled++\n else this.metrics.failed++\n if (recoveryRequired) this.metrics.recoveryRequired++\n this.metrics.durationsMs.count++\n this.metrics.durationsMs.sum += elapsedMs\n this.metrics.durationsMs.max = Math.max(this.metrics.durationsMs.max, elapsedMs)\n }\n const action = operation.action\n .replace(/\\/namespaces\\/[^/]+/g, \"/namespaces/{namespace}\")\n .replace(/\\/snapshots\\/[^/]+/g, \"/snapshots/{id}\")\n .replace(/\\/scenarios\\/[^/]+/g, \"/scenarios/{name}\")\n try {\n const sent = this.options.telemetry?.({\n ...(operation.participant ? { participant: operation.participant } : {}),\n operationId: operation.id,\n phase: operation.phase,\n action,\n services: operation.services ?? [],\n status: operation.status,\n elapsedMs,\n recoveryRequired,\n })\n if (sent)\n void sent.catch(() => {\n this.metrics.telemetryFailures++\n })\n } catch {\n this.metrics.telemetryFailures++\n }\n while (this.started.size > 200) {\n const id = this.started.keys().next().value as string\n this.started.delete(id)\n this.terminal.delete(id)\n }\n }\n snapshot() {\n return {\n version: 1,\n metrics: structuredClone(this.metrics),\n cardinality: \"aggregate-no-namespace-labels\",\n }\n }\n auditTrail() {\n return {\n version: 1,\n entries: structuredClone(this.auditEntries),\n retention: 200,\n durableSink: Boolean(this.options.audit),\n failurePolicy: this.options.audit?.failurePolicy ?? \"memory-only\",\n }\n }\n}\n", "import { mkdir, readdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport type { ArchiveRepository } from \"./fleet-repository.js\"\nimport { filesystemConditionalStore } from \"./fleet-writer.js\"\n\nexport type JournalRecord = {\n version: 1\n revision: number\n operationId: string\n controller: string\n namespace: string\n scope: string[]\n action: string\n phase:\n | \"prepared\"\n | \"committing\"\n | \"uploading\"\n | \"publishing\"\n | \"succeeded\"\n | \"failed\"\n | \"recovery-required\"\n | \"resolved\"\n timestamp: string\n requestFingerprint: string\n before?: string\n after?: string\n writerGeneration?: number\n resolution?: string\n}\nexport type OperationJournal = {\n load(): Promise<JournalRecord[]>\n write(record: JournalRecord): Promise<void>\n}\nconst validate = (record: JournalRecord) => {\n if (\n record?.version !== 1 ||\n !Number.isSafeInteger(record.revision) ||\n record.revision < 1 ||\n !/^[a-f0-9-]{36}$/.test(record.operationId) ||\n !Array.isArray(record.scope) ||\n record.scope.length > 1000 ||\n record.scope.some((ns) => !/^[A-Za-z0-9_.-]{1,64}$/.test(ns)) ||\n ![\n \"prepared\",\n \"committing\",\n \"uploading\",\n \"publishing\",\n \"succeeded\",\n \"failed\",\n \"recovery-required\",\n \"resolved\",\n ].includes(record.phase) ||\n [record.before, record.after].some((id) => id !== undefined && !/^[a-f0-9]{64}$/.test(id)) ||\n Object.keys(record).some(\n (key) =>\n ![\n \"version\",\n \"revision\",\n \"operationId\",\n \"controller\",\n \"namespace\",\n \"scope\",\n \"action\",\n \"phase\",\n \"timestamp\",\n \"requestFingerprint\",\n \"before\",\n \"after\",\n \"writerGeneration\",\n \"resolution\",\n ].includes(key),\n )\n )\n throw new Error(\"invalid durable operation metadata\")\n}\n/** One fsynced CAS record per operation. Stale controllers cannot overwrite later reconciliation. */\nexport function filesystemOperationJournal(directory: string): OperationJournal {\n return {\n async load() {\n await mkdir(directory, { recursive: true, mode: 0o700 })\n const names = (await readdir(directory)).filter((name) => /^[a-f0-9-]{36}\\.json$/.test(name))\n if (names.length > 10000)\n throw new Error(\n \"operation journal requires explicit archival before exceeding 10000 records\",\n )\n const records: JournalRecord[] = []\n for (const name of names) {\n const record = (\n await filesystemConditionalStore<JournalRecord>(join(directory, name), {\n durable: true,\n }).read()\n )?.value\n if (!record) throw new Error(\"operation journal record disappeared\")\n validate(record)\n records.push(record)\n }\n return records.sort((a, b) => a.timestamp.localeCompare(b.timestamp))\n },\n async write(record) {\n validate(record)\n const store = filesystemConditionalStore<JournalRecord>(\n join(directory, `${record.operationId}.json`),\n { durable: true },\n ),\n previous = await store.read()\n if (\n record.revision !== (previous?.value.revision ?? 0) + 1 ||\n !(await store.compareAndSwap(previous?.revision, record))\n )\n throw new Error(\"durable operation revision conflict\")\n },\n }\n}\nexport async function reconcileOperation(record: JournalRecord, repository: ArchiveRepository) {\n validate(record)\n if ([\"succeeded\", \"failed\", \"resolved\"].includes(record.phase))\n return { status: \"terminal\" as const, operationId: record.operationId }\n if (record.phase === \"prepared\")\n return { status: \"abandoned-before-commit\" as const, operationId: record.operationId }\n if (record.after) {\n try {\n const archive = await repository.get(record.after),\n publication = await repository.publicationMetadata?.()\n if (\n archive.sha256 === record.after &&\n publication?.id === record.after &&\n record.writerGeneration !== undefined &&\n publication.generation === record.writerGeneration\n )\n return {\n status: \"verified-publication\" as const,\n operationId: record.operationId,\n archive: record.after,\n }\n } catch {\n /* missing or unverified objects require recovery, never a retry of the mutation */\n }\n }\n if (record.before)\n try {\n await repository.get(record.before)\n } catch {\n return {\n status: \"recovery-required\" as const,\n operationId: record.operationId,\n reason: \"before-state archive unavailable\",\n scope: record.scope,\n }\n }\n return {\n status: \"recovery-required\" as const,\n operationId: record.operationId,\n reason: \"commit or rollback cannot be proven\",\n scope: record.scope,\n }\n}\n", "import { createHash, randomUUID } from \"node:crypto\"\nimport type { FleetDiagnostics } from \"./fleet.js\"\nimport { type FleetArchive, validateArchive } from \"./fleet-archive.js\"\nimport type { FleetSubject } from \"./fleet-conformance.js\"\n\nexport type Observation = {\n id: number\n namespace: string\n service: string\n kind: \"http\" | \"webhook\"\n method?: string\n pathFingerprint?: string\n operationId?: string\n status?: number\n unmatched?: boolean\n fault?: boolean\n deliveryState?: string\n}\nexport type AssertionAllowance = {\n kind: \"unmatched\" | \"rejected\" | \"fault\"\n service: string\n pathFingerprint?: string\n operationId?: string\n status?: number\n maxCount: number\n}\nexport type TraceEvent = {\n sequence: number\n kind: \"http\" | \"control\"\n service?: string\n method?: string\n path?: string\n body?: string\n contentType?: string\n status?: number\n responseHash?: string\n action?: \"clock\" | \"reset\"\n controls?: Record<string, unknown>\n omitted: string[]\n}\nexport type FleetTrace = {\n format: \"mockingbird.trace/v1\"\n sourceProcess: string\n namespace: string\n baseline: FleetArchive\n events: TraceEvent[]\n limitations: string[]\n truncated: boolean\n active: boolean\n}\ntype TraceToken = {\n artifact: FleetTrace\n event: TraceEvent\n body: Promise<{ text?: string; omitted: string[] }>\n}\nconst hash = (text: string) => createHash(\"sha256\").update(text).digest(\"hex\")\nconst boundedText = async (stream: ReadableStream<Uint8Array> | null, max: number) => {\n if (!stream) return \"\"\n const reader = stream.getReader(),\n chunks: Uint8Array[] = []\n let bytes = 0,\n timedOut = false\n const timer = setTimeout(() => {\n timedOut = true\n void reader.cancel().catch(() => {})\n }, 100)\n try {\n for (;;) {\n const result = await reader.read()\n if (result.done) break\n bytes += result.value.length\n if (bytes > max) throw new Error(\"capture byte limit\")\n chunks.push(result.value)\n }\n if (timedOut) throw new Error(\"capture deadline\")\n return Buffer.concat(chunks).toString(\"utf8\")\n } finally {\n clearTimeout(timer)\n void reader.cancel().catch(() => {})\n reader.releaseLock()\n }\n}\nexport class FleetObservations {\n private sequence = 0\n private readonly entries: Observation[] = []\n private readonly baselines = new Map<\n string,\n { namespace: string; services: string[]; sequence: number }\n >()\n private readonly traces = new Map<\n string,\n { artifact: FleetTrace; includeBodies: boolean; bytes: number; inFlight: number; next: number }\n >()\n constructor(\n private readonly processId: string,\n private readonly limits = { events: 500, traceEvents: 200, traceBytes: 1024 * 1024 },\n ) {}\n record(event: Omit<Observation, \"id\">) {\n this.entries.push({ ...event, id: ++this.sequence })\n if (this.entries.length > this.limits.events) this.entries.shift()\n }\n baseline(namespace: string, services: string[]) {\n const id = randomUUID()\n this.baselines.set(id, { namespace, services, sequence: this.sequence })\n while (this.baselines.size > 200)\n this.baselines.delete(this.baselines.keys().next().value as string)\n return { id, namespace, services, sequence: this.sequence }\n }\n assertClean(\n id: string,\n namespace: string,\n diagnostics: Record<string, FleetDiagnostics>,\n options: { allowances?: AssertionAllowance[]; allowCheckpointablePending?: boolean } = {},\n ) {\n const baseline = this.baselines.get(id)\n if (!baseline || baseline.namespace !== namespace)\n throw new Error(\"assertion baseline not found in this namespace\")\n const allowances = options.allowances ?? []\n if (\n !Array.isArray(allowances) ||\n allowances.some(\n (a) =>\n ![\"unmatched\", \"rejected\", \"fault\"].includes(a.kind) ||\n !a.service ||\n (!a.pathFingerprint && !a.operationId) ||\n !Number.isSafeInteger(a.maxCount) ||\n a.maxCount < 1,\n )\n )\n throw new Error(\n \"allowances must identify a service and exact operation or path fingerprint with a bounded count\",\n )\n const consumed = new Map<AssertionAllowance, number>(),\n failures: unknown[] = []\n if (this.entries.length && baseline.sequence < (this.entries[0]?.id ?? 0) - 1)\n failures.push({ kind: \"evidence_truncated\" })\n for (const entry of this.entries) {\n if (\n entry.id <= baseline.sequence ||\n entry.namespace !== namespace ||\n !baseline.services.includes(entry.service)\n )\n continue\n const kinds =\n entry.kind === \"webhook\"\n ? entry.deliveryState === \"failed\" || entry.deliveryState === \"dropped\"\n ? [\"failed_delivery\"]\n : []\n : entry.fault\n ? [\"fault\"]\n : entry.unmatched\n ? [\"unmatched\"]\n : (entry.status ?? 0) >= 400\n ? [\"rejected\"]\n : []\n for (const kind of kinds) {\n const allowed = allowances.find(\n (a) =>\n a.kind === kind &&\n a.service === entry.service &&\n (!a.pathFingerprint || a.pathFingerprint === entry.pathFingerprint) &&\n (!a.operationId || a.operationId === entry.operationId) &&\n (a.status === undefined || a.status === entry.status) &&\n (consumed.get(a) ?? 0) < a.maxCount,\n )\n if (allowed) consumed.set(allowed, (consumed.get(allowed) ?? 0) + 1)\n else\n failures.push({\n kind,\n service: entry.service,\n method: entry.method,\n pathFingerprint: entry.pathFingerprint,\n operationId: entry.operationId,\n status: entry.status,\n journalReference: entry.id,\n })\n }\n }\n for (const service of baseline.services) {\n const d = diagnostics[service]\n if (!d) throw new Error(`missing assertion diagnostics for ${service}`)\n if (\n d.activeRequests +\n d.activeConnections +\n d.blockedCommands +\n d.pendingWebhooks +\n (d.activeJobs ?? 0) >\n 0 ||\n (!options.allowCheckpointablePending && d.pendingJobs > 0)\n )\n failures.push({ kind: \"leftover_work\", service, diagnostics: d })\n }\n return {\n format: \"mockingbird.assertions/v1\",\n clean: failures.length === 0,\n namespace,\n baseline: id,\n failures: failures.slice(0, 100),\n truncated: failures.length > 100,\n inspectedThrough: this.sequence,\n }\n }\n startTrace(namespace: string, input: unknown, includeBodies = false, limitations: string[] = []) {\n const baseline = validateArchive(input)\n if (!baseline.namespaces[namespace]) throw new Error(\"trace baseline lacks selected namespace\")\n if (Buffer.byteLength(JSON.stringify(baseline)) > 8 * 1024 * 1024)\n throw new Error(\"trace baseline exceeds 8 MiB limit\")\n if (this.traces.size >= 4 && !this.traces.has(namespace))\n throw new Error(\"trace capacity reached\")\n const artifact: FleetTrace = {\n format: \"mockingbird.trace/v1\",\n sourceProcess: this.processId,\n namespace,\n baseline: structuredClone(baseline),\n events: [],\n limitations: [...limitations],\n truncated: false,\n active: true,\n }\n this.traces.set(namespace, { artifact, includeBodies, bytes: 0, inFlight: 0, next: 0 })\n return structuredClone(artifact)\n }\n private limitation(artifact: FleetTrace, limitation: string) {\n if (!artifact.limitations.includes(limitation)) artifact.limitations.push(limitation)\n }\n beginHTTP(\n namespace: string,\n service: string,\n request: Request,\n logicalPath?: string,\n ): TraceToken | undefined {\n const trace = this.traces.get(namespace)\n if (!trace?.artifact.active) return undefined\n const url = new URL(request.url),\n omitted: string[] = []\n if (logicalPath) url.pathname = logicalPath\n for (const key of [...url.searchParams.keys()])\n if (/(token|key|password|secret|signature|credential)/i.test(key)) {\n url.searchParams.set(key, \"[redacted]\")\n omitted.push(\"sensitive query fields redacted\")\n }\n if (\n [...request.headers.keys()].some((h) => /authorization|api-key|token|secret|cookie/i.test(h))\n )\n omitted.push(\"credential headers require explicit replay bindings\")\n const event: TraceEvent = {\n sequence: ++trace.next,\n kind: \"http\",\n service,\n method: request.method,\n path: `${url.pathname}${url.search}`,\n contentType: request.headers.get(\"content-type\") ?? \"\",\n omitted,\n }\n if (trace.inFlight++)\n this.limitation(trace.artifact, \"concurrent interactions are not certified for serial replay\")\n let body: TraceToken[\"body\"] = Promise.resolve({ omitted: [] })\n if (request.body) {\n if (!trace.includeBodies) body = Promise.resolve({ omitted: [\"request body omitted\"] })\n else {\n body = (async () => {\n let timeout: ReturnType<typeof setTimeout> | undefined\n try {\n let text = await Promise.race([\n boundedText(request.clone().body, 65536),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(() => reject(new Error(\"capture deadline\")), 100)\n }),\n ])\n const removed: string[] = []\n if (event.contentType?.includes(\"json\")) {\n text = JSON.stringify(JSON.parse(text), (key, value: unknown) => {\n if (/(token|password|secret|credential|authorization|api.?key)/i.test(key)) {\n removed.push(\"sensitive JSON body fields redacted\")\n return \"[redacted]\"\n }\n return value\n })\n } else if (event.contentType?.includes(\"x-www-form-urlencoded\")) {\n const form = new URLSearchParams(text)\n for (const key of [...form.keys()])\n if (/(token|password|secret|credential|api.?key)/i.test(key)) {\n form.set(key, \"[redacted]\")\n removed.push(\"sensitive form fields redacted\")\n }\n text = form.toString()\n }\n return { text, omitted: removed }\n } catch {\n return { omitted: [\"request body capture truncated or unavailable\"] }\n } finally {\n clearTimeout(timeout)\n }\n })()\n }\n }\n return { artifact: trace.artifact, event, body }\n }\n async finishHTTP(token: TraceToken | undefined, response: Response) {\n if (!token) return\n const trace = this.traces.get(token.artifact.namespace)\n if (!trace || trace.artifact !== token.artifact) return\n const captured = await token.body\n token.event.status = response.status\n token.event.omitted.push(...captured.omitted)\n if (captured.text !== undefined) token.event.body = captured.text\n if (response.headers.get(\"content-type\")?.includes(\"text/event-stream\"))\n token.event.omitted.push(\"streaming responses are unsupported\")\n else {\n try {\n const text = await boundedText(response.clone().body, 65536)\n token.event.responseHash = hash(text)\n } catch {\n token.event.omitted.push(\"response hash unavailable or truncated\")\n }\n }\n trace.inFlight--\n for (const omitted of token.event.omitted) this.limitation(trace.artifact, omitted)\n this.append(trace, token.event)\n }\n private append(trace: { artifact: FleetTrace; bytes: number }, event: TraceEvent) {\n const bytes = Buffer.byteLength(JSON.stringify(event))\n if (\n trace.artifact.events.length >= this.limits.traceEvents ||\n trace.bytes + bytes > this.limits.traceBytes\n ) {\n trace.artifact.truncated = true\n trace.artifact.active = false\n this.limitation(trace.artifact, \"recording limits reached\")\n return\n }\n trace.bytes += bytes\n trace.artifact.events.push(event)\n trace.artifact.events.sort((a, b) => a.sequence - b.sequence)\n }\n unsupportedControl(namespace: string, action: string) {\n const trace = this.traces.get(namespace)\n if (trace?.artifact.active) this.limitation(trace.artifact, `control not replayable: ${action}`)\n }\n control(namespace: string, action: \"clock\" | \"reset\", controls: Record<string, unknown>) {\n const trace = this.traces.get(namespace)\n if (trace?.artifact.active)\n this.append(trace, {\n sequence: ++trace.next,\n kind: \"control\",\n action,\n controls: structuredClone(controls),\n omitted: [],\n })\n }\n trace(namespace: string, stop = false) {\n const trace = this.traces.get(namespace)\n if (!trace) throw new Error(\"trace not started\")\n if (stop) trace.artifact.active = false\n if (trace.inFlight) this.limitation(trace.artifact, \"requests still in flight when inspected\")\n return structuredClone(trace.artifact)\n }\n}\n\n/** Replays only to discovered, explicitly selected synthetic endpoints in a different fleet. */\nexport async function replayFleetTrace(\n trace: FleetTrace,\n subject: FleetSubject,\n options: {\n allowIncomplete?: boolean\n vendorHeaders?: Record<string, string>\n allowedSyntheticOrigins?: string[]\n } = {},\n) {\n if (trace?.format !== \"mockingbird.trace/v1\" || trace.sourceProcess === subject.manifest.id)\n throw new Error(\"trace replay requires a separate explicitly selected synthetic fleet\")\n validateArchive(trace.baseline)\n if (\n !Array.isArray(trace.events) ||\n trace.events.length > 10000 ||\n !trace.baseline.namespaces[trace.namespace] ||\n !Array.isArray(trace.limitations)\n )\n throw new Error(\"invalid trace artifact\")\n let previous = 0\n for (const event of trace.events) {\n if (\n !Number.isSafeInteger(event.sequence) ||\n event.sequence <= previous ||\n ![\"http\", \"control\"].includes(event.kind) ||\n (event.body !== undefined &&\n (typeof event.body !== \"string\" || Buffer.byteLength(event.body) > 65536))\n )\n throw new Error(\"unsupported or malformed trace event\")\n previous = event.sequence\n if (\n event.kind === \"control\" &&\n (!event.action ||\n ![\"clock\", \"reset\"].includes(event.action) ||\n !event.controls ||\n Object.keys(event.controls).some(\n (key) =>\n !(\n event.action === \"clock\" ? [\"services\", \"set\", \"advance\", \"freeze\"] : [\"services\"]\n ).includes(key),\n ))\n )\n throw new Error(\"unsupported trace control\")\n if (\n event.kind === \"http\" &&\n (!event.method ||\n ![\"GET\", \"HEAD\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"OPTIONS\"].includes(event.method))\n )\n throw new Error(\"unsupported trace HTTP method\")\n }\n if ((trace.truncated || trace.limitations.length) && !options.allowIncomplete)\n throw new Error(\n \"trace has declared replay limitations; supply explicit incomplete-replay policy/bindings\",\n )\n const endpoints = new Map<string, URL>()\n for (const event of trace.events)\n if (event.kind === \"http\") {\n const service = event.service as string,\n child = subject.manifest.services[service]\n if (child?.protocol !== \"http\" || !event.path?.startsWith(\"/\") || event.path.startsWith(\"//\"))\n throw new Error(\"unsupported trace service or path\")\n const base = new URL(subject.connections.services[service]?.url ?? child.url)\n const allowed =\n [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(base.hostname) ||\n options.allowedSyntheticOrigins?.includes(base.origin)\n const adminPath = new URL(child.adminUrl).pathname\n if (\n !allowed ||\n base.username ||\n base.password ||\n decodeURIComponent(event.path).includes(adminPath)\n )\n throw new Error(\"trace endpoint is not an admitted synthetic vendor target\")\n endpoints.set(service, base)\n }\n await subject.client.importArchive(trace.baseline)\n const outcomes: { sequence: number; status?: number; matched: boolean }[] = []\n for (const event of trace.events) {\n if (event.kind === \"control\") {\n if (event.action === \"clock\")\n await subject.client.request(\"clock\", {\n namespace: trace.namespace,\n body: event.controls ?? {},\n })\n else if (event.action === \"reset\")\n await subject.client.reset(trace.namespace, {\n ...(Array.isArray(event.controls?.services)\n ? { services: event.controls.services as string[] }\n : {}),\n })\n else throw new Error(\"unsupported trace control\")\n outcomes.push({ sequence: event.sequence, matched: true })\n continue\n }\n const headers = new Headers(options.vendorHeaders)\n headers.delete(\"x-mockingbird-admin-key\")\n headers.set(\"x-mockingbird-namespace\", trace.namespace)\n if (event.contentType) headers.set(\"content-type\", event.contentType)\n const response = await fetch(\n new URL(event.path as string, endpoints.get(event.service as string)),\n {\n method: event.method ?? \"GET\",\n headers,\n ...(event.body !== undefined && event.method !== \"GET\" && event.method !== \"HEAD\"\n ? { body: event.body }\n : {}),\n redirect: \"manual\",\n signal: AbortSignal.timeout(5000),\n },\n )\n const body = await boundedText(response.body, 65536)\n outcomes.push({\n sequence: event.sequence,\n status: response.status,\n matched:\n event.status === response.status &&\n (event.responseHash === undefined || event.responseHash === hash(body)),\n })\n }\n return {\n version: 1,\n matched: outcomes.every((o) => o.matched),\n complete: !trace.truncated && trace.limitations.length === 0,\n limitations: trace.limitations,\n outcomes,\n baseline: trace.baseline.sha256,\n }\n}\n", "import type { ConfigService, MockingbirdConfig } from \"./cli.js\"\nimport type { ConnectionManifest } from \"./fleet-client.js\"\n\nexport const ingressSupport = {\n stripe: {\n publicOrigin: true,\n pathPrefix: true,\n namespaces: \"path-or-header\",\n streaming: true,\n signing: \"vendor request signing is not used; webhook signatures remain payload based\",\n },\n cognito: {\n publicOrigin: true,\n pathPrefix: true,\n namespaces: \"path-or-header\",\n streaming: true,\n signing:\n \"JWT issuer and JWKS use the configured public namespace; SigV4 verification is not modelled\",\n },\n medplum: {\n publicOrigin: true,\n pathPrefix: true,\n namespaces: \"path-or-header\",\n streaming: true,\n signing: \"FHIR, OAuth and storage URLs use the configured public namespace\",\n },\n other: {\n publicOrigin: false,\n reason:\n \"host/path-sensitive signing and hosted URL rewriting are not certified; use a direct endpoint\",\n },\n} as const\n\nexport function supportsPublicIngress(\n service: string,\n): service is \"stripe\" | \"cognito\" | \"medplum\" {\n return service === \"stripe\" || service === \"cognito\" || service === \"medplum\"\n}\n\n/** Fixed configuration is the only authority for generated/advertised origins. */\nexport function advertisedHttpBase(entry: ConfigService): string | undefined {\n if (entry.publicPath !== undefined && !entry.publicOrigin)\n throw new Error(\"publicPath requires publicOrigin\")\n if (!entry.publicOrigin) return undefined\n const url = new URL(entry.publicOrigin)\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.pathname !== \"/\" ||\n url.search ||\n url.hash\n )\n throw new Error(\"publicOrigin must be an HTTP(S) origin without credentials or a path\")\n const prefix = entry.publicPath ?? \"\"\n if (prefix && (!/^\\/(?:[A-Za-z0-9_-]+\\/?)*$/.test(prefix) || prefix.endsWith(\"/\")))\n throw new Error(\"publicPath must be a canonical path prefix without a trailing slash\")\n return `${url.origin}${prefix}`\n}\n\n/** Fetch-based reference ingress. TLS/DNS are supplied by the caller. Bodies stream both ways. */\nexport function createFleetIngress(\n config: MockingbirdConfig,\n manifest: ConnectionManifest,\n transport: typeof fetch = fetch,\n) {\n const routes = Object.entries(config.services)\n .flatMap(([service, entry]) => {\n const base = advertisedHttpBase(entry)\n if (!base) return []\n if (!supportsPublicIngress(entry.target ?? service))\n throw new Error(\n `public ingress unsupported for ${entry.target ?? service}; host/path-sensitive signatures require a direct endpoint`,\n )\n const privateEndpoint = manifest.services[service]\n if (!privateEndpoint || (entry.protocol && entry.protocol !== \"http\"))\n throw new Error(`missing HTTP ingress participant ${service}`)\n const publicUrl = new URL(base)\n return [\n {\n service,\n entry,\n origin: publicUrl.origin,\n prefix: publicUrl.pathname === \"/\" ? \"\" : publicUrl.pathname,\n privateUrl: new URL(privateEndpoint.url),\n },\n ]\n })\n .sort((a, b) => b.prefix.length - a.prefix.length)\n const keys = routes.map((r) => `${r.origin}${r.prefix}`)\n if (new Set(keys).size !== keys.length) throw new Error(\"ambiguous public ingress mapping\")\n return async (request: Request): Promise<Response> => {\n const url = new URL(request.url)\n const route = routes.find(\n (r) =>\n url.origin === r.origin &&\n (url.pathname === r.prefix || url.pathname.startsWith(`${r.prefix}/`)),\n )\n if (!route) return new Response(\"public ingress route not found\", { status: 404 })\n if (\n (route.entry.target ?? route.service) === \"cognito\" &&\n request.headers.get(\"authorization\")?.startsWith(\"AWS4-HMAC-SHA256\")\n )\n return new Response(\"SigV4 requests require a direct endpoint\", { status: 403 })\n const path = url.pathname.slice(route.prefix.length) || \"/\"\n const adminPrefix = route.entry.adminPrefix ?? config.adminPrefix ?? \"/__admin\"\n // Namespace path carriers select vendor state. All other administration stays private.\n if (\n (path === adminPrefix || path.startsWith(`${adminPrefix}/`)) &&\n !path.startsWith(`${adminPrefix}/ns/`)\n )\n return new Response(\"administration is private\", { status: 403 })\n if (path.startsWith(`${adminPrefix}/ns/`)) {\n const tail = path.slice(`${adminPrefix}/ns/`.length),\n slash = tail.indexOf(\"/\")\n if (\n slash < 1 ||\n tail.slice(slash) === adminPrefix ||\n tail.slice(slash).startsWith(`${adminPrefix}/`)\n )\n return new Response(\"administration is private\", { status: 403 })\n }\n const destination = new URL(route.privateUrl)\n destination.pathname = path\n destination.search = url.search\n const headers = new Headers(request.headers)\n for (const name of [...headers.keys()])\n if (\n name === \"host\" ||\n name === \"forwarded\" ||\n name.startsWith(\"x-forwarded-\") ||\n name === \"x-mockingbird-admin-key\" ||\n name === \"x-mockingbird-initializer\"\n )\n headers.delete(name)\n return transport(\n new Request(destination, {\n method: request.method,\n headers,\n body: request.body,\n signal: request.signal,\n redirect: \"manual\",\n duplex: \"half\",\n } as RequestInit),\n )\n }\n}\n", "import type { Clock } from \"@crvouga/mockingbird-service\"\nimport type { FleetChild } from \"./fleet.js\"\n\nexport type ClockSynchronization = (context: {\n namespace: string\n services: string[]\n now: number\n signal: AbortSignal\n}) => Promise<void>\nexport class FleetTimeController {\n constructor(\n private readonly context: {\n clock(namespace: string): Clock\n transaction(\n namespace: string,\n selected: Map<string, FleetChild>,\n run: (name: string, child: FleetChild) => Promise<unknown>,\n ): Promise<Response>\n phase(namespace: string, phase: string, completed?: number, total?: number): void\n synchronize?: ClockSynchronization\n recovery: Map<string, (() => void)[]>\n },\n ) {}\n async run(\n namespace: string,\n selected: Map<string, FleetChild>,\n body: Record<string, unknown>,\n single: boolean,\n ) {\n const condition = body.condition ?? \"no-events\",\n maxEvents = single ? 1 : (body.maxEvents ?? 100),\n maxAdvanceMs = body.maxAdvanceMs ?? 86400000,\n timeoutMs = body.timeoutMs ?? 5000\n if (\n ![\"no-events\", \"idle\", \"checkpoint-ready\"].includes(String(condition)) ||\n typeof maxEvents !== \"number\" ||\n !Number.isSafeInteger(maxEvents) ||\n maxEvents < 1 ||\n maxEvents > 10000 ||\n typeof maxAdvanceMs !== \"number\" ||\n !Number.isFinite(maxAdvanceMs) ||\n maxAdvanceMs < 0 ||\n typeof timeoutMs !== \"number\" ||\n !Number.isSafeInteger(timeoutMs) ||\n timeoutMs < 1 ||\n timeoutMs > 30000\n )\n throw new Error(\"invalid bounded time-control condition or budgets\")\n const unsupported = [...selected].filter(([, child]) => !child.nextEvent).map(([name]) => name)\n if (unsupported.length)\n throw new Error(`next-event inspection unsupported for ${unsupported.join(\", \")}`)\n const clocks = [...selected.values()].map((child) => child.clock(namespace).state())\n if (clocks.some((clock) => !clock.frozen || clock.now !== clocks[0]?.now))\n throw new Error(\"freeze and align selected participant clocks before event stepping\")\n const start = clocks[0]?.now ?? this.context.clock(namespace).now(),\n deadline = Date.now() + timeoutMs\n const steps: { now: number; processed: string[] }[] = []\n const diagnostics = () =>\n Object.fromEntries([...selected].map(([name, child]) => [name, child.diagnostics(namespace)]))\n const bounded = async <T>(promise: Promise<T>): Promise<T> => {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () =>\n reject(\n Object.assign(\n new Error(\"time-control host budget exceeded; recovery may be required\"),\n { code: \"MOCKINGBIRD_WORKLOAD_UNCERTAIN\" },\n ),\n ),\n Math.max(1, deadline - Date.now()),\n )\n }),\n ])\n } finally {\n clearTimeout(timer)\n }\n }\n for (;;) {\n const due = await bounded(\n Promise.all(\n [...selected].map(\n async ([name, child]) => [name, await child.nextEvent?.(namespace)] as const,\n ),\n ),\n )\n if (due.some(([, time]) => time !== undefined && !Number.isFinite(time)))\n throw new Error(\"participant returned an invalid event time\")\n const services = diagnostics(),\n states = Object.values(services)\n const ready =\n condition === \"checkpoint-ready\"\n ? states.every(\n (d) =>\n d.activeRequests + d.blockedCommands + d.pendingWebhooks + (d.activeJobs ?? 0) ===\n 0,\n )\n : condition === \"idle\"\n ? states.every(\n (d) =>\n d.activeRequests + d.blockedCommands + d.pendingWebhooks + d.pendingJobs === 0,\n )\n : due.every(([, time]) => time === undefined)\n if (!single && ready)\n return Response.json({ status: \"settled\", namespace, condition, steps, services })\n const times = due.flatMap(([, time]) => (time === undefined ? [] : [time]))\n if (!times.length)\n return Response.json({\n status: \"no-events\",\n namespace,\n condition,\n settled: ready,\n steps,\n services,\n })\n const current = [...selected.values()][0]?.clock(namespace).now() ?? start,\n target = Math.max(current, Math.min(...times))\n if (Date.now() >= deadline || steps.length >= maxEvents || target - start > maxAdvanceMs)\n return Response.json(\n { status: \"budget-exhausted\", namespace, condition, steps, services },\n { status: 409 },\n )\n const signal = AbortSignal.timeout(Math.max(1, deadline - Date.now()))\n const response = await this.context.transaction(namespace, selected, async (_name, child) => {\n child.clock(namespace).set(target)\n if (child.settle) await bounded(child.settle(namespace, signal))\n })\n if (!response.ok) return response\n this.context.clock(namespace).freeze()\n this.context.clock(namespace).set(target)\n try {\n if (this.context.synchronize)\n await bounded(\n this.context.synchronize({\n namespace,\n services: [...selected.keys()],\n now: target,\n signal,\n }),\n )\n } catch (error) {\n const fences: (() => void)[] = []\n for (const child of selected.values())\n try {\n fences.push(child.lock(namespace))\n } catch {}\n this.context.recovery.set(namespace, fences)\n throw error\n }\n const processed = due\n .filter(([, time]) => time !== undefined && time <= target)\n .map(([name]) => name)\n steps.push({ now: target, processed })\n this.context.phase(namespace, \"stepping\", steps.length, steps.length)\n if (single)\n return Response.json({\n status: \"stepped\",\n namespace,\n steps,\n services: diagnostics(),\n clientClockSynchronization: this.context.synchronize\n ? \"hook-invoked\"\n : \"external worker clocks are unchanged\",\n })\n }\n }\n}\n", "import { readFile, realpath } from \"node:fs/promises\"\nimport { createRequire } from \"node:module\"\nimport { basename, dirname, resolve } from \"node:path\"\nimport { normalizeBootControls, resolveAdminPrefix } from \"@crvouga/mockingbird-service\"\nimport type { MockingbirdConfig } from \"./cli.js\"\nimport type { FleetOptions, FleetTarget } from \"./fleet.js\"\nimport { validateCompatibilityTags } from \"./fleet-archive.js\"\nimport { advertisedHttpBase, supportsPublicIngress } from \"./fleet-proxy.js\"\nimport { assertFleetConfig } from \"./fleet-schema.js\"\n\nconst destination = async (path: string): Promise<string> => {\n const absolute = resolve(path)\n try {\n return await realpath(absolute)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error\n const parent = dirname(absolute)\n return parent === absolute ? absolute : resolve(await destination(parent), basename(absolute))\n }\n}\n\n/** Read-only validation/load phase. No target starts until every entry passes. */\nexport async function preflightFleet(config: MockingbirdConfig, options: FleetOptions) {\n if (\n options.readyFile &&\n options.connectionsFile &&\n (await destination(options.readyFile)) === (await destination(options.connectionsFile))\n )\n throw new Error(\"ready-file and connections-file destinations must differ\")\n if (\n !config.services ||\n typeof config.services !== \"object\" ||\n (!Object.keys(config.services).length && !Object.keys(options.participants ?? {}).length)\n )\n throw new Error(\"config must contain at least one service\")\n validateFleetPolicies(options)\n if (\n options.archiveProtection &&\n options.repository &&\n options.repository.protectionPolicy?.format !== options.archiveProtection.policy.format\n )\n throw new Error(\n \"protected archive policy requires a protected repository; configure its protector before startup\",\n )\n resolveAdminPrefix(config.adminPrefix)\n normalizeBootControls(config.adminControls)\n const targets = new Map<string, FleetTarget>()\n const ports = new Set<string>()\n for (const [name, entry] of Object.entries(config.services)) {\n try {\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name)) throw new Error(\"invalid service name\")\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry))\n throw new Error(\"expected service object\")\n resolveAdminPrefix(entry.adminPrefix ?? config.adminPrefix)\n normalizeBootControls(\n { ...config.adminControls, ...entry.adminControls },\n `services.${name}.adminControls`,\n )\n if (\n entry.port !== undefined &&\n (!Number.isInteger(entry.port) || entry.port < 0 || entry.port > 65535)\n )\n throw new Error(\"invalid port\")\n if (entry.target !== undefined && !/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(entry.target))\n throw new Error(\"target must name a supported service suffix\")\n const service = entry.target ?? name\n if (advertisedHttpBase(entry) && !supportsPublicIngress(service))\n throw new Error(\n `public ingress unsupported for ${service}; use a direct endpoint to preserve signed targets`,\n )\n const target = await options.load(service)\n const protocol = \"protocol\" in target ? target.protocol : \"http\"\n if (entry.protocol !== undefined && entry.protocol !== protocol)\n throw new Error(\"configured protocol does not match target\")\n if (protocol !== \"http\") {\n if (\n entry.seed !== undefined &&\n (!String(entry.seed).trim() || !Number.isFinite(Number(entry.seed)))\n )\n throw new Error(\"protocol seed must be a finite number\")\n for (const [namespace, selector] of Object.entries(entry.namespaces ?? {})) {\n if (!/^[A-Za-z0-9_.-]{1,64}$/.test(namespace)) throw new Error(\"invalid namespace\")\n if (\n protocol === \"postgres\"\n ? typeof selector !== \"string\" || !selector.length\n : typeof selector !== \"number\" ||\n !Number.isInteger(selector) ||\n selector < 0 ||\n selector > 15\n )\n throw new Error(\"invalid protocol namespace selector\")\n }\n }\n const port = entry.port ?? target.defaultPort\n if (port !== 0) {\n const key = `${entry.host ?? \"127.0.0.1\"}:${port}`\n if (ports.has(key)) throw new Error(`duplicate listener ${key}`)\n ports.add(key)\n }\n let packageVersion = target.packageVersion\n if (!packageVersion) {\n for (const from of [\n createRequire(resolve(process.cwd(), \"package.json\")),\n createRequire(import.meta.url),\n ]) {\n try {\n let directory = dirname(from.resolve(`@crvouga/mockingbird-service-${service}/server`))\n for (;;) {\n try {\n const manifest = JSON.parse(\n await readFile(resolve(directory, \"package.json\"), \"utf8\"),\n ) as { name?: string; version?: string }\n if (manifest.name === `@crvouga/mockingbird-service-${service}`) {\n packageVersion = manifest.version\n break\n }\n } catch {}\n const parent = dirname(directory)\n if (parent === directory) break\n directory = parent\n }\n } catch {}\n if (packageVersion) break\n }\n }\n targets.set(name, { ...target, packageVersion: packageVersion ?? \"0.0.0-development\" })\n } catch (error) {\n throw new Error(\n `service ${name}: ${error instanceof Error ? error.message : String(error)}`,\n { cause: error },\n )\n }\n }\n for (const [name, participant] of Object.entries(options.participants ?? {})) {\n if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(name) || targets.has(name))\n throw new Error(`external participant identity collision ${name}`)\n if (participant.protocol !== \"external\")\n throw new Error(`registered participant ${name} must declare external protocol`)\n targets.set(name, {\n name,\n protocol: \"external\",\n defaultPort: 0,\n start: async () => participant,\n })\n }\n assertFleetConfig(\n config,\n Object.fromEntries(\n [...targets].map(([name, target]) => [\n config.services[name]?.target ?? name,\n \"options\" in target ? (target.options ?? {}) : {},\n ]),\n ),\n )\n const ordered = new Map<string, FleetTarget>()\n const visiting = new Set<string>()\n const visit = (name: string, chain: string[]) => {\n if (ordered.has(name)) return\n if (!targets.has(name)) throw new Error(`unknown dependency ${[...chain, name].join(\" -> \")}`)\n if (visiting.has(name)) throw new Error(`dependency cycle ${[...chain, name].join(\" -> \")}`)\n visiting.add(name)\n const dependencies =\n config.services[name]?.dependsOn ?? options.participants?.[name]?.dependencies ?? []\n if (!Array.isArray(dependencies) || dependencies.some((d) => typeof d !== \"string\"))\n throw new Error(`services.${name}.dependsOn must be a list of instance names`)\n for (const dependency of dependencies) visit(dependency, [...chain, name])\n visiting.delete(name)\n ordered.set(name, targets.get(name) as FleetTarget)\n }\n for (const name of targets.keys()) visit(name, [])\n return ordered\n}\n\n/** Policy errors are configuration errors and must precede listener creation. */\nexport function validateFleetPolicies(options: FleetOptions) {\n if (options.archiveCompatibility) {\n validateCompatibilityTags(options.archiveCompatibility.tags)\n if (\n options.archiveCompatibility.missing !== undefined &&\n ![\"allow\", \"reject\"].includes(options.archiveCompatibility.missing)\n )\n throw new Error(\"archiveCompatibility.missing must be allow or reject\")\n }\n if (options.journal && !options.repository)\n throw new Error(\"durable operation journal requires an archive repository\")\n if (options.cors) {\n if (\n !Array.isArray(options.cors.origins) ||\n options.cors.origins.some((o) => {\n try {\n const u = new URL(o)\n return ![\"http:\", \"https:\"].includes(u.protocol) || u.origin !== o\n } catch {\n return true\n }\n })\n )\n throw new Error(\"cors.origins must contain explicit HTTP origins\")\n if (\n options.cors.methods?.some(\n (m) => ![\"GET\", \"POST\", \"PUT\", \"DELETE\", \"HEAD\", \"OPTIONS\"].includes(m),\n ) ||\n options.cors.headers?.some((h) => !/^[a-zA-Z0-9-]+$/.test(h))\n )\n throw new Error(\"invalid CORS methods/headers\")\n }\n for (const [key, value] of Object.entries(options.limits ?? {})) {\n if (![\"maxNamespaces\", \"maxListeners\", \"connections\"].includes(key))\n throw new Error(`unsupported namespace budget ${key}`)\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(`invalid limit ${key}`)\n }\n for (const [key, value] of Object.entries(options.retention ?? {}))\n if (![\"maxCount\", \"ttlMs\"].includes(key) || !Number.isSafeInteger(value) || value < 1)\n throw new Error(`invalid retention ${key}`)\n if (\n options.backupPolicy &&\n (!options.repository ||\n !Number.isSafeInteger(options.backupPolicy.intervalMs) ||\n options.backupPolicy.intervalMs < 10 ||\n (options.backupPolicy.keep !== undefined &&\n (!Number.isSafeInteger(options.backupPolicy.keep) || options.backupPolicy.keep < 1)))\n )\n throw new Error(\"backup policy requires a repository, intervalMs >= 10 and positive retention\")\n if (\n options.expiry &&\n (!Number.isSafeInteger(options.expiry.idleMs) ||\n options.expiry.idleMs < 1 ||\n (options.expiry.intervalMs !== undefined &&\n (!Number.isSafeInteger(options.expiry.intervalMs) || options.expiry.intervalMs < 10)) ||\n (options.expiry.finalBackup && !options.repository))\n )\n throw new Error(\"invalid expiry policy or missing final-backup repository\")\n for (const duration of [\n options.hookTimeoutMs,\n options.initializationTimeoutMs,\n options.shutdownTimeoutMs,\n ])\n if (duration !== undefined && (!Number.isSafeInteger(duration) || duration < 1))\n throw new Error(\"hook deadlines must be positive integer milliseconds\")\n}\n", "{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://mockingbird.chrisvouga.dev/schemas/fleet-v1.json\",\n \"title\": \"Mockingbird fleet configuration v1\",\n \"type\": \"object\",\n \"required\": [\"services\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"$schema\": {\n \"const\": \"https://mockingbird.chrisvouga.dev/schemas/fleet-v1.json\"\n },\n \"schemaVersion\": {\n \"const\": 1\n },\n \"services\": {\n \"type\": \"object\",\n \"propertyNames\": {\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*$\"\n },\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/service\"\n }\n },\n \"log\": {\n \"enum\": [\"pretty\", \"json\", \"off\"]\n },\n \"adminPrefix\": {\n \"type\": \"string\"\n },\n \"adminKey\": {\n \"type\": \"string\"\n },\n \"adminControls\": {\n \"$ref\": \"#/$defs/controls\"\n },\n \"namespace\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Za-z0-9_.-]{1,64}$\"\n },\n \"control\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"port\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 65535\n },\n \"host\": {\n \"type\": \"string\"\n }\n }\n },\n \"cors\": {\n \"type\": \"object\",\n \"required\": [\"origins\"],\n \"additionalProperties\": false,\n \"properties\": {\n \"origins\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"methods\": {\n \"type\": \"array\",\n \"items\": {\n \"enum\": [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"HEAD\", \"OPTIONS\"]\n }\n },\n \"headers\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"extensions\": {\n \"type\": \"object\",\n \"propertyNames\": {\n \"pattern\": \"^x-[a-z0-9-]+$\"\n },\n \"additionalProperties\": false\n }\n },\n \"$defs\": {\n \"service\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"pattern\": \"^[a-z0-9]+(?:-[a-z0-9]+)*$\"\n },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"protocol\": {\n \"enum\": [\"http\", \"postgres\", \"redis\"]\n },\n \"port\": {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 65535\n },\n \"host\": {\n \"type\": \"string\"\n },\n \"adminPrefix\": {\n \"type\": \"string\"\n },\n \"adminKey\": {\n \"type\": \"string\"\n },\n \"seed\": {\n \"type\": \"string\"\n },\n \"adminControls\": {\n \"$ref\": \"#/$defs/controls\"\n },\n \"fixtures\": {\n \"type\": \"object\"\n },\n \"baseUrl\": {\n \"type\": \"string\"\n },\n \"password\": {\n \"type\": \"string\"\n },\n \"user\": {\n \"type\": \"string\"\n },\n \"database\": {\n \"type\": \"string\"\n },\n \"namespaces\": {\n \"type\": \"object\",\n \"propertyNames\": {\n \"pattern\": \"^[A-Za-z0-9_.-]{1,64}$\"\n },\n \"additionalProperties\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"integer\",\n \"minimum\": 0,\n \"maximum\": 15\n }\n ]\n }\n },\n \"options\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"description\": \"Compose the selected target option schema before supplying service-specific flags.\"\n },\n \"publicOrigin\": {\n \"type\": \"string\"\n },\n \"publicPath\": {\n \"type\": \"string\"\n }\n }\n },\n \"controls\": {\n \"type\": \"object\",\n \"additionalProperties\": false,\n \"properties\": {\n \"seed\": {},\n \"clock\": {\n \"type\": \"object\"\n },\n \"latency\": {},\n \"faults\": {\n \"type\": \"array\"\n },\n \"snapshot\": {\n \"type\": \"object\"\n },\n \"virtualTime\": {\n \"type\": \"boolean\"\n },\n \"credentials\": {\n \"type\": \"object\"\n },\n \"namespaces\": {\n \"type\": \"object\"\n }\n }\n }\n }\n}\n", "import type { CliOption, MockingbirdConfig } from \"./cli.js\"\nimport schema from \"./fleet-config.schema.json\" with { type: \"json\" }\n\nexport const fleetConfigSchema = schema\nexport type ConfigIssue = { path: string; message: string }\ntype Schema = {\n $ref?: string\n type?: string\n const?: unknown\n enum?: unknown[]\n anyOf?: Schema[]\n required?: string[]\n properties?: Record<string, Schema>\n additionalProperties?: boolean | Schema\n items?: Schema\n propertyNames?: Schema\n pattern?: string\n minimum?: number\n maximum?: number\n $defs?: Record<string, Schema>\n}\nconst object = (v: unknown): v is Record<string, unknown> =>\n v !== null && typeof v === \"object\" && !Array.isArray(v)\n/** Standalone validation uses exactly the published schema; composing targets admits only declared flags. */\nexport function validateFleetConfig(\n value: unknown,\n targetOptions: Record<string, Record<string, CliOption>> = {},\n extensions: Record<string, Schema> = {},\n): ConfigIssue[] {\n const composed = composeFleetSchema(value, targetOptions, extensions) as Schema,\n issues: ConfigIssue[] = []\n const walk = (input: unknown, rule: Schema, path: string, output: ConfigIssue[]) => {\n if (rule.$ref) {\n const resolved = composed.$defs?.[rule.$ref.slice(\"#/$defs/\".length)]\n if (!resolved) output.push({ path, message: \"unresolved configuration schema\" })\n else walk(input, resolved, path, output)\n return\n }\n if (rule.anyOf) {\n if (\n !rule.anyOf.some((branch) => {\n const found: ConfigIssue[] = []\n walk(input, branch, path, found)\n return found.length === 0\n })\n )\n output.push({ path, message: \"value does not match an allowed shape\" })\n return\n }\n if (\"const\" in rule && input !== rule.const) {\n output.push({\n path,\n message:\n path === \"$.schemaVersion\" || path === \"$.$schema\"\n ? \"unsupported fleet schema version; upgrade the consumer/schema together\"\n : \"unexpected fixed value\",\n })\n return\n }\n if (rule.enum && !rule.enum.includes(input))\n output.push({ path, message: \"unsupported enumerated value\" })\n if (rule.type) {\n const valid =\n rule.type === \"object\"\n ? object(input)\n : rule.type === \"array\"\n ? Array.isArray(input)\n : rule.type === \"integer\"\n ? typeof input === \"number\" && Number.isInteger(input)\n : typeof input === rule.type\n if (!valid) {\n output.push({ path, message: `expected ${rule.type}` })\n return\n }\n }\n if (\n typeof input === \"number\" &&\n ((rule.minimum !== undefined && input < rule.minimum) ||\n (rule.maximum !== undefined && input > rule.maximum))\n )\n output.push({ path, message: \"number outside supported bounds\" })\n if (typeof input === \"string\" && rule.pattern && !new RegExp(rule.pattern).test(input))\n output.push({ path, message: \"invalid identifier\" })\n if (Array.isArray(input) && rule.items)\n input.forEach((entry, index) => {\n walk(entry, rule.items as Schema, `${path}[${index}]`, output)\n })\n if (object(input)) {\n for (const name of rule.required ?? [])\n if (!Object.hasOwn(input, name))\n output.push({ path: `${path}.${name}`, message: \"required field missing\" })\n for (const [key, entry] of Object.entries(input)) {\n if (rule.propertyNames) walk(key, rule.propertyNames, `${path}.${key}`, output)\n const property = rule.properties?.[key]\n if (property) walk(entry, property, `${path}.${key}`, output)\n else if (rule.additionalProperties === false)\n output.push({ path: `${path}.${key}`, message: \"unknown configuration field\" })\n else if (object(rule.additionalProperties))\n walk(entry, rule.additionalProperties, `${path}.${key}`, output)\n }\n }\n }\n walk(value, composed, \"$\", issues)\n return issues\n}\nexport function composeFleetSchema(\n value: unknown,\n targetOptions: Record<string, Record<string, CliOption>> = {},\n extensions: Record<string, Schema> = {},\n) {\n const composed = structuredClone(schema) as unknown as Schema\n const serviceRule = composed.$defs?.service as Schema\n const servicesRule = composed.properties?.services as Schema\n servicesRule.properties = {}\n if (object(value) && object(value.services))\n for (const [instance, entry] of Object.entries(value.services)) {\n if (!object(entry)) continue\n const target = typeof entry.target === \"string\" ? entry.target : instance\n const declared = targetOptions[target] ?? {}\n const configured = structuredClone(serviceRule)\n configured.properties = {\n ...configured.properties,\n options: {\n type: \"object\",\n additionalProperties: false,\n properties: Object.fromEntries(\n Object.entries(declared).map(([key, option]) => [key, { type: option.type }]),\n ),\n },\n }\n servicesRule.properties[instance] = configured\n }\n if (composed.properties?.extensions) composed.properties.extensions.properties = extensions\n return composed\n}\nexport function assertFleetConfig(\n config: MockingbirdConfig,\n targetOptions: Record<string, Record<string, CliOption>> = {},\n) {\n const issues = validateFleetConfig(config, targetOptions)\n if (issues.length)\n throw new Error(\n issues\n .slice(0, 20)\n .map((i) => `${i.path}: ${i.message}`)\n .join(\"; \"),\n )\n}\n", "import { createServer, type Server } from \"node:http\"\nimport { Readable } from \"node:stream\"\nimport type { FetchAPI } from \"@crvouga/mockingbird-core\"\n\n/** Limits apply incrementally, including chunked uploads. Bodies reach fetch as a stream. */\nexport type NodeServeOptions = {\n port?: number\n host?: string\n maxBodyBytes?: number\n requestTimeoutMs?: number\n}\n\n/** Serve a FetchAPI with bounded streaming uploads and disconnect-aware response backpressure. */\nexport const serve = async (api: FetchAPI, options: NodeServeOptions = {}): Promise<Server> => {\n const maxBytes = options.maxBodyBytes ?? 16 * 1024 * 1024\n const timeoutMs = options.requestTimeoutMs ?? 30_000\n if (\n !Number.isSafeInteger(maxBytes) ||\n maxBytes < 0 ||\n !Number.isSafeInteger(timeoutMs) ||\n timeoutMs < 1\n )\n throw new Error(\"invalid request limits\")\n const server = createServer(async (req, res) => {\n const aborted = new AbortController()\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined\n let timer: ReturnType<typeof setTimeout> | undefined\n const abort = () => {\n aborted.abort()\n void reader?.cancel().catch(() => {})\n }\n const fail = (status: number, message: string) => {\n if (!res.headersSent && !res.destroyed) {\n res.writeHead(status, { \"content-type\": \"application/json\", connection: \"close\" })\n res.end(JSON.stringify({ error: { type: \"mockingbird_transport\", message } }))\n }\n abort()\n }\n req.once(\"aborted\", abort)\n res.once(\"close\", abort)\n res.once(\"error\", abort)\n try {\n const address = server.address()\n const port = typeof address === \"object\" && address !== null ? address.port : 80\n const url = new URL(\n (req.url ?? \"/\").replace(/^\\/+/, \"/\"),\n `http://${req.headers.host ?? `localhost:${port}`}`,\n )\n const headers = new Headers()\n for (const [name, value] of Object.entries(req.headers)) {\n if (Array.isArray(value)) for (const item of value) headers.append(name, item)\n else if (value !== undefined) headers.set(name, value)\n }\n const init: RequestInit & { duplex?: \"half\" } = {\n method: req.method ?? \"GET\",\n headers,\n signal: aborted.signal,\n }\n if (init.method !== \"GET\" && init.method !== \"HEAD\") {\n if (Number(req.headers[\"content-length\"]) > maxBytes) {\n fail(413, \"request body exceeds byte limit\")\n return\n }\n let bytes = 0\n const source = Readable.toWeb(req) as unknown as ReadableStream<Uint8Array>\n init.body = source.pipeThrough(\n new TransformStream<Uint8Array, Uint8Array>({\n transform(chunk, controller) {\n bytes += chunk.byteLength\n if (bytes > maxBytes) {\n fail(413, \"request body exceeds byte limit\")\n controller.error(new Error(\"request body exceeds byte limit\"))\n } else controller.enqueue(chunk)\n },\n }),\n )\n init.duplex = \"half\"\n timer = setTimeout(() => fail(408, \"request body timed out\"), timeoutMs)\n req.once(\"end\", () => clearTimeout(timer))\n }\n const response = await api.fetch(new Request(url, init))\n if (aborted.signal.aborted || res.destroyed) {\n await response.body?.cancel()\n return\n }\n const output: Record<string, string | string[]> = Object.fromEntries(response.headers)\n const cookies = response.headers.getSetCookie()\n if (cookies.length) output[\"set-cookie\"] = cookies\n res.writeHead(response.status, output)\n if (!response.body) {\n res.end()\n return\n }\n res.flushHeaders()\n reader = response.body.getReader()\n for (;;) {\n const { done, value } = await reader.read()\n if (done || aborted.signal.aborted) break\n if (!res.write(value)) {\n await new Promise<void>((resolve) => {\n const finish = () => {\n res.off(\"drain\", finish)\n res.off(\"close\", finish)\n res.off(\"error\", finish)\n resolve()\n }\n res.once(\"drain\", finish)\n res.once(\"close\", finish)\n res.once(\"error\", finish)\n if (res.destroyed || aborted.signal.aborted) finish()\n })\n }\n }\n if (!aborted.signal.aborted) res.end()\n } catch (error) {\n if ((error as { code?: string }).code === \"MOCKINGBIRD_DROP\") req.socket.destroy()\n else if (!aborted.signal.aborted && !res.destroyed) {\n if (res.headersSent) res.destroy()\n else {\n res.writeHead(500, { \"content-type\": \"application/json\" })\n res.end(\n JSON.stringify({\n error: {\n type: \"mockingbird_internal\",\n message: error instanceof Error ? error.message : String(error),\n },\n }),\n )\n }\n }\n } finally {\n clearTimeout(timer)\n reader?.releaseLock()\n req.off(\"aborted\", abort)\n res.off(\"close\", abort)\n res.off(\"error\", abort)\n if (!req.complete) req.resume()\n }\n })\n server.requestTimeout = timeoutMs\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(options.port ?? 0, options.host, resolve)\n })\n return server\n}\n", "import type { Server } from \"node:http\"\nimport type { FetchAPI } from \"@crvouga/mockingbird-core\"\nimport { serve } from \"./serve.js\"\n\nexport type ListenOptions = {\n /** Default `0`: the OS picks a free port. */\n port?: number\n /** Default `127.0.0.1`: a mock should not be reachable off the machine by accident. */\n host?: string\n}\n\n/** A running server, with the address it actually bound. */\nexport type Listening = {\n url: string\n port: number\n host: string\n server: Server\n close(): Promise<void>\n}\n\nexport const listen = async (api: FetchAPI, options: ListenOptions = {}): Promise<Listening> => {\n const host = options.host ?? \"127.0.0.1\"\n const server = await serve(api, { port: options.port ?? 0, host })\n const address = server.address()\n const port = typeof address === \"object\" && address !== null ? address.port : (options.port ?? 0)\n const shown = host.includes(\":\") ? `[${host}]` : host\n return {\n url: `http://${shown}:${port}`,\n port,\n host,\n server,\n close: () =>\n new Promise<void>((resolve, reject) => {\n // Stop accepting first, then drop keep-alive sockets so close() can finish.\n server.close((error) => {\n if (error && (error as { code?: string }).code !== \"ERR_SERVER_NOT_RUNNING\") reject(error)\n else resolve()\n })\n server.closeAllConnections?.()\n }),\n }\n}\n", "import { createRequire } from \"node:module\"\nimport { resolve } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport type { FleetTarget } from \"./fleet.js\"\n\nconst suffix = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n/** Resolve only declared installed packages, relative to the consumer (including pnpm links).\n * No downloads, arbitrary module paths, or public-request-selected imports are supported.\n */\nexport function createInstalledServiceLoader(options: {\n projectRoot: string\n services: readonly string[]\n targets?: readonly FleetTarget[]\n}): (name: string) => Promise<FleetTarget> {\n if (!options.projectRoot) throw new Error(\"consumer projectRoot required\")\n const allowed = new Set(options.services)\n for (const name of allowed) if (!suffix.test(name)) throw new Error(\"invalid service suffix\")\n const require = createRequire(resolve(options.projectRoot, \"package.json\"))\n const targets = new Map((options.targets ?? []).map((target) => [target.name, target]))\n return async (name) => {\n if (!suffix.test(name) || !allowed.has(name))\n throw new Error(\"service is not declared in loader allowlist\")\n const own = targets.get(name)\n if (own) return own\n const specifier = `@crvouga/mockingbird-service-${name}/server`\n let location: string\n try {\n location = require.resolve(specifier)\n } catch {\n throw new Error(\n `cannot load service \"${name}\": install @crvouga/mockingbird-service-${name} in the consumer project; its /server export is required`,\n )\n }\n const mod = (await import(pathToFileURL(location).href)) as { serveTarget?: FleetTarget }\n if (\n !mod.serveTarget ||\n mod.serveTarget.name !== name ||\n (\"protocol\" in mod.serveTarget\n ? typeof mod.serveTarget.start !== \"function\"\n : typeof mod.serveTarget.create !== \"function\")\n )\n throw new Error(`${specifier} exports no matching serveTarget`)\n return mod.serveTarget\n }\n}\n", "import { readFile } from \"node:fs/promises\"\nimport { createRequire } from \"node:module\"\nimport { resolve } from \"node:path\"\nimport { type Fleet, type FleetOptions, startFleet } from \"./fleet.js\"\nimport { assertArchiveCompatibility, type FleetArchive } from \"./fleet-archive.js\"\nimport {\n type ConnectionManifest,\n type ConnectionMapping,\n FleetClient,\n renderConnections,\n writeConnections,\n} from \"./fleet-client.js\"\nimport { preflightFleet } from \"./fleet-preflight.js\"\nimport type { CliCommand, FleetTarget, MockingbirdConfig } from \"./index.js\"\n\nexport async function doctorFleet(\n config: MockingbirdConfig,\n options: FleetOptions,\n probes: { url: string; timeoutMs?: number }[] = [],\n) {\n const findings: { check: string; ok: boolean; message: string }[] = []\n const plan: { service: string; protocol: string; port: number; version: string }[] = []\n try {\n const targets = await preflightFleet(config, options)\n const require = createRequire(resolve(process.cwd(), \"package.json\"))\n for (const [service, target] of targets) {\n let version = \"development\"\n try {\n version = (\n require(`@crvouga/mockingbird-service-${service}/package.json`) as { version: string }\n ).version\n } catch {}\n plan.push({\n service,\n protocol: \"protocol\" in target ? target.protocol : \"http\",\n port: config.services[service]?.port ?? target.defaultPort,\n version,\n })\n }\n findings.push({\n check: \"configuration\",\n ok: true,\n message: \"all targets and control documents validated; no listeners opened\",\n })\n } catch (error) {\n findings.push({\n check: \"configuration\",\n ok: false,\n message: error instanceof Error ? error.message : \"configuration failed\",\n })\n }\n for (const probe of probes) {\n try {\n const url = new URL(probe.url)\n if (url.username || url.password) throw new Error(\"probe URLs must not contain credentials\")\n const response = await fetch(url, { signal: AbortSignal.timeout(probe.timeoutMs ?? 2000) })\n await response.body?.cancel()\n findings.push({\n check: \"reachability\",\n ok: response.ok,\n message: `endpoint returned HTTP ${response.status}`,\n })\n } catch {\n findings.push({\n check: \"reachability\",\n ok: false,\n message: \"endpoint unreachable; verify the listener host, port and readiness\",\n })\n }\n }\n return {\n version: 1,\n ok: findings.every((f) => f.ok),\n findings,\n plan,\n storageWritesPerformed: false,\n }\n}\n\n/** Boots a separate in-memory fleet on ephemeral ports; never uses source files or repositories. */\nexport async function rehearseFleet(\n config: MockingbirdConfig,\n options: Pick<FleetOptions, \"load\" | \"archiveCompatibility\">,\n input: unknown,\n probes: ((fleet: Fleet, signal: AbortSignal) => Promise<void>)[] = [],\n timeoutMs = 30000,\n) {\n const archive = assertArchiveCompatibility(input, options.archiveCompatibility)\n const startedAt = new Date().toISOString()\n const isolated: MockingbirdConfig = {\n ...config,\n control: { host: \"127.0.0.1\", port: 0 },\n services: Object.fromEntries(\n Object.entries(config.services).map(([name, entry]) => [\n name,\n { ...entry, host: \"127.0.0.1\", port: 0 },\n ]),\n ),\n }\n let fleet: Fleet | undefined\n try {\n fleet = await startFleet(isolated, options)\n const client = new FleetClient(fleet.manifest.adminBase, {\n ...(config.adminKey ? { adminKey: config.adminKey } : {}),\n })\n await client.importArchive(archive)\n const signal = AbortSignal.timeout(timeoutMs)\n for (const probe of probes)\n await Promise.race([\n probe(fleet, signal),\n new Promise<never>((_, reject) =>\n signal.addEventListener(\"abort\", () => reject(new Error(\"rehearsal probe timed out\")), {\n once: true,\n }),\n ),\n ])\n return {\n version: 1,\n ok: true,\n startedAt,\n finishedAt: new Date().toISOString(),\n sourceArchive: archive.sha256,\n rehearsalProcess: fleet.manifest.id,\n probes: probes.length,\n }\n } finally {\n await fleet?.close()\n }\n}\n\nexport function fleetCommands(\n load: (name: string) => Promise<FleetTarget>,\n): Record<string, CliCommand> {\n const parse = async (path: unknown) => {\n if (typeof path !== \"string\") throw new Error(\"file path required\")\n return JSON.parse(await readFile(path, \"utf8\")) as unknown\n }\n return {\n \"fleet control\": {\n summary: \"Call authenticated fleet controls using discovered adminBase\",\n options: {\n base: { type: \"string\", description: \"Discovered adminBase URL\" },\n action: { type: \"string\", description: \"Relative control route\" },\n method: { type: \"string\", description: \"HTTP method\" },\n body: { type: \"string\", description: \"JSON request file\" },\n namespace: { type: \"string\", description: \"Selected namespace\" },\n \"key-env\": {\n type: \"string\",\n description: \"Admin-key environment variable name\",\n default: \"MOCKINGBIRD_ADMIN_KEY\",\n },\n \"idempotency-key\": { type: \"string\", description: \"Retry identity\" },\n },\n async run(values) {\n try {\n if (typeof values.base !== \"string\" || typeof values.action !== \"string\")\n throw new Error(\"--base and --action required\")\n const key = process.env[String(values[\"key-env\"] ?? \"MOCKINGBIRD_ADMIN_KEY\")]\n const client = new FleetClient(values.base, {\n ...(key ? { adminKey: key } : {}),\n ...(typeof values.namespace === \"string\" ? { namespace: values.namespace } : {}),\n })\n console.log(\n JSON.stringify(\n await client.request(values.action, {\n ...(typeof values.method === \"string\" ? { method: values.method } : {}),\n ...(values.body ? { body: await parse(values.body) } : {}),\n ...(typeof values[\"idempotency-key\"] === \"string\"\n ? { idempotencyKey: values[\"idempotency-key\"] }\n : {}),\n }),\n ),\n )\n return 0\n } catch (error) {\n console.error(error instanceof Error ? error.message : \"fleet control failed\")\n return 1\n }\n },\n },\n \"fleet doctor\": {\n summary: \"Validate fleet configuration without starting or resetting services\",\n options: {\n config: { type: \"string\", description: \"Fleet configuration file\" },\n json: { type: \"boolean\", description: \"Machine-readable report\" },\n endpoint: { type: \"string\", description: \"Optional read-only reachability probe\" },\n \"ready-file\": { type: \"string\", description: \"Validate readiness destination\" },\n \"connections-file\": { type: \"string\", description: \"Validate private destination\" },\n },\n async run(values) {\n try {\n const report = await doctorFleet(\n (await parse(values.config)) as MockingbirdConfig,\n {\n load,\n ...(typeof values[\"ready-file\"] === \"string\"\n ? { readyFile: values[\"ready-file\"] }\n : {}),\n ...(typeof values[\"connections-file\"] === \"string\"\n ? { connectionsFile: values[\"connections-file\"] }\n : {}),\n },\n typeof values.endpoint === \"string\" ? [{ url: values.endpoint }] : [],\n )\n console.log(\n values.json\n ? JSON.stringify(report)\n : report.findings\n .map((f) => `${f.ok ? \"PASS\" : \"FAIL\"} ${f.check}: ${f.message}`)\n .join(\"\\n\"),\n )\n return report.ok ? 0 : 1\n } catch (error) {\n console.error(error instanceof Error ? error.message : \"doctor failed\")\n return 1\n }\n },\n },\n \"fleet render\": {\n summary: \"Render explicit application variables from private namespace discovery\",\n options: {\n manifest: { type: \"string\", description: \"Public ready manifest file\" },\n connections: { type: \"string\", description: \"Private connection manifest file\" },\n mapping: { type: \"string\", description: \"JSON variable-to-service mapping\" },\n namespace: { type: \"string\", description: \"Explicit namespace\" },\n output: { type: \"string\", description: \"Private destination file\" },\n format: { type: \"string\", description: \"json or dotenv\", default: \"json\" },\n },\n async run(values) {\n try {\n if (\n typeof values.namespace !== \"string\" ||\n typeof values.output !== \"string\" ||\n ![\"json\", \"dotenv\"].includes(String(values.format))\n )\n throw new Error(\"--namespace, --output and valid --format required\")\n const manifest = (await parse(values.manifest)) as Parameters<\n typeof renderConnections\n >[0],\n connections = (await parse(values.connections)) as ConnectionManifest\n const output = renderConnections(\n manifest,\n connections,\n values.namespace,\n (await parse(values.mapping)) as ConnectionMapping,\n )\n await writeConnections(values.output, output, values.format as \"json\" | \"dotenv\")\n console.log(JSON.stringify({ written: values.output, variables: Object.keys(output) }))\n return 0\n } catch (error) {\n console.error(error instanceof Error ? error.message : \"render failed\")\n return 1\n }\n },\n },\n \"fleet rehearse\": {\n summary: \"Restore an archive in an isolated ephemeral fleet, then close it\",\n options: {\n config: { type: \"string\", description: \"Fleet configuration file\" },\n archive: { type: \"string\", description: \"Saved fleet archive file\" },\n },\n async run(values) {\n try {\n console.log(\n JSON.stringify(\n await rehearseFleet(\n (await parse(values.config)) as MockingbirdConfig,\n { load },\n (await parse(values.archive)) as FleetArchive,\n ),\n ),\n )\n return 0\n } catch (error) {\n console.error(error instanceof Error ? error.message : \"rehearsal failed\")\n return 1\n }\n },\n },\n }\n}\n", "import { randomUUID } from \"node:crypto\"\nimport { chmod, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport { canonical, type FleetArchive, validateArchive } from \"./fleet-archive.js\"\nimport type { EndpointManifest } from \"./fleet-manifest.js\"\nimport type { ProtectedArchive } from \"./fleet-protection.js\"\n\nexport class FleetClientError extends Error {\n constructor(\n readonly status: number,\n readonly details: unknown,\n ) {\n super(`fleet control HTTP ${status}: ${canonical(details)}`)\n }\n}\nexport class FleetClientResponseError extends FleetClientError {\n constructor(\n readonly code: \"redirect\" | \"response_too_large\" | \"invalid_json\",\n status: number,\n origin?: string,\n ) {\n super(status, { code, body: \"omitted\", ...(origin ? { origin } : {}) })\n this.name = \"FleetClientResponseError\"\n }\n}\n\nexport type FleetClientOptions = {\n adminKey?: string\n namespace?: string\n timeoutMs?: number\n /** Custom adapters must honor redirect: manual and the supplied abort signal. */\n fetch?: typeof fetch\n /** Decoded response byte limit; archives can explicitly select a larger limit. Default 64 MiB. */\n maxResponseBytes?: number\n}\n/** Supported control client: credentials are headers; base URL includes the discovered prefix. */\nexport class FleetClient {\n constructor(\n readonly base: string,\n private readonly options: FleetClientOptions = {},\n ) {}\n async request<T = Record<string, unknown>>(\n path: string,\n options: {\n method?: string\n body?: unknown\n namespace?: string\n idempotencyKey?: string\n signal?: AbortSignal\n maxResponseBytes?: number\n } = {},\n ): Promise<T> {\n const url = new URL(`${this.base.replace(/\\/$/, \"\")}/${path.replace(/^\\//, \"\")}`)\n if (url.username || url.password)\n throw new Error(\"fleet client URL must not contain credentials\")\n url.searchParams.set(\"namespace\", options.namespace ?? this.options.namespace ?? \"default\")\n const limit = options.maxResponseBytes ?? this.options.maxResponseBytes ?? 64 * 1024 * 1024\n if (!Number.isSafeInteger(limit) || limit < 1) throw new Error(\"invalid response byte limit\")\n const deadline = AbortSignal.timeout(this.options.timeoutMs ?? 30000)\n const signal = options.signal ? AbortSignal.any([options.signal, deadline]) : deadline\n signal.throwIfAborted()\n const response = await (this.options.fetch ?? fetch)(url, {\n redirect: \"manual\",\n method: options.method ?? (options.body === undefined ? \"GET\" : \"POST\"),\n headers: {\n \"content-type\": \"application/json\",\n ...(this.options.adminKey ? { \"x-mockingbird-admin-key\": this.options.adminKey } : {}),\n ...(options.idempotencyKey ? { \"idempotency-key\": options.idempotencyKey } : {}),\n },\n ...(options.body !== undefined ? { body: JSON.stringify(options.body) } : {}),\n signal,\n })\n if (response.status >= 300 && response.status < 400) {\n await response.body?.cancel()\n // Never expose Location: it may contain credentials or sensitive query parameters.\n throw new FleetClientResponseError(\"redirect\", response.status, url.origin)\n }\n if (Number(response.headers.get(\"content-length\")) > limit) {\n await response.body?.cancel()\n throw new FleetClientResponseError(\"response_too_large\", response.status)\n }\n const reader = response.body?.getReader()\n const chunks: Uint8Array[] = []\n let size = 0\n const abort = () => {\n void reader?.cancel(signal.reason).catch(() => {})\n }\n signal.addEventListener(\"abort\", abort, { once: true })\n try {\n if (reader)\n while (true) {\n signal.throwIfAborted()\n const { done, value } = await reader.read()\n signal.throwIfAborted()\n if (done) break\n size += value.byteLength\n if (size > limit) {\n await reader.cancel()\n throw new FleetClientResponseError(\"response_too_large\", response.status)\n }\n chunks.push(value)\n }\n } finally {\n signal.removeEventListener(\"abort\", abort)\n if (signal.aborted) await reader?.cancel(signal.reason).catch(() => {})\n reader?.releaseLock()\n }\n const bytes = new Uint8Array(size)\n let offset = 0\n for (const chunk of chunks) {\n bytes.set(chunk, offset)\n offset += chunk.byteLength\n }\n const text = new TextDecoder().decode(bytes)\n let data: unknown\n try {\n data = text.length ? JSON.parse(text) : undefined\n } catch {\n if (response.ok) throw new FleetClientResponseError(\"invalid_json\", response.status)\n }\n if (!response.ok) {\n // Only machine error identifiers are retained. Raw bodies, messages and excerpts\n // are omitted because proxies and remote errors may contain secrets.\n const error =\n data && typeof data === \"object\" ? (data as { error?: unknown }).error : undefined\n const detail: Record<string, string> = { body: \"omitted\" }\n if (error && typeof error === \"object\")\n for (const key of [\"type\", \"code\"] as const) {\n const value = (error as Record<string, unknown>)[key]\n if (typeof value === \"string\" && /^[A-Za-z0-9_.-]{1,128}$/.test(value))\n detail[key] = value\n }\n throw new FleetClientError(response.status, detail)\n }\n return data as T\n }\n discover() {\n return this.request<{\n version: number\n routes: { method: string; path: string }[]\n manifest: EndpointManifest\n }>(\"\")\n }\n namespaces() {\n return this.request(\"namespaces\")\n }\n createNamespace(namespace: string, baseline?: string) {\n return this.request(`namespaces/${encodeURIComponent(namespace)}`, {\n body: baseline ? { baseline } : {},\n })\n }\n deleteNamespace(namespace: string) {\n return this.request(`namespaces/${encodeURIComponent(namespace)}`, { method: \"DELETE\" })\n }\n reset(namespace: string, options: { services?: string[]; idempotencyKey?: string } = {}) {\n return this.request(`namespaces/${encodeURIComponent(namespace)}/reset`, {\n body: options.services ? { services: options.services } : {},\n ...(options.idempotencyKey ? { idempotencyKey: options.idempotencyKey } : {}),\n })\n }\n snapshot(\n namespace: string,\n options: { label?: string; services?: string[]; idempotencyKey?: string } = {},\n ) {\n const { idempotencyKey, ...body } = options\n return this.request<{ id: string }>(`namespaces/${encodeURIComponent(namespace)}/snapshots`, {\n body,\n ...(idempotencyKey ? { idempotencyKey } : {}),\n })\n }\n restore(namespace: string, id: string, idempotencyKey?: string) {\n return this.request(\n `namespaces/${encodeURIComponent(namespace)}/snapshots/${encodeURIComponent(id)}/restore`,\n { body: {}, ...(idempotencyKey ? { idempotencyKey } : {}) },\n )\n }\n exportArchive(namespace?: string, allNamespaces = false) {\n return this.request<FleetArchive>(\"archives/export\", {\n body: { allNamespaces },\n ...(namespace ? { namespace } : {}),\n })\n }\n exportProtectedArchive(namespace?: string, allNamespaces = false) {\n return this.request<ProtectedArchive>(\"archives/export\", {\n body: { allNamespaces },\n ...(namespace ? { namespace } : {}),\n })\n }\n importArchive(archive: FleetArchive | ProtectedArchive, namespace?: string) {\n if (archive.format !== \"mockingbird.jwe/v1\") validateArchive(archive)\n return this.request(\"archives/import\", {\n body: { archive, ...(namespace ? { namespace } : {}) },\n })\n }\n operation(id: string) {\n return this.request(`operations/${encodeURIComponent(id)}`)\n }\n}\n\nexport type ConnectionManifest = {\n version: 1\n services: Record<string, { url: string; namespaces?: Record<string, string> }>\n}\nexport type ConnectionField =\n | \"url\"\n | \"hostname\"\n | \"port\"\n | \"username\"\n | \"password\"\n | \"pathname\"\n | \"database\"\nexport type ConnectionMapping = Record<\n string,\n { service: string; field?: ConnectionField; fallback?: string }\n>\n/** Explicit variable mappings, with namespace-specific URLs taken from current discovery. */\nexport function renderConnections(\n manifest: EndpointManifest,\n privateManifest: ConnectionManifest,\n namespace: string,\n mapping: ConnectionMapping,\n): Record<string, string> {\n if (!/^[A-Za-z0-9_.-]{1,64}$/.test(namespace)) throw new Error(\"invalid namespace\")\n const result: Record<string, string> = {}\n for (const [variable, entry] of Object.entries(mapping)) {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(variable))\n throw new Error(`invalid variable name ${variable}`)\n const child = manifest.services[entry.service],\n secret = privateManifest.services[entry.service]\n if (!child || !secret) throw new Error(`missing service mapping ${entry.service}`)\n let endpoint: string\n if (child.protocol === \"http\") {\n const template = child.namespaces.path\n if (typeof template !== \"string\")\n throw new Error(`missing HTTP namespace mapping ${entry.service}`)\n endpoint = new URL(template.replace(\"{name}\", encodeURIComponent(namespace)), secret.url).href\n } else {\n const selected = secret.namespaces?.[namespace]\n if (!selected) throw new Error(`missing namespace mapping ${namespace}/${entry.service}`)\n endpoint = selected\n }\n const url = new URL(endpoint)\n const field = entry.field ?? \"url\"\n let value: string\n switch (field) {\n case \"url\":\n value = endpoint\n break\n case \"hostname\":\n value = url.hostname.replace(/^\\[|\\]$/g, \"\")\n break\n case \"port\":\n value = url.port\n break\n case \"username\":\n value = decodeURIComponent(url.username)\n break\n case \"password\":\n value = decodeURIComponent(url.password)\n break\n case \"pathname\":\n value = decodeURIComponent(url.pathname)\n break\n case \"database\":\n value = decodeURIComponent(url.pathname.replace(/^\\//, \"\"))\n break\n default:\n throw new Error(\"unsupported connection field\")\n }\n if (!value) {\n if (typeof entry.fallback !== \"string\")\n throw new Error(`missing connection component ${field}`)\n value = entry.fallback\n }\n result[variable] = value\n }\n return result\n}\nexport async function writeConnections(\n path: string,\n values: Record<string, string>,\n format: \"json\" | \"dotenv\" = \"json\",\n) {\n const temp = `${path}.${randomUUID()}.tmp`\n const text =\n format === \"json\"\n ? `${JSON.stringify(values, null, 2)}\\n`\n : `${Object.entries(values)\n .map(([key, value]) => `${key}=${JSON.stringify(value)}`)\n .join(\"\\n\")}\\n`\n try {\n await writeFile(temp, text, { mode: 0o600, flag: \"wx\" })\n await chmod(temp, 0o600)\n await rename(temp, path)\n } finally {\n await rm(temp, { force: true })\n }\n}\nexport const readConnectionManifest = async (path: string): Promise<ConnectionManifest> =>\n JSON.parse(await readFile(path, \"utf8\")) as ConnectionManifest\n", "import { readFile } from \"node:fs/promises\"\nimport type { CliOption, CliValues, CommonServeOptions } from \"./cli.js\"\n\nexport const providerServeOptions: Record<string, CliOption> = {\n fixtures: {\n type: \"string\",\n value: \"<json-file>\",\n description: \"Load synthetic provider fixtures from a JSON object\",\n },\n \"base-url\": {\n type: \"string\",\n value: \"<url>\",\n description: \"Public HTTP(S) base URL advertised in provider responses\",\n },\n}\n\n/** Node-only input loading. Contents and parse errors never enter startup logs. */\nexport async function providerServeValues<T>(\n values: CliValues,\n defaults: Pick<CommonServeOptions, \"fixtures\" | \"baseUrl\"> = {},\n): Promise<{ fixtures?: T; baseUrl?: string }> {\n const options: { fixtures?: T; baseUrl?: string } = {}\n if (values.fixtures !== undefined) {\n if (typeof values.fixtures !== \"string\") throw new Error(\"--fixtures requires a JSON file\")\n let parsed: unknown\n try {\n parsed = JSON.parse(await readFile(values.fixtures, \"utf8\"))\n } catch {\n throw new Error(\"Cannot read --fixtures as JSON; supply a synthetic provider fixture object\")\n }\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed))\n throw new Error(\"--fixtures must contain a JSON object\")\n options.fixtures = parsed as T\n } else if (defaults.fixtures !== undefined) {\n if (\n defaults.fixtures === null ||\n typeof defaults.fixtures !== \"object\" ||\n Array.isArray(defaults.fixtures)\n )\n throw new Error(\"fleet fixtures must contain a JSON object\")\n options.fixtures = defaults.fixtures as T\n }\n const advertised = values[\"base-url\"] ?? defaults.baseUrl\n if (advertised !== undefined) {\n let url: URL\n try {\n if (typeof advertised !== \"string\") throw new Error()\n url = new URL(advertised)\n } catch {\n throw new Error(\"--base-url must be an absolute HTTP(S) URL\")\n }\n if (\n ![\"http:\", \"https:\"].includes(url.protocol) ||\n url.username ||\n url.password ||\n url.search ||\n url.hash\n )\n throw new Error(\"--base-url must be HTTP(S) without credentials, query or fragment\")\n options.baseUrl = url.href.replace(/\\/+$/, \"\")\n }\n return options\n}\n", "/// <reference types=\"node\" />\nimport { createHash } from \"node:crypto\"\nimport type { IncomingMessage, Server } from \"node:http\"\nimport type { Socket } from \"node:net\"\nimport {\n bindSocketTransport,\n claimSocketTicket,\n markSocketClosed,\n openSocketCount,\n type SocketRecord,\n unbindSocketTransport,\n} from \"./sockets.js\"\n\nconst GUID = \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\"\n/** Under Socket Mode's default 30s server-ping timeout, and frequent enough to test quickly. */\nconst SERVER_PING_MS = 2_000\nconst MAX_FRAME = 1_000_000\nconst HOST = \"applink-mockingbird\"\n\nconst attached = new WeakSet<Server>()\n\nconst encodeFrame = (opcode: number, payload: Buffer): Buffer => {\n const length = payload.length\n let header: Buffer\n if (length < 126) {\n header = Buffer.alloc(2)\n header[1] = length\n } else if (length < 65_536) {\n header = Buffer.alloc(4)\n header[1] = 126\n header.writeUInt16BE(length, 2)\n } else {\n header = Buffer.alloc(10)\n header[1] = 127\n header.writeBigUInt64BE(BigInt(length), 2)\n }\n header[0] = 0x80 | opcode\n return Buffer.concat([header, payload])\n}\n\nconst acceptKey = (key: string): string =>\n createHash(\"sha1\")\n .update(key + GUID)\n .digest(\"base64\")\n\nconst rejectHttp = (socket: Socket, status: number, reason: string): void => {\n const body = Buffer.from(reason)\n socket.end(\n `HTTP/1.1 ${status} ${reason}\\r\\nConnection: close\\r\\nContent-Type: text/plain\\r\\nContent-Length: ${body.length}\\r\\n\\r\\n${reason}`,\n )\n}\n\nconst startedAt = (ms: number): string =>\n new Date(ms).toISOString().replace(\"T\", \" \").replace(\"Z\", \"\")\n\ntype Session = {\n ticket: string\n socket: Socket\n done: boolean\n ping: ReturnType<typeof setInterval> | undefined\n lifetime: ReturnType<typeof setTimeout> | undefined\n hello: ReturnType<typeof setTimeout> | undefined\n}\n\nconst live = new Map<string, Session>()\n\nconst createParser = (onFrame: (opcode: number, data: Buffer) => void, onError: () => void) => {\n let buffer = Buffer.alloc(0) as Buffer\n let fragments: Buffer[] = []\n let fragmentOpcode = 0\n return {\n push(chunk: Buffer) {\n buffer = Buffer.concat([buffer, chunk])\n if (buffer.length > MAX_FRAME) {\n onError()\n return\n }\n for (;;) {\n if (buffer.length < 2) return\n const first = buffer[0] ?? 0\n const second = buffer[1] ?? 0\n if ((first & 0x70) !== 0) {\n onError()\n return\n }\n const fin = (first & 0x80) !== 0\n const opcode = first & 0x0f\n const masked = (second & 0x80) !== 0\n let length = second & 0x7f\n let offset = 2\n if (length === 126) {\n if (buffer.length < 4) return\n length = buffer.readUInt16BE(2)\n offset = 4\n } else if (length === 127) {\n if (buffer.length < 10) return\n const wide = buffer.readBigUInt64BE(2)\n if (wide > BigInt(MAX_FRAME)) {\n onError()\n return\n }\n length = Number(wide)\n offset = 10\n }\n if (length > MAX_FRAME) {\n onError()\n return\n }\n const maskLength = masked ? 4 : 0\n if (buffer.length < offset + maskLength + length) return\n const raw = buffer.subarray(offset + maskLength, offset + maskLength + length)\n let payload: Buffer\n if (masked) {\n const mask = buffer.subarray(offset, offset + 4)\n payload = Buffer.alloc(length)\n for (let i = 0; i < length; i++) payload[i] = (raw[i] ?? 0) ^ (mask[i % 4] ?? 0)\n } else payload = Buffer.from(raw)\n buffer = Buffer.from(buffer.subarray(offset + maskLength + length))\n if (opcode === 0x0) {\n if (fragmentOpcode === 0) {\n onError()\n return\n }\n fragments.push(payload)\n if (fin) {\n const message = Buffer.concat(fragments)\n const op = fragmentOpcode\n fragments = []\n fragmentOpcode = 0\n onFrame(op, message)\n }\n continue\n }\n if (opcode === 0x1 || opcode === 0x2) {\n if (!fin) {\n fragmentOpcode = opcode\n fragments = [payload]\n } else onFrame(opcode, payload)\n continue\n }\n onFrame(opcode, payload)\n }\n },\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst writeFrame = (socket: Socket, opcode: number, payload: Buffer): void => {\n if (socket.destroyed || !socket.writable) return\n socket.write(encodeFrame(opcode, payload))\n}\n\nconst helloBody = (record: SocketRecord, approximate: number) =>\n JSON.stringify({\n type: \"hello\",\n num_connections: openSocketCount(record.namespace),\n debug_info: {\n host: HOST,\n started: startedAt(Date.now()),\n build_number: 1,\n approximate_connection_time: approximate,\n },\n connection_info: { app_id: record.appId },\n })\n\nconst disconnectBody = (reason: string) =>\n JSON.stringify({ type: \"disconnect\", reason, debug_info: { host: HOST } })\n\nconst acceptUpgrade = (\n req: IncomingMessage,\n socket: Socket,\n head: Buffer,\n owned: Set<string>,\n): void => {\n const url = new URL(req.url ?? \"/\", \"http://localhost\")\n if (url.pathname !== \"/link\" && url.pathname !== \"/link/\") {\n rejectHttp(socket, 404, \"not_found\")\n return\n }\n const ticket = url.searchParams.get(\"ticket\")\n const key = req.headers[\"sec-websocket-key\"]\n if (!ticket || typeof key !== \"string\" || key.length === 0) {\n rejectHttp(socket, 400, \"bad_request\")\n return\n }\n const record = claimSocketTicket(ticket)\n if (!record) {\n rejectHttp(socket, 404, \"ticket_used\")\n return\n }\n socket.setNoDelay(true)\n socket.write(\n \"HTTP/1.1 101 Switching Protocols\\r\\n\" +\n \"Upgrade: websocket\\r\\n\" +\n \"Connection: Upgrade\\r\\n\" +\n `Sec-WebSocket-Accept: ${acceptKey(key)}\\r\\n` +\n \"\\r\\n\",\n )\n const session: Session = {\n ticket,\n socket,\n done: false,\n ping: undefined,\n lifetime: undefined,\n hello: undefined,\n }\n live.set(ticket, session)\n owned.add(ticket)\n const cleanup = () => {\n if (session.done) return\n session.done = true\n if (session.ping) clearInterval(session.ping)\n if (session.lifetime) clearTimeout(session.lifetime)\n if (session.hello) clearTimeout(session.hello)\n live.delete(ticket)\n owned.delete(ticket)\n unbindSocketTransport(ticket)\n markSocketClosed(ticket)\n }\n const finish = (code: number) => {\n if (session.done) return\n if (code === 1006) socket.destroy()\n else {\n const payload = Buffer.alloc(2)\n payload.writeUInt16BE(code, 0)\n writeFrame(socket, 0x8, payload)\n socket.end()\n }\n cleanup()\n }\n bindSocketTransport(ticket, {\n disconnect(reason, code) {\n if (session.done) return\n writeFrame(socket, 0x1, Buffer.from(disconnectBody(reason)))\n const timer = setTimeout(() => finish(code), 20)\n timer.unref()\n },\n destroy() {\n socket.destroy()\n cleanup()\n },\n })\n const parser = createParser(\n (opcode, data) => {\n if (session.done) return\n if (opcode === 0x8) {\n finish(1000)\n return\n }\n if (opcode === 0x9) {\n writeFrame(socket, 0xa, data)\n return\n }\n if (opcode !== 0x1) return\n let parsed: unknown\n try {\n parsed = JSON.parse(data.toString(\"utf8\"))\n } catch {\n return\n }\n // An acknowledgement. Socket Mode does not reply, and a stray ack must not drop the socket.\n if (isRecord(parsed) && typeof parsed.envelope_id === \"string\" && parsed.type === undefined)\n return\n },\n () => finish(1002),\n )\n socket.on(\"data\", (chunk: Buffer | string) => {\n if (session.done) return\n parser.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk)\n })\n socket.on(\"close\", cleanup)\n socket.on(\"error\", cleanup)\n socket.on(\"end\", cleanup)\n if (head.length > 0) parser.push(head)\n\n const approximate =\n url.searchParams.get(\"debug_reconnects\") === \"true\"\n ? 360\n : record.lifetimeMs !== null && record.lifetimeMs > 0\n ? Math.max(1, Math.ceil(record.lifetimeMs / 1000))\n : 3600\n const deliverHello = () => {\n if (session.done) return\n const frame = Buffer.from(helloBody(record, approximate))\n socket.write(encodeFrame(0x1, frame), () => {\n if (session.done) return\n if (record.abnormalClose) {\n socket.destroy()\n cleanup()\n return\n }\n if (record.closeAfterHello) {\n finish(1000)\n return\n }\n session.ping = setInterval(() => {\n if (session.done) return\n writeFrame(socket, 0x9, Buffer.from(\"ping\"))\n }, SERVER_PING_MS)\n session.ping.unref()\n if (record.lifetimeMs !== null && record.lifetimeMs > 0) {\n session.lifetime = setTimeout(() => {\n if (session.done) return\n writeFrame(socket, 0x1, Buffer.from(disconnectBody(\"warning\")))\n const timer = setTimeout(() => finish(1000), 20)\n timer.unref()\n }, record.lifetimeMs)\n session.lifetime.unref()\n }\n })\n }\n if (record.helloLatencyMs > 0) {\n session.hello = setTimeout(deliverHello, record.helloLatencyMs)\n session.hello.unref()\n } else deliverHello()\n}\n\n/** Accept Socket Mode WebSocket upgrades on a Node HTTP server. Idempotent per server. */\nexport const attachSocketServer = (server: Server): void => {\n if (attached.has(server)) return\n attached.add(server)\n const owned = new Set<string>()\n server.on(\"upgrade\", (req, socket, head) => {\n acceptUpgrade(req, socket as Socket, head, owned)\n })\n server.on(\"close\", () => {\n for (const ticket of owned) live.get(ticket)?.socket.destroy()\n owned.clear()\n })\n}\n", "/// <reference types=\"node\" />\nimport {\n type Listening,\n listen,\n providerServeOptions,\n providerServeValues,\n type ServeTarget,\n} from \"@crvouga/mockingbird-adapter-node\"\nimport { createRuntime, type SlackRuntime, type SlackRuntimeOptions } from \"./runtime.js\"\nimport { attachSocketServer } from \"./socket-server.js\"\n\n/** Port `mockingbird-slack serve` listens on when none is given. */\nexport const DEFAULT_PORT = 8808\n\nexport type SlackServerOptions = SlackRuntimeOptions & {\n /** Default `0`: the OS picks a free port. */\n port?: number\n /** Default `127.0.0.1`. */\n host?: string\n}\n\nexport type SlackServer = Listening & { runtime: SlackRuntime }\n\n/** Serve the Slack mock over `node:http`. */\nexport const createServer = async (options: SlackServerOptions = {}): Promise<SlackServer> => {\n const { port, host, ...rest } = options\n const runtime = createRuntime(rest)\n const listening = await listen(runtime, {\n port: port ?? 0,\n ...(host !== undefined ? { host } : {}),\n })\n attachSocketServer(listening.server)\n return { ...listening, runtime }\n}\n\nconst text = (value: string | boolean | undefined) =>\n typeof value === \"string\" ? value : undefined\n\n/** How `serve` (and `serve --config`) builds the Slack mock from flags. */\nexport const serveTarget: ServeTarget = {\n name: \"slack\",\n defaultPort: DEFAULT_PORT,\n options: {\n ...providerServeOptions,\n token: {\n type: \"string\",\n value: \"<xoxb-\u2026>\",\n description:\n \"Only accept this bot token on the Web API (default: any xoxb-/xoxp- token is accepted)\",\n },\n \"strict-channels\": {\n type: \"boolean\",\n description: \"Answer channel_not_found for channels not created through /__admin/channels\",\n },\n },\n create: async (values, common) => {\n const token = text(values.token)\n return createRuntime({\n ...(await providerServeValues<NonNullable<SlackRuntimeOptions[\"fixtures\"]>>(values, common)),\n settings: {\n ...(token ? { tokens: [token] } : {}),\n ...(values[\"strict-channels\"] === true ? { strictChannels: true } : {}),\n },\n ...(common.adminPrefix !== undefined ? { adminPrefix: common.adminPrefix } : {}),\n ...(common.adminKey !== undefined ? { adminKey: common.adminKey } : {}),\n ...(common.adminControls !== undefined ? { adminControls: common.adminControls } : {}),\n ...(common.seed !== undefined ? { seed: common.seed } : {}),\n ...(common.onLog ? { onLog: common.onLog } : {}),\n })\n },\n listening: (listening) => {\n attachSocketServer(listening.server)\n },\n banner: () => [\n \"webhooks: point SLACK_*_WEBHOOK_URL at <this>/services/T000/B000/XXXX (any path works until you POST /__admin/hooks)\",\n \"web api: Authorization: Bearer xoxb-\u2026; @slack/web-api: new WebClient(token, {slackApiUrl: '<this>/api/'})\",\n \"socket mode: Authorization: Bearer xapp-\u2026 on POST <this>/api/apps.connections.open; Bolt: socketMode + clientOptions.slackApiUrl '<this>/api/'\",\n \"outbox: GET /__admin/outbox?webhook=/services/T/B/X or ?channel=C\u2026\",\n ],\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["readFile", "AsyncLocalStorage", "createHash", "randomUUID", "readFile", "createHash", "randomUUID", "destination", "createHash", "randomUUID", "text", "createHash", "randomUUID", "start", "object", "createHash", "randomUUID", "namespace", "text", "key", "scope", "destination", "startedAt", "credential", "response", "object", "resolve", "resolve", "randomUUID", "readFile", "AsyncLocalStorage", "entry", "createHash", "startedAt", "unavailable", "text", "response", "createRequire", "resolve", "require", "readFile", "createRequire", "resolve", "randomUUID", "chmod", "readFile", "rename", "rm", "writeFile", "text", "randomUUID", "writeFile", "chmod", "rename", "rm", "require", "createRequire", "resolve", "startedAt", "readFile", "name", "readFile", "isObject", "resolve", "adminKey", "readFile", "createHash", "createHash", "createServer"]
|
|
7
|
+
}
|