@crvouga/mockingbird-service-odx 0.2.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,19 @@
1
1
  # Changelog — @crvouga/mockingbird-service-odx
2
2
 
3
- ## 0.2.0 (2026-09-24)
3
+ ## 1.0.1 (2026-09-26)
4
+
5
+ ### Fixes and improvements
6
+
7
+ - take the rejected-request byte count from content-length, never by reading the body ([a0e5fb2](https://github.com/crvouga/mockingbird/commit/a0e5fb2fc80ab725c3552b612f3f091fd6c857fb))
8
+ - reject a present body by media type, and log what a rejected request sent ([12e351a](https://github.com/crvouga/mockingbird/commit/12e351aba53cfb7b41e31a7809419455fc2902eb))
9
+
10
+ ## 1.0.0 (2026-09-24)
11
+
12
+ ### ⚠️ Breaking changes
13
+
14
+ - vendor branding for every service; purge internal mocks and consumer names ([f689534](https://github.com/crvouga/mockingbird/commit/f6895343543550dafcb7d76b426cae7635e03226))
15
+
16
+ ## 0.2.0 (2026-09-23)
4
17
 
5
18
  ### Features
6
19
 
package/README.md CHANGED
@@ -6,7 +6,7 @@ imports (HL7 v2 ORU and structured results), the Functional Health Report (JSON
6
6
  webhook registrations, and the signed `PatientTest` webhooks ODX posts back.
7
7
 
8
8
  > **The vendor was retired 2026-07-22.** Our queue paths are gated only by the
9
- > `geviti-pdf-enabled` flag (default `false`), so a local stack with no PostHog still calls ODX.
9
+ > `acme-pdf-enabled` flag (default `false`), so a local stack with no PostHog still calls ODX.
10
10
  > The cheaper fix is to turn that flag on through the PostHog mock
11
11
  > (`@crvouga/mockingbird-service-posthog`); use this mock when a suite must exercise the ODX
12
12
  > path itself (bio-age webhooks, the Healthie PDF upload, migrations).
@@ -27,6 +27,8 @@ Fetch server.
27
27
 
28
28
  ## Usage
29
29
 
30
+ The real base URL is `https://odxinstanceresource.azure-api.net/<partner>`; the partner segment is
31
+ your account's slug.
30
32
  Point `OPTIMAL_URL` at the mock (it is overridable; no path prefix is needed), keep any
31
33
  `OPTIMAL_API_KEY` and `OPTIMAL_PRACTICE_ID`. Pre-register the backend's webhook, or let
32
34
  `manageWebhooks` register it through `POST /v1/webhook` as it does in production:
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  createRuntime
3
- } from "./chunk-OYDT3HEE.js";
3
+ } from "./chunk-XITCXMFI.js";
4
4
 
5
5
  // ../../adapters/node/dist/cli.js
6
6
  import { readFile } from "node:fs/promises";
@@ -208,7 +208,9 @@ var formatLog = (format) => {
208
208
  const ns = entry.namespace === "default" ? "" : ` [${entry.namespace}]`;
209
209
  const fault = entry.faultId ? ` fault=${entry.faultId}` : "";
210
210
  const adopted = entry.adopted ? " adopted" : "";
211
- console.log(`${entry.service} ${entry.method} ${entry.path} ${entry.status} ${op} ${entry.durationMs}ms${ns}${fault}${adopted}`);
211
+ const received = entry.request ? ` received=${entry.request.bodyBytes === null ? "?" : `${entry.request.bodyBytes}B`} ct=${entry.request.contentType ?? "-"}${entry.request.transferEncoding ? ` te=${entry.request.transferEncoding}` : ""}` : "";
212
+ const issues = entry.issues?.length ? ` issues=${entry.issues.slice(0, 3).map((issue) => `${issue.path || "$"}: ${issue.message}`).join("; ")}${entry.issues.length > 3 ? ` (+${entry.issues.length - 3})` : ""}` : "";
213
+ console.log(`${entry.service} ${entry.method} ${entry.path} ${entry.status} ${op} ${entry.durationMs}ms${ns}${fault}${adopted}${received}${issues}`);
212
214
  };
213
215
  };
214
216
  var asString = (value) => typeof value === "string" ? value : void 0;
@@ -356,4 +358,4 @@ export {
356
358
  createServer2 as createServer,
357
359
  serveTarget
358
360
  };
359
- //# sourceMappingURL=chunk-23TC3WDO.js.map
361
+ //# sourceMappingURL=chunk-WIQRNMAY.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../adapters/node/src/cli.ts", "../../../adapters/node/src/serve.ts", "../../../adapters/node/src/listen.ts", "../src/server.ts"],
4
+ "sourcesContent": ["import { readFile } from \"node:fs/promises\"\nimport { type ParseArgsConfig, parseArgs } from \"node:util\"\nimport type { RequestLog, ServiceInstance, ServiceRuntime } from \"@crvouga/mockingbird-service\"\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 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 // 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 adminKey: string | undefined\n seed: string | undefined\n onLog: ((entry: RequestLog) => void) | undefined\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 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}\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-key\": {\n type: \"string\",\n value: \"<key>\",\n description: \"Require x-mockingbird-admin-key on /__admin/* (env MOCKINGBIRD_ADMIN_KEY)\",\n },\n seed: { type: \"string\", value: \"<seed>\", description: \"Seed for every random choice\" },\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}\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\n/** A service entry in `mockingbird.json`. */\nexport type ConfigService = {\n port?: number\n host?: string\n adminKey?: string\n seed?: string\n /** Service-specific serve flags, by long name: `{ \"webhook-url\": \"\u2026\" }`. */\n options?: Record<string, string | boolean>\n}\n\nexport type MockingbirdConfig = {\n /** Keyed by service name: `junction` loads `@crvouga/mockingbird-service-junction`. */\n services: Record<string, ConfigService>\n log?: LogFormat\n}\n\nconst loadTarget = async (name: string, own: ServeTarget): Promise<ServeTarget> => {\n if (name === own.name) return own\n const specifier = `@crvouga/mockingbird-service-${name}/server`\n try {\n const mod = (await import(specifier)) as { serveTarget?: ServeTarget }\n if (!mod.serveTarget) throw new Error(`${specifier} exports no serveTarget`)\n return mod.serveTarget\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error)\n throw new Error(\n `cannot load service \"${name}\": ${reason}. Install @crvouga/mockingbird-service-${name}.`,\n )\n }\n}\n\nconst start = async (\n target: ServeTarget,\n values: CliValues,\n config: { port: number; host: string; adminKey?: string; seed?: string; log: LogFormat },\n): Promise<Listening> => {\n const runtime = await target.create(values, {\n adminKey: config.adminKey,\n seed: config.seed,\n onLog: formatLog(config.log),\n })\n const listening = await listen(runtime, { port: config.port, host: config.host })\n console.log(`${target.name} mock listening on ${listening.url}`)\n console.log(`${target.name} health: GET ${listening.url}/health`)\n console.log(\n `${target.name} admin: ${listening.url}/__admin (${config.adminKey ? \"x-mockingbird-admin-key required\" : \"open \u2014 pass --admin-key to lock\"})`,\n )\n for (const line of target.banner?.(runtime) ?? []) console.log(`${target.name} ${line}`)\n return listening\n}\n\nconst untilSignal = async (servers: Listening[]): Promise<number> =>\n new Promise((resolve) => {\n const stop = async () => {\n await Promise.allSettled(servers.map((s) => s.close()))\n resolve(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): CliCommand => ({\n summary: `Serve the ${target.name} mock over HTTP`,\n options: { ...COMMON_SERVE_OPTIONS, ...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 const config = JSON.parse(await readFile(configPath, \"utf8\")) as MockingbirdConfig\n const servers: Listening[] = []\n try {\n for (const [name, entry] of Object.entries(config.services ?? {})) {\n const each = await loadTarget(name, target)\n servers.push(\n await start(each, entry.options ?? {}, {\n port: entry.port ?? each.defaultPort,\n host: entry.host ?? \"127.0.0.1\",\n ...(entry.adminKey !== undefined ? { adminKey: entry.adminKey } : {}),\n ...(entry.seed !== undefined ? { seed: entry.seed } : {}),\n log: config.log ?? log,\n }),\n )\n }\n } catch (error) {\n await Promise.allSettled(servers.map((s) => s.close()))\n console.error(error instanceof Error ? error.message : String(error))\n return 1\n }\n return untilSignal(servers)\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)\n let listening: Listening\n try {\n listening = await start(target, values, {\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 { createServer } from \"node:http\"\nimport type { FetchAPI } from \"@crvouga/mockingbird-core\"\n\n/** Options for {@link serve}. */\nexport type NodeServeOptions = {\n port?: number\n host?: string\n}\n\n/**\n * Serve any Mockingbird {@link FetchAPI} over `node:http`.\n * Port defaults to `0`, so the OS assigns an ephemeral port (read from `server.address()`).\n */\nexport const serve = async (api: FetchAPI, options: NodeServeOptions = {}) => {\n const server = createServer(async (req, res) => {\n const chunks: Buffer[] = []\n for await (const chunk of req) {\n chunks.push(Buffer.from(chunk))\n }\n const body = Buffer.concat(chunks)\n const address = server.address()\n const port = typeof address === \"object\" && address !== null ? address.port : undefined\n const base = `http://${req.headers.host ?? `localhost:${port ?? 80}`}`\n const raw = req.url ?? \"/\"\n const url = new URL(raw.replace(/^\\/+/, \"/\"), base)\n const method = req.method ?? \"GET\"\n const init: RequestInit = { method, headers: req.headers as Record<string, string> }\n if (method !== \"GET\" && method !== \"HEAD\" && body.length > 0) {\n init.body = body\n }\n const aborted = new AbortController()\n res.once(\"close\", () => {\n if (!res.writableFinished) aborted.abort()\n })\n init.signal = aborted.signal\n const request = new Request(url, init)\n let response: Response\n try {\n response = await api.fetch(request)\n } catch (error) {\n // A `drop` fault: destroy the socket so the client sees the connection die.\n if ((error as { code?: string }).code === \"MOCKINGBIRD_DROP\") {\n req.socket.destroy()\n return\n }\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 return\n }\n // Headers#entries() joins repeated headers; Set-Cookie must stay one header per cookie.\n const headers: Record<string, string | string[]> = Object.fromEntries(response.headers)\n const cookies = response.headers.getSetCookie()\n if (cookies.length > 0) headers[\"set-cookie\"] = cookies\n if (!response.body) {\n res.writeHead(response.status, headers)\n res.end()\n return\n }\n // Stream the body chunk by chunk: event streams and long-polls must not be buffered.\n res.writeHead(response.status, headers)\n res.flushHeaders()\n const reader = response.body.getReader()\n try {\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n if (!res.write(value)) await new Promise<void>((resolve) => res.once(\"drain\", resolve))\n }\n res.end()\n } catch {\n res.destroy()\n } finally {\n reader.releaseLock()\n }\n })\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", "/// <reference types=\"node\" />\nimport { type Listening, listen, type ServeTarget } from \"@crvouga/mockingbird-adapter-node\"\nimport { createRuntime, type OdxRuntime, type OdxRuntimeOptions } from \"./runtime.js\"\n\n/** Port `mockingbird-odx serve` listens on when none is given. */\nexport const DEFAULT_PORT = 8817\n\nexport type OdxServerOptions = OdxRuntimeOptions & {\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 OdxServer = Listening & { runtime: OdxRuntime }\n\n/** Serve the ODX mock over `node:http`. */\nexport const createServer = async (options: OdxServerOptions = {}): Promise<OdxServer> => {\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 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 ODX mock from flags. */\nexport const serveTarget: ServeTarget = {\n name: \"odx\",\n defaultPort: DEFAULT_PORT,\n options: {\n \"webhook-url\": {\n type: \"string\",\n value: \"<url>\",\n description:\n \"Pre-register a webhook (e.g. http://127.0.0.1:3000/odx/webhook; must equal SYSTEM_API_DEPLOYMENT_URL/odx/webhook)\",\n },\n \"signing-key\": {\n type: \"string\",\n value: \"<key>\",\n description:\n \"Its signing key (random when omitted; our guard fetches it from GET /v1/webhooks)\",\n },\n \"api-key\": {\n type: \"string\",\n value: \"<key>\",\n description: \"Accept only this ApiKey (the app's OPTIMAL_API_KEY); any key when omitted\",\n },\n },\n create: (values, common) => {\n const url = text(values[\"webhook-url\"])\n const signingKey = text(values[\"signing-key\"])\n const apiKey = text(values[\"api-key\"])\n return createRuntime({\n ...(url ? { webhook: { url, ...(signingKey ? { signingKey } : {}) } } : {}),\n ...(apiKey ? { settings: { apiKeys: [apiKey] } } : {}),\n ...(common.adminKey !== undefined ? { adminKey: common.adminKey } : {}),\n ...(common.seed !== undefined ? { seed: common.seed } : {}),\n ...(common.onLog ? { onLog: common.onLog } : {}),\n })\n },\n banner: () => [\n \"auth: header ApiKey: <OPTIMAL_API_KEY>; point OPTIMAL_URL at this server\",\n \"namespaces: x-mockingbird-namespace, /ns/<name>/\u2026, or PUT /__admin/credentials {<ApiKey>: <ns>}\",\n ],\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["createServer"]
7
+ }
@@ -1127,6 +1127,16 @@ var operationMetadata = (operation) => {
1127
1127
 
1128
1128
  // ../core/dist/service.js
1129
1129
  import { Hono } from "hono";
1130
+
1131
+ // ../core/dist/validation.js
1132
+ var recorded = /* @__PURE__ */ new WeakMap();
1133
+ var recordedIssues = (request) => recorded.get(request);
1134
+
1135
+ // ../core/dist/service.js
1136
+ var withIssues = (request, response) => {
1137
+ const issues = response.status >= 400 ? recordedIssues(request) : void 0;
1138
+ return issues && issues.length > 0 ? annotateResponse(response, { issues }) : response;
1139
+ };
1130
1140
  var defineOperations = (handlers) => handlers;
1131
1141
  var OperationRegistryError = class extends Error {
1132
1142
  problems;
@@ -1212,9 +1222,7 @@ var createService = (options) => {
1212
1222
  now
1213
1223
  };
1214
1224
  const short = await options.before?.(context);
1215
- if (short)
1216
- return short;
1217
- return handler(context);
1225
+ return withIssues(request, short ?? await handler(context));
1218
1226
  };
1219
1227
  app.on(operation.method.toUpperCase(), honoPath(operation.path), route);
1220
1228
  }
@@ -1251,7 +1259,7 @@ var restoreNamespace = (sqlite, namespace, snapshot) => {
1251
1259
  };
1252
1260
 
1253
1261
  // ../core/dist/version.js
1254
- var PACKAGE_VERSION = true ? "0.2.0" : UNRELEASED_VERSION;
1262
+ var PACKAGE_VERSION = true ? "1.0.1" : UNRELEASED_VERSION;
1255
1263
 
1256
1264
  // ../core/dist/signing.js
1257
1265
  var encoder = new TextEncoder();
@@ -2011,8 +2019,15 @@ var createRuntime = (options) => {
2011
2019
  const started = monotonicNow();
2012
2020
  const url = new URL(request.url);
2013
2021
  const operationId = operationIdFor(request, url.pathname);
2022
+ const contentLength = request.headers.get("content-length");
2023
+ const received = {
2024
+ contentType: request.headers.get("content-type"),
2025
+ bodyBytes: contentLength !== null && /^\d+$/.test(contentLength) ? Number(contentLength) : null,
2026
+ transferEncoding: request.headers.get("transfer-encoding")
2027
+ };
2014
2028
  const log = (status, faultId, response2) => {
2015
2029
  const noted = response2 ? responseNotes(response2) : void 0;
2030
+ const rejected = status >= 400 && faultId === void 0;
2016
2031
  const entry = {
2017
2032
  service: options.name,
2018
2033
  namespace,
@@ -2024,7 +2039,9 @@ var createRuntime = (options) => {
2024
2039
  unmatched: options.document !== void 0 && operationId === void 0,
2025
2040
  ...faultId !== void 0 ? { faultId } : {},
2026
2041
  ...noted?.ids && Object.keys(noted.ids).length > 0 ? { ids: noted.ids } : {},
2027
- ...noted?.adopted ? { adopted: true } : {}
2042
+ ...noted?.adopted ? { adopted: true } : {},
2043
+ ...rejected ? { request: { ...received } } : {},
2044
+ ...rejected && noted?.issues && noted.issues.length > 0 ? { issues: noted.issues.map((issue) => ({ ...issue })) } : {}
2028
2045
  };
2029
2046
  metrics.record(entry);
2030
2047
  journal.record({ ...entry, at: new Date(clock.now()).toISOString() });
@@ -2397,7 +2414,7 @@ var labElement = (labId, element) => ({
2397
2414
  });
2398
2415
 
2399
2416
  // src/generated/openapi.ts
2400
- var document = JSON.parse(`{"openapi":"3.1.0","info":{"title":"Optimal DX partner API (Mockingbird subset)","description":"Stateful mock of the Optimal DX (ODX) partner API our backend calls: partner labs and their\\nbiomarker elements, practice patients (create, update, delete, partner link, search), lab\\nresults (structured and HL7 v2 ORU imports), the Functional Health Report (JSON or PDF), and\\nwebhook registrations whose signing keys verify the PatientTest webhooks the mock posts.\\nODX publishes no spec; the contract is hand-authored from our consumer's wire shapes. The\\nvendor was retired 2026-07-22 but queue paths still call it while \`geviti-pdf-enabled\` is off.\\n","version":"1","x-mockingbird-upstream":{"note":"Hand-authored from optimal.dx.service.ts / optimal.dx.types.ts, the webhook guard and DTO (odx-signature.guard.ts, odx-webhook-data.dto.ts) and the QA harness (packages/qa odx-client.ts)."}},"servers":[{"url":"https://odxinstanceresource.azure-api.net/geviti"}],"security":[{"apiKey":[]}],"paths":{"/v1/partner/labs":{"get":{"operationId":"ListPartnerLabs","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Labs this partner can import from","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Lab"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/elements/{labId}":{"parameters":[{"name":"labId","in":"path","required":true,"schema":{"type":"string","enum":["1","2","3","999"]}}],"get":{"operationId":"ListElements","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"The lab's biomarker elements (with the codes HL7 OBX-3 is mapped by)","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LabElement"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient":{"parameters":[{"$ref":"#/components/parameters/PracticeId"}],"post":{"operationId":"CreatePatient","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientRequest"}}}},"responses":{"200":{"description":"Created patient","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Patient"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/practice/{practiceId}/patient/{patientId}":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"put":{"operationId":"UpdatePatient","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientRequest"}}}},"responses":{"200":{"description":"Updated patient","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Patient"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"operationId":"DeletePatient","description":"Used by the QA harness teardown (via the send-odx-api-request dev tool).","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"responses":{"204":{"description":"Deleted"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/partner/{localUserId}":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"},{"name":"localUserId","in":"path","required":true,"description":"Our user id, stored as the patient's partner (external) id.","schema":{"type":"string","pattern":"^[0-9]{1,9}$"}}],"post":{"operationId":"LinkPartnerUser","description":"Our client posts the literal body \`false\`.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"boolean"}}}},"responses":{"200":{"description":"Linked","content":{"application/json":{"schema":{"type":"boolean"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patients":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"name":"email","in":"query","schema":{"type":"string","enum":["ada@example.com","nobody@example.com"]}},{"name":"firstName","in":"query","schema":{"type":"string","enum":["Ada","Grace"]}},{"name":"lastName","in":"query","schema":{"type":"string","enum":["Lovelace","Hopper"]}},{"name":"dateOfBirth","in":"query","schema":{"type":"string","enum":["1985-12-10","1906-12-09"]}}],"get":{"operationId":"ListPatients","description":"All patients, or a search when any filter is given (404 when nothing matches).","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Matching patients","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Patient"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/testresults":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"post":{"operationId":"CreateTestResults","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestResultsRequest"}}}},"responses":{"200":{"description":"The imported patient test","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientTest"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/test":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"post":{"operationId":"CreatePatientTest","description":"Import an HL7 v2 ORU^R01 message; OBX-3 codes map to elements by their elementReferences.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hl7Request"}}}},"responses":{"200":{"description":"The imported patient test","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientTest"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/test/{patientTestId}":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"},{"name":"patientTestId","in":"path","required":true,"schema":{"type":"string","description":"Ids are assigned sequentially from 700001 (parity walks reuse them).","enum":["700001","700002","999999"]}}],"put":{"operationId":"UpdatePatientTest","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hl7Request"}}}},"responses":{"200":{"description":"The re-imported patient test","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientTest"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/tests":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"get":{"operationId":"ListPatientTests","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"The patient's tests, oldest first","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PatientTest"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/reports/FunctionalHealthReport":{"post":{"operationId":"GenerateFunctionalHealthReport","description":"\`outputType: Json\` answers the report as JSON; \`Pdf\` answers application/pdf bytes.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}}},"responses":{"200":{"description":"The report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}},"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/webhooks":{"get":{"operationId":"ListWebhooks","description":"Our webhook guard calls this on every inbound webhook to fetch the signing key.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Registered webhooks, with their signing keys","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/webhook":{"post":{"operationId":"RegisterWebhook","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRequest"}}}},"responses":{"200":{"description":"Registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/webhook/{partnerWebhookId}":{"parameters":[{"name":"partnerWebhookId","in":"path","required":true,"schema":{"type":"string","description":"Ids are assigned sequentially from 1.","enum":["1","2","999999"]}}],"put":{"operationId":"UpdateWebhook","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRequest"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"ApiKey"}},"parameters":{"PracticeId":{"name":"practiceId","in":"path","required":true,"description":"OPTIMAL_PRACTICE_ID. Parity walks use one fixed practice.","schema":{"type":"string","enum":["3f0c0c43-7d2b-4b8e-9a50-9c1f0c6c0001"]}},"PatientId":{"name":"patientId","in":"path","required":true,"schema":{"type":"string","description":"Ids are assigned sequentially from 100001 (parity walks reuse them).","enum":["100001","100002","999999"]}}},"responses":{"Unauthorized":{"description":"Missing or invalid ApiKey (Azure API Management's answer)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Unknown patient, test, lab or webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ValidationProblem":{"description":"ASP.NET validation problem details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","description":"\`{Message}\` (ODX), \`{statusCode, message}\` (API Management) or ASP.NET problem details.","properties":{"Message":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"},"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"Lab":{"type":"object","required":["labId","name"],"properties":{"labId":{"type":"integer"},"name":{"type":"string"},"isCurrentLab":{"type":"boolean"}}},"LabElement":{"type":"object","required":["labId","elementId","elementName","elementReferences"],"properties":{"labId":{"type":"integer"},"elementId":{"type":"integer"},"elementName":{"type":"string"},"elementGenderType":{"type":"string"},"cuUnit":{"type":"string"},"siUnit":{"type":"string"},"cuToSiConversionFactor":{"type":"number"},"elementReferences":{"type":"array","items":{"type":"object","required":["elementCode","elementName"],"properties":{"elementCode":{"type":"string"},"elementName":{"type":"string"}}}}}},"PatientRequest":{"type":"object","required":["firstName","lastName","gender","email"],"properties":{"firstName":{"type":"string","minLength":1,"maxLength":60,"enum":["Ada","Grace","Katherine"]},"lastName":{"type":"string","minLength":1,"maxLength":60,"enum":["Lovelace","Hopper","Johnson"]},"nickname":{"type":["string","null"],"maxLength":60},"dateOfBirth":{"type":["string","null"],"enum":["1985-12-10","1906-12-09",null]},"gender":{"type":"string","enum":["Male","Female"]},"email":{"type":"string","enum":["ada@example.com","grace@example.com"]},"userId":{"type":"string","maxLength":40},"workspaceId":{"type":"integer","minimum":0,"maximum":10}}},"Patient":{"type":"object","required":["patientId","practiceId","firstName","lastName","gender","email","createdDate","lastUpdatedDate"],"properties":{"patientId":{"type":"integer"},"practiceId":{"type":"string"},"createdDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"lastUpdatedDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"userTitle":{"type":["string","null"]},"userFirstName":{"type":["string","null"]},"userLastName":{"type":["string","null"]},"firstName":{"type":"string"},"lastName":{"type":"string"},"nickname":{"type":["string","null"]},"dateOfBirth":{"type":["string","null"]},"gender":{"type":"string"},"homePhone":{"type":["string","null"]},"workPhone":{"type":["string","null"]},"mobile":{"type":["string","null"]},"email":{"type":"string"},"address":{"type":["string","null"]},"address2":{"type":["string","null"]},"address3":{"type":["string","null"]},"city":{"type":["string","null"]},"province":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]},"userId":{"type":["string","null"]},"workspaceId":{"type":"integer"}}},"TestResultsRequest":{"type":"object","required":["labProfileId","labId","testDate","unitType","results"],"properties":{"labProfileId":{"type":"integer","enum":[1,2]},"labId":{"type":"string","enum":["1","2"]},"testDate":{"type":"string","enum":["2025-01-15T00:00:00.000Z","2025-06-15T00:00:00.000Z"]},"unitType":{"type":"string","enum":["ConventionalUS","SI"]},"userId":{"type":"string","maxLength":40},"menstrualPhase":{"type":"string","enum":["Unknown","Follicular","Ovulation","Luteal","PostMenopausal"]},"isFasting":{"type":"boolean"},"results":{"type":"array","maxItems":5,"items":{"type":"object","required":["elementId"],"properties":{"elementId":{"type":"integer","enum":[494,496,506,537,999]},"value":{"type":"number","minimum":0,"maximum":500},"comparison":{"type":["string","null"],"enum":["<",">","",null]},"observationDateTime":{"type":"string","maxLength":40}}}}}},"Hl7Request":{"type":"object","required":["labProfileId","labId","testDate","unitType","hl7"],"properties":{"labProfileId":{"type":"integer","enum":[1,2]},"labId":{"type":"integer","enum":[1,2,999]},"testDate":{"type":"string","enum":["2025-01-15T00:00:00.000Z","2025-06-15T00:00:00.000Z"]},"unitType":{"type":"string","enum":["ConventionalUS","SI"]},"userId":{"type":"string","maxLength":40},"externalReference":{"type":["string","null"],"maxLength":60},"externalMessageControlId":{"type":["string","null"],"maxLength":60},"externalPatientTestId":{"type":["string","null"],"maxLength":60},"menstrualPhase":{"type":"string","enum":["Unknown","Follicular","Ovulation","Luteal","PostMenopausal"]},"isFasting":{"type":"boolean"},"hl7":{"type":"string","enum":["MSH|^~\\\\&|LAB|AHA|GEVITI|GEVITI|20250115000000||ORU^R01|BL-001|P|2.3\\rPID|1||E2E-1||Test^Patient||19800101|M\\rOBR|1|||^^^Geviti|||20250115\\rOBX|1|NM|1751-7^Albumin||4.2|g/dL|3.5-5.5|N|||F|||20250115\\rOBX|2|NM|2160-0^Creatinine||1.1|mg/dL|0.6-1.3|N|||F|||20250115\\r","MSH|^~\\\\&|LAB|AHA|GEVITI|GEVITI|20250615000000||ORU^R01|IM-001|P|2.3\\rPID|1||E2E-1||Test^Patient||19800101|F\\rOBR|1|||^^^Geviti|||20250615\\rOBX|1|NM|30522-7^hs-CRP||<0.2|mg/L|0-3|N|||F|||20250615\\rOBX|2|NM|ZZZ-1^Unmapped Marker||12|U/L||N|||F|||20250615\\r","not an hl7 message"]}}},"PatientTestElement":{"type":"object","required":["elementId","elementName","unit","comparison"],"properties":{"elementValue":{"type":"number"},"comparison":{"type":"string"},"unit":{"type":"string"},"elementId":{"type":"integer"},"elementName":{"type":"string"},"optimalRangeLow":{"type":"number"},"optimalRangeHigh":{"type":"number"},"standardRangeLow":{"type":"number"},"standardRangeHigh":{"type":"number"}}},"PatientTest":{"type":"object","required":["patientTestId","patientId","labProfileId","testDate","unitType","createdDate","lastUpdatedDate","practiceId","labId","results","menstrualPhase","isFasting"],"properties":{"patientTestId":{"type":"integer"},"patientId":{"type":"integer"},"labProfileId":{"type":"integer"},"testDate":{"type":"string"},"unitType":{"type":"string"},"createdDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"lastUpdatedDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"userId":{"type":["string","null"]},"practiceId":{"type":"string"},"labId":{"type":"integer"},"externalReference":{"type":["string","null"]},"externalMessageControlId":{"type":["string","null"]},"externalPatientTestId":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/PatientTestElement"}},"importLogs":{"type":["array","null"],"items":{"type":"object","properties":{"observationIdentifier":{"type":["string","null"]},"observationIdentifierText":{"type":["string","null"]},"status":{"type":["string","null"]}}}},"menstrualPhase":{"type":"string"},"isFasting":{"type":"boolean"}}},"ReportRequest":{"type":"object","required":["patientTestId","patientId","outputType"],"properties":{"patientTestId":{"type":"integer","enum":[700001,999999]},"patientId":{"type":"integer","enum":[100001,999999]},"unitType":{"type":"string","enum":["ConventionalUS"]},"practiceId":{"type":"string","enum":["3f0c0c43-7d2b-4b8e-9a50-9c1f0c6c0001"]},"outputType":{"type":"string","enum":["Json","Pdf","Xml"]},"theme":{"type":"string","enum":["Geviti"]},"themeId":{"type":"integer","enum":[21]},"recipientId":{"type":"string","enum":["15","0"]},"cultureCode":{"type":"string","enum":["en-US"]},"reports":{"type":"array","maxItems":3,"items":{"type":"string","enum":["1","2","3"]}},"addMarginForBinding":{"type":"boolean"},"userId":{"type":"string","maxLength":40}}},"Report":{"type":"object","required":["metadata","labs","elements","sections"],"properties":{"metadata":{"type":"object","required":["practiceId","patientId","patientTestId","recipient","reports","unitType"],"properties":{"practiceId":{"type":"string"},"patientId":{"type":"integer"},"patientTestId":{"type":"integer"},"recipient":{"type":"string"},"reports":{"type":"array","items":{"type":"string"}},"unitType":{"type":"string"}}},"labs":{"type":"array","items":{"$ref":"#/components/schemas/Lab"}},"elements":{"type":"array","items":{"$ref":"#/components/schemas/PatientTestElement"}},"sections":{"type":"array","items":{"type":"object","required":["name","reports"],"properties":{"name":{"type":"string"},"reports":{"type":"array","items":{"type":"object","required":["reportId","name","content"],"properties":{"reportId":{"type":"integer"},"name":{"type":"string"},"content":{"type":"object"}}}}}}}}},"WebhookRequest":{"type":"object","required":["entityEvents","webhookUrl"],"properties":{"entityEvents":{"type":"object","required":["PatientTest"],"properties":{"PatientTest":{"type":"array","minItems":1,"items":{"type":"string","enum":["Created","Updated","Deleted"]}}}},"webhookUrl":{"type":"string","enum":["https://backend.example.test/odx/webhook","https://staging.example.test/odx/webhook"]}}},"Webhook":{"type":"object","required":["partnerWebhookId","signingKey","createDate","entityEvents","webhookUrl"],"properties":{"partnerWebhookId":{"type":"integer"},"signingKey":{"type":"string","x-mockingbird-volatile":{"kind":"token"}},"createDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"entityEvents":{"type":"object","properties":{"PatientTest":{"type":"array","items":{"type":"string"}}}},"webhookUrl":{"type":"string"}}}}}}`);
2417
+ var document = JSON.parse(`{"openapi":"3.1.0","info":{"title":"Optimal DX partner API (Mockingbird subset)","description":"Stateful mock of the Optimal DX (ODX) partner API our backend calls: partner labs and their\\nbiomarker elements, practice patients (create, update, delete, partner link, search), lab\\nresults (structured and HL7 v2 ORU imports), the Functional Health Report (JSON or PDF), and\\nwebhook registrations whose signing keys verify the PatientTest webhooks the mock posts.\\nODX publishes no spec; the contract is hand-authored from our consumer's wire shapes. The\\nvendor was retired 2026-07-22 but queue paths still call it while the consumer app's PDF flag (\`acme-pdf-enabled\`) is off.\\n","version":"1","x-mockingbird-upstream":{"note":"Hand-authored from optimal.dx.service.ts / optimal.dx.types.ts, the webhook guard and DTO (odx-signature.guard.ts, odx-webhook-data.dto.ts) and the QA harness (packages/qa odx-client.ts)."}},"servers":[{"url":"https://odxinstanceresource.azure-api.net/{partner}","description":"The partner segment is your account's slug.","variables":{"partner":{"default":"acme"}}}],"security":[{"apiKey":[]}],"paths":{"/v1/partner/labs":{"get":{"operationId":"ListPartnerLabs","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Labs this partner can import from","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Lab"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/elements/{labId}":{"parameters":[{"name":"labId","in":"path","required":true,"schema":{"type":"string","enum":["1","2","3","999"]}}],"get":{"operationId":"ListElements","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"The lab's biomarker elements (with the codes HL7 OBX-3 is mapped by)","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/LabElement"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient":{"parameters":[{"$ref":"#/components/parameters/PracticeId"}],"post":{"operationId":"CreatePatient","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientRequest"}}}},"responses":{"200":{"description":"Created patient","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Patient"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/practice/{practiceId}/patient/{patientId}":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"put":{"operationId":"UpdatePatient","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientRequest"}}}},"responses":{"200":{"description":"Updated patient","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Patient"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}},"delete":{"operationId":"DeletePatient","description":"Used by the QA harness teardown (via the send-odx-api-request dev tool).","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"responses":{"204":{"description":"Deleted"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/partner/{localUserId}":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"},{"name":"localUserId","in":"path","required":true,"description":"Our user id, stored as the patient's partner (external) id.","schema":{"type":"string","pattern":"^[0-9]{1,9}$"}}],"post":{"operationId":"LinkPartnerUser","description":"Our client posts the literal body \`false\`.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"boolean"}}}},"responses":{"200":{"description":"Linked","content":{"application/json":{"schema":{"type":"boolean"}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patients":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"name":"email","in":"query","schema":{"type":"string","enum":["ada@example.com","nobody@example.com"]}},{"name":"firstName","in":"query","schema":{"type":"string","enum":["Ada","Grace"]}},{"name":"lastName","in":"query","schema":{"type":"string","enum":["Lovelace","Hopper"]}},{"name":"dateOfBirth","in":"query","schema":{"type":"string","enum":["1985-12-10","1906-12-09"]}}],"get":{"operationId":"ListPatients","description":"All patients, or a search when any filter is given (404 when nothing matches).","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Matching patients","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Patient"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/testresults":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"post":{"operationId":"CreateTestResults","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TestResultsRequest"}}}},"responses":{"200":{"description":"The imported patient test","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientTest"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/test":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"post":{"operationId":"CreatePatientTest","description":"Import an HL7 v2 ORU^R01 message; OBX-3 codes map to elements by their elementReferences.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hl7Request"}}}},"responses":{"200":{"description":"The imported patient test","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientTest"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/test/{patientTestId}":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"},{"name":"patientTestId","in":"path","required":true,"schema":{"type":"string","description":"Ids are assigned sequentially from 700001 (parity walks reuse them).","enum":["700001","700002","999999"]}}],"put":{"operationId":"UpdatePatientTest","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hl7Request"}}}},"responses":{"200":{"description":"The re-imported patient test","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatientTest"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/practice/{practiceId}/patient/{patientId}/tests":{"parameters":[{"$ref":"#/components/parameters/PracticeId"},{"$ref":"#/components/parameters/PatientId"}],"get":{"operationId":"ListPatientTests","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"The patient's tests, oldest first","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PatientTest"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/reports/FunctionalHealthReport":{"post":{"operationId":"GenerateFunctionalHealthReport","description":"\`outputType: Json\` answers the report as JSON; \`Pdf\` answers application/pdf bytes.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportRequest"}}}},"responses":{"200":{"description":"The report","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Report"}},"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}},"/v1/webhooks":{"get":{"operationId":"ListWebhooks","description":"Our webhook guard calls this on every inbound webhook to fetch the signing key.","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":true}},"responses":{"200":{"description":"Registered webhooks, with their signing keys","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}}}}},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/webhook":{"post":{"operationId":"RegisterWebhook","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRequest"}}}},"responses":{"200":{"description":"Registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"}}}},"/v1/webhook/{partnerWebhookId}":{"parameters":[{"name":"partnerWebhookId","in":"path","required":true,"schema":{"type":"string","description":"Ids are assigned sequentially from 1.","enum":["1","2","999999"]}}],"put":{"operationId":"UpdateWebhook","x-mockingbird":{"supported":true,"parity":{"enabled":true,"safe":false}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRequest"}}}},"responses":{"200":{"description":"Updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"400":{"$ref":"#/components/responses/ValidationProblem"},"401":{"$ref":"#/components/responses/Unauthorized"},"404":{"$ref":"#/components/responses/NotFound"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"apiKey","in":"header","name":"ApiKey"}},"parameters":{"PracticeId":{"name":"practiceId","in":"path","required":true,"description":"OPTIMAL_PRACTICE_ID. Parity walks use one fixed practice.","schema":{"type":"string","enum":["3f0c0c43-7d2b-4b8e-9a50-9c1f0c6c0001"]}},"PatientId":{"name":"patientId","in":"path","required":true,"schema":{"type":"string","description":"Ids are assigned sequentially from 100001 (parity walks reuse them).","enum":["100001","100002","999999"]}}},"responses":{"Unauthorized":{"description":"Missing or invalid ApiKey (Azure API Management's answer)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Unknown patient, test, lab or webhook","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ValidationProblem":{"description":"ASP.NET validation problem details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"schemas":{"Error":{"type":"object","description":"\`{Message}\` (ODX), \`{statusCode, message}\` (API Management) or ASP.NET problem details.","properties":{"Message":{"type":"string"},"message":{"type":"string"},"statusCode":{"type":"integer"},"type":{"type":"string"},"title":{"type":"string"},"status":{"type":"integer"},"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}}},"Lab":{"type":"object","required":["labId","name"],"properties":{"labId":{"type":"integer"},"name":{"type":"string"},"isCurrentLab":{"type":"boolean"}}},"LabElement":{"type":"object","required":["labId","elementId","elementName","elementReferences"],"properties":{"labId":{"type":"integer"},"elementId":{"type":"integer"},"elementName":{"type":"string"},"elementGenderType":{"type":"string"},"cuUnit":{"type":"string"},"siUnit":{"type":"string"},"cuToSiConversionFactor":{"type":"number"},"elementReferences":{"type":"array","items":{"type":"object","required":["elementCode","elementName"],"properties":{"elementCode":{"type":"string"},"elementName":{"type":"string"}}}}}},"PatientRequest":{"type":"object","required":["firstName","lastName","gender","email"],"properties":{"firstName":{"type":"string","minLength":1,"maxLength":60,"enum":["Ada","Grace","Katherine"]},"lastName":{"type":"string","minLength":1,"maxLength":60,"enum":["Lovelace","Hopper","Johnson"]},"nickname":{"type":["string","null"],"maxLength":60},"dateOfBirth":{"type":["string","null"],"enum":["1985-12-10","1906-12-09",null]},"gender":{"type":"string","enum":["Male","Female"]},"email":{"type":"string","enum":["ada@example.com","grace@example.com"]},"userId":{"type":"string","maxLength":40},"workspaceId":{"type":"integer","minimum":0,"maximum":10}}},"Patient":{"type":"object","required":["patientId","practiceId","firstName","lastName","gender","email","createdDate","lastUpdatedDate"],"properties":{"patientId":{"type":"integer"},"practiceId":{"type":"string"},"createdDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"lastUpdatedDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"userTitle":{"type":["string","null"]},"userFirstName":{"type":["string","null"]},"userLastName":{"type":["string","null"]},"firstName":{"type":"string"},"lastName":{"type":"string"},"nickname":{"type":["string","null"]},"dateOfBirth":{"type":["string","null"]},"gender":{"type":"string"},"homePhone":{"type":["string","null"]},"workPhone":{"type":["string","null"]},"mobile":{"type":["string","null"]},"email":{"type":"string"},"address":{"type":["string","null"]},"address2":{"type":["string","null"]},"address3":{"type":["string","null"]},"city":{"type":["string","null"]},"province":{"type":["string","null"]},"postalCode":{"type":["string","null"]},"country":{"type":["string","null"]},"userId":{"type":["string","null"]},"workspaceId":{"type":"integer"}}},"TestResultsRequest":{"type":"object","required":["labProfileId","labId","testDate","unitType","results"],"properties":{"labProfileId":{"type":"integer","enum":[1,2]},"labId":{"type":"string","enum":["1","2"]},"testDate":{"type":"string","enum":["2025-01-15T00:00:00.000Z","2025-06-15T00:00:00.000Z"]},"unitType":{"type":"string","enum":["ConventionalUS","SI"]},"userId":{"type":"string","maxLength":40},"menstrualPhase":{"type":"string","enum":["Unknown","Follicular","Ovulation","Luteal","PostMenopausal"]},"isFasting":{"type":"boolean"},"results":{"type":"array","maxItems":5,"items":{"type":"object","required":["elementId"],"properties":{"elementId":{"type":"integer","enum":[494,496,506,537,999]},"value":{"type":"number","minimum":0,"maximum":500},"comparison":{"type":["string","null"],"enum":["<",">","",null]},"observationDateTime":{"type":"string","maxLength":40}}}}}},"Hl7Request":{"type":"object","required":["labProfileId","labId","testDate","unitType","hl7"],"properties":{"labProfileId":{"type":"integer","enum":[1,2]},"labId":{"type":"integer","enum":[1,2,999]},"testDate":{"type":"string","enum":["2025-01-15T00:00:00.000Z","2025-06-15T00:00:00.000Z"]},"unitType":{"type":"string","enum":["ConventionalUS","SI"]},"userId":{"type":"string","maxLength":40},"externalReference":{"type":["string","null"],"maxLength":60},"externalMessageControlId":{"type":["string","null"],"maxLength":60},"externalPatientTestId":{"type":["string","null"],"maxLength":60},"menstrualPhase":{"type":"string","enum":["Unknown","Follicular","Ovulation","Luteal","PostMenopausal"]},"isFasting":{"type":"boolean"},"hl7":{"type":"string","enum":["MSH|^~\\\\&|LAB|AHA|ACME|ACME|20250115000000||ORU^R01|BL-001|P|2.3\\rPID|1||E2E-1||Test^Patient||19800101|M\\rOBR|1|||^^^Acme|||20250115\\rOBX|1|NM|1751-7^Albumin||4.2|g/dL|3.5-5.5|N|||F|||20250115\\rOBX|2|NM|2160-0^Creatinine||1.1|mg/dL|0.6-1.3|N|||F|||20250115\\r","MSH|^~\\\\&|LAB|AHA|ACME|ACME|20250615000000||ORU^R01|IM-001|P|2.3\\rPID|1||E2E-1||Test^Patient||19800101|F\\rOBR|1|||^^^Acme|||20250615\\rOBX|1|NM|30522-7^hs-CRP||<0.2|mg/L|0-3|N|||F|||20250615\\rOBX|2|NM|ZZZ-1^Unmapped Marker||12|U/L||N|||F|||20250615\\r","not an hl7 message"]}}},"PatientTestElement":{"type":"object","required":["elementId","elementName","unit","comparison"],"properties":{"elementValue":{"type":"number"},"comparison":{"type":"string"},"unit":{"type":"string"},"elementId":{"type":"integer"},"elementName":{"type":"string"},"optimalRangeLow":{"type":"number"},"optimalRangeHigh":{"type":"number"},"standardRangeLow":{"type":"number"},"standardRangeHigh":{"type":"number"}}},"PatientTest":{"type":"object","required":["patientTestId","patientId","labProfileId","testDate","unitType","createdDate","lastUpdatedDate","practiceId","labId","results","menstrualPhase","isFasting"],"properties":{"patientTestId":{"type":"integer"},"patientId":{"type":"integer"},"labProfileId":{"type":"integer"},"testDate":{"type":"string"},"unitType":{"type":"string"},"createdDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"lastUpdatedDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"userId":{"type":["string","null"]},"practiceId":{"type":"string"},"labId":{"type":"integer"},"externalReference":{"type":["string","null"]},"externalMessageControlId":{"type":["string","null"]},"externalPatientTestId":{"type":["string","null"]},"results":{"type":"array","items":{"$ref":"#/components/schemas/PatientTestElement"}},"importLogs":{"type":["array","null"],"items":{"type":"object","properties":{"observationIdentifier":{"type":["string","null"]},"observationIdentifierText":{"type":["string","null"]},"status":{"type":["string","null"]}}}},"menstrualPhase":{"type":"string"},"isFasting":{"type":"boolean"}}},"ReportRequest":{"type":"object","required":["patientTestId","patientId","outputType"],"properties":{"patientTestId":{"type":"integer","enum":[700001,999999]},"patientId":{"type":"integer","enum":[100001,999999]},"unitType":{"type":"string","enum":["ConventionalUS"]},"practiceId":{"type":"string","enum":["3f0c0c43-7d2b-4b8e-9a50-9c1f0c6c0001"]},"outputType":{"type":"string","enum":["Json","Pdf","Xml"]},"theme":{"type":"string","enum":["Acme"]},"themeId":{"type":"integer","enum":[21]},"recipientId":{"type":"string","enum":["15","0"]},"cultureCode":{"type":"string","enum":["en-US"]},"reports":{"type":"array","maxItems":3,"items":{"type":"string","enum":["1","2","3"]}},"addMarginForBinding":{"type":"boolean"},"userId":{"type":"string","maxLength":40}}},"Report":{"type":"object","required":["metadata","labs","elements","sections"],"properties":{"metadata":{"type":"object","required":["practiceId","patientId","patientTestId","recipient","reports","unitType"],"properties":{"practiceId":{"type":"string"},"patientId":{"type":"integer"},"patientTestId":{"type":"integer"},"recipient":{"type":"string"},"reports":{"type":"array","items":{"type":"string"}},"unitType":{"type":"string"}}},"labs":{"type":"array","items":{"$ref":"#/components/schemas/Lab"}},"elements":{"type":"array","items":{"$ref":"#/components/schemas/PatientTestElement"}},"sections":{"type":"array","items":{"type":"object","required":["name","reports"],"properties":{"name":{"type":"string"},"reports":{"type":"array","items":{"type":"object","required":["reportId","name","content"],"properties":{"reportId":{"type":"integer"},"name":{"type":"string"},"content":{"type":"object"}}}}}}}}},"WebhookRequest":{"type":"object","required":["entityEvents","webhookUrl"],"properties":{"entityEvents":{"type":"object","required":["PatientTest"],"properties":{"PatientTest":{"type":"array","minItems":1,"items":{"type":"string","enum":["Created","Updated","Deleted"]}}}},"webhookUrl":{"type":"string","enum":["https://backend.example.test/odx/webhook","https://staging.example.test/odx/webhook"]}}},"Webhook":{"type":"object","required":["partnerWebhookId","signingKey","createDate","entityEvents","webhookUrl"],"properties":{"partnerWebhookId":{"type":"integer"},"signingKey":{"type":"string","x-mockingbird-volatile":{"kind":"token"}},"createDate":{"type":"string","x-mockingbird-volatile":{"kind":"timestamp"}},"entityEvents":{"type":"object","properties":{"PatientTest":{"type":"array","items":{"type":"string"}}}},"webhookUrl":{"type":"string"}}}}}}`);
2401
2418
  var operationIds = ["ListPartnerLabs", "ListElements", "CreatePatient", "UpdatePatient", "DeletePatient", "LinkPartnerUser", "ListPatients", "CreateTestResults", "CreatePatientTest", "UpdatePatientTest", "ListPatientTests", "GenerateFunctionalHealthReport", "ListWebhooks", "RegisterWebhook", "UpdateWebhook"];
2402
2419
  var supportedOperationIds = ["ListPartnerLabs", "ListElements", "CreatePatient", "UpdatePatient", "DeletePatient", "LinkPartnerUser", "ListPatients", "CreateTestResults", "CreatePatientTest", "UpdatePatientTest", "ListPatientTests", "GenerateFunctionalHealthReport", "ListWebhooks", "RegisterWebhook", "UpdateWebhook"];
2403
2420
 
@@ -2477,8 +2494,8 @@ var band = (r) => {
2477
2494
 
2478
2495
  // src/report.ts
2479
2496
  var RECIPIENTS = {
2480
- "15": "Patient (Geviti)",
2481
- "16": "Practitioner (Geviti)",
2497
+ "15": "Patient (Acme)",
2498
+ "16": "Practitioner (Acme)",
2482
2499
  "1": "Patient",
2483
2500
  "2": "Practitioner"
2484
2501
  };
@@ -3239,4 +3256,4 @@ export {
3239
3256
  apiKeyCredential,
3240
3257
  OdxAPI
3241
3258
  };
3242
- //# sourceMappingURL=chunk-OYDT3HEE.js.map
3259
+ //# sourceMappingURL=chunk-XITCXMFI.js.map