@ubercode/dcmtk 0.1.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -15
- package/dist/DicomInstance-D9plqHp5.d.ts +625 -0
- package/dist/DicomInstance-DNHPkkzl.d.cts +625 -0
- package/dist/{dcmodify-CTXBWKU9.d.cts → dcmodify-B-_uUIKB.d.ts} +4 -2
- package/dist/{dcmodify-Daeafqrm.d.ts → dcmodify-Gds9u5Vj.d.cts} +4 -2
- package/dist/dicom.cjs +329 -51
- package/dist/dicom.cjs.map +1 -1
- package/dist/dicom.d.cts +368 -3
- package/dist/dicom.d.ts +368 -3
- package/dist/dicom.js +329 -51
- package/dist/dicom.js.map +1 -1
- package/dist/index.cjs +1993 -423
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +324 -10
- package/dist/index.d.ts +324 -10
- package/dist/index.js +1962 -417
- package/dist/index.js.map +1 -1
- package/dist/servers.cjs +2380 -197
- package/dist/servers.cjs.map +1 -1
- package/dist/servers.d.cts +1654 -3
- package/dist/servers.d.ts +1654 -3
- package/dist/servers.js +2306 -146
- package/dist/servers.js.map +1 -1
- package/dist/tools.cjs +98 -51
- package/dist/tools.cjs.map +1 -1
- package/dist/tools.d.cts +21 -4
- package/dist/tools.d.ts +21 -4
- package/dist/tools.js +98 -52
- package/dist/tools.js.map +1 -1
- package/dist/{types-zHhxS7d2.d.cts → types-Cgumy1N4.d.cts} +1 -24
- package/dist/{types-zHhxS7d2.d.ts → types-Cgumy1N4.d.ts} +1 -24
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +8 -8
- package/dist/index-BZxi4104.d.ts +0 -826
- package/dist/index-CapkWqxy.d.ts +0 -1295
- package/dist/index-DX4C3zbo.d.cts +0 -826
- package/dist/index-r7AvpkCE.d.cts +0 -1295
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/constants.ts","../src/exec.ts","../src/patterns.ts","../src/findDcmtkPath.ts","../src/tools/_resolveBinary.ts","../src/tools/_toolError.ts","../src/tools/dcm2xml.ts","../src/tools/_xmlToJson.ts","../src/tools/_repairJson.ts","../src/tools/dcm2json.ts","../src/tools/dcmdump.ts","../src/tools/dcmconv.ts","../src/tools/dcmodify.ts","../src/tools/dcmftest.ts","../src/tools/dcmgpdir.ts","../src/tools/dcmmkdir.ts","../src/tools/dcmqridx.ts","../src/tools/xml2dcm.ts","../src/tools/json2dcm.ts","../src/tools/dump2dcm.ts","../src/tools/img2dcm.ts","../src/tools/pdf2dcm.ts","../src/tools/dcm2pdf.ts","../src/tools/cda2dcm.ts","../src/tools/dcm2cda.ts","../src/tools/stl2dcm.ts","../src/tools/dcmcrle.ts","../src/tools/dcmdrle.ts","../src/tools/dcmencap.ts","../src/tools/dcmdecap.ts","../src/tools/dcmcjpeg.ts","../src/tools/dcmdjpeg.ts","../src/tools/dcmcjpls.ts","../src/tools/dcmdjpls.ts","../src/tools/dcmj2pnm.ts","../src/tools/dcm2pnm.ts","../src/tools/dcmscale.ts","../src/tools/dcmquant.ts","../src/tools/dcmdspfn.ts","../src/tools/dcod2lum.ts","../src/tools/dconvlum.ts","../src/tools/echoscu.ts","../src/tools/dcmsend.ts","../src/tools/storescu.ts","../src/tools/findscu.ts","../src/tools/movescu.ts","../src/tools/getscu.ts","../src/tools/termscu.ts","../src/tools/dsrdump.ts","../src/tools/dsr2xml.ts","../src/tools/xml2dsr.ts","../src/tools/drtdump.ts","../src/tools/dcmpsmk.ts","../src/tools/dcmpschk.ts","../src/tools/dcmprscu.ts","../src/tools/dcmpsprt.ts","../src/tools/dcmp2pgm.ts","../src/tools/dcmmkcrv.ts","../src/tools/dcmmklut.ts"],"names":["stderr","isWindows","binaryName","join","z","buildArgs","DEFAULT_DICOMDIR"],"mappings":"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","file":"tools.js","sourcesContent":["/**\n * Represents the outcome of an operation that can succeed or fail.\n *\n * @typeParam T - The type of the success value\n * @typeParam E - The type of the error (defaults to Error)\n *\n * @example\n * ```ts\n * function divide(a: number, b: number): Result<number> {\n * if (b === 0) {\n * return err(new Error('Division by zero'));\n * }\n * return ok(a / b);\n * }\n *\n * const result = divide(10, 2);\n * if (result.ok) {\n * console.log(result.value); // 5\n * } else {\n * console.error(result.error.message);\n * }\n * ```\n */\ntype Result<T, E = Error> = { readonly ok: true; readonly value: T } | { readonly ok: false; readonly error: E };\n\n/**\n * Creates a successful Result containing the given value.\n *\n * @param value - The success value to wrap\n * @returns A Result representing success\n *\n * @example\n * ```ts\n * const result = ok(42);\n * // result.ok === true, result.value === 42\n * ```\n */\nfunction ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Creates a failed Result containing the given error.\n *\n * @param error - The error to wrap\n * @returns A Result representing failure\n *\n * @example\n * ```ts\n * const result = err(new Error('not found'));\n * // result.ok === false, result.error.message === 'not found'\n * ```\n */\nfunction err<E>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Exhaustive check helper for discriminated unions and switch statements.\n * Calling this in a default case ensures all variants are handled at compile time.\n *\n * @param x - A value that should be of type `never` if all cases are handled\n * @returns Never returns; always throws\n * @throws Always throws an Error indicating an unhandled case\n *\n * @example\n * ```ts\n * type Shape = { kind: 'circle' } | { kind: 'square' };\n *\n * function area(shape: Shape): number {\n * switch (shape.kind) {\n * case 'circle': return Math.PI;\n * case 'square': return 1;\n * default: assertUnreachable(shape);\n * }\n * }\n * ```\n */\nfunction assertUnreachable(x: never): never {\n throw new Error(`Exhaustive check failed: ${JSON.stringify(x)}`);\n}\n\n// ---------------------------------------------------------------------------\n// Process result types (Rule 7.1: immutable)\n// ---------------------------------------------------------------------------\n\n/**\n * The result of executing a short-lived DCMTK binary.\n * All properties are readonly to enforce immutability.\n */\ninterface DcmtkProcessResult {\n /** The captured stdout output from the process. */\n readonly stdout: string;\n /** The captured stderr output from the process. */\n readonly stderr: string;\n /** The exit code of the process (0 typically means success). */\n readonly exitCode: number;\n}\n\n// ---------------------------------------------------------------------------\n// Common option types (Rule 8.4: options objects for > 4 params)\n// ---------------------------------------------------------------------------\n\n/**\n * Options for short-lived DCMTK process execution.\n * Provides configurable timeout and abort support per Rule 4.2.\n */\ninterface ExecOptions {\n /** Working directory for the child process. */\n readonly cwd?: string | undefined;\n /** Timeout in milliseconds. Defaults to DEFAULT_TIMEOUT_MS. */\n readonly timeoutMs?: number | undefined;\n /** AbortSignal for external cancellation. */\n readonly signal?: AbortSignal | undefined;\n}\n\n/**\n * Options for spawning a DCMTK process with user-supplied arguments.\n * Uses spawn() instead of exec() to avoid shell injection (Rule 7.4).\n */\ninterface SpawnOptions extends ExecOptions {\n /** Additional environment variables merged with process.env. */\n readonly env?: Readonly<Record<string, string>> | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Event types (Rule 8.3: discriminated unions)\n// ---------------------------------------------------------------------------\n\n/**\n * Line source discriminant for output parsing.\n */\ntype LineSource = 'stdout' | 'stderr';\n\n/**\n * A single line of output from a DCMTK process.\n */\ninterface ProcessLine {\n readonly source: LineSource;\n readonly text: string;\n}\n\n// ---------------------------------------------------------------------------\n// Result utility functions\n// ---------------------------------------------------------------------------\n\n/**\n * Extracts the value from a successful Result, or throws the error.\n *\n * Use this when you want to opt out of explicit Result handling and\n * let errors propagate as exceptions.\n *\n * @param result - The Result to unwrap\n * @returns The success value\n * @throws The error if the result is not ok\n *\n * @example\n * ```ts\n * // Instead of:\n * const result = await echoscu({ host: 'localhost', port: 104 });\n * if (!result.ok) throw result.error;\n * console.log(result.value);\n *\n * // You can write:\n * const value = unwrap(await echoscu({ host: 'localhost', port: 104 }));\n * console.log(value);\n * ```\n */\nfunction unwrap<T>(result: Result<T>): T {\n if (result.ok) {\n return result.value;\n }\n throw result.error;\n}\n\n/**\n * Transforms the success value of a Result, passing through errors unchanged.\n *\n * @param result - The Result to transform\n * @param fn - The transformation function\n * @returns A new Result with the transformed value, or the original error\n *\n * @example\n * ```ts\n * const result = ok(42);\n * const doubled = mapResult(result, x => x * 2);\n * // doubled.ok === true, doubled.value === 84\n * ```\n */\nfunction mapResult<T, U>(result: Result<T>, fn: (value: T) => U): Result<U> {\n if (result.ok) {\n return ok(fn(result.value));\n }\n return result;\n}\n\n/**\n * Extracts the success type from a Result.\n * Useful for extracting branded types from factory function returns.\n *\n * @example\n * ```ts\n * type Tag = ResultValue<ReturnType<typeof createDicomTag>>; // DicomTag\n * ```\n */\ntype ResultValue<R> = R extends Result<infer T> ? T : never;\n\nexport { ok, err, assertUnreachable, unwrap, mapResult };\nexport type { Result, ResultValue, DcmtkProcessResult, ExecOptions, SpawnOptions, LineSource, ProcessLine };\n","/**\n * Application-wide constants.\n *\n * All values use `as const` assertions per Rule 3.5 (no traditional enums).\n * All bounds are documented per Rule 8.1 (bounded loops/buffers).\n *\n * @module constants\n */\n\n// ---------------------------------------------------------------------------\n// Timeouts (Rule 4.2: mandatory timeouts on all async operations)\n// ---------------------------------------------------------------------------\n\n/** Default timeout for short-lived process execution (30 seconds). */\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Default timeout for long-lived process startup (10 seconds). */\nconst DEFAULT_START_TIMEOUT_MS = 10_000;\n\n/** Default timeout for graceful shutdown drain (5 seconds). */\nconst DEFAULT_DRAIN_TIMEOUT_MS = 5_000;\n\n/** Default timeout for multi-line block accumulation in line parser (1 second). */\nconst DEFAULT_BLOCK_TIMEOUT_MS = 1_000;\n\n// ---------------------------------------------------------------------------\n// DICOM network constants\n// ---------------------------------------------------------------------------\n\n/** DICOM protocol default PDU sizes. */\nconst PDU_SIZE = {\n /** Default maximum PDU receive size (16 KB). */\n DEFAULT: 16_384,\n /** Minimum allowed PDU size (4 KB). */\n MIN: 4_096,\n /** Maximum allowed PDU size (128 KB). */\n MAX: 131_072,\n} as const;\n\n/** Default DICOM port used by DCMTK tools. */\nconst DEFAULT_DICOM_PORT = 104;\n\n// ---------------------------------------------------------------------------\n// Platform-specific known DCMTK install paths\n// ---------------------------------------------------------------------------\n\n/** Known DCMTK binary locations on Windows. */\nconst WINDOWS_SEARCH_PATHS = ['C:\\\\Program Files\\\\DCMTK\\\\bin', 'C:\\\\Program Files (x86)\\\\DCMTK\\\\bin', 'C:\\\\ProgramData\\\\chocolatey\\\\bin'] as const;\n\n/** Known DCMTK binary locations on Unix/macOS. */\nconst UNIX_SEARCH_PATHS = ['/usr/local/bin', '/usr/bin', '/opt/local/bin', '/opt/homebrew/bin'] as const;\n\n// ---------------------------------------------------------------------------\n// Required DCMTK binaries (minimum set for core functionality)\n// ---------------------------------------------------------------------------\n\n/** Binaries that must be present for the library to function. */\nconst REQUIRED_BINARIES = ['dcm2json', 'dcm2xml', 'dcmodify', 'dcmdump', 'dcmrecv', 'dcmsend', 'echoscu'] as const;\n\n// ---------------------------------------------------------------------------\n// Bounded limits (Rule 8.1: all loops and buffers must have upper bounds)\n// ---------------------------------------------------------------------------\n\n/** Maximum lines accumulated in multi-line block parser. */\nconst MAX_BLOCK_LINES = 1_000;\n\n/** Maximum number of event patterns a line parser can hold. */\nconst MAX_EVENT_PATTERNS = 200;\n\n/** Maximum loop iterations for iterative traversal (e.g., nested sequences). */\nconst MAX_TRAVERSAL_DEPTH = 50;\n\n/** Maximum number of operations (modifications + erasures) in a single ChangeSet. */\nconst MAX_CHANGESET_OPERATIONS = 10_000;\n\n/** Maximum bytes allowed for stdout + stderr buffering (100 MB). */\nconst MAX_OUTPUT_BYTES = 100 * 1024 * 1024;\n\nexport {\n DEFAULT_TIMEOUT_MS,\n DEFAULT_START_TIMEOUT_MS,\n DEFAULT_DRAIN_TIMEOUT_MS,\n DEFAULT_BLOCK_TIMEOUT_MS,\n PDU_SIZE,\n DEFAULT_DICOM_PORT,\n WINDOWS_SEARCH_PATHS,\n UNIX_SEARCH_PATHS,\n REQUIRED_BINARIES,\n MAX_BLOCK_LINES,\n MAX_EVENT_PATTERNS,\n MAX_TRAVERSAL_DEPTH,\n MAX_CHANGESET_OPERATIONS,\n MAX_OUTPUT_BYTES,\n};\n","/**\n * Short-lived DCMTK process execution.\n *\n * Two execution modes:\n * - `execCommand()` — convenience wrapper; uses `spawn()` internally for safety\n * - `spawnCommand()` — uses `child_process.spawn()`, safer for user-supplied values (Rule 7.4)\n *\n * Both enforce mandatory timeouts (Rule 4.2) and return `Result<DcmtkProcessResult>`.\n *\n * @module exec\n */\n\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport kill from 'tree-kill';\nimport type { Result, DcmtkProcessResult, ExecOptions, SpawnOptions } from './types';\nimport { ok, err } from './types';\nimport { DEFAULT_TIMEOUT_MS, MAX_OUTPUT_BYTES } from './constants';\n\n/**\n * Kills a process tree by PID. Wraps tree-kill in a promise.\n *\n * @param pid - The process ID to kill\n */\nfunction killTree(pid: number): void {\n try {\n kill(pid);\n /* v8 ignore next */\n } catch {\n // Process may already be dead — not exceptional\n }\n}\n\n/**\n * Executes a DCMTK binary as a short-lived process.\n *\n * **Security:** This function uses `child_process.spawn()` internally, passing\n * arguments as an array to avoid shell interpretation. This eliminates shell\n * injection risks regardless of argument content (Rule 7.4).\n *\n * @param binary - Full path to the DCMTK binary\n * @param args - Command-line arguments (passed directly, no shell interpolation)\n * @param options - Execution options (timeout, cwd, signal)\n * @returns A Result containing the process output or an error\n * @throws Never throws for expected failures (Rule 6.1)\n *\n * @example\n * ```ts\n * const result = await execCommand('/usr/local/bin/dcm2json', ['+ll', 'input.dcm']);\n * if (result.ok) {\n * console.log(result.value.stdout);\n * }\n * ```\n */\nasync function execCommand(binary: string, args: readonly string[], options?: ExecOptions): Promise<Result<DcmtkProcessResult>> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise(resolve => {\n const child = spawn(binary, [...args], {\n cwd: options?.cwd,\n windowsHide: true,\n signal: options?.signal,\n });\n wireSpawnListeners(child, timeoutMs, resolve);\n });\n}\n\n/**\n * Wires event listeners on a spawned child process with timeout, bounded buffering, and settle logic.\n */\nfunction wireSpawnListeners(child: ChildProcess, timeoutMs: number, resolve: (result: Result<DcmtkProcessResult>) => void): void {\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const settle = (result: Result<DcmtkProcessResult>): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n\n const timer = setTimeout(() => {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process timed out after ${timeoutMs}ms`)));\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += String(chunk);\n if (stdout.length + stderr.length > MAX_OUTPUT_BYTES) {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process output exceeded ${MAX_OUTPUT_BYTES} bytes`)));\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderr += String(chunk);\n if (stdout.length + stderr.length > MAX_OUTPUT_BYTES) {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process output exceeded ${MAX_OUTPUT_BYTES} bytes`)));\n }\n });\n\n child.on('error', (error: Error) => {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process error: ${error.message}`)));\n });\n\n child.on('close', (code: number | null) => {\n settle(ok({ stdout, stderr, exitCode: code ?? 1 }));\n });\n}\n\n/**\n * Executes a DCMTK binary using `child_process.spawn()`.\n *\n * Like {@link execCommand}, arguments are passed as an array to avoid shell\n * injection (Rule 7.4). This variant additionally supports custom environment\n * variables via the `env` option.\n *\n * @param binary - Full path to the DCMTK binary\n * @param args - Command-line arguments (passed directly, no shell interpolation)\n * @param options - Execution options (timeout, cwd, signal, env)\n * @returns A Result containing the process output or an error\n * @throws Never throws for expected failures (Rule 6.1)\n *\n * @example\n * ```ts\n * const result = await spawnCommand('/usr/local/bin/dcmodify', ['-m', '(0010,0010)=Smith^John', 'input.dcm']);\n * ```\n */\nasync function spawnCommand(binary: string, args: readonly string[], options?: SpawnOptions): Promise<Result<DcmtkProcessResult>> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise(resolve => {\n const child = spawn(binary, [...args], {\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n windowsHide: true,\n signal: options?.signal,\n });\n wireSpawnListeners(child, timeoutMs, resolve);\n });\n}\n\nexport { execCommand, spawnCommand };\n","/**\n * Shared validation regex patterns and constants.\n *\n * Centralises all DICOM-related validation patterns so that brands,\n * validation schemas, and server modules reference a single source\n * of truth rather than maintaining duplicated copies.\n *\n * @module patterns\n */\n\n// ---------------------------------------------------------------------------\n// DICOM tag and UID patterns\n// ---------------------------------------------------------------------------\n\n/** Matches a DICOM tag in `(XXXX,XXXX)` format where X is a hex digit. */\nconst DICOM_TAG_PATTERN = /^\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)$/;\n\n/** Matches a DICOM AE Title: letters, digits, spaces, and hyphens. */\nconst AE_TITLE_PATTERN = /^[A-Za-z0-9 -]+$/;\n\n/**\n * Matches a dotted numeric OID (e.g. `1.2.840.10008`).\n *\n * Note: This intentionally accepts any syntactically valid dotted-numeric form.\n * DICOM PS3.5 §9.1 requires UIDs start with a non-zero root (e.g., `0.0.0` is\n * technically invalid), but real-world DICOM datasets contain such UIDs, so we\n * validate syntax only and leave semantic UID validation to the application layer.\n */\nconst UID_PATTERN = /^[0-9]+(\\.[0-9]+)*$/;\n\n/** Matches a single DICOM tag path segment with optional array index. */\nconst TAG_PATH_SEGMENT = /\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)(\\[\\d+\\])?/;\n\n/** Matches a full dot-separated DICOM tag path (e.g. `(0040,A730)[0].(0010,0010)`). */\nconst DICOM_TAG_PATH_PATTERN = new RegExp(`^${TAG_PATH_SEGMENT.source}(\\\\.${TAG_PATH_SEGMENT.source})*$`);\n\n// ---------------------------------------------------------------------------\n// Validation constants\n// ---------------------------------------------------------------------------\n\n/** Minimum length for an AE Title. */\nconst AE_TITLE_MIN_LENGTH = 1;\n\n/** Maximum length for an AE Title. */\nconst AE_TITLE_MAX_LENGTH = 16;\n\n/** Maximum length for a DICOM UID. */\nconst UID_MAX_LENGTH = 64;\n\n/** Minimum valid network port number. */\nconst PORT_MIN = 1;\n\n/** Maximum valid network port number. */\nconst PORT_MAX = 65535;\n\n// ---------------------------------------------------------------------------\n// DICOM query key patterns\n// ---------------------------------------------------------------------------\n\n/**\n * Matches a valid DICOM query key for `-k` arguments.\n *\n * Accepted formats:\n * - `XXXX,XXXX` — bare tag\n * - `XXXX,XXXX=value` — tag with value\n * - `XXXX,XXXX[0].XXXX,XXXX=value` — nested path with value\n * - `XXXX,XXXX.XXXX,XXXX=value` — dotted path with value\n *\n * The tag portion must start with a valid hex tag pair. Value after `=` is unconstrained.\n */\n// eslint-disable-next-line no-useless-escape\nconst DICOM_QUERY_KEY_PATTERN = /^[0-9A-Fa-f]{4},[0-9A-Fa-f]{4}(?:[\\[.\\]0-9A-Fa-f,]*)?(?:=.*)?$/;\n\n/**\n * Returns true if the string is a valid DICOM query key for `-k` arguments.\n */\nfunction isValidDicomKey(key: string): boolean {\n return DICOM_QUERY_KEY_PATTERN.test(key);\n}\n\n// ---------------------------------------------------------------------------\n// Path safety\n// ---------------------------------------------------------------------------\n\n/** Pattern matching `..` as a path segment (between separators, or at start/end). */\nconst PATH_TRAVERSAL_PATTERN = /(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)/;\n\n/**\n * Returns true if the string contains only valid DICOM AE Title characters.\n */\nfunction isValidAETitle(value: string): boolean {\n return AE_TITLE_PATTERN.test(value);\n}\n\n/**\n * Returns true if the path does not contain traversal sequences.\n *\n * @param p - The filesystem path to check\n * @returns `true` when the path is safe (no `..` segments)\n */\nfunction isSafePath(p: string): boolean {\n return !PATH_TRAVERSAL_PATTERN.test(p);\n}\n\nexport {\n DICOM_TAG_PATTERN,\n AE_TITLE_PATTERN,\n UID_PATTERN,\n TAG_PATH_SEGMENT,\n DICOM_TAG_PATH_PATTERN,\n AE_TITLE_MIN_LENGTH,\n AE_TITLE_MAX_LENGTH,\n UID_MAX_LENGTH,\n PORT_MIN,\n PORT_MAX,\n DICOM_QUERY_KEY_PATTERN,\n isValidDicomKey,\n isValidAETitle,\n PATH_TRAVERSAL_PATTERN,\n isSafePath,\n};\n","/**\n * Locates DCMTK binaries on the host system.\n *\n * Search order:\n * 1. `DCMTK_PATH` environment variable\n * 2. Platform-specific known install locations\n * 3. System PATH (via `which`/`where` lookup)\n *\n * @module findDcmtkPath\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { Result } from './types';\nimport { ok, err } from './types';\nimport { WINDOWS_SEARCH_PATHS, UNIX_SEARCH_PATHS, REQUIRED_BINARIES } from './constants';\nimport { isSafePath } from './patterns';\n\n/** Cached path result. Cleared only by passing `noCache: true`. */\nlet cachedPath: string | undefined;\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Returns the binary filename with platform-appropriate extension.\n *\n * @param name - The base binary name (e.g., `\"dcm2json\"`)\n * @returns The binary name with `.exe` appended on Windows\n */\nfunction binaryName(name: string): string {\n /* v8 ignore next -- platform-specific branch */\n return isWindows ? `${name}.exe` : name;\n}\n\n/**\n * Checks whether a directory contains all required DCMTK binaries.\n *\n * @param dir - The directory to check\n * @returns `true` if all required binaries exist in the directory\n */\nfunction hasRequiredBinaries(dir: string): boolean {\n for (const bin of REQUIRED_BINARIES) {\n if (!existsSync(join(dir, binaryName(bin)))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Attempts to locate a binary via the system PATH using `which` (Unix) or `where` (Windows).\n *\n * @param name - The binary name to search for\n * @returns The directory containing the binary, or `undefined` if not found\n */\nfunction findViaSystemPath(name: string): string | undefined {\n try {\n /* v8 ignore next -- platform-specific branch */\n const cmd = isWindows ? `where ${binaryName(name)}` : `which ${name}`;\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 5_000, windowsHide: true }).trim();\n const firstLine = result.split('\\n')[0]?.trim();\n if (firstLine) {\n /* v8 ignore next -- platform-specific branch */\n const lastSep = firstLine.lastIndexOf(isWindows ? '\\\\' : '/');\n if (lastSep >= 0) {\n return firstLine.substring(0, lastSep);\n }\n }\n } catch {\n // Binary not in PATH — this is expected, not exceptional\n }\n return undefined;\n}\n\n/**\n * Checks the DCMTK_PATH environment variable for a valid DCMTK installation.\n *\n * @returns A Result if the env var is set (success or error), or `undefined` if unset\n */\nfunction searchEnvPath(): Result<string> | undefined {\n const envPath = process.env['DCMTK_PATH'];\n if (envPath === undefined || envPath.length === 0) {\n return undefined;\n }\n if (!isSafePath(envPath)) {\n return err(new Error(`DCMTK_PATH=\"${envPath}\" contains path traversal sequences`));\n }\n if (hasRequiredBinaries(envPath)) {\n return ok(envPath);\n }\n return err(new Error(`DCMTK_PATH=\"${envPath}\" is set but required binaries are missing`));\n}\n\n/**\n * Searches platform-specific known install locations for DCMTK binaries.\n *\n * @returns The directory path if found, or `undefined`\n */\nfunction searchKnownPaths(): string | undefined {\n /* v8 ignore next -- platform-specific branch */\n const searchPaths = isWindows ? WINDOWS_SEARCH_PATHS : UNIX_SEARCH_PATHS;\n for (const candidate of searchPaths) {\n if (hasRequiredBinaries(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\n/**\n * Searches the system PATH for DCMTK binaries.\n *\n * @returns The directory path if found, or `undefined`\n */\nfunction searchSystemPath(): string | undefined {\n /* v8 ignore next -- fallback never used since REQUIRED_BINARIES is non-empty */\n const systemDir = findViaSystemPath(REQUIRED_BINARIES[0] ?? 'dcm2json');\n if (systemDir !== undefined && hasRequiredBinaries(systemDir)) {\n return systemDir;\n }\n return undefined;\n}\n\n/**\n * Options for {@link findDcmtkPath}.\n */\ninterface FindDcmtkPathOptions {\n /** Bypass the cached result and perform a fresh search. */\n readonly noCache?: boolean | undefined;\n}\n\n/**\n * Locates the directory containing DCMTK command-line binaries.\n *\n * Searches in the following order:\n * 1. `DCMTK_PATH` environment variable (if set)\n * 2. Platform-specific known install locations\n * 3. System PATH lookup via `which`/`where`\n *\n * The result is cached after the first successful call. Pass `{ noCache: true }`\n * to force a fresh search.\n *\n * @param options - Optional configuration\n * @returns A Result containing the DCMTK binary directory path, or an error if not found\n * @throws Never throws for expected failures (Rule 6.1)\n *\n * @example\n * ```ts\n * const result = findDcmtkPath();\n * if (result.ok) {\n * console.log(`DCMTK found at: ${result.value}`);\n * } else {\n * console.error(result.error.message);\n * }\n * ```\n */\nfunction findDcmtkPath(options?: FindDcmtkPathOptions): Result<string> {\n if (cachedPath !== undefined && !options?.noCache) {\n return ok(cachedPath);\n }\n\n const envResult = searchEnvPath();\n if (envResult !== undefined) {\n if (envResult.ok) {\n cachedPath = envResult.value;\n }\n return envResult;\n }\n\n const knownPath = searchKnownPaths();\n if (knownPath !== undefined) {\n cachedPath = knownPath;\n return ok(knownPath);\n }\n\n const systemPath = searchSystemPath();\n if (systemPath !== undefined) {\n cachedPath = systemPath;\n return ok(systemPath);\n }\n\n return err(\n new Error(\n 'DCMTK binaries not found. Install DCMTK and either:\\n' +\n ' - Set the DCMTK_PATH environment variable, or\\n' +\n ' - Install DCMTK to a standard location, or\\n' +\n ' - Ensure DCMTK binaries are on the system PATH'\n )\n );\n}\n\n/**\n * Clears the cached DCMTK path. Primarily for testing.\n */\nfunction clearDcmtkPathCache(): void {\n cachedPath = undefined;\n}\n\nexport { findDcmtkPath, clearDcmtkPathCache };\nexport type { FindDcmtkPathOptions };\n","/**\n * Resolves the full path to a DCMTK binary.\n *\n * Wraps {@link findDcmtkPath} + `path.join` and appends `.exe` on Windows.\n *\n * @module _resolveBinary\n * @internal\n */\n\nimport { join } from 'node:path';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { findDcmtkPath } from '../findDcmtkPath';\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Resolves the full filesystem path to a named DCMTK binary.\n *\n * @param toolName - The DCMTK binary name (e.g., \"dcm2xml\")\n * @returns A Result containing the full binary path or an error if DCMTK is not found\n */\nfunction resolveBinary(toolName: string): Result<string> {\n const pathResult = findDcmtkPath();\n if (!pathResult.ok) {\n return err(pathResult.error);\n }\n /* v8 ignore next -- platform-specific branch */\n const binaryName = isWindows ? `${toolName}.exe` : toolName;\n return ok(join(pathResult.value, binaryName));\n}\n\nexport { resolveBinary };\n","/**\n * Standardized error factory for tool wrappers.\n *\n * Produces consistent error messages that include the tool name, sanitized\n * arguments (truncated), exit code, and a stderr excerpt.\n *\n * @module _toolError\n * @internal\n */\n\n/** Maximum length for the arguments portion of the error message. */\nconst MAX_ARGS_LENGTH = 200;\n\n/** Maximum length for the stderr excerpt in the error message. */\nconst MAX_STDERR_LENGTH = 500;\n\n/**\n * Truncates a string to a maximum length, appending \"...\" if truncated.\n *\n * @param value - The string to truncate\n * @param maxLength - The maximum allowed length\n * @returns The original string or a truncated version\n */\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.substring(0, maxLength)}...`;\n}\n\n/**\n * Creates a standardized Error for a tool wrapper failure.\n *\n * **Privacy note:** Arguments are included in the error message for debugging.\n * These may contain file paths. Callers exposing errors to end users or external\n * logs should sanitize sensitive paths before display.\n *\n * @param toolName - The DCMTK binary name (e.g., \"dcm2xml\")\n * @param args - The command-line arguments passed to the tool\n * @param exitCode - The process exit code\n * @param stderr - The captured stderr output\n * @returns An Error with a descriptive message\n */\nfunction createToolError(toolName: string, args: readonly string[], exitCode: number, stderr: string): Error {\n const argsStr = truncate(args.join(' '), MAX_ARGS_LENGTH);\n const stderrStr = truncate(stderr.trim(), MAX_STDERR_LENGTH);\n const parts = [`${toolName} failed (exit code ${String(exitCode)})`];\n if (argsStr.length > 0) {\n parts.push(`args: ${argsStr}`);\n }\n if (stderrStr.length > 0) {\n parts.push(`stderr: ${stderrStr}`);\n }\n return new Error(parts.join(' | '));\n}\n\n/**\n * Formats a Zod validation error into a concise, human-readable string.\n *\n * Flattens nested Zod issues into `field: message` pairs, producing\n * cleaner output than the raw Zod `.message` JSON string.\n *\n * @param toolName - The DCMTK tool name for context\n * @param zodError - The Zod error object (must have `.issues` array)\n * @returns A formatted Error\n */\nfunction createValidationError(\n toolName: string,\n zodError: { readonly issues: ReadonlyArray<{ readonly path: ReadonlyArray<PropertyKey>; readonly message: string }> }\n): Error {\n const parts: string[] = [];\n for (let i = 0; i < zodError.issues.length; i++) {\n const issue = zodError.issues[i];\n /* v8 ignore next */\n if (issue === undefined) continue;\n const path = issue.path.length > 0 ? issue.path.map(String).join('.') : '(root)';\n parts.push(`${path}: ${issue.message}`);\n }\n const detail = parts.length > 0 ? parts.join('; ') : 'unknown validation error';\n return new Error(`${toolName}: invalid options — ${detail}`);\n}\n\nexport { createToolError, createValidationError, truncate, MAX_ARGS_LENGTH, MAX_STDERR_LENGTH };\n","/**\n * DICOM to XML conversion using the dcm2xml binary.\n *\n * Converts a DICOM file to the DCMTK Native DICOM Model XML format.\n *\n * @module dcm2xml\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Charset handling modes for dcm2xml.\n */\nconst Dcm2xmlCharset = {\n /** Use UTF-8 encoding (default). */\n UTF8: 'utf8',\n /** Use Latin-1 encoding. */\n LATIN1: 'latin1',\n /** Use ASCII encoding. */\n ASCII: 'ascii',\n} as const;\n\ntype Dcm2xmlCharsetValue = (typeof Dcm2xmlCharset)[keyof typeof Dcm2xmlCharset];\n\n/** Options for {@link dcm2xml}. */\ninterface Dcm2xmlOptions extends ToolBaseOptions {\n /** Include namespace declaration in XML output. Defaults to false. */\n readonly namespace?: boolean | undefined;\n /** Character set for XML output. Defaults to 'utf8'. */\n readonly charset?: Dcm2xmlCharsetValue | undefined;\n /** Write binary data to XML (base64 encoded). Defaults to false. */\n readonly writeBinaryData?: boolean | undefined;\n /** Encode binary data inline instead of referencing external files. Defaults to true when writeBinaryData is true. */\n readonly encodeBinaryBase64?: boolean | undefined;\n}\n\n/** Result of a successful dcm2xml conversion. */\ninterface Dcm2xmlResult {\n /** The XML output string in DCMTK Native DICOM Model format. */\n readonly xml: string;\n}\n\nconst Dcm2xmlOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n namespace: z.boolean().optional(),\n charset: z.enum(['utf8', 'latin1', 'ascii']).optional(),\n writeBinaryData: z.boolean().optional(),\n encodeBinaryBase64: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcm2xml command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, options?: Dcm2xmlOptions): string[] {\n const args: string[] = [];\n\n if (options?.namespace === true) {\n args.push('+Xn');\n }\n\n if (options?.charset === 'latin1') {\n args.push('+Cl');\n } else if (options?.charset === 'ascii') {\n args.push('+Ca');\n }\n\n if (options?.writeBinaryData === true) {\n args.push('+Wb');\n if (options.encodeBinaryBase64 !== false) {\n args.push('+Eb');\n }\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Converts a DICOM file to XML using the dcm2xml binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Conversion options\n * @returns A Result containing the XML string or an error\n *\n * @example\n * ```ts\n * const result = await dcm2xml('/path/to/study.dcm');\n * if (result.ok) {\n * console.log(result.value.xml);\n * }\n * ```\n */\nasync function dcm2xml(inputPath: string, options?: Dcm2xmlOptions): Promise<Result<Dcm2xmlResult>> {\n const validation = Dcm2xmlOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcm2xml: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcm2xml');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2xml', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ xml: result.value.stdout });\n}\n\nexport { dcm2xml, Dcm2xmlCharset };\nexport type { Dcm2xmlOptions, Dcm2xmlResult, Dcm2xmlCharsetValue };\n","/**\n * Converts dcm2xml \"Native DICOM Model\" XML into the DICOM JSON Model (PS3.18 F.2).\n *\n * dcm2xml outputs XML in the DCMTK native format:\n * ```xml\n * <NativeDicomModel>\n * <DicomAttribute tag=\"00100010\" vr=\"PN\" keyword=\"PatientName\">\n * <PersonName number=\"1\">\n * <Alphabetic><FamilyName>Smith</FamilyName></Alphabetic>\n * </PersonName>\n * </DicomAttribute>\n * <DicomAttribute tag=\"00100020\" vr=\"LO\" keyword=\"PatientID\">\n * <Value number=\"1\">12345</Value>\n * </DicomAttribute>\n * </NativeDicomModel>\n * ```\n *\n * The DICOM JSON Model output:\n * ```json\n * {\n * \"00100010\": { \"vr\": \"PN\", \"Value\": [{\"Alphabetic\": \"Smith\"}] },\n * \"00100020\": { \"vr\": \"LO\", \"Value\": [\"12345\"] }\n * }\n * ```\n *\n * @module _xmlToJson\n * @internal\n */\n\nimport { XMLParser } from 'fast-xml-parser';\nimport { stderr } from 'stderr-lib';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\n\n/** DICOM JSON Model element. */\ninterface DicomJsonElement {\n readonly vr: string;\n readonly Value?: ReadonlyArray<unknown>;\n readonly InlineBinary?: string;\n readonly BulkDataURI?: string;\n}\n\n/** Mutable builder for DicomJsonElement during conversion. */\ninterface ElementBuilder {\n vr: string;\n Value?: unknown[];\n InlineBinary?: string;\n BulkDataURI?: string;\n}\n\n/** DICOM JSON Model top-level object. */\ntype DicomJsonModel = Record<string, DicomJsonElement>;\n\n/** Parsed XML attribute node from fast-xml-parser. */\ninterface XmlDicomAttribute {\n readonly '@_tag': string;\n readonly '@_vr': string;\n readonly '@_keyword'?: string;\n readonly Value?: unknown;\n readonly PersonName?: unknown;\n readonly InlineBinary?: unknown;\n readonly BulkDataURI?: unknown;\n readonly Item?: unknown;\n}\n\n/** Person name components from XML. */\ninterface XmlPersonNameComponent {\n readonly FamilyName?: string;\n readonly GivenName?: string;\n readonly MiddleName?: string;\n readonly NamePrefix?: string;\n readonly NameSuffix?: string;\n}\n\n/** PN representation types. */\ntype PnRepType = 'Alphabetic' | 'Ideographic' | 'Phonetic';\nconst PN_REPS: readonly PnRepType[] = ['Alphabetic', 'Ideographic', 'Phonetic'];\n\nconst ARRAY_TAG_NAMES = new Set(['DicomAttribute', 'Value', 'PersonName', 'Item']);\n\n/**\n * The 34 standard DICOM VR codes (PS3.5 Table 6.2-1).\n * Used to validate VR values from DCMTK XML output. Unrecognized VRs\n * (e.g. retired/internal codes like \"xs\", \"ox\") fall back to 'UN'.\n */\nconst KNOWN_VR_CODES = new Set([\n 'AE',\n 'AS',\n 'AT',\n 'CS',\n 'DA',\n 'DS',\n 'DT',\n 'FD',\n 'FL',\n 'IS',\n 'LO',\n 'LT',\n 'OB',\n 'OD',\n 'OF',\n 'OL',\n 'OV',\n 'OW',\n 'PN',\n 'SH',\n 'SL',\n 'SQ',\n 'SS',\n 'ST',\n 'SV',\n 'TM',\n 'UC',\n 'UI',\n 'UL',\n 'UN',\n 'UR',\n 'US',\n 'UT',\n 'UV',\n]);\n\n/**\n * Builds a PN string from name components.\n */\nfunction buildPnString(comp: XmlPersonNameComponent): string {\n const parts = [comp.FamilyName ?? '', comp.GivenName ?? '', comp.MiddleName ?? '', comp.NamePrefix ?? '', comp.NameSuffix ?? ''];\n let last = parts.length - 1;\n for (; last >= 0; last--) {\n if (parts[last] !== '') break;\n }\n return parts.slice(0, last + 1).join('^');\n}\n\n/** Ensures a value is an array. */\nfunction toArray(val: unknown): readonly unknown[] {\n if (Array.isArray(val)) return val;\n if (val === undefined || val === null) return [];\n return [val];\n}\n\n/**\n * Converts a PersonName XML element to DICOM JSON PN format.\n */\nfunction convertPersonName(pnNode: unknown): Record<string, string> {\n const result: Record<string, string> = {};\n /* v8 ignore next -- defensive guard for malformed XML */\n if (typeof pnNode !== 'object' || pnNode === null) return result;\n const pn = pnNode as Record<string, unknown>;\n\n for (const rep of PN_REPS) {\n const repNode = pn[rep];\n if (repNode !== undefined && typeof repNode === 'object' && repNode !== null) {\n const str = buildPnString(repNode as XmlPersonNameComponent);\n if (str.length > 0) {\n result[rep] = str;\n }\n }\n }\n return result;\n}\n\n/** Safely converts an unknown value to a string without risking [object Object]. */\nfunction safeString(val: unknown): string {\n if (typeof val === 'string') return val;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n /* v8 ignore next */\n return '';\n}\n\n/** Handles InlineBinary elements. */\nfunction convertInlineBinary(attr: XmlDicomAttribute, element: ElementBuilder): void {\n element.InlineBinary = safeString(attr.InlineBinary);\n}\n\n/** Handles BulkDataURI elements. */\nfunction convertBulkDataURI(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const bulkArray = toArray(attr.BulkDataURI);\n const firstBulk = bulkArray[0];\n if (typeof firstBulk === 'object' && firstBulk !== null && '@_uri' in firstBulk) {\n element.BulkDataURI = safeString((firstBulk as Record<string, unknown>)['@_uri']);\n } else {\n element.BulkDataURI = safeString(firstBulk);\n }\n}\n\n/** Handles PersonName (PN VR) elements. */\nfunction convertPNValue(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const pnArray = toArray(attr.PersonName);\n const values: Record<string, string>[] = [];\n for (const pn of pnArray) {\n values.push(convertPersonName(pn));\n }\n if (values.length > 0) element.Value = values;\n}\n\n/** Handles Sequence (SQ) elements. */\nfunction convertSequence(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const items = toArray(attr.Item);\n const values: DicomJsonModel[] = [];\n for (const item of items) {\n /* v8 ignore next -- defensive guard for malformed XML */\n if (typeof item !== 'object' || item === null) continue;\n values.push(convertAttributes(item as Record<string, unknown>));\n }\n if (values.length > 0) element.Value = values;\n}\n\n/** Handles regular Value elements. */\nfunction convertRegularValue(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const valArray = toArray(attr.Value);\n const values: unknown[] = [];\n for (const v of valArray) {\n if (typeof v === 'object' && v !== null && '#text' in v) {\n values.push((v as Record<string, unknown>)['#text']);\n } else {\n values.push(v);\n }\n }\n if (values.length > 0) element.Value = values;\n}\n\n/**\n * Converts a single DicomAttribute XML element to its DICOM JSON element.\n */\nfunction convertElement(attr: XmlDicomAttribute): DicomJsonElement {\n const rawVr = attr['@_vr'];\n const vr = KNOWN_VR_CODES.has(rawVr) ? rawVr : 'UN';\n const element: ElementBuilder = { vr };\n\n if (attr.InlineBinary !== undefined) {\n convertInlineBinary(attr, element);\n } else if (attr.BulkDataURI !== undefined) {\n convertBulkDataURI(attr, element);\n } else if (element.vr === 'PN' && attr.PersonName !== undefined) {\n convertPNValue(attr, element);\n } else if (element.vr === 'SQ' && attr.Item !== undefined) {\n convertSequence(attr, element);\n } else if (attr.Value !== undefined) {\n convertRegularValue(attr, element);\n }\n\n return Object.freeze(element) as DicomJsonElement;\n}\n\n/**\n * Converts an object containing DicomAttribute children into a DICOM JSON Model object.\n */\nfunction convertAttributes(obj: Record<string, unknown>): DicomJsonModel {\n const result: Record<string, DicomJsonElement> = {};\n const attrs = toArray(obj['DicomAttribute']);\n\n for (const attr of attrs) {\n if (typeof attr !== 'object' || attr === null) continue;\n const xmlAttr = attr as XmlDicomAttribute;\n const tag = xmlAttr['@_tag'];\n if (tag === undefined) continue;\n result[tag] = convertElement(xmlAttr);\n }\n\n return result;\n}\n\n/** XML parser configured for the DCMTK Native DICOM Model. */\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n parseTagValue: false,\n isArray: (name: string): boolean => ARRAY_TAG_NAMES.has(name),\n});\n\n/**\n * Converts dcm2xml XML output to DICOM JSON Model.\n *\n * @param xml - The XML string from dcm2xml\n * @returns A Result containing the DICOM JSON Model or an error\n */\nfunction xmlToJson(xml: string): Result<DicomJsonModel> {\n try {\n const parsed = parser.parse(xml) as Record<string, unknown>;\n const root = parsed['NativeDicomModel'];\n if (root === undefined) {\n return err(new Error('Invalid dcm2xml output: missing NativeDicomModel root element'));\n }\n // Empty NativeDicomModel produces an empty string from the parser\n if (typeof root !== 'object' || root === null) {\n return ok({});\n }\n return ok(convertAttributes(root as Record<string, unknown>));\n } catch (error: unknown) {\n return err(new Error(`Failed to parse dcm2xml XML: ${stderr(error).message}`));\n }\n}\n\nexport { xmlToJson };\nexport type { DicomJsonModel, DicomJsonElement };\n","/**\n * Repairs malformed JSON output from the dcm2json binary.\n *\n * DCMTK's dcm2json sometimes emits invalid JSON for numeric-string VRs\n * (DS, IS) by producing unquoted numbers in arrays:\n * ```json\n * \"Value\": [1.5, 2.0] // invalid — DS values must be strings\n * \"Value\": [\"1.5\", \"2.0\"] // valid\n * ```\n *\n * This module detects and repairs these patterns before JSON.parse.\n *\n * @module _repairJson\n * @internal\n */\n\n/**\n * Pattern matching \"Value\" arrays in DICOM JSON.\n * Captures: (prefix including `[`)(inner content)(closing `]`).\n */\nconst VALUE_ARRAY_PATTERN = /(\"Value\"\\s*:\\s*\\[)([\\s\\S]*?)(\\])/g;\n\n/**\n * Matches a bare (unquoted) numeric literal.\n * Handles integers, decimals, scientific notation, and negative values.\n */\nconst BARE_NUMBER = /^-?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * Quotes a bare number token, leaving already-quoted strings unchanged.\n *\n * @param token - A trimmed token from inside a Value array\n * @returns The token, quoted if it was a bare number\n */\nfunction quoteIfBareNumber(token: string): string {\n const trimmed = token.trim();\n if (BARE_NUMBER.test(trimmed)) {\n return `\"${trimmed}\"`;\n }\n return trimmed;\n}\n\n/**\n * Repairs the inner content of a \"Value\" array by quoting bare numbers.\n *\n * @param inner - The content between `[` and `]`\n * @returns Repaired content with bare numbers quoted\n */\nfunction repairInner(inner: string): string {\n const trimmed = inner.trim();\n if (trimmed.length === 0) return inner;\n\n // Split on commas that are not inside quotes\n const tokens: string[] = [];\n let current = '';\n let inString = false;\n\n for (let i = 0; i < trimmed.length; i++) {\n const ch = trimmed[i]!;\n if (ch === '\"' && (i === 0 || trimmed[i - 1] !== '\\\\')) {\n inString = !inString;\n current += ch;\n } else if (ch === ',' && !inString) {\n tokens.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n tokens.push(current);\n\n return tokens.map(quoteIfBareNumber).join(', ');\n}\n\n/**\n * Repairs malformed dcm2json output by quoting unquoted numeric values in \"Value\" arrays.\n *\n * @param raw - The raw JSON string from dcm2json\n * @returns The repaired JSON string safe for JSON.parse\n */\nfunction repairJson(raw: string): string {\n return raw.replace(VALUE_ARRAY_PATTERN, (_match, prefix: string, inner: string, suffix: string) => {\n return `${prefix}${repairInner(inner)}${suffix}`;\n });\n}\n\nexport { repairJson };\n","/**\n * DICOM to JSON conversion using a two-phase strategy.\n *\n * Primary: dcm2xml → xmlToJson (more reliable output)\n * Fallback: dcm2json binary → repairJson → JSON.parse\n *\n * The result includes a `source` discriminant indicating which strategy succeeded.\n *\n * @module dcm2json\n */\n\nimport { stderr } from 'stderr-lib';\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport { xmlToJson } from './_xmlToJson';\nimport { repairJson } from './_repairJson';\nimport type { DicomJsonModel } from './_xmlToJson';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Indicates which conversion strategy produced the result. */\ntype Dcm2jsonSource = 'xml' | 'direct';\n\n/** Options for {@link dcm2json}. */\ninterface Dcm2jsonOptions extends ToolBaseOptions {\n /** Skip the XML primary path and use direct dcm2json only. Defaults to false. */\n readonly directOnly?: boolean | undefined;\n}\n\n/** Result of a successful dcm2json conversion. */\ninterface Dcm2jsonResult {\n /** The DICOM JSON Model object. */\n readonly data: DicomJsonModel;\n /** Which conversion strategy produced this result. */\n readonly source: Dcm2jsonSource;\n}\n\nconst Dcm2jsonOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n directOnly: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Attempts XML-primary conversion: dcm2xml → xmlToJson.\n */\nasync function tryXmlPath(inputPath: string, timeoutMs: number, signal?: AbortSignal): Promise<Result<Dcm2jsonResult>> {\n const xmlBinary = resolveBinary('dcm2xml');\n if (!xmlBinary.ok) {\n return err(xmlBinary.error);\n }\n\n const xmlResult = await execCommand(xmlBinary.value, ['-nat', inputPath], { timeoutMs, signal });\n if (!xmlResult.ok) {\n return err(xmlResult.error);\n }\n\n if (xmlResult.value.exitCode !== 0) {\n return err(createToolError('dcm2xml', ['-nat', inputPath], xmlResult.value.exitCode, xmlResult.value.stderr));\n }\n\n const jsonResult = xmlToJson(xmlResult.value.stdout);\n if (!jsonResult.ok) {\n return err(jsonResult.error);\n }\n\n return ok({ data: jsonResult.value, source: 'xml' as const });\n}\n\n/**\n * Attempts direct conversion: dcm2json binary → repairJson → JSON.parse.\n */\nasync function tryDirectPath(inputPath: string, timeoutMs: number, signal?: AbortSignal): Promise<Result<Dcm2jsonResult>> {\n const jsonBinary = resolveBinary('dcm2json');\n if (!jsonBinary.ok) {\n return err(jsonBinary.error);\n }\n\n const result = await execCommand(jsonBinary.value, [inputPath], { timeoutMs, signal });\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2json', [inputPath], result.value.exitCode, result.value.stderr));\n }\n\n try {\n const repaired = repairJson(result.value.stdout);\n // Cast is safe: repairJson ensures valid DICOM JSON Model structure,\n // and JSON.parse returns `unknown` in strict TS (we narrow via caller checks).\n const data = JSON.parse(repaired) as DicomJsonModel;\n return ok({ data, source: 'direct' as const });\n } catch (parseError: unknown) {\n return err(createToolError('dcm2json', [inputPath], 1, `Parse error: ${stderr(parseError).message}`));\n }\n}\n\n/**\n * Converts a DICOM file to the DICOM JSON Model.\n *\n * Uses a two-phase strategy:\n * 1. Primary: dcm2xml → XML-to-JSON conversion (more reliable)\n * 2. Fallback: direct dcm2json binary with JSON repair\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Conversion options\n * @returns A Result containing the DICOM JSON Model with source discriminant\n *\n * @example\n * ```ts\n * const result = await dcm2json('/path/to/study.dcm');\n * if (result.ok) {\n * console.log(result.value.source); // 'xml' or 'direct'\n * console.log(result.value.data['00100010']); // Patient Name\n * }\n * ```\n */\nasync function dcm2json(inputPath: string, options?: Dcm2jsonOptions): Promise<Result<Dcm2jsonResult>> {\n const validation = Dcm2jsonOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcm2json', validation.error));\n }\n\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const signal = options?.signal;\n\n // Direct-only mode: skip XML path\n if (options?.directOnly === true) {\n return tryDirectPath(inputPath, timeoutMs, signal);\n }\n\n // Try XML path first\n const xmlResult = await tryXmlPath(inputPath, timeoutMs, signal);\n if (xmlResult.ok) {\n return xmlResult;\n }\n\n // Fall back to direct path\n return tryDirectPath(inputPath, timeoutMs, signal);\n}\n\nexport { dcm2json };\nexport type { Dcm2jsonOptions, Dcm2jsonResult, Dcm2jsonSource, DicomJsonModel };\n","/**\n * Dump DICOM metadata as text using the dcmdump binary.\n *\n * @module dcmdump\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Output format for dcmdump.\n */\nconst DcmdumpFormat = {\n /** Print standard DCMTK format. */\n STANDARD: 'standard',\n /** Print tag and value only. */\n SHORT: 'short',\n} as const;\n\ntype DcmdumpFormatValue = (typeof DcmdumpFormat)[keyof typeof DcmdumpFormat];\n\n/** Options for {@link dcmdump}. */\ninterface DcmdumpOptions extends ToolBaseOptions {\n /** Output format. Defaults to 'standard'. */\n readonly format?: DcmdumpFormatValue | undefined;\n /** Print all tags including private tags. Defaults to false. */\n readonly allTags?: boolean | undefined;\n /** Search for a specific tag. */\n readonly searchTag?: string | undefined;\n /** Print tag values with enhanced detail. Defaults to false. */\n readonly printValues?: boolean | undefined;\n}\n\n/** Result of a successful dcmdump operation. */\ninterface DcmdumpResult {\n /** The text output from dcmdump. */\n readonly text: string;\n}\n\nconst DcmdumpOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n format: z.enum(['standard', 'short']).optional(),\n allTags: z.boolean().optional(),\n searchTag: z\n .string()\n .regex(/^\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)$/)\n .optional(),\n printValues: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdump command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DcmdumpOptions): string[] {\n const args: string[] = [];\n\n if (options?.format === 'short') {\n args.push('+L');\n }\n\n if (options?.allTags === true) {\n args.push('+P', 'all');\n }\n\n if (options?.searchTag !== undefined) {\n // Strip parentheses: dcmdump expects \"gggg,eeee\" not \"(gggg,eeee)\"\n const tag = options.searchTag.replace(/[()]/g, '');\n args.push('+P', tag);\n }\n\n if (options?.printValues === true) {\n args.push('+Vr');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Dumps DICOM metadata as text using the dcmdump binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Dump options\n * @returns A Result containing the text dump or an error\n *\n * @example\n * ```ts\n * const result = await dcmdump('/path/to/study.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmdump(inputPath: string, options?: DcmdumpOptions): Promise<Result<DcmdumpResult>> {\n const validation = DcmdumpOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmdump: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmdump');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdump', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmdump, DcmdumpFormat };\nexport type { DcmdumpOptions, DcmdumpResult, DcmdumpFormatValue };\n","/**\n * Convert DICOM file encoding/transfer syntax using the dcmconv binary.\n *\n * @module dcmconv\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Transfer syntax presets for dcmconv.\n */\nconst TransferSyntax = {\n /** Implicit VR Little Endian. */\n IMPLICIT_LITTLE: '+ti',\n /** Explicit VR Little Endian. */\n EXPLICIT_LITTLE: '+te',\n /** Explicit VR Big Endian (deprecated in DICOM). */\n EXPLICIT_BIG: '+tb',\n /** JPEG Lossless. */\n JPEG_LOSSLESS: '+tl',\n /** JPEG 2000 Lossless. */\n JPEG2K_LOSSLESS: '+t2',\n /** RLE Lossless. */\n RLE: '+tr',\n /** Deflated Explicit VR Little Endian. */\n DEFLATED: '+td',\n} as const;\n\ntype TransferSyntaxValue = (typeof TransferSyntax)[keyof typeof TransferSyntax];\n\nconst VALID_TRANSFER_SYNTAXES = ['+ti', '+te', '+tb', '+tl', '+t2', '+tr', '+td'] as const;\n\n/** Options for {@link dcmconv}. */\ninterface DcmconvOptions extends ToolBaseOptions {\n /** Target transfer syntax. Required. */\n readonly transferSyntax: TransferSyntaxValue;\n}\n\n/** Result of a successful dcmconv conversion. */\ninterface DcmconvResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst DcmconvOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n transferSyntax: z.enum(VALID_TRANSFER_SYNTAXES),\n })\n .strict();\n\n/**\n * Converts a DICOM file's transfer syntax using the dcmconv binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the converted output file\n * @param options - Conversion options (transfer syntax required)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmconv('/path/to/input.dcm', '/path/to/output.dcm', {\n * transferSyntax: '+te', // Explicit VR Little Endian\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmconv(inputPath: string, outputPath: string, options: DcmconvOptions): Promise<Result<DcmconvResult>> {\n const validation = DcmconvOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmconv: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmconv');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [options.transferSyntax, inputPath, outputPath];\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmconv', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmconv, TransferSyntax };\nexport type { DcmconvOptions, DcmconvResult, TransferSyntaxValue };\n","/**\n * Modify DICOM tags using the dcmodify binary.\n *\n * Uses spawnCommand instead of execCommand because user-supplied DICOM values\n * could contain shell metacharacters. Spawn passes args as an array with no\n * shell interpolation (Rule 7.4).\n *\n * @module dcmodify\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { spawnCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** A single tag modification. */\ninterface TagModification {\n /** DICOM tag to modify, e.g. \"(0010,0010)\". */\n readonly tag: string;\n /** New value for the tag. */\n readonly value: string;\n}\n\n/** Options for {@link dcmodify}. */\ninterface DcmodifyOptions extends ToolBaseOptions {\n /** Tag modifications to apply. */\n readonly modifications?: readonly TagModification[] | undefined;\n /** Tag paths to erase (passed as `-e path`). */\n readonly erasures?: readonly string[] | undefined;\n /** Erase all private tags (uses `-ep` flag). */\n readonly erasePrivateTags?: boolean | undefined;\n /** Do not create backup (.bak) file. Defaults to true. */\n readonly noBackup?: boolean | undefined;\n /** Insert tag if it doesn't exist (uses -i flag). Defaults to false. */\n readonly insertIfMissing?: boolean | undefined;\n}\n\n/** Result of a successful dcmodify operation. */\ninterface DcmodifyResult {\n /** Path to the modified DICOM file. */\n readonly filePath: string;\n}\n\n/** Matches a single tag or a dotted tag path: (XXXX,XXXX) or (XXXX,XXXX)[N].(XXXX,XXXX) */\nconst TAG_OR_PATH_PATTERN = /^\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)(\\[\\d+\\](\\.\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)(\\[\\d+\\])?)*)?$/;\n\nconst TagModificationSchema = z.object({\n tag: z.string().regex(TAG_OR_PATH_PATTERN),\n value: z.string(),\n});\n\nconst DcmodifyOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n modifications: z.array(TagModificationSchema).optional().default([]),\n erasures: z.array(z.string()).optional(),\n erasePrivateTags: z.boolean().optional(),\n noBackup: z.boolean().optional(),\n insertIfMissing: z.boolean().optional(),\n })\n .strict()\n .refine(data => data.modifications.length > 0 || (data.erasures !== undefined && data.erasures.length > 0) || data.erasePrivateTags === true, {\n message: 'At least one of modifications, erasures, or erasePrivateTags is required',\n });\n\n/**\n * Builds dcmodify command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options: DcmodifyOptions): string[] {\n const args: string[] = [];\n\n if (options.noBackup !== false) {\n args.push('-nb');\n }\n\n const flag = options.insertIfMissing === true ? '-i' : '-m';\n const modifications = options.modifications ?? [];\n\n for (const mod of modifications) {\n args.push(flag, `${mod.tag}=${mod.value}`);\n }\n\n if (options.erasures !== undefined) {\n for (const erasure of options.erasures) {\n args.push('-e', erasure);\n }\n }\n\n if (options.erasePrivateTags === true) {\n args.push('-ep');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Modifies DICOM tags in a file using the dcmodify binary.\n *\n * Uses spawn (not exec) for safety with user-supplied values.\n *\n * @param inputPath - Path to the DICOM file to modify (modified in-place)\n * @param options - Modification options\n * @returns A Result containing the file path or an error\n *\n * @example\n * ```ts\n * const result = await dcmodify('/path/to/study.dcm', {\n * modifications: [\n * { tag: '(0010,0010)', value: 'Anonymous' },\n * { tag: '(0010,0020)', value: 'ANON001' },\n * ],\n * });\n * ```\n */\nasync function dcmodify(inputPath: string, options: DcmodifyOptions): Promise<Result<DcmodifyResult>> {\n const validation = DcmodifyOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmodify: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmodify');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await spawnCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmodify', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ filePath: inputPath });\n}\n\nexport { dcmodify };\nexport type { DcmodifyOptions, DcmodifyResult, TagModification };\n","/**\n * Test if a file is a valid DICOM Part 10 file using the dcmftest binary.\n *\n * @module dcmftest\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmftest}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface DcmftestOptions extends ToolBaseOptions {}\n\n/** Result of a successful dcmftest check. */\ninterface DcmftestResult {\n /** Whether the tested file is a valid DICOM Part 10 file. */\n readonly isDicom: boolean;\n}\n\nconst DcmftestOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Tests whether a file is a valid DICOM Part 10 file using the dcmftest binary.\n *\n * The dcmftest binary always returns exit code 0 regardless of result.\n * The determination is made by parsing stdout for \"yes:\" (DICOM) or \"no:\" (not DICOM).\n *\n * @param inputPath - Path to the file to test\n * @param options - Test options\n * @returns A Result containing the isDicom flag or an error\n *\n * @example\n * ```ts\n * const result = await dcmftest('/path/to/file.dcm');\n * if (result.ok) {\n * console.log(result.value.isDicom ? 'Valid DICOM' : 'Not DICOM');\n * }\n * ```\n */\nasync function dcmftest(inputPath: string, options?: DcmftestOptions): Promise<Result<DcmftestResult>> {\n const validation = DcmftestOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmftest: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmftest');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n // Defensive: dcmftest always returns exit code 0 regardless of whether the\n // file is valid DICOM. Kept for safety in case future DCMTK versions change.\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmftest', args, result.value.exitCode, result.value.stderr));\n }\n\n const isDicom = result.value.stdout.includes('yes:');\n return ok({ isDicom });\n}\n\nexport { dcmftest };\nexport type { DcmftestOptions, DcmftestResult };\n","/**\n * Create a DICOMDIR file from DICOM files using the dcmgpdir binary.\n *\n * @module dcmgpdir\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Default output filename when no outputFile is specified. */\nconst DEFAULT_DICOMDIR = 'DICOMDIR';\n\n/** Options for {@link dcmgpdir}. */\ninterface DcmgpdirOptions extends ToolBaseOptions {\n /** One or more DICOM file paths to include in the DICOMDIR. */\n readonly inputFiles: readonly string[];\n /** Output DICOMDIR file path. Maps to +D flag. **Warning:** defaults to 'DICOMDIR' in the current working directory if omitted. */\n readonly outputFile?: string | undefined;\n /** File-set ID to embed in the DICOMDIR. Maps to +F flag. */\n readonly filesetId?: string | undefined;\n /** Root directory for referenced DICOM files. Maps to +id flag. */\n readonly inputDirectory?: string | undefined;\n /** Map filenames to DICOM format (uppercase, strip trailing period). Maps to +m flag. */\n readonly mapFilenames?: boolean | undefined;\n /** Invent missing DICOMDIR type 1 attributes. Maps to +I flag. */\n readonly inventAttributes?: boolean | undefined;\n}\n\n/** Result of a successful dcmgpdir operation. */\ninterface DcmgpdirResult {\n /** Path to the generated DICOMDIR file. */\n readonly outputPath: string;\n}\n\nconst DcmgpdirOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n inputFiles: z.array(z.string().min(1)).min(1),\n outputFile: z.string().min(1).optional(),\n filesetId: z.string().min(1).optional(),\n inputDirectory: z.string().min(1).optional(),\n mapFilenames: z.boolean().optional(),\n inventAttributes: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Builds dcmgpdir command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmgpdirOptions): string[] {\n const args: string[] = [];\n\n if (options.outputFile !== undefined) {\n args.push('+D', options.outputFile);\n }\n\n if (options.filesetId !== undefined) {\n args.push('+F', options.filesetId);\n }\n\n if (options.inputDirectory !== undefined) {\n args.push('+id', options.inputDirectory);\n }\n\n if (options.mapFilenames === true) {\n args.push('+m');\n }\n\n if (options.inventAttributes === true) {\n args.push('+I');\n }\n\n args.push(...options.inputFiles);\n\n return args;\n}\n\n/**\n * Creates a DICOMDIR file from DICOM files using the dcmgpdir binary.\n *\n * @param options - DICOMDIR creation options (inputFiles required)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmgpdir({\n * inputFiles: ['/path/to/file1.dcm', '/path/to/file2.dcm'],\n * outputFile: '/path/to/DICOMDIR',\n * filesetId: 'MY_FILESET',\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmgpdir(options: DcmgpdirOptions): Promise<Result<DcmgpdirResult>> {\n const validation = DcmgpdirOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmgpdir: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmgpdir');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmgpdir', args, result.value.exitCode, result.value.stderr));\n }\n\n const outputPath = options.outputFile ?? DEFAULT_DICOMDIR;\n return ok({ outputPath });\n}\n\nexport { dcmgpdir };\nexport type { DcmgpdirOptions, DcmgpdirResult };\n","/**\n * Create a DICOMDIR file from DICOM files using the dcmmkdir binary.\n *\n * @module dcmmkdir\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Default output filename when no outputFile is specified. */\nconst DEFAULT_DICOMDIR = 'DICOMDIR';\n\n/** Options for {@link dcmmkdir}. */\ninterface DcmmkdirOptions extends ToolBaseOptions {\n /** One or more DICOM file paths to include in the DICOMDIR. */\n readonly inputFiles: readonly string[];\n /** Output DICOMDIR file path. Maps to +D flag. **Warning:** defaults to 'DICOMDIR' in the current working directory if omitted. */\n readonly outputFile?: string | undefined;\n /** File-set ID to embed in the DICOMDIR. Maps to +F flag. */\n readonly filesetId?: string | undefined;\n /** Append to existing DICOMDIR. Maps to +A flag. Defaults to false. */\n readonly append?: boolean | undefined;\n /** Root directory for referenced DICOM files. Maps to +id flag. */\n readonly inputDirectory?: string | undefined;\n /** Map filenames to DICOM format (uppercase, strip trailing period). Maps to +m flag. */\n readonly mapFilenames?: boolean | undefined;\n /** Invent missing DICOMDIR type 1 attributes. Maps to +I flag. */\n readonly inventAttributes?: boolean | undefined;\n}\n\n/** Result of a successful dcmmkdir operation. */\ninterface DcmmkdirResult {\n /** Path to the generated DICOMDIR file. */\n readonly outputPath: string;\n}\n\nconst DcmmkdirOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n inputFiles: z.array(z.string().min(1)).min(1),\n outputFile: z.string().min(1).optional(),\n filesetId: z.string().min(1).optional(),\n append: z.boolean().optional(),\n inputDirectory: z.string().min(1).optional(),\n mapFilenames: z.boolean().optional(),\n inventAttributes: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Builds dcmmkdir command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmmkdirOptions): string[] {\n const args: string[] = [];\n\n if (options.outputFile !== undefined) {\n args.push('+D', options.outputFile);\n }\n\n if (options.filesetId !== undefined) {\n args.push('+F', options.filesetId);\n }\n\n if (options.inputDirectory !== undefined) {\n args.push('+id', options.inputDirectory);\n }\n\n if (options.mapFilenames === true) {\n args.push('+m');\n }\n\n if (options.inventAttributes === true) {\n args.push('+I');\n }\n\n if (options.append === true) {\n args.push('+A');\n }\n\n args.push(...options.inputFiles);\n\n return args;\n}\n\n/**\n * Creates a DICOMDIR file from DICOM files using the dcmmkdir binary.\n *\n * @param options - DICOMDIR creation options (inputFiles required)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmmkdir({\n * inputFiles: ['/path/to/file1.dcm', '/path/to/file2.dcm'],\n * outputFile: '/path/to/DICOMDIR',\n * filesetId: 'MY_FILESET',\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmmkdir(options: DcmmkdirOptions): Promise<Result<DcmmkdirResult>> {\n const validation = DcmmkdirOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmmkdir: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmmkdir');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmmkdir', args, result.value.exitCode, result.value.stderr));\n }\n\n const outputPath = options.outputFile ?? DEFAULT_DICOMDIR;\n return ok({ outputPath });\n}\n\nexport { dcmmkdir };\nexport type { DcmmkdirOptions, DcmmkdirResult };\n","/**\n * Register DICOM files in a dcmqrscp index database using the dcmqridx binary.\n *\n * @module dcmqridx\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmqridx}. */\ninterface DcmqridxOptions extends ToolBaseOptions {\n /** Storage area / index directory path (required). */\n readonly indexDirectory: string;\n /** DICOM files to register. Omit for print-only mode. */\n readonly inputFiles?: readonly string[] | undefined;\n /** List database contents (-p flag). */\n readonly print?: boolean | undefined;\n /** Mark status as \"not new\" (-n flag). */\n readonly notNew?: boolean | undefined;\n}\n\n/** Result of a successful dcmqridx operation. */\ntype DcmqridxResult = { readonly mode: 'register' } | { readonly mode: 'print'; readonly output: string };\n\nconst DcmqridxOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n indexDirectory: z.string().min(1),\n inputFiles: z.array(z.string().min(1)).min(1).optional(),\n print: z.boolean().optional(),\n notNew: z.boolean().optional(),\n })\n .strict()\n .refine(data => (data.inputFiles !== undefined && data.inputFiles.length > 0) || data.print === true, {\n message: 'Either inputFiles (non-empty) or print must be specified',\n });\n\n/**\n * Builds dcmqridx command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmqridxOptions): string[] {\n const args: string[] = [];\n\n if (options.print === true) {\n args.push('-p');\n }\n\n if (options.notNew === true) {\n args.push('-n');\n }\n\n args.push(options.indexDirectory);\n\n if (options.inputFiles !== undefined) {\n args.push(...options.inputFiles);\n }\n\n return args;\n}\n\n/**\n * Register DICOM files in a dcmqrscp index database or print database contents.\n *\n * @param options - Index operation options (indexDirectory required)\n * @returns A Result containing the operation result or an error\n */\nasync function dcmqridx(options: DcmqridxOptions): Promise<Result<DcmqridxResult>> {\n const validation = DcmqridxOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmqridx: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmqridx');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmqridx', args, result.value.exitCode, result.value.stderr));\n }\n\n if (options.print === true) {\n return ok({ mode: 'print' as const, output: result.value.stdout });\n }\n\n return ok({ mode: 'register' as const });\n}\n\nexport { dcmqridx };\nexport type { DcmqridxOptions, DcmqridxResult };\n","/**\n * Convert an XML file to DICOM format using the xml2dcm binary.\n *\n * @module xml2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link xml2dcm}. */\ninterface Xml2dcmOptions extends ToolBaseOptions {\n /** Generate new Study/Series/SOP Instance UIDs. Defaults to false. */\n readonly generateNewUIDs?: boolean | undefined;\n /** Validate the XML document. Defaults to false. */\n readonly validateDocument?: boolean | undefined;\n}\n\n/** Result of a successful xml2dcm conversion. */\ninterface Xml2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Xml2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n generateNewUIDs: z.boolean().optional(),\n validateDocument: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds xml2dcm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Xml2dcmOptions): string[] {\n const args: string[] = [];\n\n if (options?.generateNewUIDs === true) {\n args.push('+Ug');\n }\n\n if (options?.validateDocument === true) {\n args.push('+Vd');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts an XML file to DICOM format using the xml2dcm binary.\n *\n * @param inputPath - Path to the XML input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await xml2dcm('/path/to/input.xml', '/path/to/output.dcm', {\n * generateNewUIDs: true,\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function xml2dcm(inputPath: string, outputPath: string, options?: Xml2dcmOptions): Promise<Result<Xml2dcmResult>> {\n const validation = Xml2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`xml2dcm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('xml2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('xml2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { xml2dcm };\nexport type { Xml2dcmOptions, Xml2dcmResult };\n","/**\n * Convert a JSON file to DICOM format using the json2dcm binary.\n *\n * @module json2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link json2dcm}. */\ntype Json2dcmOptions = ToolBaseOptions;\n\n/** Result of a successful json2dcm conversion. */\ninterface Json2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Json2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Converts a JSON file to DICOM format using the json2dcm binary.\n *\n * @param inputPath - Path to the JSON input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options (timeout, signal)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await json2dcm('/path/to/input.json', '/path/to/output.dcm');\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function json2dcm(inputPath: string, outputPath: string, options?: Json2dcmOptions): Promise<Result<Json2dcmResult>> {\n const validation = Json2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`json2dcm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('json2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('json2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { json2dcm };\nexport type { Json2dcmOptions, Json2dcmResult };\n","/**\n * Convert a dump file to DICOM format using the dump2dcm binary.\n *\n * @module dump2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dump2dcm}. */\ninterface Dump2dcmOptions extends ToolBaseOptions {\n /** Generate new Study/Series/SOP Instance UIDs. Defaults to false. */\n readonly generateNewUIDs?: boolean | undefined;\n /** Write output as DICOM file format (with preamble + meta header). Defaults to false. */\n readonly writeFileFormat?: boolean | undefined;\n}\n\n/** Result of a successful dump2dcm conversion. */\ninterface Dump2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Dump2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n generateNewUIDs: z.boolean().optional(),\n writeFileFormat: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dump2dcm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dump2dcmOptions): string[] {\n const args: string[] = [];\n\n if (options?.generateNewUIDs === true) {\n args.push('+Ug');\n }\n\n if (options?.writeFileFormat === true) {\n args.push('-F');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts a dump file to DICOM format using the dump2dcm binary.\n *\n * @param inputPath - Path to the dump input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dump2dcm('/path/to/input.dump', '/path/to/output.dcm', {\n * generateNewUIDs: true,\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dump2dcm(inputPath: string, outputPath: string, options?: Dump2dcmOptions): Promise<Result<Dump2dcmResult>> {\n const validation = Dump2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dump2dcm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dump2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dump2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dump2dcm };\nexport type { Dump2dcmOptions, Dump2dcmResult };\n","/**\n * Convert an image file to DICOM format using the img2dcm binary.\n *\n * @module img2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Supported input image formats for img2dcm.\n */\nconst Img2dcmInputFormat = {\n /** JPEG image. */\n JPEG: 'jpeg',\n /** BMP image. */\n BMP: 'bmp',\n} as const;\n\ntype Img2dcmInputFormatValue = (typeof Img2dcmInputFormat)[keyof typeof Img2dcmInputFormat];\n\n/** Options for {@link img2dcm}. */\ninterface Img2dcmOptions extends ToolBaseOptions {\n /** Input image format. Maps to `-i JPEG` or `-i BMP`. */\n readonly inputFormat?: Img2dcmInputFormatValue | undefined;\n /** Path to a DICOM dataset file to copy attributes from. Maps to `-df path`. */\n readonly datasetFrom?: string | undefined;\n}\n\n/** Result of a successful img2dcm conversion. */\ninterface Img2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Img2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n inputFormat: z.enum(['jpeg', 'bmp']).optional(),\n datasetFrom: z.string().min(1).optional(),\n })\n .strict()\n .optional();\n\n/** Maps input format values to the CLI flag expected by dcmtk 3.7.0+. */\nconst FORMAT_FLAG_MAP: Record<Img2dcmInputFormatValue, string> = {\n jpeg: 'JPEG',\n bmp: 'BMP',\n};\n\n/**\n * Builds img2dcm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Img2dcmOptions): string[] {\n const args: string[] = [];\n\n if (options?.inputFormat !== undefined) {\n args.push('-i', FORMAT_FLAG_MAP[options.inputFormat]);\n }\n\n if (options?.datasetFrom !== undefined) {\n args.push('-df', options.datasetFrom);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts an image file to DICOM format using the img2dcm binary.\n *\n * @param inputPath - Path to the image input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await img2dcm('/path/to/photo.jpg', '/path/to/output.dcm', {\n * inputFormat: 'jpeg',\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function img2dcm(inputPath: string, outputPath: string, options?: Img2dcmOptions): Promise<Result<Img2dcmResult>> {\n const validation = Img2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`img2dcm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('img2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('img2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { img2dcm, Img2dcmInputFormat };\nexport type { Img2dcmOptions, Img2dcmResult, Img2dcmInputFormatValue };\n","/**\n * Encapsulate a PDF file into a DICOM object using the pdf2dcm binary.\n *\n * @module pdf2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link pdf2dcm}. */\ntype Pdf2dcmOptions = ToolBaseOptions;\n\n/** Result of a successful pdf2dcm operation. */\ninterface Pdf2dcmResult {\n /** Path to the output DICOM file. */\n readonly outputPath: string;\n}\n\nconst Pdf2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Encapsulate a PDF file into a DICOM object using the pdf2dcm binary.\n *\n * @param inputPath - Path to the PDF input file\n * @param outputPath - Path for the output DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function pdf2dcm(inputPath: string, outputPath: string, options?: Pdf2dcmOptions): Promise<Result<Pdf2dcmResult>> {\n const validation = Pdf2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`pdf2dcm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('pdf2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('pdf2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { pdf2dcm };\nexport type { Pdf2dcmOptions, Pdf2dcmResult };\n","/**\n * Extract an encapsulated PDF from a DICOM file using the dcm2pdf binary.\n *\n * @module dcm2pdf\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcm2pdf}. */\ntype Dcm2pdfOptions = ToolBaseOptions;\n\n/** Result of a successful dcm2pdf operation. */\ninterface Dcm2pdfResult {\n /** Path to the extracted PDF file. */\n readonly outputPath: string;\n}\n\nconst Dcm2pdfOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Extract an encapsulated PDF from a DICOM file using the dcm2pdf binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the extracted PDF output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcm2pdf(inputPath: string, outputPath: string, options?: Dcm2pdfOptions): Promise<Result<Dcm2pdfResult>> {\n const validation = Dcm2pdfOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcm2pdf: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcm2pdf');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2pdf', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcm2pdf };\nexport type { Dcm2pdfOptions, Dcm2pdfResult };\n","/**\n * Encapsulate a CDA document into a DICOM object using the cda2dcm binary.\n *\n * @module cda2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link cda2dcm}. */\ntype Cda2dcmOptions = ToolBaseOptions;\n\n/** Result of a successful cda2dcm operation. */\ninterface Cda2dcmResult {\n /** Path to the output DICOM file. */\n readonly outputPath: string;\n}\n\nconst Cda2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Encapsulate a CDA document into a DICOM object using the cda2dcm binary.\n *\n * @param inputPath - Path to the CDA input file\n * @param outputPath - Path for the output DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function cda2dcm(inputPath: string, outputPath: string, options?: Cda2dcmOptions): Promise<Result<Cda2dcmResult>> {\n const validation = Cda2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`cda2dcm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('cda2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('cda2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { cda2dcm };\nexport type { Cda2dcmOptions, Cda2dcmResult };\n","/**\n * Extract an encapsulated CDA document from a DICOM file using the dcm2cda binary.\n *\n * @module dcm2cda\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcm2cda}. */\ntype Dcm2cdaOptions = ToolBaseOptions;\n\n/** Result of a successful dcm2cda operation. */\ninterface Dcm2cdaResult {\n /** Path to the extracted CDA file. */\n readonly outputPath: string;\n}\n\nconst Dcm2cdaOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Extract an encapsulated CDA document from a DICOM file using the dcm2cda binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the extracted CDA output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcm2cda(inputPath: string, outputPath: string, options?: Dcm2cdaOptions): Promise<Result<Dcm2cdaResult>> {\n const validation = Dcm2cdaOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcm2cda: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcm2cda');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2cda', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcm2cda };\nexport type { Dcm2cdaOptions, Dcm2cdaResult };\n","/**\n * Convert an STL file to a DICOM object using the stl2dcm binary.\n *\n * @module stl2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link stl2dcm}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface Stl2dcmOptions extends ToolBaseOptions {}\n\n/** Result of a successful stl2dcm conversion. */\ninterface Stl2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Stl2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Converts an STL file to a DICOM object using the stl2dcm binary.\n *\n * @param inputPath - Path to the STL input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await stl2dcm('/path/to/model.stl', '/path/to/output.dcm');\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function stl2dcm(inputPath: string, outputPath: string, options?: Stl2dcmOptions): Promise<Result<Stl2dcmResult>> {\n const validation = Stl2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`stl2dcm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('stl2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('stl2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { stl2dcm };\nexport type { Stl2dcmOptions, Stl2dcmResult };\n","/**\n * Encode a DICOM file with RLE compression using the dcmcrle binary.\n *\n * @module dcmcrle\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmcrle}. */\ninterface DcmcrleOptions extends ToolBaseOptions {\n /** Always write new SOP Instance UID. Maps to +ua flag. */\n readonly uidAlways?: boolean | undefined;\n}\n\n/** Result of a successful dcmcrle encoding. */\ninterface DcmcrleResult {\n /** Path to the RLE-compressed output file. */\n readonly outputPath: string;\n}\n\nconst DcmcrleOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n uidAlways: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmcrle command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmcrleOptions): string[] {\n const args: string[] = [];\n\n if (options?.uidAlways === true) {\n args.push('+ua');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Encodes a DICOM file with RLE compression using the dcmcrle binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the RLE-compressed output file\n * @param options - Encoding options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmcrle('/path/to/input.dcm', '/path/to/output.dcm', {\n * uidAlways: true,\n * });\n * if (result.ok) {\n * console.log(`Encoded: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmcrle(inputPath: string, outputPath: string, options?: DcmcrleOptions): Promise<Result<DcmcrleResult>> {\n const validation = DcmcrleOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmcrle: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmcrle');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmcrle', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmcrle };\nexport type { DcmcrleOptions, DcmcrleResult };\n","/**\n * Decode an RLE-compressed DICOM file using the dcmdrle binary.\n *\n * @module dcmdrle\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmdrle}. */\ninterface DcmdrleOptions extends ToolBaseOptions {\n /** Always write new SOP Instance UID. Maps to +ua flag. */\n readonly uidAlways?: boolean | undefined;\n}\n\n/** Result of a successful dcmdrle decoding. */\ninterface DcmdrleResult {\n /** Path to the decoded output file. */\n readonly outputPath: string;\n}\n\nconst DcmdrleOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n uidAlways: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdrle command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmdrleOptions): string[] {\n const args: string[] = [];\n\n if (options?.uidAlways === true) {\n args.push('+ua');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Decodes an RLE-compressed DICOM file using the dcmdrle binary.\n *\n * @param inputPath - Path to the RLE-compressed DICOM input file\n * @param outputPath - Path for the decoded output file\n * @param options - Decoding options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmdrle('/path/to/compressed.dcm', '/path/to/output.dcm', {\n * uidAlways: true,\n * });\n * if (result.ok) {\n * console.log(`Decoded: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmdrle(inputPath: string, outputPath: string, options?: DcmdrleOptions): Promise<Result<DcmdrleResult>> {\n const validation = DcmdrleOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmdrle: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmdrle');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdrle', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdrle };\nexport type { DcmdrleOptions, DcmdrleResult };\n","/**\n * Encapsulate a non-DICOM document into a DICOM file using the dcmencap binary.\n *\n * @module dcmencap\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmencap}. */\ninterface DcmencapOptions extends ToolBaseOptions {\n /** Document title for the encapsulated document. Maps to --title. */\n readonly documentTitle?: string | undefined;\n}\n\n/** Result of a successful dcmencap operation. */\ninterface DcmencapResult {\n /** Path to the output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmencapOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n documentTitle: z.string().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmencap command-line arguments from validated options.\n *\n * @param inputPath - Path to the input document\n * @param outputPath - Path for the output DICOM file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmencapOptions): string[] {\n const args: string[] = [];\n\n if (options?.documentTitle !== undefined) {\n args.push('--title', options.documentTitle);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Encapsulate a non-DICOM document into a DICOM file using the dcmencap binary.\n *\n * @param inputPath - Path to the input document\n * @param outputPath - Path for the output DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcmencap(inputPath: string, outputPath: string, options?: DcmencapOptions): Promise<Result<DcmencapResult>> {\n const validation = DcmencapOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmencap: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmencap');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmencap', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmencap };\nexport type { DcmencapOptions, DcmencapResult };\n","/**\n * Extract an encapsulated document from a DICOM file using the dcmdecap binary.\n *\n * @module dcmdecap\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmdecap}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface DcmdecapOptions extends ToolBaseOptions {}\n\n/** Result of a successful dcmdecap operation. */\ninterface DcmdecapResult {\n /** Path to the extracted output file. */\n readonly outputPath: string;\n}\n\nconst DcmdecapOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Extract an encapsulated document from a DICOM file using the dcmdecap binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the extracted output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcmdecap(inputPath: string, outputPath: string, options?: DcmdecapOptions): Promise<Result<DcmdecapResult>> {\n const validation = DcmdecapOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmdecap: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmdecap');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdecap', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdecap };\nexport type { DcmdecapOptions, DcmdecapResult };\n","/**\n * Compress a DICOM file with JPEG encoding using the dcmcjpeg binary.\n *\n * @module dcmcjpeg\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmcjpeg}. */\ninterface DcmcjpegOptions extends ToolBaseOptions {\n /** JPEG quality factor (1-100). Maps to +q. */\n readonly quality?: number | undefined;\n /** Use lossless JPEG compression (SV1). Maps to +e1. */\n readonly lossless?: boolean | undefined;\n}\n\n/** Result of a successful dcmcjpeg operation. */\ninterface DcmcjpegResult {\n /** Path to the compressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmcjpegOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n quality: z.number().int().min(1).max(100).optional(),\n lossless: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmcjpeg command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmcjpegOptions): string[] {\n const args: string[] = [];\n\n if (options?.lossless === true) {\n args.push('+e1');\n }\n\n if (options?.quality !== undefined) {\n args.push('+q', String(options.quality));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Compress a DICOM file with JPEG encoding using the dcmcjpeg binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output DICOM file\n * @param options - Optional compression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmcjpeg(inputPath: string, outputPath: string, options?: DcmcjpegOptions): Promise<Result<DcmcjpegResult>> {\n const validation = DcmcjpegOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmcjpeg: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmcjpeg');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmcjpeg', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmcjpeg };\nexport type { DcmcjpegOptions, DcmcjpegResult };\n","/**\n * Decompress a JPEG-compressed DICOM file using the dcmdjpeg binary.\n *\n * @module dcmdjpeg\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Color conversion modes for dcmdjpeg.\n */\nconst ColorConversion = {\n /** Use photometric interpretation from the dataset. */\n PHOTOMETRIC: 'photometric',\n /** Always convert to RGB. */\n ALWAYS: 'always',\n /** Never convert color space. */\n NEVER: 'never',\n} as const;\n\ntype ColorConversionValue = (typeof ColorConversion)[keyof typeof ColorConversion];\n\n/** Maps color conversion values to dcmdjpeg command-line flags. */\nconst COLOR_CONVERSION_FLAGS: Record<ColorConversionValue, string> = {\n photometric: '+cp',\n always: '+ca',\n never: '+cn',\n};\n\n/** Options for {@link dcmdjpeg}. */\ninterface DcmdjpegOptions extends ToolBaseOptions {\n /** Color conversion mode. Maps to +cp, +ca, or +cn. */\n readonly colorConversion?: ColorConversionValue | undefined;\n}\n\n/** Result of a successful dcmdjpeg operation. */\ninterface DcmdjpegResult {\n /** Path to the decompressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmdjpegOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n colorConversion: z.enum(['photometric', 'always', 'never']).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdjpeg command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the decompressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmdjpegOptions): string[] {\n const args: string[] = [];\n\n if (options?.colorConversion !== undefined) {\n args.push(COLOR_CONVERSION_FLAGS[options.colorConversion]);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Decompress a JPEG-compressed DICOM file using the dcmdjpeg binary.\n *\n * @param inputPath - Path to the JPEG-compressed DICOM input file\n * @param outputPath - Path for the decompressed output DICOM file\n * @param options - Optional decompression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmdjpeg(inputPath: string, outputPath: string, options?: DcmdjpegOptions): Promise<Result<DcmdjpegResult>> {\n const validation = DcmdjpegOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmdjpeg: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmdjpeg');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdjpeg', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdjpeg, ColorConversion };\nexport type { DcmdjpegOptions, DcmdjpegResult, ColorConversionValue };\n","/**\n * Compress a DICOM file with JPEG-LS encoding using the dcmcjpls binary.\n *\n * @module dcmcjpls\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmcjpls}. */\ninterface DcmcjplsOptions extends ToolBaseOptions {\n /** Use lossless JPEG-LS compression (default). Maps to +el. */\n readonly lossless?: boolean | undefined;\n /** Maximum pixel deviation for near-lossless mode. Maps to +md. */\n readonly maxDeviation?: number | undefined;\n}\n\n/** Result of a successful dcmcjpls operation. */\ninterface DcmcjplsResult {\n /** Path to the compressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmcjplsOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n lossless: z.boolean().optional(),\n maxDeviation: z.number().int().min(0).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmcjpls command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmcjplsOptions): string[] {\n const args: string[] = [];\n\n if (options?.lossless === false) {\n args.push('+en');\n } else if (options?.lossless === true) {\n args.push('+el');\n }\n\n if (options?.maxDeviation !== undefined) {\n args.push('+md', String(options.maxDeviation));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Compress a DICOM file with JPEG-LS encoding using the dcmcjpls binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output DICOM file\n * @param options - Optional compression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmcjpls(inputPath: string, outputPath: string, options?: DcmcjplsOptions): Promise<Result<DcmcjplsResult>> {\n const validation = DcmcjplsOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmcjpls: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmcjpls');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmcjpls', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmcjpls };\nexport type { DcmcjplsOptions, DcmcjplsResult };\n","/**\n * Decompress a JPEG-LS-compressed DICOM file using the dcmdjpls binary.\n *\n * @module dcmdjpls\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Color conversion modes for dcmdjpls.\n */\nconst JplsColorConversion = {\n /** Use photometric interpretation from the dataset. */\n PHOTOMETRIC: 'photometric',\n /** Always convert to RGB. */\n ALWAYS: 'always',\n /** Never convert color space. */\n NEVER: 'never',\n} as const;\n\ntype JplsColorConversionValue = (typeof JplsColorConversion)[keyof typeof JplsColorConversion];\n\n/** Maps color conversion values to dcmdjpls command-line flags. */\nconst JPLS_COLOR_CONVERSION_FLAGS: Record<JplsColorConversionValue, string> = {\n photometric: '+cp',\n always: '+ca',\n never: '+cn',\n};\n\n/** Options for {@link dcmdjpls}. */\ninterface DcmdjplsOptions extends ToolBaseOptions {\n /** Color conversion mode. Maps to +cp, +ca, or +cn. */\n readonly colorConversion?: JplsColorConversionValue | undefined;\n}\n\n/** Result of a successful dcmdjpls operation. */\ninterface DcmdjplsResult {\n /** Path to the decompressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmdjplsOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n colorConversion: z.enum(['photometric', 'always', 'never']).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdjpls command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the decompressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmdjplsOptions): string[] {\n const args: string[] = [];\n\n if (options?.colorConversion !== undefined) {\n args.push(JPLS_COLOR_CONVERSION_FLAGS[options.colorConversion]);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Decompress a JPEG-LS-compressed DICOM file using the dcmdjpls binary.\n *\n * @param inputPath - Path to the JPEG-LS-compressed DICOM input file\n * @param outputPath - Path for the decompressed output DICOM file\n * @param options - Optional decompression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmdjpls(inputPath: string, outputPath: string, options?: DcmdjplsOptions): Promise<Result<DcmdjplsResult>> {\n const validation = DcmdjplsOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmdjpls: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmdjpls');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdjpls', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdjpls, JplsColorConversion };\nexport type { DcmdjplsOptions, DcmdjplsResult, JplsColorConversionValue };\n","/**\n * Convert a DICOM image to a standard image format using the dcmj2pnm binary.\n *\n * @module dcmj2pnm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Output format presets for dcmj2pnm.\n */\nconst Dcmj2pnmOutputFormat = {\n /** Portable aNy Map format. */\n PNM: 'pnm',\n /** PNG format. */\n PNG: 'png',\n /** BMP format. */\n BMP: 'bmp',\n /** TIFF format. */\n TIFF: 'tiff',\n /** JPEG format. */\n JPEG: 'jpeg',\n} as const;\n\ntype Dcmj2pnmOutputFormatValue = (typeof Dcmj2pnmOutputFormat)[keyof typeof Dcmj2pnmOutputFormat];\n\nconst OUTPUT_FORMAT_FLAGS: Record<Dcmj2pnmOutputFormatValue, string> = {\n pnm: '+op',\n png: '+on',\n bmp: '+ob',\n tiff: '+ot',\n jpeg: '+oj',\n};\n\n/** Options for {@link dcmj2pnm}. */\ninterface Dcmj2pnmOptions extends ToolBaseOptions {\n /** Output image format. Defaults to PNM if not specified. */\n readonly outputFormat?: Dcmj2pnmOutputFormatValue | undefined;\n /** Frame number to extract (0-based). */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcmj2pnm operation. */\ninterface Dcmj2pnmResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst Dcmj2pnmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n outputFormat: z.enum(['pnm', 'png', 'bmp', 'tiff', 'jpeg']).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmj2pnm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dcmj2pnmOptions): string[] {\n const args: string[] = [];\n\n if (options?.outputFormat !== undefined) {\n args.push(OUTPUT_FORMAT_FLAGS[options.outputFormat]);\n }\n\n if (options?.frame !== undefined) {\n args.push('+F', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Convert a DICOM image to a standard image format using the dcmj2pnm binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the converted output image file\n * @param options - Optional conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmj2pnm('/path/to/input.dcm', '/path/to/output.png', {\n * outputFormat: 'png',\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmj2pnm(inputPath: string, outputPath: string, options?: Dcmj2pnmOptions): Promise<Result<Dcmj2pnmResult>> {\n const validation = Dcmj2pnmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmj2pnm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmj2pnm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmj2pnm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmj2pnm, Dcmj2pnmOutputFormat };\nexport type { Dcmj2pnmOptions, Dcmj2pnmResult, Dcmj2pnmOutputFormatValue };\n","/**\n * Convert a DICOM image to PNM/PNG/BMP/TIFF format using the dcm2pnm binary.\n *\n * @module dcm2pnm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Output format presets for dcm2pnm.\n */\nconst Dcm2pnmOutputFormat = {\n /** Portable aNy Map format. */\n PNM: 'pnm',\n /** PNG format. */\n PNG: 'png',\n /** BMP format. */\n BMP: 'bmp',\n /** TIFF format. */\n TIFF: 'tiff',\n} as const;\n\ntype Dcm2pnmOutputFormatValue = (typeof Dcm2pnmOutputFormat)[keyof typeof Dcm2pnmOutputFormat];\n\nconst DCM2PNM_FORMAT_FLAGS: Record<Dcm2pnmOutputFormatValue, string> = {\n pnm: '+op',\n png: '+on',\n bmp: '+ob',\n tiff: '+ot',\n};\n\n/** Options for {@link dcm2pnm}. */\ninterface Dcm2pnmOptions extends ToolBaseOptions {\n /** Output image format. Defaults to PNM if not specified. */\n readonly outputFormat?: Dcm2pnmOutputFormatValue | undefined;\n /** Frame number to extract (0-based, max 65535). */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcm2pnm operation. */\ninterface Dcm2pnmResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst Dcm2pnmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n outputFormat: z.enum(['pnm', 'png', 'bmp', 'tiff']).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcm2pnm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dcm2pnmOptions): string[] {\n const args: string[] = [];\n\n if (options?.outputFormat !== undefined) {\n args.push(DCM2PNM_FORMAT_FLAGS[options.outputFormat]);\n }\n\n if (options?.frame !== undefined) {\n args.push('+F', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Convert a DICOM image to PNM/PNG/BMP/TIFF format using the dcm2pnm binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the converted output image file\n * @param options - Optional conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcm2pnm('/path/to/input.dcm', '/path/to/output.png', {\n * outputFormat: 'png',\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcm2pnm(inputPath: string, outputPath: string, options?: Dcm2pnmOptions): Promise<Result<Dcm2pnmResult>> {\n const validation = Dcm2pnmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcm2pnm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcm2pnm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2pnm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcm2pnm, Dcm2pnmOutputFormat };\nexport type { Dcm2pnmOptions, Dcm2pnmResult, Dcm2pnmOutputFormatValue };\n","/**\n * Scale a DICOM image using the dcmscale binary.\n *\n * @module dcmscale\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmscale}. */\ninterface DcmscaleOptions extends ToolBaseOptions {\n /** Horizontal scaling factor (max 100). */\n readonly xFactor?: number | undefined;\n /** Vertical scaling factor (max 100). */\n readonly yFactor?: number | undefined;\n /** Target width in pixels. */\n readonly xSize?: number | undefined;\n /** Target height in pixels. */\n readonly ySize?: number | undefined;\n}\n\n/** Result of a successful dcmscale operation. */\ninterface DcmscaleResult {\n /** Path to the scaled output file. */\n readonly outputPath: string;\n}\n\nconst DcmscaleOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n xFactor: z.number().positive().max(100).optional(),\n yFactor: z.number().positive().max(100).optional(),\n xSize: z.number().int().positive().optional(),\n ySize: z.number().int().positive().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmscale command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmscaleOptions): string[] {\n const args: string[] = [];\n\n if (options?.xFactor !== undefined) {\n args.push('+Sxf', String(options.xFactor));\n }\n\n if (options?.yFactor !== undefined) {\n args.push('+Syf', String(options.yFactor));\n }\n\n if (options?.xSize !== undefined) {\n args.push('+Sxv', String(options.xSize));\n }\n\n if (options?.ySize !== undefined) {\n args.push('+Syv', String(options.ySize));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Scale a DICOM image using the dcmscale binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the scaled output file\n * @param options - Optional scaling options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmscale('/path/to/input.dcm', '/path/to/output.dcm', {\n * xFactor: 0.5,\n * yFactor: 0.5,\n * });\n * if (result.ok) {\n * console.log(`Scaled: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmscale(inputPath: string, outputPath: string, options?: DcmscaleOptions): Promise<Result<DcmscaleResult>> {\n const validation = DcmscaleOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmscale: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmscale');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmscale', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmscale };\nexport type { DcmscaleOptions, DcmscaleResult };\n","/**\n * Quantize a color DICOM image to palette color using the dcmquant binary.\n *\n * @module dcmquant\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmquant}. */\ninterface DcmquantOptions extends ToolBaseOptions {\n /** Number of colors in the palette (2-65536). */\n readonly colors?: number | undefined;\n /** Frame number to extract (0-based, max 65535). */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcmquant operation. */\ninterface DcmquantResult {\n /** Path to the quantized output file. */\n readonly outputPath: string;\n}\n\nconst DcmquantOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n colors: z.number().int().min(2).max(65536).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmquant command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmquantOptions): string[] {\n const args: string[] = [];\n\n if (options?.colors !== undefined) {\n args.push('+pc', String(options.colors));\n }\n\n if (options?.frame !== undefined) {\n args.push('+F', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Quantize a color DICOM image to palette color using the dcmquant binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the quantized output file\n * @param options - Optional quantization options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmquant('/path/to/input.dcm', '/path/to/output.dcm', {\n * colors: 256,\n * });\n * if (result.ok) {\n * console.log(`Quantized: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmquant(inputPath: string, outputPath: string, options?: DcmquantOptions): Promise<Result<DcmquantResult>> {\n const validation = DcmquantOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmquant: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmquant');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmquant', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmquant };\nexport type { DcmquantOptions, DcmquantResult };\n","/**\n * Export display function curves using the dcmdspfn binary.\n *\n * Generates GSDF (Grayscale Standard Display Function) lookup tables\n * for monitor, camera, or printer calibration.\n *\n * @module dcmdspfn\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmdspfn}. */\ninterface DcmdspfnOptions extends ToolBaseOptions {\n /** Path to monitor characteristics file. Maps to `+Im`. */\n readonly monitorFile?: string | undefined;\n /** Path to camera characteristics file. Maps to `+Ic`. */\n readonly cameraFile?: string | undefined;\n /** Path to printer characteristics file. Maps to `+Ip`. */\n readonly printerFile?: string | undefined;\n /** Ambient light value in cd/m2. Maps to `+Ca`. */\n readonly ambientLight?: number | undefined;\n}\n\n/** Result of a successful dcmdspfn operation. */\ninterface DcmdspfnResult {\n /** The text output from dcmdspfn. */\n readonly text: string;\n}\n\nconst DcmdspfnOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n monitorFile: z.string().min(1).optional(),\n cameraFile: z.string().min(1).optional(),\n printerFile: z.string().min(1).optional(),\n ambientLight: z.number().positive().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdspfn command-line arguments from validated options.\n */\nfunction buildArgs(options?: DcmdspfnOptions): string[] {\n const args: string[] = [];\n\n if (options?.monitorFile !== undefined) {\n args.push('+Im', options.monitorFile);\n }\n\n if (options?.cameraFile !== undefined) {\n args.push('+Ic', options.cameraFile);\n }\n\n if (options?.printerFile !== undefined) {\n args.push('+Ip', options.printerFile);\n }\n\n if (options?.ambientLight !== undefined) {\n args.push('+Ca', String(options.ambientLight));\n }\n\n return args;\n}\n\n/**\n * Exports display function curves using the dcmdspfn binary.\n *\n * @param options - Optional display function options\n * @returns A Result containing the text output or an error\n *\n * @example\n * ```ts\n * const result = await dcmdspfn({ monitorFile: '/path/to/monitor.lut' });\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmdspfn(options?: DcmdspfnOptions): Promise<Result<DcmdspfnResult>> {\n const validation = DcmdspfnOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmdspfn: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmdspfn');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdspfn', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmdspfn };\nexport type { DcmdspfnOptions, DcmdspfnResult };\n","/**\n * Convert hardcopy OD values to softcopy P-values using the dcod2lum binary.\n *\n * Converts Optical Density (OD) calibration data from a hardcopy device\n * into luminance (P-value) data suitable for softcopy display.\n *\n * @module dcod2lum\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcod2lum}. */\ntype Dcod2lumOptions = ToolBaseOptions;\n\n/** Result of a successful dcod2lum operation. */\ninterface Dcod2lumResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst Dcod2lumOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Converts hardcopy OD values to softcopy P-values using the dcod2lum binary.\n *\n * @param inputPath - Path to the OD input file\n * @param outputPath - Path for the converted luminance output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcod2lum('/path/to/od.dat', '/path/to/lum.dat');\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcod2lum(inputPath: string, outputPath: string, options?: Dcod2lumOptions): Promise<Result<Dcod2lumResult>> {\n const validation = Dcod2lumOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcod2lum: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcod2lum');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcod2lum', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcod2lum };\nexport type { Dcod2lumOptions, Dcod2lumResult };\n","/**\n * Convert VeriLUM calibration data to DCMTK display format using the dconvlum binary.\n *\n * Reads VeriLUM luminance calibration data and converts it into\n * a format suitable for use with DCMTK display function tools.\n *\n * @module dconvlum\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dconvlum}. */\ninterface DconvlumOptions extends ToolBaseOptions {\n /** Ambient light value in cd/m2. Maps to `+Ca`. */\n readonly ambientLight?: number | undefined;\n}\n\n/** Result of a successful dconvlum operation. */\ninterface DconvlumResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst DconvlumOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n ambientLight: z.number().positive().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dconvlum command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DconvlumOptions): string[] {\n const args: string[] = [];\n\n if (options?.ambientLight !== undefined) {\n args.push('+Ca', String(options.ambientLight));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts VeriLUM calibration data to DCMTK display format using the dconvlum binary.\n *\n * @param inputPath - Path to the VeriLUM input file\n * @param outputPath - Path for the converted output file\n * @param options - Optional conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dconvlum('/path/to/verilum.dat', '/path/to/display.dat', {\n * ambientLight: 10,\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dconvlum(inputPath: string, outputPath: string, options?: DconvlumOptions): Promise<Result<DconvlumResult>> {\n const validation = DconvlumOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dconvlum: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dconvlum');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dconvlum', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dconvlum };\nexport type { DconvlumOptions, DconvlumResult };\n","/**\n * C-ECHO verification using the echoscu binary.\n *\n * Tests DICOM network connectivity by sending a C-ECHO request\n * to a remote DICOM SCP (Service Class Provider).\n *\n * @module echoscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isValidAETitle } from '../patterns';\n\n/** Options for {@link echoscu}. */\ninterface EchoscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. **Security:** Not validated for SSRF — callers accepting user input should validate against private/internal IP ranges. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n}\n\n/** Result of a successful C-ECHO. */\ninterface EchoscuResult {\n /** Always `true` when the Result is `ok` — redundant with `Result.ok` but kept for API compatibility. @deprecated Check `Result.ok` instead. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst EchoscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n })\n .strict();\n\n/**\n * Builds echoscu command-line arguments from validated options.\n */\nfunction buildArgs(options: EchoscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Sends a C-ECHO request to a remote DICOM SCP to verify connectivity.\n *\n * @param options - Echo options (host and port required)\n * @returns A Result containing the echo result or an error\n *\n * @example\n * ```ts\n * const result = await echoscu({ host: '192.168.1.100', port: 104 });\n * if (result.ok) {\n * console.log(result.value.success ? 'Echo succeeded' : 'Echo failed');\n * }\n * ```\n */\nasync function echoscu(options: EchoscuOptions): Promise<Result<EchoscuResult>> {\n const validation = EchoscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('echoscu', validation.error));\n }\n\n const binaryResult = resolveBinary('echoscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('echoscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { echoscu };\nexport type { EchoscuOptions, EchoscuResult };\n","/**\n * C-STORE send using the dcmsend binary.\n *\n * Sends one or more DICOM files to a remote DICOM SCP.\n *\n * @module dcmsend\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidAETitle } from '../patterns';\n\n/** Options for {@link dcmsend}. */\ninterface DcmsendOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** One or more DICOM file paths to send. */\n readonly files: readonly string[];\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Scan input directory recursively for DICOM files. Defaults to false. */\n readonly scanDirectory?: boolean | undefined;\n}\n\n/** Result of a successful C-STORE send. */\ninterface DcmsendResult {\n /** Whether the send completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst DcmsendOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n files: z.array(z.string().min(1).refine(isSafePath, { message: 'path traversal detected in file path' })).min(1),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n scanDirectory: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Builds dcmsend command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmsendOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.scanDirectory === true) {\n args.push('--scan-directories');\n }\n\n args.push(options.host, String(options.port));\n args.push(...options.files);\n\n return args;\n}\n\n/**\n * Sends DICOM files to a remote SCP using C-STORE via the dcmsend binary.\n *\n * @param options - Send options (host, port, files required)\n * @returns A Result containing the send result or an error\n *\n * @example\n * ```ts\n * const result = await dcmsend({\n * host: '192.168.1.100',\n * port: 104,\n * files: ['/path/to/study.dcm'],\n * calledAETitle: 'PACS',\n * });\n * if (result.ok && result.value.success) {\n * console.log('Files sent successfully');\n * }\n * ```\n */\nasync function dcmsend(options: DcmsendOptions): Promise<Result<DcmsendResult>> {\n const validation = DcmsendOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmsend: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmsend');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmsend', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { dcmsend };\nexport type { DcmsendOptions, DcmsendResult };\n","/**\n * Send DICOM files using C-STORE via the storescu binary.\n *\n * Sends one or more DICOM files to a remote DICOM SCP\n * (Service Class Provider) using the DICOM C-STORE protocol.\n *\n * @module storescu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidAETitle } from '../patterns';\n\n/** Options for {@link storescu}. */\ninterface StorescuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** One or more DICOM file paths to send. */\n readonly files: readonly string[];\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Scan directories for DICOM files. */\n readonly scanDirectories?: boolean | undefined;\n /** Recurse into subdirectories (requires scanDirectories). */\n readonly recurse?: boolean | undefined;\n}\n\n/** Result of a successful C-STORE send. */\ninterface StorescuResult {\n /** Whether the store completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst StorescuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n files: z.array(z.string().min(1).refine(isSafePath, { message: 'path traversal detected in file path' })).min(1),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n scanDirectories: z.boolean().optional(),\n recurse: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Builds storescu command-line arguments from validated options.\n */\nfunction buildArgs(options: StorescuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.scanDirectories === true) {\n args.push('+sd');\n }\n\n if (options.recurse === true) {\n args.push('+r');\n }\n\n args.push(options.host, String(options.port));\n args.push(...options.files);\n\n return args;\n}\n\n/**\n * Send DICOM files using C-STORE via the storescu binary.\n *\n * @param options - Store options (host, port, files required)\n * @returns A Result containing the store result or an error\n *\n * @example\n * ```ts\n * const result = await storescu({\n * host: '192.168.1.100',\n * port: 104,\n * files: ['/path/to/study.dcm'],\n * calledAETitle: 'PACS',\n * });\n * if (result.ok && result.value.success) {\n * console.log('Files sent successfully');\n * }\n * ```\n */\nasync function storescu(options: StorescuOptions): Promise<Result<StorescuResult>> {\n const validation = StorescuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`storescu: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('storescu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('storescu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { storescu };\nexport type { StorescuOptions, StorescuResult };\n","/**\n * Query a remote DICOM SCP using C-FIND via the findscu binary.\n *\n * Performs DICOM C-FIND queries against a remote SCP for worklist,\n * patient, or study-level information.\n *\n * @module findscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidDicomKey, isValidAETitle } from '../patterns';\n\n/** Supported C-FIND query models. */\nconst QueryModel = {\n WORKLIST: 'worklist',\n PATIENT: 'patient',\n STUDY: 'study',\n} as const;\n\n/** Union of valid query model values. */\ntype QueryModelValue = (typeof QueryModel)[keyof typeof QueryModel];\n\n/** Maps query model values to their CLI flags. */\nconst QUERY_MODEL_FLAGS: Record<QueryModelValue, string> = {\n worklist: '-W',\n patient: '-P',\n study: '-S',\n};\n\n/** Options for {@link findscu}. */\ninterface FindscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Query model to use. */\n readonly queryModel?: QueryModelValue | undefined;\n /** DICOM attribute keys for the query (each becomes -k). */\n readonly keys?: readonly string[] | undefined;\n /** Extract response datasets to individual DICOM files. */\n readonly extract?: boolean | undefined;\n /** Output directory for extracted response files (requires extract). */\n readonly outputDirectory?: string | undefined;\n}\n\n/** Result of a successful C-FIND query. */\ninterface FindscuResult {\n /** Whether the query completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst FindscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n queryModel: z.enum(['worklist', 'patient', 'study']).optional(),\n keys: z.array(z.string().min(1).refine(isValidDicomKey, { message: 'invalid DICOM query key format (expected XXXX,XXXX[=value])' })).optional(),\n extract: z.boolean().optional(),\n outputDirectory: z.string().min(1).refine(isSafePath, { message: 'path traversal detected in outputDirectory' }).optional(),\n })\n .strict()\n .refine(data => data.extract !== true || data.outputDirectory !== undefined, {\n message: 'outputDirectory is required when extract is true',\n });\n\n/**\n * Builds findscu command-line arguments from validated options.\n */\nfunction buildArgs(options: FindscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.queryModel !== undefined) {\n args.push(QUERY_MODEL_FLAGS[options.queryModel]);\n }\n\n if (options.extract === true) {\n args.push('--extract');\n }\n\n if (options.outputDirectory !== undefined) {\n args.push('--output-directory', options.outputDirectory);\n }\n\n if (options.keys !== undefined) {\n for (const key of options.keys) {\n args.push('-k', key);\n }\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Query a remote DICOM SCP using C-FIND via the findscu binary.\n *\n * @param options - Find options (host and port required)\n * @returns A Result containing the find result or an error\n *\n * @example\n * ```ts\n * const result = await findscu({\n * host: '192.168.1.100',\n * port: 104,\n * queryModel: 'study',\n * keys: ['0008,0050=', '0010,0020=PATIENT1'],\n * });\n * if (result.ok) {\n * console.log('Query succeeded');\n * }\n * ```\n */\nasync function findscu(options: FindscuOptions): Promise<Result<FindscuResult>> {\n const validation = FindscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('findscu', validation.error));\n }\n\n const binaryResult = resolveBinary('findscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('findscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { findscu, QueryModel };\nexport type { FindscuOptions, FindscuResult, QueryModelValue };\n","/**\n * Retrieve DICOM objects using C-MOVE via the movescu binary.\n *\n * Sends a C-MOVE request to a remote DICOM SCP to retrieve\n * DICOM objects and have them sent to a specified destination.\n *\n * @module movescu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidDicomKey, isValidAETitle } from '../patterns';\n\n/** Supported C-MOVE query models. */\nconst MoveQueryModel = {\n PATIENT: 'patient',\n STUDY: 'study',\n} as const;\n\n/** Union of valid move query model values. */\ntype MoveQueryModelValue = (typeof MoveQueryModel)[keyof typeof MoveQueryModel];\n\n/** Maps query model values to their CLI flags. */\nconst MOVE_QUERY_MODEL_FLAGS: Record<MoveQueryModelValue, string> = {\n patient: '-P',\n study: '-S',\n};\n\n/** Options for {@link movescu}. */\ninterface MovescuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Query model to use. */\n readonly queryModel?: MoveQueryModelValue | undefined;\n /** DICOM attribute keys for the query (each becomes -k). */\n readonly keys?: readonly string[] | undefined;\n /** Move destination AE Title (maps to -aem). */\n readonly moveDestination?: string | undefined;\n /** Output directory for retrieved files (maps to -od). */\n readonly outputDirectory?: string | undefined;\n}\n\n/** Result of a successful C-MOVE retrieval. */\ninterface MovescuResult {\n /** Whether the move completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst MovescuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n queryModel: z.enum(['patient', 'study']).optional(),\n keys: z.array(z.string().min(1).refine(isValidDicomKey, { message: 'invalid DICOM query key format (expected XXXX,XXXX[=value])' })).optional(),\n moveDestination: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n outputDirectory: z.string().min(1).refine(isSafePath, { message: 'path traversal detected in outputDirectory' }).optional(),\n })\n .strict();\n\n/**\n * Builds movescu command-line arguments from validated options.\n */\nfunction buildArgs(options: MovescuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.queryModel !== undefined) {\n args.push(MOVE_QUERY_MODEL_FLAGS[options.queryModel]);\n }\n\n if (options.moveDestination !== undefined) {\n args.push('-aem', options.moveDestination);\n }\n\n if (options.outputDirectory !== undefined) {\n args.push('-od', options.outputDirectory);\n }\n\n if (options.keys !== undefined) {\n for (const key of options.keys) {\n args.push('-k', key);\n }\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Retrieve DICOM objects using C-MOVE via the movescu binary.\n *\n * @param options - Move options (host and port required)\n * @returns A Result containing the move result or an error\n *\n * @example\n * ```ts\n * const result = await movescu({\n * host: '192.168.1.100',\n * port: 104,\n * queryModel: 'study',\n * moveDestination: 'LOCALAE',\n * keys: ['0020,000D=1.2.3.4'],\n * });\n * if (result.ok) {\n * console.log('Move succeeded');\n * }\n * ```\n */\nasync function movescu(options: MovescuOptions): Promise<Result<MovescuResult>> {\n const validation = MovescuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`movescu: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('movescu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('movescu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { movescu, MoveQueryModel };\nexport type { MovescuOptions, MovescuResult, MoveQueryModelValue };\n","/**\n * Retrieve DICOM objects using C-GET via the getscu binary.\n *\n * Sends a C-GET request to a remote DICOM SCP to retrieve\n * DICOM objects directly over the same association.\n *\n * @module getscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidDicomKey, isValidAETitle } from '../patterns';\n\n/** Supported C-GET query models. */\nconst GetQueryModel = {\n PATIENT: 'patient',\n STUDY: 'study',\n} as const;\n\n/** Union of valid get query model values. */\ntype GetQueryModelValue = (typeof GetQueryModel)[keyof typeof GetQueryModel];\n\n/** Maps query model values to their CLI flags. */\nconst GET_QUERY_MODEL_FLAGS: Record<GetQueryModelValue, string> = {\n patient: '-P',\n study: '-S',\n};\n\n/** Options for {@link getscu}. */\ninterface GetscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Query model to use. */\n readonly queryModel?: GetQueryModelValue | undefined;\n /** DICOM attribute keys for the query (each becomes -k). */\n readonly keys?: readonly string[] | undefined;\n /** Output directory for retrieved files (maps to -od). */\n readonly outputDirectory?: string | undefined;\n}\n\n/** Result of a successful C-GET retrieval. */\ninterface GetscuResult {\n /** Whether the get completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst GetscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n queryModel: z.enum(['patient', 'study']).optional(),\n keys: z.array(z.string().min(1).refine(isValidDicomKey, { message: 'invalid DICOM query key format (expected XXXX,XXXX[=value])' })).optional(),\n outputDirectory: z.string().min(1).refine(isSafePath, { message: 'path traversal detected in outputDirectory' }).optional(),\n })\n .strict();\n\n/**\n * Builds getscu command-line arguments from validated options.\n */\nfunction buildArgs(options: GetscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.queryModel !== undefined) {\n args.push(GET_QUERY_MODEL_FLAGS[options.queryModel]);\n }\n\n if (options.outputDirectory !== undefined) {\n args.push('-od', options.outputDirectory);\n }\n\n if (options.keys !== undefined) {\n for (const key of options.keys) {\n args.push('-k', key);\n }\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Retrieve DICOM objects using C-GET via the getscu binary.\n *\n * @param options - Get options (host and port required)\n * @returns A Result containing the get result or an error\n *\n * @example\n * ```ts\n * const result = await getscu({\n * host: '192.168.1.100',\n * port: 104,\n * queryModel: 'study',\n * outputDirectory: '/tmp/dicom',\n * keys: ['0020,000D=1.2.3.4'],\n * });\n * if (result.ok) {\n * console.log('Get succeeded');\n * }\n * ```\n */\nasync function getscu(options: GetscuOptions): Promise<Result<GetscuResult>> {\n const validation = GetscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`getscu: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('getscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('getscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { getscu, GetQueryModel };\nexport type { GetscuOptions, GetscuResult, GetQueryModelValue };\n","/**\n * Terminate a DICOM association using the termscu binary.\n *\n * Sends an A-ABORT or A-RELEASE request to terminate an existing\n * DICOM association with a remote SCP.\n *\n * @module termscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isValidAETitle } from '../patterns';\n\n/** Options for {@link termscu}. */\ninterface TermscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n}\n\n/** Result of a successful termscu operation. */\ninterface TermscuResult {\n /** Whether the termination succeeded (exit code 0). */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst TermscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n })\n .strict();\n\n/**\n * Builds termscu command-line arguments from validated options.\n */\nfunction buildArgs(options: TermscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Terminates a DICOM association with a remote SCP using the termscu binary.\n *\n * @param options - Termination options (host and port required)\n * @returns A Result containing the termination result or an error\n *\n * @example\n * ```ts\n * const result = await termscu({ host: '192.168.1.100', port: 104 });\n * if (result.ok) {\n * console.log(result.value.success ? 'Terminated' : 'Failed');\n * }\n * ```\n */\nasync function termscu(options: TermscuOptions): Promise<Result<TermscuResult>> {\n const validation = TermscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`termscu: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('termscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('termscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { termscu };\nexport type { TermscuOptions, TermscuResult };\n","/**\n * Dump a DICOM structured report as text using the dsrdump binary.\n *\n * @module dsrdump\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dsrdump}. */\ninterface DsrdumpOptions extends ToolBaseOptions {\n /** Print filename for each document. Maps to +Pf. Defaults to false. */\n readonly printFilename?: boolean | undefined;\n /** Print long format with enhanced details. Maps to +Pl. Defaults to false. */\n readonly printLong?: boolean | undefined;\n /** Print concept name codes. Maps to +Pc. Defaults to false. */\n readonly printCodes?: boolean | undefined;\n}\n\n/** Result of a successful dsrdump operation. */\ninterface DsrdumpResult {\n /** The text output from dsrdump. */\n readonly text: string;\n}\n\nconst DsrdumpOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n printFilename: z.boolean().optional(),\n printLong: z.boolean().optional(),\n printCodes: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dsrdump command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DsrdumpOptions): string[] {\n const args: string[] = [];\n\n if (options?.printFilename === true) {\n args.push('+Pf');\n }\n\n if (options?.printLong === true) {\n args.push('+Pl');\n }\n\n if (options?.printCodes === true) {\n args.push('+Pc');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Dumps a DICOM structured report as text using the dsrdump binary.\n *\n * @param inputPath - Path to the DICOM SR input file\n * @param options - Dump options\n * @returns A Result containing the text dump or an error\n *\n * @example\n * ```ts\n * const result = await dsrdump('/path/to/report.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dsrdump(inputPath: string, options?: DsrdumpOptions): Promise<Result<DsrdumpResult>> {\n const validation = DsrdumpOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dsrdump: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dsrdump');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dsrdump', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dsrdump };\nexport type { DsrdumpOptions, DsrdumpResult };\n","/**\n * Convert a DICOM structured report to XML using the dsr2xml binary.\n *\n * @module dsr2xml\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dsr2xml}. */\ninterface Dsr2xmlOptions extends ToolBaseOptions {\n /** Use XML namespace. Maps to +Xn. Defaults to false. */\n readonly useNamespace?: boolean | undefined;\n /** Add XML Schema reference. Maps to +Xs. Defaults to false. */\n readonly addSchemaRef?: boolean | undefined;\n}\n\n/** Result of a successful dsr2xml conversion. */\ninterface Dsr2xmlResult {\n /** The XML text output from dsr2xml. */\n readonly text: string;\n}\n\nconst Dsr2xmlOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n useNamespace: z.boolean().optional(),\n addSchemaRef: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dsr2xml command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: Dsr2xmlOptions): string[] {\n const args: string[] = [];\n\n if (options?.useNamespace === true) {\n args.push('+Xn');\n }\n\n if (options?.addSchemaRef === true) {\n args.push('+Xs');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Converts a DICOM structured report to XML using the dsr2xml binary.\n *\n * @param inputPath - Path to the DICOM SR input file\n * @param options - Conversion options\n * @returns A Result containing the XML text or an error\n *\n * @example\n * ```ts\n * const result = await dsr2xml('/path/to/report.dcm', { useNamespace: true });\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dsr2xml(inputPath: string, options?: Dsr2xmlOptions): Promise<Result<Dsr2xmlResult>> {\n const validation = Dsr2xmlOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dsr2xml: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dsr2xml');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dsr2xml', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dsr2xml };\nexport type { Dsr2xmlOptions, Dsr2xmlResult };\n","/**\n * Convert an XML document to a DICOM structured report using the xml2dsr binary.\n *\n * @module xml2dsr\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link xml2dsr}. */\ninterface Xml2dsrOptions extends ToolBaseOptions {\n /** Generate new Study/Series/SOP Instance UIDs. Maps to +Ug. Defaults to false. */\n readonly generateNewUIDs?: boolean | undefined;\n /** Validate the SR document. Maps to +Vd. Defaults to false. */\n readonly validateDocument?: boolean | undefined;\n}\n\n/** Result of a successful xml2dsr conversion. */\ninterface Xml2dsrResult {\n /** Path to the generated DICOM SR output file. */\n readonly outputPath: string;\n}\n\nconst Xml2dsrOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n generateNewUIDs: z.boolean().optional(),\n validateDocument: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds xml2dsr command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Xml2dsrOptions): string[] {\n const args: string[] = [];\n\n if (options?.generateNewUIDs === true) {\n args.push('+Ug');\n }\n\n if (options?.validateDocument === true) {\n args.push('+Vd');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts an XML document to a DICOM structured report using the xml2dsr binary.\n *\n * @param inputPath - Path to the XML input file\n * @param outputPath - Path for the DICOM SR output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await xml2dsr('/path/to/report.xml', '/path/to/output.dcm', {\n * generateNewUIDs: true,\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function xml2dsr(inputPath: string, outputPath: string, options?: Xml2dsrOptions): Promise<Result<Xml2dsrResult>> {\n const validation = Xml2dsrOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`xml2dsr: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('xml2dsr');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('xml2dsr', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { xml2dsr };\nexport type { Xml2dsrOptions, Xml2dsrResult };\n","/**\n * Dump a DICOM RT file as text using the drtdump binary.\n *\n * @module drtdump\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link drtdump}. */\ninterface DrtdumpOptions extends ToolBaseOptions {\n /** Print filename for each document. Maps to +Pf. Defaults to false. */\n readonly printFilename?: boolean | undefined;\n}\n\n/** Result of a successful drtdump operation. */\ninterface DrtdumpResult {\n /** The text output from drtdump. */\n readonly text: string;\n}\n\nconst DrtdumpOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n printFilename: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds drtdump command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DrtdumpOptions): string[] {\n const args: string[] = [];\n\n if (options?.printFilename === true) {\n args.push('+Pf');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Dumps a DICOM RT file as text using the drtdump binary.\n *\n * @param inputPath - Path to the DICOM RT input file\n * @param options - Dump options\n * @returns A Result containing the text dump or an error\n *\n * @example\n * ```ts\n * const result = await drtdump('/path/to/rtplan.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function drtdump(inputPath: string, options?: DrtdumpOptions): Promise<Result<DrtdumpResult>> {\n const validation = DrtdumpOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`drtdump: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('drtdump');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('drtdump', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { drtdump };\nexport type { DrtdumpOptions, DrtdumpResult };\n","/**\n * Create a DICOM presentation state from an image using the dcmpsmk binary.\n *\n * Generates a Grayscale Softcopy Presentation State (GSPS)\n * object from a DICOM image file.\n *\n * @module dcmpsmk\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmpsmk}. */\ntype DcmpsmkOptions = ToolBaseOptions;\n\n/** Result of a successful dcmpsmk operation. */\ninterface DcmpsmkResult {\n /** Path to the created presentation state file. */\n readonly outputPath: string;\n}\n\nconst DcmpsmkOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Creates a DICOM presentation state from an image using the dcmpsmk binary.\n *\n * @param inputPath - Path to the DICOM image input file\n * @param outputPath - Path for the created presentation state output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmpsmk('/path/to/image.dcm', '/path/to/pstate.dcm');\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmpsmk(inputPath: string, outputPath: string, options?: DcmpsmkOptions): Promise<Result<DcmpsmkResult>> {\n const validation = DcmpsmkOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmpsmk: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmpsmk');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmpsmk', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmpsmk };\nexport type { DcmpsmkOptions, DcmpsmkResult };\n","/**\n * Check a DICOM presentation state for consistency using the dcmpschk binary.\n *\n * Validates a Grayscale Softcopy Presentation State (GSPS) object\n * and reports any inconsistencies or errors found.\n *\n * @module dcmpschk\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmpschk}. */\ntype DcmpschkOptions = ToolBaseOptions;\n\n/** Result of a successful dcmpschk operation. */\ninterface DcmpschkResult {\n /** The text output from dcmpschk. */\n readonly text: string;\n}\n\nconst DcmpschkOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Checks a DICOM presentation state for consistency using the dcmpschk binary.\n *\n * @param inputPath - Path to the presentation state DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the validation text output or an error\n *\n * @example\n * ```ts\n * const result = await dcmpschk('/path/to/pstate.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmpschk(inputPath: string, options?: DcmpschkOptions): Promise<Result<DcmpschkResult>> {\n const validation = DcmpschkOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmpschk: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmpschk');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmpschk', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmpschk };\nexport type { DcmpschkOptions, DcmpschkResult };\n","/**\n * Send a DICOM print job to a remote printer using the dcmprscu binary.\n *\n * @module dcmprscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isValidAETitle } from '../patterns';\n\n/** Options for {@link dcmprscu}. */\ninterface DcmprscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Path to a configuration file. Maps to -c flag. */\n readonly configFile?: string | undefined;\n}\n\n/** Result of a successful dcmprscu operation. */\ninterface DcmprscuResult {\n /** Whether the print job was sent successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst DcmprscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n configFile: z.string().min(1).optional(),\n })\n .strict();\n\n/**\n * Builds dcmprscu command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmprscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.configFile !== undefined) {\n args.push('-c', options.configFile);\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Sends a DICOM print job to a remote printer using the dcmprscu binary.\n *\n * @param options - Print options (host and port required)\n * @returns A Result containing the print result or an error\n *\n * @example\n * ```ts\n * const result = await dcmprscu({\n * host: '192.168.1.100',\n * port: 104,\n * callingAETitle: 'MYSCU',\n * calledAETitle: 'PRINTER',\n * });\n * if (result.ok) {\n * console.log(result.value.success ? 'Print sent' : 'Print failed');\n * }\n * ```\n */\nasync function dcmprscu(options: DcmprscuOptions): Promise<Result<DcmprscuResult>> {\n const validation = DcmprscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmprscu: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmprscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmprscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { dcmprscu };\nexport type { DcmprscuOptions, DcmprscuResult };\n","/**\n * Read a DICOM print job and render to printer using the dcmpsprt binary.\n *\n * @module dcmpsprt\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmpsprt}. */\ninterface DcmpsprtOptions extends ToolBaseOptions {\n /** Path to a configuration file. Maps to -c flag. */\n readonly configFile?: string | undefined;\n}\n\n/** Result of a successful dcmpsprt operation. */\ninterface DcmpsprtResult {\n /** The text output from dcmpsprt. */\n readonly text: string;\n}\n\nconst DcmpsprtOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n configFile: z.string().min(1).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmpsprt command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DcmpsprtOptions): string[] {\n const args: string[] = [];\n\n if (options?.configFile !== undefined) {\n args.push('-c', options.configFile);\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Reads a DICOM print job and renders to printer using the dcmpsprt binary.\n *\n * @param inputPath - Path to the DICOM print job file\n * @param options - Optional print options\n * @returns A Result containing the text output or an error\n *\n * @example\n * ```ts\n * const result = await dcmpsprt('/path/to/printjob.dcm', {\n * configFile: '/path/to/config.cfg',\n * });\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmpsprt(inputPath: string, options?: DcmpsprtOptions): Promise<Result<DcmpsprtResult>> {\n const validation = DcmpsprtOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmpsprt: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmpsprt');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmpsprt', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmpsprt };\nexport type { DcmpsprtOptions, DcmpsprtResult };\n","/**\n * Render a DICOM image with presentation state to a bitmap using the dcmp2pgm binary.\n *\n * @module dcmp2pgm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmp2pgm}. */\ninterface Dcmp2pgmOptions extends ToolBaseOptions {\n /** Path to a DICOM presentation state file. Maps to -p flag. */\n readonly presentationState?: string | undefined;\n /** Frame number to render (0-based). Maps to -f flag. */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcmp2pgm operation. */\ninterface Dcmp2pgmResult {\n /** Path to the rendered output file. */\n readonly outputPath: string;\n}\n\nconst Dcmp2pgmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n presentationState: z.string().min(1).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmp2pgm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dcmp2pgmOptions): string[] {\n const args: string[] = [];\n\n if (options?.presentationState !== undefined) {\n args.push('-p', options.presentationState);\n }\n\n if (options?.frame !== undefined) {\n args.push('-f', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Renders a DICOM image with presentation state to a bitmap using the dcmp2pgm binary.\n *\n * @param inputPath - Path to the DICOM input image file\n * @param outputPath - Path for the rendered output bitmap file\n * @param options - Optional rendering options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmp2pgm('/path/to/input.dcm', '/path/to/output.pgm', {\n * presentationState: '/path/to/state.dcm',\n * frame: 0,\n * });\n * if (result.ok) {\n * console.log(`Rendered: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmp2pgm(inputPath: string, outputPath: string, options?: Dcmp2pgmOptions): Promise<Result<Dcmp2pgmResult>> {\n const validation = Dcmp2pgmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmp2pgm: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmp2pgm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmp2pgm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmp2pgm };\nexport type { Dcmp2pgmOptions, Dcmp2pgmResult };\n","/**\n * Add curve data to a DICOM image using the dcmmkcrv binary.\n *\n * @module dcmmkcrv\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmmkcrv}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface DcmmkcrvOptions extends ToolBaseOptions {}\n\n/** Result of a successful dcmmkcrv operation. */\ninterface DcmmkcrvResult {\n /** Path to the output file with curve data added. */\n readonly outputPath: string;\n}\n\nconst DcmmkcrvOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Adds curve data to a DICOM image using the dcmmkcrv binary.\n *\n * @param inputPath - Path to the input curve data file\n * @param outputPath - Path for the DICOM output file with curve data\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmmkcrv('/path/to/curves.txt', '/path/to/output.dcm');\n * if (result.ok) {\n * console.log(`Curve data added: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmmkcrv(inputPath: string, outputPath: string, options?: DcmmkcrvOptions): Promise<Result<DcmmkcrvResult>> {\n const validation = DcmmkcrvOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmmkcrv: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmmkcrv');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmmkcrv', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmmkcrv };\nexport type { DcmmkcrvOptions, DcmmkcrvResult };\n","/**\n * Create DICOM look-up tables using the dcmmklut binary.\n *\n * @module dcmmklut\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * LUT type presets for dcmmklut.\n */\nconst LutType = {\n /** Modality LUT. */\n MODALITY: 'modality',\n /** Presentation LUT. */\n PRESENTATION: 'presentation',\n /** VOI LUT. */\n VOI: 'voi',\n} as const;\n\ntype LutTypeValue = (typeof LutType)[keyof typeof LutType];\n\nconst LUT_TYPE_FLAGS: Record<LutTypeValue, string> = {\n modality: '+Tm',\n presentation: '+Tp',\n voi: '+Tv',\n};\n\n/** Options for {@link dcmmklut}. */\ninterface DcmmklutOptions extends ToolBaseOptions {\n /** Type of LUT to create. Maps to +Tm, +Tp, or +Tv flags. */\n readonly lutType?: LutTypeValue | undefined;\n /** Gamma value for the LUT curve. Maps to +Cg flag. */\n readonly gamma?: number | undefined;\n /** Number of entries in the LUT. Maps to -e flag. */\n readonly entries?: number | undefined;\n /** Number of bits per LUT entry (8-16). Maps to -b flag. */\n readonly bits?: number | undefined;\n}\n\n/** Result of a successful dcmmklut operation. */\ninterface DcmmklutResult {\n /** Path to the created LUT output file. */\n readonly outputPath: string;\n}\n\nconst DcmmklutOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n lutType: z.enum(['modality', 'presentation', 'voi']).optional(),\n gamma: z.number().positive().optional(),\n entries: z.number().int().positive().optional(),\n bits: z.number().int().min(8).max(16).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmmklut command-line arguments from validated options.\n */\nfunction buildArgs(outputPath: string, options?: DcmmklutOptions): string[] {\n const args: string[] = [];\n\n if (options?.lutType !== undefined) {\n args.push(LUT_TYPE_FLAGS[options.lutType]);\n }\n\n if (options?.gamma !== undefined) {\n args.push('+Cg', String(options.gamma));\n }\n\n if (options?.entries !== undefined) {\n args.push('-e', String(options.entries));\n }\n\n if (options?.bits !== undefined) {\n args.push('-b', String(options.bits));\n }\n\n args.push(outputPath);\n\n return args;\n}\n\n/**\n * Creates DICOM look-up tables using the dcmmklut binary.\n *\n * @param outputPath - Path for the LUT output file\n * @param options - Optional LUT creation options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmmklut('/path/to/output.dcm', {\n * lutType: 'voi',\n * gamma: 2.2,\n * entries: 256,\n * bits: 12,\n * });\n * if (result.ok) {\n * console.log(`LUT created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmmklut(outputPath: string, options?: DcmmklutOptions): Promise<Result<DcmmklutResult>> {\n const validation = DcmmklutOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(new Error(`dcmmklut: invalid options: ${validation.error.message}`));\n }\n\n const binaryResult = resolveBinary('dcmmklut');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmmklut', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmmklut, LutType };\nexport type { DcmmklutOptions, DcmmklutResult, LutTypeValue };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/constants.ts","../src/exec.ts","../src/patterns.ts","../src/findDcmtkPath.ts","../src/tools/_resolveBinary.ts","../src/tools/_toolError.ts","../src/tools/dcm2xml.ts","../src/tools/_xmlToJson.ts","../src/tools/_repairJson.ts","../src/tools/dcm2json.ts","../src/tools/dcmdump.ts","../src/tools/dcmconv.ts","../src/tools/dcmodify.ts","../src/tools/dcmftest.ts","../src/tools/dcmgpdir.ts","../src/tools/dcmmkdir.ts","../src/tools/dcmqridx.ts","../src/tools/xml2dcm.ts","../src/tools/json2dcm.ts","../src/tools/dump2dcm.ts","../src/tools/img2dcm.ts","../src/tools/pdf2dcm.ts","../src/tools/dcm2pdf.ts","../src/tools/cda2dcm.ts","../src/tools/dcm2cda.ts","../src/tools/stl2dcm.ts","../src/tools/dcmcrle.ts","../src/tools/dcmdrle.ts","../src/tools/dcmencap.ts","../src/tools/dcmdecap.ts","../src/tools/dcmcjpeg.ts","../src/tools/dcmdjpeg.ts","../src/tools/dcmcjpls.ts","../src/tools/dcmdjpls.ts","../src/tools/dcmj2pnm.ts","../src/tools/dcm2pnm.ts","../src/tools/dcmscale.ts","../src/tools/dcmquant.ts","../src/tools/dcmdspfn.ts","../src/tools/dcod2lum.ts","../src/tools/dconvlum.ts","../src/tools/echoscu.ts","../src/tools/dcmsend.ts","../src/tools/storescu.ts","../src/tools/findscu.ts","../src/tools/movescu.ts","../src/tools/getscu.ts","../src/tools/termscu.ts","../src/tools/dsrdump.ts","../src/tools/dsr2xml.ts","../src/tools/xml2dsr.ts","../src/tools/drtdump.ts","../src/tools/dcmpsmk.ts","../src/tools/dcmpschk.ts","../src/tools/dcmprscu.ts","../src/tools/dcmpsprt.ts","../src/tools/dcmp2pgm.ts","../src/tools/dcmmkcrv.ts","../src/tools/dcmmklut.ts"],"names":["stderr","isWindows","binaryName","join","z","buildArgs","DEFAULT_DICOMDIR"],"mappings":"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","file":"tools.js","sourcesContent":["/**\n * Represents the outcome of an operation that can succeed or fail.\n *\n * @typeParam T - The type of the success value\n * @typeParam E - The type of the error (defaults to Error)\n *\n * @example\n * ```ts\n * function divide(a: number, b: number): Result<number> {\n * if (b === 0) {\n * return err(new Error('Division by zero'));\n * }\n * return ok(a / b);\n * }\n *\n * const result = divide(10, 2);\n * if (result.ok) {\n * console.log(result.value); // 5\n * } else {\n * console.error(result.error.message);\n * }\n * ```\n */\ntype Result<T, E = Error> = { readonly ok: true; readonly value: T } | { readonly ok: false; readonly error: E };\n\n/**\n * Creates a successful Result containing the given value.\n *\n * @param value - The success value to wrap\n * @returns A Result representing success\n *\n * @example\n * ```ts\n * const result = ok(42);\n * // result.ok === true, result.value === 42\n * ```\n */\nfunction ok<T>(value: T): Result<T, never> {\n return { ok: true, value };\n}\n\n/**\n * Creates a failed Result containing the given error.\n *\n * @param error - The error to wrap\n * @returns A Result representing failure\n *\n * @example\n * ```ts\n * const result = err(new Error('not found'));\n * // result.ok === false, result.error.message === 'not found'\n * ```\n */\nfunction err<E>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Exhaustive check helper for discriminated unions and switch statements.\n * Calling this in a default case ensures all variants are handled at compile time.\n *\n * @param x - A value that should be of type `never` if all cases are handled\n * @returns Never returns; always throws\n * @throws Always throws an Error indicating an unhandled case\n *\n * @example\n * ```ts\n * type Shape = { kind: 'circle' } | { kind: 'square' };\n *\n * function area(shape: Shape): number {\n * switch (shape.kind) {\n * case 'circle': return Math.PI;\n * case 'square': return 1;\n * default: assertUnreachable(shape);\n * }\n * }\n * ```\n */\nfunction assertUnreachable(x: never): never {\n throw new Error(`Exhaustive check failed: ${JSON.stringify(x)}`);\n}\n\n// ---------------------------------------------------------------------------\n// Process result types (Rule 7.1: immutable)\n// ---------------------------------------------------------------------------\n\n/**\n * The result of executing a short-lived DCMTK binary.\n * All properties are readonly to enforce immutability.\n */\ninterface DcmtkProcessResult {\n /** The captured stdout output from the process. */\n readonly stdout: string;\n /** The captured stderr output from the process. */\n readonly stderr: string;\n /** The exit code of the process (0 typically means success). */\n readonly exitCode: number;\n}\n\n// ---------------------------------------------------------------------------\n// Common option types (Rule 8.4: options objects for > 4 params)\n// ---------------------------------------------------------------------------\n\n/**\n * Options for short-lived DCMTK process execution.\n * Provides configurable timeout and abort support per Rule 4.2.\n */\ninterface ExecOptions {\n /** Working directory for the child process. */\n readonly cwd?: string | undefined;\n /** Timeout in milliseconds. Defaults to DEFAULT_TIMEOUT_MS. */\n readonly timeoutMs?: number | undefined;\n /** AbortSignal for external cancellation. */\n readonly signal?: AbortSignal | undefined;\n}\n\n/**\n * Options for spawning a DCMTK process with user-supplied arguments.\n * Uses spawn() instead of exec() to avoid shell injection (Rule 7.4).\n */\ninterface SpawnOptions extends ExecOptions {\n /** Additional environment variables merged with process.env. */\n readonly env?: Readonly<Record<string, string>> | undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Event types (Rule 8.3: discriminated unions)\n// ---------------------------------------------------------------------------\n\n/**\n * Line source discriminant for output parsing.\n */\ntype LineSource = 'stdout' | 'stderr';\n\n/**\n * A single line of output from a DCMTK process.\n */\ninterface ProcessLine {\n readonly source: LineSource;\n readonly text: string;\n}\n\n// ---------------------------------------------------------------------------\n// Result utility functions\n// ---------------------------------------------------------------------------\n\n/**\n * Transforms the success value of a Result, passing through errors unchanged.\n *\n * @param result - The Result to transform\n * @param fn - The transformation function\n * @returns A new Result with the transformed value, or the original error\n *\n * @example\n * ```ts\n * const result = ok(42);\n * const doubled = mapResult(result, x => x * 2);\n * // doubled.ok === true, doubled.value === 84\n * ```\n */\nfunction mapResult<T, U>(result: Result<T>, fn: (value: T) => U): Result<U> {\n if (result.ok) {\n return ok(fn(result.value));\n }\n return result;\n}\n\n/**\n * Extracts the success type from a Result.\n * Useful for extracting branded types from factory function returns.\n *\n * @example\n * ```ts\n * type Tag = ResultValue<ReturnType<typeof createDicomTag>>; // DicomTag\n * ```\n */\ntype ResultValue<R> = R extends Result<infer T> ? T : never;\n\nexport { ok, err, assertUnreachable, mapResult };\nexport type { Result, ResultValue, DcmtkProcessResult, ExecOptions, SpawnOptions, LineSource, ProcessLine };\n","/**\n * Application-wide constants.\n *\n * All values use `as const` assertions per Rule 3.5 (no traditional enums).\n * All bounds are documented per Rule 8.1 (bounded loops/buffers).\n *\n * @module constants\n */\n\n// ---------------------------------------------------------------------------\n// Timeouts (Rule 4.2: mandatory timeouts on all async operations)\n// ---------------------------------------------------------------------------\n\n/** Default timeout for short-lived process execution (30 seconds). */\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/** Default timeout for long-lived process startup (10 seconds). */\nconst DEFAULT_START_TIMEOUT_MS = 10_000;\n\n/** Default timeout for graceful shutdown drain (5 seconds). */\nconst DEFAULT_DRAIN_TIMEOUT_MS = 5_000;\n\n/** Default timeout for multi-line block accumulation in line parser (1 second). */\nconst DEFAULT_BLOCK_TIMEOUT_MS = 1_000;\n\n// ---------------------------------------------------------------------------\n// DICOM network constants\n// ---------------------------------------------------------------------------\n\n/** DICOM protocol default PDU sizes. */\nconst PDU_SIZE = {\n /** Default maximum PDU receive size (16 KB). */\n DEFAULT: 16_384,\n /** Minimum allowed PDU size (4 KB). */\n MIN: 4_096,\n /** Maximum allowed PDU size (128 KB). */\n MAX: 131_072,\n} as const;\n\n/** Default DICOM port used by DCMTK tools. */\nconst DEFAULT_DICOM_PORT = 104;\n\n// ---------------------------------------------------------------------------\n// Platform-specific known DCMTK install paths\n// ---------------------------------------------------------------------------\n\n/** Known DCMTK binary locations on Windows. */\nconst WINDOWS_SEARCH_PATHS = ['C:\\\\Program Files\\\\DCMTK\\\\bin', 'C:\\\\Program Files (x86)\\\\DCMTK\\\\bin', 'C:\\\\ProgramData\\\\chocolatey\\\\bin'] as const;\n\n/** Known DCMTK binary locations on Unix/macOS. */\nconst UNIX_SEARCH_PATHS = ['/usr/local/bin', '/usr/bin', '/opt/local/bin', '/opt/homebrew/bin'] as const;\n\n// ---------------------------------------------------------------------------\n// Required DCMTK binaries (minimum set for core functionality)\n// ---------------------------------------------------------------------------\n\n/** Binaries that must be present for the library to function. */\nconst REQUIRED_BINARIES = ['dcm2json', 'dcm2xml', 'dcmodify', 'dcmdump', 'dcmrecv', 'dcmsend', 'echoscu'] as const;\n\n// ---------------------------------------------------------------------------\n// Bounded limits (Rule 8.1: all loops and buffers must have upper bounds)\n// ---------------------------------------------------------------------------\n\n/** Maximum lines accumulated in multi-line block parser. */\nconst MAX_BLOCK_LINES = 1_000;\n\n/** Maximum number of event patterns a line parser can hold. */\nconst MAX_EVENT_PATTERNS = 200;\n\n/** Maximum loop iterations for iterative traversal (e.g., nested sequences). */\nconst MAX_TRAVERSAL_DEPTH = 50;\n\n/** Maximum number of operations (modifications + erasures) in a single ChangeSet. */\nconst MAX_CHANGESET_OPERATIONS = 10_000;\n\n/** Maximum bytes allowed for stdout + stderr buffering (100 MB). */\nconst MAX_OUTPUT_BYTES = 100 * 1024 * 1024;\n\nexport {\n DEFAULT_TIMEOUT_MS,\n DEFAULT_START_TIMEOUT_MS,\n DEFAULT_DRAIN_TIMEOUT_MS,\n DEFAULT_BLOCK_TIMEOUT_MS,\n PDU_SIZE,\n DEFAULT_DICOM_PORT,\n WINDOWS_SEARCH_PATHS,\n UNIX_SEARCH_PATHS,\n REQUIRED_BINARIES,\n MAX_BLOCK_LINES,\n MAX_EVENT_PATTERNS,\n MAX_TRAVERSAL_DEPTH,\n MAX_CHANGESET_OPERATIONS,\n MAX_OUTPUT_BYTES,\n};\n","/**\n * Short-lived DCMTK process execution.\n *\n * Two execution modes:\n * - `execCommand()` — convenience wrapper; uses `spawn()` internally for safety\n * - `spawnCommand()` — uses `child_process.spawn()`, safer for user-supplied values (Rule 7.4)\n *\n * Both enforce mandatory timeouts (Rule 4.2) and return `Result<DcmtkProcessResult>`.\n *\n * @module exec\n */\n\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess } from 'node:child_process';\nimport kill from 'tree-kill';\nimport type { Result, DcmtkProcessResult, ExecOptions, SpawnOptions } from './types';\nimport { ok, err } from './types';\nimport { DEFAULT_TIMEOUT_MS, MAX_OUTPUT_BYTES } from './constants';\n\n/**\n * Kills a process tree by PID. Wraps tree-kill in a promise.\n *\n * @param pid - The process ID to kill\n */\nfunction killTree(pid: number): void {\n try {\n kill(pid);\n /* v8 ignore next */\n } catch {\n // Process may already be dead — not exceptional\n }\n}\n\n/**\n * Executes a DCMTK binary as a short-lived process.\n *\n * **Security:** This function uses `child_process.spawn()` internally, passing\n * arguments as an array to avoid shell interpretation. This eliminates shell\n * injection risks regardless of argument content (Rule 7.4).\n *\n * @param binary - Full path to the DCMTK binary\n * @param args - Command-line arguments (passed directly, no shell interpolation)\n * @param options - Execution options (timeout, cwd, signal)\n * @returns A Result containing the process output or an error\n * @throws Never throws for expected failures (Rule 6.1)\n *\n * @example\n * ```ts\n * const result = await execCommand('/usr/local/bin/dcm2json', ['+ll', 'input.dcm']);\n * if (result.ok) {\n * console.log(result.value.stdout);\n * }\n * ```\n */\nasync function execCommand(binary: string, args: readonly string[], options?: ExecOptions): Promise<Result<DcmtkProcessResult>> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise(resolve => {\n const child = spawn(binary, [...args], {\n cwd: options?.cwd,\n windowsHide: true,\n signal: options?.signal,\n });\n wireSpawnListeners(child, timeoutMs, resolve);\n });\n}\n\n/**\n * Wires event listeners on a spawned child process with timeout, bounded buffering, and settle logic.\n */\nfunction wireSpawnListeners(child: ChildProcess, timeoutMs: number, resolve: (result: Result<DcmtkProcessResult>) => void): void {\n let stdout = '';\n let stderr = '';\n let settled = false;\n\n const settle = (result: Result<DcmtkProcessResult>): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n\n const timer = setTimeout(() => {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process timed out after ${timeoutMs}ms`)));\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer | string) => {\n stdout += String(chunk);\n if (stdout.length + stderr.length > MAX_OUTPUT_BYTES) {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process output exceeded ${MAX_OUTPUT_BYTES} bytes`)));\n }\n });\n\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderr += String(chunk);\n if (stdout.length + stderr.length > MAX_OUTPUT_BYTES) {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process output exceeded ${MAX_OUTPUT_BYTES} bytes`)));\n }\n });\n\n child.on('error', (error: Error) => {\n if (child.pid !== undefined && child.pid !== null) killTree(child.pid);\n settle(err(new Error(`Process error: ${error.message}`)));\n });\n\n child.on('close', (code: number | null) => {\n settle(ok({ stdout, stderr, exitCode: code ?? 1 }));\n });\n}\n\n/**\n * Executes a DCMTK binary using `child_process.spawn()`.\n *\n * Like {@link execCommand}, arguments are passed as an array to avoid shell\n * injection (Rule 7.4). This variant additionally supports custom environment\n * variables via the `env` option.\n *\n * @param binary - Full path to the DCMTK binary\n * @param args - Command-line arguments (passed directly, no shell interpolation)\n * @param options - Execution options (timeout, cwd, signal, env)\n * @returns A Result containing the process output or an error\n * @throws Never throws for expected failures (Rule 6.1)\n *\n * @example\n * ```ts\n * const result = await spawnCommand('/usr/local/bin/dcmodify', ['-m', '(0010,0010)=Smith^John', 'input.dcm']);\n * ```\n */\nasync function spawnCommand(binary: string, args: readonly string[], options?: SpawnOptions): Promise<Result<DcmtkProcessResult>> {\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise(resolve => {\n const child = spawn(binary, [...args], {\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n windowsHide: true,\n signal: options?.signal,\n });\n wireSpawnListeners(child, timeoutMs, resolve);\n });\n}\n\nexport { execCommand, spawnCommand };\n","/**\n * Shared validation regex patterns and constants.\n *\n * Centralises all DICOM-related validation patterns so that brands,\n * validation schemas, and server modules reference a single source\n * of truth rather than maintaining duplicated copies.\n *\n * @module patterns\n */\n\n// ---------------------------------------------------------------------------\n// DICOM tag and UID patterns\n// ---------------------------------------------------------------------------\n\n/** Matches a DICOM tag in `(XXXX,XXXX)` format where X is a hex digit. */\nconst DICOM_TAG_PATTERN = /^\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)$/;\n\n/** Matches a DICOM AE Title: printable ASCII excluding backslash (DICOM PS3.5 default repertoire). */\nconst AE_TITLE_PATTERN = /^[\\x20-\\x5b\\x5d-\\x7e]+$/;\n\n/**\n * Matches a dotted numeric OID (e.g. `1.2.840.10008`).\n *\n * Note: This intentionally accepts any syntactically valid dotted-numeric form.\n * DICOM PS3.5 §9.1 requires UIDs start with a non-zero root (e.g., `0.0.0` is\n * technically invalid), but real-world DICOM datasets contain such UIDs, so we\n * validate syntax only and leave semantic UID validation to the application layer.\n */\nconst UID_PATTERN = /^[0-9]+(\\.[0-9]+)*$/;\n\n/** Matches a single DICOM tag path segment with optional array index. */\nconst TAG_PATH_SEGMENT = /\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)(\\[\\d+\\])?/;\n\n/** Matches a full dot-separated DICOM tag path (e.g. `(0040,A730)[0].(0010,0010)`). */\nconst DICOM_TAG_PATH_PATTERN = new RegExp(`^${TAG_PATH_SEGMENT.source}(\\\\.${TAG_PATH_SEGMENT.source})*$`);\n\n// ---------------------------------------------------------------------------\n// Validation constants\n// ---------------------------------------------------------------------------\n\n/** Minimum length for an AE Title. */\nconst AE_TITLE_MIN_LENGTH = 1;\n\n/** Maximum length for an AE Title. */\nconst AE_TITLE_MAX_LENGTH = 16;\n\n/** Maximum length for a DICOM UID. */\nconst UID_MAX_LENGTH = 64;\n\n/** Minimum valid network port number. */\nconst PORT_MIN = 1;\n\n/** Maximum valid network port number. */\nconst PORT_MAX = 65535;\n\n// ---------------------------------------------------------------------------\n// DICOM query key patterns\n// ---------------------------------------------------------------------------\n\n/**\n * Matches a valid DICOM query key for `-k` arguments.\n *\n * Accepted formats:\n * - `XXXX,XXXX` — bare tag\n * - `XXXX,XXXX=value` — tag with value\n * - `XXXX,XXXX[0].XXXX,XXXX=value` — nested path with value\n * - `XXXX,XXXX.XXXX,XXXX=value` — dotted path with value\n *\n * The tag portion must start with a valid hex tag pair. Value after `=` is unconstrained.\n */\n// eslint-disable-next-line no-useless-escape\nconst DICOM_QUERY_KEY_PATTERN = /^[0-9A-Fa-f]{4},[0-9A-Fa-f]{4}(?:[\\[.\\]0-9A-Fa-f,]*)?(?:=.*)?$/;\n\n/**\n * Returns true if the string is a valid DICOM query key for `-k` arguments.\n */\nfunction isValidDicomKey(key: string): boolean {\n return DICOM_QUERY_KEY_PATTERN.test(key);\n}\n\n// ---------------------------------------------------------------------------\n// Path safety\n// ---------------------------------------------------------------------------\n\n/** Pattern matching `..` as a path segment (between separators, or at start/end). */\nconst PATH_TRAVERSAL_PATTERN = /(?:^|[\\\\/])\\.\\.(?:[\\\\/]|$)/;\n\n/**\n * Returns true if the string contains only valid DICOM AE Title characters.\n */\nfunction isValidAETitle(value: string): boolean {\n return AE_TITLE_PATTERN.test(value);\n}\n\n/**\n * Returns true if the path does not contain traversal sequences.\n *\n * @param p - The filesystem path to check\n * @returns `true` when the path is safe (no `..` segments)\n */\nfunction isSafePath(p: string): boolean {\n return !PATH_TRAVERSAL_PATTERN.test(p);\n}\n\nexport {\n DICOM_TAG_PATTERN,\n AE_TITLE_PATTERN,\n UID_PATTERN,\n TAG_PATH_SEGMENT,\n DICOM_TAG_PATH_PATTERN,\n AE_TITLE_MIN_LENGTH,\n AE_TITLE_MAX_LENGTH,\n UID_MAX_LENGTH,\n PORT_MIN,\n PORT_MAX,\n DICOM_QUERY_KEY_PATTERN,\n isValidDicomKey,\n isValidAETitle,\n PATH_TRAVERSAL_PATTERN,\n isSafePath,\n};\n","/**\n * Locates DCMTK binaries on the host system.\n *\n * Search order:\n * 1. `DCMTK_PATH` environment variable\n * 2. Platform-specific known install locations\n * 3. System PATH (via `which`/`where` lookup)\n *\n * @module findDcmtkPath\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { Result } from './types';\nimport { ok, err } from './types';\nimport { WINDOWS_SEARCH_PATHS, UNIX_SEARCH_PATHS, REQUIRED_BINARIES } from './constants';\nimport { isSafePath } from './patterns';\n\n/** Cached path result. Cleared only by passing `noCache: true`. */\nlet cachedPath: string | undefined;\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Returns the binary filename with platform-appropriate extension.\n *\n * @param name - The base binary name (e.g., `\"dcm2json\"`)\n * @returns The binary name with `.exe` appended on Windows\n */\nfunction binaryName(name: string): string {\n /* v8 ignore next -- platform-specific branch */\n return isWindows ? `${name}.exe` : name;\n}\n\n/**\n * Checks whether a directory contains all required DCMTK binaries.\n *\n * @param dir - The directory to check\n * @returns `true` if all required binaries exist in the directory\n */\nfunction hasRequiredBinaries(dir: string): boolean {\n for (const bin of REQUIRED_BINARIES) {\n if (!existsSync(join(dir, binaryName(bin)))) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Attempts to locate a binary via the system PATH using `which` (Unix) or `where` (Windows).\n *\n * @param name - The binary name to search for\n * @returns The directory containing the binary, or `undefined` if not found\n */\nfunction findViaSystemPath(name: string): string | undefined {\n try {\n /* v8 ignore next -- platform-specific branch */\n const cmd = isWindows ? `where ${binaryName(name)}` : `which ${name}`;\n const result = execSync(cmd, { encoding: 'utf-8', timeout: 5_000, windowsHide: true }).trim();\n const firstLine = result.split('\\n')[0]?.trim();\n if (firstLine) {\n /* v8 ignore next -- platform-specific branch */\n const lastSep = firstLine.lastIndexOf(isWindows ? '\\\\' : '/');\n if (lastSep >= 0) {\n return firstLine.substring(0, lastSep);\n }\n }\n } catch {\n // Binary not in PATH — this is expected, not exceptional\n }\n return undefined;\n}\n\n/**\n * Checks the DCMTK_PATH environment variable for a valid DCMTK installation.\n *\n * @returns A Result if the env var is set (success or error), or `undefined` if unset\n */\nfunction searchEnvPath(): Result<string> | undefined {\n const envPath = process.env['DCMTK_PATH'];\n if (envPath === undefined || envPath.length === 0) {\n return undefined;\n }\n if (!isSafePath(envPath)) {\n return err(new Error(`DCMTK_PATH=\"${envPath}\" contains path traversal sequences`));\n }\n if (hasRequiredBinaries(envPath)) {\n return ok(envPath);\n }\n return err(new Error(`DCMTK_PATH=\"${envPath}\" is set but required binaries are missing`));\n}\n\n/**\n * Searches platform-specific known install locations for DCMTK binaries.\n *\n * @returns The directory path if found, or `undefined`\n */\nfunction searchKnownPaths(): string | undefined {\n /* v8 ignore next -- platform-specific branch */\n const searchPaths = isWindows ? WINDOWS_SEARCH_PATHS : UNIX_SEARCH_PATHS;\n for (const candidate of searchPaths) {\n if (hasRequiredBinaries(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\n/**\n * Searches the system PATH for DCMTK binaries.\n *\n * @returns The directory path if found, or `undefined`\n */\nfunction searchSystemPath(): string | undefined {\n /* v8 ignore next -- fallback never used since REQUIRED_BINARIES is non-empty */\n const systemDir = findViaSystemPath(REQUIRED_BINARIES[0] ?? 'dcm2json');\n if (systemDir !== undefined && hasRequiredBinaries(systemDir)) {\n return systemDir;\n }\n return undefined;\n}\n\n/**\n * Options for {@link findDcmtkPath}.\n */\ninterface FindDcmtkPathOptions {\n /** Bypass the cached result and perform a fresh search. */\n readonly noCache?: boolean | undefined;\n}\n\n/**\n * Locates the directory containing DCMTK command-line binaries.\n *\n * Searches in the following order:\n * 1. `DCMTK_PATH` environment variable (if set)\n * 2. Platform-specific known install locations\n * 3. System PATH lookup via `which`/`where`\n *\n * The result is cached after the first successful call. Pass `{ noCache: true }`\n * to force a fresh search.\n *\n * @param options - Optional configuration\n * @returns A Result containing the DCMTK binary directory path, or an error if not found\n * @throws Never throws for expected failures (Rule 6.1)\n *\n * @example\n * ```ts\n * const result = findDcmtkPath();\n * if (result.ok) {\n * console.log(`DCMTK found at: ${result.value}`);\n * } else {\n * console.error(result.error.message);\n * }\n * ```\n */\nfunction findDcmtkPath(options?: FindDcmtkPathOptions): Result<string> {\n if (cachedPath !== undefined && !options?.noCache) {\n return ok(cachedPath);\n }\n\n const envResult = searchEnvPath();\n if (envResult !== undefined) {\n if (envResult.ok) {\n cachedPath = envResult.value;\n }\n return envResult;\n }\n\n const knownPath = searchKnownPaths();\n if (knownPath !== undefined) {\n cachedPath = knownPath;\n return ok(knownPath);\n }\n\n const systemPath = searchSystemPath();\n if (systemPath !== undefined) {\n cachedPath = systemPath;\n return ok(systemPath);\n }\n\n return err(\n new Error(\n 'DCMTK binaries not found. Install DCMTK and either:\\n' +\n ' - Set the DCMTK_PATH environment variable, or\\n' +\n ' - Install DCMTK to a standard location, or\\n' +\n ' - Ensure DCMTK binaries are on the system PATH'\n )\n );\n}\n\n/**\n * Clears the cached DCMTK path. Primarily for testing.\n */\nfunction clearDcmtkPathCache(): void {\n cachedPath = undefined;\n}\n\nexport { findDcmtkPath, clearDcmtkPathCache };\nexport type { FindDcmtkPathOptions };\n","/**\n * Resolves the full path to a DCMTK binary.\n *\n * Wraps {@link findDcmtkPath} + `path.join` and appends `.exe` on Windows.\n *\n * @module _resolveBinary\n * @internal\n */\n\nimport { join } from 'node:path';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { findDcmtkPath } from '../findDcmtkPath';\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Resolves the full filesystem path to a named DCMTK binary.\n *\n * @param toolName - The DCMTK binary name (e.g., \"dcm2xml\")\n * @returns A Result containing the full binary path or an error if DCMTK is not found\n */\nfunction resolveBinary(toolName: string): Result<string> {\n const pathResult = findDcmtkPath();\n if (!pathResult.ok) {\n return err(pathResult.error);\n }\n /* v8 ignore next -- platform-specific branch */\n const binaryName = isWindows ? `${toolName}.exe` : toolName;\n return ok(join(pathResult.value, binaryName));\n}\n\nexport { resolveBinary };\n","/**\n * Standardized error factory for tool wrappers.\n *\n * Produces consistent error messages that include the tool name, sanitized\n * arguments (truncated), exit code, and a stderr excerpt.\n *\n * @module _toolError\n * @internal\n */\n\n/** Maximum length for the arguments portion of the error message. */\nconst MAX_ARGS_LENGTH = 200;\n\n/** Maximum length for the stderr excerpt in the error message. */\nconst MAX_STDERR_LENGTH = 500;\n\n/**\n * Truncates a string to a maximum length, appending \"...\" if truncated.\n *\n * @param value - The string to truncate\n * @param maxLength - The maximum allowed length\n * @returns The original string or a truncated version\n */\nfunction truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return `${value.substring(0, maxLength)}...`;\n}\n\n/**\n * Creates a standardized Error for a tool wrapper failure.\n *\n * **Privacy note:** Arguments are included in the error message for debugging.\n * These may contain file paths. Callers exposing errors to end users or external\n * logs should sanitize sensitive paths before display.\n *\n * @param toolName - The DCMTK binary name (e.g., \"dcm2xml\")\n * @param args - The command-line arguments passed to the tool\n * @param exitCode - The process exit code\n * @param stderr - The captured stderr output\n * @returns An Error with a descriptive message\n */\nfunction createToolError(toolName: string, args: readonly string[], exitCode: number, stderr: string): Error {\n const argsStr = truncate(args.join(' '), MAX_ARGS_LENGTH);\n const stderrStr = truncate(stderr.trim(), MAX_STDERR_LENGTH);\n const parts = [`${toolName} failed (exit code ${String(exitCode)})`];\n if (argsStr.length > 0) {\n parts.push(`args: ${argsStr}`);\n }\n if (stderrStr.length > 0) {\n parts.push(`stderr: ${stderrStr}`);\n }\n return new Error(parts.join(' | '));\n}\n\n/**\n * Formats a Zod validation error into a concise, human-readable string.\n *\n * Flattens nested Zod issues into `field: message` pairs, producing\n * cleaner output than the raw Zod `.message` JSON string.\n *\n * @param toolName - The DCMTK tool name for context\n * @param zodError - The Zod error object (must have `.issues` array)\n * @returns A formatted Error\n */\nfunction createValidationError(\n toolName: string,\n zodError: { readonly issues: ReadonlyArray<{ readonly path: ReadonlyArray<PropertyKey>; readonly message: string }> }\n): Error {\n const parts: string[] = [];\n for (let i = 0; i < zodError.issues.length; i++) {\n const issue = zodError.issues[i];\n /* v8 ignore next */\n if (issue === undefined) continue;\n const path = issue.path.length > 0 ? issue.path.map(String).join('.') : '(root)';\n parts.push(`${path}: ${issue.message}`);\n }\n const detail = parts.length > 0 ? parts.join('; ') : 'unknown validation error';\n return new Error(`${toolName}: invalid options — ${detail}`);\n}\n\nexport { createToolError, createValidationError, truncate, MAX_ARGS_LENGTH, MAX_STDERR_LENGTH };\n","/**\n * DICOM to XML conversion using the dcm2xml binary.\n *\n * Converts a DICOM file to the DCMTK Native DICOM Model XML format.\n *\n * @module dcm2xml\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Charset handling modes for dcm2xml.\n */\nconst Dcm2xmlCharset = {\n /** Use UTF-8 encoding (default). */\n UTF8: 'utf8',\n /** Use Latin-1 encoding. */\n LATIN1: 'latin1',\n /** Use ASCII encoding. */\n ASCII: 'ascii',\n} as const;\n\ntype Dcm2xmlCharsetValue = (typeof Dcm2xmlCharset)[keyof typeof Dcm2xmlCharset];\n\n/** Options for {@link dcm2xml}. */\ninterface Dcm2xmlOptions extends ToolBaseOptions {\n /** Include namespace declaration in XML output. Defaults to false. */\n readonly namespace?: boolean | undefined;\n /** Character set for XML output. Defaults to 'utf8'. */\n readonly charset?: Dcm2xmlCharsetValue | undefined;\n /** Write binary data to XML (base64 encoded). Defaults to false. */\n readonly writeBinaryData?: boolean | undefined;\n /** Encode binary data inline instead of referencing external files. Defaults to true when writeBinaryData is true. */\n readonly encodeBinaryBase64?: boolean | undefined;\n}\n\n/** Result of a successful dcm2xml conversion. */\ninterface Dcm2xmlResult {\n /** The XML output string in DCMTK Native DICOM Model format. */\n readonly xml: string;\n}\n\nconst Dcm2xmlOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n namespace: z.boolean().optional(),\n charset: z.enum(['utf8', 'latin1', 'ascii']).optional(),\n writeBinaryData: z.boolean().optional(),\n encodeBinaryBase64: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcm2xml command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, options?: Dcm2xmlOptions): string[] {\n const args: string[] = [];\n\n if (options?.namespace === true) {\n args.push('+Xn');\n }\n\n if (options?.charset === 'latin1') {\n args.push('+Cl');\n } else if (options?.charset === 'ascii') {\n args.push('+Ca');\n }\n\n if (options?.writeBinaryData === true) {\n args.push('+Wb');\n if (options.encodeBinaryBase64 !== false) {\n args.push('+Eb');\n }\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Converts a DICOM file to XML using the dcm2xml binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Conversion options\n * @returns A Result containing the XML string or an error\n *\n * @example\n * ```ts\n * const result = await dcm2xml('/path/to/study.dcm');\n * if (result.ok) {\n * console.log(result.value.xml);\n * }\n * ```\n */\nasync function dcm2xml(inputPath: string, options?: Dcm2xmlOptions): Promise<Result<Dcm2xmlResult>> {\n const validation = Dcm2xmlOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcm2xml', validation.error));\n }\n\n const binaryResult = resolveBinary('dcm2xml');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2xml', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ xml: result.value.stdout });\n}\n\nexport { dcm2xml, Dcm2xmlCharset };\nexport type { Dcm2xmlOptions, Dcm2xmlResult, Dcm2xmlCharsetValue };\n","/**\n * Converts dcm2xml \"Native DICOM Model\" XML into the DICOM JSON Model (PS3.18 F.2).\n *\n * dcm2xml outputs XML in the DCMTK native format:\n * ```xml\n * <NativeDicomModel>\n * <DicomAttribute tag=\"00100010\" vr=\"PN\" keyword=\"PatientName\">\n * <PersonName number=\"1\">\n * <Alphabetic><FamilyName>Smith</FamilyName></Alphabetic>\n * </PersonName>\n * </DicomAttribute>\n * <DicomAttribute tag=\"00100020\" vr=\"LO\" keyword=\"PatientID\">\n * <Value number=\"1\">12345</Value>\n * </DicomAttribute>\n * </NativeDicomModel>\n * ```\n *\n * The DICOM JSON Model output:\n * ```json\n * {\n * \"00100010\": { \"vr\": \"PN\", \"Value\": [{\"Alphabetic\": \"Smith\"}] },\n * \"00100020\": { \"vr\": \"LO\", \"Value\": [\"12345\"] }\n * }\n * ```\n *\n * @module _xmlToJson\n * @internal\n */\n\nimport { XMLParser } from 'fast-xml-parser';\nimport { stderr } from 'stderr-lib';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\n\n/** DICOM JSON Model element. */\ninterface DicomJsonElement {\n readonly vr: string;\n readonly Value?: ReadonlyArray<unknown>;\n readonly InlineBinary?: string;\n readonly BulkDataURI?: string;\n}\n\n/** Mutable builder for DicomJsonElement during conversion. */\ninterface ElementBuilder {\n vr: string;\n Value?: unknown[];\n InlineBinary?: string;\n BulkDataURI?: string;\n}\n\n/** DICOM JSON Model top-level object. */\ntype DicomJsonModel = Record<string, DicomJsonElement>;\n\n/** Parsed XML attribute node from fast-xml-parser. */\ninterface XmlDicomAttribute {\n readonly '@_tag': string;\n readonly '@_vr': string;\n readonly '@_keyword'?: string;\n readonly Value?: unknown;\n readonly PersonName?: unknown;\n readonly InlineBinary?: unknown;\n readonly BulkDataURI?: unknown;\n readonly Item?: unknown;\n}\n\n/** Person name components from XML. */\ninterface XmlPersonNameComponent {\n readonly FamilyName?: string;\n readonly GivenName?: string;\n readonly MiddleName?: string;\n readonly NamePrefix?: string;\n readonly NameSuffix?: string;\n}\n\n/** PN representation types. */\ntype PnRepType = 'Alphabetic' | 'Ideographic' | 'Phonetic';\nconst PN_REPS: readonly PnRepType[] = ['Alphabetic', 'Ideographic', 'Phonetic'];\n\nconst ARRAY_TAG_NAMES = new Set(['DicomAttribute', 'Value', 'PersonName', 'Item']);\n\n/**\n * The 34 standard DICOM VR codes (PS3.5 Table 6.2-1).\n * Used to validate VR values from DCMTK XML output. Unrecognized VRs\n * (e.g. retired/internal codes like \"xs\", \"ox\") fall back to 'UN'.\n */\nconst KNOWN_VR_CODES = new Set([\n 'AE',\n 'AS',\n 'AT',\n 'CS',\n 'DA',\n 'DS',\n 'DT',\n 'FD',\n 'FL',\n 'IS',\n 'LO',\n 'LT',\n 'OB',\n 'OD',\n 'OF',\n 'OL',\n 'OV',\n 'OW',\n 'PN',\n 'SH',\n 'SL',\n 'SQ',\n 'SS',\n 'ST',\n 'SV',\n 'TM',\n 'UC',\n 'UI',\n 'UL',\n 'UN',\n 'UR',\n 'US',\n 'UT',\n 'UV',\n]);\n\n/**\n * Builds a PN string from name components.\n */\nfunction buildPnString(comp: XmlPersonNameComponent): string {\n const parts = [comp.FamilyName ?? '', comp.GivenName ?? '', comp.MiddleName ?? '', comp.NamePrefix ?? '', comp.NameSuffix ?? ''];\n let last = parts.length - 1;\n for (; last >= 0; last--) {\n if (parts[last] !== '') break;\n }\n return parts.slice(0, last + 1).join('^');\n}\n\n/** Ensures a value is an array. */\nfunction toArray(val: unknown): readonly unknown[] {\n if (Array.isArray(val)) return val;\n if (val === undefined || val === null) return [];\n return [val];\n}\n\n/**\n * Converts a PersonName XML element to DICOM JSON PN format.\n */\nfunction convertPersonName(pnNode: unknown): Record<string, string> {\n const result: Record<string, string> = {};\n /* v8 ignore next -- defensive guard for malformed XML */\n if (typeof pnNode !== 'object' || pnNode === null) return result;\n const pn = pnNode as Record<string, unknown>;\n\n for (const rep of PN_REPS) {\n const repNode = pn[rep];\n if (repNode !== undefined && typeof repNode === 'object' && repNode !== null) {\n const str = buildPnString(repNode as XmlPersonNameComponent);\n if (str.length > 0) {\n result[rep] = str;\n }\n }\n }\n return result;\n}\n\n/** Safely converts an unknown value to a string without risking [object Object]. */\nfunction safeString(val: unknown): string {\n if (typeof val === 'string') return val;\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n /* v8 ignore next */\n return '';\n}\n\n/** Handles InlineBinary elements. */\nfunction convertInlineBinary(attr: XmlDicomAttribute, element: ElementBuilder): void {\n element.InlineBinary = safeString(attr.InlineBinary);\n}\n\n/** Handles BulkDataURI elements. */\nfunction convertBulkDataURI(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const bulkArray = toArray(attr.BulkDataURI);\n const firstBulk = bulkArray[0];\n if (typeof firstBulk === 'object' && firstBulk !== null && '@_uri' in firstBulk) {\n element.BulkDataURI = safeString((firstBulk as Record<string, unknown>)['@_uri']);\n } else {\n element.BulkDataURI = safeString(firstBulk);\n }\n}\n\n/** Handles PersonName (PN VR) elements. */\nfunction convertPNValue(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const pnArray = toArray(attr.PersonName);\n const values: Record<string, string>[] = [];\n for (const pn of pnArray) {\n values.push(convertPersonName(pn));\n }\n if (values.length > 0) element.Value = values;\n}\n\n/** Handles Sequence (SQ) elements. */\nfunction convertSequence(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const items = toArray(attr.Item);\n const values: DicomJsonModel[] = [];\n for (const item of items) {\n /* v8 ignore next -- defensive guard for malformed XML */\n if (typeof item !== 'object' || item === null) continue;\n values.push(convertAttributes(item as Record<string, unknown>));\n }\n if (values.length > 0) element.Value = values;\n}\n\n/** Handles regular Value elements. */\nfunction convertRegularValue(attr: XmlDicomAttribute, element: ElementBuilder): void {\n const valArray = toArray(attr.Value);\n const values: unknown[] = [];\n for (const v of valArray) {\n if (typeof v === 'object' && v !== null && '#text' in v) {\n values.push((v as Record<string, unknown>)['#text']);\n } else {\n values.push(v);\n }\n }\n if (values.length > 0) element.Value = values;\n}\n\n/**\n * Converts a single DicomAttribute XML element to its DICOM JSON element.\n */\nfunction convertElement(attr: XmlDicomAttribute): DicomJsonElement {\n const rawVr = attr['@_vr'];\n const vr = KNOWN_VR_CODES.has(rawVr) ? rawVr : 'UN';\n const element: ElementBuilder = { vr };\n\n if (attr.InlineBinary !== undefined) {\n convertInlineBinary(attr, element);\n } else if (attr.BulkDataURI !== undefined) {\n convertBulkDataURI(attr, element);\n } else if (element.vr === 'PN' && attr.PersonName !== undefined) {\n convertPNValue(attr, element);\n } else if (element.vr === 'SQ' && attr.Item !== undefined) {\n convertSequence(attr, element);\n } else if (attr.Value !== undefined) {\n convertRegularValue(attr, element);\n }\n\n return Object.freeze(element) as DicomJsonElement;\n}\n\n/**\n * Converts an object containing DicomAttribute children into a DICOM JSON Model object.\n */\nfunction convertAttributes(obj: Record<string, unknown>): DicomJsonModel {\n const result: Record<string, DicomJsonElement> = {};\n const attrs = toArray(obj['DicomAttribute']);\n\n for (const attr of attrs) {\n if (typeof attr !== 'object' || attr === null) continue;\n const xmlAttr = attr as XmlDicomAttribute;\n const tag = xmlAttr['@_tag'];\n if (tag === undefined) continue;\n result[tag] = convertElement(xmlAttr);\n }\n\n return result;\n}\n\n/** XML parser configured for the DCMTK Native DICOM Model. */\nconst parser = new XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: '@_',\n parseTagValue: false,\n isArray: (name: string): boolean => ARRAY_TAG_NAMES.has(name),\n});\n\n/**\n * Converts dcm2xml XML output to DICOM JSON Model.\n *\n * @param xml - The XML string from dcm2xml\n * @returns A Result containing the DICOM JSON Model or an error\n */\nfunction xmlToJson(xml: string): Result<DicomJsonModel> {\n try {\n const parsed = parser.parse(xml) as Record<string, unknown>;\n const root = parsed['NativeDicomModel'];\n if (root === undefined) {\n return err(new Error('Invalid dcm2xml output: missing NativeDicomModel root element'));\n }\n // Empty NativeDicomModel produces an empty string from the parser\n if (typeof root !== 'object' || root === null) {\n return ok({});\n }\n return ok(convertAttributes(root as Record<string, unknown>));\n } catch (error: unknown) {\n return err(new Error(`Failed to parse dcm2xml XML: ${stderr(error).message}`));\n }\n}\n\nexport { xmlToJson };\nexport type { DicomJsonModel, DicomJsonElement };\n","/**\n * Repairs malformed JSON output from the dcm2json binary.\n *\n * DCMTK's dcm2json sometimes emits invalid JSON for numeric-string VRs\n * (DS, IS) by producing unquoted numbers in arrays:\n * ```json\n * \"Value\": [1.5, 2.0] // invalid — DS values must be strings\n * \"Value\": [\"1.5\", \"2.0\"] // valid\n * ```\n *\n * This module detects and repairs these patterns before JSON.parse.\n *\n * @module _repairJson\n * @internal\n */\n\n/**\n * Pattern matching \"Value\" arrays in DICOM JSON.\n * Captures: (prefix including `[`)(inner content)(closing `]`).\n */\nconst VALUE_ARRAY_PATTERN = /(\"Value\"\\s*:\\s*\\[)([\\s\\S]*?)(\\])/g;\n\n/**\n * Matches a bare (unquoted) numeric literal.\n * Handles integers, decimals, scientific notation, and negative values.\n */\nconst BARE_NUMBER = /^-?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][+-]?\\d+)?$/;\n\n/**\n * Quotes a bare number token, leaving already-quoted strings unchanged.\n *\n * @param token - A trimmed token from inside a Value array\n * @returns The token, quoted if it was a bare number\n */\nfunction quoteIfBareNumber(token: string): string {\n const trimmed = token.trim();\n if (BARE_NUMBER.test(trimmed)) {\n return `\"${trimmed}\"`;\n }\n return trimmed;\n}\n\n/**\n * Repairs the inner content of a \"Value\" array by quoting bare numbers.\n *\n * @param inner - The content between `[` and `]`\n * @returns Repaired content with bare numbers quoted\n */\nfunction repairInner(inner: string): string {\n const trimmed = inner.trim();\n if (trimmed.length === 0) return inner;\n\n // Split on commas that are not inside quotes\n const tokens: string[] = [];\n let current = '';\n let inString = false;\n\n for (let i = 0; i < trimmed.length; i++) {\n const ch = trimmed[i]!;\n if (ch === '\"' && (i === 0 || trimmed[i - 1] !== '\\\\')) {\n inString = !inString;\n current += ch;\n } else if (ch === ',' && !inString) {\n tokens.push(current);\n current = '';\n } else {\n current += ch;\n }\n }\n tokens.push(current);\n\n return tokens.map(quoteIfBareNumber).join(', ');\n}\n\n/**\n * Repairs malformed dcm2json output by quoting unquoted numeric values in \"Value\" arrays.\n *\n * @param raw - The raw JSON string from dcm2json\n * @returns The repaired JSON string safe for JSON.parse\n */\nfunction repairJson(raw: string): string {\n return raw.replace(VALUE_ARRAY_PATTERN, (_match, prefix: string, inner: string, suffix: string) => {\n return `${prefix}${repairInner(inner)}${suffix}`;\n });\n}\n\nexport { repairJson };\n","/**\n * DICOM to JSON conversion using a two-phase strategy.\n *\n * Primary: dcm2xml → xmlToJson (more reliable output)\n * Fallback: dcm2json binary → repairJson → JSON.parse\n *\n * The result includes a `source` discriminant indicating which strategy succeeded.\n *\n * @module dcm2json\n */\n\nimport { stderr } from 'stderr-lib';\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport { xmlToJson } from './_xmlToJson';\nimport { repairJson } from './_repairJson';\nimport type { DicomJsonModel } from './_xmlToJson';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Indicates which conversion strategy produced the result. */\ntype Dcm2jsonSource = 'xml' | 'direct';\n\n/** Options for {@link dcm2json}. */\ninterface Dcm2jsonOptions extends ToolBaseOptions {\n /** Skip the XML primary path and use direct dcm2json only. Defaults to false. */\n readonly directOnly?: boolean | undefined;\n}\n\n/** Result of a successful dcm2json conversion. */\ninterface Dcm2jsonResult {\n /** The DICOM JSON Model object. */\n readonly data: DicomJsonModel;\n /** Which conversion strategy produced this result. */\n readonly source: Dcm2jsonSource;\n}\n\nconst Dcm2jsonOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n directOnly: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Attempts XML-primary conversion: dcm2xml → xmlToJson.\n */\nasync function tryXmlPath(inputPath: string, timeoutMs: number, signal?: AbortSignal): Promise<Result<Dcm2jsonResult>> {\n const xmlBinary = resolveBinary('dcm2xml');\n if (!xmlBinary.ok) {\n return err(xmlBinary.error);\n }\n\n const xmlResult = await execCommand(xmlBinary.value, ['-nat', inputPath], { timeoutMs, signal });\n if (!xmlResult.ok) {\n return err(xmlResult.error);\n }\n\n if (xmlResult.value.exitCode !== 0) {\n return err(createToolError('dcm2xml', ['-nat', inputPath], xmlResult.value.exitCode, xmlResult.value.stderr));\n }\n\n const jsonResult = xmlToJson(xmlResult.value.stdout);\n if (!jsonResult.ok) {\n return err(jsonResult.error);\n }\n\n return ok({ data: jsonResult.value, source: 'xml' as const });\n}\n\n/**\n * Attempts direct conversion: dcm2json binary → repairJson → JSON.parse.\n */\nasync function tryDirectPath(inputPath: string, timeoutMs: number, signal?: AbortSignal): Promise<Result<Dcm2jsonResult>> {\n const jsonBinary = resolveBinary('dcm2json');\n if (!jsonBinary.ok) {\n return err(jsonBinary.error);\n }\n\n const result = await execCommand(jsonBinary.value, [inputPath], { timeoutMs, signal });\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2json', [inputPath], result.value.exitCode, result.value.stderr));\n }\n\n try {\n const repaired = repairJson(result.value.stdout);\n // Cast is safe: repairJson ensures valid DICOM JSON Model structure,\n // and JSON.parse returns `unknown` in strict TS (we narrow via caller checks).\n const data = JSON.parse(repaired) as DicomJsonModel;\n return ok({ data, source: 'direct' as const });\n } catch (parseError: unknown) {\n return err(createToolError('dcm2json', [inputPath], 1, `Parse error: ${stderr(parseError).message}`));\n }\n}\n\n/**\n * Converts a DICOM file to the DICOM JSON Model.\n *\n * Uses a two-phase strategy:\n * 1. Primary: dcm2xml → XML-to-JSON conversion (more reliable)\n * 2. Fallback: direct dcm2json binary with JSON repair\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Conversion options\n * @returns A Result containing the DICOM JSON Model with source discriminant\n *\n * @example\n * ```ts\n * const result = await dcm2json('/path/to/study.dcm');\n * if (result.ok) {\n * console.log(result.value.source); // 'xml' or 'direct'\n * console.log(result.value.data['00100010']); // Patient Name\n * }\n * ```\n */\nasync function dcm2json(inputPath: string, options?: Dcm2jsonOptions): Promise<Result<Dcm2jsonResult>> {\n const validation = Dcm2jsonOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcm2json', validation.error));\n }\n\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const signal = options?.signal;\n\n // Direct-only mode: skip XML path\n if (options?.directOnly === true) {\n return tryDirectPath(inputPath, timeoutMs, signal);\n }\n\n // Try XML path first\n const xmlResult = await tryXmlPath(inputPath, timeoutMs, signal);\n if (xmlResult.ok) {\n return xmlResult;\n }\n\n // Fall back to direct path\n return tryDirectPath(inputPath, timeoutMs, signal);\n}\n\nexport { dcm2json };\nexport type { Dcm2jsonOptions, Dcm2jsonResult, Dcm2jsonSource, DicomJsonModel };\n","/**\n * Dump DICOM metadata as text using the dcmdump binary.\n *\n * @module dcmdump\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Output format for dcmdump.\n */\nconst DcmdumpFormat = {\n /** Print standard DCMTK format. */\n STANDARD: 'standard',\n /** Print tag and value only. */\n SHORT: 'short',\n} as const;\n\ntype DcmdumpFormatValue = (typeof DcmdumpFormat)[keyof typeof DcmdumpFormat];\n\n/** Options for {@link dcmdump}. */\ninterface DcmdumpOptions extends ToolBaseOptions {\n /** Output format. Defaults to 'standard'. */\n readonly format?: DcmdumpFormatValue | undefined;\n /** Print all tags including private tags. Defaults to false. */\n readonly allTags?: boolean | undefined;\n /** Search for a specific tag. */\n readonly searchTag?: string | undefined;\n /** Print tag values with enhanced detail. Defaults to false. */\n readonly printValues?: boolean | undefined;\n}\n\n/** Result of a successful dcmdump operation. */\ninterface DcmdumpResult {\n /** The text output from dcmdump. */\n readonly text: string;\n}\n\nconst DcmdumpOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n format: z.enum(['standard', 'short']).optional(),\n allTags: z.boolean().optional(),\n searchTag: z\n .string()\n .regex(/^\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)$/)\n .optional(),\n printValues: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdump command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DcmdumpOptions): string[] {\n const args: string[] = [];\n\n if (options?.format === 'short') {\n args.push('+L');\n }\n\n if (options?.allTags === true) {\n args.push('+P', 'all');\n }\n\n if (options?.searchTag !== undefined) {\n // Strip parentheses: dcmdump expects \"gggg,eeee\" not \"(gggg,eeee)\"\n const tag = options.searchTag.replace(/[()]/g, '');\n args.push('+P', tag);\n }\n\n if (options?.printValues === true) {\n args.push('+Vr');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Dumps DICOM metadata as text using the dcmdump binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param options - Dump options\n * @returns A Result containing the text dump or an error\n *\n * @example\n * ```ts\n * const result = await dcmdump('/path/to/study.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmdump(inputPath: string, options?: DcmdumpOptions): Promise<Result<DcmdumpResult>> {\n const validation = DcmdumpOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmdump', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmdump');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdump', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmdump, DcmdumpFormat };\nexport type { DcmdumpOptions, DcmdumpResult, DcmdumpFormatValue };\n","/**\n * Convert DICOM file encoding/transfer syntax using the dcmconv binary.\n *\n * @module dcmconv\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Transfer syntax presets for dcmconv.\n */\nconst TransferSyntax = {\n /** Implicit VR Little Endian. */\n IMPLICIT_LITTLE: '+ti',\n /** Explicit VR Little Endian. */\n EXPLICIT_LITTLE: '+te',\n /** Explicit VR Big Endian (deprecated in DICOM). */\n EXPLICIT_BIG: '+tb',\n /** JPEG Lossless. */\n JPEG_LOSSLESS: '+tl',\n /** JPEG 2000 Lossless. */\n JPEG2K_LOSSLESS: '+t2',\n /** RLE Lossless. */\n RLE: '+tr',\n /** Deflated Explicit VR Little Endian. */\n DEFLATED: '+td',\n} as const;\n\ntype TransferSyntaxValue = (typeof TransferSyntax)[keyof typeof TransferSyntax];\n\nconst VALID_TRANSFER_SYNTAXES = ['+ti', '+te', '+tb', '+tl', '+t2', '+tr', '+td'] as const;\n\n/** Options for {@link dcmconv}. */\ninterface DcmconvOptions extends ToolBaseOptions {\n /** Target transfer syntax. Required. */\n readonly transferSyntax: TransferSyntaxValue;\n}\n\n/** Result of a successful dcmconv conversion. */\ninterface DcmconvResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst DcmconvOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n transferSyntax: z.enum(VALID_TRANSFER_SYNTAXES),\n })\n .strict();\n\n/**\n * Converts a DICOM file's transfer syntax using the dcmconv binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the converted output file\n * @param options - Conversion options (transfer syntax required)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmconv('/path/to/input.dcm', '/path/to/output.dcm', {\n * transferSyntax: '+te', // Explicit VR Little Endian\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmconv(inputPath: string, outputPath: string, options: DcmconvOptions): Promise<Result<DcmconvResult>> {\n const validation = DcmconvOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmconv', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmconv');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [options.transferSyntax, inputPath, outputPath];\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmconv', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmconv, TransferSyntax };\nexport type { DcmconvOptions, DcmconvResult, TransferSyntaxValue };\n","/**\n * Modify DICOM tags using the dcmodify binary.\n *\n * Uses spawnCommand instead of execCommand because user-supplied DICOM values\n * could contain shell metacharacters. Spawn passes args as an array with no\n * shell interpolation (Rule 7.4).\n *\n * @module dcmodify\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { spawnCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** A single tag modification. */\ninterface TagModification {\n /** DICOM tag to modify, e.g. \"(0010,0010)\". */\n readonly tag: string;\n /** New value for the tag. */\n readonly value: string;\n}\n\n/** Options for {@link dcmodify}. */\ninterface DcmodifyOptions extends ToolBaseOptions {\n /** Tag modifications to apply. */\n readonly modifications?: readonly TagModification[] | undefined;\n /** Tag paths to erase (passed as `-e path`). */\n readonly erasures?: readonly string[] | undefined;\n /** Erase all private tags (uses `-ep` flag). */\n readonly erasePrivateTags?: boolean | undefined;\n /** Do not create backup (.bak) file. Defaults to true. */\n readonly noBackup?: boolean | undefined;\n /** Insert tag if it doesn't exist (uses -i flag). Defaults to false. */\n readonly insertIfMissing?: boolean | undefined;\n /** Treat 'tag not found' as success when erasing (uses -imt flag). Defaults to false. */\n readonly ignoreMissingTags?: boolean | undefined;\n}\n\n/** Result of a successful dcmodify operation. */\ninterface DcmodifyResult {\n /** Path to the modified DICOM file. */\n readonly filePath: string;\n}\n\n/** Matches a single tag or a dotted tag path: (XXXX,XXXX) or (XXXX,XXXX)[N].(XXXX,XXXX) */\nconst TAG_OR_PATH_PATTERN = /^\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)(\\[\\d+\\](\\.\\([0-9A-Fa-f]{4},[0-9A-Fa-f]{4}\\)(\\[\\d+\\])?)*)?$/;\n\nconst TagModificationSchema = z.object({\n tag: z.string().regex(TAG_OR_PATH_PATTERN),\n value: z.string(),\n});\n\nconst DcmodifyOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n modifications: z.array(TagModificationSchema).optional().default([]),\n erasures: z.array(z.string()).optional(),\n erasePrivateTags: z.boolean().optional(),\n noBackup: z.boolean().optional(),\n insertIfMissing: z.boolean().optional(),\n ignoreMissingTags: z.boolean().optional(),\n })\n .strict()\n .refine(data => data.modifications.length > 0 || (data.erasures !== undefined && data.erasures.length > 0) || data.erasePrivateTags === true, {\n message: 'At least one of modifications, erasures, or erasePrivateTags is required',\n });\n\n/**\n * Builds dcmodify command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options: DcmodifyOptions): string[] {\n const args: string[] = [];\n\n if (options.noBackup !== false) {\n args.push('-nb');\n }\n\n if (options.ignoreMissingTags === true) {\n args.push('-imt');\n }\n\n const flag = options.insertIfMissing === true ? '-i' : '-m';\n const modifications = options.modifications ?? [];\n\n for (const mod of modifications) {\n args.push(flag, `${mod.tag}=${mod.value}`);\n }\n\n if (options.erasures !== undefined) {\n for (const erasure of options.erasures) {\n args.push('-e', erasure);\n }\n }\n\n if (options.erasePrivateTags === true) {\n args.push('-ep');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Modifies DICOM tags in a file using the dcmodify binary.\n *\n * Uses spawn (not exec) for safety with user-supplied values.\n *\n * @param inputPath - Path to the DICOM file to modify (modified in-place)\n * @param options - Modification options\n * @returns A Result containing the file path or an error\n *\n * @example\n * ```ts\n * const result = await dcmodify('/path/to/study.dcm', {\n * modifications: [\n * { tag: '(0010,0010)', value: 'Anonymous' },\n * { tag: '(0010,0020)', value: 'ANON001' },\n * ],\n * });\n * ```\n */\nasync function dcmodify(inputPath: string, options: DcmodifyOptions): Promise<Result<DcmodifyResult>> {\n const validation = DcmodifyOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmodify', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmodify');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await spawnCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmodify', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ filePath: inputPath });\n}\n\nexport { dcmodify };\nexport type { DcmodifyOptions, DcmodifyResult, TagModification };\n","/**\n * Test if a file is a valid DICOM Part 10 file using the dcmftest binary.\n *\n * @module dcmftest\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmftest}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface DcmftestOptions extends ToolBaseOptions {}\n\n/** Result of a successful dcmftest check. */\ninterface DcmftestResult {\n /** Whether the tested file is a valid DICOM Part 10 file. */\n readonly isDicom: boolean;\n}\n\nconst DcmftestOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Tests whether a file is a valid DICOM Part 10 file using the dcmftest binary.\n *\n * The dcmftest binary always returns exit code 0 regardless of result.\n * The determination is made by parsing stdout for \"yes:\" (DICOM) or \"no:\" (not DICOM).\n *\n * @param inputPath - Path to the file to test\n * @param options - Test options\n * @returns A Result containing the isDicom flag or an error\n *\n * @example\n * ```ts\n * const result = await dcmftest('/path/to/file.dcm');\n * if (result.ok) {\n * console.log(result.value.isDicom ? 'Valid DICOM' : 'Not DICOM');\n * }\n * ```\n */\nasync function dcmftest(inputPath: string, options?: DcmftestOptions): Promise<Result<DcmftestResult>> {\n const validation = DcmftestOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmftest', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmftest');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n // Defensive: dcmftest always returns exit code 0 regardless of whether the\n // file is valid DICOM. Kept for safety in case future DCMTK versions change.\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmftest', args, result.value.exitCode, result.value.stderr));\n }\n\n const isDicom = result.value.stdout.includes('yes:');\n return ok({ isDicom });\n}\n\nexport { dcmftest };\nexport type { DcmftestOptions, DcmftestResult };\n","/**\n * Create a DICOMDIR file from DICOM files using the dcmgpdir binary.\n *\n * @module dcmgpdir\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Default output filename when no outputFile is specified. */\nconst DEFAULT_DICOMDIR = 'DICOMDIR';\n\n/** Options for {@link dcmgpdir}. */\ninterface DcmgpdirOptions extends ToolBaseOptions {\n /** One or more DICOM file paths to include in the DICOMDIR. */\n readonly inputFiles: readonly string[];\n /** Output DICOMDIR file path. Maps to +D flag. **Warning:** defaults to 'DICOMDIR' in the current working directory if omitted. */\n readonly outputFile?: string | undefined;\n /** File-set ID to embed in the DICOMDIR. Maps to +F flag. */\n readonly filesetId?: string | undefined;\n /** Root directory for referenced DICOM files. Maps to +id flag. */\n readonly inputDirectory?: string | undefined;\n /** Map filenames to DICOM format (uppercase, strip trailing period). Maps to +m flag. */\n readonly mapFilenames?: boolean | undefined;\n /** Invent missing DICOMDIR type 1 attributes. Maps to +I flag. */\n readonly inventAttributes?: boolean | undefined;\n}\n\n/** Result of a successful dcmgpdir operation. */\ninterface DcmgpdirResult {\n /** Path to the generated DICOMDIR file. */\n readonly outputPath: string;\n}\n\nconst DcmgpdirOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n inputFiles: z.array(z.string().min(1)).min(1),\n outputFile: z.string().min(1).optional(),\n filesetId: z.string().min(1).optional(),\n inputDirectory: z.string().min(1).optional(),\n mapFilenames: z.boolean().optional(),\n inventAttributes: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Builds dcmgpdir command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmgpdirOptions): string[] {\n const args: string[] = [];\n\n if (options.outputFile !== undefined) {\n args.push('+D', options.outputFile);\n }\n\n if (options.filesetId !== undefined) {\n args.push('+F', options.filesetId);\n }\n\n if (options.inputDirectory !== undefined) {\n args.push('+id', options.inputDirectory);\n }\n\n if (options.mapFilenames === true) {\n args.push('+m');\n }\n\n if (options.inventAttributes === true) {\n args.push('+I');\n }\n\n args.push(...options.inputFiles);\n\n return args;\n}\n\n/**\n * Creates a DICOMDIR file from DICOM files using the dcmgpdir binary.\n *\n * @param options - DICOMDIR creation options (inputFiles required)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmgpdir({\n * inputFiles: ['/path/to/file1.dcm', '/path/to/file2.dcm'],\n * outputFile: '/path/to/DICOMDIR',\n * filesetId: 'MY_FILESET',\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmgpdir(options: DcmgpdirOptions): Promise<Result<DcmgpdirResult>> {\n const validation = DcmgpdirOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmgpdir', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmgpdir');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmgpdir', args, result.value.exitCode, result.value.stderr));\n }\n\n const outputPath = options.outputFile ?? DEFAULT_DICOMDIR;\n return ok({ outputPath });\n}\n\nexport { dcmgpdir };\nexport type { DcmgpdirOptions, DcmgpdirResult };\n","/**\n * Create a DICOMDIR file from DICOM files using the dcmmkdir binary.\n *\n * @module dcmmkdir\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Default output filename when no outputFile is specified. */\nconst DEFAULT_DICOMDIR = 'DICOMDIR';\n\n/** Options for {@link dcmmkdir}. */\ninterface DcmmkdirOptions extends ToolBaseOptions {\n /** One or more DICOM file paths to include in the DICOMDIR. */\n readonly inputFiles: readonly string[];\n /** Output DICOMDIR file path. Maps to +D flag. **Warning:** defaults to 'DICOMDIR' in the current working directory if omitted. */\n readonly outputFile?: string | undefined;\n /** File-set ID to embed in the DICOMDIR. Maps to +F flag. */\n readonly filesetId?: string | undefined;\n /** Append to existing DICOMDIR. Maps to +A flag. Defaults to false. */\n readonly append?: boolean | undefined;\n /** Root directory for referenced DICOM files. Maps to +id flag. */\n readonly inputDirectory?: string | undefined;\n /** Map filenames to DICOM format (uppercase, strip trailing period). Maps to +m flag. */\n readonly mapFilenames?: boolean | undefined;\n /** Invent missing DICOMDIR type 1 attributes. Maps to +I flag. */\n readonly inventAttributes?: boolean | undefined;\n}\n\n/** Result of a successful dcmmkdir operation. */\ninterface DcmmkdirResult {\n /** Path to the generated DICOMDIR file. */\n readonly outputPath: string;\n}\n\nconst DcmmkdirOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n inputFiles: z.array(z.string().min(1)).min(1),\n outputFile: z.string().min(1).optional(),\n filesetId: z.string().min(1).optional(),\n append: z.boolean().optional(),\n inputDirectory: z.string().min(1).optional(),\n mapFilenames: z.boolean().optional(),\n inventAttributes: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Builds dcmmkdir command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmmkdirOptions): string[] {\n const args: string[] = [];\n\n if (options.outputFile !== undefined) {\n args.push('+D', options.outputFile);\n }\n\n if (options.filesetId !== undefined) {\n args.push('+F', options.filesetId);\n }\n\n if (options.inputDirectory !== undefined) {\n args.push('+id', options.inputDirectory);\n }\n\n if (options.mapFilenames === true) {\n args.push('+m');\n }\n\n if (options.inventAttributes === true) {\n args.push('+I');\n }\n\n if (options.append === true) {\n args.push('+A');\n }\n\n args.push(...options.inputFiles);\n\n return args;\n}\n\n/**\n * Creates a DICOMDIR file from DICOM files using the dcmmkdir binary.\n *\n * @param options - DICOMDIR creation options (inputFiles required)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmmkdir({\n * inputFiles: ['/path/to/file1.dcm', '/path/to/file2.dcm'],\n * outputFile: '/path/to/DICOMDIR',\n * filesetId: 'MY_FILESET',\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmmkdir(options: DcmmkdirOptions): Promise<Result<DcmmkdirResult>> {\n const validation = DcmmkdirOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmmkdir', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmmkdir');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmmkdir', args, result.value.exitCode, result.value.stderr));\n }\n\n const outputPath = options.outputFile ?? DEFAULT_DICOMDIR;\n return ok({ outputPath });\n}\n\nexport { dcmmkdir };\nexport type { DcmmkdirOptions, DcmmkdirResult };\n","/**\n * Register DICOM files in a dcmqrscp index database using the dcmqridx binary.\n *\n * @module dcmqridx\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmqridx}. */\ninterface DcmqridxOptions extends ToolBaseOptions {\n /** Storage area / index directory path (required). */\n readonly indexDirectory: string;\n /** DICOM files to register. Omit for print-only mode. */\n readonly inputFiles?: readonly string[] | undefined;\n /** List database contents (-p flag). */\n readonly print?: boolean | undefined;\n /** Mark status as \"not new\" (-n flag). */\n readonly notNew?: boolean | undefined;\n}\n\n/** Result of a successful dcmqridx operation. */\ntype DcmqridxResult = { readonly mode: 'register' } | { readonly mode: 'print'; readonly output: string };\n\nconst DcmqridxOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n indexDirectory: z.string().min(1),\n inputFiles: z.array(z.string().min(1)).min(1).optional(),\n print: z.boolean().optional(),\n notNew: z.boolean().optional(),\n })\n .strict()\n .refine(data => (data.inputFiles !== undefined && data.inputFiles.length > 0) || data.print === true, {\n message: 'Either inputFiles (non-empty) or print must be specified',\n });\n\n/**\n * Builds dcmqridx command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmqridxOptions): string[] {\n const args: string[] = [];\n\n if (options.print === true) {\n args.push('-p');\n }\n\n if (options.notNew === true) {\n args.push('-n');\n }\n\n args.push(options.indexDirectory);\n\n if (options.inputFiles !== undefined) {\n args.push(...options.inputFiles);\n }\n\n return args;\n}\n\n/**\n * Register DICOM files in a dcmqrscp index database or print database contents.\n *\n * @param options - Index operation options (indexDirectory required)\n * @returns A Result containing the operation result or an error\n */\nasync function dcmqridx(options: DcmqridxOptions): Promise<Result<DcmqridxResult>> {\n const validation = DcmqridxOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmqridx', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmqridx');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmqridx', args, result.value.exitCode, result.value.stderr));\n }\n\n if (options.print === true) {\n return ok({ mode: 'print' as const, output: result.value.stdout });\n }\n\n return ok({ mode: 'register' as const });\n}\n\nexport { dcmqridx };\nexport type { DcmqridxOptions, DcmqridxResult };\n","/**\n * Convert an XML file to DICOM format using the xml2dcm binary.\n *\n * @module xml2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link xml2dcm}. */\ninterface Xml2dcmOptions extends ToolBaseOptions {\n /** Generate new Study/Series/SOP Instance UIDs. Defaults to false. */\n readonly generateNewUIDs?: boolean | undefined;\n /** Validate the XML document. Defaults to false. */\n readonly validateDocument?: boolean | undefined;\n}\n\n/** Result of a successful xml2dcm conversion. */\ninterface Xml2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Xml2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n generateNewUIDs: z.boolean().optional(),\n validateDocument: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds xml2dcm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Xml2dcmOptions): string[] {\n const args: string[] = [];\n\n if (options?.generateNewUIDs === true) {\n args.push('+Ug');\n }\n\n if (options?.validateDocument === true) {\n args.push('+Vd');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts an XML file to DICOM format using the xml2dcm binary.\n *\n * @param inputPath - Path to the XML input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await xml2dcm('/path/to/input.xml', '/path/to/output.dcm', {\n * generateNewUIDs: true,\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function xml2dcm(inputPath: string, outputPath: string, options?: Xml2dcmOptions): Promise<Result<Xml2dcmResult>> {\n const validation = Xml2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('xml2dcm', validation.error));\n }\n\n const binaryResult = resolveBinary('xml2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('xml2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { xml2dcm };\nexport type { Xml2dcmOptions, Xml2dcmResult };\n","/**\n * Convert a JSON file to DICOM format using the json2dcm binary.\n *\n * @module json2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link json2dcm}. */\ntype Json2dcmOptions = ToolBaseOptions;\n\n/** Result of a successful json2dcm conversion. */\ninterface Json2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Json2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Converts a JSON file to DICOM format using the json2dcm binary.\n *\n * @param inputPath - Path to the JSON input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options (timeout, signal)\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await json2dcm('/path/to/input.json', '/path/to/output.dcm');\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function json2dcm(inputPath: string, outputPath: string, options?: Json2dcmOptions): Promise<Result<Json2dcmResult>> {\n const validation = Json2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('json2dcm', validation.error));\n }\n\n const binaryResult = resolveBinary('json2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('json2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { json2dcm };\nexport type { Json2dcmOptions, Json2dcmResult };\n","/**\n * Convert a dump file to DICOM format using the dump2dcm binary.\n *\n * @module dump2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dump2dcm}. */\ninterface Dump2dcmOptions extends ToolBaseOptions {\n /** Generate new Study/Series/SOP Instance UIDs. Defaults to false. */\n readonly generateNewUIDs?: boolean | undefined;\n /** Write output as DICOM file format (with preamble + meta header). Defaults to false. */\n readonly writeFileFormat?: boolean | undefined;\n}\n\n/** Result of a successful dump2dcm conversion. */\ninterface Dump2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Dump2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n generateNewUIDs: z.boolean().optional(),\n writeFileFormat: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dump2dcm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dump2dcmOptions): string[] {\n const args: string[] = [];\n\n if (options?.generateNewUIDs === true) {\n args.push('+Ug');\n }\n\n if (options?.writeFileFormat === true) {\n args.push('-F');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts a dump file to DICOM format using the dump2dcm binary.\n *\n * @param inputPath - Path to the dump input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dump2dcm('/path/to/input.dump', '/path/to/output.dcm', {\n * generateNewUIDs: true,\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dump2dcm(inputPath: string, outputPath: string, options?: Dump2dcmOptions): Promise<Result<Dump2dcmResult>> {\n const validation = Dump2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dump2dcm', validation.error));\n }\n\n const binaryResult = resolveBinary('dump2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dump2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dump2dcm };\nexport type { Dump2dcmOptions, Dump2dcmResult };\n","/**\n * Convert an image file to DICOM format using the img2dcm binary.\n *\n * @module img2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Supported input image formats for img2dcm.\n */\nconst Img2dcmInputFormat = {\n /** JPEG image. */\n JPEG: 'jpeg',\n /** BMP image. */\n BMP: 'bmp',\n} as const;\n\ntype Img2dcmInputFormatValue = (typeof Img2dcmInputFormat)[keyof typeof Img2dcmInputFormat];\n\n/** Options for {@link img2dcm}. */\ninterface Img2dcmOptions extends ToolBaseOptions {\n /** Input image format. Maps to `-i JPEG` or `-i BMP`. */\n readonly inputFormat?: Img2dcmInputFormatValue | undefined;\n /** Path to a DICOM dataset file to copy attributes from. Maps to `-df path`. */\n readonly datasetFrom?: string | undefined;\n}\n\n/** Result of a successful img2dcm conversion. */\ninterface Img2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Img2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n inputFormat: z.enum(['jpeg', 'bmp']).optional(),\n datasetFrom: z.string().min(1).optional(),\n })\n .strict()\n .optional();\n\n/** Maps input format values to the CLI flag expected by dcmtk 3.7.0+. */\nconst FORMAT_FLAG_MAP: Record<Img2dcmInputFormatValue, string> = {\n jpeg: 'JPEG',\n bmp: 'BMP',\n};\n\n/**\n * Builds img2dcm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Img2dcmOptions): string[] {\n const args: string[] = [];\n\n if (options?.inputFormat !== undefined) {\n args.push('-i', FORMAT_FLAG_MAP[options.inputFormat]);\n }\n\n if (options?.datasetFrom !== undefined) {\n args.push('-df', options.datasetFrom);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts an image file to DICOM format using the img2dcm binary.\n *\n * @param inputPath - Path to the image input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await img2dcm('/path/to/photo.jpg', '/path/to/output.dcm', {\n * inputFormat: 'jpeg',\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function img2dcm(inputPath: string, outputPath: string, options?: Img2dcmOptions): Promise<Result<Img2dcmResult>> {\n const validation = Img2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('img2dcm', validation.error));\n }\n\n const binaryResult = resolveBinary('img2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('img2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { img2dcm, Img2dcmInputFormat };\nexport type { Img2dcmOptions, Img2dcmResult, Img2dcmInputFormatValue };\n","/**\n * Encapsulate a PDF file into a DICOM object using the pdf2dcm binary.\n *\n * @module pdf2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link pdf2dcm}. */\ntype Pdf2dcmOptions = ToolBaseOptions;\n\n/** Result of a successful pdf2dcm operation. */\ninterface Pdf2dcmResult {\n /** Path to the output DICOM file. */\n readonly outputPath: string;\n}\n\nconst Pdf2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Encapsulate a PDF file into a DICOM object using the pdf2dcm binary.\n *\n * @param inputPath - Path to the PDF input file\n * @param outputPath - Path for the output DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function pdf2dcm(inputPath: string, outputPath: string, options?: Pdf2dcmOptions): Promise<Result<Pdf2dcmResult>> {\n const validation = Pdf2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('pdf2dcm', validation.error));\n }\n\n const binaryResult = resolveBinary('pdf2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('pdf2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { pdf2dcm };\nexport type { Pdf2dcmOptions, Pdf2dcmResult };\n","/**\n * Extract an encapsulated PDF from a DICOM file using the dcm2pdf binary.\n *\n * @module dcm2pdf\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcm2pdf}. */\ntype Dcm2pdfOptions = ToolBaseOptions;\n\n/** Result of a successful dcm2pdf operation. */\ninterface Dcm2pdfResult {\n /** Path to the extracted PDF file. */\n readonly outputPath: string;\n}\n\nconst Dcm2pdfOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Extract an encapsulated PDF from a DICOM file using the dcm2pdf binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the extracted PDF output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcm2pdf(inputPath: string, outputPath: string, options?: Dcm2pdfOptions): Promise<Result<Dcm2pdfResult>> {\n const validation = Dcm2pdfOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcm2pdf', validation.error));\n }\n\n const binaryResult = resolveBinary('dcm2pdf');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2pdf', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcm2pdf };\nexport type { Dcm2pdfOptions, Dcm2pdfResult };\n","/**\n * Encapsulate a CDA document into a DICOM object using the cda2dcm binary.\n *\n * @module cda2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link cda2dcm}. */\ntype Cda2dcmOptions = ToolBaseOptions;\n\n/** Result of a successful cda2dcm operation. */\ninterface Cda2dcmResult {\n /** Path to the output DICOM file. */\n readonly outputPath: string;\n}\n\nconst Cda2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Encapsulate a CDA document into a DICOM object using the cda2dcm binary.\n *\n * @param inputPath - Path to the CDA input file\n * @param outputPath - Path for the output DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function cda2dcm(inputPath: string, outputPath: string, options?: Cda2dcmOptions): Promise<Result<Cda2dcmResult>> {\n const validation = Cda2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('cda2dcm', validation.error));\n }\n\n const binaryResult = resolveBinary('cda2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('cda2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { cda2dcm };\nexport type { Cda2dcmOptions, Cda2dcmResult };\n","/**\n * Extract an encapsulated CDA document from a DICOM file using the dcm2cda binary.\n *\n * @module dcm2cda\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcm2cda}. */\ntype Dcm2cdaOptions = ToolBaseOptions;\n\n/** Result of a successful dcm2cda operation. */\ninterface Dcm2cdaResult {\n /** Path to the extracted CDA file. */\n readonly outputPath: string;\n}\n\nconst Dcm2cdaOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Extract an encapsulated CDA document from a DICOM file using the dcm2cda binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the extracted CDA output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcm2cda(inputPath: string, outputPath: string, options?: Dcm2cdaOptions): Promise<Result<Dcm2cdaResult>> {\n const validation = Dcm2cdaOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcm2cda', validation.error));\n }\n\n const binaryResult = resolveBinary('dcm2cda');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2cda', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcm2cda };\nexport type { Dcm2cdaOptions, Dcm2cdaResult };\n","/**\n * Convert an STL file to a DICOM object using the stl2dcm binary.\n *\n * @module stl2dcm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link stl2dcm}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface Stl2dcmOptions extends ToolBaseOptions {}\n\n/** Result of a successful stl2dcm conversion. */\ninterface Stl2dcmResult {\n /** Path to the generated DICOM output file. */\n readonly outputPath: string;\n}\n\nconst Stl2dcmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Converts an STL file to a DICOM object using the stl2dcm binary.\n *\n * @param inputPath - Path to the STL input file\n * @param outputPath - Path for the DICOM output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await stl2dcm('/path/to/model.stl', '/path/to/output.dcm');\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function stl2dcm(inputPath: string, outputPath: string, options?: Stl2dcmOptions): Promise<Result<Stl2dcmResult>> {\n const validation = Stl2dcmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('stl2dcm', validation.error));\n }\n\n const binaryResult = resolveBinary('stl2dcm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('stl2dcm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { stl2dcm };\nexport type { Stl2dcmOptions, Stl2dcmResult };\n","/**\n * Encode a DICOM file with RLE compression using the dcmcrle binary.\n *\n * @module dcmcrle\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmcrle}. */\ninterface DcmcrleOptions extends ToolBaseOptions {\n /** Always write new SOP Instance UID. Maps to +ua flag. */\n readonly uidAlways?: boolean | undefined;\n}\n\n/** Result of a successful dcmcrle encoding. */\ninterface DcmcrleResult {\n /** Path to the RLE-compressed output file. */\n readonly outputPath: string;\n}\n\nconst DcmcrleOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n uidAlways: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmcrle command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmcrleOptions): string[] {\n const args: string[] = [];\n\n if (options?.uidAlways === true) {\n args.push('+ua');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Encodes a DICOM file with RLE compression using the dcmcrle binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the RLE-compressed output file\n * @param options - Encoding options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmcrle('/path/to/input.dcm', '/path/to/output.dcm', {\n * uidAlways: true,\n * });\n * if (result.ok) {\n * console.log(`Encoded: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmcrle(inputPath: string, outputPath: string, options?: DcmcrleOptions): Promise<Result<DcmcrleResult>> {\n const validation = DcmcrleOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmcrle', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmcrle');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmcrle', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmcrle };\nexport type { DcmcrleOptions, DcmcrleResult };\n","/**\n * Decode an RLE-compressed DICOM file using the dcmdrle binary.\n *\n * @module dcmdrle\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmdrle}. */\ninterface DcmdrleOptions extends ToolBaseOptions {\n /** Always write new SOP Instance UID. Maps to +ua flag. */\n readonly uidAlways?: boolean | undefined;\n}\n\n/** Result of a successful dcmdrle decoding. */\ninterface DcmdrleResult {\n /** Path to the decoded output file. */\n readonly outputPath: string;\n}\n\nconst DcmdrleOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n uidAlways: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdrle command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmdrleOptions): string[] {\n const args: string[] = [];\n\n if (options?.uidAlways === true) {\n args.push('+ua');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Decodes an RLE-compressed DICOM file using the dcmdrle binary.\n *\n * @param inputPath - Path to the RLE-compressed DICOM input file\n * @param outputPath - Path for the decoded output file\n * @param options - Decoding options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmdrle('/path/to/compressed.dcm', '/path/to/output.dcm', {\n * uidAlways: true,\n * });\n * if (result.ok) {\n * console.log(`Decoded: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmdrle(inputPath: string, outputPath: string, options?: DcmdrleOptions): Promise<Result<DcmdrleResult>> {\n const validation = DcmdrleOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmdrle', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmdrle');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdrle', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdrle };\nexport type { DcmdrleOptions, DcmdrleResult };\n","/**\n * Encapsulate a non-DICOM document into a DICOM file using the dcmencap binary.\n *\n * @module dcmencap\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmencap}. */\ninterface DcmencapOptions extends ToolBaseOptions {\n /** Document title for the encapsulated document. Maps to --title. */\n readonly documentTitle?: string | undefined;\n}\n\n/** Result of a successful dcmencap operation. */\ninterface DcmencapResult {\n /** Path to the output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmencapOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n documentTitle: z.string().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmencap command-line arguments from validated options.\n *\n * @param inputPath - Path to the input document\n * @param outputPath - Path for the output DICOM file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmencapOptions): string[] {\n const args: string[] = [];\n\n if (options?.documentTitle !== undefined) {\n args.push('--title', options.documentTitle);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Encapsulate a non-DICOM document into a DICOM file using the dcmencap binary.\n *\n * @param inputPath - Path to the input document\n * @param outputPath - Path for the output DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcmencap(inputPath: string, outputPath: string, options?: DcmencapOptions): Promise<Result<DcmencapResult>> {\n const validation = DcmencapOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmencap', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmencap');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmencap', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmencap };\nexport type { DcmencapOptions, DcmencapResult };\n","/**\n * Extract an encapsulated document from a DICOM file using the dcmdecap binary.\n *\n * @module dcmdecap\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmdecap}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface DcmdecapOptions extends ToolBaseOptions {}\n\n/** Result of a successful dcmdecap operation. */\ninterface DcmdecapResult {\n /** Path to the extracted output file. */\n readonly outputPath: string;\n}\n\nconst DcmdecapOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Extract an encapsulated document from a DICOM file using the dcmdecap binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the extracted output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n */\nasync function dcmdecap(inputPath: string, outputPath: string, options?: DcmdecapOptions): Promise<Result<DcmdecapResult>> {\n const validation = DcmdecapOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmdecap', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmdecap');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdecap', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdecap };\nexport type { DcmdecapOptions, DcmdecapResult };\n","/**\n * Compress a DICOM file with JPEG encoding using the dcmcjpeg binary.\n *\n * @module dcmcjpeg\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmcjpeg}. */\ninterface DcmcjpegOptions extends ToolBaseOptions {\n /** JPEG quality factor (1-100). Maps to +q. */\n readonly quality?: number | undefined;\n /** Use lossless JPEG compression (SV1). Maps to +e1. */\n readonly lossless?: boolean | undefined;\n}\n\n/** Result of a successful dcmcjpeg operation. */\ninterface DcmcjpegResult {\n /** Path to the compressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmcjpegOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n quality: z.number().int().min(1).max(100).optional(),\n lossless: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmcjpeg command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmcjpegOptions): string[] {\n const args: string[] = [];\n\n if (options?.lossless === true) {\n args.push('+e1');\n }\n\n if (options?.quality !== undefined) {\n args.push('+q', String(options.quality));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Compress a DICOM file with JPEG encoding using the dcmcjpeg binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output DICOM file\n * @param options - Optional compression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmcjpeg(inputPath: string, outputPath: string, options?: DcmcjpegOptions): Promise<Result<DcmcjpegResult>> {\n const validation = DcmcjpegOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmcjpeg', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmcjpeg');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmcjpeg', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmcjpeg };\nexport type { DcmcjpegOptions, DcmcjpegResult };\n","/**\n * Decompress a JPEG-compressed DICOM file using the dcmdjpeg binary.\n *\n * @module dcmdjpeg\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Color conversion modes for dcmdjpeg.\n */\nconst ColorConversion = {\n /** Use photometric interpretation from the dataset. */\n PHOTOMETRIC: 'photometric',\n /** Always convert to RGB. */\n ALWAYS: 'always',\n /** Never convert color space. */\n NEVER: 'never',\n} as const;\n\ntype ColorConversionValue = (typeof ColorConversion)[keyof typeof ColorConversion];\n\n/** Maps color conversion values to dcmdjpeg command-line flags. */\nconst COLOR_CONVERSION_FLAGS: Record<ColorConversionValue, string> = {\n photometric: '+cp',\n always: '+ca',\n never: '+cn',\n};\n\n/** Options for {@link dcmdjpeg}. */\ninterface DcmdjpegOptions extends ToolBaseOptions {\n /** Color conversion mode. Maps to +cp, +ca, or +cn. */\n readonly colorConversion?: ColorConversionValue | undefined;\n}\n\n/** Result of a successful dcmdjpeg operation. */\ninterface DcmdjpegResult {\n /** Path to the decompressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmdjpegOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n colorConversion: z.enum(['photometric', 'always', 'never']).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdjpeg command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the decompressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmdjpegOptions): string[] {\n const args: string[] = [];\n\n if (options?.colorConversion !== undefined) {\n args.push(COLOR_CONVERSION_FLAGS[options.colorConversion]);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Decompress a JPEG-compressed DICOM file using the dcmdjpeg binary.\n *\n * @param inputPath - Path to the JPEG-compressed DICOM input file\n * @param outputPath - Path for the decompressed output DICOM file\n * @param options - Optional decompression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmdjpeg(inputPath: string, outputPath: string, options?: DcmdjpegOptions): Promise<Result<DcmdjpegResult>> {\n const validation = DcmdjpegOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmdjpeg', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmdjpeg');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdjpeg', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdjpeg, ColorConversion };\nexport type { DcmdjpegOptions, DcmdjpegResult, ColorConversionValue };\n","/**\n * Compress a DICOM file with JPEG-LS encoding using the dcmcjpls binary.\n *\n * @module dcmcjpls\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmcjpls}. */\ninterface DcmcjplsOptions extends ToolBaseOptions {\n /** Use lossless JPEG-LS compression (default). Maps to +el. */\n readonly lossless?: boolean | undefined;\n /** Maximum pixel deviation for near-lossless mode. Maps to +md. */\n readonly maxDeviation?: number | undefined;\n}\n\n/** Result of a successful dcmcjpls operation. */\ninterface DcmcjplsResult {\n /** Path to the compressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmcjplsOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n lossless: z.boolean().optional(),\n maxDeviation: z.number().int().min(0).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmcjpls command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmcjplsOptions): string[] {\n const args: string[] = [];\n\n if (options?.lossless === false) {\n args.push('+en');\n } else if (options?.lossless === true) {\n args.push('+el');\n }\n\n if (options?.maxDeviation !== undefined) {\n args.push('+md', String(options.maxDeviation));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Compress a DICOM file with JPEG-LS encoding using the dcmcjpls binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the compressed output DICOM file\n * @param options - Optional compression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmcjpls(inputPath: string, outputPath: string, options?: DcmcjplsOptions): Promise<Result<DcmcjplsResult>> {\n const validation = DcmcjplsOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmcjpls', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmcjpls');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmcjpls', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmcjpls };\nexport type { DcmcjplsOptions, DcmcjplsResult };\n","/**\n * Decompress a JPEG-LS-compressed DICOM file using the dcmdjpls binary.\n *\n * @module dcmdjpls\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Color conversion modes for dcmdjpls.\n */\nconst JplsColorConversion = {\n /** Use photometric interpretation from the dataset. */\n PHOTOMETRIC: 'photometric',\n /** Always convert to RGB. */\n ALWAYS: 'always',\n /** Never convert color space. */\n NEVER: 'never',\n} as const;\n\ntype JplsColorConversionValue = (typeof JplsColorConversion)[keyof typeof JplsColorConversion];\n\n/** Maps color conversion values to dcmdjpls command-line flags. */\nconst JPLS_COLOR_CONVERSION_FLAGS: Record<JplsColorConversionValue, string> = {\n photometric: '+cp',\n always: '+ca',\n never: '+cn',\n};\n\n/** Options for {@link dcmdjpls}. */\ninterface DcmdjplsOptions extends ToolBaseOptions {\n /** Color conversion mode. Maps to +cp, +ca, or +cn. */\n readonly colorConversion?: JplsColorConversionValue | undefined;\n}\n\n/** Result of a successful dcmdjpls operation. */\ninterface DcmdjplsResult {\n /** Path to the decompressed output DICOM file. */\n readonly outputPath: string;\n}\n\nconst DcmdjplsOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n colorConversion: z.enum(['photometric', 'always', 'never']).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdjpls command-line arguments from validated options.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the decompressed output file\n * @param options - Validated options\n * @returns Argument array\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmdjplsOptions): string[] {\n const args: string[] = [];\n\n if (options?.colorConversion !== undefined) {\n args.push(JPLS_COLOR_CONVERSION_FLAGS[options.colorConversion]);\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Decompress a JPEG-LS-compressed DICOM file using the dcmdjpls binary.\n *\n * @param inputPath - Path to the JPEG-LS-compressed DICOM input file\n * @param outputPath - Path for the decompressed output DICOM file\n * @param options - Optional decompression options\n * @returns A Result containing the output path or an error\n */\nasync function dcmdjpls(inputPath: string, outputPath: string, options?: DcmdjplsOptions): Promise<Result<DcmdjplsResult>> {\n const validation = DcmdjplsOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmdjpls', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmdjpls');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdjpls', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmdjpls, JplsColorConversion };\nexport type { DcmdjplsOptions, DcmdjplsResult, JplsColorConversionValue };\n","/**\n * Convert a DICOM image to a standard image format using the dcmj2pnm binary.\n *\n * @module dcmj2pnm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Output format presets for dcmj2pnm.\n */\nconst Dcmj2pnmOutputFormat = {\n /** Portable aNy Map format. */\n PNM: 'pnm',\n /** PNG format. */\n PNG: 'png',\n /** BMP format. */\n BMP: 'bmp',\n /** TIFF format. */\n TIFF: 'tiff',\n /** JPEG format. */\n JPEG: 'jpeg',\n} as const;\n\ntype Dcmj2pnmOutputFormatValue = (typeof Dcmj2pnmOutputFormat)[keyof typeof Dcmj2pnmOutputFormat];\n\nconst OUTPUT_FORMAT_FLAGS: Record<Dcmj2pnmOutputFormatValue, string> = {\n pnm: '+op',\n png: '+on',\n bmp: '+ob',\n tiff: '+ot',\n jpeg: '+oj',\n};\n\n/** Options for {@link dcmj2pnm}. */\ninterface Dcmj2pnmOptions extends ToolBaseOptions {\n /** Output image format. Defaults to PNM if not specified. */\n readonly outputFormat?: Dcmj2pnmOutputFormatValue | undefined;\n /** Frame number to extract (0-based). */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcmj2pnm operation. */\ninterface Dcmj2pnmResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst Dcmj2pnmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n outputFormat: z.enum(['pnm', 'png', 'bmp', 'tiff', 'jpeg']).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmj2pnm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dcmj2pnmOptions): string[] {\n const args: string[] = [];\n\n if (options?.outputFormat !== undefined) {\n args.push(OUTPUT_FORMAT_FLAGS[options.outputFormat]);\n }\n\n if (options?.frame !== undefined) {\n args.push('+F', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Convert a DICOM image to a standard image format using the dcmj2pnm binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the converted output image file\n * @param options - Optional conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmj2pnm('/path/to/input.dcm', '/path/to/output.png', {\n * outputFormat: 'png',\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmj2pnm(inputPath: string, outputPath: string, options?: Dcmj2pnmOptions): Promise<Result<Dcmj2pnmResult>> {\n const validation = Dcmj2pnmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmj2pnm', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmj2pnm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmj2pnm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmj2pnm, Dcmj2pnmOutputFormat };\nexport type { Dcmj2pnmOptions, Dcmj2pnmResult, Dcmj2pnmOutputFormatValue };\n","/**\n * Convert a DICOM image to PNM/PNG/BMP/TIFF format using the dcm2pnm binary.\n *\n * @module dcm2pnm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * Output format presets for dcm2pnm.\n */\nconst Dcm2pnmOutputFormat = {\n /** Portable aNy Map format. */\n PNM: 'pnm',\n /** PNG format. */\n PNG: 'png',\n /** BMP format. */\n BMP: 'bmp',\n /** TIFF format. */\n TIFF: 'tiff',\n} as const;\n\ntype Dcm2pnmOutputFormatValue = (typeof Dcm2pnmOutputFormat)[keyof typeof Dcm2pnmOutputFormat];\n\nconst DCM2PNM_FORMAT_FLAGS: Record<Dcm2pnmOutputFormatValue, string> = {\n pnm: '+op',\n png: '+on',\n bmp: '+ob',\n tiff: '+ot',\n};\n\n/** Options for {@link dcm2pnm}. */\ninterface Dcm2pnmOptions extends ToolBaseOptions {\n /** Output image format. Defaults to PNM if not specified. */\n readonly outputFormat?: Dcm2pnmOutputFormatValue | undefined;\n /** Frame number to extract (0-based, max 65535). */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcm2pnm operation. */\ninterface Dcm2pnmResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst Dcm2pnmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n outputFormat: z.enum(['pnm', 'png', 'bmp', 'tiff']).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcm2pnm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dcm2pnmOptions): string[] {\n const args: string[] = [];\n\n if (options?.outputFormat !== undefined) {\n args.push(DCM2PNM_FORMAT_FLAGS[options.outputFormat]);\n }\n\n if (options?.frame !== undefined) {\n args.push('+F', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Convert a DICOM image to PNM/PNG/BMP/TIFF format using the dcm2pnm binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the converted output image file\n * @param options - Optional conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcm2pnm('/path/to/input.dcm', '/path/to/output.png', {\n * outputFormat: 'png',\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcm2pnm(inputPath: string, outputPath: string, options?: Dcm2pnmOptions): Promise<Result<Dcm2pnmResult>> {\n const validation = Dcm2pnmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcm2pnm', validation.error));\n }\n\n const binaryResult = resolveBinary('dcm2pnm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcm2pnm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcm2pnm, Dcm2pnmOutputFormat };\nexport type { Dcm2pnmOptions, Dcm2pnmResult, Dcm2pnmOutputFormatValue };\n","/**\n * Scale a DICOM image using the dcmscale binary.\n *\n * @module dcmscale\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmscale}. */\ninterface DcmscaleOptions extends ToolBaseOptions {\n /** Horizontal scaling factor (max 100). */\n readonly xFactor?: number | undefined;\n /** Vertical scaling factor (max 100). */\n readonly yFactor?: number | undefined;\n /** Target width in pixels. */\n readonly xSize?: number | undefined;\n /** Target height in pixels. */\n readonly ySize?: number | undefined;\n}\n\n/** Result of a successful dcmscale operation. */\ninterface DcmscaleResult {\n /** Path to the scaled output file. */\n readonly outputPath: string;\n}\n\nconst DcmscaleOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n xFactor: z.number().positive().max(100).optional(),\n yFactor: z.number().positive().max(100).optional(),\n xSize: z.number().int().positive().optional(),\n ySize: z.number().int().positive().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmscale command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmscaleOptions): string[] {\n const args: string[] = [];\n\n if (options?.xFactor !== undefined) {\n args.push('+Sxf', String(options.xFactor));\n }\n\n if (options?.yFactor !== undefined) {\n args.push('+Syf', String(options.yFactor));\n }\n\n if (options?.xSize !== undefined) {\n args.push('+Sxv', String(options.xSize));\n }\n\n if (options?.ySize !== undefined) {\n args.push('+Syv', String(options.ySize));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Scale a DICOM image using the dcmscale binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the scaled output file\n * @param options - Optional scaling options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmscale('/path/to/input.dcm', '/path/to/output.dcm', {\n * xFactor: 0.5,\n * yFactor: 0.5,\n * });\n * if (result.ok) {\n * console.log(`Scaled: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmscale(inputPath: string, outputPath: string, options?: DcmscaleOptions): Promise<Result<DcmscaleResult>> {\n const validation = DcmscaleOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmscale', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmscale');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmscale', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmscale };\nexport type { DcmscaleOptions, DcmscaleResult };\n","/**\n * Quantize a color DICOM image to palette color using the dcmquant binary.\n *\n * @module dcmquant\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmquant}. */\ninterface DcmquantOptions extends ToolBaseOptions {\n /** Number of colors in the palette (2-65536). */\n readonly colors?: number | undefined;\n /** Frame number to extract (0-based, max 65535). */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcmquant operation. */\ninterface DcmquantResult {\n /** Path to the quantized output file. */\n readonly outputPath: string;\n}\n\nconst DcmquantOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n colors: z.number().int().min(2).max(65536).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmquant command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DcmquantOptions): string[] {\n const args: string[] = [];\n\n if (options?.colors !== undefined) {\n args.push('+pc', String(options.colors));\n }\n\n if (options?.frame !== undefined) {\n args.push('+F', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Quantize a color DICOM image to palette color using the dcmquant binary.\n *\n * @param inputPath - Path to the DICOM input file\n * @param outputPath - Path for the quantized output file\n * @param options - Optional quantization options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmquant('/path/to/input.dcm', '/path/to/output.dcm', {\n * colors: 256,\n * });\n * if (result.ok) {\n * console.log(`Quantized: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmquant(inputPath: string, outputPath: string, options?: DcmquantOptions): Promise<Result<DcmquantResult>> {\n const validation = DcmquantOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmquant', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmquant');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmquant', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmquant };\nexport type { DcmquantOptions, DcmquantResult };\n","/**\n * Export display function curves using the dcmdspfn binary.\n *\n * Generates GSDF (Grayscale Standard Display Function) lookup tables\n * for monitor, camera, or printer calibration.\n *\n * @module dcmdspfn\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmdspfn}. */\ninterface DcmdspfnOptions extends ToolBaseOptions {\n /** Path to monitor characteristics file. Maps to `+Im`. */\n readonly monitorFile?: string | undefined;\n /** Path to camera characteristics file. Maps to `+Ic`. */\n readonly cameraFile?: string | undefined;\n /** Path to printer characteristics file. Maps to `+Ip`. */\n readonly printerFile?: string | undefined;\n /** Ambient light value in cd/m2. Maps to `+Ca`. */\n readonly ambientLight?: number | undefined;\n}\n\n/** Result of a successful dcmdspfn operation. */\ninterface DcmdspfnResult {\n /** The text output from dcmdspfn. */\n readonly text: string;\n}\n\nconst DcmdspfnOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n monitorFile: z.string().min(1).optional(),\n cameraFile: z.string().min(1).optional(),\n printerFile: z.string().min(1).optional(),\n ambientLight: z.number().positive().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmdspfn command-line arguments from validated options.\n */\nfunction buildArgs(options?: DcmdspfnOptions): string[] {\n const args: string[] = [];\n\n if (options?.monitorFile !== undefined) {\n args.push('+Im', options.monitorFile);\n }\n\n if (options?.cameraFile !== undefined) {\n args.push('+Ic', options.cameraFile);\n }\n\n if (options?.printerFile !== undefined) {\n args.push('+Ip', options.printerFile);\n }\n\n if (options?.ambientLight !== undefined) {\n args.push('+Ca', String(options.ambientLight));\n }\n\n return args;\n}\n\n/**\n * Exports display function curves using the dcmdspfn binary.\n *\n * @param options - Optional display function options\n * @returns A Result containing the text output or an error\n *\n * @example\n * ```ts\n * const result = await dcmdspfn({ monitorFile: '/path/to/monitor.lut' });\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmdspfn(options?: DcmdspfnOptions): Promise<Result<DcmdspfnResult>> {\n const validation = DcmdspfnOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmdspfn', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmdspfn');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmdspfn', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmdspfn };\nexport type { DcmdspfnOptions, DcmdspfnResult };\n","/**\n * Convert hardcopy OD values to softcopy P-values using the dcod2lum binary.\n *\n * Converts Optical Density (OD) calibration data from a hardcopy device\n * into luminance (P-value) data suitable for softcopy display.\n *\n * @module dcod2lum\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcod2lum}. */\ntype Dcod2lumOptions = ToolBaseOptions;\n\n/** Result of a successful dcod2lum operation. */\ninterface Dcod2lumResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst Dcod2lumOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Converts hardcopy OD values to softcopy P-values using the dcod2lum binary.\n *\n * @param inputPath - Path to the OD input file\n * @param outputPath - Path for the converted luminance output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcod2lum('/path/to/od.dat', '/path/to/lum.dat');\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcod2lum(inputPath: string, outputPath: string, options?: Dcod2lumOptions): Promise<Result<Dcod2lumResult>> {\n const validation = Dcod2lumOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcod2lum', validation.error));\n }\n\n const binaryResult = resolveBinary('dcod2lum');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcod2lum', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcod2lum };\nexport type { Dcod2lumOptions, Dcod2lumResult };\n","/**\n * Convert VeriLUM calibration data to DCMTK display format using the dconvlum binary.\n *\n * Reads VeriLUM luminance calibration data and converts it into\n * a format suitable for use with DCMTK display function tools.\n *\n * @module dconvlum\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dconvlum}. */\ninterface DconvlumOptions extends ToolBaseOptions {\n /** Ambient light value in cd/m2. Maps to `+Ca`. */\n readonly ambientLight?: number | undefined;\n}\n\n/** Result of a successful dconvlum operation. */\ninterface DconvlumResult {\n /** Path to the converted output file. */\n readonly outputPath: string;\n}\n\nconst DconvlumOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n ambientLight: z.number().positive().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dconvlum command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: DconvlumOptions): string[] {\n const args: string[] = [];\n\n if (options?.ambientLight !== undefined) {\n args.push('+Ca', String(options.ambientLight));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts VeriLUM calibration data to DCMTK display format using the dconvlum binary.\n *\n * @param inputPath - Path to the VeriLUM input file\n * @param outputPath - Path for the converted output file\n * @param options - Optional conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dconvlum('/path/to/verilum.dat', '/path/to/display.dat', {\n * ambientLight: 10,\n * });\n * if (result.ok) {\n * console.log(`Converted: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dconvlum(inputPath: string, outputPath: string, options?: DconvlumOptions): Promise<Result<DconvlumResult>> {\n const validation = DconvlumOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dconvlum', validation.error));\n }\n\n const binaryResult = resolveBinary('dconvlum');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dconvlum', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dconvlum };\nexport type { DconvlumOptions, DconvlumResult };\n","/**\n * C-ECHO verification using the echoscu binary.\n *\n * Tests DICOM network connectivity by sending a C-ECHO request\n * to a remote DICOM SCP (Service Class Provider).\n *\n * @module echoscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isValidAETitle } from '../patterns';\n\n/** Options for {@link echoscu}. */\ninterface EchoscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. **Security:** Not validated for SSRF — callers accepting user input should validate against private/internal IP ranges. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n}\n\n/** Result of a successful C-ECHO. */\ninterface EchoscuResult {\n /** Always `true` when the Result is `ok` — redundant with `Result.ok` but kept for API compatibility. @deprecated Check `Result.ok` instead. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst EchoscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n })\n .strict();\n\n/**\n * Builds echoscu command-line arguments from validated options.\n */\nfunction buildArgs(options: EchoscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Sends a C-ECHO request to a remote DICOM SCP to verify connectivity.\n *\n * @param options - Echo options (host and port required)\n * @returns A Result containing the echo result or an error\n *\n * @example\n * ```ts\n * const result = await echoscu({ host: '192.168.1.100', port: 104 });\n * if (result.ok) {\n * console.log(result.value.success ? 'Echo succeeded' : 'Echo failed');\n * }\n * ```\n */\nasync function echoscu(options: EchoscuOptions): Promise<Result<EchoscuResult>> {\n const validation = EchoscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('echoscu', validation.error));\n }\n\n const binaryResult = resolveBinary('echoscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('echoscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { echoscu };\nexport type { EchoscuOptions, EchoscuResult };\n","/**\n * C-STORE send using the dcmsend binary.\n *\n * Sends one or more DICOM files to a remote DICOM SCP.\n *\n * @module dcmsend\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidAETitle } from '../patterns';\n\n/** Options for {@link dcmsend}. */\ninterface DcmsendOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** One or more DICOM file paths to send. */\n readonly files: readonly string[];\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Scan input directory recursively for DICOM files. Defaults to false. */\n readonly scanDirectory?: boolean | undefined;\n}\n\n/** Result of a successful C-STORE send. */\ninterface DcmsendResult {\n /** Whether the send completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst DcmsendOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n files: z.array(z.string().min(1).refine(isSafePath, { message: 'path traversal detected in file path' })).min(1),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n scanDirectory: z.boolean().optional(),\n })\n .strict();\n\n/**\n * Builds dcmsend command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmsendOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.scanDirectory === true) {\n args.push('--scan-directories');\n }\n\n args.push(options.host, String(options.port));\n args.push(...options.files);\n\n return args;\n}\n\n/**\n * Sends DICOM files to a remote SCP using C-STORE via the dcmsend binary.\n *\n * @param options - Send options (host, port, files required)\n * @returns A Result containing the send result or an error\n *\n * @example\n * ```ts\n * const result = await dcmsend({\n * host: '192.168.1.100',\n * port: 104,\n * files: ['/path/to/study.dcm'],\n * calledAETitle: 'PACS',\n * });\n * if (result.ok && result.value.success) {\n * console.log('Files sent successfully');\n * }\n * ```\n */\nasync function dcmsend(options: DcmsendOptions): Promise<Result<DcmsendResult>> {\n const validation = DcmsendOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmsend', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmsend');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmsend', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { dcmsend };\nexport type { DcmsendOptions, DcmsendResult };\n","/**\n * Send DICOM files using C-STORE via the storescu binary.\n *\n * Sends one or more DICOM files to a remote DICOM SCP\n * (Service Class Provider) using the DICOM C-STORE protocol.\n *\n * @module storescu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidAETitle } from '../patterns';\n\n// ---------------------------------------------------------------------------\n// Transfer syntax proposal constants\n// ---------------------------------------------------------------------------\n\n/** Proposed transfer syntax for outgoing C-STORE associations. */\nconst ProposedTransferSyntax = {\n UNCOMPRESSED: 'uncompressed',\n LITTLE_ENDIAN: 'littleEndian',\n BIG_ENDIAN: 'bigEndian',\n IMPLICIT_VR: 'implicitVR',\n JPEG_LOSSLESS: 'jpegLossless',\n JPEG_8BIT: 'jpeg8Bit',\n JPEG_12BIT: 'jpeg12Bit',\n J2K_LOSSLESS: 'j2kLossless',\n J2K_LOSSY: 'j2kLossy',\n JLS_LOSSLESS: 'jlsLossless',\n JLS_LOSSY: 'jlsLossy',\n} as const;\n\ntype ProposedTransferSyntaxValue = (typeof ProposedTransferSyntax)[keyof typeof ProposedTransferSyntax];\n\nconst PROPOSED_TS_FLAG_MAP: Record<ProposedTransferSyntaxValue, string> = {\n [ProposedTransferSyntax.UNCOMPRESSED]: '-x=',\n [ProposedTransferSyntax.LITTLE_ENDIAN]: '-xe',\n [ProposedTransferSyntax.BIG_ENDIAN]: '-xb',\n [ProposedTransferSyntax.IMPLICIT_VR]: '-xi',\n [ProposedTransferSyntax.JPEG_LOSSLESS]: '-xs',\n [ProposedTransferSyntax.JPEG_8BIT]: '-xy',\n [ProposedTransferSyntax.JPEG_12BIT]: '-xx',\n [ProposedTransferSyntax.J2K_LOSSLESS]: '-xv',\n [ProposedTransferSyntax.J2K_LOSSY]: '-xw',\n [ProposedTransferSyntax.JLS_LOSSLESS]: '-xt',\n [ProposedTransferSyntax.JLS_LOSSY]: '-xu',\n};\n\n/** Options for {@link storescu}. */\ninterface StorescuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** One or more DICOM file paths to send. */\n readonly files: readonly string[];\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Scan directories for DICOM files. */\n readonly scanDirectories?: boolean | undefined;\n /** Recurse into subdirectories (requires scanDirectories). */\n readonly recurse?: boolean | undefined;\n /** Proposed transfer syntax for the association. */\n readonly proposedTransferSyntax?: ProposedTransferSyntaxValue | undefined;\n}\n\n/** Result of a successful C-STORE send. */\ninterface StorescuResult {\n /** Whether the store completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst StorescuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n files: z.array(z.string().min(1).refine(isSafePath, { message: 'path traversal detected in file path' })).min(1),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n scanDirectories: z.boolean().optional(),\n recurse: z.boolean().optional(),\n proposedTransferSyntax: z\n .enum([\n 'uncompressed',\n 'littleEndian',\n 'bigEndian',\n 'implicitVR',\n 'jpegLossless',\n 'jpeg8Bit',\n 'jpeg12Bit',\n 'j2kLossless',\n 'j2kLossy',\n 'jlsLossless',\n 'jlsLossy',\n ])\n .optional(),\n })\n .strict();\n\n/**\n * Builds storescu command-line arguments from validated options.\n */\nfunction buildArgs(options: StorescuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.scanDirectories === true) {\n args.push('+sd');\n }\n\n if (options.recurse === true) {\n args.push('+r');\n }\n\n if (options.proposedTransferSyntax !== undefined) {\n args.push(PROPOSED_TS_FLAG_MAP[options.proposedTransferSyntax]);\n }\n\n args.push(options.host, String(options.port));\n args.push(...options.files);\n\n return args;\n}\n\n/**\n * Send DICOM files using C-STORE via the storescu binary.\n *\n * @param options - Store options (host, port, files required)\n * @returns A Result containing the store result or an error\n *\n * @example\n * ```ts\n * const result = await storescu({\n * host: '192.168.1.100',\n * port: 104,\n * files: ['/path/to/study.dcm'],\n * calledAETitle: 'PACS',\n * });\n * if (result.ok && result.value.success) {\n * console.log('Files sent successfully');\n * }\n * ```\n */\nasync function storescu(options: StorescuOptions): Promise<Result<StorescuResult>> {\n const validation = StorescuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('storescu', validation.error));\n }\n\n const binaryResult = resolveBinary('storescu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('storescu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { storescu, ProposedTransferSyntax };\nexport type { StorescuOptions, StorescuResult, ProposedTransferSyntaxValue };\n","/**\n * Query a remote DICOM SCP using C-FIND via the findscu binary.\n *\n * Performs DICOM C-FIND queries against a remote SCP for worklist,\n * patient, or study-level information.\n *\n * @module findscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidDicomKey, isValidAETitle } from '../patterns';\n\n/** Supported C-FIND query models. */\nconst QueryModel = {\n WORKLIST: 'worklist',\n PATIENT: 'patient',\n STUDY: 'study',\n} as const;\n\n/** Union of valid query model values. */\ntype QueryModelValue = (typeof QueryModel)[keyof typeof QueryModel];\n\n/** Maps query model values to their CLI flags. */\nconst QUERY_MODEL_FLAGS: Record<QueryModelValue, string> = {\n worklist: '-W',\n patient: '-P',\n study: '-S',\n};\n\n/** Options for {@link findscu}. */\ninterface FindscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Query model to use. */\n readonly queryModel?: QueryModelValue | undefined;\n /** DICOM attribute keys for the query (each becomes -k). */\n readonly keys?: readonly string[] | undefined;\n /** Extract response datasets to individual DICOM files. */\n readonly extract?: boolean | undefined;\n /** Output directory for extracted response files (requires extract). */\n readonly outputDirectory?: string | undefined;\n}\n\n/** Result of a successful C-FIND query. */\ninterface FindscuResult {\n /** Whether the query completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst FindscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n queryModel: z.enum(['worklist', 'patient', 'study']).optional(),\n keys: z.array(z.string().min(1).refine(isValidDicomKey, { message: 'invalid DICOM query key format (expected XXXX,XXXX[=value])' })).optional(),\n extract: z.boolean().optional(),\n outputDirectory: z.string().min(1).refine(isSafePath, { message: 'path traversal detected in outputDirectory' }).optional(),\n })\n .strict()\n .refine(data => data.extract !== true || data.outputDirectory !== undefined, {\n message: 'outputDirectory is required when extract is true',\n });\n\n/**\n * Builds findscu command-line arguments from validated options.\n */\nfunction buildArgs(options: FindscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.queryModel !== undefined) {\n args.push(QUERY_MODEL_FLAGS[options.queryModel]);\n }\n\n if (options.extract === true) {\n args.push('--extract');\n }\n\n if (options.outputDirectory !== undefined) {\n args.push('--output-directory', options.outputDirectory);\n }\n\n if (options.keys !== undefined) {\n for (const key of options.keys) {\n args.push('-k', key);\n }\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Query a remote DICOM SCP using C-FIND via the findscu binary.\n *\n * @param options - Find options (host and port required)\n * @returns A Result containing the find result or an error\n *\n * @example\n * ```ts\n * const result = await findscu({\n * host: '192.168.1.100',\n * port: 104,\n * queryModel: 'study',\n * keys: ['0008,0050=', '0010,0020=PATIENT1'],\n * });\n * if (result.ok) {\n * console.log('Query succeeded');\n * }\n * ```\n */\nasync function findscu(options: FindscuOptions): Promise<Result<FindscuResult>> {\n const validation = FindscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('findscu', validation.error));\n }\n\n const binaryResult = resolveBinary('findscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('findscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { findscu, QueryModel };\nexport type { FindscuOptions, FindscuResult, QueryModelValue };\n","/**\n * Retrieve DICOM objects using C-MOVE via the movescu binary.\n *\n * Sends a C-MOVE request to a remote DICOM SCP to retrieve\n * DICOM objects and have them sent to a specified destination.\n *\n * @module movescu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidDicomKey, isValidAETitle } from '../patterns';\n\n/** Supported C-MOVE query models. */\nconst MoveQueryModel = {\n PATIENT: 'patient',\n STUDY: 'study',\n} as const;\n\n/** Union of valid move query model values. */\ntype MoveQueryModelValue = (typeof MoveQueryModel)[keyof typeof MoveQueryModel];\n\n/** Maps query model values to their CLI flags. */\nconst MOVE_QUERY_MODEL_FLAGS: Record<MoveQueryModelValue, string> = {\n patient: '-P',\n study: '-S',\n};\n\n/** Options for {@link movescu}. */\ninterface MovescuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Query model to use. */\n readonly queryModel?: MoveQueryModelValue | undefined;\n /** DICOM attribute keys for the query (each becomes -k). */\n readonly keys?: readonly string[] | undefined;\n /** Move destination AE Title (maps to -aem). */\n readonly moveDestination?: string | undefined;\n /** Output directory for retrieved files (maps to -od). */\n readonly outputDirectory?: string | undefined;\n}\n\n/** Result of a successful C-MOVE retrieval. */\ninterface MovescuResult {\n /** Whether the move completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst MovescuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n queryModel: z.enum(['patient', 'study']).optional(),\n keys: z.array(z.string().min(1).refine(isValidDicomKey, { message: 'invalid DICOM query key format (expected XXXX,XXXX[=value])' })).optional(),\n moveDestination: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n outputDirectory: z.string().min(1).refine(isSafePath, { message: 'path traversal detected in outputDirectory' }).optional(),\n })\n .strict();\n\n/**\n * Builds movescu command-line arguments from validated options.\n */\nfunction buildArgs(options: MovescuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.queryModel !== undefined) {\n args.push(MOVE_QUERY_MODEL_FLAGS[options.queryModel]);\n }\n\n if (options.moveDestination !== undefined) {\n args.push('-aem', options.moveDestination);\n }\n\n if (options.outputDirectory !== undefined) {\n args.push('-od', options.outputDirectory);\n }\n\n if (options.keys !== undefined) {\n for (const key of options.keys) {\n args.push('-k', key);\n }\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Retrieve DICOM objects using C-MOVE via the movescu binary.\n *\n * @param options - Move options (host and port required)\n * @returns A Result containing the move result or an error\n *\n * @example\n * ```ts\n * const result = await movescu({\n * host: '192.168.1.100',\n * port: 104,\n * queryModel: 'study',\n * moveDestination: 'LOCALAE',\n * keys: ['0020,000D=1.2.3.4'],\n * });\n * if (result.ok) {\n * console.log('Move succeeded');\n * }\n * ```\n */\nasync function movescu(options: MovescuOptions): Promise<Result<MovescuResult>> {\n const validation = MovescuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('movescu', validation.error));\n }\n\n const binaryResult = resolveBinary('movescu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('movescu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { movescu, MoveQueryModel };\nexport type { MovescuOptions, MovescuResult, MoveQueryModelValue };\n","/**\n * Retrieve DICOM objects using C-GET via the getscu binary.\n *\n * Sends a C-GET request to a remote DICOM SCP to retrieve\n * DICOM objects directly over the same association.\n *\n * @module getscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isSafePath, isValidDicomKey, isValidAETitle } from '../patterns';\n\n/** Supported C-GET query models. */\nconst GetQueryModel = {\n PATIENT: 'patient',\n STUDY: 'study',\n} as const;\n\n/** Union of valid get query model values. */\ntype GetQueryModelValue = (typeof GetQueryModel)[keyof typeof GetQueryModel];\n\n/** Maps query model values to their CLI flags. */\nconst GET_QUERY_MODEL_FLAGS: Record<GetQueryModelValue, string> = {\n patient: '-P',\n study: '-S',\n};\n\n/** Options for {@link getscu}. */\ninterface GetscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Query model to use. */\n readonly queryModel?: GetQueryModelValue | undefined;\n /** DICOM attribute keys for the query (each becomes -k). */\n readonly keys?: readonly string[] | undefined;\n /** Output directory for retrieved files (maps to -od). */\n readonly outputDirectory?: string | undefined;\n}\n\n/** Result of a successful C-GET retrieval. */\ninterface GetscuResult {\n /** Whether the get completed successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst GetscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n queryModel: z.enum(['patient', 'study']).optional(),\n keys: z.array(z.string().min(1).refine(isValidDicomKey, { message: 'invalid DICOM query key format (expected XXXX,XXXX[=value])' })).optional(),\n outputDirectory: z.string().min(1).refine(isSafePath, { message: 'path traversal detected in outputDirectory' }).optional(),\n })\n .strict();\n\n/**\n * Builds getscu command-line arguments from validated options.\n */\nfunction buildArgs(options: GetscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.queryModel !== undefined) {\n args.push(GET_QUERY_MODEL_FLAGS[options.queryModel]);\n }\n\n if (options.outputDirectory !== undefined) {\n args.push('-od', options.outputDirectory);\n }\n\n if (options.keys !== undefined) {\n for (const key of options.keys) {\n args.push('-k', key);\n }\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Retrieve DICOM objects using C-GET via the getscu binary.\n *\n * @param options - Get options (host and port required)\n * @returns A Result containing the get result or an error\n *\n * @example\n * ```ts\n * const result = await getscu({\n * host: '192.168.1.100',\n * port: 104,\n * queryModel: 'study',\n * outputDirectory: '/tmp/dicom',\n * keys: ['0020,000D=1.2.3.4'],\n * });\n * if (result.ok) {\n * console.log('Get succeeded');\n * }\n * ```\n */\nasync function getscu(options: GetscuOptions): Promise<Result<GetscuResult>> {\n const validation = GetscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('getscu', validation.error));\n }\n\n const binaryResult = resolveBinary('getscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('getscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { getscu, GetQueryModel };\nexport type { GetscuOptions, GetscuResult, GetQueryModelValue };\n","/**\n * Terminate a DICOM association using the termscu binary.\n *\n * Sends an A-ABORT or A-RELEASE request to terminate an existing\n * DICOM association with a remote SCP.\n *\n * @module termscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isValidAETitle } from '../patterns';\n\n/** Options for {@link termscu}. */\ninterface TermscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n}\n\n/** Result of a successful termscu operation. */\ninterface TermscuResult {\n /** Whether the termination succeeded (exit code 0). */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst TermscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n })\n .strict();\n\n/**\n * Builds termscu command-line arguments from validated options.\n */\nfunction buildArgs(options: TermscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Terminates a DICOM association with a remote SCP using the termscu binary.\n *\n * @param options - Termination options (host and port required)\n * @returns A Result containing the termination result or an error\n *\n * @example\n * ```ts\n * const result = await termscu({ host: '192.168.1.100', port: 104 });\n * if (result.ok) {\n * console.log(result.value.success ? 'Terminated' : 'Failed');\n * }\n * ```\n */\nasync function termscu(options: TermscuOptions): Promise<Result<TermscuResult>> {\n const validation = TermscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('termscu', validation.error));\n }\n\n const binaryResult = resolveBinary('termscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('termscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { termscu };\nexport type { TermscuOptions, TermscuResult };\n","/**\n * Dump a DICOM structured report as text using the dsrdump binary.\n *\n * @module dsrdump\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dsrdump}. */\ninterface DsrdumpOptions extends ToolBaseOptions {\n /** Print filename for each document. Maps to +Pf. Defaults to false. */\n readonly printFilename?: boolean | undefined;\n /** Print long format with enhanced details. Maps to +Pl. Defaults to false. */\n readonly printLong?: boolean | undefined;\n /** Print concept name codes. Maps to +Pc. Defaults to false. */\n readonly printCodes?: boolean | undefined;\n}\n\n/** Result of a successful dsrdump operation. */\ninterface DsrdumpResult {\n /** The text output from dsrdump. */\n readonly text: string;\n}\n\nconst DsrdumpOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n printFilename: z.boolean().optional(),\n printLong: z.boolean().optional(),\n printCodes: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dsrdump command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DsrdumpOptions): string[] {\n const args: string[] = [];\n\n if (options?.printFilename === true) {\n args.push('+Pf');\n }\n\n if (options?.printLong === true) {\n args.push('+Pl');\n }\n\n if (options?.printCodes === true) {\n args.push('+Pc');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Dumps a DICOM structured report as text using the dsrdump binary.\n *\n * @param inputPath - Path to the DICOM SR input file\n * @param options - Dump options\n * @returns A Result containing the text dump or an error\n *\n * @example\n * ```ts\n * const result = await dsrdump('/path/to/report.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dsrdump(inputPath: string, options?: DsrdumpOptions): Promise<Result<DsrdumpResult>> {\n const validation = DsrdumpOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dsrdump', validation.error));\n }\n\n const binaryResult = resolveBinary('dsrdump');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dsrdump', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dsrdump };\nexport type { DsrdumpOptions, DsrdumpResult };\n","/**\n * Convert a DICOM structured report to XML using the dsr2xml binary.\n *\n * @module dsr2xml\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dsr2xml}. */\ninterface Dsr2xmlOptions extends ToolBaseOptions {\n /** Use XML namespace. Maps to +Xn. Defaults to false. */\n readonly useNamespace?: boolean | undefined;\n /** Add XML Schema reference. Maps to +Xs. Defaults to false. */\n readonly addSchemaRef?: boolean | undefined;\n}\n\n/** Result of a successful dsr2xml conversion. */\ninterface Dsr2xmlResult {\n /** The XML text output from dsr2xml. */\n readonly text: string;\n}\n\nconst Dsr2xmlOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n useNamespace: z.boolean().optional(),\n addSchemaRef: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dsr2xml command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: Dsr2xmlOptions): string[] {\n const args: string[] = [];\n\n if (options?.useNamespace === true) {\n args.push('+Xn');\n }\n\n if (options?.addSchemaRef === true) {\n args.push('+Xs');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Converts a DICOM structured report to XML using the dsr2xml binary.\n *\n * @param inputPath - Path to the DICOM SR input file\n * @param options - Conversion options\n * @returns A Result containing the XML text or an error\n *\n * @example\n * ```ts\n * const result = await dsr2xml('/path/to/report.dcm', { useNamespace: true });\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dsr2xml(inputPath: string, options?: Dsr2xmlOptions): Promise<Result<Dsr2xmlResult>> {\n const validation = Dsr2xmlOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dsr2xml', validation.error));\n }\n\n const binaryResult = resolveBinary('dsr2xml');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dsr2xml', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dsr2xml };\nexport type { Dsr2xmlOptions, Dsr2xmlResult };\n","/**\n * Convert an XML document to a DICOM structured report using the xml2dsr binary.\n *\n * @module xml2dsr\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link xml2dsr}. */\ninterface Xml2dsrOptions extends ToolBaseOptions {\n /** Generate new Study/Series/SOP Instance UIDs. Maps to +Ug. Defaults to false. */\n readonly generateNewUIDs?: boolean | undefined;\n /** Validate the SR document. Maps to +Vd. Defaults to false. */\n readonly validateDocument?: boolean | undefined;\n}\n\n/** Result of a successful xml2dsr conversion. */\ninterface Xml2dsrResult {\n /** Path to the generated DICOM SR output file. */\n readonly outputPath: string;\n}\n\nconst Xml2dsrOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n generateNewUIDs: z.boolean().optional(),\n validateDocument: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds xml2dsr command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Xml2dsrOptions): string[] {\n const args: string[] = [];\n\n if (options?.generateNewUIDs === true) {\n args.push('+Ug');\n }\n\n if (options?.validateDocument === true) {\n args.push('+Vd');\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Converts an XML document to a DICOM structured report using the xml2dsr binary.\n *\n * @param inputPath - Path to the XML input file\n * @param outputPath - Path for the DICOM SR output file\n * @param options - Conversion options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await xml2dsr('/path/to/report.xml', '/path/to/output.dcm', {\n * generateNewUIDs: true,\n * });\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function xml2dsr(inputPath: string, outputPath: string, options?: Xml2dsrOptions): Promise<Result<Xml2dsrResult>> {\n const validation = Xml2dsrOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('xml2dsr', validation.error));\n }\n\n const binaryResult = resolveBinary('xml2dsr');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('xml2dsr', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { xml2dsr };\nexport type { Xml2dsrOptions, Xml2dsrResult };\n","/**\n * Dump a DICOM RT file as text using the drtdump binary.\n *\n * @module drtdump\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link drtdump}. */\ninterface DrtdumpOptions extends ToolBaseOptions {\n /** Print filename for each document. Maps to +Pf. Defaults to false. */\n readonly printFilename?: boolean | undefined;\n}\n\n/** Result of a successful drtdump operation. */\ninterface DrtdumpResult {\n /** The text output from drtdump. */\n readonly text: string;\n}\n\nconst DrtdumpOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n printFilename: z.boolean().optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds drtdump command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DrtdumpOptions): string[] {\n const args: string[] = [];\n\n if (options?.printFilename === true) {\n args.push('+Pf');\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Dumps a DICOM RT file as text using the drtdump binary.\n *\n * @param inputPath - Path to the DICOM RT input file\n * @param options - Dump options\n * @returns A Result containing the text dump or an error\n *\n * @example\n * ```ts\n * const result = await drtdump('/path/to/rtplan.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function drtdump(inputPath: string, options?: DrtdumpOptions): Promise<Result<DrtdumpResult>> {\n const validation = DrtdumpOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('drtdump', validation.error));\n }\n\n const binaryResult = resolveBinary('drtdump');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('drtdump', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { drtdump };\nexport type { DrtdumpOptions, DrtdumpResult };\n","/**\n * Create a DICOM presentation state from an image using the dcmpsmk binary.\n *\n * Generates a Grayscale Softcopy Presentation State (GSPS)\n * object from a DICOM image file.\n *\n * @module dcmpsmk\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmpsmk}. */\ntype DcmpsmkOptions = ToolBaseOptions;\n\n/** Result of a successful dcmpsmk operation. */\ninterface DcmpsmkResult {\n /** Path to the created presentation state file. */\n readonly outputPath: string;\n}\n\nconst DcmpsmkOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Creates a DICOM presentation state from an image using the dcmpsmk binary.\n *\n * @param inputPath - Path to the DICOM image input file\n * @param outputPath - Path for the created presentation state output file\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmpsmk('/path/to/image.dcm', '/path/to/pstate.dcm');\n * if (result.ok) {\n * console.log(`Created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmpsmk(inputPath: string, outputPath: string, options?: DcmpsmkOptions): Promise<Result<DcmpsmkResult>> {\n const validation = DcmpsmkOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmpsmk', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmpsmk');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmpsmk', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmpsmk };\nexport type { DcmpsmkOptions, DcmpsmkResult };\n","/**\n * Check a DICOM presentation state for consistency using the dcmpschk binary.\n *\n * Validates a Grayscale Softcopy Presentation State (GSPS) object\n * and reports any inconsistencies or errors found.\n *\n * @module dcmpschk\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmpschk}. */\ntype DcmpschkOptions = ToolBaseOptions;\n\n/** Result of a successful dcmpschk operation. */\ninterface DcmpschkResult {\n /** The text output from dcmpschk. */\n readonly text: string;\n}\n\nconst DcmpschkOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Checks a DICOM presentation state for consistency using the dcmpschk binary.\n *\n * @param inputPath - Path to the presentation state DICOM file\n * @param options - Optional execution options\n * @returns A Result containing the validation text output or an error\n *\n * @example\n * ```ts\n * const result = await dcmpschk('/path/to/pstate.dcm');\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmpschk(inputPath: string, options?: DcmpschkOptions): Promise<Result<DcmpschkResult>> {\n const validation = DcmpschkOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmpschk', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmpschk');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmpschk', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmpschk };\nexport type { DcmpschkOptions, DcmpschkResult };\n","/**\n * Send a DICOM print job to a remote printer using the dcmprscu binary.\n *\n * @module dcmprscu\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\nimport { isValidAETitle } from '../patterns';\n\n/** Options for {@link dcmprscu}. */\ninterface DcmprscuOptions extends ToolBaseOptions {\n /** Remote host or IP address. */\n readonly host: string;\n /** Remote port number. */\n readonly port: number;\n /** Calling AE Title. */\n readonly callingAETitle?: string | undefined;\n /** Called AE Title. */\n readonly calledAETitle?: string | undefined;\n /** Path to a configuration file. Maps to -c flag. */\n readonly configFile?: string | undefined;\n}\n\n/** Result of a successful dcmprscu operation. */\ninterface DcmprscuResult {\n /** Whether the print job was sent successfully. */\n readonly success: boolean;\n /** Raw stderr output for diagnostic info. */\n readonly stderr: string;\n}\n\nconst DcmprscuOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n host: z.string().min(1),\n port: z.number().int().min(1).max(65535),\n callingAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n calledAETitle: z.string().min(1).max(16).refine(isValidAETitle, { message: 'AE Title contains invalid characters' }).optional(),\n configFile: z.string().min(1).optional(),\n })\n .strict();\n\n/**\n * Builds dcmprscu command-line arguments from validated options.\n */\nfunction buildArgs(options: DcmprscuOptions): string[] {\n const args: string[] = [];\n\n if (options.callingAETitle !== undefined) {\n args.push('-aet', options.callingAETitle);\n }\n\n if (options.calledAETitle !== undefined) {\n args.push('-aec', options.calledAETitle);\n }\n\n if (options.configFile !== undefined) {\n args.push('-c', options.configFile);\n }\n\n args.push(options.host, String(options.port));\n\n return args;\n}\n\n/**\n * Sends a DICOM print job to a remote printer using the dcmprscu binary.\n *\n * @param options - Print options (host and port required)\n * @returns A Result containing the print result or an error\n *\n * @example\n * ```ts\n * const result = await dcmprscu({\n * host: '192.168.1.100',\n * port: 104,\n * callingAETitle: 'MYSCU',\n * calledAETitle: 'PRINTER',\n * });\n * if (result.ok) {\n * console.log(result.value.success ? 'Print sent' : 'Print failed');\n * }\n * ```\n */\nasync function dcmprscu(options: DcmprscuOptions): Promise<Result<DcmprscuResult>> {\n const validation = DcmprscuOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmprscu', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmprscu');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(options);\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmprscu', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ success: true, stderr: result.value.stderr });\n}\n\nexport { dcmprscu };\nexport type { DcmprscuOptions, DcmprscuResult };\n","/**\n * Read a DICOM print job and render to printer using the dcmpsprt binary.\n *\n * @module dcmpsprt\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmpsprt}. */\ninterface DcmpsprtOptions extends ToolBaseOptions {\n /** Path to a configuration file. Maps to -c flag. */\n readonly configFile?: string | undefined;\n}\n\n/** Result of a successful dcmpsprt operation. */\ninterface DcmpsprtResult {\n /** The text output from dcmpsprt. */\n readonly text: string;\n}\n\nconst DcmpsprtOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n configFile: z.string().min(1).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmpsprt command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, options?: DcmpsprtOptions): string[] {\n const args: string[] = [];\n\n if (options?.configFile !== undefined) {\n args.push('-c', options.configFile);\n }\n\n args.push(inputPath);\n\n return args;\n}\n\n/**\n * Reads a DICOM print job and renders to printer using the dcmpsprt binary.\n *\n * @param inputPath - Path to the DICOM print job file\n * @param options - Optional print options\n * @returns A Result containing the text output or an error\n *\n * @example\n * ```ts\n * const result = await dcmpsprt('/path/to/printjob.dcm', {\n * configFile: '/path/to/config.cfg',\n * });\n * if (result.ok) {\n * console.log(result.value.text);\n * }\n * ```\n */\nasync function dcmpsprt(inputPath: string, options?: DcmpsprtOptions): Promise<Result<DcmpsprtResult>> {\n const validation = DcmpsprtOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmpsprt', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmpsprt');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmpsprt', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ text: result.value.stdout });\n}\n\nexport { dcmpsprt };\nexport type { DcmpsprtOptions, DcmpsprtResult };\n","/**\n * Render a DICOM image with presentation state to a bitmap using the dcmp2pgm binary.\n *\n * @module dcmp2pgm\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmp2pgm}. */\ninterface Dcmp2pgmOptions extends ToolBaseOptions {\n /** Path to a DICOM presentation state file. Maps to -p flag. */\n readonly presentationState?: string | undefined;\n /** Frame number to render (0-based). Maps to -f flag. */\n readonly frame?: number | undefined;\n}\n\n/** Result of a successful dcmp2pgm operation. */\ninterface Dcmp2pgmResult {\n /** Path to the rendered output file. */\n readonly outputPath: string;\n}\n\nconst Dcmp2pgmOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n presentationState: z.string().min(1).optional(),\n frame: z.number().int().min(0).max(65535).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmp2pgm command-line arguments from validated options.\n */\nfunction buildArgs(inputPath: string, outputPath: string, options?: Dcmp2pgmOptions): string[] {\n const args: string[] = [];\n\n if (options?.presentationState !== undefined) {\n args.push('-p', options.presentationState);\n }\n\n if (options?.frame !== undefined) {\n args.push('-f', String(options.frame));\n }\n\n args.push(inputPath, outputPath);\n\n return args;\n}\n\n/**\n * Renders a DICOM image with presentation state to a bitmap using the dcmp2pgm binary.\n *\n * @param inputPath - Path to the DICOM input image file\n * @param outputPath - Path for the rendered output bitmap file\n * @param options - Optional rendering options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmp2pgm('/path/to/input.dcm', '/path/to/output.pgm', {\n * presentationState: '/path/to/state.dcm',\n * frame: 0,\n * });\n * if (result.ok) {\n * console.log(`Rendered: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmp2pgm(inputPath: string, outputPath: string, options?: Dcmp2pgmOptions): Promise<Result<Dcmp2pgmResult>> {\n const validation = Dcmp2pgmOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmp2pgm', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmp2pgm');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(inputPath, outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmp2pgm', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmp2pgm };\nexport type { Dcmp2pgmOptions, Dcmp2pgmResult };\n","/**\n * Add curve data to a DICOM image using the dcmmkcrv binary.\n *\n * @module dcmmkcrv\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/** Options for {@link dcmmkcrv}. */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type -- base options only\ninterface DcmmkcrvOptions extends ToolBaseOptions {}\n\n/** Result of a successful dcmmkcrv operation. */\ninterface DcmmkcrvResult {\n /** Path to the output file with curve data added. */\n readonly outputPath: string;\n}\n\nconst DcmmkcrvOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Adds curve data to a DICOM image using the dcmmkcrv binary.\n *\n * @param inputPath - Path to the input curve data file\n * @param outputPath - Path for the DICOM output file with curve data\n * @param options - Optional execution options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmmkcrv('/path/to/curves.txt', '/path/to/output.dcm');\n * if (result.ok) {\n * console.log(`Curve data added: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmmkcrv(inputPath: string, outputPath: string, options?: DcmmkcrvOptions): Promise<Result<DcmmkcrvResult>> {\n const validation = DcmmkcrvOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmmkcrv', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmmkcrv');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = [inputPath, outputPath];\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmmkcrv', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmmkcrv };\nexport type { DcmmkcrvOptions, DcmmkcrvResult };\n","/**\n * Create DICOM look-up tables using the dcmmklut binary.\n *\n * @module dcmmklut\n */\n\nimport { z } from 'zod';\nimport type { Result } from '../types';\nimport { ok, err } from '../types';\nimport { execCommand } from '../exec';\nimport { DEFAULT_TIMEOUT_MS } from '../constants';\nimport { resolveBinary } from './_resolveBinary';\nimport { createToolError, createValidationError } from './_toolError';\nimport type { ToolBaseOptions } from './_toolTypes';\n\n/**\n * LUT type presets for dcmmklut.\n */\nconst LutType = {\n /** Modality LUT. */\n MODALITY: 'modality',\n /** Presentation LUT. */\n PRESENTATION: 'presentation',\n /** VOI LUT. */\n VOI: 'voi',\n} as const;\n\ntype LutTypeValue = (typeof LutType)[keyof typeof LutType];\n\nconst LUT_TYPE_FLAGS: Record<LutTypeValue, string> = {\n modality: '+Tm',\n presentation: '+Tp',\n voi: '+Tv',\n};\n\n/** Options for {@link dcmmklut}. */\ninterface DcmmklutOptions extends ToolBaseOptions {\n /** Type of LUT to create. Maps to +Tm, +Tp, or +Tv flags. */\n readonly lutType?: LutTypeValue | undefined;\n /** Gamma value for the LUT curve. Maps to +Cg flag. */\n readonly gamma?: number | undefined;\n /** Number of entries in the LUT. Maps to -e flag. */\n readonly entries?: number | undefined;\n /** Number of bits per LUT entry (8-16). Maps to -b flag. */\n readonly bits?: number | undefined;\n}\n\n/** Result of a successful dcmmklut operation. */\ninterface DcmmklutResult {\n /** Path to the created LUT output file. */\n readonly outputPath: string;\n}\n\nconst DcmmklutOptionsSchema = z\n .object({\n timeoutMs: z.number().int().positive().optional(),\n signal: z.instanceof(AbortSignal).optional(),\n lutType: z.enum(['modality', 'presentation', 'voi']).optional(),\n gamma: z.number().positive().optional(),\n entries: z.number().int().positive().optional(),\n bits: z.number().int().min(8).max(16).optional(),\n })\n .strict()\n .optional();\n\n/**\n * Builds dcmmklut command-line arguments from validated options.\n */\nfunction buildArgs(outputPath: string, options?: DcmmklutOptions): string[] {\n const args: string[] = [];\n\n if (options?.lutType !== undefined) {\n args.push(LUT_TYPE_FLAGS[options.lutType]);\n }\n\n if (options?.gamma !== undefined) {\n args.push('+Cg', String(options.gamma));\n }\n\n if (options?.entries !== undefined) {\n args.push('-e', String(options.entries));\n }\n\n if (options?.bits !== undefined) {\n args.push('-b', String(options.bits));\n }\n\n args.push(outputPath);\n\n return args;\n}\n\n/**\n * Creates DICOM look-up tables using the dcmmklut binary.\n *\n * @param outputPath - Path for the LUT output file\n * @param options - Optional LUT creation options\n * @returns A Result containing the output path or an error\n *\n * @example\n * ```ts\n * const result = await dcmmklut('/path/to/output.dcm', {\n * lutType: 'voi',\n * gamma: 2.2,\n * entries: 256,\n * bits: 12,\n * });\n * if (result.ok) {\n * console.log(`LUT created: ${result.value.outputPath}`);\n * }\n * ```\n */\nasync function dcmmklut(outputPath: string, options?: DcmmklutOptions): Promise<Result<DcmmklutResult>> {\n const validation = DcmmklutOptionsSchema.safeParse(options);\n if (!validation.success) {\n return err(createValidationError('dcmmklut', validation.error));\n }\n\n const binaryResult = resolveBinary('dcmmklut');\n if (!binaryResult.ok) {\n return err(binaryResult.error);\n }\n\n const args = buildArgs(outputPath, options);\n const timeoutMs = options?.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const result = await execCommand(binaryResult.value, args, {\n timeoutMs,\n signal: options?.signal,\n });\n\n if (!result.ok) {\n return err(result.error);\n }\n\n if (result.value.exitCode !== 0) {\n return err(createToolError('dcmmklut', args, result.value.exitCode, result.value.stderr));\n }\n\n return ok({ outputPath });\n}\n\nexport { dcmmklut, LutType };\nexport type { DcmmklutOptions, DcmmklutResult, LutTypeValue };\n"]}
|