@bendyline/docblocks-cli 1.1.2 → 2.1.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 +55 -94
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7183 -18
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
- package/dist/commands/build.d.ts +0 -14
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/convert.d.ts +0 -32
- package/dist/commands/convert.d.ts.map +0 -1
- package/dist/commands/convert.js +0 -168
- package/dist/commands/convert.js.map +0 -1
- package/dist/commands/init.d.ts +0 -3
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -23
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/mcp.d.ts +0 -12
- package/dist/commands/mcp.d.ts.map +0 -1
- package/dist/commands/mcp.js +0 -20
- package/dist/commands/mcp.js.map +0 -1
- package/dist/commands/parse.d.ts +0 -6
- package/dist/commands/parse.d.ts.map +0 -1
- package/dist/commands/parse.js +0 -38
- package/dist/commands/parse.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -28
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -182
- package/dist/commands/serve.js.map +0 -1
- package/dist/commands/themes.d.ts +0 -6
- package/dist/commands/themes.d.ts.map +0 -1
- package/dist/commands/themes.js +0 -15
- package/dist/commands/themes.js.map +0 -1
- package/dist/commands/transforms.d.ts +0 -6
- package/dist/commands/transforms.d.ts.map +0 -1
- package/dist/commands/transforms.js +0 -15
- package/dist/commands/transforms.js.map +0 -1
- package/dist/commands/video.d.ts +0 -31
- package/dist/commands/video.d.ts.map +0 -1
- package/dist/commands/video.js +0 -116
- package/dist/commands/video.js.map +0 -1
- package/dist/converters/docx-to-md.d.ts +0 -10
- package/dist/converters/docx-to-md.d.ts.map +0 -1
- package/dist/converters/docx-to-md.js +0 -17
- package/dist/converters/docx-to-md.js.map +0 -1
- package/dist/converters/pdf-to-md.d.ts +0 -14
- package/dist/converters/pdf-to-md.d.ts.map +0 -1
- package/dist/converters/pdf-to-md.js +0 -51
- package/dist/converters/pdf-to-md.js.map +0 -1
- package/dist/converters/pptx-to-md.d.ts +0 -13
- package/dist/converters/pptx-to-md.d.ts.map +0 -1
- package/dist/converters/pptx-to-md.js +0 -67
- package/dist/converters/pptx-to-md.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/mcp/server.d.ts +0 -12
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js +0 -518
- package/dist/mcp/server.js.map +0 -1
- package/dist/render-html.d.ts +0 -9
- package/dist/render-html.d.ts.map +0 -1
- package/dist/render-html.js +0 -60
- package/dist/render-html.js.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/dist/version.js +0 -15
- package/dist/version.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,qEAAqE,CAAC;KAClF,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAEhC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACtC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AAEjC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"sources":["../src/internal/file-stat.ts","../src/internal/paths.ts","../src/contained-file.ts","../src/internal/node-error.ts","../src/internal/link-support.ts","../src/internal/cancellation.ts","../src/mcp/artifact-store.ts","../src/mcp/authority.ts","../src/version.ts","../src/mcp/output-bounds.ts","../src/mcp/document-service.ts","../src/mcp/intelligence.ts","../src/mcp/preview-service.ts","../src/mcp/rendered-conversion.ts","../src/mcp/conversion-service.ts","../src/mcp/error-result.ts","../src/mcp/progress.ts","../src/mcp/agentic-tools.ts","../src/mcp/discovery-tools.ts","../src/mcp/prompts.ts","../src/mcp/server.ts","../src/index.ts","../src/commands/build.ts","../src/render-html.ts","../src/internal/limits.ts","../src/commands/serve.ts","../src/preview-policy.ts","../src/commands/convert.ts","../src/commands/video.ts","../src/commands/mcp.ts","../src/commands/themes.ts","../src/commands/transforms.ts","../src/commands/parse.ts"],"sourcesContent":["import type { Stats } from 'node:fs';\nimport { open } from 'node:fs/promises';\n\n/**\n * Stat a pathname through a fresh descriptor so it is comparable with fstat.\n * Node 22 on Windows reports a device id from fstat but zero from stat(path).\n */\nexport async function statFileThroughDescriptor(filePath: string): Promise<Stats> {\n const handle = await open(filePath, 'r');\n try {\n return await handle.stat();\n } finally {\n await handle.close();\n }\n}\n","import path from 'node:path';\n\n/**\n * Load-bearing containment predicate shared by every DocBlocks CLI surface.\n *\n * `root` and `candidate` must already be the *physical* paths the caller\n * intends to compare — this function deliberately does not resolve symlinks.\n * Callers are responsible for `realpath()`ing first (see `contained-file.ts`,\n * `render-html.ts`, and `mcp/authority.ts`); this only answers \"is this\n * resolved path the root itself, or below it?\".\n *\n * It is a path-relationship check rather than a string-prefix check, so a\n * sibling directory that merely shares a textual prefix (`/work/docs-escape`\n * against a `/work/docs` root) is correctly rejected.\n */\nexport function isPathInside(root: string, candidate: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(candidate));\n return (\n relative === '' ||\n (!relative.startsWith(`..${path.sep}`) && relative !== '..' && !path.isAbsolute(relative))\n );\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { statFileThroughDescriptor } from './internal/file-stat.js';\nimport { isPathInside } from './internal/paths.js';\n\nconst CONTAINED_READ_CHUNK_BYTES = 64 * 1024;\n\nexport interface ContainedFileReadOptions {\n signal?: AbortSignal;\n /** Test seam after each bounded read chunk, before cancellation is rechecked. */\n afterReadChunk?(readBytes: number, totalBytes: number): Promise<void> | void;\n}\n\n/** Read one regular file only after physical containment and descriptor identity checks. */\nexport async function readContainedFile(\n rootPath: string,\n candidatePath: string,\n maximumBytes: number,\n options: ContainedFileReadOptions = {},\n): Promise<Buffer> {\n const { signal, afterReadChunk } = options;\n signal?.throwIfAborted();\n const physicalRoot = await fs.realpath(path.resolve(rootPath));\n signal?.throwIfAborted();\n const physicalCandidate = await fs.realpath(path.resolve(candidatePath));\n signal?.throwIfAborted();\n if (!isPathInside(physicalRoot, physicalCandidate)) {\n throw new Error('File is outside the authorized root');\n }\n\n const handle = await fs.open(physicalCandidate, 'r');\n try {\n signal?.throwIfAborted();\n const before = await handle.stat();\n signal?.throwIfAborted();\n if (!before.isFile() || before.size > maximumBytes) {\n throw new Error('File exceeds the configured size limit');\n }\n await assertIdentity(physicalRoot, physicalCandidate, before, signal);\n signal?.throwIfAborted();\n\n const result = Buffer.alloc(before.size);\n let offset = 0;\n while (offset < result.length) {\n signal?.throwIfAborted();\n const length = Math.min(CONTAINED_READ_CHUNK_BYTES, result.length - offset);\n const { bytesRead } = await handle.read(result, offset, length, offset);\n if (bytesRead === 0) break;\n offset += bytesRead;\n await afterReadChunk?.(offset, result.length);\n signal?.throwIfAborted();\n }\n signal?.throwIfAborted();\n const extra = Buffer.alloc(1);\n if ((await handle.read(extra, 0, 1, offset)).bytesRead > 0) {\n throw new Error('File grew beyond the configured size limit');\n }\n signal?.throwIfAborted();\n\n const after = await handle.stat();\n signal?.throwIfAborted();\n if (\n before.dev !== after.dev ||\n before.ino !== after.ino ||\n before.size !== after.size ||\n before.mtimeMs !== after.mtimeMs\n ) {\n throw new Error('File changed while it was being read');\n }\n await assertIdentity(physicalRoot, physicalCandidate, after, signal);\n signal?.throwIfAborted();\n return result.subarray(0, offset);\n } finally {\n await handle.close();\n }\n}\n\nasync function assertIdentity(\n physicalRoot: string,\n candidatePath: string,\n descriptorStat: Awaited<ReturnType<fs.FileHandle['stat']>>,\n signal?: AbortSignal,\n): Promise<void> {\n signal?.throwIfAborted();\n const physicalCandidate = await fs.realpath(candidatePath);\n signal?.throwIfAborted();\n if (!isPathInside(physicalRoot, physicalCandidate)) {\n throw new Error('File escaped the authorized root while it was being read');\n }\n const pathStat = await statFileThroughDescriptor(physicalCandidate);\n signal?.throwIfAborted();\n if (descriptorStat.dev !== pathStat.dev || descriptorStat.ino !== pathStat.ino) {\n throw new Error('File changed physical identity while it was being read');\n }\n}\n","/**\n * Narrow an unknown throw to a Node `errno` error carrying one of `codes`.\n *\n * Accepts a single code or a list so callers can keep grouping related codes\n * (`ENOENT`/`ENOTDIR` for absence, `EACCES`/`EPERM` for permission).\n */\nexport function isNodeErrorCode(\n error: unknown,\n codes: string | readonly string[],\n): error is NodeJS.ErrnoException {\n if (!(error instanceof Error) || !('code' in error)) return false;\n const code = String(error.code);\n return typeof codes === 'string' ? code === codes : codes.includes(code);\n}\n","import { isNodeErrorCode } from './node-error.js';\n\n/**\n * Errnos that mean \"this filesystem cannot create hard links at all\", as\n * opposed to \"this particular link was refused\".\n *\n * Hard-link publication is an elegant atomic create-if-absent on NTFS and\n * ext4, but FAT32/exFAT and some SMB/network mounts have no hard-link concept.\n * POSIX specifies EPERM for \"the filesystem does not support links\", Linux\n * vfat returns EPERM, and Windows surfaces the same refusal for exFAT targets.\n * ENOSYS/ENOTSUP/EOPNOTSUPP appear on other non-linking mounts, EXDEV means the\n * two names are not on one filesystem, and EMLINK means the link count is\n * exhausted — in every case no link can be created, but an exclusive create\n * still can.\n *\n * EEXIST is deliberately absent: it means the target is genuinely occupied and\n * MUST still refuse rather than fall back. EACCES is likewise absent: it is a\n * genuine permission denial, not a missing filesystem feature.\n */\nconst LINK_UNSUPPORTED_CODES: readonly string[] = [\n 'EPERM',\n 'ENOSYS',\n 'ENOTSUP',\n 'EOPNOTSUPP',\n 'EXDEV',\n 'EMLINK',\n];\n\n/** True when `error` proves the filesystem cannot publish through a hard link. */\nexport function isLinkUnsupportedError(error: unknown): boolean {\n return isNodeErrorCode(error, LINK_UNSUPPORTED_CODES);\n}\n","/**\n * Cancellation helpers shared by the CLI commands and the MCP services.\n *\n * A caller-supplied abort reason is always preserved so cancellation stays\n * attributable. When a signal aborts without a usable reason, a synthesized\n * `AbortError` carrying the operation-specific `message` is thrown instead —\n * every caller therefore receives an `Error`, never a bare `null`.\n */\nexport function cancellationError(message: string): Error {\n const error = new Error(message);\n error.name = 'AbortError';\n return error;\n}\n\nexport function throwIfAborted(signal: AbortSignal | undefined, message: string): void {\n if (!signal?.aborted) return;\n throw signal.reason ?? cancellationError(message);\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport { mkdtemp, open, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport {\n MCP_WIRE_LIMITS,\n parseConversionResult,\n type AppliedOption,\n type ArtifactRef,\n type ConversionResult,\n type EngineVersion,\n} from '@bendyline/docblocks/mcp';\nimport {\n cancellationError,\n throwIfAborted as throwIfSignalAborted,\n} from '../internal/cancellation.js';\n\nconst DEFAULT_MAX_ARTIFACT_BYTES = 500 * 1024 * 1024;\nconst DEFAULT_MAX_TOTAL_BYTES = 1024 * 1024 * 1024;\nconst DEFAULT_MAX_ARTIFACTS = 64;\nconst DEFAULT_ARTIFACT_TTL_MS = 30 * 60 * 1000;\nconst DEFAULT_MAX_RESOURCE_BYTES = 25 * 1024 * 1024;\nconst DEFAULT_MAX_REPORT_BYTES = 8 * 1024 * 1024;\nconst DEFAULT_MAX_REPORT_TOTAL_BYTES = 64 * 1024 * 1024;\nconst ARTIFACT_IO_CHUNK_BYTES = 1024 * 1024;\nconst ARTIFACT_IO_DISPOSE_DRAIN_MS = 250;\n\nexport const MCP_ARTIFACT_STORE_LIMITS = Object.freeze({\n maxArtifactBytes: MCP_WIRE_LIMITS.artifactBytes,\n maxArtifactTotalBytes: 4 * 1024 * 1024 * 1024,\n maxArtifactCount: 1_024,\n artifactTtlMs: 24 * 60 * 60 * 1_000,\n maxArtifactResourceBytes: 100 * 1024 * 1024,\n maxArtifactReportBytes: 32 * 1024 * 1024,\n maxArtifactReportTotalBytes: 256 * 1024 * 1024,\n});\n\nexport interface ArtifactStoreOptions {\n maxArtifactBytes?: number;\n maxArtifactTotalBytes?: number;\n maxArtifactCount?: number;\n artifactTtlMs?: number;\n maxArtifactResourceBytes?: number;\n maxArtifactReportBytes?: number;\n maxArtifactReportTotalBytes?: number;\n}\n\nexport interface PutArtifactOptions {\n bytes: Uint8Array;\n format: string;\n mimeType: string;\n sourceFormat?: string | null;\n sourceSha256?: string | null;\n suggestedFilename: string;\n appliedOptions?: readonly AppliedOption[];\n engineVersions?: readonly EngineVersion[];\n}\n\ninterface ArtifactReadOptions {\n signal: AbortSignal;\n maximumBytes: number;\n expectedBytes: number;\n}\n\ninterface ArtifactStoreDependencies {\n readFile(path: string, options: ArtifactReadOptions): Promise<Buffer>;\n writeFile(path: string, bytes: Buffer, signal: AbortSignal): Promise<void>;\n}\n\nconst DEFAULT_ARTIFACT_STORE_DEPENDENCIES: ArtifactStoreDependencies = Object.freeze({\n readFile: readFileCancellable,\n writeFile: writeFileCancellable,\n});\n\ninterface StoredArtifact {\n ref: ArtifactRef;\n path: string;\n conversionReport: string | null;\n reportBytes: number;\n activeReaders: number;\n pendingDelete: boolean;\n}\n\ninterface ArtifactIoLease {\n controller: AbortController;\n done: Promise<void>;\n complete: () => void;\n detachExternalSignal: () => void;\n}\n\ninterface ArtifactReservation {\n bytes: number;\n active: boolean;\n}\n\n/**\n * Per-server immutable artifact storage. Artifacts are deliberately scoped to\n * one MCP server instance: an opaque URI from another session conveys no\n * authority and cannot be resolved here.\n */\nexport class ArtifactStore {\n private readonly directory: Promise<string>;\n private readonly records = new Map<string, StoredArtifact>();\n private readonly maximumArtifactBytes: number;\n private readonly maximumTotalBytes: number;\n private readonly maximumCount: number;\n private readonly ttlMs: number;\n private readonly maximumResourceBytes: number;\n private readonly maximumReportBytes: number;\n private readonly maximumReportTotalBytes: number;\n private totalBytes = 0;\n private totalReportBytes = 0;\n private reservedBytes = 0;\n private reservedCount = 0;\n private disposed = false;\n private disposePromise: Promise<void> | null = null;\n private readonly activeIo = new Set<ArtifactIoLease>();\n private tail: Promise<void> = Promise.resolve();\n private readonly dependencies: ArtifactStoreDependencies;\n\n public constructor(\n options: ArtifactStoreOptions = {},\n dependencies: Partial<ArtifactStoreDependencies> = {},\n ) {\n this.dependencies = { ...DEFAULT_ARTIFACT_STORE_DEPENDENCIES, ...dependencies };\n this.maximumArtifactBytes = positiveInteger(\n options.maxArtifactBytes ?? DEFAULT_MAX_ARTIFACT_BYTES,\n 'artifact byte limit',\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactBytes,\n );\n this.maximumTotalBytes = positiveInteger(\n options.maxArtifactTotalBytes ?? DEFAULT_MAX_TOTAL_BYTES,\n 'artifact total-byte limit',\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactTotalBytes,\n );\n this.maximumCount = positiveInteger(\n options.maxArtifactCount ?? DEFAULT_MAX_ARTIFACTS,\n 'artifact count limit',\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactCount,\n );\n this.ttlMs = positiveInteger(\n options.artifactTtlMs ?? DEFAULT_ARTIFACT_TTL_MS,\n 'artifact TTL',\n MCP_ARTIFACT_STORE_LIMITS.artifactTtlMs,\n );\n this.maximumResourceBytes = positiveInteger(\n options.maxArtifactResourceBytes ?? DEFAULT_MAX_RESOURCE_BYTES,\n 'artifact resource byte limit',\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactResourceBytes,\n );\n this.maximumReportBytes = positiveInteger(\n options.maxArtifactReportBytes ?? DEFAULT_MAX_REPORT_BYTES,\n 'artifact report byte limit',\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactReportBytes,\n );\n this.maximumReportTotalBytes = positiveInteger(\n options.maxArtifactReportTotalBytes ?? DEFAULT_MAX_REPORT_TOTAL_BYTES,\n 'artifact report total-byte limit',\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactReportTotalBytes,\n );\n if (this.maximumTotalBytes < this.maximumArtifactBytes) {\n throw new Error('Artifact total-byte limit must be at least the per-artifact limit');\n }\n if (this.maximumReportTotalBytes < this.maximumReportBytes) {\n throw new Error('Artifact report total-byte limit must be at least the per-report limit');\n }\n this.directory = mkdtemp(join(tmpdir(), 'docblocks-mcp-artifacts-'));\n // Construction is synchronous for server setup, while the backing\n // directory is not. Observe failure immediately and expose it through\n // ready() so transport admission can fail deterministically.\n void this.directory.catch(() => undefined);\n }\n\n /** Resolve only after the session-scoped backing directory exists. */\n public async ready(): Promise<void> {\n await this.directory;\n }\n\n public async put(options: PutArtifactOptions, signal?: AbortSignal): Promise<ArtifactRef> {\n throwIfAborted(signal);\n const bytes = Buffer.from(options.bytes);\n if (bytes.byteLength > this.maximumArtifactBytes) {\n throw new Error('MCP artifact exceeds the configured per-artifact limit');\n }\n const sha256 = await hashBytesCancellable(bytes, signal);\n const id = randomUUID();\n const path = join(await this.directory, `${id}.artifact`);\n throwIfAborted(signal);\n const created = new Date();\n const ref = immutableArtifactRef({\n id,\n uri: `docblocks://artifacts/${id}`,\n format: options.format,\n mimeType: options.mimeType,\n size: bytes.byteLength,\n sha256,\n sourceFormat: options.sourceFormat ?? null,\n sourceSha256: options.sourceSha256 ?? null,\n suggestedFilename: options.suggestedFilename,\n appliedOptions: options.appliedOptions ?? [],\n engineVersions: options.engineVersions ?? [],\n createdAt: created.toISOString(),\n expiresAt: new Date(created.getTime() + this.ttlMs).toISOString(),\n });\n const reservation: ArtifactReservation = { bytes: bytes.byteLength, active: true };\n const acquisition = await this.lock(() => {\n this.assertActive();\n throwIfAborted(signal);\n const expiredPaths = this.takeExpiredLocked();\n if (this.records.size + this.reservedCount >= this.maximumCount) {\n throw new Error('MCP artifact store reached its configured count limit');\n }\n if (this.totalBytes + this.reservedBytes + bytes.byteLength > this.maximumTotalBytes) {\n throw new Error('MCP artifact store reached its configured total-byte limit');\n }\n this.reservedCount += 1;\n this.reservedBytes += bytes.byteLength;\n return { expiredPaths, io: this.createIoLeaseLocked(signal) };\n });\n await removeFilesBestEffort(acquisition.expiredPaths);\n\n try {\n await this.dependencies.writeFile(path, bytes, acquisition.io.controller.signal);\n throwIfAborted(acquisition.io.controller.signal);\n await this.lock(() => {\n this.assertActive();\n throwIfAborted(acquisition.io.controller.signal);\n this.releaseReservationLocked(reservation);\n this.records.set(id, {\n ref,\n path,\n conversionReport: null,\n reportBytes: 0,\n activeReaders: 0,\n pendingDelete: false,\n });\n this.totalBytes += bytes.byteLength;\n });\n // Publication is the commit boundary. Cancellation after this point must\n // not report a failure for an artifact that is already discoverable.\n return ref;\n } catch (caught: unknown) {\n await this.lock(() => this.releaseReservationLocked(reservation));\n await rm(path, { force: true }).catch(() => undefined);\n throw caught;\n } finally {\n this.completeIoLease(acquisition.io);\n }\n }\n\n public async get(uriOrId: string, signal?: AbortSignal): Promise<ArtifactRef> {\n throwIfAborted(signal);\n return (await this.record(uriOrId)).ref;\n }\n\n /** Persist the exact bounded conversion report beside its immutable artifact. */\n public async attachConversionReport(report: ConversionResult): Promise<void> {\n const parsed = parseConversionResult(report);\n if (!parsed) throw new Error('Invalid MCP conversion report');\n const serialized = JSON.stringify(parsed);\n const reportBytes = Buffer.byteLength(serialized, 'utf8');\n if (reportBytes > this.maximumReportBytes) {\n throw new Error('MCP conversion report exceeds the configured byte limit');\n }\n await this.lock(() => {\n this.assertActive();\n const stored = this.records.get(artifactId(parsed.artifact.uri));\n if (!stored || !sameArtifact(stored.ref, parsed.artifact)) {\n throw new Error('Conversion report does not match an active MCP artifact');\n }\n const nextTotal = this.totalReportBytes - stored.reportBytes + reportBytes;\n if (nextTotal > this.maximumReportTotalBytes) {\n throw new Error('MCP conversion reports exceed the configured aggregate byte limit');\n }\n // `put()` and this attachment are one publication lifecycle in the\n // conversion service. Do not let an intentionally tiny test TTL split\n // those two steps; ordinary reads still enforce expiration immediately.\n stored.conversionReport = serialized;\n this.totalReportBytes = nextTotal;\n stored.reportBytes = reportBytes;\n });\n }\n\n /** Retrieve a fresh validated copy of an artifact's original conversion report. */\n public async getConversionReport(uriOrId: string): Promise<ConversionResult> {\n const stored = await this.record(uriOrId);\n if (!stored.conversionReport) throw new Error('MCP artifact has no conversion report');\n const parsed = parseConversionResult(JSON.parse(stored.conversionReport) as unknown);\n if (!parsed) throw new Error('Stored MCP conversion report is corrupt');\n return parsed;\n }\n\n /** Remove an unpublished artifact after a later atomic lifecycle step fails. */\n public async discard(uriOrId: string): Promise<void> {\n const removed = await this.lock(() => {\n this.assertActive();\n const expiredPaths = this.takeExpiredLocked();\n const id = artifactId(uriOrId);\n const stored = this.records.get(id);\n return {\n expiredPaths,\n path: stored ? this.removeRecordLocked(id, stored) : null,\n };\n });\n await removeFilesBestEffort(removed.expiredPaths);\n if (removed.path) await rm(removed.path, { force: true });\n }\n\n public async read(uriOrId: string, signal?: AbortSignal): Promise<Buffer> {\n return this.readBytes(uriOrId, this.maximumArtifactBytes, signal);\n }\n\n /** Resource reads are opt-in but still bounded to avoid accidental huge base64 responses. */\n public async readResource(\n uriOrId: string,\n signal?: AbortSignal,\n ): Promise<{ ref: ArtifactRef; bytes: Buffer }> {\n const result = await this.readBytesWithRef(uriOrId, this.maximumResourceBytes, signal, true);\n return { ref: result.ref, bytes: result.bytes };\n }\n\n public async completeIds(prefix: string): Promise<string[]> {\n const result = await this.lock(() => {\n this.assertActive();\n return {\n expiredPaths: this.takeExpiredLocked(),\n ids: [...this.records.keys()]\n .filter((id) => id.startsWith(prefix))\n .sort()\n .slice(0, 100),\n };\n });\n await removeFilesBestEffort(result.expiredPaths);\n return result.ids;\n }\n\n /** Complete only artifacts that have an attached conversion report. */\n public async completeReportIds(prefix: string): Promise<string[]> {\n const result = await this.lock(() => {\n this.assertActive();\n return {\n expiredPaths: this.takeExpiredLocked(),\n ids: [...this.records.entries()]\n .filter(([id, stored]) => id.startsWith(prefix) && stored.conversionReport !== null)\n .map(([id]) => id)\n .sort()\n .slice(0, 100),\n };\n });\n await removeFilesBestEffort(result.expiredPaths);\n return result.ids;\n }\n\n public dispose(): Promise<void> {\n this.disposePromise ??= this.disposeOnce();\n return this.disposePromise;\n }\n\n private async record(uriOrId: string): Promise<StoredArtifact> {\n const result = await this.lock(() => {\n this.assertActive();\n const expiredPaths = this.takeExpiredLocked();\n return { expiredPaths, stored: this.findRecordLocked(uriOrId) };\n });\n await removeFilesBestEffort(result.expiredPaths);\n return result.stored;\n }\n\n private findRecordLocked(uriOrId: string): StoredArtifact {\n const id = artifactId(uriOrId);\n const stored = this.records.get(id);\n if (!stored) throw new Error('Unknown or expired MCP artifact');\n return stored;\n }\n\n private takeExpiredLocked(): string[] {\n const now = Date.now();\n const paths: string[] = [];\n for (const [id, stored] of this.records) {\n const expiresAt = stored.ref.expiresAt\n ? Date.parse(stored.ref.expiresAt)\n : Number.POSITIVE_INFINITY;\n if (expiresAt > now) continue;\n const path = this.removeRecordLocked(id, stored);\n if (path) paths.push(path);\n }\n return paths;\n }\n\n private async readBytes(\n uriOrId: string,\n maximumBytes: number,\n signal?: AbortSignal,\n ): Promise<Buffer> {\n return (await this.readBytesWithRef(uriOrId, maximumBytes, signal, false)).bytes;\n }\n\n private async readBytesWithRef(\n uriOrId: string,\n maximumBytes: number,\n signal: AbortSignal | undefined,\n resourceRead: boolean,\n ): Promise<{ ref: ArtifactRef; bytes: Buffer }> {\n throwIfAborted(signal);\n const acquisition = await this.lock(() => {\n this.assertActive();\n throwIfAborted(signal);\n const expiredPaths = this.takeExpiredLocked();\n const stored = this.findRecordLocked(uriOrId);\n if (stored.ref.size > maximumBytes) {\n if (resourceRead) {\n throw new Error('Artifact is too large for an MCP resource response; use save_artifact');\n }\n throw new Error('MCP artifact exceeds the configured read byte limit');\n }\n const io = this.createIoLeaseLocked(signal);\n stored.activeReaders += 1;\n return { expiredPaths, stored, io };\n });\n await removeFilesBestEffort(acquisition.expiredPaths);\n\n try {\n const bytes = await this.dependencies.readFile(acquisition.stored.path, {\n signal: acquisition.io.controller.signal,\n maximumBytes,\n expectedBytes: acquisition.stored.ref.size,\n });\n throwIfAborted(acquisition.io.controller.signal);\n if (bytes.byteLength !== acquisition.stored.ref.size) {\n throw new Error('Stored MCP artifact byte length does not match its immutable metadata');\n }\n return { ref: acquisition.stored.ref, bytes };\n } finally {\n let deletePath: string | null = null;\n await this.lock(() => {\n acquisition.stored.activeReaders -= 1;\n if (acquisition.stored.activeReaders === 0 && acquisition.stored.pendingDelete) {\n deletePath = acquisition.stored.path;\n }\n });\n this.completeIoLease(acquisition.io);\n if (deletePath) await rm(deletePath, { force: true }).catch(() => undefined);\n }\n }\n\n private removeRecordLocked(id: string, stored: StoredArtifact): string | null {\n this.records.delete(id);\n this.totalBytes -= stored.ref.size;\n this.totalReportBytes -= stored.reportBytes;\n if (stored.activeReaders > 0) {\n stored.pendingDelete = true;\n return null;\n }\n return stored.path;\n }\n\n private releaseReservationLocked(reservation: ArtifactReservation): void {\n if (!reservation.active) return;\n reservation.active = false;\n this.reservedCount -= 1;\n this.reservedBytes -= reservation.bytes;\n }\n\n private createIoLeaseLocked(externalSignal?: AbortSignal): ArtifactIoLease {\n throwIfAborted(externalSignal);\n const controller = new AbortController();\n const forwardCancellation = (): void =>\n controller.abort(\n externalSignal?.reason ?? cancellationError('MCP artifact I/O was cancelled'),\n );\n if (externalSignal)\n externalSignal.addEventListener('abort', forwardCancellation, { once: true });\n let resolveDone: () => void = () => undefined;\n let completed = false;\n const done = new Promise<void>((resolve) => {\n resolveDone = resolve;\n });\n const lease: ArtifactIoLease = {\n controller,\n done,\n complete: () => {\n if (completed) return;\n completed = true;\n resolveDone();\n },\n detachExternalSignal: () => externalSignal?.removeEventListener('abort', forwardCancellation),\n };\n this.activeIo.add(lease);\n return lease;\n }\n\n private completeIoLease(lease: ArtifactIoLease): void {\n lease.detachExternalSignal();\n this.activeIo.delete(lease);\n lease.complete();\n }\n\n private async disposeOnce(): Promise<void> {\n const leases = await this.lock(() => {\n if (this.disposed) return [] as ArtifactIoLease[];\n this.disposed = true;\n for (const stored of this.records.values()) stored.pendingDelete = true;\n this.records.clear();\n this.totalBytes = 0;\n this.totalReportBytes = 0;\n const current = [...this.activeIo];\n const reason = new Error('MCP artifact store is disposed');\n reason.name = 'ArtifactStoreDisposedError';\n for (const lease of current) {\n if (!lease.controller.signal.aborted) lease.controller.abort(reason);\n }\n return current;\n });\n await waitForIoDrain(leases, ARTIFACT_IO_DISPOSE_DRAIN_MS);\n for (const lease of leases) {\n lease.detachExternalSignal();\n this.activeIo.delete(lease);\n }\n await rm(await this.directory, { recursive: true, force: true, maxRetries: 3, retryDelay: 20 });\n }\n\n private assertActive(): void {\n if (this.disposed) throw new Error('MCP artifact store is disposed');\n }\n\n private async lock<T>(work: () => T | Promise<T>): Promise<T> {\n let release: (() => void) | undefined;\n const previous = this.tail;\n this.tail = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n return await work();\n } finally {\n release?.();\n }\n }\n}\n\nfunction artifactId(uriOrId: string): string {\n const artifactIdPattern =\n /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u;\n if (artifactIdPattern.test(uriOrId)) {\n return uriOrId;\n }\n let parsed: URL;\n try {\n parsed = new URL(uriOrId);\n } catch {\n throw new Error('Invalid MCP artifact URI');\n }\n const id = parsed.pathname.slice(1);\n if (\n parsed.protocol !== 'docblocks:' ||\n parsed.hostname !== 'artifacts' ||\n parsed.username !== '' ||\n parsed.password !== '' ||\n parsed.port !== '' ||\n parsed.search !== '' ||\n parsed.hash !== '' ||\n parsed.pathname !== `/${id}` ||\n !artifactIdPattern.test(id) ||\n uriOrId !== `docblocks://artifacts/${id}`\n ) {\n throw new Error('Invalid MCP artifact URI');\n }\n return id;\n}\n\nfunction positiveInteger(value: number, label: string, maximum: number): number {\n if (!Number.isSafeInteger(value) || value < 1 || value > maximum) {\n throw new Error(`Invalid MCP ${label}; maximum is ${maximum}`);\n }\n return value;\n}\n\nfunction sameArtifact(left: ArtifactRef, right: ArtifactRef): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\n/** Clone and freeze every caller-controlled layer before metadata enters quota accounting. */\nfunction immutableArtifactRef(ref: ArtifactRef): ArtifactRef {\n const appliedOptions = Object.freeze(\n ref.appliedOptions.map((option) => Object.freeze({ ...option })),\n );\n const engineVersions = Object.freeze(\n ref.engineVersions.map((engine) => Object.freeze({ ...engine })),\n );\n return Object.freeze({ ...ref, appliedOptions, engineVersions });\n}\n\nasync function writeFileCancellable(\n path: string,\n bytes: Buffer,\n signal: AbortSignal,\n): Promise<void> {\n throwIfAborted(signal);\n const handle = await open(path, 'wx');\n try {\n let offset = 0;\n while (offset < bytes.byteLength) {\n throwIfAborted(signal);\n const length = Math.min(ARTIFACT_IO_CHUNK_BYTES, bytes.byteLength - offset);\n const { bytesWritten } = await handle.write(bytes, offset, length, offset);\n if (bytesWritten < 1) throw new Error('Artifact write made no progress');\n offset += bytesWritten;\n }\n throwIfAborted(signal);\n } finally {\n await handle.close();\n }\n}\n\nasync function readFileCancellable(path: string, options: ArtifactReadOptions): Promise<Buffer> {\n throwIfAborted(options.signal);\n const handle = await open(path, 'r');\n try {\n const stats = await handle.stat();\n throwIfAborted(options.signal);\n if (stats.size > options.maximumBytes) {\n throw new Error('Stored MCP artifact exceeds the configured read byte limit');\n }\n if (stats.size !== options.expectedBytes) {\n throw new Error('Stored MCP artifact byte length does not match its immutable metadata');\n }\n const bytes = Buffer.allocUnsafe(stats.size);\n let offset = 0;\n while (offset < bytes.byteLength) {\n throwIfAborted(options.signal);\n const length = Math.min(ARTIFACT_IO_CHUNK_BYTES, bytes.byteLength - offset);\n const { bytesRead } = await handle.read(bytes, offset, length, offset);\n if (bytesRead < 1) {\n throw new Error('Stored MCP artifact ended before its immutable byte length');\n }\n offset += bytesRead;\n }\n throwIfAborted(options.signal);\n return bytes;\n } finally {\n await handle.close();\n }\n}\n\nasync function hashBytesCancellable(bytes: Buffer, signal?: AbortSignal): Promise<string> {\n const hash = createHash('sha256');\n for (let offset = 0; offset < bytes.byteLength; offset += ARTIFACT_IO_CHUNK_BYTES) {\n throwIfAborted(signal);\n hash.update(bytes.subarray(offset, offset + ARTIFACT_IO_CHUNK_BYTES));\n if (offset + ARTIFACT_IO_CHUNK_BYTES < bytes.byteLength) {\n await new Promise<void>((resolve) => setImmediate(resolve));\n }\n }\n throwIfAborted(signal);\n return hash.digest('hex');\n}\n\nasync function removeFilesBestEffort(paths: readonly string[]): Promise<void> {\n await Promise.allSettled(paths.map((path) => rm(path, { force: true })));\n}\n\nasync function waitForIoDrain(\n leases: readonly ArtifactIoLease[],\n timeoutMs: number,\n): Promise<void> {\n if (leases.length === 0) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n await Promise.race([\n Promise.allSettled(leases.map((lease) => lease.done)).then(() => undefined),\n new Promise<void>((resolve) => {\n timer = setTimeout(resolve, timeoutMs);\n }),\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n throwIfSignalAborted(signal, 'MCP artifact I/O was cancelled');\n}\n","import { lstat, link, open, realpath, rename, stat, unlink } from 'node:fs/promises';\nimport path from 'node:path';\nimport { createHash, randomUUID } from 'node:crypto';\nimport { MCP_WIRE_LIMITS } from '@bendyline/docblocks/mcp';\nimport { readContainedFile } from '../contained-file.js';\nimport { statFileThroughDescriptor } from '../internal/file-stat.js';\nimport { isLinkUnsupportedError } from '../internal/link-support.js';\nimport { isNodeErrorCode } from '../internal/node-error.js';\nimport { isPathInside } from '../internal/paths.js';\n\nexport interface McpFileAuthorityOptions {\n readRoots?: readonly string[];\n writeRoots?: readonly string[];\n maxInputFileBytes?: number;\n}\n\nexport interface McpFileAuthorityDependencies {\n /** Test seam after each bounded input read chunk, before cancellation is rechecked. */\n afterInputReadChunk?(readBytes: number, totalBytes: number): Promise<void> | void;\n /** Test seam after durable staging but before the final precondition check. */\n afterMaterializationStage?(temporaryPath: string): Promise<void> | void;\n /** Test seam after each bounded write chunk, before cancellation is rechecked. */\n afterMaterializationWriteChunk?(writtenBytes: number, totalBytes: number): Promise<void> | void;\n /** Test seam after each bounded hash chunk, before cancellation is rechecked. */\n afterMaterializationHashChunk?(readBytes: number, totalBytes: number): Promise<void> | void;\n /** Synchronous test notification at the irreversible publication boundary. */\n afterMaterializationPublish?(targetPath: string): void;\n /** Test seam standing in for a filesystem whose hard links are unsupported. */\n link?(existingPath: string, newPath: string): Promise<void>;\n}\n\nconst DEFAULT_MAX_INPUT_FILE_BYTES = 100 * 1024 * 1024;\nexport const MCP_FILE_AUTHORITY_LIMITS = Object.freeze({\n maxInputFileBytes: 1024 * 1024 * 1024,\n maxRootsPerCapability: 64,\n});\nconst MAX_PATH_CHARACTERS = 4_096;\nconst MATERIALIZATION_WRITE_CHUNK_BYTES = 1024 * 1024;\nconst HASH_READ_CHUNK_BYTES = 64 * 1024;\nconst materializationTails = new Map<string, Promise<void>>();\n\ninterface PhysicalRoot {\n id: string;\n lexical: string;\n physical: string;\n}\n\ninterface MaterializationParentIdentity {\n physical: string;\n dev: number;\n ino: number;\n}\n\nexport interface McpRootDescriptor {\n id: string;\n label: string;\n read: boolean;\n write: boolean;\n}\n\nexport interface McpMaterializationOptions {\n ifExists?: 'error' | 'replace';\n expectedSha256?: string;\n signal?: AbortSignal;\n}\n\n/** Host-startup authority. Tool arguments can narrow it but can never expand it. */\nexport class McpFileAuthority {\n private constructor(\n private readonly readRoots: readonly PhysicalRoot[],\n private readonly writeRoots: readonly PhysicalRoot[],\n private readonly maxInputFileBytes: number,\n private readonly dependencies: McpFileAuthorityDependencies,\n ) {}\n\n public static async create(\n options: McpFileAuthorityOptions = {},\n dependencies: McpFileAuthorityDependencies = {},\n ): Promise<McpFileAuthority> {\n const maxInputFileBytes = options.maxInputFileBytes ?? DEFAULT_MAX_INPUT_FILE_BYTES;\n if (\n !Number.isSafeInteger(maxInputFileBytes) ||\n maxInputFileBytes < 1 ||\n maxInputFileBytes > MCP_FILE_AUTHORITY_LIMITS.maxInputFileBytes\n ) {\n throw new Error('Invalid MCP input file limit');\n }\n if (\n (options.readRoots?.length ?? 0) > MCP_FILE_AUTHORITY_LIMITS.maxRootsPerCapability ||\n (options.writeRoots?.length ?? 0) > MCP_FILE_AUTHORITY_LIMITS.maxRootsPerCapability\n ) {\n throw new Error('MCP authority has too many configured roots');\n }\n return new McpFileAuthority(\n await resolveRoots(options.readRoots ?? []),\n await resolveRoots(options.writeRoots ?? []),\n maxInputFileBytes,\n dependencies,\n );\n }\n\n public async authorizeRead(requestedPath: string): Promise<string> {\n const candidate = validatePath(requestedPath);\n const physical = await realpath(candidate).catch(() => null);\n if (!physical || !this.readRoots.some((root) => isPathInside(root.physical, physical))) {\n throw new Error('MCP read path is outside the configured roots');\n }\n const info = await stat(physical);\n if (!info.isFile()) throw new Error('MCP input must be a regular file');\n if (info.size > this.maxInputFileBytes) {\n throw new Error('MCP input exceeds the configured file-size limit');\n }\n return physical;\n }\n\n /** Opaque, non-authoritative aliases for the roots granted at server startup. */\n public listRoots(): McpRootDescriptor[] {\n const roots = new Map<string, McpRootDescriptor>();\n for (const root of this.readRoots) {\n roots.set(root.id, {\n id: root.id,\n label: rootLabel(root.physical),\n read: true,\n write: this.writeRoots.some((candidate) => candidate.id === root.id),\n });\n }\n for (const root of this.writeRoots) {\n const existing = roots.get(root.id);\n roots.set(root.id, {\n id: root.id,\n label: existing?.label ?? rootLabel(root.physical),\n read: existing?.read ?? false,\n write: true,\n });\n }\n return [...roots.values()].sort((left, right) => left.id.localeCompare(right.id));\n }\n\n /** Resolve a root-relative read without ever treating the alias as new authority. */\n public async authorizeRootRead(rootId: string, workspacePath: string): Promise<string> {\n const root = this.readRoots.find((candidate) => candidate.id === rootId);\n if (!root) throw new Error('Unknown or unreadable MCP root');\n const candidate = path.join(root.physical, ...parseRootRelativePath(workspacePath));\n const physical = await realpath(candidate).catch(() => null);\n if (!physical || !isPathInside(root.physical, physical)) {\n throw new Error('MCP read path is outside the selected root');\n }\n return this.authorizeRead(physical);\n }\n\n /** Resolve a root-relative write without ever treating the alias as new authority. */\n public async authorizeRootWrite(rootId: string, workspacePath: string): Promise<string> {\n const root = this.writeRoots.find((candidate) => candidate.id === rootId);\n if (!root) throw new Error('Unknown or unwritable MCP root');\n const candidate = path.join(root.physical, ...parseRootRelativePath(workspacePath));\n const authorized = await this.authorizeWrite(candidate);\n const physicalParent = await realpath(path.dirname(authorized));\n if (!isPathInside(root.physical, physicalParent)) {\n throw new Error('MCP write path is outside the selected root');\n }\n return authorized;\n }\n\n public async readFile(requestedPath: string, signal?: AbortSignal): Promise<Buffer> {\n signal?.throwIfAborted();\n const physical = await this.authorizeRead(requestedPath);\n signal?.throwIfAborted();\n const root = this.readRoots.find((candidate) => isPathInside(candidate.physical, physical));\n if (!root) throw new Error('MCP read path is outside the configured roots');\n return readContainedFile(root.physical, physical, this.maxInputFileBytes, {\n signal,\n afterReadChunk: this.dependencies.afterInputReadChunk,\n });\n }\n\n public async authorizeWrite(requestedPath: string): Promise<string> {\n const candidate = validatePath(requestedPath);\n const filename = path.basename(candidate);\n validatePortableFilename(filename);\n const existing = await lstat(candidate).catch(() => null);\n if (existing?.isSymbolicLink()) {\n throw new Error('MCP output cannot replace a symbolic link or junction');\n }\n if (existing && !existing.isFile()) {\n throw new Error('MCP output target must be a regular file');\n }\n\n const nearest = await nearestExistingPath(existing ? candidate : path.dirname(candidate));\n const physicalTarget = existing ? await realpath(candidate) : null;\n const physicalParent = physicalTarget ? path.dirname(physicalTarget) : await realpath(nearest);\n if (!this.writeRoots.some((root) => isPathInside(root.physical, physicalParent))) {\n throw new Error('MCP write path is outside the configured roots');\n }\n\n // Preserve the caller's exact filename while anchoring it below the\n // physically authorized parent. Missing nested parents are intentionally\n // rejected; converters should not create arbitrary directory trees.\n if (!existing && !samePath(nearest, path.dirname(candidate))) {\n throw new Error('MCP output parent directory does not exist');\n }\n return physicalTarget ?? path.join(physicalParent, filename);\n }\n\n /** Publish bounded bytes through an operation-owned sibling file. */\n public async materializeBytes(\n requestedPath: string,\n content: Uint8Array,\n maximumBytes: number,\n options: McpMaterializationOptions = {},\n ): Promise<string> {\n const signal = options.signal;\n signal?.throwIfAborted();\n if (\n !Number.isSafeInteger(maximumBytes) ||\n maximumBytes < 0 ||\n content.byteLength > maximumBytes\n ) {\n throw new Error('MCP binary output exceeds the configured limit');\n }\n const ifExists = options.ifExists ?? 'error';\n if (ifExists !== 'error' && ifExists !== 'replace') {\n throw new Error('Invalid MCP materialization mode');\n }\n const expectedSha256 = options.expectedSha256?.toLowerCase();\n if (expectedSha256 && !/^[a-f0-9]{64}$/u.test(expectedSha256)) {\n throw new Error('Invalid expected SHA-256');\n }\n if (ifExists === 'replace' && !expectedSha256) {\n throw new Error('MCP replacement requires an expected SHA-256');\n }\n if (ifExists === 'error' && expectedSha256) {\n throw new Error('MCP no-replace publication cannot include an expected SHA-256');\n }\n\n const initialTarget = await this.authorizeWrite(requestedPath);\n return withMaterializationLock(initialTarget, async () => {\n signal?.throwIfAborted();\n const target = await this.authorizeWrite(requestedPath);\n if (!samePath(initialTarget, target)) {\n throw new Error('MCP output changed physical identity before materialization');\n }\n const parentIdentity = await readMaterializationParentIdentity(target, this.writeRoots);\n const current = await lstat(target).catch(() => null);\n if (current?.isSymbolicLink()) throw new Error('MCP output cannot replace a symbolic link');\n if (ifExists === 'error' && current) throw new Error('MCP output already exists');\n if (expectedSha256) {\n if (!current?.isFile()) throw new Error('MCP output hash precondition failed');\n const actual = await hashFileBounded(\n target,\n this.maxInputFileBytes,\n signal,\n this.dependencies.afterMaterializationHashChunk,\n );\n if (actual !== expectedSha256) throw new Error('MCP output hash precondition failed');\n }\n\n const temporary = path.join(\n path.dirname(target),\n `.${path.basename(target)}.${process.pid}.${randomUUID()}.tmp`,\n );\n let handle: Awaited<ReturnType<typeof open>> | null = null;\n try {\n signal?.throwIfAborted();\n handle = await open(temporary, 'wx');\n await writeFileHandle(\n handle,\n content,\n signal,\n this.dependencies.afterMaterializationWriteChunk,\n );\n signal?.throwIfAborted();\n await handle.sync();\n await handle.close();\n handle = null;\n await this.dependencies.afterMaterializationStage?.(temporary);\n signal?.throwIfAborted();\n if (expectedSha256) {\n // Staging can be expensive. Revalidate after it completes so a\n // writer that changed the target during staging is never silently\n // overwritten by this process.\n const actual = await hashFileBounded(\n target,\n this.maxInputFileBytes,\n signal,\n this.dependencies.afterMaterializationHashChunk,\n );\n if (actual !== expectedSha256) throw new Error('MCP output hash precondition failed');\n }\n signal?.throwIfAborted();\n await assertMaterializationParentIdentity(target, parentIdentity, this.writeRoots);\n if (ifExists === 'error') {\n // Hard-link publication is an atomic create-if-absent operation on the\n // same filesystem. The operation-owned temporary is removed below.\n await this.publishCreateIfAbsent(temporary, target, content, signal);\n } else {\n // Node exposes atomic replacement but not a cross-platform atomic\n // compare-and-swap primitive. The process lock and post-stage hash\n // recheck provide process-strong conditional replacement; the wire\n // contract deliberately does not claim storage-atomic strength.\n await rename(temporary, target);\n }\n notifyMaterializationPublished(this.dependencies.afterMaterializationPublish, target);\n return target;\n } finally {\n await handle?.close().catch(() => undefined);\n await unlink(temporary).catch(() => undefined);\n }\n });\n }\n\n /**\n * Publish the staged bytes only if nothing occupies the target.\n *\n * A hard link is the preferred primitive: it makes an already-complete,\n * fsynced file appear at the target in one atomic step. FAT32/exFAT and some\n * SMB mounts cannot create hard links at all, which would otherwise fail\n * every no-replace publication on those volumes even though the write is\n * legal. `open(target, 'wx')` is the same atomic create-if-absent primitive\n * without hard links — the kernel still refuses an occupied name with EEXIST,\n * so an existing file is never replaced and the no-replace contract holds.\n *\n * The fallback is strictly weaker in one respect: the target is created\n * before its bytes land, so a concurrent reader can observe a short file.\n * That window is unavoidable on a filesystem offering no link primitive, and\n * it never costs a caller their data. The caller's TOCTOU protections are\n * untouched: the parent identity is revalidated before this runs.\n */\n private async publishCreateIfAbsent(\n temporary: string,\n target: string,\n content: Uint8Array,\n signal: AbortSignal | undefined,\n ): Promise<void> {\n const linkFile = this.dependencies.link ?? link;\n try {\n await linkFile(temporary, target);\n return;\n } catch (error: unknown) {\n // A genuinely occupied target must refuse, never fall back.\n if (isNodeErrorCode(error, 'EEXIST')) throw new Error('MCP output already exists');\n if (!isLinkUnsupportedError(error)) throw error;\n }\n\n let handle: Awaited<ReturnType<typeof open>>;\n try {\n handle = await open(target, 'wx');\n } catch (error: unknown) {\n if (isNodeErrorCode(error, 'EEXIST')) throw new Error('MCP output already exists');\n throw error;\n }\n try {\n await writeFileHandle(\n handle,\n content,\n signal,\n this.dependencies.afterMaterializationWriteChunk,\n );\n signal?.throwIfAborted();\n await handle.sync();\n await handle.close();\n } catch (error: unknown) {\n // This process exclusively created the target, so removing the partial\n // publication cannot destroy another writer's file.\n await handle.close().catch(() => undefined);\n await unlink(target).catch(() => undefined);\n throw error;\n }\n }\n}\n\nasync function resolveRoots(values: readonly string[]): Promise<PhysicalRoot[]> {\n const roots: PhysicalRoot[] = [];\n for (const value of values) {\n const lexical = validatePath(value);\n const physical = await realpath(lexical);\n const info = await stat(physical);\n if (!info.isDirectory()) throw new Error(`MCP authority root is not a directory: ${value}`);\n if (!roots.some((root) => samePath(root.physical, physical))) {\n roots.push({ id: rootIdFor(physical), lexical, physical });\n }\n }\n return roots;\n}\n\nfunction rootIdFor(physicalPath: string): string {\n const normalized = process.platform === 'win32' ? physicalPath.toLowerCase() : physicalPath;\n return `root-${createHash('sha256').update(normalized).digest('hex').slice(0, 16)}`;\n}\n\nfunction rootLabel(physicalPath: string): string {\n const candidate = path.basename(physicalPath) || 'root';\n let label = '';\n for (const character of candidate) {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint === 0 || codePoint === 0x7f) continue;\n if (label.length + character.length > MCP_WIRE_LIMITS.labelCharacters) break;\n label += character;\n }\n return label || 'root';\n}\n\nfunction parseRootRelativePath(value: string): string[] {\n if (\n !value ||\n value.length > MAX_PATH_CHARACTERS ||\n value.includes('\\0') ||\n value.includes('\\\\') ||\n path.posix.isAbsolute(value) ||\n /^[a-zA-Z]:/u.test(value)\n ) {\n throw new Error('Invalid MCP root-relative path');\n }\n const segments = value.split('/');\n if (\n segments.some(\n (segment) =>\n !segment ||\n segment === '.' ||\n segment === '..' ||\n [...segment].some((character) => (character.codePointAt(0) ?? 0) <= 0x1f),\n )\n ) {\n throw new Error('Invalid MCP root-relative path');\n }\n return segments;\n}\n\nasync function nearestExistingPath(candidate: string): Promise<string> {\n let current = candidate;\n while (true) {\n try {\n await lstat(current);\n return current;\n } catch {\n const parent = path.dirname(current);\n if (parent === current) throw new Error('MCP output has no accessible parent directory');\n current = parent;\n }\n }\n}\n\nfunction validatePath(value: string): string {\n if (!value || value.length > MAX_PATH_CHARACTERS || value.includes('\\0')) {\n throw new Error('Invalid MCP filesystem path');\n }\n return path.resolve(value);\n}\n\nfunction validatePortableFilename(value: string): void {\n const stem = value.split('.', 1)[0]?.toLowerCase() ?? '';\n if (\n !value ||\n hasUnsafeFilenameCharacter(value) ||\n /[ .]$/u.test(value) ||\n /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])$/u.test(stem)\n ) {\n throw new Error('MCP output filename is not portable or safe');\n }\n}\n\nfunction hasUnsafeFilenameCharacter(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0) ?? 0;\n if (codePoint <= 0x1f || '<>:\"/\\\\|?*'.includes(character)) return true;\n }\n return false;\n}\n\nfunction samePath(left: string, right: string): boolean {\n const normalize = (value: string) => {\n const resolved = path.resolve(value);\n return process.platform === 'win32' ? resolved.toLowerCase() : resolved;\n };\n return normalize(left) === normalize(right);\n}\n\nasync function writeFileHandle(\n handle: Awaited<ReturnType<typeof open>>,\n content: Uint8Array,\n signal?: AbortSignal,\n afterChunk?: (writtenBytes: number, totalBytes: number) => Promise<void> | void,\n): Promise<void> {\n const bytes = Buffer.from(content.buffer, content.byteOffset, content.byteLength);\n let offset = 0;\n while (offset < bytes.byteLength) {\n signal?.throwIfAborted();\n const length = Math.min(MATERIALIZATION_WRITE_CHUNK_BYTES, bytes.byteLength - offset);\n const { bytesWritten } = await handle.write(bytes, offset, length, null);\n if (bytesWritten < 1) throw new Error('MCP materialization write made no progress');\n offset += bytesWritten;\n await afterChunk?.(offset, bytes.byteLength);\n signal?.throwIfAborted();\n }\n signal?.throwIfAborted();\n}\n\nasync function hashFileBounded(\n filePath: string,\n maximumBytes: number,\n signal?: AbortSignal,\n afterChunk?: (readBytes: number, totalBytes: number) => Promise<void> | void,\n): Promise<string> {\n signal?.throwIfAborted();\n const lexical = await lstat(filePath).catch(() => null);\n if (!lexical?.isFile() || lexical.isSymbolicLink()) {\n throw new Error('MCP output hash precondition failed');\n }\n if (lexical.size > maximumBytes) {\n throw new Error('MCP output hash precondition exceeds the configured file-size limit');\n }\n\n const handle = await open(filePath, 'r');\n try {\n const before = await handle.stat();\n if (!before.isFile() || before.size > maximumBytes) {\n throw new Error('MCP output hash precondition exceeds the configured file-size limit');\n }\n const digest = createHash('sha256');\n const buffer = Buffer.allocUnsafe(HASH_READ_CHUNK_BYTES);\n let position = 0;\n while (position < before.size) {\n signal?.throwIfAborted();\n const length = Math.min(buffer.byteLength, before.size - position);\n const { bytesRead } = await handle.read(buffer, 0, length, position);\n if (bytesRead < 1) throw new Error('MCP output changed while checking its hash');\n digest.update(buffer.subarray(0, bytesRead));\n position += bytesRead;\n await afterChunk?.(position, before.size);\n signal?.throwIfAborted();\n }\n signal?.throwIfAborted();\n const after = await handle.stat();\n const [currentLexical, current] = await Promise.all([\n lstat(filePath).catch(() => null),\n statFileThroughDescriptor(filePath).catch(() => null),\n ]);\n if (\n !currentLexical?.isFile() ||\n currentLexical.isSymbolicLink() ||\n !current?.isFile() ||\n after.size !== before.size ||\n after.mtimeMs !== before.mtimeMs ||\n after.ctimeMs !== before.ctimeMs ||\n current.dev !== after.dev ||\n current.ino !== after.ino\n ) {\n throw new Error('MCP output changed while checking its hash');\n }\n return digest.digest('hex');\n } finally {\n await handle.close();\n }\n}\n\nasync function readMaterializationParentIdentity(\n target: string,\n writeRoots: readonly PhysicalRoot[],\n): Promise<MaterializationParentIdentity> {\n const parent = path.dirname(target);\n let lexical: Awaited<ReturnType<typeof lstat>>;\n let physical: string;\n let info: Awaited<ReturnType<typeof stat>>;\n try {\n [lexical, physical] = await Promise.all([lstat(parent), realpath(parent)]);\n info = await stat(physical);\n } catch {\n throw new Error('MCP output parent cannot be physically revalidated');\n }\n if (lexical.isSymbolicLink() || !lexical.isDirectory() || !info.isDirectory()) {\n throw new Error('MCP output parent changed physical identity before publication');\n }\n if (!writeRoots.some((root) => isPathInside(root.physical, physical))) {\n throw new Error('MCP output parent escaped the configured write roots before publication');\n }\n return { physical, dev: info.dev, ino: info.ino };\n}\n\nasync function assertMaterializationParentIdentity(\n target: string,\n expected: MaterializationParentIdentity,\n writeRoots: readonly PhysicalRoot[],\n): Promise<void> {\n const current = await readMaterializationParentIdentity(target, writeRoots);\n if (\n !samePath(current.physical, expected.physical) ||\n current.dev !== expected.dev ||\n current.ino !== expected.ino\n ) {\n throw new Error('MCP output parent changed physical identity before publication');\n }\n}\n\nfunction notifyMaterializationPublished(\n callback: McpFileAuthorityDependencies['afterMaterializationPublish'],\n target: string,\n): void {\n try {\n callback?.(target);\n } catch {\n // Publication is the commit boundary. No observer failure may turn a\n // successfully published file into a reported operation failure.\n }\n}\n\nasync function withMaterializationLock<T>(target: string, operation: () => Promise<T>): Promise<T> {\n const key = process.platform === 'win32' ? target.toLowerCase() : target;\n const previous = materializationTails.get(key) ?? Promise.resolve();\n const run = previous.then(operation, operation);\n const tail = run.then(\n () => undefined,\n () => undefined,\n );\n materializationTails.set(key, tail);\n try {\n return await run;\n } finally {\n if (materializationTails.get(key) === tail) materializationTails.delete(key);\n }\n}\n","import { createHash } from 'node:crypto';\nimport { createRequire } from 'node:module';\nimport { readFileSync } from 'node:fs';\nimport { readdir, readFile, stat } from 'node:fs/promises';\nimport path from 'node:path';\n\ninterface PackageJson {\n name?: unknown;\n version?: unknown;\n dependencies?: unknown;\n}\n\nconst require = createRequire(import.meta.url);\nconst runtimeVersionCache = new Map<string, string>();\nconst runtimeVersionInFlight = new Map<string, Promise<string>>();\n\nexport function getPackageVersion(): string {\n const pkg = readPackageJson();\n if (typeof pkg?.version === 'string' && pkg.version.length > 0) {\n return pkg.version;\n }\n\n return '0.0.0';\n}\n\n/** Version declared for a shipped runtime engine such as linked Squisq. */\nexport function getDependencyVersion(packageName: string): string {\n const dependencies = readPackageJson()?.dependencies;\n if (!dependencies || typeof dependencies !== 'object' || Array.isArray(dependencies)) {\n return 'unknown';\n }\n const version = (dependencies as Record<string, unknown>)[packageName];\n return typeof version === 'string' && version.length > 0 ? version : 'unknown';\n}\n\n/**\n * Declared version plus a hash of the exact linked/installed runtime files\n * being executed.\n *\n * Fingerprinting walks and hashes the whole runtime `dist/`, which is far too\n * much work to do synchronously: this runs on the first `convert_document` of\n * a live stdio MCP server, where a blocked event loop stalls progress\n * notifications, cancellations, and all other protocol traffic. Every read is\n * therefore asynchronous, and the loop is free between files.\n *\n * The value is a contract — it identifies artifacts and keys the conversion\n * cache — so the hashed input, order, and budgets are unchanged. Results are\n * cached per package, and concurrent first calls share one walk.\n */\nexport function getDependencyRuntimeVersion(\n packageName: string,\n resolutionSpecifier = packageName,\n): Promise<string> {\n const key = `${packageName}\\0${resolutionSpecifier}`;\n const cached = runtimeVersionCache.get(key);\n if (cached) return Promise.resolve(cached);\n const inFlight = runtimeVersionInFlight.get(key);\n if (inFlight) return inFlight;\n\n const pending = computeRuntimeVersion(packageName, resolutionSpecifier)\n .then((version) => {\n runtimeVersionCache.set(key, version);\n return version;\n })\n .finally(() => {\n runtimeVersionInFlight.delete(key);\n });\n runtimeVersionInFlight.set(key, pending);\n return pending;\n}\n\nasync function computeRuntimeVersion(\n packageName: string,\n resolutionSpecifier: string,\n): Promise<string> {\n const declared = getDependencyVersion(packageName);\n try {\n const entry = require.resolve(resolutionSpecifier);\n const root = await findPackageRoot(entry, packageName);\n const files = await collectRuntimeFiles(path.join(root, 'dist'));\n const hash = createHash('sha256');\n for (const file of files) {\n const relative = path.relative(root, file).split(path.sep).join('/');\n hash.update(relative);\n hash.update('\\0');\n hash.update(await readFile(file));\n hash.update('\\0');\n }\n return `${declared}+runtime.${hash.digest('hex').slice(0, 16)}`;\n } catch {\n return `${declared}+runtime.unavailable`;\n }\n}\n\nfunction readPackageJson(): PackageJson | null {\n try {\n const raw = readFileSync(new URL('../package.json', import.meta.url), 'utf-8');\n return JSON.parse(raw) as PackageJson;\n } catch {\n // Fall through to a conservative fallback for unusual bundled layouts.\n return null;\n }\n}\n\nasync function findPackageRoot(entry: string, packageName: string): Promise<string> {\n let directory = path.dirname(entry);\n for (let depth = 0; depth < 12; depth += 1) {\n try {\n const parsed = JSON.parse(\n await readFile(path.join(directory, 'package.json'), 'utf8'),\n ) as PackageJson;\n if (parsed.name === packageName) return directory;\n } catch {\n // Keep walking toward the package root.\n }\n const parent = path.dirname(directory);\n if (parent === directory) break;\n directory = parent;\n }\n throw new Error(`Cannot locate runtime package root for ${packageName}`);\n}\n\nasync function collectRuntimeFiles(directory: string): Promise<string[]> {\n const files: string[] = [];\n const pending = [directory];\n let totalBytes = 0;\n while (pending.length > 0) {\n const current = pending.pop()!;\n for (const entry of await readdir(current, { withFileTypes: true })) {\n const candidate = path.join(current, entry.name);\n if (entry.isDirectory()) {\n pending.push(candidate);\n } else if (entry.isFile() && /\\.(?:js|json|css|wasm)$/iu.test(entry.name)) {\n files.push(candidate);\n totalBytes += (await stat(candidate)).size;\n if (files.length > 4_096 || totalBytes > 512 * 1024 * 1024) {\n throw new Error('Runtime fingerprint input exceeds its safety budget');\n }\n }\n }\n }\n if (files.length === 0) throw new Error('Runtime package has no fingerprintable files');\n return files.sort((left, right) => left.localeCompare(right));\n}\n","import { createHash } from 'node:crypto';\nimport { MCP_WIRE_LIMITS } from '@bendyline/docblocks/mcp';\n\nexport const MCP_OUTPUT_PATTERNS = Object.freeze({\n identifier: /^[A-Za-z0-9][A-Za-z0-9._:-]*$/u,\n format: /^[a-z0-9][a-z0-9.+_-]*$/u,\n sha256: /^[a-f0-9]{64}$/u,\n});\n\nexport function isWireText(value: string): boolean {\n return ![...value].some((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n return codePoint === 0 || codePoint === 0x7f;\n });\n}\n\nexport function boundWireText(\n value: string,\n maximumCharacters: number = MCP_WIRE_LIMITS.messageCharacters,\n fallback = '',\n): string {\n const bounded = [...value]\n .map((character) => {\n const codePoint = character.codePointAt(0) ?? 0;\n return codePoint === 0 || codePoint === 0x7f ? '\\uFFFD' : character;\n })\n .join('')\n .slice(0, maximumCharacters);\n return bounded || fallback.slice(0, maximumCharacters);\n}\n\nexport function boundNullableWireText(\n value: string | null | undefined,\n maximumCharacters: number,\n): string | null {\n return value === null || value === undefined ? null : boundWireText(value, maximumCharacters);\n}\n\nexport function boundWireTextArray(\n values: readonly string[],\n maximumEntries: number = MCP_WIRE_LIMITS.arrayEntries,\n maximumCharacters: number = MCP_WIRE_LIMITS.messageCharacters,\n): string[] {\n return values.slice(0, maximumEntries).map((value) => boundWireText(value, maximumCharacters));\n}\n\nexport function boundWireWarnings(values: readonly string[]): string[] {\n if (values.length <= MCP_WIRE_LIMITS.arrayEntries) return boundWireTextArray(values);\n const retained = boundWireTextArray(values, MCP_WIRE_LIMITS.arrayEntries - 1);\n retained.push(\n `${values.length - retained.length} additional warnings were aggregated to keep the MCP result bounded.`,\n );\n return retained;\n}\n\nexport function requireWireIdentifier(value: string, label: string): string {\n if (\n value.length < 1 ||\n value.length > MCP_WIRE_LIMITS.identifierCharacters ||\n !MCP_OUTPUT_PATTERNS.identifier.test(value) ||\n !isWireText(value)\n ) {\n throw new Error(`Linked Squisq returned an invalid MCP ${label}`);\n }\n return value;\n}\n\nexport function toWireIdentifier(value: string, fallbackPrefix = 'item'): string {\n if (\n value.length >= 1 &&\n value.length <= MCP_WIRE_LIMITS.identifierCharacters &&\n MCP_OUTPUT_PATTERNS.identifier.test(value) &&\n isWireText(value)\n ) {\n return value;\n }\n const hash = createHash('sha256').update(value, 'utf8').digest('hex').slice(0, 12);\n const safePrefix = value\n .replace(/[^A-Za-z0-9._:-]+/gu, '-')\n .replace(/^[^A-Za-z0-9]+/u, '')\n .slice(0, MCP_WIRE_LIMITS.identifierCharacters - hash.length - 1);\n const prefix = safePrefix || fallbackPrefix;\n return `${prefix}-${hash}`.slice(0, MCP_WIRE_LIMITS.identifierCharacters);\n}\n","import { createHash } from 'node:crypto';\nimport { basename, extname } from 'node:path';\nimport type {\n AssetSummary,\n BundleAssetRef,\n DocumentSource,\n McpDiagnostic,\n} from '@bendyline/docblocks/mcp';\nimport { MCP_WIRE_LIMITS } from '@bendyline/docblocks/mcp';\nimport { decodeUtf8Text, tryParseWorkspacePath } from '@bendyline/docblocks/filesystem';\nimport type { MarkdownDocument } from '@bendyline/squisq/markdown';\nimport type { Doc } from '@bendyline/squisq/schemas';\nimport type { ContentContainer } from '@bendyline/squisq/storage';\nimport type { ConvertSource, FormatRegistry } from '@bendyline/squisq-cli/api';\nimport { ArtifactStore } from './artifact-store.js';\nimport { McpFileAuthority } from './authority.js';\nimport { boundWireText, isWireText } from './output-bounds.js';\nimport { throwIfAborted as throwIfSignalAborted } from '../internal/cancellation.js';\n\nconst MAX_BUNDLE_ASSETS = 256;\nconst MAX_BUNDLE_BYTES = 100 * 1024 * 1024;\nconst MAX_ASSET_MANIFEST_BYTES = 1024 * 1024;\nconst MAX_METADATA_CHARACTERS = MCP_WIRE_LIMITS.labelCharacters;\nconst ASSET_MANIFEST_PATH = '.docblocks/assets.json';\nexport const MCP_ARCHIVE_LIMITS = {\n maxEntries: 2_048,\n maxEntryUncompressedBytes: MAX_BUNDLE_BYTES,\n maxUncompressedBytes: MAX_BUNDLE_BYTES,\n maxCompressionRatio: 1_000,\n} as const;\n\nexport interface PreparedDocument {\n markdown: string;\n markdownDoc: MarkdownDocument;\n doc: Doc;\n container: ContentContainer;\n baseName: string;\n sourceFormat: string;\n sourceSha256: string;\n assets: AssetSummary[];\n diagnostics: McpDiagnostic[];\n}\n\ninterface ResolvedSource {\n source: ConvertSource;\n sourceFormat: string;\n sourceSha256: string;\n baseName: string;\n container?: ContentContainer;\n markdown?: string;\n}\n\n/** Authority-aware normalization shared by every artifact-native MCP tool. */\nexport class DocumentService {\n public constructor(\n private readonly authority: McpFileAuthority,\n private readonly artifacts: ArtifactStore,\n private readonly registry?: FormatRegistry,\n ) {}\n\n public async prepare(source: DocumentSource, signal?: AbortSignal): Promise<PreparedDocument> {\n throwIfAborted(signal);\n const resolved = await this.resolve(source, signal);\n throwIfAborted(signal);\n\n let markdown = resolved.markdown;\n let container = resolved.container;\n const diagnostics: McpDiagnostic[] = [];\n if (markdown === undefined || container === undefined) {\n const { convert } = await import('@bendyline/squisq-cli/api');\n const converted = await convert(resolved.source, 'dbk', {\n signal,\n registry: this.registry,\n from: resolved.sourceFormat === 'auto' ? undefined : resolved.sourceFormat,\n formatOptions: {\n dbk: { ...MCP_ARCHIVE_LIMITS, compression: 'STORE' },\n docx: MCP_ARCHIVE_LIMITS,\n pptx: MCP_ARCHIVE_LIMITS,\n xlsx: MCP_ARCHIVE_LIMITS,\n },\n });\n diagnostics.push(\n ...converted.warnings.map((warning) => warningDiagnostic(warning, 'import')),\n );\n throwIfAborted(signal);\n const { zipToContainer } = await import('@bendyline/squisq-formats/container');\n container = await zipToContainer(converted.bytes, MCP_ARCHIVE_LIMITS);\n const importedMarkdown = await container.readDocument();\n if (importedMarkdown === null) throw new Error('Imported document did not contain Markdown');\n markdown = importedMarkdown;\n }\n\n const { parseMarkdown } = await import('@bendyline/squisq/markdown');\n const { markdownToDoc } = await import('@bendyline/squisq/doc');\n const markdownDoc = parseMarkdown(markdown);\n const doc = markdownToDoc(markdownDoc);\n const assets = await this.assetSummaries(container, signal);\n throwIfAborted(signal);\n return {\n markdown,\n markdownDoc,\n doc,\n container,\n baseName: resolved.baseName,\n sourceFormat: resolved.sourceFormat,\n sourceSha256: resolved.sourceSha256,\n assets,\n diagnostics,\n };\n }\n\n public async readBinarySource(\n source: DocumentSource,\n signal?: AbortSignal,\n ): Promise<{ bytes: Buffer; filename: string; format: string; sha256: string }> {\n throwIfAborted(signal);\n if (source.kind === 'file') {\n const physical = await this.authority.authorizeRootRead(source.rootId, source.path);\n const bytes = await this.authority.readFile(physical, signal);\n throwIfAborted(signal);\n const filename = basename(source.path);\n return {\n bytes,\n filename,\n format: normalizeFormat(source.format ?? formatFromName(filename)),\n sha256: sha256(bytes),\n };\n }\n if (source.kind === 'artifact') {\n const ref = await this.artifacts.get(source.uri, signal);\n throwIfAborted(signal);\n const bytes = await this.artifacts.read(source.uri, signal);\n throwIfAborted(signal);\n return {\n bytes,\n filename: ref.suggestedFilename,\n format: normalizeFormat(ref.format),\n sha256: ref.sha256,\n };\n }\n throw new Error('This operation requires a file or artifact source');\n }\n\n public async assetSummaries(\n container: ContentContainer,\n signal?: AbortSignal,\n ): Promise<AssetSummary[]> {\n throwIfAborted(signal);\n const entries = await container.listFiles();\n const manifest = await readAssetManifest(container, signal);\n const assets: AssetSummary[] = [];\n for (const entry of entries) {\n throwIfAborted(signal);\n if (\n entry.mimeType === 'text/markdown' ||\n entry.path === 'index.md' ||\n entry.path === ASSET_MANIFEST_PATH\n ) {\n continue;\n }\n const bytes = await container.readFile(entry.path);\n throwIfAborted(signal);\n if (!bytes) continue;\n const metadata = manifest.get(entry.path);\n assets.push({\n path: entry.path as AssetSummary['path'],\n mimeType: metadata?.mimeType ?? entry.mimeType,\n size: bytes.byteLength,\n sha256: createHash('sha256').update(new Uint8Array(bytes)).digest('hex'),\n altText: metadata?.altText ?? null,\n credit: metadata?.credit ?? null,\n license: metadata?.license ?? null,\n });\n }\n return assets.sort((left, right) => left.path.localeCompare(right.path));\n }\n\n private async resolve(source: DocumentSource, signal?: AbortSignal): Promise<ResolvedSource> {\n switch (source.kind) {\n case 'markdown':\n return this.resolveMarkdown(source.markdown, source.name);\n case 'bundle':\n return this.resolveBundle(source.markdown, source.name, source.assets, signal);\n case 'file': {\n const physical = await this.authority.authorizeRootRead(source.rootId, source.path);\n const bytes = await this.authority.readFile(physical, signal);\n const name = basename(source.path);\n return {\n source: { kind: 'bytes', data: bytes, filename: name },\n sourceFormat: normalizeFormat(source.format ?? formatFromName(name)),\n sourceSha256: sha256(bytes),\n baseName: baseNameFromName(name),\n };\n }\n case 'artifact': {\n const ref = await this.artifacts.get(source.uri, signal);\n const bytes = await this.artifacts.read(source.uri, signal);\n return {\n source: { kind: 'bytes', data: bytes, filename: ref.suggestedFilename },\n sourceFormat: normalizeFormat(ref.format),\n sourceSha256: ref.sha256,\n baseName: baseNameFromName(ref.suggestedFilename),\n };\n }\n }\n }\n\n private async resolveMarkdown(markdown: string, name: string | null): Promise<ResolvedSource> {\n const { MemoryContentContainer } = await import('@bendyline/squisq/storage');\n const container = new MemoryContentContainer();\n await container.writeDocument(markdown);\n return {\n source: {\n kind: 'markdown',\n markdown,\n container,\n baseName: baseNameFromName(name ?? 'document.md'),\n },\n sourceFormat: 'md',\n sourceSha256: sha256(Buffer.from(markdown, 'utf8')),\n baseName: baseNameFromName(name ?? 'document.md'),\n container,\n markdown,\n };\n }\n\n private async resolveBundle(\n markdown: string,\n name: string | null,\n assets: readonly BundleAssetRef[],\n signal?: AbortSignal,\n ): Promise<ResolvedSource> {\n if (assets.length > MAX_BUNDLE_ASSETS) throw new Error('MCP bundle has too many assets');\n const { MemoryContentContainer } = await import('@bendyline/squisq/storage');\n const container = new MemoryContentContainer();\n await container.writeDocument(markdown);\n const hash = createHash('sha256').update(markdown, 'utf8');\n const paths = new Set<string>();\n const manifest: AssetManifestEntry[] = [];\n let totalBytes = 0;\n for (const asset of [...assets].sort((left, right) => left.path.localeCompare(right.path))) {\n throwIfAborted(signal);\n if (\n !asset.path ||\n asset.path === 'index.md' ||\n asset.path.startsWith('.docblocks/') ||\n paths.has(asset.path)\n ) {\n throw new Error('MCP bundle asset path is reserved or duplicated');\n }\n paths.add(asset.path);\n const bytes = await this.resolveAsset(asset, signal);\n totalBytes += bytes.byteLength;\n if (totalBytes > MAX_BUNDLE_BYTES) throw new Error('MCP bundle assets exceed the byte limit');\n await container.writeFile(asset.path, bytes, asset.mimeType ?? undefined);\n hash.update(asset.path, 'utf8').update(bytes);\n manifest.push({\n path: asset.path,\n mimeType: asset.mimeType,\n altText: asset.altText,\n credit: asset.credit,\n license: asset.license,\n });\n }\n if (manifest.length > 0) {\n await container.writeFile(\n ASSET_MANIFEST_PATH,\n Buffer.from(JSON.stringify({ version: 1, assets: manifest }), 'utf8'),\n 'application/json',\n );\n }\n const baseName = baseNameFromName(name ?? 'document.md');\n return {\n source: { kind: 'markdown', markdown, container, baseName },\n sourceFormat: 'md',\n sourceSha256: hash.digest('hex'),\n baseName,\n container,\n markdown,\n };\n }\n\n private async resolveAsset(asset: BundleAssetRef, signal?: AbortSignal): Promise<Buffer> {\n if (asset.source.kind === 'artifact') return this.artifacts.read(asset.source.uri, signal);\n const physical = await this.authority.authorizeRootRead(asset.source.rootId, asset.source.path);\n return this.authority.readFile(physical, signal);\n }\n}\n\ninterface AssetManifestEntry {\n path: string;\n mimeType: string | null;\n altText: string | null;\n credit: string | null;\n license: string | null;\n}\n\nasync function readAssetManifest(\n container: ContentContainer,\n signal?: AbortSignal,\n): Promise<Map<string, AssetManifestEntry>> {\n const bytes = await container.readFile(ASSET_MANIFEST_PATH);\n if (!bytes) return new Map();\n throwIfAborted(signal);\n if (bytes.byteLength > MAX_ASSET_MANIFEST_BYTES) {\n throw new Error('The document asset manifest exceeds the byte limit');\n }\n try {\n const parsed: unknown = JSON.parse(\n decodeUtf8Text(bytes, {\n label: 'The document asset manifest',\n path: ASSET_MANIFEST_PATH,\n }),\n );\n if (\n !isExactRecord(parsed, ['version', 'assets']) ||\n parsed.version !== 1 ||\n !Array.isArray(parsed.assets) ||\n parsed.assets.length > MCP_ARCHIVE_LIMITS.maxEntries\n ) {\n throw new Error('The document asset manifest has an invalid root shape');\n }\n const entries = new Map<string, AssetManifestEntry>();\n for (const candidate of parsed.assets) {\n throwIfAborted(signal);\n if (!isExactRecord(candidate, ['path', 'mimeType', 'altText', 'credit', 'license'])) {\n throw new Error('The document asset manifest contains an invalid entry');\n }\n const path = tryParseWorkspacePath(candidate.path);\n if (\n path === null ||\n path === '' ||\n path === 'index.md' ||\n path.startsWith('.docblocks/') ||\n !isNullableMimeType(candidate.mimeType) ||\n !isNullableMetadata(candidate.altText) ||\n !isNullableMetadata(candidate.credit) ||\n !isNullableMetadata(candidate.license) ||\n entries.has(path)\n ) {\n throw new Error('The document asset manifest contains invalid metadata');\n }\n entries.set(path, {\n path,\n mimeType: candidate.mimeType,\n altText: candidate.altText,\n credit: candidate.credit,\n license: candidate.license,\n });\n }\n return entries;\n } catch (caught: unknown) {\n if (caught instanceof Error && caught.message.startsWith('The document asset manifest')) {\n throw caught;\n }\n const error = new Error('The document asset manifest is not valid JSON');\n Object.defineProperty(error, 'cause', { value: caught, enumerable: false });\n throw error;\n }\n}\n\nfunction isExactRecord(value: unknown, keys: readonly string[]): value is Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return false;\n const actual = Object.keys(value);\n return actual.length === keys.length && keys.every((key) => actual.includes(key));\n}\n\nfunction isNullableMetadata(\n value: unknown,\n maximumCharacters = MAX_METADATA_CHARACTERS,\n): value is string | null {\n return (\n value === null ||\n (typeof value === 'string' && value.length <= maximumCharacters && isWireText(value))\n );\n}\n\nfunction isNullableMimeType(value: unknown): value is string | null {\n return (\n value === null ||\n (typeof value === 'string' &&\n value.length <= 256 &&\n /^[a-z0-9!#$&^_.+-]+\\/[a-z0-9!#$&^_.+-]+$/iu.test(value))\n );\n}\n\nexport function warningDiagnostic(\n message: string,\n stage: McpDiagnostic['stage'],\n format: string | null = null,\n): McpDiagnostic {\n const classified = classifyWarning(message, format);\n const normalizedFormat = format?.toLowerCase() ?? null;\n return {\n code: classified.code,\n severity: 'warning',\n stage,\n format:\n normalizedFormat !== null && /^[a-z0-9][a-z0-9.+_-]{0,63}$/u.test(normalizedFormat)\n ? normalizedFormat\n : null,\n count: classified.count,\n message: boundWireText(message, MCP_WIRE_LIMITS.messageCharacters, 'Conversion warning'),\n remediation:\n classified.remediation === null\n ? null\n : boundWireText(classified.remediation, MCP_WIRE_LIMITS.messageCharacters),\n retryable: false,\n location: null,\n };\n}\n\nfunction classifyWarning(\n message: string,\n format: string | null,\n): { code: string; count: number; remediation: string | null } {\n const normalized = message.toLowerCase();\n if (normalized.includes('unsupported markdown node')) {\n return {\n code: 'unsupported-markdown-node',\n count: warningCount(message, /omitted\\s+(\\d+)\\s+unsupported/iu),\n remediation:\n 'Replace unsupported directives with standard Markdown or choose a target that retains them.',\n };\n }\n if (normalized.includes('csv export emitted only the first')) {\n const tables = warningCount(message, /document has\\s+(\\d+)\\s+tables/iu);\n return {\n code: 'csv-table-selection',\n count: Math.max(1, tables - 1),\n remediation: 'Set tableIndex explicitly or export the full workbook as XLSX.',\n };\n }\n if (normalized.includes('xlsx export is tables-only')) {\n return {\n code: 'xlsx-content-omitted',\n count: warningCount(message, /(\\d+)\\s+non-table block/iu),\n remediation: 'Move required prose into tables or choose DOCX/PDF/HTML for mixed content.',\n };\n }\n if (normalized.includes('pdf embedded images were skipped')) {\n return {\n code: 'pdf-image-omitted',\n count: 1,\n remediation:\n 'Import the PDF in an environment with canvas image decoding or provide the original image assets.',\n };\n }\n if (\n normalized.includes('gif does not support audio') ||\n normalized.includes('gif cannot retain audio')\n ) {\n return {\n code: 'gif-audio-omitted',\n count: 1,\n remediation: 'Use MP4 when audio must be retained, or accept a silent GIF.',\n };\n }\n if (normalized.includes('full-slide image') || normalized.includes('raster image')) {\n return {\n code: 'rendered-content-rasterized',\n count: 1,\n remediation:\n format === 'pptx'\n ? 'Choose editable-native PPTX when native shape editing matters more than exact pixels.'\n : 'Choose semantic PDF when selectable structure matters more than exact pixels.',\n };\n }\n if (normalized.includes('not a fully tagged accessible pdf')) {\n return {\n code: 'pdf-accessibility-limited',\n count: 1,\n remediation: 'Use an accessibility-aware tagged-PDF post-processing workflow.',\n };\n }\n if (normalized.startsWith('theme:')) {\n return {\n code: 'theme-inference-adjusted',\n count: 1,\n remediation: 'Review the inferred theme and adjust its colors before reusing it broadly.',\n };\n }\n if (normalized.includes('layout inference is only available')) {\n return {\n code: 'layout-inference-unsupported',\n count: 1,\n remediation: 'Use a PPTX source when reusable slide-layout inference is required.',\n };\n }\n if (\n (normalized.startsWith('layout ') && normalized.includes('could not be read')) ||\n normalized.includes('missing or unresolved layout')\n ) {\n return {\n code: 'layout-inference-incomplete',\n count: warningCount(message, /(\\d+)\\s+slide/iu),\n remediation:\n 'Review the affected slides and supply explicit templates where inference was incomplete.',\n };\n }\n return { code: 'fidelity-warning', count: 1, remediation: null };\n}\n\nfunction warningCount(message: string, pattern: RegExp): number {\n const value = Number(pattern.exec(message)?.[1] ?? 1);\n return Number.isSafeInteger(value) && value > 0 ? value : 1;\n}\n\nexport function sha256(bytes: Uint8Array): string {\n return createHash('sha256').update(bytes).digest('hex');\n}\n\nexport function throwIfAborted(signal?: AbortSignal): void {\n throwIfSignalAborted(signal, 'MCP operation was cancelled');\n}\n\nfunction baseNameFromName(name: string): string {\n const leaf = basename(name.replace(/\\\\/gu, '/')) || 'document';\n const extension = extname(leaf);\n return (extension ? leaf.slice(0, -extension.length) : leaf) || 'document';\n}\n\nfunction formatFromName(name: string): string {\n const extension = extname(name).replace(/^\\./u, '').toLowerCase();\n return extension || 'auto';\n}\n\nfunction normalizeFormat(format: string): string {\n const normalized = format.toLowerCase().replace(/^\\./u, '');\n return normalized === 'markdown' ? 'md' : normalized || 'auto';\n}\n","import type {\n BlockSummary,\n ComparisonChange,\n ComparisonMetric,\n ComparisonResult,\n DiagnosticSeverity,\n DiagnosticStage,\n InspectionResult,\n McpDiagnostic,\n OutlineEntry,\n ThemeSummary,\n ValidationResult,\n} from '@bendyline/docblocks/mcp';\nimport { DOCBLOCKS_MCP_WIRE_VERSION, MCP_WIRE_LIMITS } from '@bendyline/docblocks/mcp';\nimport type { DocDiagnostic } from '@bendyline/squisq/schemas';\nimport type { PreparedDocument } from './document-service.js';\nimport { DocumentService, throwIfAborted, warningDiagnostic } from './document-service.js';\nimport { boundWireText, toWireIdentifier } from './output-bounds.js';\n\nconst DEFAULT_MAX_INSPECTION_BLOCKS = 200;\nconst MAX_INSPECTION_BLOCKS = 2_000;\n/** Producer budget keeps worst-case diagnostics comfortably within the default report quota. */\nexport const MCP_MAX_PUBLISHED_DIAGNOSTICS = 500;\nconst MAX_DIAGNOSTICS = MCP_MAX_PUBLISHED_DIAGNOSTICS;\nconst FORMAT_PATTERN = /^[a-z0-9][a-z0-9.+_-]{0,63}$/u;\nconst CANCELLATION_YIELD_INTERVAL = 256;\n\nexport async function inspectPreparedDocument(\n _documents: DocumentService,\n prepared: PreparedDocument,\n maximumBlocks = DEFAULT_MAX_INSPECTION_BLOCKS,\n cursor: string | null = null,\n signal?: AbortSignal,\n): Promise<InspectionResult> {\n throwIfAborted(signal);\n if (\n !Number.isSafeInteger(maximumBlocks) ||\n maximumBlocks < 1 ||\n maximumBlocks > MAX_INSPECTION_BLOCKS\n ) {\n throw new Error(`Inspection block limit must be between 1 and ${MAX_INSPECTION_BLOCKS}`);\n }\n const { analyzeBlocks } = await import('@bendyline/squisq/transform');\n const { flattenBlocks, validateMarkdownSource } = await import('@bendyline/squisq/doc');\n await yieldForCancellation(signal);\n const assets = prepared.assets;\n const assetPaths = new Set(assets.map((asset) => asset.path));\n const validation = validateMarkdownSource(prepared.markdown, { assets: assetPaths });\n const analyzed = analyzeBlocks(prepared.doc.blocks);\n const flatBlocks = flattenBlocks(prepared.doc.blocks);\n throwIfAborted(signal);\n const blockOffset = parseInspectionCursor(cursor, analyzed.length);\n const blockEnd = Math.min(analyzed.length, blockOffset + maximumBlocks);\n const analyzedBlocks = analyzed.map((entry) => entry.block);\n const sourceRanges = await computeBlockSourceRanges(\n analyzedBlocks,\n prepared.markdown.length,\n signal,\n );\n const blocks: BlockSummary[] = analyzed.slice(blockOffset, blockEnd).map((entry, index) => ({\n id: toWireIdentifier(entry.block.id, 'block'),\n type: toWireIdentifier(entry.block.template ?? 'section', 'section'),\n text: boundWireText(entry.plainText, MCP_WIRE_LIMITS.excerptCharacters),\n wordCount: entry.bodyWordCount,\n templateId:\n entry.block.template === undefined\n ? null\n : toWireIdentifier(entry.block.template, 'template'),\n sourceRange: sourceRanges[blockOffset + index] ?? null,\n }));\n const outline = (\n await collectAnalyzedOutline(prepared.doc.blocks, analyzedBlocks, signal)\n ).filter((entry) => entry.blockIndex >= blockOffset && entry.blockIndex < blockEnd);\n const details = summarizeMarkdownNodes(prepared.markdownDoc);\n await yieldForCancellation(signal);\n const counts = { tables: details.tableCount, links: details.linkCount };\n const itemSummary = summarizeItems(prepared, flatBlocks, details.tables);\n const items = itemSummary.items;\n const metadata = metadataFromFrontmatter(prepared.markdownDoc.frontmatter);\n const diagnostics = [\n ...prepared.diagnostics,\n ...validation.diagnostics.map((diagnostic) =>\n mapDocDiagnostic(diagnostic, prepared.sourceFormat),\n ),\n ...missingAltTextDiagnostics(prepared.markdownDoc, prepared.sourceFormat),\n ];\n let wordCount = 0;\n for (let index = 0; index < analyzed.length; index += 1) {\n wordCount += analyzed[index]?.bodyWordCount ?? 0;\n const checkpoint = cancellationCheckpoint(signal, index);\n if (checkpoint) await checkpoint;\n }\n return {\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'inspection',\n sourceFormat: prepared.sourceFormat,\n metadata,\n statistics: {\n blockCount: analyzed.length,\n wordCount,\n characterCount: prepared.markdown.length,\n tableCount: counts.tables,\n linkCount: counts.links,\n assetCount: assets.length,\n pageCount: prepared.sourceFormat === 'pdf' ? items.length : null,\n slideCount: prepared.sourceFormat === 'pptx' ? items.length : null,\n sheetCount:\n prepared.sourceFormat === 'xlsx' || prepared.sourceFormat === 'csv' ? items.length : null,\n },\n outline,\n blocks,\n blockOffset,\n nextCursor: blockEnd < analyzed.length ? `blocks:${blockEnd}` : null,\n tables: details.tables,\n links: details.links,\n items,\n assets,\n theme: await themeSummary(prepared, signal),\n truncated: blockEnd < analyzed.length,\n detailsTruncated: details.truncated || itemSummary.truncated,\n diagnostics: boundDiagnostics(diagnostics, 'inspect'),\n };\n}\n\nexport async function validatePreparedDocument(\n _documents: DocumentService,\n prepared: PreparedDocument,\n targetFormat: string | null,\n signal?: AbortSignal,\n): Promise<ValidationResult> {\n throwIfAborted(signal);\n const normalizedTargetFormat = normalizeTargetFormat(targetFormat);\n const { validateMarkdownSource } = await import('@bendyline/squisq/doc');\n await yieldForCancellation(signal);\n const assets = prepared.assets;\n const validation = validateMarkdownSource(prepared.markdown, {\n assets: new Set(assets.map((asset) => asset.path)),\n });\n throwIfAborted(signal);\n const diagnostics = [\n ...prepared.diagnostics,\n ...validation.diagnostics.map((diagnostic) =>\n mapDocDiagnostic(diagnostic, prepared.sourceFormat),\n ),\n ...missingAltTextDiagnostics(\n prepared.markdownDoc,\n normalizedTargetFormat ?? prepared.sourceFormat,\n ),\n ...(normalizedTargetFormat\n ? await targetPreflight(prepared, normalizedTargetFormat, signal)\n : []),\n ];\n await yieldForCancellation(signal);\n const unique = boundDiagnostics(diagnostics, 'validate');\n throwIfAborted(signal);\n const summary = summarizeDiagnostics(unique);\n return {\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'validation',\n sourceFormat: prepared.sourceFormat,\n targetFormat: normalizedTargetFormat,\n valid: summary.errorCount === 0,\n summary,\n diagnostics: unique,\n };\n}\n\nexport async function comparePreparedDocuments(\n documents: DocumentService,\n left: PreparedDocument,\n right: PreparedDocument,\n signal?: AbortSignal,\n): Promise<ComparisonResult> {\n throwIfAborted(signal);\n await yieldForCancellation(signal);\n const [leftInspection, rightInspection] = await Promise.all([\n inspectPreparedDocument(documents, left, MAX_INSPECTION_BLOCKS, null, signal),\n inspectPreparedDocument(documents, right, MAX_INSPECTION_BLOCKS, null, signal),\n ]);\n throwIfAborted(signal);\n const { stripMarkdown } = await import('@bendyline/squisq/generate');\n const leftWords = words(stripMarkdown(left.markdown));\n const rightWords = words(stripMarkdown(right.markdown));\n await yieldForCancellation(signal);\n const [textSimilarity, leftLayouts, rightLayouts, leftAccessibility, rightAccessibility] =\n await Promise.all([\n multisetSimilarity(leftWords, rightWords, signal),\n layoutTokens(left, signal),\n layoutTokens(right, signal),\n accessibilityTokens(left, signal),\n accessibilityTokens(right, signal),\n ]);\n const structureSimilarity = ratioSimilarity(\n leftInspection.statistics.blockCount,\n rightInspection.statistics.blockCount,\n );\n const tableSimilarity = ratioSimilarity(\n leftInspection.statistics.tableCount,\n rightInspection.statistics.tableCount,\n );\n const mediaSimilarity = assetSimilarity(leftInspection.assets, rightInspection.assets);\n const metadataSimilarity = objectSimilarity(leftInspection.metadata, rightInspection.metadata);\n const themeSimilarity =\n leftInspection.theme?.id === rightInspection.theme?.id\n ? 1\n : leftInspection.theme === null && rightInspection.theme === null\n ? 1\n : 0;\n const layoutSimilarity = await multisetSimilarity(leftLayouts, rightLayouts, signal);\n const leftTiming = timingSummary(left);\n const rightTiming = timingSummary(right);\n const timingSimilarity =\n (ratioSimilarity(leftTiming.duration, rightTiming.duration) +\n ratioSimilarity(leftTiming.segmentCount, rightTiming.segmentCount) +\n ratioSimilarity(leftTiming.captionCount, rightTiming.captionCount)) /\n 3;\n const accessibilitySimilarity = await multisetSimilarity(\n leftAccessibility,\n rightAccessibility,\n signal,\n );\n throwIfAborted(signal);\n const score = clamp01(\n textSimilarity * 0.4 +\n structureSimilarity * 0.12 +\n tableSimilarity * 0.06 +\n mediaSimilarity * 0.12 +\n layoutSimilarity * 0.08 +\n metadataSimilarity * 0.05 +\n themeSimilarity * 0.06 +\n timingSimilarity * 0.05 +\n accessibilitySimilarity * 0.06,\n );\n const metrics: ComparisonMetric[] = [\n metric(\n 'words',\n leftInspection.statistics.wordCount,\n rightInspection.statistics.wordCount,\n textSimilarity,\n ),\n metric(\n 'blocks',\n leftInspection.statistics.blockCount,\n rightInspection.statistics.blockCount,\n structureSimilarity,\n ),\n metric(\n 'tables',\n leftInspection.statistics.tableCount,\n rightInspection.statistics.tableCount,\n tableSimilarity,\n ),\n metric(\n 'assets',\n leftInspection.statistics.assetCount,\n rightInspection.statistics.assetCount,\n mediaSimilarity,\n ),\n metric('layouts', leftLayouts.length, rightLayouts.length, layoutSimilarity),\n metric('durationSeconds', leftTiming.duration, rightTiming.duration, timingSimilarity),\n metric(\n 'accessibilityFeatures',\n leftAccessibility.length,\n rightAccessibility.length,\n accessibilitySimilarity,\n ),\n ];\n const changes: ComparisonChange[] = [\n change(\n 'text',\n textSimilarity,\n 'Text content',\n leftInspection.statistics.wordCount,\n rightInspection.statistics.wordCount,\n ),\n change(\n 'structure',\n structureSimilarity,\n 'Document structure',\n leftInspection.statistics.blockCount,\n rightInspection.statistics.blockCount,\n ),\n change(\n 'table',\n tableSimilarity,\n 'Tables',\n leftInspection.statistics.tableCount,\n rightInspection.statistics.tableCount,\n ),\n change(\n 'media',\n mediaSimilarity,\n 'Media assets',\n leftInspection.statistics.assetCount,\n rightInspection.statistics.assetCount,\n ),\n change(\n 'theme',\n themeSimilarity,\n 'Theme',\n leftInspection.theme ? 1 : 0,\n rightInspection.theme ? 1 : 0,\n ),\n change(\n 'layout',\n layoutSimilarity,\n 'Layouts and templates',\n leftLayouts.length,\n rightLayouts.length,\n ),\n change(\n 'metadata',\n metadataSimilarity,\n 'Document metadata',\n metadataFieldCount(leftInspection),\n metadataFieldCount(rightInspection),\n ),\n change(\n 'timing',\n timingSimilarity,\n 'Audio and caption timing',\n leftTiming.segmentCount,\n rightTiming.segmentCount,\n ),\n change(\n 'accessibility',\n accessibilitySimilarity,\n 'Accessibility features',\n leftAccessibility.length,\n rightAccessibility.length,\n ),\n ];\n return {\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'comparison',\n leftFormat: left.sourceFormat,\n rightFormat: right.sourceFormat,\n equivalent: score === 1 && changes.every((entry) => entry.status === 'retained'),\n score,\n changes,\n metrics,\n diagnostics: boundDiagnostics(\n [...leftInspection.diagnostics, ...rightInspection.diagnostics],\n 'compare',\n ),\n };\n}\n\nasync function collectAnalyzedOutline(\n blocks: PreparedDocument['doc']['blocks'],\n analyzedBlocks: readonly PreparedDocument['doc']['blocks'][number][],\n signal?: AbortSignal,\n): Promise<OutlineEntry[]> {\n const levels = new Map<PreparedDocument['doc']['blocks'][number], number>();\n const pending = [...blocks].reverse().map((block) => ({ block, level: 1 }));\n let visited = 0;\n while (pending.length > 0) {\n const current = pending.pop();\n if (!current) break;\n levels.set(current.block, current.level);\n const children = current.block.children ?? [];\n for (let index = children.length - 1; index >= 0; index -= 1) {\n const block = children[index];\n if (block) pending.push({ block, level: current.level + 1 });\n }\n const checkpoint = cancellationCheckpoint(signal, visited);\n if (checkpoint) await checkpoint;\n visited += 1;\n }\n const outline: OutlineEntry[] = [];\n for (let blockIndex = 0; blockIndex < analyzedBlocks.length; blockIndex += 1) {\n const block = analyzedBlocks[blockIndex];\n if (!block) continue;\n outline.push({\n id: toWireIdentifier(block.id, 'block'),\n title: boundWireText(\n block.title ?? block.sourceHeading?.children?.map(textFromNode).join('') ?? block.id,\n MCP_WIRE_LIMITS.labelCharacters,\n 'Untitled block',\n ),\n level: levels.get(block) ?? 1,\n blockIndex,\n });\n const checkpoint = cancellationCheckpoint(signal, blockIndex);\n if (checkpoint) await checkpoint;\n }\n return outline;\n}\n\nfunction parseInspectionCursor(cursor: string | null, blockCount: number): number {\n if (cursor === null) return 0;\n const match = /^blocks:(0|[1-9][0-9]{0,9})$/u.exec(cursor);\n if (!match) throw new Error('Invalid inspection cursor');\n const offset = Number(match[1]);\n if (!Number.isSafeInteger(offset) || offset > blockCount) {\n throw new Error('Inspection cursor is outside the document');\n }\n return offset;\n}\n\n/** Compute heading ranges in one reverse pass while allowing protocol cancellation to run. */\nexport async function computeBlockSourceRanges(\n blocks: readonly Pick<PreparedDocument['doc']['blocks'][number], 'sourceHeading'>[],\n markdownLength: number,\n signal?: AbortSignal,\n): Promise<Array<{ start: number; end: number } | null>> {\n const starts: Array<number | null> = new Array(blocks.length);\n for (let index = 0; index < blocks.length; index += 1) {\n const block = blocks[index];\n const position = block.sourceHeading?.position as { start?: { offset?: unknown } } | undefined;\n const offset = position?.start?.offset;\n starts[index] =\n typeof offset === 'number' && Number.isSafeInteger(offset) && offset >= 0\n ? Math.min(offset, markdownLength)\n : null;\n const checkpoint = cancellationCheckpoint(signal, index);\n if (checkpoint) await checkpoint;\n }\n\n const ranges: Array<{ start: number; end: number } | null> = new Array(starts.length);\n let nextStart = markdownLength;\n for (let index = starts.length - 1; index >= 0; index -= 1) {\n const start = starts[index];\n if (start === null || start === undefined) {\n ranges[index] = null;\n } else {\n ranges[index] = { start, end: nextStart };\n nextStart = start;\n }\n const checkpoint = cancellationCheckpoint(signal, starts.length - index);\n if (checkpoint) await checkpoint;\n }\n return ranges;\n}\n\nfunction summarizeItems(\n prepared: PreparedDocument,\n blocks: readonly PreparedDocument['doc']['blocks'][number][],\n tables: readonly { index: number; headers: readonly string[] }[],\n): { items: InspectionResult['items']; truncated: boolean } {\n if (prepared.sourceFormat === 'pptx' || prepared.sourceFormat === 'pdf') {\n const kind = prepared.sourceFormat === 'pptx' ? ('slide' as const) : ('page' as const);\n const all = blocks.length > 0 ? blocks : [null];\n return {\n items: all.slice(0, 1_000).map((block, index) => ({\n kind,\n index,\n label:\n block?.title === undefined\n ? `${kind} ${index + 1}`\n : boundWireText(block.title, MCP_WIRE_LIMITS.labelCharacters),\n blockIds: block ? [toWireIdentifier(block.id, 'block')] : [],\n })),\n truncated: all.length > 1_000,\n };\n }\n if (prepared.sourceFormat === 'xlsx' || prepared.sourceFormat === 'csv') {\n const total = Math.max(1, tables.length);\n return {\n items: Array.from({ length: Math.min(total, 1_000) }, (_unused, index) => ({\n kind: 'sheet' as const,\n index,\n label:\n tables[index]?.headers[0] === undefined\n ? `Sheet ${index + 1}`\n : boundWireText(tables[index].headers[0], MCP_WIRE_LIMITS.labelCharacters),\n blockIds: [],\n })),\n truncated: total > 1_000,\n };\n }\n return { items: [], truncated: false };\n}\n\nfunction textFromNode(node: unknown): string {\n if (!node || typeof node !== 'object') return '';\n const candidate = node as { value?: unknown; children?: unknown };\n if (typeof candidate.value === 'string') return candidate.value;\n return Array.isArray(candidate.children) ? candidate.children.map(textFromNode).join('') : '';\n}\n\nfunction summarizeMarkdownNodes(markdownDoc: PreparedDocument['markdownDoc']): {\n tableCount: number;\n linkCount: number;\n tables: Array<{ index: number; rowCount: number; columnCount: number; headers: string[] }>;\n links: Array<{ index: number; text: string; target: string }>;\n truncated: boolean;\n} {\n let tableCount = 0;\n let linkCount = 0;\n const tables: Array<{ index: number; rowCount: number; columnCount: number; headers: string[] }> =\n [];\n const links: Array<{ index: number; text: string; target: string }> = [];\n const visit = (node: unknown): void => {\n if (!node || typeof node !== 'object') return;\n const candidate = node as {\n type?: unknown;\n children?: unknown;\n url?: unknown;\n identifier?: unknown;\n };\n if (candidate.type === 'table') {\n const index = tableCount;\n tableCount += 1;\n if (tables.length < 1_000) {\n const rows = Array.isArray(candidate.children) ? candidate.children : [];\n const rowCells = rows.map((row) => {\n if (!row || typeof row !== 'object') return [];\n const children = (row as { children?: unknown }).children;\n return Array.isArray(children) ? children : [];\n });\n tables.push({\n index,\n rowCount: rowCells.length,\n columnCount: rowCells.reduce((maximum, cells) => Math.max(maximum, cells.length), 0),\n headers: (rowCells[0] ?? [])\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((cell) => boundWireText(textFromNode(cell), MCP_WIRE_LIMITS.labelCharacters)),\n });\n }\n }\n if (candidate.type === 'link' || candidate.type === 'linkReference') {\n const index = linkCount;\n linkCount += 1;\n if (links.length < 1_000) {\n const target =\n typeof candidate.url === 'string'\n ? candidate.url\n : typeof candidate.identifier === 'string'\n ? `reference:${candidate.identifier}`\n : 'unknown:';\n links.push({\n index,\n text: boundWireText(textFromNode(candidate), MCP_WIRE_LIMITS.labelCharacters),\n target: boundWireText(target, MCP_WIRE_LIMITS.uriCharacters, 'unknown:'),\n });\n }\n }\n if (Array.isArray(candidate.children)) candidate.children.forEach(visit);\n };\n visit(markdownDoc);\n return {\n tableCount,\n linkCount,\n tables,\n links,\n truncated: tableCount > tables.length || linkCount > links.length,\n };\n}\n\nfunction metadataFromFrontmatter(frontmatter: Record<string, unknown> | undefined): {\n title: string | null;\n author: string | null;\n description: string | null;\n} {\n return {\n title: stringField(frontmatter, 'title', MCP_WIRE_LIMITS.labelCharacters),\n author: stringField(frontmatter, 'author', MCP_WIRE_LIMITS.labelCharacters),\n description: stringField(frontmatter, 'description', MCP_WIRE_LIMITS.messageCharacters),\n };\n}\n\nfunction stringField(\n frontmatter: Record<string, unknown> | undefined,\n key: string,\n maximumCharacters: number,\n): string | null {\n const value = frontmatter?.[key];\n if (typeof value !== 'string' || !value) return null;\n const bounded = boundWireText(value, maximumCharacters);\n return bounded || null;\n}\n\nasync function themeSummary(\n prepared: PreparedDocument,\n signal?: AbortSignal,\n): Promise<ThemeSummary | null> {\n throwIfAborted(signal);\n const themeId = prepared.doc.themeId;\n if (!themeId) return null;\n const documentTheme = prepared.doc.customThemes?.find((theme) => theme.id === themeId);\n if (documentTheme) {\n return {\n id: toWireIdentifier(themeId, 'theme'),\n name: boundWireText(documentTheme.name ?? themeId, MCP_WIRE_LIMITS.labelCharacters, themeId),\n source: prepared.sourceFormat === 'pptx' ? 'inferred' : 'document',\n layouts: [\n ...new Set(\n prepared.doc.customTemplates\n ?.slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((template) => boundWireText(template.name, MCP_WIRE_LIMITS.labelCharacters)) ?? [],\n ),\n ],\n };\n }\n const { getThemeSummaries } = await import('@bendyline/squisq/schemas');\n throwIfAborted(signal);\n const builtIn = getThemeSummaries().find((theme) => theme.id === themeId);\n return {\n id: toWireIdentifier(themeId, 'theme'),\n name: boundWireText(builtIn?.name ?? themeId, MCP_WIRE_LIMITS.labelCharacters, themeId),\n source: 'built-in',\n layouts: [\n ...new Set(\n prepared.doc.customTemplates\n ?.slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((template) => boundWireText(template.name, MCP_WIRE_LIMITS.labelCharacters)) ?? [],\n ),\n ],\n };\n}\n\nfunction mapDocDiagnostic(diagnostic: DocDiagnostic, format: string): McpDiagnostic {\n return {\n code: diagnostic.code,\n severity: diagnostic.severity,\n stage: 'validate',\n format,\n count: 1,\n message: diagnostic.message,\n remediation: null,\n retryable: false,\n location: diagnostic.blockId\n ? {\n kind: 'block',\n blockId: toWireIdentifier(diagnostic.blockId, 'block'),\n nodeType: 'block',\n }\n : diagnostic.line\n ? { kind: 'source', line: diagnostic.line, column: 1 }\n : null,\n };\n}\n\nfunction missingAltTextDiagnostics(\n markdownDoc: PreparedDocument['markdownDoc'],\n format: string,\n): McpDiagnostic[] {\n let missingCount = 0;\n const visit = (node: unknown): void => {\n if (!node || typeof node !== 'object') return;\n const candidate = node as { type?: unknown; alt?: unknown; children?: unknown };\n if (\n candidate.type === 'image' &&\n (typeof candidate.alt !== 'string' || !candidate.alt.trim())\n ) {\n missingCount += 1;\n }\n if (Array.isArray(candidate.children)) candidate.children.forEach(visit);\n };\n visit(markdownDoc);\n if (missingCount === 0) return [];\n return [\n {\n code: 'missing-alt-text',\n severity: 'warning',\n stage: 'validate',\n format,\n count: missingCount,\n message:\n missingCount === 1\n ? 'One image has no alternative text.'\n : `${missingCount} images have no alternative text.`,\n remediation: 'Add concise, meaningful alternative text to every Markdown image.',\n retryable: false,\n location: null,\n },\n ];\n}\n\nasync function targetPreflight(\n prepared: PreparedDocument,\n targetFormat: string,\n signal?: AbortSignal,\n): Promise<McpDiagnostic[]> {\n throwIfAborted(signal);\n const normalized = targetFormat.toLowerCase();\n const { createCliRegistry } = await import('@bendyline/squisq-cli/api');\n throwIfAborted(signal);\n const target = createCliRegistry().get(normalized);\n if (!target?.exportDoc) {\n return [\n {\n code: target ? 'unsupported-output' : 'unknown-format',\n severity: 'error',\n stage: 'validate',\n format: normalized,\n count: 1,\n message: target\n ? `${target.label} cannot be used as a conversion target.`\n : `Unknown target format \"${normalized}\".`,\n remediation: 'Choose an export-capable format from list_formats.',\n retryable: false,\n location: null,\n },\n ];\n }\n const diagnostics: McpDiagnostic[] = [];\n const details = summarizeMarkdownNodes(prepared.markdownDoc);\n await yieldForCancellation(signal);\n if (['pptx', 'pdf', 'mp4', 'gif'].includes(normalized)) {\n const { analyzeBlocks } = await import('@bendyline/squisq/transform');\n let denseBlockCount = 0;\n let firstDenseBlock: PreparedDocument['doc']['blocks'][number] | null = null;\n let analyzedIndex = 0;\n for (const entry of analyzeBlocks(prepared.doc.blocks)) {\n const checkpoint = cancellationCheckpoint(signal, analyzedIndex);\n if (checkpoint) await checkpoint;\n analyzedIndex += 1;\n if (entry.bodyWordCount <= 120 && entry.plainText.length <= 900) continue;\n denseBlockCount += 1;\n firstDenseBlock ??= entry.block;\n }\n if (denseBlockCount > 0) {\n diagnostics.push({\n code: 'content-density-high',\n severity: 'warning',\n stage: 'validate',\n format: normalized,\n count: denseBlockCount,\n message:\n denseBlockCount === 1\n ? `Block \"${firstDenseBlock?.title ?? firstDenseBlock?.id ?? 'unknown'}\" may be too dense for a single rendered item.`\n : `${denseBlockCount} blocks may be too dense for a single rendered item.`,\n remediation:\n 'Split the block, shorten prose, or confirm the result with preview_document overflow diagnostics.',\n retryable: false,\n location:\n denseBlockCount === 1 && firstDenseBlock\n ? {\n kind: 'block',\n blockId: toWireIdentifier(firstDenseBlock.id, 'block'),\n nodeType: 'block',\n }\n : null,\n });\n }\n const denseTables = details.tables.filter(\n (table) => table.columnCount > 8 || table.rowCount > 30,\n );\n if (denseTables.length > 0) {\n const firstDenseTable = denseTables[0];\n diagnostics.push({\n code: 'table-density-high',\n severity: 'warning',\n stage: 'validate',\n format: normalized,\n count: denseTables.length,\n message:\n denseTables.length === 1 && firstDenseTable\n ? `Table ${firstDenseTable.index + 1} has ${firstDenseTable.rowCount} rows and ${firstDenseTable.columnCount} columns and may overflow.`\n : `${denseTables.length} tables may overflow the rendered output.`,\n remediation:\n 'Split the table or use a spreadsheet target; verify visual clipping with preview_document.',\n retryable: false,\n location: null,\n });\n }\n }\n if (normalized === 'pptx' && prepared.doc.blocks.some((block) => block.template)) {\n diagnostics.push(\n warningDiagnostic(\n 'Editable-native PPTX export preserves semantic content and theme but does not reproduce arbitrary Squisq template geometry.',\n 'validate',\n normalized,\n ),\n );\n }\n if (normalized === 'pdf' && (await hasImages(prepared.markdownDoc, signal))) {\n diagnostics.push(\n warningDiagnostic(\n 'Native PDF export currently represents Markdown images as labeled placeholders.',\n 'validate',\n normalized,\n ),\n );\n }\n if ((normalized === 'csv' || normalized === 'xlsx') && details.tableCount === 0) {\n diagnostics.push(\n warningDiagnostic(\n `${normalized.toUpperCase()} export is table-oriented; this document contains no Markdown tables.`,\n 'validate',\n normalized,\n ),\n );\n }\n if (normalized === 'gif' && (prepared.doc.audio?.segments?.length ?? 0) > 0) {\n diagnostics.push(\n warningDiagnostic(\n 'Animated GIF does not support audio; audio will be omitted.',\n 'validate',\n normalized,\n ),\n );\n }\n return diagnostics;\n}\n\nasync function hasImages(\n markdownDoc: PreparedDocument['markdownDoc'],\n signal?: AbortSignal,\n): Promise<boolean> {\n throwIfAborted(signal);\n let found = false;\n const visit = (node: unknown): void => {\n if (found || !node || typeof node !== 'object') return;\n const candidate = node as { type?: unknown; children?: unknown };\n if (candidate.type === 'image' || candidate.type === 'imageReference') found = true;\n if (Array.isArray(candidate.children)) candidate.children.forEach(visit);\n };\n visit(markdownDoc);\n await yieldForCancellation(signal);\n return found;\n}\n\nexport function boundDiagnostics(\n diagnostics: readonly McpDiagnostic[],\n stage: DiagnosticStage,\n): McpDiagnostic[] {\n const aggregated = aggregateDiagnostics(diagnostics);\n if (aggregated.length <= MAX_DIAGNOSTICS) return aggregated;\n\n // Reserve room for one aggregate per severity. This preserves validation\n // occurrence counts and error status even when individual entries are omitted.\n const retained = aggregated.slice(0, MAX_DIAGNOSTICS - 3);\n const omitted = aggregated.slice(MAX_DIAGNOSTICS - 3);\n const severities: readonly DiagnosticSeverity[] = ['error', 'warning', 'info'];\n const truncationDiagnostics = severities.flatMap((severity): McpDiagnostic[] => {\n const entries = omitted.filter((diagnostic) => diagnostic.severity === severity);\n if (entries.length === 0) return [];\n const occurrenceCount = entries.reduce(\n (sum, diagnostic) => safeDiagnosticCountSum(sum, diagnostic.count),\n 0,\n );\n return [\n {\n code: 'diagnostics-truncated',\n severity,\n stage,\n format: null,\n count: occurrenceCount,\n message: `${entries.length} additional ${severity} diagnostic entries were aggregated to keep the MCP result bounded.`,\n remediation:\n 'Inspect a narrower document range or repair the reported issue class before validating again.',\n retryable: false,\n location: null,\n },\n ];\n });\n return [...retained, ...truncationDiagnostics];\n}\n\nfunction aggregateDiagnostics(diagnostics: readonly McpDiagnostic[]): McpDiagnostic[] {\n const aggregated = new Map<string, McpDiagnostic>();\n for (const input of diagnostics) {\n const diagnostic = boundDiagnosticText(input);\n const key = [\n diagnostic.code,\n diagnostic.severity,\n diagnostic.stage,\n diagnostic.format ?? '',\n diagnostic.message,\n diagnostic.remediation ?? '',\n String(diagnostic.retryable),\n ].join('\\0');\n const current = aggregated.get(key);\n if (!current) {\n aggregated.set(key, diagnostic);\n continue;\n }\n aggregated.set(key, {\n ...current,\n count: safeDiagnosticCountSum(current.count, diagnostic.count),\n location: sameLocation(current.location, diagnostic.location) ? current.location : null,\n });\n }\n return [...aggregated.values()];\n}\n\nfunction boundDiagnosticText(diagnostic: McpDiagnostic): McpDiagnostic {\n const normalizedFormat = diagnostic.format?.toLowerCase() ?? null;\n return {\n ...diagnostic,\n code: toWireIdentifier(diagnostic.code, 'diagnostic'),\n format:\n normalizedFormat !== null && FORMAT_PATTERN.test(normalizedFormat) ? normalizedFormat : null,\n message: boundWireText(\n diagnostic.message,\n MCP_WIRE_LIMITS.messageCharacters,\n 'Document diagnostic',\n ),\n remediation:\n diagnostic.remediation === null\n ? null\n : boundWireText(diagnostic.remediation, MCP_WIRE_LIMITS.messageCharacters),\n location:\n diagnostic.location?.kind === 'block'\n ? {\n ...diagnostic.location,\n blockId: toWireIdentifier(diagnostic.location.blockId, 'block'),\n nodeType: toWireIdentifier(diagnostic.location.nodeType, 'node'),\n }\n : diagnostic.location,\n };\n}\n\nfunction sameLocation(left: McpDiagnostic['location'], right: McpDiagnostic['location']): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction safeDiagnosticCountSum(left: number, right: number): number {\n return Math.min(Number.MAX_SAFE_INTEGER, left + right);\n}\n\nfunction summarizeDiagnostics(diagnostics: readonly McpDiagnostic[]): {\n errorCount: number;\n warningCount: number;\n infoCount: number;\n} {\n let errorCount = 0;\n let warningCount = 0;\n let infoCount = 0;\n for (const diagnostic of diagnostics) {\n if (diagnostic.severity === 'error') {\n errorCount = safeDiagnosticCountSum(errorCount, diagnostic.count);\n } else if (diagnostic.severity === 'warning') {\n warningCount = safeDiagnosticCountSum(warningCount, diagnostic.count);\n } else {\n infoCount = safeDiagnosticCountSum(infoCount, diagnostic.count);\n }\n }\n return { errorCount, warningCount, infoCount };\n}\n\nfunction normalizeTargetFormat(targetFormat: string | null): string | null {\n if (targetFormat === null) return null;\n const normalized = targetFormat.toLowerCase();\n if (!FORMAT_PATTERN.test(normalized)) {\n throw new Error(`Invalid target format \"${targetFormat.slice(0, 64)}\"`);\n }\n return normalized;\n}\n\nfunction words(text: string): string[] {\n return text.toLowerCase().match(/[\\p{L}\\p{N}]+/gu) ?? [];\n}\n\nasync function multisetSimilarity(\n left: readonly string[],\n right: readonly string[],\n signal?: AbortSignal,\n): Promise<number> {\n if (left.length === 0 && right.length === 0) return 1;\n const [leftCounts, rightCounts] = await Promise.all([\n counts(left, signal),\n counts(right, signal),\n ]);\n let intersection = 0;\n let union = 0;\n let index = 0;\n for (const word of new Set([...leftCounts.keys(), ...rightCounts.keys()])) {\n intersection += Math.min(leftCounts.get(word) ?? 0, rightCounts.get(word) ?? 0);\n union += Math.max(leftCounts.get(word) ?? 0, rightCounts.get(word) ?? 0);\n const checkpoint = cancellationCheckpoint(signal, index);\n if (checkpoint) await checkpoint;\n index += 1;\n }\n return union === 0 ? 1 : intersection / union;\n}\n\nasync function counts(\n values: readonly string[],\n signal?: AbortSignal,\n): Promise<Map<string, number>> {\n const result = new Map<string, number>();\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (value !== undefined) result.set(value, (result.get(value) ?? 0) + 1);\n const checkpoint = cancellationCheckpoint(signal, index);\n if (checkpoint) await checkpoint;\n }\n return result;\n}\n\nfunction ratioSimilarity(left: number, right: number): number {\n return left === 0 && right === 0 ? 1 : Math.min(left, right) / Math.max(left, right);\n}\n\nfunction assetSimilarity(\n left: InspectionResult['assets'],\n right: InspectionResult['assets'],\n): number {\n if (left.length === 0 && right.length === 0) return 1;\n const leftKeys = new Set(left.map((asset) => `${asset.path}:${asset.sha256 ?? asset.size}`));\n const rightKeys = new Set(right.map((asset) => `${asset.path}:${asset.sha256 ?? asset.size}`));\n const intersection = [...leftKeys].filter((key) => rightKeys.has(key)).length;\n const union = new Set([...leftKeys, ...rightKeys]).size;\n return union === 0 ? 1 : intersection / union;\n}\n\nfunction objectSimilarity(\n left: InspectionResult['metadata'],\n right: InspectionResult['metadata'],\n): number {\n const keys = ['title', 'author', 'description'] as const;\n return keys.filter((key) => left[key] === right[key]).length / keys.length;\n}\n\nfunction metadataFieldCount(inspection: InspectionResult): number {\n return Object.values(inspection.metadata).filter((value) => value !== null).length;\n}\n\nasync function layoutTokens(prepared: PreparedDocument, signal?: AbortSignal): Promise<string[]> {\n const tokens: string[] = [];\n const pending = [...prepared.doc.blocks].reverse();\n let index = 0;\n while (pending.length > 0) {\n const block = pending.pop();\n if (!block) break;\n tokens.push(`block:${block.template ?? 'default'}`);\n const children = block.children ?? [];\n for (let childIndex = children.length - 1; childIndex >= 0; childIndex -= 1) {\n const child = children[childIndex];\n if (child) pending.push(child);\n }\n const checkpoint = cancellationCheckpoint(signal, index);\n if (checkpoint) await checkpoint;\n index += 1;\n }\n const customTemplates = prepared.doc.customTemplates ?? [];\n for (let templateIndex = 0; templateIndex < customTemplates.length; templateIndex += 1) {\n const template = customTemplates[templateIndex];\n if (!template) continue;\n tokens.push(`custom:${template.name}:${template.label}`);\n const checkpoint = cancellationCheckpoint(signal, index + templateIndex);\n if (checkpoint) await checkpoint;\n }\n return tokens;\n}\n\nfunction timingSummary(prepared: PreparedDocument): {\n duration: number;\n segmentCount: number;\n captionCount: number;\n} {\n return {\n duration: prepared.doc.duration,\n segmentCount: prepared.doc.audio.segments.length,\n captionCount: prepared.doc.captions?.phrases.length ?? 0,\n };\n}\n\nasync function accessibilityTokens(\n prepared: PreparedDocument,\n signal?: AbortSignal,\n): Promise<string[]> {\n const tokens: string[] = [];\n const pending: unknown[] = [prepared.markdownDoc];\n let index = 0;\n while (pending.length > 0) {\n const node = pending.pop();\n if (!node || typeof node !== 'object') continue;\n const candidate = node as { type?: unknown; alt?: unknown; children?: unknown };\n if (candidate.type === 'image' || candidate.type === 'imageReference') {\n const alt = typeof candidate.alt === 'string' ? candidate.alt.trim() : '';\n tokens.push(`image-alt:${alt}`);\n }\n if (Array.isArray(candidate.children)) {\n for (let childIndex = candidate.children.length - 1; childIndex >= 0; childIndex -= 1) {\n pending.push(candidate.children[childIndex]);\n }\n }\n const checkpoint = cancellationCheckpoint(signal, index);\n if (checkpoint) await checkpoint;\n index += 1;\n }\n const phrases = prepared.doc.captions?.phrases ?? [];\n for (let phraseIndex = 0; phraseIndex < phrases.length; phraseIndex += 1) {\n const phrase = phrases[phraseIndex];\n if (!phrase) continue;\n tokens.push(`caption:${phrase.text}`);\n const checkpoint = cancellationCheckpoint(signal, index + phraseIndex);\n if (checkpoint) await checkpoint;\n }\n return tokens;\n}\n\nfunction cancellationCheckpoint(\n signal: AbortSignal | undefined,\n index: number,\n): Promise<void> | null {\n throwIfAborted(signal);\n return index % CANCELLATION_YIELD_INTERVAL === 0 ? yieldForCancellation(signal) : null;\n}\n\nasync function yieldForCancellation(signal?: AbortSignal): Promise<void> {\n throwIfAborted(signal);\n await new Promise<void>((resolve) => setImmediate(resolve));\n throwIfAborted(signal);\n}\n\nfunction metric(\n name: string,\n leftValue: number,\n rightValue: number,\n similarity: number,\n): ComparisonMetric {\n return { name, leftValue, rightValue, similarity: clamp01(similarity) };\n}\n\nfunction change(\n category: ComparisonChange['category'],\n similarity: number,\n label: string,\n leftCount: number,\n rightCount: number,\n): ComparisonChange {\n const status =\n similarity === 1\n ? 'retained'\n : leftCount === 0 && rightCount > 0\n ? 'added'\n : leftCount > 0 && rightCount === 0\n ? 'omitted'\n : similarity === 0\n ? 'changed'\n : 'degraded';\n return {\n category,\n status,\n path: null,\n message: `${label} similarity is ${Math.round(similarity * 100)}%.`,\n };\n}\n\nfunction clamp01(value: number): number {\n return Math.max(0, Math.min(1, Number(value.toFixed(6))));\n}\n","import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { basename, extname, join } from 'node:path';\nimport type {\n ArtifactRef,\n EngineVersion,\n McpDiagnostic,\n PreviewItem,\n PreviewItemKind,\n PreviewResult,\n} from '@bendyline/docblocks/mcp';\nimport { DOCBLOCKS_MCP_WIRE_VERSION } from '@bendyline/docblocks/mcp';\nimport type { Doc } from '@bendyline/squisq/schemas';\nimport type { ContentContainer } from '@bendyline/squisq/storage';\nimport { getDependencyRuntimeVersion, getPackageVersion } from '../version.js';\nimport { ArtifactStore } from './artifact-store.js';\nimport type { PreparedDocument } from './document-service.js';\nimport { throwIfAborted } from './document-service.js';\nimport { boundDiagnostics } from './intelligence.js';\n\nconst DEFAULT_WIDTH = 1_280;\nconst DEFAULT_HEIGHT = 720;\nconst DEFAULT_MAX_ITEMS = 8;\nconst MAX_ITEMS = 20;\nconst MAX_RENDERED_ITEMS = 100;\nexport const MCP_PREVIEW_CAPTURE_LIMITS = Object.freeze({\n maximumAggregatePixels: 120_000_000,\n maximumCapturedBytes: 64 * 1024 * 1024,\n});\n\nexport interface PreviewRequestOptions {\n startIndex?: number;\n maxItems?: number;\n width?: number;\n height?: number;\n}\n\n/**\n * Fingerprinting the linked runtime is I/O-bound, so it is awaited rather than\n * computed inline: a preview is served by the same stdio server that must stay\n * responsive to progress and cancellation traffic. The result is cached in\n * `version.ts`, so only the first call per process pays for the walk.\n */\nasync function previewEngineVersions(): Promise<EngineVersion[]> {\n return [\n { name: 'docblocks', version: getPackageVersion() },\n {\n name: '@bendyline/squisq-cli',\n version: await getDependencyRuntimeVersion(\n '@bendyline/squisq-cli',\n '@bendyline/squisq-cli/api',\n ),\n },\n ];\n}\n\nexport interface CapturedPreview {\n bytes: Uint8Array;\n index: number;\n label: string | null;\n width: number;\n height: number;\n}\n\nexport type PreviewProgress = (\n completed: number,\n total: number,\n message: string,\n) => Promise<void> | void;\n\nexport type PreviewCapture = (\n doc: Doc,\n container: ContentContainer,\n options: Required<Pick<PreviewRequestOptions, 'startIndex' | 'maxItems' | 'width' | 'height'>>,\n signal?: AbortSignal,\n progress?: PreviewProgress,\n) => Promise<{\n captures: CapturedPreview[];\n totalItems: number;\n diagnostics?: McpDiagnostic[];\n}>;\n\nexport interface VideoPreviewSource {\n bytes: Uint8Array;\n filename: string;\n format: string;\n sha256: string;\n}\n\nexport type VideoThumbnailExtractionOptions =\n import('@bendyline/squisq-cli/api').ExtractThumbnailsOptions;\nexport type VideoThumbnailExtractor = typeof import('@bendyline/squisq-cli/api').extractThumbnails;\n\nexport type PreviewBrowserLauncher = () => Promise<import('playwright-core').Browser>;\n\n/** Capture every visual item for rendered-fidelity conversion without publishing intermediates. */\nexport async function capturePreparedDocumentFrames(\n prepared: PreparedDocument,\n options: { width?: number; height?: number } = {},\n signal?: AbortSignal,\n progress?: PreviewProgress,\n): Promise<CapturedPreview[]> {\n const normalized = normalizeOptions({\n startIndex: 0,\n maxItems: MAX_ITEMS,\n width: options.width ?? 1_200,\n height: options.height ?? 900,\n });\n const { flattenBlocks } = await import('@bendyline/squisq/doc');\n const totalItems = flattenBlocks(prepared.doc.blocks).length;\n if (totalItems > MAX_RENDERED_ITEMS) {\n throw new Error(\n `Rendered-fidelity conversion supports at most ${MAX_RENDERED_ITEMS} visual items`,\n );\n }\n const rendered = await captureWithPlaywright(\n prepared.doc,\n prepared.container,\n { ...normalized, maxItems: Math.max(1, totalItems) },\n signal,\n progress,\n );\n if (rendered.captures.length !== totalItems) {\n throw new Error('Rendered-fidelity capture did not produce every visual item');\n }\n assertCapturedPreviewBudget(rendered.captures);\n return rendered.captures;\n}\n\n/** Render bounded Squisq visual previews into immutable PNG artifacts. */\nexport async function previewPreparedDocument(\n artifacts: ArtifactStore,\n prepared: PreparedDocument,\n request: PreviewRequestOptions,\n signal?: AbortSignal,\n progress?: PreviewProgress,\n capture: PreviewCapture = captureWithPlaywright,\n maximumCapturedBytes = MCP_PREVIEW_CAPTURE_LIMITS.maximumCapturedBytes,\n): Promise<PreviewResult> {\n const options = normalizeOptions(request);\n throwIfAborted(signal);\n const rendered = await capture(prepared.doc, prepared.container, options, signal, progress);\n assertCapturedPreviewBudget(rendered.captures, maximumCapturedBytes);\n const previewBasis =\n prepared.sourceFormat === 'md' || prepared.sourceFormat === 'dbk'\n ? 'source-render'\n : 'reconstructed-import';\n const itemKind = previewItemKind(prepared.sourceFormat);\n const items: PreviewItem[] = [];\n const createdArtifactUris: string[] = [];\n const engineVersions = await previewEngineVersions();\n try {\n for (const captured of rendered.captures) {\n throwIfAborted(signal);\n const artifact = await artifacts.put(\n {\n bytes: captured.bytes,\n format: 'png',\n mimeType: 'image/png',\n sourceFormat: prepared.sourceFormat,\n sourceSha256: prepared.sourceSha256,\n suggestedFilename: `${prepared.baseName}-preview-${String(captured.index + 1).padStart(3, '0')}.png`,\n appliedOptions: [\n { name: 'width', value: captured.width },\n { name: 'height', value: captured.height },\n { name: 'itemIndex', value: captured.index },\n ],\n engineVersions,\n },\n signal,\n );\n createdArtifactUris.push(artifact.uri);\n items.push({\n kind: itemKind,\n index: captured.index,\n label: captured.label,\n artifact,\n width: captured.width,\n height: captured.height,\n });\n }\n throwIfAborted(signal);\n } catch (caught: unknown) {\n await Promise.allSettled(createdArtifactUris.map((uri) => artifacts.discard(uri)));\n throw caught;\n }\n return {\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'preview',\n sourceFormat: prepared.sourceFormat,\n previewBasis,\n totalItems: rendered.totalItems,\n items,\n truncated: options.startIndex > 0 || options.startIndex + items.length < rendered.totalItems,\n diagnostics: boundDiagnostics(\n [\n ...prepared.diagnostics,\n ...(rendered.diagnostics ?? []),\n ...(previewBasis === 'reconstructed-import'\n ? [reconstructedPreviewDiagnostic(prepared.sourceFormat)]\n : []),\n ],\n 'render',\n ),\n };\n}\n\n/** Extract one bounded first-frame JPEG from an existing MP4 or GIF source. */\nexport async function previewVideoSource(\n artifacts: ArtifactStore,\n source: VideoPreviewSource,\n request: PreviewRequestOptions,\n signal?: AbortSignal,\n progress?: PreviewProgress,\n extract?: VideoThumbnailExtractor,\n): Promise<PreviewResult> {\n const options = normalizeOptions(request);\n const sourceFormat = source.format.toLowerCase().replace(/^\\./u, '');\n if (sourceFormat !== 'mp4' && sourceFormat !== 'gif') {\n throw new Error('Rendered-media thumbnail preview requires an MP4 or GIF source');\n }\n if (options.startIndex > 0) {\n throw new Error('Preview startIndex is beyond the available items');\n }\n throwIfAborted(signal);\n\n const directory = await mkdtemp(join(tmpdir(), 'docblocks-mcp-video-preview-'));\n const inputPath = join(directory, `source.${sourceFormat}`);\n const slug = 'first-frame';\n const outputPath = join(directory, `${slug}-${options.width}x${options.height}.jpg`);\n let thumbnail: Buffer;\n try {\n await progress?.(0, 3, 'Staging video preview');\n await writeFile(inputPath, source.bytes, { signal });\n throwIfAborted(signal);\n const extractor = extract ?? (await import('@bendyline/squisq-cli/api')).extractThumbnails;\n await progress?.(1, 3, 'Extracting first video frame');\n await extractor({\n videoPath: inputPath,\n outputDir: directory,\n slug,\n sizes: [\n {\n name: 'preview',\n width: options.width,\n height: options.height,\n filter: thumbnailFilter(options.width, options.height),\n },\n ],\n force: true,\n signal,\n });\n throwIfAborted(signal);\n thumbnail = await readFile(outputPath, { signal });\n throwIfAborted(signal);\n await progress?.(2, 3, 'Publishing video preview');\n } finally {\n await rm(directory, { recursive: true, force: true });\n }\n\n throwIfAborted(signal);\n const baseName = baseNameFromFilename(source.filename);\n let artifact: ArtifactRef | null = null;\n try {\n artifact = await artifacts.put(\n {\n bytes: thumbnail,\n format: 'jpg',\n mimeType: 'image/jpeg',\n sourceFormat,\n sourceSha256: source.sha256,\n suggestedFilename: `${baseName}-preview-001.jpg`,\n appliedOptions: [\n { name: 'width', value: options.width },\n { name: 'height', value: options.height },\n { name: 'itemIndex', value: 0 },\n ],\n engineVersions: await previewEngineVersions(),\n },\n signal,\n );\n throwIfAborted(signal);\n await progress?.(3, 3, 'Video preview complete');\n throwIfAborted(signal);\n } catch (caught: unknown) {\n if (artifact) await artifacts.discard(artifact.uri).catch(() => undefined);\n throw caught;\n }\n if (!artifact) throw new Error('Video preview artifact publication failed');\n return {\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'preview',\n sourceFormat,\n previewBasis: 'native-extracted',\n totalItems: 1,\n items: [\n {\n kind: 'frame',\n index: 0,\n label: 'First frame',\n artifact,\n width: options.width,\n height: options.height,\n },\n ],\n truncated: false,\n diagnostics: [],\n };\n}\n\nfunction reconstructedPreviewDiagnostic(format: string): McpDiagnostic {\n return {\n code: 'preview-reconstructed',\n severity: 'warning',\n stage: 'render',\n format,\n count: 1,\n message:\n 'Preview images render the normalized imported document and may differ from the native application pixels.',\n remediation:\n 'Use the preview for structural review; open the saved artifact in its native application for exact target-pixel verification.',\n retryable: false,\n location: null,\n };\n}\n\nfunction normalizeOptions(\n request: PreviewRequestOptions,\n): Required<Pick<PreviewRequestOptions, 'startIndex' | 'maxItems' | 'width' | 'height'>> {\n const options = {\n startIndex: request.startIndex ?? 0,\n maxItems: request.maxItems ?? DEFAULT_MAX_ITEMS,\n width: request.width ?? DEFAULT_WIDTH,\n height: request.height ?? DEFAULT_HEIGHT,\n };\n if (!Number.isSafeInteger(options.startIndex) || options.startIndex < 0) {\n throw new Error('Preview startIndex must be a non-negative integer');\n }\n if (\n !Number.isSafeInteger(options.maxItems) ||\n options.maxItems < 1 ||\n options.maxItems > MAX_ITEMS\n ) {\n throw new Error(`Preview maxItems must be between 1 and ${MAX_ITEMS}`);\n }\n if (!Number.isSafeInteger(options.width) || options.width < 160 || options.width > 1_920) {\n throw new Error('Preview width must be between 160 and 1920 pixels');\n }\n if (!Number.isSafeInteger(options.height) || options.height < 90 || options.height > 1_920) {\n throw new Error('Preview height must be between 90 and 1920 pixels');\n }\n if (options.width * options.height > 2_073_600) {\n throw new Error('Preview pixel area must not exceed 1920x1080');\n }\n return options;\n}\n\nfunction thumbnailFilter(width: number, height: number): string {\n return `scale=${width}:${height}:force_original_aspect_ratio=decrease,pad=${width}:${height}:(ow-iw)/2:(oh-ih)/2`;\n}\n\nfunction baseNameFromFilename(filename: string): string {\n const leaf = basename(filename.replace(/\\\\/gu, '/')) || 'video';\n const extension = extname(leaf);\n return (extension ? leaf.slice(0, -extension.length) : leaf) || 'video';\n}\n\nexport async function captureWithPlaywright(\n doc: Doc,\n container: ContentContainer,\n options: Required<Pick<PreviewRequestOptions, 'startIndex' | 'maxItems' | 'width' | 'height'>>,\n signal?: AbortSignal,\n progress?: PreviewProgress,\n launchBrowser?: PreviewBrowserLauncher,\n): Promise<{\n captures: CapturedPreview[];\n totalItems: number;\n diagnostics?: McpDiagnostic[];\n}> {\n throwIfAborted(signal);\n const { flattenBlocks } = await import('@bendyline/squisq/doc');\n const blocks = flattenBlocks(doc.blocks);\n const selected = blocks.slice(options.startIndex, options.startIndex + options.maxItems);\n if (selected.length === 0 && blocks.length > 0) {\n throw new Error('Preview startIndex is beyond the available items');\n }\n if (blocks.length === 0) return { captures: [], totalItems: 0 };\n const aggregatePixels = options.width * options.height * selected.length;\n if (aggregatePixels > MCP_PREVIEW_CAPTURE_LIMITS.maximumAggregatePixels) {\n throw new Error(\n `Preview capture exceeds the ${MCP_PREVIEW_CAPTURE_LIMITS.maximumAggregatePixels} aggregate-pixel budget`,\n );\n }\n\n await progress?.(0, selected.length + 2, 'Collecting preview media');\n const { images, audio } = await collectMedia(container, signal);\n const [{ generateRenderHtml }, { PLAYER_BUNDLE }] = await Promise.all([\n import('@bendyline/squisq-video'),\n import('@bendyline/squisq-react/standalone-source'),\n ]);\n const html = generateRenderHtml(doc, {\n playerScript: PLAYER_BUNDLE,\n images,\n audio: audio.size > 0 ? audio : undefined,\n width: options.width,\n height: options.height,\n animationsEnabled: false,\n });\n throwIfAborted(signal);\n await progress?.(1, selected.length + 2, 'Launching preview renderer');\n const browser = launchBrowser\n ? await launchBrowser()\n : await import('playwright-core').then(({ chromium }) => chromium.launch({ headless: true }));\n if (signal?.aborted) {\n await browser.close().catch(() => undefined);\n throwIfAborted(signal);\n }\n const handleAbort = (): void => {\n void browser.close().catch(() => undefined);\n };\n signal?.addEventListener('abort', handleAbort, { once: true });\n let renderApi: import('playwright-core').JSHandle<BrowserRenderApi> | null = null;\n try {\n const page = await browser.newPage({\n viewport: { width: options.width, height: options.height },\n });\n await page.setContent(html, { waitUntil: 'load' });\n await page.waitForFunction(\n () => {\n const root = document.getElementById('squisq-root');\n const player = (window as unknown as SquisqBrowserWindow).SquisqPlayer;\n return root ? player?.getHandle(root)?.getRenderAPI() != null : false;\n },\n { timeout: 15_000 },\n );\n renderApi = await page.evaluateHandle(() => {\n const root = document.getElementById('squisq-root');\n const player = (window as unknown as SquisqBrowserWindow).SquisqPlayer;\n const api = root ? player?.getHandle(root)?.getRenderAPI() : null;\n if (!api) throw new Error('Squisq preview render API did not initialize');\n return api;\n });\n const captures: CapturedPreview[] = [];\n const diagnostics: McpDiagnostic[] = [];\n for (let offset = 0; offset < selected.length; offset += 1) {\n throwIfAborted(signal);\n const block = selected[offset]!;\n const time = block.startTime + Math.min(0.1, Math.max(0, block.duration / 4));\n await renderApi.evaluate((api, value: number) => api.seekTo(value), time);\n const layoutAudit = await page.evaluate(() => {\n const root = document.getElementById('squisq-root');\n if (!root) return { overflowCount: 0, missingFonts: [] as string[] };\n let overflowCount = 0;\n const missingFonts = new Set<string>();\n for (const element of root.querySelectorAll<HTMLElement>('*')) {\n if (element.clientWidth <= 0 || element.clientHeight <= 0) continue;\n const style = getComputedStyle(element);\n const clipsX = style.overflowX === 'hidden' || style.overflowX === 'clip';\n const clipsY = style.overflowY === 'hidden' || style.overflowY === 'clip';\n if (\n (clipsX && element.scrollWidth > element.clientWidth + 2) ||\n (clipsY && element.scrollHeight > element.clientHeight + 2)\n ) {\n overflowCount += 1;\n }\n if (element.textContent?.trim() && document.fonts && style.fontFamily) {\n try {\n if (!document.fonts.check(`12px ${style.fontFamily}`)) {\n missingFonts.add(style.fontFamily.slice(0, 256));\n }\n } catch {\n missingFonts.add(style.fontFamily.slice(0, 256));\n }\n }\n }\n return { overflowCount, missingFonts: [...missingFonts].slice(0, 20) };\n });\n const bytes = await page.screenshot({ type: 'png', animations: 'disabled' });\n const index = options.startIndex + offset;\n captures.push({\n bytes,\n index,\n label: block.title ?? block.id ?? null,\n width: options.width,\n height: options.height,\n });\n assertCapturedPreviewBudget(captures);\n if (layoutAudit.overflowCount > 0) {\n diagnostics.push({\n code: 'rendered-overflow',\n severity: 'warning',\n stage: 'render',\n format: 'png',\n count: layoutAudit.overflowCount,\n message: `Preview item ${index + 1} contains clipped rendered content.`,\n remediation: 'Reduce content density, shorten text, or choose a roomier template.',\n retryable: false,\n location: { kind: 'item', itemKind: 'frame', index },\n });\n }\n if (layoutAudit.missingFonts.length > 0) {\n diagnostics.push({\n code: 'font-unavailable',\n severity: 'warning',\n stage: 'render',\n format: 'png',\n count: layoutAudit.missingFonts.length,\n message: `Preview item ${index + 1} could not confirm these fonts: ${layoutAudit.missingFonts.join(', ')}.`,\n remediation:\n 'Embed or install the fonts, or choose a theme with available font families.',\n retryable: false,\n location: { kind: 'item', itemKind: 'frame', index },\n });\n }\n await progress?.(offset + 2, selected.length + 2, `Rendered preview ${index + 1}`);\n }\n await progress?.(selected.length + 2, selected.length + 2, 'Preview complete');\n return { captures, totalItems: blocks.length, diagnostics };\n } finally {\n signal?.removeEventListener('abort', handleAbort);\n await renderApi?.dispose().catch(() => undefined);\n await browser.close().catch(() => undefined);\n }\n}\n\nexport function assertCapturedPreviewBudget(\n captures: readonly Pick<CapturedPreview, 'bytes'>[],\n maximumBytes = MCP_PREVIEW_CAPTURE_LIMITS.maximumCapturedBytes,\n): void {\n if (!Number.isSafeInteger(maximumBytes) || maximumBytes < 1) {\n throw new Error('Preview capture byte budget must be a positive integer');\n }\n let totalBytes = 0;\n for (const capture of captures) {\n totalBytes += capture.bytes.byteLength;\n if (!Number.isSafeInteger(totalBytes) || totalBytes > maximumBytes) {\n throw new Error(`Preview capture exceeds the ${maximumBytes}-byte aggregate budget`);\n }\n }\n}\n\nasync function collectMedia(\n container: ContentContainer,\n signal?: AbortSignal,\n): Promise<{ images: Map<string, ArrayBuffer>; audio: Map<string, ArrayBuffer> }> {\n const images = new Map<string, ArrayBuffer>();\n const audio = new Map<string, ArrayBuffer>();\n for (const entry of await container.listFiles()) {\n throwIfAborted(signal);\n const bytes = await container.readFile(entry.path);\n if (!bytes) continue;\n if (/\\.(?:mp3|m4a|aac|wav|ogg|oga|webm)$/iu.test(entry.path)) {\n audio.set(entry.path, bytes);\n } else if (/\\.(?:avif|bmp|gif|jpe?g|png|svg|webp|mp4|mov|m4v)$/iu.test(entry.path)) {\n images.set(entry.path, bytes);\n const leaf = entry.path.split('/').pop();\n if (leaf) images.set(leaf, bytes);\n }\n }\n return { images, audio };\n}\n\nfunction previewItemKind(format: string): PreviewItemKind {\n switch (format.toLowerCase()) {\n case 'pptx':\n return 'slide';\n case 'xlsx':\n case 'csv':\n return 'sheet';\n case 'mp4':\n case 'gif':\n return 'frame';\n default:\n return 'page';\n }\n}\n\ninterface BrowserRenderApi {\n seekTo(time: number): Promise<void>;\n}\n\ninterface BrowserPlayerHandle {\n getRenderAPI(): BrowserRenderApi | null;\n}\n\ninterface BrowserStandalonePlayer {\n getHandle(element: Element): BrowserPlayerHandle | undefined;\n}\n\ninterface SquisqBrowserWindow {\n SquisqPlayer?: BrowserStandalonePlayer;\n}\n\nexport function previewFailureDiagnostic(message: string): McpDiagnostic {\n return {\n code: 'preview-failed',\n severity: 'error',\n stage: 'render',\n format: 'png',\n count: 1,\n message,\n remediation: 'Install Playwright Chromium and retry with fewer or smaller preview items.',\n retryable: true,\n location: null,\n };\n}\n","import JSZip from 'jszip';\nimport type { ConversionFidelity } from '@bendyline/docblocks/mcp';\nimport type { FormatDefinition, NormalizedInput } from '@bendyline/squisq-cli/api';\nimport type { PreparedDocument } from './document-service.js';\nimport { throwIfAborted } from './document-service.js';\nimport {\n capturePreparedDocumentFrames,\n type CapturedPreview,\n type PreviewProgress,\n} from './preview-service.js';\n\nconst PPTX_REFERENCE_SHORT_EDGE_EMU = 6_858_000;\nconst MAX_HYBRID_TEXT_CHARACTERS = 8_000;\n\nexport interface RenderedConversionResult {\n bytes: Uint8Array;\n mimeType: string;\n suggestedFilename: string;\n warnings: string[];\n}\n\nexport interface RenderedDocumentOptions {\n themeId?: string;\n transformId?: string;\n autoTemplates?: boolean;\n title?: string;\n}\n\nexport type RenderedFrameCapture = (\n prepared: PreparedDocument,\n options: { width?: number; height?: number },\n signal?: AbortSignal,\n progress?: PreviewProgress,\n) => Promise<CapturedPreview[]>;\n\nexport interface PreparedRenderedDocument {\n prepared: PreparedDocument;\n warnings: readonly string[];\n}\n\nexport interface RenderedSerializationHooks {\n onPptxSerializationProgress?: (percent: number) => void;\n onPdfSerializationProgress?: (processedObjects: number) => void;\n}\n\n/** Produce image-backed PPTX/PDF output from the actual linked Squisq player. */\nexport async function convertRenderedDocument(\n prepared: PreparedDocument,\n format: string,\n fidelity: ConversionFidelity,\n options: Readonly<Record<string, string | number | boolean | null>>,\n documentOptions: RenderedDocumentOptions,\n signal?: AbortSignal,\n progress?: PreviewProgress,\n capture: RenderedFrameCapture = capturePreparedDocumentFrames,\n): Promise<RenderedConversionResult> {\n if (format !== 'pptx' && format !== 'pdf') {\n throw new Error(`${fidelity} conversion is available only for PPTX and PDF`);\n }\n const width = numericOption(options, 'width', 1_200);\n const height = numericOption(options, 'height', 900);\n const normalized = await prepareRenderedDocument(prepared, documentOptions, signal);\n const rendered = normalized.prepared;\n const frames = await capture(rendered, { width, height }, signal, progress);\n if (frames.length === 0) throw new Error('Rendered-fidelity conversion requires visual content');\n throwIfAborted(signal);\n const semanticText = await semanticTextByFrame(rendered, frames);\n if (format === 'pptx') {\n return {\n bytes: await packageRenderedPptx(\n frames,\n semanticText,\n fidelity === 'hybrid',\n signal,\n documentOptions.title,\n ),\n mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n suggestedFilename: `${prepared.baseName}.pptx`,\n warnings:\n fidelity === 'hybrid'\n ? [\n ...normalized.warnings,\n 'Hybrid PPTX stores each Squisq visual as a full-slide image and retains hidden semantic text for editing and extraction.',\n ]\n : [\n ...normalized.warnings,\n 'Rendered-fidelity PPTX preserves Squisq pixels; slide contents are images rather than native editable shapes.',\n ],\n };\n }\n return {\n bytes: await packageRenderedPdf(\n frames,\n semanticText,\n fidelity === 'hybrid' ? rendered.markdown : null,\n prepared.baseName,\n signal,\n documentOptions.title,\n ),\n mimeType: 'application/pdf',\n suggestedFilename: `${prepared.baseName}.pdf`,\n warnings:\n fidelity === 'hybrid'\n ? [\n ...normalized.warnings,\n 'Hybrid PDF retains invisible extraction text and an attached Markdown source, but is not a fully tagged accessible PDF.',\n ]\n : [\n ...normalized.warnings,\n 'Rendered-fidelity PDF preserves Squisq pixels; page contents are raster images and are not editable.',\n ],\n };\n}\n\n/** Apply linked-registry normalization and transforms before the visual renderer sees the Doc. */\nexport async function prepareRenderedDocument(\n prepared: PreparedDocument,\n options: RenderedDocumentOptions,\n signal?: AbortSignal,\n): Promise<PreparedRenderedDocument> {\n throwIfAborted(signal);\n const { convert, createCliRegistry } = await import('@bendyline/squisq-cli/api');\n const registry = createCliRegistry();\n const captureFormat = 'docblocks-render-input';\n let normalized: NormalizedInput | undefined;\n const captureDefinition: FormatDefinition = {\n id: captureFormat,\n label: 'DocBlocks rendered input',\n mimeType: 'application/x-docblocks-render-input',\n extensions: ['.render-input'],\n async exportDoc(input) {\n normalized = input;\n return {\n bytes: new Uint8Array(0),\n mimeType: 'application/x-docblocks-render-input',\n suggestedFilename: 'render-input',\n warnings: [],\n };\n },\n };\n registry.register(captureDefinition);\n const result = await convert(\n {\n kind: 'markdown',\n markdown: prepared.markdownDoc,\n container: prepared.container,\n baseName: prepared.baseName,\n },\n captureFormat,\n {\n registry,\n themeId: options.themeId,\n transformStyle: options.transformId,\n autoTemplates: options.autoTemplates,\n title: options.title,\n signal,\n },\n );\n throwIfAborted(signal);\n if (!normalized) throw new Error('Linked Squisq did not produce a rendered document input');\n\n const { docToMarkdown } = await import('@bendyline/squisq/doc');\n const { stringifyMarkdown } = await import('@bendyline/squisq/markdown');\n let markdownDoc = normalized.markdownDoc ?? docToMarkdown(normalized.doc);\n let doc = normalized.doc;\n if (options.title !== undefined || options.themeId !== undefined) {\n const frontmatter = {\n ...(markdownDoc.frontmatter ?? {}),\n ...(options.title !== undefined ? { title: options.title } : {}),\n ...(options.themeId !== undefined ? { 'squisq-theme': options.themeId } : {}),\n };\n markdownDoc = { ...markdownDoc, frontmatter };\n doc = {\n ...doc,\n frontmatter: { ...(doc.frontmatter ?? {}), ...frontmatter },\n ...(options.title !== undefined\n ? {\n startBlock: doc.startBlock\n ? { ...doc.startBlock, title: options.title }\n : { title: options.title },\n }\n : {}),\n };\n }\n if (options.themeId !== undefined && doc.themeId !== options.themeId) {\n doc = { ...doc, themeId: options.themeId };\n }\n\n return {\n prepared: {\n ...prepared,\n markdown: stringifyMarkdown(markdownDoc),\n markdownDoc,\n doc,\n container: normalized.container,\n },\n warnings: result.warnings,\n };\n}\n\nexport async function packageRenderedPptx(\n frames: readonly CapturedPreview[],\n semanticText: readonly string[],\n hybrid: boolean,\n signal?: AbortSignal,\n title?: string,\n serializationHooks: RenderedSerializationHooks = {},\n): Promise<Uint8Array> {\n const { convert } = await import('@bendyline/squisq-cli/api');\n const scaffold = frames\n .map((_frame, index) => `## Rendered slide ${index + 1}\\n\\nPlaceholder`)\n .join('\\n\\n');\n const converted = await convert(\n { kind: 'markdown', markdown: scaffold, baseName: 'rendered' },\n 'pptx',\n { ...(title === undefined ? {} : { title }), signal },\n );\n throwIfAborted(signal);\n const archive = await JSZip.loadAsync(converted.bytes);\n const slideSize = renderedPptxSlideSize(frames[0]!);\n const presentationPart = archive.file('ppt/presentation.xml');\n if (!presentationPart) throw new Error('Linked PPTX scaffold has no presentation manifest');\n const presentation = await presentationPart.async('string');\n const resizedPresentation = presentation.replace(\n /<p:sldSz\\b[^>]*\\/>/u,\n `<p:sldSz cx=\"${slideSize.width}\" cy=\"${slideSize.height}\" type=\"custom\"/>`,\n );\n if (resizedPresentation === presentation) {\n throw new Error('Linked PPTX scaffold has no slide-size declaration');\n }\n archive.file('ppt/presentation.xml', resizedPresentation);\n const contentTypesPart = archive.file('[Content_Types].xml');\n if (!contentTypesPart) throw new Error('Linked PPTX scaffold has no content-types manifest');\n let contentTypes = await contentTypesPart.async('string');\n if (!/Extension=\"png\"/iu.test(contentTypes)) {\n contentTypes = contentTypes.replace(\n '</Types>',\n '<Default Extension=\"png\" ContentType=\"image/png\"/></Types>',\n );\n archive.file('[Content_Types].xml', contentTypes);\n }\n for (let index = 0; index < frames.length; index += 1) {\n throwIfAborted(signal);\n const frame = frames[index]!;\n const slideNumber = index + 1;\n archive.file(`ppt/media/rendered${slideNumber}.png`, frame.bytes);\n archive.file(\n `ppt/slides/slide${slideNumber}.xml`,\n renderedSlideXml(frame, semanticText[index] ?? '', hybrid, slideSize),\n );\n archive.file(\n `ppt/slides/_rels/slide${slideNumber}.xml.rels`,\n slideRelationshipsXml(slideNumber),\n );\n }\n return generatePptxArchive(archive, signal, serializationHooks.onPptxSerializationProgress);\n}\n\nexport async function packageRenderedPdf(\n frames: readonly CapturedPreview[],\n semanticText: readonly string[],\n markdownAttachment: string | null,\n baseName: string,\n signal?: AbortSignal,\n title?: string,\n serializationHooks: RenderedSerializationHooks = {},\n): Promise<Uint8Array> {\n const { PDFDocument, PDFWriter, StandardFonts } = await import('pdf-lib');\n const pdf = await PDFDocument.create();\n pdf.setTitle(title ?? baseName);\n pdf.setProducer('DocBlocks rendered-fidelity pipeline');\n const invisibleFont = markdownAttachment ? await pdf.embedFont(StandardFonts.Helvetica) : null;\n for (let index = 0; index < frames.length; index += 1) {\n throwIfAborted(signal);\n const frame = frames[index]!;\n const image = await pdf.embedPng(frame.bytes);\n const pageWidth = 720;\n const pageHeight = pageWidth * (frame.height / frame.width);\n const page = pdf.addPage([pageWidth, pageHeight]);\n page.drawImage(image, { x: 0, y: 0, width: pageWidth, height: pageHeight });\n if (invisibleFont) {\n page.drawText(asWinAnsiText(semanticText[index] ?? ''), {\n x: 1,\n y: 1,\n size: 1,\n font: invisibleFont,\n opacity: 0,\n lineHeight: 1,\n maxWidth: pageWidth - 2,\n });\n }\n }\n if (markdownAttachment !== null) {\n await pdf.attach(Buffer.from(markdownAttachment, 'utf8'), `${baseName}.md`, {\n mimeType: 'text/markdown',\n description: 'Editable semantic source for this rendered document',\n creationDate: new Date(),\n modificationDate: new Date(),\n });\n }\n throwIfAborted(signal);\n await pdf.flush();\n throwIfAborted(signal);\n\n let processedObjects = 0;\n class CancellablePdfWriter extends PDFWriter {\n public constructor() {\n super(pdf.context, 1);\n }\n\n protected override shouldWaitForTick = (count: number): boolean => {\n throwIfAborted(signal);\n processedObjects += count;\n serializationHooks.onPdfSerializationProgress?.(processedObjects);\n throwIfAborted(signal);\n return true;\n };\n }\n\n const bytes = await new CancellablePdfWriter().serializeToBuffer();\n throwIfAborted(signal);\n return bytes;\n}\n\nfunction generatePptxArchive(\n archive: JSZip,\n signal?: AbortSignal,\n onProgress?: (percent: number) => void,\n): Promise<Uint8Array> {\n throwIfAborted(signal);\n const stream = archive.generateInternalStream({ type: 'uint8array', compression: 'DEFLATE' });\n\n return new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n let byteLength = 0;\n let settled = false;\n\n const cleanup = (): void => signal?.removeEventListener('abort', handleAbort);\n const fail = (reason: unknown): void => {\n if (settled) return;\n settled = true;\n stream.pause();\n cleanup();\n reject(reason);\n };\n const handleAbort = (): void => {\n try {\n throwIfAborted(signal);\n } catch (caught: unknown) {\n fail(caught);\n }\n };\n\n signal?.addEventListener('abort', handleAbort, { once: true });\n if (signal?.aborted) {\n handleAbort();\n return;\n }\n\n stream\n .on('data', (chunk, metadata) => {\n if (settled) return;\n try {\n throwIfAborted(signal);\n onProgress?.(metadata.percent);\n throwIfAborted(signal);\n chunks.push(chunk);\n byteLength += chunk.byteLength;\n } catch (caught: unknown) {\n fail(caught);\n }\n })\n .on('error', (error) => fail(error))\n .on('end', () => {\n if (settled) return;\n try {\n throwIfAborted(signal);\n const bytes = new Uint8Array(byteLength);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n settled = true;\n cleanup();\n resolve(bytes);\n } catch (caught: unknown) {\n fail(caught);\n }\n })\n .resume();\n });\n}\n\nasync function semanticTextByFrame(\n prepared: PreparedDocument,\n frames: readonly CapturedPreview[],\n): Promise<string[]> {\n const { analyzeBlocks } = await import('@bendyline/squisq/transform');\n const analyzed = analyzeBlocks(prepared.doc.blocks);\n return frames.map((frame) => {\n const analyzedBlock = analyzed[frame.index];\n return `${frame.label ?? ''}\\n${analyzedBlock?.plainText ?? ''}`\n .trim()\n .slice(0, MAX_HYBRID_TEXT_CHARACTERS);\n });\n}\n\nfunction renderedSlideXml(\n frame: CapturedPreview,\n semanticText: string,\n hybrid: boolean,\n slideSize: { width: number; height: number },\n): string {\n const description = escapeXml(frame.label ?? `Rendered slide ${frame.index + 1}`);\n const placement = containedImagePlacement(frame, slideSize);\n const hiddenText = hybrid\n ? `<p:sp><p:nvSpPr><p:cNvPr id=\"3\" name=\"Semantic text\" hidden=\"1\"/><p:cNvSpPr/><p:nvPr/></p:nvSpPr>` +\n `<p:spPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"1\" cy=\"1\"/></a:xfrm><a:noFill/></p:spPr>` +\n `<p:txBody><a:bodyPr/><a:lstStyle/><a:p><a:r><a:rPr lang=\"en-US\" sz=\"100\"/>` +\n `<a:t>${escapeXml(semanticText)}</a:t></a:r><a:endParaRPr lang=\"en-US\"/></a:p></p:txBody></p:sp>`\n : '';\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<p:sld xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" ' +\n 'xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" ' +\n 'xmlns:p=\"http://schemas.openxmlformats.org/presentationml/2006/main\">' +\n '<p:cSld><p:spTree><p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr/>' +\n `<p:pic><p:nvPicPr><p:cNvPr id=\"2\" name=\"Rendered visual\" descr=\"${description}\"/>` +\n '<p:cNvPicPr><a:picLocks noChangeAspect=\"1\"/></p:cNvPicPr><p:nvPr/></p:nvPicPr>' +\n '<p:blipFill><a:blip r:embed=\"rId2\"/><a:stretch><a:fillRect/></a:stretch></p:blipFill>' +\n `<p:spPr><a:xfrm><a:off x=\"${placement.x}\" y=\"${placement.y}\"/><a:ext cx=\"${placement.width}\" cy=\"${placement.height}\"/></a:xfrm>` +\n '<a:prstGeom prst=\"rect\"><a:avLst/></a:prstGeom></p:spPr></p:pic>' +\n `${hiddenText}</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>`\n );\n}\n\nfunction renderedPptxSlideSize(frame: CapturedPreview): { width: number; height: number } {\n if (frame.width < 1 || frame.height < 1) {\n throw new Error('Rendered PPTX frame dimensions must be positive');\n }\n const aspect = frame.width / frame.height;\n return aspect >= 1\n ? {\n width: Math.round(PPTX_REFERENCE_SHORT_EDGE_EMU * aspect),\n height: PPTX_REFERENCE_SHORT_EDGE_EMU,\n }\n : {\n width: PPTX_REFERENCE_SHORT_EDGE_EMU,\n height: Math.round(PPTX_REFERENCE_SHORT_EDGE_EMU / aspect),\n };\n}\n\nfunction containedImagePlacement(\n frame: CapturedPreview,\n slideSize: { width: number; height: number },\n): { x: number; y: number; width: number; height: number } {\n const scale = Math.min(slideSize.width / frame.width, slideSize.height / frame.height);\n const width = Math.round(frame.width * scale);\n const height = Math.round(frame.height * scale);\n return {\n x: Math.round((slideSize.width - width) / 2),\n y: Math.round((slideSize.height - height) / 2),\n width,\n height,\n };\n}\n\nfunction slideRelationshipsXml(slideNumber: number): string {\n return (\n '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>' +\n '<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">' +\n '<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout\" Target=\"../slideLayouts/slideLayout1.xml\"/>' +\n `<Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\" Target=\"../media/rendered${slideNumber}.png\"/>` +\n '</Relationships>'\n );\n}\n\n/**\n * Characters that XML 1.0 forbids outright, per the `Char` production:\n *\n * Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n *\n * Unlike `&` or `<`, these cannot be rescued by escaping — a numeric entity\n * such as `` is *itself* invalid — so removal is the only conforming\n * option. Tab, newline, and CR are explicitly legal and are preserved, as are\n * accents, CJK, and astral characters (the `u` flag keeps well-formed\n * surrogate pairs intact while dropping lone surrogates, which cannot be\n * encoded as UTF-8 at all).\n *\n * This mirrors the PDF path's `asWinAnsiText` in spirit — sanitize to what the\n * container can actually represent before emitting — but stays far narrower:\n * WinAnsi cannot encode non-Latin-1 text, whereas XML can, so only genuinely\n * illegal characters are dropped rather than everything outside ASCII.\n */\n/* eslint-disable no-control-regex -- Matching control characters is this\n pattern's entire purpose; the rule exists to catch unintentional ones. */\nconst XML_INVALID_CHARACTERS =\n /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F\\uD800-\\uDFFF\\uFFFE\\uFFFF]/gu;\n/* eslint-enable no-control-regex */\n\n/**\n * Escape a value for XML text and attribute contexts.\n *\n * Control characters reach here from real documents: `frame.label` and the\n * hybrid path's `semanticText` both derive from authored markdown, and squisq's\n * parser preserves C0 controls in `plainText`. Emitting one raw produces a\n * slide part that strict XML parsers reject, which PowerPoint reports as\n * \"presentation needs repair\" — so strip them before escaping.\n */\nfunction escapeXml(value: string): string {\n return value\n .replace(XML_INVALID_CHARACTERS, '')\n .replace(/&/gu, '&')\n .replace(/</gu, '<')\n .replace(/>/gu, '>')\n .replace(/\"/gu, '"')\n .replace(/'/gu, ''');\n}\n\nfunction numericOption(\n options: Readonly<Record<string, string | number | boolean | null>>,\n name: string,\n fallback: number,\n): number {\n const value = options[name];\n return typeof value === 'number' ? value : fallback;\n}\n\nfunction asWinAnsiText(value: string): string {\n const sanitized = value.replace(/[^\\x20-\\x7e\\r\\n\\t]/gu, '?').slice(0, MAX_HYBRID_TEXT_CHARACTERS);\n return sanitized || ' ';\n}\n","import { createHash } from 'node:crypto';\nimport type {\n AppliedOption,\n ConversionFidelity,\n ConversionResult,\n EngineVersion,\n McpDiagnostic,\n} from '@bendyline/docblocks/mcp';\nimport { DOCBLOCKS_MCP_WIRE_VERSION } from '@bendyline/docblocks/mcp';\nimport {\n CapturedFrameBudgetError,\n MAX_CAPTURED_FRAME_BYTES,\n createCliRegistry,\n prepareConversion as prepareLinkedConversion,\n type CliConvertOptions,\n type PreparedConversion,\n} from '@bendyline/squisq-cli/api';\nimport { getDocPlaybackDuration } from '@bendyline/squisq/schemas';\nimport { getDependencyRuntimeVersion, getPackageVersion } from '../version.js';\nimport { ArtifactStore } from './artifact-store.js';\nimport type { PreparedDocument } from './document-service.js';\nimport { MCP_ARCHIVE_LIMITS, throwIfAborted, warningDiagnostic } from './document-service.js';\nimport { boundDiagnostics } from './intelligence.js';\nimport { convertRenderedDocument } from './rendered-conversion.js';\n\nexport interface ConversionTargetRequest {\n format: string;\n fidelity?: ConversionFidelity;\n options?: Readonly<Record<string, string | number | boolean | null>>;\n}\n\nexport interface ConversionRequestOptions {\n themeId?: string;\n transformId?: string;\n autoTemplates?: boolean;\n title?: string;\n targets: readonly ConversionTargetRequest[];\n}\n\n/** Fidelity contracts that the current conversion implementations can actually honor. */\nexport const MCP_FORMAT_FIDELITIES = {\n md: ['semantic'],\n docx: ['semantic', 'editable-native'],\n pdf: ['semantic', 'rendered-fidelity', 'hybrid'],\n pptx: ['semantic', 'editable-native', 'rendered-fidelity', 'hybrid'],\n xlsx: ['semantic', 'editable-native'],\n csv: ['semantic'],\n html: ['semantic'],\n htmlzip: ['semantic'],\n epub: ['semantic'],\n dbk: ['semantic', 'editable-native'],\n mp4: ['rendered-fidelity'],\n gif: ['rendered-fidelity'],\n} as const satisfies Record<string, readonly ConversionFidelity[]>;\n\nexport const MCP_MEDIA_RENDER_LIMITS = Object.freeze({\n mp4: Object.freeze({\n maximumFps: 60,\n maximumDimension: 3_840,\n maximumPixelsPerFrame: 8_294_400,\n maximumDurationSeconds: 300,\n maximumFrames: 18_000,\n maximumPixelFrames: 2_200_000_000,\n maximumCapturedFrameBytes: MAX_CAPTURED_FRAME_BYTES,\n }),\n gif: Object.freeze({\n maximumFps: 30,\n maximumDimension: 1_920,\n maximumPixelsPerFrame: 2_073_600,\n maximumDurationSeconds: 120,\n maximumFrames: 3_600,\n maximumPixelFrames: 600_000_000,\n maximumCapturedFrameBytes: MAX_CAPTURED_FRAME_BYTES,\n }),\n});\n\nconst COMPLETED_CONVERSION_CACHE_LIMIT = 64;\nconst completedConversionCaches = new WeakMap<ArtifactStore, CompletedConversionCache>();\nconst linkedRegistry = createCliRegistry();\n\nexport type ConversionProgress = (\n completed: number,\n total: number,\n message: string,\n) => Promise<void> | void;\n\n/** Injectable conversion boundaries used to test native staging without global module mocks. */\nexport interface ConversionServiceDependencies {\n readonly prepareNativeConversion: typeof prepareLinkedConversion;\n readonly convertRenderedDocument: typeof convertRenderedDocument;\n}\n\nconst DEFAULT_CONVERSION_SERVICE_DEPENDENCIES: ConversionServiceDependencies = Object.freeze({\n prepareNativeConversion: prepareLinkedConversion,\n convertRenderedDocument,\n});\n\n/** Linked registry metadata plus DocBlocks-only exposure policy. */\nexport const MCP_FORMAT_CAPABILITIES = Object.freeze(\n linkedRegistry.list().map((definition) =>\n Object.freeze({\n id: definition.id,\n label: definition.label,\n mimeType: definition.mimeType,\n extensions: Object.freeze([...definition.extensions]),\n import:\n definition.importContainer || definition.importDoc\n ? Object.freeze({ supported: true as const, tool: 'inspect_document' })\n : Object.freeze({\n supported: false as const,\n excludedReason: 'The linked registry is export-only.',\n }),\n export: definition.exportDoc\n ? Object.freeze({ supported: true as const, tool: 'convert_document' })\n : Object.freeze({\n supported: false as const,\n excludedReason: 'The linked registry is import-only.',\n }),\n }),\n ),\n);\n\n/** Convert one normalized document to multiple immutable artifacts. */\nexport async function convertPreparedDocument(\n artifacts: ArtifactStore,\n prepared: PreparedDocument,\n request: ConversionRequestOptions,\n signal?: AbortSignal,\n progress?: ConversionProgress,\n dependencies: ConversionServiceDependencies = DEFAULT_CONVERSION_SERVICE_DEPENDENCIES,\n): Promise<ConversionResult[]> {\n if (request.targets.length < 1 || request.targets.length > 12) {\n throw new Error('Conversion requires between 1 and 12 targets');\n }\n const duplicate = firstDuplicate(request.targets.map((target) => target.format));\n if (duplicate) throw new Error(`Duplicate conversion target: ${duplicate}`);\n await validateRequestVocabulary(prepared, request);\n const results: ConversionResult[] = [];\n const createdArtifactUris: string[] = [];\n const createdCacheKeys: string[] = [];\n const engineVersions = await conversionEngineVersions();\n let nativePrepared: PreparedConversion | undefined;\n const nativePrepareOptions: CliConvertOptions = {\n registry: linkedRegistry,\n themeId: request.themeId,\n transformStyle: request.transformId,\n autoTemplates: request.autoTemplates,\n title: request.title,\n signal,\n };\n let lastReportedProgress = 0;\n const reportProgress = (completed: number, message: string): Promise<void> | void => {\n const monotonic = Math.max(\n lastReportedProgress,\n Math.min(request.targets.length, Math.max(0, completed)),\n );\n lastReportedProgress = monotonic;\n return progress?.(monotonic, request.targets.length, message);\n };\n try {\n for (let index = 0; index < request.targets.length; index += 1) {\n throwIfAborted(signal);\n const target = request.targets[index]!;\n const definition = linkedRegistry.get(target.format);\n if (!definition) throw new Error(`Unknown conversion target \"${target.format}\"`);\n if (!definition.exportDoc) throw new Error(`Format \"${target.format}\" is not export-capable`);\n const fidelity = target.fidelity ?? defaultFidelity(target.format);\n assertSupportedFidelity(target.format, fidelity);\n assertMediaRenderBudget(prepared, target);\n const cacheKey = createConversionCacheKey(\n prepared,\n request,\n target,\n fidelity,\n engineVersions,\n );\n throwIfAborted(signal);\n const cached = await findCompletedConversion(artifacts, cacheKey);\n throwIfAborted(signal);\n if (cached) {\n await reportProgress(index, `Reusing cached ${target.format} artifact`);\n throwIfAborted(signal);\n results.push(cached);\n await reportProgress(index + 1, `Reused cached ${target.format} artifact`);\n throwIfAborted(signal);\n continue;\n }\n\n await reportProgress(index, `Converting to ${target.format}`);\n const formatOptions: Record<string, unknown> = {\n ...(target.options ?? {}),\n ...(target.format === 'dbk'\n ? { ...MCP_ARCHIVE_LIMITS, compression: 'STORE' as const }\n : {}),\n ...(request.themeId ? { themeId: request.themeId } : {}),\n onProgress: (phase: string, percent: number) => {\n throwIfAborted(signal);\n void reportProgress(\n index + Math.max(0, Math.min(100, percent)) / 100,\n `${target.format}: ${phase}`,\n );\n },\n };\n const converted = usesDocumentRasterizer(target.format, fidelity)\n ? await dependencies.convertRenderedDocument(\n prepared,\n target.format,\n fidelity,\n target.options ?? {},\n {\n themeId: request.themeId,\n transformId: request.transformId,\n autoTemplates: request.autoTemplates,\n title: request.title,\n },\n signal,\n (completed, total, message) =>\n reportProgress(\n index + (total > 0 ? completed / total : 0),\n `${target.format}: ${message}`,\n ),\n )\n : await (async () => {\n nativePrepared ??= await dependencies.prepareNativeConversion(\n {\n kind: 'markdown',\n markdown: prepared.markdownDoc,\n container: prepared.container,\n baseName: prepared.baseName,\n },\n nativePrepareOptions,\n );\n try {\n return await nativePrepared.convert(target.format, {\n signal,\n title: request.title,\n formatOptions: { [target.format]: formatOptions },\n });\n } catch (error: unknown) {\n const capturedFrameBudget = findCapturedFrameBudgetError(error);\n if (capturedFrameBudget && (target.format === 'mp4' || target.format === 'gif')) {\n throw new MediaRenderBudgetError(\n target.format,\n [\n `${capturedFrameBudget.capturedBytes + capturedFrameBudget.attemptedFrameBytes} ` +\n `captured PNG bytes`,\n ],\n MCP_MEDIA_RENDER_LIMITS[target.format],\n );\n }\n throw error;\n }\n })();\n throwIfAborted(signal);\n if (target.format === 'dbk') {\n const { zipToContainer } = await import('@bendyline/squisq-formats/container');\n await zipToContainer(converted.bytes, MCP_ARCHIVE_LIMITS);\n throwIfAborted(signal);\n }\n const appliedOptions = collectAppliedOptions(request, target);\n const artifact = await artifacts.put(\n {\n bytes: converted.bytes,\n format: target.format,\n mimeType: converted.mimeType,\n sourceFormat: prepared.sourceFormat,\n sourceSha256: prepared.sourceSha256,\n suggestedFilename: converted.suggestedFilename,\n appliedOptions,\n engineVersions,\n },\n signal,\n );\n createdArtifactUris.push(artifact.uri);\n const diagnostics: McpDiagnostic[] = boundDiagnostics(\n [\n ...prepared.diagnostics,\n ...converted.warnings.map((warning) =>\n warningDiagnostic(warning, 'convert', target.format),\n ),\n ],\n 'convert',\n );\n const result = freezeConversionResult({\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'conversion',\n sourceFormat: prepared.sourceFormat,\n targetFormat: target.format,\n artifact,\n fidelity,\n appliedThemeId: request.themeId ?? prepared.doc.themeId ?? null,\n appliedTransformId: request.transformId ?? null,\n sourceAssets: prepared.assets,\n sourceAssetCount: prepared.assets.length,\n diagnostics,\n });\n try {\n await artifacts.attachConversionReport(result);\n throwIfAborted(signal);\n } catch (caught: unknown) {\n await artifacts.discard(artifact.uri);\n throw caught;\n }\n completedConversionCache(artifacts).set(cacheKey, result);\n createdCacheKeys.push(cacheKey);\n results.push(result);\n await reportProgress(index + 1, `Created ${target.format} artifact`);\n }\n throwIfAborted(signal);\n return results;\n } catch (caught: unknown) {\n const cache = completedConversionCache(artifacts);\n for (const key of createdCacheKeys) cache.delete(key);\n await Promise.allSettled(createdArtifactUris.map((uri) => artifacts.discard(uri)));\n throw caught;\n }\n}\n\n/** Build the content-addressed cache key for one completed target conversion. */\nexport function createConversionCacheKey(\n prepared: Pick<\n PreparedDocument,\n 'sourceSha256' | 'sourceFormat' | 'baseName' | 'assets' | 'diagnostics'\n >,\n request: Omit<ConversionRequestOptions, 'targets'>,\n target: ConversionTargetRequest,\n fidelity: ConversionFidelity,\n engineVersions: readonly EngineVersion[],\n): string {\n const canonical = canonicalJson({\n source: {\n sha256: prepared.sourceSha256,\n format: prepared.sourceFormat,\n baseName: prepared.baseName,\n assets: prepared.assets,\n diagnostics: prepared.diagnostics,\n },\n engines: engineVersions,\n target: {\n format: target.format,\n fidelity,\n options: target.options ?? {},\n },\n request: {\n themeId: request.themeId ?? null,\n transformId: request.transformId ?? null,\n autoTemplates: request.autoTemplates ?? null,\n title: request.title ?? null,\n },\n });\n return createHash('sha256').update(canonical).digest('hex');\n}\n\nasync function findCompletedConversion(\n artifacts: ArtifactStore,\n key: string,\n): Promise<ConversionResult | null> {\n const cache = completedConversionCache(artifacts);\n const cached = cache.get(key);\n if (!cached) return null;\n try {\n const current = await artifacts.get(cached.artifact.uri);\n if (canonicalJson(current) !== canonicalJson(cached.artifact)) {\n cache.delete(key);\n return null;\n }\n return cached;\n } catch (caught: unknown) {\n if (caught instanceof Error && caught.message === 'Unknown or expired MCP artifact') {\n cache.delete(key);\n return null;\n }\n throw caught;\n }\n}\n\nfunction completedConversionCache(artifacts: ArtifactStore): CompletedConversionCache {\n let cache = completedConversionCaches.get(artifacts);\n if (!cache) {\n cache = new CompletedConversionCache(COMPLETED_CONVERSION_CACHE_LIMIT);\n completedConversionCaches.set(artifacts, cache);\n }\n return cache;\n}\n\nclass CompletedConversionCache {\n private readonly entries = new Map<string, ConversionResult>();\n\n public constructor(private readonly maximumEntries: number) {}\n\n public get(key: string): ConversionResult | null {\n const result = this.entries.get(key);\n if (!result) return null;\n this.entries.delete(key);\n this.entries.set(key, result);\n return result;\n }\n\n public set(key: string, result: ConversionResult): void {\n this.entries.delete(key);\n this.entries.set(key, result);\n while (this.entries.size > this.maximumEntries) {\n const oldest = this.entries.keys().next().value as string | undefined;\n if (oldest === undefined) return;\n this.entries.delete(oldest);\n }\n }\n\n public delete(key: string): void {\n this.entries.delete(key);\n }\n}\n\nasync function conversionEngineVersions(): Promise<EngineVersion[]> {\n const [cli, formats, squisq] = await Promise.all([\n getDependencyRuntimeVersion('@bendyline/squisq-cli', '@bendyline/squisq-cli/api'),\n getDependencyRuntimeVersion('@bendyline/squisq-formats'),\n getDependencyRuntimeVersion('@bendyline/squisq'),\n ]);\n return [\n { name: 'docblocks', version: getPackageVersion() },\n { name: '@bendyline/squisq-cli', version: cli },\n { name: '@bendyline/squisq-formats', version: formats },\n { name: '@bendyline/squisq', version: squisq },\n ];\n}\n\nfunction freezeConversionResult(result: ConversionResult): ConversionResult {\n return deepFreeze(result);\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (value === null || typeof value !== 'object' || Object.isFrozen(value)) return value;\n for (const nested of Object.values(value)) deepFreeze(nested);\n return Object.freeze(value);\n}\n\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map((entry) => canonicalJson(entry)).join(',')}]`;\n const entries = Object.entries(value as Record<string, unknown>).sort(([left], [right]) =>\n left.localeCompare(right),\n );\n return `{${entries\n .map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`)\n .join(',')}}`;\n}\n\nfunction defaultFidelity(format: string): ConversionFidelity {\n if (format === 'mp4' || format === 'gif') return 'rendered-fidelity';\n return format === 'docx' || format === 'pptx' ? 'editable-native' : 'semantic';\n}\n\nfunction usesDocumentRasterizer(format: string, fidelity: ConversionFidelity): boolean {\n return (\n (format === 'pdf' || format === 'pptx') &&\n (fidelity === 'rendered-fidelity' || fidelity === 'hybrid')\n );\n}\n\n/** Reject media renders before browser/frame capture can consume unbounded memory. */\nexport function assertMediaRenderBudget(\n prepared: Pick<PreparedDocument, 'doc'>,\n target: ConversionTargetRequest,\n): void {\n if (target.format !== 'mp4' && target.format !== 'gif') return;\n const format = target.format;\n const limits = MCP_MEDIA_RENDER_LIMITS[format];\n const options = target.options ?? {};\n const orientation = options.orientation === 'portrait' ? 'portrait' : 'landscape';\n const defaultWidth =\n format === 'mp4'\n ? orientation === 'portrait'\n ? 1_080\n : 1_920\n : orientation === 'portrait'\n ? 540\n : 960;\n const defaultHeight =\n format === 'mp4'\n ? orientation === 'portrait'\n ? 1_920\n : 1_080\n : orientation === 'portrait'\n ? 960\n : 540;\n const width = numericOption(options.width, defaultWidth);\n const height = numericOption(options.height, defaultHeight);\n const fps = numericOption(options.fps, format === 'mp4' ? 30 : 10);\n const coverPreRoll = numericOption(options.coverPreRoll, 0);\n const duration = getDocPlaybackDuration(prepared.doc) + coverPreRoll;\n const frames = Math.ceil(duration * fps);\n const pixelsPerFrame = width * height;\n const pixelFrames = pixelsPerFrame * frames;\n const violations: string[] = [];\n if (width > limits.maximumDimension || height > limits.maximumDimension) {\n violations.push(`dimensions ${width}x${height}`);\n }\n if (fps > limits.maximumFps) violations.push(`${fps} fps`);\n if (pixelsPerFrame > limits.maximumPixelsPerFrame) {\n violations.push(`${pixelsPerFrame} pixels per frame`);\n }\n if (!Number.isFinite(duration) || duration > limits.maximumDurationSeconds) {\n violations.push(`${duration} seconds`);\n }\n if (!Number.isSafeInteger(frames) || frames > limits.maximumFrames) {\n violations.push(`${frames} frames`);\n }\n if (!Number.isSafeInteger(pixelFrames) || pixelFrames > limits.maximumPixelFrames) {\n violations.push(`${pixelFrames} frame-pixels`);\n }\n if (violations.length > 0) throw new MediaRenderBudgetError(format, violations, limits);\n}\n\nfunction numericOption(\n value: string | number | boolean | null | undefined,\n fallback: number,\n): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction findCapturedFrameBudgetError(error: unknown): CapturedFrameBudgetError | undefined {\n const seen = new Set<object>();\n let current: unknown = error;\n for (let depth = 0; depth < 8; depth += 1) {\n if (current instanceof CapturedFrameBudgetError) return current;\n if (typeof current !== 'object' || current === null || seen.has(current)) return undefined;\n seen.add(current);\n current = 'cause' in current ? current.cause : undefined;\n }\n return undefined;\n}\n\nexport class MediaRenderBudgetError extends Error {\n public readonly code = 'media-budget-exceeded';\n public readonly retryable = false;\n public readonly hint: string;\n\n public constructor(\n public readonly format: 'mp4' | 'gif',\n violations: readonly string[],\n limits: (typeof MCP_MEDIA_RENDER_LIMITS)['mp4' | 'gif'],\n ) {\n super(\n `The ${format.toUpperCase()} render exceeds MCP media budgets: ${violations.join(', ')}.`,\n );\n this.name = 'MediaRenderBudgetError';\n this.hint =\n `Reduce duration, FPS, or dimensions. ${format.toUpperCase()} permits at most ` +\n `${limits.maximumDurationSeconds}s, ${limits.maximumFps} fps, ` +\n `${limits.maximumPixelsPerFrame} pixels/frame, ${limits.maximumPixelFrames} frame-pixels, ` +\n `and ${limits.maximumCapturedFrameBytes} retained captured-PNG bytes.`;\n }\n}\n\nexport function supportedFidelities(format: string): readonly ConversionFidelity[] {\n return MCP_FORMAT_FIDELITIES[format as keyof typeof MCP_FORMAT_FIDELITIES] ?? ([] as const);\n}\n\nexport function assertSupportedFidelity(format: string, fidelity: ConversionFidelity): void {\n const supported = supportedFidelities(format);\n if (supported.includes(fidelity)) return;\n throw new UnsupportedFidelityError(format, fidelity, supported);\n}\n\nexport class UnsupportedFidelityError extends Error {\n public readonly code = 'unsupported-fidelity';\n public readonly format: string;\n public readonly hint: string;\n\n public constructor(\n format: string,\n fidelity: ConversionFidelity,\n supported: readonly ConversionFidelity[],\n ) {\n const choices = supported.length > 0 ? supported.join(', ') : 'none';\n super(`Fidelity \"${fidelity}\" is not supported for target \"${format}\".`);\n this.name = 'UnsupportedFidelityError';\n this.format = format;\n this.hint = `Supported fidelities for ${format}: ${choices}.`;\n }\n}\n\nexport class UnknownTransformError extends Error {\n public readonly code = 'unknown-transform';\n public readonly hint = 'Choose a transform id reported by list_transform_styles.';\n\n public constructor(transformId: string) {\n super(`Unknown transform style \"${transformId}\".`);\n this.name = 'UnknownTransformError';\n }\n}\n\nexport class UnknownThemeError extends Error {\n public readonly code = 'unknown-theme';\n public readonly hint =\n 'Choose a built-in id from list_themes or a custom theme embedded in the document.';\n\n public constructor(themeId: string) {\n super(`Unknown theme \"${themeId}\".`);\n this.name = 'UnknownThemeError';\n }\n}\n\nasync function validateRequestVocabulary(\n prepared: PreparedDocument,\n request: ConversionRequestOptions,\n): Promise<void> {\n const checks: Promise<void>[] = [];\n const transformId = request.transformId;\n if (transformId) {\n checks.push(\n import('@bendyline/squisq/transform').then(({ getTransformStyleIds }) => {\n if (!getTransformStyleIds().includes(transformId)) {\n throw new UnknownTransformError(transformId);\n }\n }),\n );\n }\n const themeId = request.themeId;\n if (themeId) {\n checks.push(\n import('@bendyline/squisq/schemas').then(({ getAvailableThemes }) => {\n const custom = prepared.doc.customThemes?.some((theme) => theme.id === themeId);\n if (!custom && !getAvailableThemes().includes(themeId)) {\n throw new UnknownThemeError(themeId);\n }\n }),\n );\n }\n await Promise.all(checks);\n}\n\nfunction collectAppliedOptions(\n request: ConversionRequestOptions,\n target: ConversionTargetRequest,\n): AppliedOption[] {\n const values: Record<string, string | number | boolean | null | undefined> = {\n themeId: request.themeId,\n transformId: request.transformId,\n autoTemplates: request.autoTemplates,\n title: request.title,\n fidelity: target.fidelity ?? defaultFidelity(target.format),\n ...(target.options ?? {}),\n };\n return Object.entries(values)\n .filter((entry): entry is [string, string | number | boolean | null] => entry[1] !== undefined)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([name, value]) => ({ name, value }));\n}\n\nfunction firstDuplicate(values: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n return undefined;\n}\n","import {\n DOCBLOCKS_MCP_WIRE_VERSION,\n MCP_WIRE_LIMITS,\n parseMcpErrorResult,\n type DiagnosticStage,\n type McpErrorResult,\n} from '@bendyline/docblocks/mcp';\nimport { boundWireText } from './output-bounds.js';\n\n/** Produce one exact error envelope for every MCP tool generation. */\nexport function errorResult(\n caught: unknown,\n stage: DiagnosticStage | null = null,\n formatOverride: string | null = null,\n requestSignal?: AbortSignal,\n) {\n const error = normalizeError(caught, stage, formatOverride, requestSignal?.aborted === true);\n const payload = parseMcpErrorResult({\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'error',\n result: null,\n error,\n });\n if (!payload) throw new Error('DocBlocks generated an invalid MCP error envelope');\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(payload) }],\n structuredContent: payload as unknown as Record<string, unknown>,\n isError: true as const,\n };\n}\n\nexport function successResult<T extends object>(result: T) {\n return {\n version: DOCBLOCKS_MCP_WIRE_VERSION,\n kind: 'success' as const,\n result,\n error: null,\n };\n}\n\nfunction normalizeError(\n caught: unknown,\n stage: DiagnosticStage | null,\n formatOverride: string | null,\n cancelled: boolean,\n): McpErrorResult['error'] {\n const candidate =\n caught && typeof caught === 'object' ? (caught as Record<string, unknown>) : undefined;\n const message = boundedErrorText(caught instanceof Error ? caught.message : String(caught));\n const normalizedMessage = message.toLowerCase();\n const stableCode =\n typeof candidate?.code === 'string' &&\n /^[A-Za-z0-9][A-Za-z0-9._:-]{0,255}$/u.test(candidate.code)\n ? candidate.code\n : undefined;\n const code =\n (cancelled ? 'cancelled' : stableCode) ??\n (normalizedMessage.includes('busy')\n ? 'busy'\n : normalizedMessage.includes('timeout') || normalizedMessage.includes('runtime budget')\n ? 'timeout'\n : normalizedMessage.includes('cancel') || normalizedMessage.includes('abort')\n ? 'cancelled'\n : normalizedMessage.includes('outside') || normalizedMessage.includes('root')\n ? 'unauthorized-path'\n : normalizedMessage.includes('already exists') ||\n normalizedMessage.includes('precondition')\n ? 'conflict'\n : normalizedMessage.includes('format')\n ? 'unknown-format'\n : 'operation-failed');\n const candidateFormat = typeof candidate?.format === 'string' ? candidate.format : formatOverride;\n const active = candidate?.active;\n const capacity = candidate?.capacity;\n const operationLoad =\n Number.isSafeInteger(active) &&\n typeof active === 'number' &&\n active >= 0 &&\n active <= 32 &&\n Number.isSafeInteger(capacity) &&\n typeof capacity === 'number' &&\n capacity >= 1 &&\n capacity <= 32 &&\n active <= capacity\n ? { active, capacity }\n : null;\n return {\n code,\n message,\n stage,\n format:\n candidateFormat && /^[a-z0-9][a-z0-9.+_-]{0,63}$/u.test(candidateFormat)\n ? candidateFormat\n : null,\n hint: typeof candidate?.hint === 'string' ? boundedErrorText(candidate.hint) : null,\n retryable:\n typeof candidate?.retryable === 'boolean'\n ? candidate.retryable\n : code === 'busy' || code === 'cancelled' || code === 'timeout',\n operationLoad,\n };\n}\n\nfunction boundedErrorText(value: string): string {\n return boundWireText(value, MCP_WIRE_LIMITS.messageCharacters, 'MCP operation failed');\n}\n","interface ProgressExtra {\n readonly _meta?: { readonly progressToken?: string | number };\n sendNotification(notification: {\n method: 'notifications/progress';\n params: {\n progressToken: string | number;\n progress: number;\n total: number;\n message: string;\n };\n }): Promise<void>;\n}\n\ninterface ProgressState {\n lastPercent: number;\n lastMessage: string | null;\n tail: Promise<void>;\n}\n\nconst states = new WeakMap<object, ProgressState>();\n\n/** Serialize request progress and project every producer onto one monotonic 0..100 scale. */\nexport function reportMcpProgress(\n extra: ProgressExtra,\n progress: number,\n total: number,\n message: string,\n): Promise<void> {\n const progressToken = extra._meta?.progressToken;\n if (progressToken === undefined) return Promise.resolve();\n const safeTotal = Number.isFinite(total) && total > 0 ? total : 1;\n const safeProgress = Number.isFinite(progress) ? progress : 0;\n const percent = Math.max(0, Math.min(100, (safeProgress / safeTotal) * 100));\n let state = states.get(extra);\n if (!state) {\n state = { lastPercent: -1, lastMessage: null, tail: Promise.resolve() };\n states.set(extra, state);\n }\n const monotonic = Math.max(state.lastPercent, percent);\n if (monotonic === state.lastPercent && message === state.lastMessage) return state.tail;\n state.lastPercent = monotonic;\n state.lastMessage = message;\n state.tail = state.tail\n .then(() =>\n extra.sendNotification({\n method: 'notifications/progress',\n params: { progressToken, progress: monotonic, total: 100, message },\n }),\n )\n .catch(() => undefined);\n return state.tail;\n}\n","import { ResourceTemplate, type McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport {\n MCP_WIRE_LIMITS,\n parseComparisonResult,\n parseConversionResult,\n parseDocumentSource,\n parseInspectionResult,\n parseMaterializationOptions,\n parsePreviewResult,\n parseValidationResult,\n type ArtifactRef,\n type ConversionFidelity,\n type DocumentSource,\n} from '@bendyline/docblocks/mcp';\nimport { ArtifactStore } from './artifact-store.js';\nimport { McpFileAuthority } from './authority.js';\nimport {\n MCP_FORMAT_CAPABILITIES,\n MCP_FORMAT_FIDELITIES,\n convertPreparedDocument,\n type ConversionTargetRequest,\n} from './conversion-service.js';\nimport { DocumentService, throwIfAborted, warningDiagnostic } from './document-service.js';\nimport {\n comparePreparedDocuments,\n inspectPreparedDocument,\n validatePreparedDocument,\n} from './intelligence.js';\nimport {\n artifactUriSchema,\n bundleDocumentSourceSchema,\n DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS,\n documentSourceSchema,\n formatInputSchema,\n materializationOptionsSchema,\n} from '@bendyline/docblocks/mcp/zod';\nimport {\n previewPreparedDocument,\n previewVideoSource,\n type VideoThumbnailExtractor,\n} from './preview-service.js';\nimport { errorResult, successResult } from './error-result.js';\nimport { reportMcpProgress } from './progress.js';\nimport {\n MCP_OUTPUT_PATTERNS,\n boundNullableWireText,\n boundWireText,\n boundWireTextArray,\n boundWireWarnings,\n requireWireIdentifier,\n toWireIdentifier,\n} from './output-bounds.js';\n\nconst READ_ONLY = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n} as const;\nconst ARTIFACT_CREATING = {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false,\n} as const;\nconst MATERIALIZING = {\n readOnlyHint: false,\n destructiveHint: true,\n idempotentHint: false,\n openWorldHint: false,\n} as const;\n\nconst identifierSchema = z\n .string()\n .min(1)\n .max(MCP_WIRE_LIMITS.identifierCharacters)\n .regex(MCP_OUTPUT_PATTERNS.identifier);\n\nexport interface AgenticToolContext {\n authority: Promise<McpFileAuthority>;\n artifacts: ArtifactStore;\n extractVideoThumbnail?: VideoThumbnailExtractor;\n runOperation<T>(\n signal: AbortSignal,\n work: (operationSignal: AbortSignal) => Promise<T>,\n ): Promise<T>;\n}\n\nconst fidelitySchemas = {\n editable: z.enum(MCP_FORMAT_FIDELITIES.docx),\n pdf: z.enum(MCP_FORMAT_FIDELITIES.pdf),\n pptx: z.enum(MCP_FORMAT_FIDELITIES.pptx),\n} as const;\nconst metadataFields = {\n title: z.string().max(4_000).optional(),\n author: z.string().max(4_000).optional(),\n description: z.string().max(8_000).optional(),\n} as const;\nconst simpleTarget = (format: 'md' | 'dbk', fidelity: z.ZodType<ConversionFidelity>) =>\n z.object({ format: z.literal(format), fidelity: fidelity.optional() }).strict();\nconst conversionTargetSchema = z.discriminatedUnion('format', [\n simpleTarget('md', z.enum(MCP_FORMAT_FIDELITIES.md)),\n simpleTarget('dbk', z.enum(MCP_FORMAT_FIDELITIES.dbk)),\n z\n .object({\n format: z.literal('docx'),\n fidelity: fidelitySchemas.editable.optional(),\n ...metadataFields,\n defaultFont: z.string().max(256).optional(),\n defaultFontSize: z.number().min(6).max(96).optional(),\n })\n .strict(),\n z\n .object({\n format: z.literal('pdf'),\n fidelity: fidelitySchemas.pdf.optional(),\n title: metadataFields.title,\n author: metadataFields.author,\n pageSize: z.enum(['letter', 'a4']).optional(),\n margin: z.number().min(0).max(288).optional(),\n defaultFontSize: z.number().min(6).max(96).optional(),\n width: z.number().int().min(160).max(1_920).optional(),\n height: z.number().int().min(90).max(1_920).optional(),\n })\n .strict(),\n z\n .object({\n format: z.literal('pptx'),\n fidelity: fidelitySchemas.pptx.optional(),\n ...metadataFields,\n slideBreak: z.enum(['h1', 'h2', 'heading']).optional(),\n defaultFont: z.string().max(256).optional(),\n defaultFontSize: z.number().min(6).max(96).optional(),\n width: z.number().int().min(160).max(1_920).optional(),\n height: z.number().int().min(90).max(1_920).optional(),\n })\n .strict(),\n z\n .object({\n format: z.literal('xlsx'),\n fidelity: z.enum(MCP_FORMAT_FIDELITIES.xlsx).optional(),\n title: metadataFields.title,\n author: metadataFields.author,\n sheetNamePrefix: z.string().max(31).optional(),\n })\n .strict(),\n z\n .object({\n format: z.literal('csv'),\n fidelity: z.enum(MCP_FORMAT_FIDELITIES.csv).optional(),\n delimiter: z.string().min(1).max(4).optional(),\n tableIndex: z.number().int().nonnegative().max(10_000).optional(),\n })\n .strict(),\n z\n .object({\n format: z.literal('html'),\n fidelity: z.enum(MCP_FORMAT_FIDELITIES.html).optional(),\n mode: z.enum(['slideshow', 'static']).optional(),\n autoPlay: z.boolean().optional(),\n title: metadataFields.title,\n })\n .strict(),\n z\n .object({\n format: z.literal('htmlzip'),\n fidelity: z.enum(MCP_FORMAT_FIDELITIES.htmlzip).optional(),\n mode: z.enum(['slideshow', 'static']).optional(),\n autoPlay: z.boolean().optional(),\n title: metadataFields.title,\n })\n .strict(),\n z\n .object({\n format: z.literal('epub'),\n fidelity: z.enum(MCP_FORMAT_FIDELITIES.epub).optional(),\n ...metadataFields,\n language: z.string().max(64).optional(),\n publisher: z.string().max(4_000).optional(),\n })\n .strict(),\n z\n .object({\n format: z.literal('mp4'),\n fidelity: z.enum(MCP_FORMAT_FIDELITIES.mp4).optional(),\n fps: z.number().int().min(1).max(60).optional(),\n quality: z.enum(['draft', 'normal', 'high']).optional(),\n orientation: z.enum(['landscape', 'portrait']).optional(),\n width: z.number().int().min(16).max(3_840).optional(),\n height: z.number().int().min(16).max(3_840).optional(),\n captionStyle: z.enum(['standard', 'social']).optional(),\n coverPreRoll: z.number().min(0).max(60).optional(),\n animationsEnabled: z.boolean().optional(),\n })\n .strict(),\n z\n .object({\n format: z.literal('gif'),\n fidelity: z.enum(MCP_FORMAT_FIDELITIES.gif).optional(),\n fps: z.number().int().min(1).max(30).optional(),\n orientation: z.enum(['landscape', 'portrait']).optional(),\n width: z.number().int().min(16).max(1_920).optional(),\n height: z.number().int().min(16).max(1_920).optional(),\n captionStyle: z.enum(['standard', 'social']).optional(),\n coverPreRoll: z.number().min(0).max(60).optional(),\n animationsEnabled: z.boolean().optional(),\n loop: z.number().int().min(-1).max(65_535).optional(),\n maxColors: z.number().int().min(2).max(256).optional(),\n dither: z\n .enum(['none', 'bayer', 'heckbert', 'floyd_steinberg', 'sierra2', 'sierra2_4a'])\n .optional(),\n bayerScale: z.number().int().min(0).max(5).optional(),\n })\n .strict(),\n]);\n\n/** Exact target ids accepted by convert_document's runtime input schema. */\nexport const MCP_CONVERSION_TARGET_FORMATS = Object.freeze(\n conversionTargetSchema.options.map((schema) => schema.shape.format.value),\n);\n\nexport function registerAgenticTools(server: McpServer, context: AgenticToolContext): void {\n registerArtifactResource(server, context.artifacts);\n registerConversionReportResource(server, context.artifacts);\n registerAuthoringGuideResource(server);\n\n server.registerTool(\n 'list_roots',\n {\n description:\n 'List opaque root aliases granted when this DocBlocks MCP server started. Root aliases improve path usability but never expand authority.',\n inputSchema: z.object({}).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.list_roots,\n annotations: READ_ONLY,\n },\n async () => {\n try {\n const roots = (await context.authority).listRoots();\n return textAndStructured({ roots });\n } catch (caught: unknown) {\n return errorResult(caught, 'resolve');\n }\n },\n );\n\n server.registerTool(\n 'get_conversion_report',\n {\n description:\n 'Retrieve the original bounded diagnostics, applied options, fidelity, provenance, and source-asset manifest for a conversion-backed session artifact.',\n inputSchema: z.object({ artifactUri: artifactUriSchema }).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.get_conversion_report,\n annotations: READ_ONLY,\n },\n async ({ artifactUri }) => {\n try {\n const report = await context.artifacts.getConversionReport(artifactUri);\n requireWire(parseConversionResult(report), 'conversion report');\n return textAndStructured(report);\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect');\n }\n },\n );\n\n server.registerTool(\n 'convert_document',\n {\n description:\n 'Convert any linked-registry input into one or more immutable artifacts. Use save_artifact only when a durable filesystem file is required.',\n inputSchema: z\n .object({\n source: documentSourceSchema,\n targets: z.array(conversionTargetSchema).min(1).max(12),\n themeId: identifierSchema.optional(),\n transformId: identifierSchema.optional(),\n autoTemplates: z.boolean().optional(),\n title: z.string().max(4_000).optional(),\n })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.convert_document,\n annotations: ARTIFACT_CREATING,\n },\n async ({ source, targets, themeId, transformId, autoTemplates, title }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const canonical = requireDocumentSource(source);\n const documents = new DocumentService(await context.authority, context.artifacts);\n await sendProgress(extra, 0, targets.length + 1, 'Resolving document');\n const prepared = await documents.prepare(canonical, operationSignal);\n const results = await convertPreparedDocument(\n context.artifacts,\n prepared,\n {\n targets: targets.map(toConversionTarget),\n themeId,\n transformId,\n autoTemplates,\n title,\n },\n operationSignal,\n (completed, total, message) => sendProgress(extra, completed + 1, total + 1, message),\n );\n for (const result of results) requireWire(parseConversionResult(result), 'conversion');\n const payload = { results };\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(payload) },\n ...results.map((result) => artifactLink(result.artifact)),\n ],\n structuredContent: asStructuredContent(successResult(payload)),\n };\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'convert', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'create_document_bundle',\n {\n description:\n 'Package Markdown and authority-scoped assets into an immutable DBK artifact with asset metadata.',\n inputSchema: z.object({ source: bundleDocumentSourceSchema }).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.create_document_bundle,\n annotations: ARTIFACT_CREATING,\n },\n async ({ source }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const canonical = requireDocumentSource(source);\n const documents = new DocumentService(await context.authority, context.artifacts);\n const prepared = await documents.prepare(canonical, operationSignal);\n const [result] = await convertPreparedDocument(\n context.artifacts,\n prepared,\n { targets: [{ format: 'dbk', fidelity: 'semantic' }] },\n operationSignal,\n );\n if (!result) throw new Error('DBK conversion produced no artifact');\n requireWire(parseConversionResult(result), 'conversion');\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(result) },\n artifactLink(result.artifact),\n ],\n structuredContent: asStructuredContent(successResult(result)),\n };\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'convert', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'save_artifact',\n {\n description:\n 'Materialize an immutable artifact below a configured write root. Creation is no-replace; replacement requires the current SHA-256.',\n inputSchema: z\n .object({ artifactUri: artifactUriSchema, destination: materializationOptionsSchema })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.save_artifact,\n annotations: MATERIALIZING,\n },\n async ({ artifactUri, destination }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const canonical = requireWire(\n parseMaterializationOptions(destination),\n 'materialization options',\n );\n const [authority, artifact, bytes] = await Promise.all([\n context.authority,\n context.artifacts.get(artifactUri, operationSignal),\n context.artifacts.read(artifactUri, operationSignal),\n ]);\n throwIfAborted(operationSignal);\n const outputPath = await authority.authorizeRootWrite(canonical.rootId, canonical.path);\n await authority.materializeBytes(outputPath, bytes, bytes.byteLength, {\n ifExists: canonical.ifExists,\n expectedSha256: canonical.expectedSha256 ?? undefined,\n signal: operationSignal,\n });\n const payload = {\n artifact,\n destination: { rootId: canonical.rootId, path: canonical.path },\n sha256: artifact.sha256,\n };\n return textAndStructured(payload);\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'materialize', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'inspect_document',\n {\n description:\n 'Inspect any linked-registry document as bounded semantic structure, block provenance, assets, metadata, theme, and diagnostics.',\n inputSchema: z\n .object({\n source: documentSourceSchema,\n maxBlocks: z.number().int().min(1).max(2_000).optional(),\n cursor: z.string().max(256).nullable().optional(),\n })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.inspect_document,\n annotations: READ_ONLY,\n },\n async ({ source, maxBlocks, cursor }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n const prepared = await documents.prepare(requireDocumentSource(source), operationSignal);\n const result = await inspectPreparedDocument(\n documents,\n prepared,\n maxBlocks,\n cursor ?? null,\n operationSignal,\n );\n requireWire(parseInspectionResult(result), 'inspection');\n return textAndStructured(result);\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'validate_document',\n {\n description:\n 'Validate document structure, templates, annotations, assets, accessibility, and optional target-format fidelity before export.',\n inputSchema: z\n .object({\n source: documentSourceSchema,\n targetFormat: formatInputSchema.nullable().optional(),\n })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.validate_document,\n annotations: READ_ONLY,\n },\n async ({ source, targetFormat }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n const prepared = await documents.prepare(requireDocumentSource(source), operationSignal);\n const normalizedTargetFormat = targetFormat?.toLowerCase() ?? null;\n const result = await validatePreparedDocument(\n documents,\n prepared,\n normalizedTargetFormat,\n operationSignal,\n );\n requireWire(parseValidationResult(result), 'validation');\n return textAndStructured(result);\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'validate', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'compare_documents',\n {\n description:\n 'Compare two supported documents semantically and report text, structure, table, media, metadata, and theme retention.',\n inputSchema: z.object({ left: documentSourceSchema, right: documentSourceSchema }).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.compare_documents,\n annotations: READ_ONLY,\n },\n async ({ left, right }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n const [leftPrepared, rightPrepared] = await Promise.all([\n documents.prepare(requireDocumentSource(left), operationSignal),\n documents.prepare(requireDocumentSource(right), operationSignal),\n ]);\n const result = await comparePreparedDocuments(\n documents,\n leftPrepared,\n rightPrepared,\n operationSignal,\n );\n requireWire(parseComparisonResult(result), 'comparison');\n return textAndStructured(result);\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'compare', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'preview_document',\n {\n description:\n 'Render bounded visual previews as immutable image artifacts and report previewBasis. Markdown/DBK use source-render, imported document artifacts use reconstructed-import, and MP4/GIF sources use a native-extracted first-frame JPEG. Supports pagination and protocol progress/cancellation.',\n inputSchema: z\n .object({\n source: documentSourceSchema,\n startIndex: z.number().int().nonnegative().max(100_000).optional(),\n maxItems: z.number().int().min(1).max(20).optional(),\n width: z.number().int().min(160).max(1_920).optional(),\n height: z.number().int().min(90).max(1_920).optional(),\n })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.preview_document,\n annotations: ARTIFACT_CREATING,\n },\n async ({ source, startIndex, maxItems, width, height }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n await sendProgress(extra, 0, 1, 'Resolving document');\n const documentSource = requireDocumentSource(source);\n const request = { startIndex, maxItems, width, height };\n const reportProgress = (completed: number, total: number, message: string) =>\n sendProgress(extra, completed, total, message);\n const result = (await isRenderedMediaPreviewSource(documentSource, context.artifacts))\n ? await previewVideoSource(\n context.artifacts,\n await documents.readBinarySource(documentSource, operationSignal),\n request,\n operationSignal,\n reportProgress,\n context.extractVideoThumbnail,\n )\n : await previewPreparedDocument(\n context.artifacts,\n await documents.prepare(documentSource, operationSignal),\n request,\n operationSignal,\n reportProgress,\n );\n requireWire(parsePreviewResult(result), 'preview');\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(result) },\n ...result.items.map((item) => artifactLink(item.artifact)),\n ],\n structuredContent: asStructuredContent(successResult(result)),\n };\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'render', null, extra.signal);\n }\n },\n );\n\n registerTemplateTools(server, context);\n registerThemeTools(server, context);\n}\n\nfunction registerArtifactResource(server: McpServer, artifacts: ArtifactStore): void {\n const template = new ResourceTemplate('docblocks://artifacts/{id}', {\n list: undefined,\n complete: { id: (prefix) => artifacts.completeIds(prefix) },\n });\n server.registerResource(\n 'artifact',\n template,\n {\n description:\n 'Session-scoped immutable DocBlocks artifact. Large artifacts must be materialized with save_artifact.',\n },\n async (uri, variables, extra) => {\n const rawId = variables.id;\n const id = Array.isArray(rawId) ? rawId[0] : rawId;\n if (!id) throw new Error('Artifact resource id is required');\n const { ref, bytes } = await artifacts.readResource(id, extra.signal);\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: ref.mimeType,\n ...(ref.mimeType.startsWith('text/')\n ? { text: bytes.toString('utf8') }\n : { blob: bytes.toString('base64') }),\n },\n ],\n };\n },\n );\n}\n\nfunction registerConversionReportResource(server: McpServer, artifacts: ArtifactStore): void {\n const template = new ResourceTemplate('docblocks://reports/{id}', {\n list: undefined,\n complete: { id: (prefix) => artifacts.completeReportIds(prefix) },\n });\n server.registerResource(\n 'conversion-report',\n template,\n {\n description:\n 'Original machine-readable diagnostics and provenance for a conversion-backed session artifact.',\n mimeType: 'application/json',\n },\n async (uri, variables) => {\n const rawId = variables.id;\n const id = Array.isArray(rawId) ? rawId[0] : rawId;\n if (!id) throw new Error('Conversion report resource id is required');\n const report = await artifacts.getConversionReport(id);\n return {\n contents: [\n {\n uri: uri.toString(),\n mimeType: 'application/json',\n text: JSON.stringify(report, null, 2),\n },\n ],\n };\n },\n );\n}\n\nfunction registerAuthoringGuideResource(server: McpServer): void {\n server.registerResource(\n 'authoring-guide',\n 'docblocks://authoring-guide',\n {\n description:\n 'Compact linked-Squisq authoring vocabulary, artifact workflow, fidelity modes, templates, themes, and transform styles.',\n mimeType: 'application/json',\n },\n async () => {\n const [docModule, schemaModule, transformModule] = await Promise.all([\n import('@bendyline/squisq/doc'),\n import('@bendyline/squisq/schemas'),\n import('@bendyline/squisq/transform'),\n ]);\n const templates = docModule\n .getAvailableTemplates()\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((id) => ({\n id: requireWireIdentifier(id, 'template id'),\n label: boundWireText(\n docModule.TEMPLATE_METADATA[id]?.label ?? id,\n MCP_WIRE_LIMITS.labelCharacters,\n id,\n ),\n description: boundWireText(docModule.TEMPLATE_METADATA[id]?.description ?? ''),\n inputs: (docModule.TEMPLATE_INPUT_DESCRIPTORS[id] ?? [])\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((input) => ({\n key: requireWireIdentifier(input.key, 'template input key'),\n required: input.required ?? false,\n values: boundWireTextArray(\n input.values ?? [],\n MCP_WIRE_LIMITS.arrayEntries,\n MCP_WIRE_LIMITS.labelCharacters,\n ),\n hint: boundNullableWireText(input.valueHint, MCP_WIRE_LIMITS.labelCharacters),\n })),\n }));\n const guide = {\n version: 1,\n workflow: [\n 'list_roots and select an authority-scoped source',\n 'inspect_document and validate_document',\n 'convert_document to one or more immutable artifacts',\n 'preview_document and inspect previewBasis before treating images as source renders, reconstructed imports, or native extraction',\n 'save_artifact only when a durable file is required',\n ],\n markdownAnnotation: '{[templateId key=\"value\"]}',\n fidelity: {\n semantic: 'Prioritize meaning and portability.',\n 'editable-native': 'Produce editable native structures with target-specific diagnostics.',\n 'rendered-fidelity': 'Preserve Squisq pixels in rendered slide/page media.',\n hybrid:\n 'Preserve rendered visuals plus bounded machine-extractable semantic retention; current PPTX text is hidden and current PDF is not a tagged accessible PDF.',\n },\n fidelityByFormat: MCP_FORMAT_FIDELITIES,\n formats: boundedFormatCapabilities(),\n templates,\n themes: schemaModule\n .getThemeSummaries()\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((theme) => ({\n id: requireWireIdentifier(theme.id, 'theme id'),\n name: boundWireText(theme.name, MCP_WIRE_LIMITS.labelCharacters, theme.id),\n description: boundWireText(theme.description ?? ''),\n })),\n transformStyles: transformModule\n .getTransformStyleSummaries()\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((style) => ({\n id: requireWireIdentifier(style.id, 'transform style id'),\n name: boundWireText(style.name, MCP_WIRE_LIMITS.labelCharacters, style.id),\n description: boundWireText(style.description),\n })),\n };\n return {\n contents: [\n {\n uri: 'docblocks://authoring-guide',\n mimeType: 'application/json',\n text: JSON.stringify(guide, null, 2),\n },\n ],\n };\n },\n );\n}\n\nfunction registerTemplateTools(server: McpServer, context: AgenticToolContext): void {\n server.registerTool(\n 'list_templates',\n {\n description: 'List Squisq authoring templates agents can use in Markdown annotations.',\n inputSchema: z.object({}).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.list_templates,\n annotations: READ_ONLY,\n },\n async () => {\n try {\n const { getAvailableTemplates, TEMPLATE_METADATA } = await import('@bendyline/squisq/doc');\n const templates = getAvailableTemplates()\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((id) => ({\n id: requireWireIdentifier(id, 'template id'),\n label: boundWireText(\n TEMPLATE_METADATA[id]?.label ?? id,\n MCP_WIRE_LIMITS.labelCharacters,\n id,\n ),\n description: boundWireText(TEMPLATE_METADATA[id]?.description ?? ''),\n }));\n return textAndStructured({ templates });\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect');\n }\n },\n );\n\n server.registerTool(\n 'describe_template',\n {\n description: 'Describe one Squisq template and its exact Markdown annotation inputs.',\n inputSchema: z.object({ templateId: identifierSchema }).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.describe_template,\n annotations: READ_ONLY,\n },\n async ({ templateId }) => {\n try {\n const { getAvailableTemplates, TEMPLATE_INPUT_DESCRIPTORS, TEMPLATE_METADATA } =\n await import('@bendyline/squisq/doc');\n if (!getAvailableTemplates().includes(templateId)) {\n return errorResult(new Error(`Unknown template \"${templateId}\"`), 'validate');\n }\n const inputs = (TEMPLATE_INPUT_DESCRIPTORS[templateId] ?? [])\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((input) => ({\n key: requireWireIdentifier(input.key, 'template input key'),\n description: boundWireText(input.description),\n type: boundWireText(\n input.coerce ?? 'string',\n MCP_WIRE_LIMITS.labelCharacters,\n 'string',\n ),\n required: input.required ?? false,\n values: boundWireTextArray(\n input.values ?? [],\n MCP_WIRE_LIMITS.arrayEntries,\n MCP_WIRE_LIMITS.labelCharacters,\n ),\n valueHint: boundNullableWireText(input.valueHint, MCP_WIRE_LIMITS.labelCharacters),\n }));\n const metadata = TEMPLATE_METADATA[templateId];\n const template = {\n id: requireWireIdentifier(templateId, 'template id'),\n label: boundWireText(\n metadata?.label ?? templateId,\n MCP_WIRE_LIMITS.labelCharacters,\n templateId,\n ),\n description: boundWireText(metadata?.description ?? ''),\n inputs,\n };\n const required = inputs\n .filter((input) => input.required)\n .map((input) => `${input.key}=\"…\"`)\n .join(' ');\n return textAndStructured({\n template,\n annotationExample: boundWireText(`{[${templateId}${required ? ` ${required}` : ''}]}`),\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect');\n }\n },\n );\n\n server.registerTool(\n 'recommend_templates',\n {\n description:\n 'Profile each bounded document block with the linked Squisq recommender and return content-compatible template candidates.',\n inputSchema: z\n .object({\n source: documentSourceSchema,\n candidateTemplateIds: z.array(identifierSchema).max(256).optional(),\n maxBlocks: z.number().int().min(1).max(100).optional(),\n })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.recommend_templates,\n annotations: READ_ONLY,\n },\n async ({ source, candidateTemplateIds, maxBlocks }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n const prepared = await documents.prepare(requireDocumentSource(source), operationSignal);\n const [{ flattenBlocks, getAvailableTemplates }, recommendModule] = await Promise.all([\n import('@bendyline/squisq/doc'),\n import('@bendyline/squisq/recommend'),\n ]);\n const available = getAvailableTemplates();\n const candidates = candidateTemplateIds ?? available;\n const unknown = candidates.find((id) => !available.includes(id));\n if (unknown) throw new Error(`Unknown template \"${unknown}\"`);\n const blocks = flattenBlocks(prepared.doc.blocks);\n const limit = maxBlocks ?? 50;\n const recommendations = blocks.slice(0, limit).map((block) => {\n const profile = recommendModule.profileBlockContents(block.contents ?? []);\n return {\n blockId: toWireIdentifier(block.id, 'block'),\n title: boundNullableWireText(block.title, MCP_WIRE_LIMITS.labelCharacters),\n profile: {\n ...profile,\n hasAsciiDiagram: profile.hasAsciiDiagram ?? false,\n hasTimeline: profile.hasTimeline ?? false,\n hasTree: profile.hasTree ?? false,\n },\n recommendedTemplateIds: recommendModule\n .recommendTemplatesForBlock(profile, candidates)\n .recommended.slice(0, 256)\n .map((id) => requireWireIdentifier(id, 'recommended template id')),\n };\n });\n return textAndStructured({\n recommendations,\n totalBlocks: blocks.length,\n truncated: recommendations.length < blocks.length,\n });\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect', null, extra.signal);\n }\n },\n );\n}\n\nfunction registerThemeTools(server: McpServer, context: AgenticToolContext): void {\n server.registerTool(\n 'describe_theme',\n {\n description:\n 'Describe one built-in or document-scoped custom Squisq theme before conversion.',\n inputSchema: z\n .object({\n themeId: identifierSchema,\n source: documentSourceSchema.optional(),\n })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.describe_theme,\n annotations: READ_ONLY,\n },\n async ({ themeId, source }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const [docModule, schemaModule] = await Promise.all([\n import('@bendyline/squisq/doc'),\n import('@bendyline/squisq/schemas'),\n ]);\n const prepared = source\n ? await new DocumentService(await context.authority, context.artifacts).prepare(\n requireDocumentSource(source),\n operationSignal,\n )\n : null;\n throwIfAborted(operationSignal);\n const documentTheme = prepared?.doc.customThemes?.find((theme) => theme.id === themeId);\n const builtIn = Object.prototype.hasOwnProperty.call(schemaModule.THEMES, themeId);\n if (!documentTheme && !builtIn) {\n return errorResult(new Error(`Unknown theme \"${themeId}\"`), 'validate');\n }\n const theme = docModule.resolveThemeForDoc(prepared?.doc, themeId);\n return textAndStructured({\n theme: summarizeTheme(theme),\n source: documentTheme ? ('document' as const) : ('built-in' as const),\n });\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'infer_theme_from_file',\n {\n description:\n 'Infer a reusable Squisq theme and optional custom layout summaries from a DOCX, PPTX, or XLSX file/artifact.',\n inputSchema: z\n .object({ source: documentSourceSchema, inferLayouts: z.boolean().optional() })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.infer_theme_from_file,\n annotations: READ_ONLY,\n },\n async ({ source, inferLayouts }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n const binary = await documents.readBinarySource(\n requireDocumentSource(source),\n operationSignal,\n );\n if (!['docx', 'pptx', 'xlsx'].includes(binary.format)) {\n throw new Error('Theme inference requires DOCX, PPTX, or XLSX input');\n }\n const { inferThemeFromFile } = await import('@bendyline/squisq-formats');\n const inferred = await inferThemeFromFile(ownedArrayBuffer(binary.bytes), {\n signal: operationSignal,\n format: binary.format as 'docx' | 'pptx' | 'xlsx',\n inferLayouts,\n nameHint: binary.filename,\n maxEntries: 2_048,\n maxEntryUncompressedBytes: 100 * 1024 * 1024,\n maxUncompressedBytes: 100 * 1024 * 1024,\n });\n throwIfAborted(operationSignal);\n const payload = {\n sourceFormat: binary.format,\n sourceSha256: binary.sha256,\n theme: summarizeTheme(inferred.theme),\n layouts: (inferred.layouts ?? []).slice(0, 1_000).map((layout, index) => ({\n id: boundWireText(\n layout.name,\n MCP_WIRE_LIMITS.labelCharacters,\n `layout-${index + 1}`,\n ),\n name: boundWireText(\n layout.label,\n MCP_WIRE_LIMITS.labelCharacters,\n `Layout ${index + 1}`,\n ),\n description: boundWireText(layout.description ?? ''),\n })),\n warnings: boundWireWarnings(inferred.warnings),\n };\n return textAndStructured(payload);\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'inspect_pptx_layouts',\n {\n description:\n 'Inspect PowerPoint slide masters/layouts and show built-in matches or inferred custom-template candidates.',\n inputSchema: z.object({ source: documentSourceSchema }).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.inspect_pptx_layouts,\n annotations: READ_ONLY,\n },\n async ({ source }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n const binary = await documents.readBinarySource(\n requireDocumentSource(source),\n operationSignal,\n );\n if (binary.format !== 'pptx')\n throw new Error('PPTX layout inspection requires PPTX input');\n const { inspectPptxLayouts } = await import('@bendyline/squisq-formats/pptx');\n const result = await inspectPptxLayouts(ownedArrayBuffer(binary.bytes), {\n signal: operationSignal,\n maxEntries: 2_048,\n maxEntryUncompressedBytes: 100 * 1024 * 1024,\n maxUncompressedBytes: 100 * 1024 * 1024,\n });\n throwIfAborted(operationSignal);\n return textAndStructured({\n slideSize: result.slideSize,\n layouts: result.layouts.slice(0, 2_048).map((layout, index) => ({\n layoutPath: boundWireText(\n layout.layoutPath,\n MCP_WIRE_LIMITS.pathCharacters,\n `ppt/slideLayouts/slideLayout${index + 1}.xml`,\n ),\n name: boundWireText(\n layout.name,\n MCP_WIRE_LIMITS.labelCharacters,\n `Layout ${index + 1}`,\n ),\n masterName: boundNullableWireText(layout.masterName, MCP_WIRE_LIMITS.labelCharacters),\n type: boundNullableWireText(layout.typeAttr, MCP_WIRE_LIMITS.labelCharacters),\n slideCount: layout.slideCount,\n verdict: layout.verdict,\n templateId: boundNullableWireText(\n layout.builtinTemplate ?? layout.customTemplate?.name,\n MCP_WIRE_LIMITS.labelCharacters,\n ),\n notes: boundWireTextArray(layout.notes ?? [], 1_000),\n })),\n });\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect', null, extra.signal);\n }\n },\n );\n\n server.registerTool(\n 'apply_inferred_theme',\n {\n description:\n 'Infer a theme from a DOCX, PPTX, or XLSX reference and embed it, optional custom layouts, and all source assets into a reusable DBK artifact.',\n inputSchema: z\n .object({\n source: documentSourceSchema,\n themeSource: documentSourceSchema,\n inferLayouts: z.boolean().optional(),\n })\n .strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.apply_inferred_theme,\n annotations: ARTIFACT_CREATING,\n },\n async ({ source, themeSource, inferLayouts }, extra) => {\n try {\n return await context.runOperation(extra.signal, async (operationSignal) => {\n const documents = new DocumentService(await context.authority, context.artifacts);\n const [prepared, binary] = await Promise.all([\n documents.prepare(requireDocumentSource(source), operationSignal),\n documents.readBinarySource(requireDocumentSource(themeSource), operationSignal),\n ]);\n throwIfAborted(operationSignal);\n if (!['docx', 'pptx', 'xlsx'].includes(binary.format)) {\n throw new Error('Theme application requires DOCX, PPTX, or XLSX theme input');\n }\n const { inferThemeFromFile } = await import('@bendyline/squisq-formats');\n const inferred = await inferThemeFromFile(ownedArrayBuffer(binary.bytes), {\n signal: operationSignal,\n format: binary.format as 'docx' | 'pptx' | 'xlsx',\n inferLayouts,\n nameHint: binary.filename,\n maxEntries: 2_048,\n maxEntryUncompressedBytes: 100 * 1024 * 1024,\n maxUncompressedBytes: 100 * 1024 * 1024,\n });\n throwIfAborted(operationSignal);\n const customThemes = [\n ...(prepared.doc.customThemes ?? []).filter((theme) => theme.id !== inferred.theme.id),\n inferred.theme,\n ];\n const inferredLayoutNames = new Set(\n (inferred.layouts ?? []).map((layout) => layout.name),\n );\n const customTemplates = [\n ...(prepared.doc.customTemplates ?? []).filter(\n (template) => !inferredLayoutNames.has(template.name),\n ),\n ...(inferred.layouts ?? []),\n ];\n const themedDoc = {\n ...prepared.doc,\n themeId: inferred.theme.id,\n customThemes,\n customTemplates,\n frontmatter: {\n ...(prepared.doc.frontmatter ?? {}),\n 'squisq-theme': inferred.theme.id,\n },\n };\n const [{ docToMarkdown }, { stringifyMarkdown }] = await Promise.all([\n import('@bendyline/squisq/doc'),\n import('@bendyline/squisq/markdown'),\n ]);\n const markdownDoc = docToMarkdown(themedDoc);\n const markdown = stringifyMarkdown(markdownDoc);\n const [result] = await convertPreparedDocument(\n context.artifacts,\n {\n ...prepared,\n doc: themedDoc,\n markdownDoc,\n markdown,\n diagnostics: [\n ...prepared.diagnostics,\n ...inferred.warnings.map((warning) =>\n warningDiagnostic(warning, 'transform', binary.format),\n ),\n ],\n },\n {\n themeId: inferred.theme.id,\n targets: [{ format: 'dbk', fidelity: 'semantic' }],\n },\n operationSignal,\n );\n if (!result) throw new Error('Themed DBK conversion produced no artifact');\n requireWire(parseConversionResult(result), 'conversion');\n const payload = {\n result,\n theme: summarizeTheme(inferred.theme),\n layoutIds: (inferred.layouts ?? [])\n .slice(0, 1_000)\n .map((layout) => boundWireText(layout.name, MCP_WIRE_LIMITS.labelCharacters)),\n warnings: boundWireWarnings(inferred.warnings),\n };\n return {\n content: [\n { type: 'text' as const, text: JSON.stringify(payload) },\n artifactLink(result.artifact),\n ],\n structuredContent: asStructuredContent(successResult(payload)),\n };\n });\n } catch (caught: unknown) {\n return errorResult(caught, 'transform', null, extra.signal);\n }\n },\n );\n}\n\nfunction requireDocumentSource(value: unknown): DocumentSource {\n return requireWire(parseDocumentSource(value), 'document source');\n}\n\nasync function isRenderedMediaPreviewSource(\n source: DocumentSource,\n artifacts: ArtifactStore,\n): Promise<boolean> {\n if (source.kind === 'file') {\n const format = source.format?.toLowerCase().replace(/^\\./u, '');\n return format && format !== 'auto'\n ? format === 'mp4' || format === 'gif'\n : /\\.(?:mp4|gif)$/iu.test(source.path);\n }\n if (source.kind !== 'artifact') return false;\n const artifact = await artifacts.get(source.uri);\n const format = artifact.format.toLowerCase().replace(/^\\./u, '');\n return format === 'mp4' || format === 'gif';\n}\n\nfunction requireWire<T>(value: T | null, label: string): T {\n if (value === null) throw new Error(`Invalid canonical MCP ${label}`);\n return value;\n}\n\nfunction toConversionTarget(\n value: z.infer<typeof conversionTargetSchema>,\n): ConversionTargetRequest {\n const { format, fidelity, ...options } = value;\n return {\n format,\n fidelity,\n options: Object.fromEntries(\n Object.entries(options).filter((entry) => entry[1] !== undefined),\n ) as Record<string, string | number | boolean | null>,\n };\n}\n\nfunction artifactLink(artifact: ArtifactRef) {\n return {\n type: 'resource_link' as const,\n uri: artifact.uri,\n name: artifact.suggestedFilename,\n description: `${artifact.format} artifact (${artifact.sha256})`,\n mimeType: artifact.mimeType,\n size: artifact.size,\n };\n}\n\nasync function sendProgress(\n extra: {\n _meta?: { progressToken?: string | number };\n sendNotification(notification: {\n method: 'notifications/progress';\n params: { progressToken: string | number; progress: number; total: number; message: string };\n }): Promise<void>;\n },\n progress: number,\n total: number,\n message: string,\n): Promise<void> {\n await reportMcpProgress(extra, progress, total, message);\n}\n\nfunction textAndStructured<T extends object>(payload: T) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(payload, null, 2) }],\n structuredContent: asStructuredContent(successResult(payload)),\n };\n}\n\nfunction asStructuredContent(payload: object): Record<string, unknown> {\n return payload as unknown as Record<string, unknown>;\n}\n\nfunction ownedArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n}\n\nfunction summarizeTheme(theme: {\n id: string;\n name: string;\n description?: string;\n colors: {\n primary: string;\n secondary: string;\n background: string;\n text: string;\n highlight: string;\n };\n typography: { bodyFont: unknown; titleFont: unknown };\n}) {\n const id = requireWireIdentifier(theme.id, 'theme id');\n return {\n id,\n name: boundWireText(theme.name, MCP_WIRE_LIMITS.labelCharacters, id),\n description: boundWireText(theme.description ?? ''),\n colors: {\n primary: boundWireText(theme.colors.primary, MCP_WIRE_LIMITS.labelCharacters, '#000000'),\n secondary: boundWireText(theme.colors.secondary, MCP_WIRE_LIMITS.labelCharacters, '#000000'),\n background: boundWireText(\n theme.colors.background,\n MCP_WIRE_LIMITS.labelCharacters,\n '#ffffff',\n ),\n text: boundWireText(theme.colors.text, MCP_WIRE_LIMITS.labelCharacters, '#000000'),\n highlight: boundWireText(theme.colors.highlight, MCP_WIRE_LIMITS.labelCharacters, '#000000'),\n },\n bodyFont: boundWireText(JSON.stringify(theme.typography.bodyFont) ?? ''),\n titleFont: boundWireText(JSON.stringify(theme.typography.titleFont) ?? ''),\n };\n}\n\nfunction boundedFormatCapabilities() {\n return MCP_FORMAT_CAPABILITIES.slice(0, 64).map((format) => {\n const id = requireWireIdentifier(format.id, 'format id');\n if (id.length > MCP_WIRE_LIMITS.formatCharacters || !MCP_OUTPUT_PATTERNS.format.test(id)) {\n throw new Error('Linked Squisq returned an invalid MCP format id');\n }\n return {\n id,\n label: boundWireText(format.label, MCP_WIRE_LIMITS.labelCharacters, id),\n mimeType: format.mimeType,\n extensions: boundWireTextArray(format.extensions, 64, MCP_WIRE_LIMITS.labelCharacters),\n import: { ...format.import },\n export: { ...format.export },\n };\n });\n}\n\nexport { MCP_FORMAT_CAPABILITIES };\n","import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { MCP_WIRE_LIMITS } from '@bendyline/docblocks/mcp';\nimport { MCP_FORMAT_CAPABILITIES } from './conversion-service.js';\nimport { errorResult, successResult } from './error-result.js';\nimport { DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS } from '@bendyline/docblocks/mcp/zod';\nimport {\n MCP_OUTPUT_PATTERNS,\n boundWireText,\n boundWireTextArray,\n requireWireIdentifier,\n} from './output-bounds.js';\n\nconst READ_ONLY = {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n} as const;\n\n/** Register the canonical linked-registry discovery surface (no format-specific aliases). */\nexport function registerDiscoveryTools(server: McpServer): void {\n server.registerTool(\n 'list_formats',\n {\n description:\n 'List every format in the linked Squisq registry and whether DocBlocks can import it through document tools or export it through convert_document.',\n inputSchema: z.object({}).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.list_formats,\n annotations: READ_ONLY,\n },\n async () => {\n try {\n const result = { formats: serializableCapabilities() };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: successResult(result),\n };\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect');\n }\n },\n );\n\n server.registerTool(\n 'list_themes',\n {\n description: 'List the linked Squisq built-in visual themes.',\n inputSchema: z.object({}).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.list_themes,\n annotations: READ_ONLY,\n },\n async () => {\n try {\n const { getThemeSummaries } = await import('@bendyline/squisq/schemas');\n const result = {\n themes: getThemeSummaries()\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((theme) => ({\n id: requireWireIdentifier(theme.id, 'theme id'),\n name: boundWireText(theme.name, MCP_WIRE_LIMITS.labelCharacters, theme.id),\n description: boundWireText(theme.description ?? ''),\n })),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: successResult(result),\n };\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect');\n }\n },\n );\n\n server.registerTool(\n 'list_transform_styles',\n {\n description: 'List the linked Squisq transform styles accepted by convert_document.',\n inputSchema: z.object({}).strict(),\n outputSchema: DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS.list_transform_styles,\n annotations: READ_ONLY,\n },\n async () => {\n try {\n const { getTransformStyleSummaries } = await import('@bendyline/squisq/transform');\n const result = {\n styles: getTransformStyleSummaries()\n .slice(0, MCP_WIRE_LIMITS.arrayEntries)\n .map((style) => ({\n id: requireWireIdentifier(style.id, 'transform style id'),\n name: boundWireText(style.name, MCP_WIRE_LIMITS.labelCharacters, style.id),\n description: boundWireText(style.description),\n })),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: successResult(result),\n };\n } catch (caught: unknown) {\n return errorResult(caught, 'inspect');\n }\n },\n );\n\n server.registerResource(\n 'formats',\n 'docblocks://formats',\n {\n description: 'Import/export capabilities derived from the linked Squisq registry.',\n mimeType: 'application/json',\n },\n async () => ({\n contents: [\n {\n uri: 'docblocks://formats',\n mimeType: 'application/json',\n text: JSON.stringify({ formats: serializableCapabilities() }, null, 2),\n },\n ],\n }),\n );\n}\n\nfunction serializableCapabilities() {\n return MCP_FORMAT_CAPABILITIES.slice(0, 64).map((format) => ({\n id: requireWireFormat(format.id),\n label: boundWireText(format.label, MCP_WIRE_LIMITS.labelCharacters, format.id),\n mimeType: format.mimeType,\n extensions: boundWireTextArray(format.extensions, 64, MCP_WIRE_LIMITS.labelCharacters),\n import: { ...format.import },\n export: { ...format.export },\n }));\n}\n\nfunction requireWireFormat(value: string): string {\n requireWireIdentifier(value, 'format id');\n if (value.length > MCP_WIRE_LIMITS.formatCharacters || !MCP_OUTPUT_PATTERNS.format.test(value)) {\n throw new Error('Linked Squisq returned an invalid MCP format id');\n }\n return value;\n}\n","import { completable } from '@modelcontextprotocol/sdk/server/completable.js';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\n\nconst MAX_ID_CHARACTERS = 256;\nconst MAX_TOPIC_CHARACTERS = 10_000;\n\n/** Artifact-first authoring prompts whose named calls are all current MCP tools. */\nexport function registerAuthoringPrompts(server: McpServer): void {\n const style = completable(\n z.string().max(MAX_ID_CHARACTERS).optional().describe('Preferred transform style id.'),\n async (prefix) => {\n const { getTransformStyleIds } = await import('@bendyline/squisq/transform');\n return complete(getTransformStyleIds(), prefix);\n },\n );\n const theme = completable(\n z.string().max(MAX_ID_CHARACTERS).optional().describe('Preferred Squisq theme id.'),\n async (prefix) => {\n const { getAvailableThemes } = await import('@bendyline/squisq/schemas');\n return complete(getAvailableThemes(), prefix);\n },\n );\n const template = completable(\n z.string().max(MAX_ID_CHARACTERS).optional().describe('Preferred Squisq template id.'),\n async (prefix) => {\n const { getAvailableTemplates } = await import('@bendyline/squisq/doc');\n return complete(getAvailableTemplates(), prefix);\n },\n );\n\n const presentationArgs = z\n .object({\n topic: z.string().max(MAX_TOPIC_CHARACTERS).describe('Presentation topic or subject.'),\n style,\n theme,\n template,\n })\n .strict();\n const presentation = server.registerPrompt(\n 'create-presentation',\n {\n description: 'Create, validate, preview, and export an artifact-first presentation.',\n argsSchema: presentationArgs.shape,\n },\n async (args) => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: presentationPrompt(args.topic, args.style, args.theme, args.template),\n },\n },\n ],\n }),\n );\n presentation.argsSchema = presentationArgs;\n\n const videoArgs = z\n .object({\n topic: z.string().max(MAX_TOPIC_CHARACTERS).describe('Video topic or subject.'),\n orientation: z.enum(['landscape', 'portrait']).optional(),\n theme,\n template,\n })\n .strict();\n const video = server.registerPrompt(\n 'create-video',\n {\n description: 'Create, validate, preview, and export an artifact-first MP4 video.',\n argsSchema: videoArgs.shape,\n },\n async (args) => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: videoPrompt(args.topic, args.orientation, args.theme, args.template),\n },\n },\n ],\n }),\n );\n video.argsSchema = videoArgs;\n\n const documentArgs = z\n .object({\n topic: z.string().max(MAX_TOPIC_CHARACTERS).describe('Document topic or subject.'),\n format: z.enum(['docx', 'pdf']).optional(),\n theme,\n template,\n })\n .strict();\n const document = server.registerPrompt(\n 'create-document',\n {\n description: 'Create, validate, preview, and export an artifact-first document.',\n argsSchema: documentArgs.shape,\n },\n async (args) => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: documentPrompt(args.topic, args.format, args.theme, args.template),\n },\n },\n ],\n }),\n );\n document.argsSchema = documentArgs;\n}\n\nfunction presentationPrompt(\n topic: string,\n style: string | undefined,\n theme: string | undefined,\n template: string | undefined,\n): string {\n return `Create a presentation about: ${topic}\n\n1. Use list_formats, list_themes, list_transform_styles, and list_templates for current linked-Squisq capabilities.\n2. Author focused Markdown sections with accessible alt text. Prefer style \"${style ?? 'choose from list_transform_styles'}\", theme \"${theme ?? 'choose from list_themes'}\", and template \"${template ?? 'choose per block'}\".\n3. Call validate_document with targetFormat \"pptx\" and repair actionable diagnostics.\n4. Call convert_document with a pptx target. Choose editable-native for editable Office structures, rendered-fidelity for exact Squisq visuals, or hybrid for rendered visuals plus semantic retention.\n5. Call preview_document and inspect the bounded slide images.\n6. Use get_conversion_report for provenance and save_artifact only when a durable file is required.`;\n}\n\nfunction videoPrompt(\n topic: string,\n orientation: 'landscape' | 'portrait' | undefined,\n theme: string | undefined,\n template: string | undefined,\n): string {\n return `Create a video about: ${topic}\n\n1. Use list_formats, list_themes, list_transform_styles, and list_templates for current linked-Squisq capabilities.\n2. Author concise Markdown for a ${orientation ?? 'landscape'} animated sequence using theme \"${theme ?? 'choose from list_themes'}\" and template \"${template ?? 'choose per block'}\".\n3. Call validate_document with targetFormat \"mp4\" and repair actionable diagnostics.\n4. Call preview_document to review representative frames.\n5. Call convert_document with an mp4 target and orientation \"${orientation ?? 'landscape'}\"; monitor progress and honor cancellation.\n6. Use get_conversion_report for provenance and save_artifact only when a durable file is required.`;\n}\n\nfunction documentPrompt(\n topic: string,\n format: 'docx' | 'pdf' | undefined,\n theme: string | undefined,\n template: string | undefined,\n): string {\n const target = format ?? 'pdf';\n return `Create a professional document about: ${topic}\n\n1. Use list_formats, list_themes, list_transform_styles, and list_templates for current linked-Squisq capabilities.\n2. Author structured Markdown using theme \"${theme ?? 'choose from list_themes'}\" and template \"${template ?? 'choose per block'}\".\n3. Call validate_document with targetFormat \"${target}\" and repair actionable diagnostics.\n4. Call convert_document with a ${target} target to create an immutable artifact.\n5. Call preview_document and review the bounded page images.\n6. Use get_conversion_report for provenance and save_artifact only when a durable file is required.`;\n}\n\nfunction complete(values: readonly string[], prefix: string | undefined): string[] {\n const value = prefix ?? '';\n return values.filter((candidate) => candidate.startsWith(value)).slice(0, 100);\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';\nimport type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';\nimport { getPackageVersion } from '../version.js';\nimport {\n registerAgenticTools,\n MCP_CONVERSION_TARGET_FORMATS,\n MCP_FORMAT_CAPABILITIES,\n} from './agentic-tools.js';\nimport { ArtifactStore, type ArtifactStoreOptions } from './artifact-store.js';\nimport { McpFileAuthority, type McpFileAuthorityOptions } from './authority.js';\nimport { registerDiscoveryTools } from './discovery-tools.js';\nimport { registerAuthoringPrompts } from './prompts.js';\n\nconst DEFAULT_MAX_CONCURRENT_OPERATIONS = 2;\nconst DEFAULT_OPERATION_TIMEOUT_MS = 2 * 60 * 1_000;\nconst DEFAULT_SHUTDOWN_DRAIN_TIMEOUT_MS = 5_000;\n\nexport interface McpServerOptions extends McpFileAuthorityOptions, ArtifactStoreOptions {\n maxConcurrentOperations?: number;\n operationTimeoutMs?: number;\n /** Bound cleanup latency after shutdown has aborted every active operation. */\n shutdownDrainTimeoutMs?: number;\n}\n\n/** Bounds expensive work while preserving the exact caller cancellation reason. */\nexport class OperationGuard {\n private active = 0;\n private accepting = true;\n private readonly controllers = new Set<AbortController>();\n private readonly completions = new Set<Promise<unknown>>();\n private shutdownPromise: Promise<void> | null = null;\n\n public constructor(\n private readonly maximum: number,\n private readonly timeoutMs: number,\n private readonly shutdownDrainTimeoutMs = DEFAULT_SHUTDOWN_DRAIN_TIMEOUT_MS,\n ) {\n if (!Number.isSafeInteger(maximum) || maximum < 1 || maximum > 32) {\n throw new Error('Invalid MCP operation concurrency limit');\n }\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 10 || timeoutMs > 30 * 60 * 1_000) {\n throw new Error('Invalid MCP operation timeout');\n }\n if (\n !Number.isSafeInteger(shutdownDrainTimeoutMs) ||\n shutdownDrainTimeoutMs < 10 ||\n shutdownDrainTimeoutMs > 60_000\n ) {\n throw new Error('Invalid MCP shutdown drain timeout');\n }\n }\n\n public async run<T>(\n requestSignal: AbortSignal,\n work: (operationSignal: AbortSignal) => Promise<T>,\n ): Promise<T> {\n requestSignal.throwIfAborted();\n if (!this.accepting) throw new OperationClosingError();\n if (this.active >= this.maximum) {\n throw new OperationBusyError(this.active, this.maximum);\n }\n this.active += 1;\n const controller = new AbortController();\n this.controllers.add(controller);\n const forwardCancellation = (): void => controller.abort(requestSignal.reason);\n if (requestSignal.aborted) forwardCancellation();\n else requestSignal.addEventListener('abort', forwardCancellation, { once: true });\n const timer = setTimeout(\n () => controller.abort(new OperationTimeoutError(this.timeoutMs)),\n this.timeoutMs,\n );\n let rejectAborted: () => void = () => undefined;\n const aborted = new Promise<never>((_resolve, reject) => {\n rejectAborted = (): void =>\n reject(controller.signal.reason ?? new Error('MCP operation was cancelled'));\n if (controller.signal.aborted) rejectAborted();\n else controller.signal.addEventListener('abort', rejectAborted, { once: true });\n });\n const completion: Promise<T> = Promise.resolve()\n .then(() => work(controller.signal))\n .finally(() => {\n clearTimeout(timer);\n requestSignal.removeEventListener('abort', forwardCancellation);\n controller.signal.removeEventListener('abort', rejectAborted);\n this.controllers.delete(controller);\n this.completions.delete(completion);\n this.active -= 1;\n });\n this.completions.add(completion);\n\n try {\n return await Promise.race([completion, aborted]);\n } catch (caught: unknown) {\n if (controller.signal.aborted) {\n // Give abort-aware work a turn to release resources. Work that ignores\n // cancellation still occupies its slot without delaying the response.\n await Promise.race([\n completion.then(\n () => undefined,\n () => undefined,\n ),\n new Promise<void>((resolve) => setTimeout(resolve, 0)),\n ]);\n throw controller.signal.reason ?? caught;\n }\n throw caught;\n }\n }\n\n /** Stop admission, abort active work, and wait for all operation cleanup before disposal. */\n public shutdown(): Promise<void> {\n if (this.shutdownPromise) return this.shutdownPromise;\n this.accepting = false;\n const attempt = this.drain();\n this.shutdownPromise = attempt.catch((caught: unknown) => {\n this.shutdownPromise = null;\n throw caught;\n });\n return this.shutdownPromise;\n }\n\n private async drain(): Promise<void> {\n const reason = new OperationShutdownError();\n for (const controller of this.controllers) {\n if (!controller.signal.aborted) controller.abort(reason);\n }\n if (this.completions.size === 0) return;\n\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(\n () => reject(new OperationDrainTimeoutError(this.shutdownDrainTimeoutMs)),\n this.shutdownDrainTimeoutMs,\n );\n });\n try {\n await Promise.race([\n Promise.allSettled([...this.completions]).then(() => undefined),\n timeout,\n ]);\n } finally {\n if (timer) clearTimeout(timer);\n }\n }\n}\n\nexport class OperationTimeoutError extends Error {\n public readonly code = 'timeout';\n public readonly hint: string;\n\n public constructor(timeoutMs: number) {\n super(`MCP operation exceeded its ${timeoutMs} ms runtime budget`);\n this.name = 'OperationTimeoutError';\n this.hint = 'Retry with fewer targets/items or increase the server operation timeout.';\n }\n}\n\nexport class OperationBusyError extends Error {\n public readonly code = 'busy';\n public readonly hint: string;\n public readonly retryable = true;\n\n public constructor(\n public readonly active: number,\n public readonly capacity: number,\n ) {\n super(\n `MCP server is busy; retry later (${active} of ${capacity} expensive-operation slots are active)`,\n );\n this.name = 'OperationBusyError';\n this.hint =\n 'Retry after one active operation completes; reducing target or preview count may help.';\n }\n}\n\nexport class OperationClosingError extends Error {\n public readonly code = 'server-closing';\n public readonly hint = 'Reconnect to a running DocBlocks MCP server before retrying.';\n public readonly retryable = true;\n\n public constructor() {\n super('MCP server is closing and is not accepting new operations');\n this.name = 'OperationClosingError';\n }\n}\n\nexport class OperationShutdownError extends Error {\n public readonly code = 'server-shutdown';\n public readonly hint = 'Reconnect to a running DocBlocks MCP server before retrying.';\n public readonly retryable = true;\n\n public constructor() {\n super('MCP operation was cancelled because the server is shutting down');\n this.name = 'OperationShutdownError';\n }\n}\n\nexport class OperationDrainTimeoutError extends Error {\n public readonly code = 'shutdown-drain-timeout';\n public readonly hint = 'Wait for active converter cleanup, then close the server again.';\n public readonly retryable = true;\n\n public constructor(timeoutMs: number) {\n super(`MCP operations did not finish cleanup within ${timeoutMs} ms`);\n this.name = 'OperationDrainTimeoutError';\n }\n}\n\n/** Retains every independent failure encountered while closing the server. */\nexport class McpServerShutdownError extends Error {\n public readonly errors: readonly unknown[];\n public readonly cause: unknown;\n\n public constructor(errors: readonly unknown[]) {\n super(`MCP server shutdown encountered ${errors.length} failures`);\n this.name = 'McpServerShutdownError';\n this.errors = Object.freeze([...errors]);\n this.cause = this.errors[0];\n }\n}\n\nexport type McpToolRequestExtra = RequestHandlerExtra<ServerRequest, ServerNotification>;\n\nexport function createMcpServer(options: McpServerOptions = {}): McpServer {\n const authority = McpFileAuthority.create(options);\n // `createMcpServer` remains synchronous for SDK ergonomics, but root\n // resolution is asynchronous. Attach a handler immediately so an invalid\n // startup grant cannot become an unhandled rejection before connect(), then\n // make transport admission wait for every startup prerequisite.\n void authority.catch(() => undefined);\n const operations = new OperationGuard(\n options.maxConcurrentOperations ?? DEFAULT_MAX_CONCURRENT_OPERATIONS,\n options.operationTimeoutMs ?? DEFAULT_OPERATION_TIMEOUT_MS,\n options.shutdownDrainTimeoutMs ?? DEFAULT_SHUTDOWN_DRAIN_TIMEOUT_MS,\n );\n const artifacts = new ArtifactStore(options);\n const server = new McpServer({ name: 'docblocks', version: getPackageVersion() });\n\n registerAgenticTools(server, {\n authority,\n artifacts,\n runOperation: (signal, work) => operations.run(signal, work),\n });\n registerDiscoveryTools(server);\n registerAuthoringPrompts(server);\n\n const connectServer = server.connect.bind(server);\n server.connect = async (transport) => {\n await Promise.all([authority, artifacts.ready()]);\n await connectServer(transport);\n };\n const closeServer = server.close.bind(server);\n let closePromise: Promise<void> | null = null;\n const beginShutdown = (closeTransport: boolean): Promise<void> => {\n if (closePromise) return closePromise;\n closePromise = (async () => {\n const failures: unknown[] = [];\n try {\n await operations.shutdown();\n } catch (caught: unknown) {\n failures.push(caught);\n }\n if (closeTransport) {\n try {\n await closeServer();\n } catch (caught: unknown) {\n failures.push(caught);\n }\n }\n try {\n await artifacts.dispose();\n } catch (caught: unknown) {\n failures.push(caught);\n }\n throwShutdownFailures(failures);\n })().catch((caught: unknown) => {\n closePromise = null;\n throw caught;\n });\n return closePromise;\n };\n const previousOnClose = server.server.onclose;\n server.server.onclose = () => {\n previousOnClose?.();\n void beginShutdown(false).catch(() => undefined);\n };\n server.close = () => beginShutdown(true);\n return server;\n}\n\nfunction throwShutdownFailures(failures: readonly unknown[]): void {\n if (failures.length === 0) return;\n if (failures.length === 1) throw failures[0];\n throw new McpServerShutdownError(failures);\n}\n\nexport { MCP_CONVERSION_TARGET_FORMATS, MCP_FORMAT_CAPABILITIES };\n","import { Command } from 'commander';\nimport { buildCommand } from './commands/build.js';\nimport { serveCommand } from './commands/serve.js';\nimport { convertCommand } from './commands/convert.js';\nimport { videoCommand } from './commands/video.js';\nimport { mcpCommand } from './commands/mcp.js';\nimport { themesCommand } from './commands/themes.js';\nimport { transformsCommand } from './commands/transforms.js';\nimport { parseCommand } from './commands/parse.js';\nimport { getPackageVersion } from './version.js';\n\nconst program = new Command();\n\nprogram\n .name('docblocks')\n .description('Build, preview, convert, render, inspect, and automate documents')\n .version(getPackageVersion());\n\nprogram.addCommand(buildCommand);\nprogram.addCommand(serveCommand);\nprogram.addCommand(convertCommand);\nprogram.addCommand(videoCommand);\nprogram.addCommand(mcpCommand);\nprogram.addCommand(themesCommand);\nprogram.addCommand(transformsCommand);\nprogram.addCommand(parseCommand);\n\n// Every action handler is async, and Commander does not await them from\n// parse() — an action that rejects would surface as an unhandled rejection and\n// a raw stack trace. parseAsync() plus this catch gives every command the same\n// `Error: <message>` contract that build/parse already implement internally.\nprogram.parseAsync().catch((err: unknown) => {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exitCode = 1;\n});\n","import { Command } from 'commander';\nimport { mkdir, opendir, readFile, stat, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { renderMarkdownHtml } from '../render-html.js';\nimport { positiveLimit } from '../internal/limits.js';\nimport { isNodeErrorCode } from '../internal/node-error.js';\n\nexport interface BuildOptions {\n input: string;\n output: string;\n theme?: string;\n /** Programmatic traversal budget; CLI callers use the safe default. */\n maxEntries?: number;\n /** Programmatic directory-depth budget; CLI callers use the safe default. */\n maxDepth?: number;\n}\n\nexport interface BuildResult {\n inputDir: string;\n outputDir: string;\n builtFiles: string[];\n}\n\nconst DEFAULT_MAX_BUILD_ENTRIES = 100_000;\nconst DEFAULT_MAX_BUILD_DEPTH = 64;\n\nexport async function runBuild(opts: BuildOptions): Promise<BuildResult> {\n const inputDir = path.resolve(opts.input);\n const outputDir = path.resolve(opts.output);\n let inputStat;\n try {\n inputStat = await stat(inputDir);\n } catch (error: unknown) {\n if (!isNodeErrorCode(error, 'ENOENT')) throw error;\n throw new Error(`Input directory not found: ${inputDir}`);\n }\n if (!inputStat.isDirectory()) throw new Error(`Input is not a directory: ${inputDir}`);\n\n const markdownFiles = await listMarkdownFiles(inputDir, {\n maxEntries: positiveLimit(opts.maxEntries, DEFAULT_MAX_BUILD_ENTRIES, 'build entry'),\n maxDepth: positiveLimit(opts.maxDepth, DEFAULT_MAX_BUILD_DEPTH, 'build depth'),\n });\n if (markdownFiles.length === 0) {\n throw new Error(`No markdown files found in ${inputDir}.`);\n }\n\n await mkdir(outputDir, { recursive: true });\n const builtFiles: string[] = [];\n\n for (const sourcePath of markdownFiles) {\n const relativePath = path.relative(inputDir, sourcePath);\n const outputPath = path.join(outputDir, replaceMarkdownExtension(relativePath));\n const source = await readFile(sourcePath, 'utf-8');\n const html = await renderMarkdownHtml(source, {\n title: titleFromPath(relativePath),\n sourcePath,\n assetRoot: inputDir,\n themeId: opts.theme,\n mode: 'static',\n });\n\n await mkdir(path.dirname(outputPath), { recursive: true });\n await writeFile(outputPath, html, 'utf-8');\n builtFiles.push(outputPath);\n }\n\n return { inputDir, outputDir, builtFiles };\n}\n\nexport const buildCommand = new Command('build')\n .description('Build markdown files into HTML output')\n .option('-i, --input <dir>', 'input directory', '.')\n .option('-o, --output <dir>', 'output directory', 'dist')\n .option('-t, --theme <id>', 'Squisq theme ID to apply')\n .action(async (opts: BuildOptions) => {\n try {\n const result = await runBuild(opts);\n for (const outFile of result.builtFiles) {\n console.error(`Built: ${outFile}`);\n }\n console.error(`Done. ${result.builtFiles.length} file(s) built to ${result.outputDir}`);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exitCode = 1;\n }\n });\n\ninterface BuildTraversalLimits {\n readonly maxEntries: number;\n readonly maxDepth: number;\n}\n\nasync function listMarkdownFiles(root: string, limits: BuildTraversalLimits): Promise<string[]> {\n const files: string[] = [];\n const pending: Array<{ directory: string; depth: number }> = [{ directory: root, depth: 0 }];\n let entryCount = 0;\n\n while (pending.length > 0) {\n const current = pending.pop()!;\n const entries = await opendir(current.directory);\n for await (const entry of entries) {\n entryCount += 1;\n if (entryCount > limits.maxEntries) {\n throw new Error(`Build traversal exceeded ${limits.maxEntries} filesystem entries.`);\n }\n const absolutePath = path.join(current.directory, entry.name);\n if (entry.isDirectory()) {\n if (current.depth >= limits.maxDepth) {\n throw new Error(`Build traversal exceeded a depth of ${limits.maxDepth}.`);\n }\n pending.push({ directory: absolutePath, depth: current.depth + 1 });\n } else if (entry.isFile() && isMarkdownFile(entry.name)) {\n files.push(absolutePath);\n }\n }\n }\n\n return files.sort((a, b) => a.localeCompare(b));\n}\n\nfunction isMarkdownFile(fileName: string): boolean {\n return /\\.(md|markdown)$/i.test(fileName);\n}\n\nfunction replaceMarkdownExtension(filePath: string): string {\n return filePath.replace(/\\.(md|markdown)$/i, '.html');\n}\n\nfunction titleFromPath(filePath: string): string {\n const baseName = path.basename(filePath).replace(/\\.(md|markdown)$/i, '');\n return baseName || 'DocBlocks Document';\n}\n","import { realpath, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { markdownToDoc } from '@bendyline/squisq/doc';\nimport { parseMarkdown } from '@bendyline/squisq/markdown';\nimport { collectImagePaths, docToHtml } from '@bendyline/squisq-formats/html';\nimport { PLAYER_BUNDLE } from '@bendyline/squisq-react/standalone-source';\nimport { readContainedFile } from './contained-file.js';\nimport { isPathInside } from './internal/paths.js';\nimport { isNodeErrorCode } from './internal/node-error.js';\n\nexport interface ReferencedAssetPath {\n assetRoot: string;\n requestedPath: string;\n physicalPath: string;\n}\n\nexport interface RenderMarkdownHtmlOptions {\n title: string;\n sourcePath?: string;\n assetRoot?: string;\n themeId?: string;\n mode?: 'slideshow' | 'static';\n maxAssetBytes?: number;\n /** Optional surface policy applied after mandatory physical containment. */\n allowReferencedAsset?: (asset: ReferencedAssetPath) => boolean;\n /** Test/programmatic seam; the CLI reports dropped assets on stderr. */\n onWarning?: (message: string) => void;\n}\n\nconst MAX_REFERENCED_IMAGES = 100;\nconst DEFAULT_MAX_ASSET_BYTES = 50 * 1024 * 1024;\nconst MAX_SINGLE_ASSET_BYTES = 20 * 1024 * 1024;\n\nexport async function renderMarkdownHtml(\n markdown: string,\n options: RenderMarkdownHtmlOptions,\n): Promise<string> {\n const markdownDoc = parseMarkdown(markdown);\n const doc = markdownToDoc(markdownDoc);\n const images =\n options.sourcePath && options.assetRoot\n ? await readReferencedImages(\n doc,\n options.sourcePath,\n options.assetRoot,\n options.maxAssetBytes ?? DEFAULT_MAX_ASSET_BYTES,\n options.allowReferencedAsset,\n options.onWarning ?? ((message) => console.warn(message)),\n )\n : undefined;\n\n return docToHtml(doc, {\n playerScript: PLAYER_BUNDLE,\n images,\n title: options.title,\n mode: options.mode ?? 'static',\n themeId: options.themeId,\n });\n}\n\nasync function readReferencedImages(\n doc: ReturnType<typeof markdownToDoc>,\n sourcePath: string,\n assetRoot: string,\n maxAssetBytes: number,\n allowReferencedAsset: RenderMarkdownHtmlOptions['allowReferencedAsset'],\n warn: (message: string) => void,\n): Promise<Map<string, ArrayBuffer>> {\n const images = new Map<string, ArrayBuffer>();\n const root = await realpathIfPresent(path.resolve(assetRoot));\n const baseDir = await realpathIfPresent(path.dirname(path.resolve(sourcePath)));\n if (!root || !baseDir || !isPathInside(root, baseDir)) return images;\n let totalBytes = 0;\n\n // The budget stands; only its silence was the defect. Dropping images past\n // the cap produced valid-looking HTML with invisibly broken images.\n const referenced = [...collectImagePaths(doc)];\n const embeddable = referenced.slice(0, MAX_REFERENCED_IMAGES);\n const dropped = referenced.slice(MAX_REFERENCED_IMAGES);\n if (dropped.length > 0) {\n warn(\n `Skipped ${dropped.length} of ${referenced.length} referenced images: the render embeds at most ${MAX_REFERENCED_IMAGES}. Not embedded: ${describeList(dropped)}`,\n );\n }\n\n for (const imagePath of embeddable) {\n if (!isLocalRelativePath(imagePath)) continue;\n\n const normalizedPath = stripUrlSuffix(imagePath);\n const absolutePath = path.resolve(baseDir, normalizedPath);\n if (!isPathInside(root, absolutePath)) continue;\n\n try {\n const physicalPath = await realpath(absolutePath);\n if (!isPathInside(root, physicalPath)) continue;\n if (\n allowReferencedAsset &&\n !allowReferencedAsset({\n assetRoot: root,\n requestedPath: absolutePath,\n physicalPath,\n })\n ) {\n continue;\n }\n const info = await stat(physicalPath);\n if (!info.isFile()) {\n warn(`Skipped referenced image \"${imagePath}\": it is not a regular file.`);\n continue;\n }\n if (info.size > MAX_SINGLE_ASSET_BYTES) {\n warn(\n `Skipped referenced image \"${imagePath}\": ${info.size} bytes exceeds the ${MAX_SINGLE_ASSET_BYTES}-byte per-image embed limit.`,\n );\n continue;\n }\n if (totalBytes + info.size > maxAssetBytes) {\n warn(\n `Skipped referenced image \"${imagePath}\": embedding ${info.size} more bytes would exceed the ${maxAssetBytes}-byte total image budget (${totalBytes} bytes already embedded).`,\n );\n continue;\n }\n const data = await readContainedFile(root, physicalPath, MAX_SINGLE_ASSET_BYTES);\n totalBytes += data.byteLength;\n images.set(imagePath, toExactArrayBuffer(data));\n } catch (error: unknown) {\n // A missing referenced asset is rendered as a normal broken image. Other\n // failures must stay visible rather than silently producing incomplete HTML.\n if (isMissingPathError(error)) continue;\n const contextualError = new Error(`Failed to embed referenced image \"${imagePath}\".`);\n (contextualError as Error & { cause?: unknown }).cause = error;\n throw contextualError;\n }\n }\n\n return images;\n}\n\nasync function realpathIfPresent(candidate: string): Promise<string | null> {\n try {\n return await realpath(candidate);\n } catch (error: unknown) {\n if (isMissingPathError(error)) return null;\n throw error;\n }\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return isNodeErrorCode(error, ['ENOENT', 'ENOTDIR']);\n}\n\nfunction describeList(values: readonly string[], shown = 5): string {\n const head = values.slice(0, shown).map((value) => `\"${value}\"`);\n const remaining = values.length - head.length;\n return remaining > 0 ? `${head.join(', ')} (and ${remaining} more)` : head.join(', ');\n}\n\nfunction isLocalRelativePath(candidate: string): boolean {\n return (\n !path.isAbsolute(candidate) &&\n !candidate.startsWith('/') &&\n !/^(?:[a-z][a-z0-9+.-]*:)?\\/\\//i.test(candidate) &&\n !candidate.startsWith('data:')\n );\n}\n\nfunction stripUrlSuffix(candidate: string): string {\n return candidate.split(/[?#]/, 1)[0] ?? candidate;\n}\n\nfunction toExactArrayBuffer(data: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(data.byteLength);\n copy.set(data);\n return copy.buffer;\n}\n","/**\n * Resolve a caller-supplied numeric budget against its safe default.\n *\n * `label` describes the budget in full (for example `build entry` or\n * `conversion input byte`) and is interpolated into the rejection message.\n */\nexport function positiveLimit(value: number | undefined, fallback: number, label: string): number {\n const selected = value ?? fallback;\n if (!Number.isSafeInteger(selected) || selected < 1) {\n throw new Error(`Invalid ${label} limit.`);\n }\n return selected;\n}\n","import { Command } from 'commander';\nimport { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http';\nimport { realpath, stat } from 'node:fs/promises';\nimport { isIP } from 'node:net';\nimport path from 'node:path';\nimport { renderMarkdownHtml } from '../render-html.js';\nimport { readContainedFile } from '../contained-file.js';\nimport { isAllowedPreviewPath } from '../preview-policy.js';\nimport { decodeUtf8Text } from '@bendyline/docblocks/filesystem';\nimport { positiveLimit } from '../internal/limits.js';\nimport { isNodeErrorCode } from '../internal/node-error.js';\n\nexport interface ServeOptions {\n port: number;\n dir: string;\n theme?: string;\n host?: string;\n allowNetwork?: boolean;\n /** Extra Host-header names this server answers to, beyond the bind policy. */\n allowedHosts?: readonly string[];\n maxFileBytes?: number;\n maxConcurrentReads?: number;\n}\n\nexport interface PreviewServer {\n server: Server;\n root: string;\n host: string;\n url: string;\n}\n\nconst DEFAULT_HOST = '127.0.0.1';\nconst DEFAULT_MAX_FILE_BYTES = 50 * 1024 * 1024;\nconst DEFAULT_MAX_CONCURRENT_READS = 16;\nconst MAX_ALLOWED_HOSTS = 32;\nexport async function startPreviewServer(opts: ServeOptions): Promise<PreviewServer> {\n const requestedRoot = path.resolve(opts.dir);\n let root: string;\n try {\n root = await realpath(requestedRoot);\n } catch (error: unknown) {\n if (!isMissingPathError(error)) throw error;\n throw new Error(`Directory not found: ${requestedRoot}`);\n }\n const rootStat = await stat(root);\n if (!rootStat.isDirectory()) throw new Error(`Preview root is not a directory: ${root}`);\n\n const host = validateHost(opts.host ?? DEFAULT_HOST, opts.allowNetwork === true);\n const allowedHosts = validateAllowedHosts(opts.allowedHosts ?? []);\n const maxFileBytes = positiveLimit(\n opts.maxFileBytes,\n DEFAULT_MAX_FILE_BYTES,\n 'preview file size',\n );\n const maxConcurrentReads = positiveLimit(\n opts.maxConcurrentReads,\n DEFAULT_MAX_CONCURRENT_READS,\n 'preview concurrent request',\n );\n let activeRequests = 0;\n const server = createServer((req, res) => {\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : opts.port;\n if (!isAllowedPreviewRequestAuthority(req.headers.host, host, port, allowedHosts)) {\n // A bare 421 is undiagnosable, and `localhost` vs `127.0.0.1` is the\n // most common way to hit this. Explain the policy in the body instead.\n // Rejections are deliberately not logged: on an --allow-network server\n // any unauthenticated client could otherwise flood the terminal.\n sendText(\n res,\n 421,\n misdirectedRequestMessage(req.headers.host, host, port, allowedHosts),\n req.method === 'HEAD',\n );\n return;\n }\n if (activeRequests >= maxConcurrentReads) {\n sendText(res, 503, 'Server busy', req.method === 'HEAD');\n return;\n }\n activeRequests += 1;\n handlePreviewRequest(req, res, root, opts.theme, maxFileBytes)\n .catch((error: unknown) => {\n // A dev server exists to give feedback. Swallowing the cause left a\n // bad theme id, a parser crash, or an asset failure showing a bare\n // \"Internal server error\" in the browser and nothing in the terminal.\n reportPreviewFailure(req, error);\n if (!res.headersSent) sendText(res, 500, 'Internal server error', req.method === 'HEAD');\n else res.end();\n })\n .finally(() => {\n activeRequests -= 1;\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(opts.port, host, () => {\n server.off('error', reject);\n resolve();\n });\n });\n\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : opts.port;\n return { server, root, host, url: `http://${urlHost(host)}:${port}/` };\n}\n\nexport const serveCommand = new Command('serve')\n .description('Start a local dev server for previewing markdown files')\n .option('-p, --port <port>', 'port to listen on', '3000')\n .option('-d, --dir <dir>', 'directory to serve', '.')\n .option('-t, --theme <id>', 'Squisq theme ID to apply')\n .option('--host <host>', 'interface to bind (loopback by default)', DEFAULT_HOST)\n .option('--allow-network', 'allow a non-loopback --host')\n .option('--allow-host <host...>', 'additional Host header names this server answers to')\n .action(\n async (opts: {\n port: string;\n dir: string;\n theme?: string;\n host: string;\n allowNetwork?: boolean;\n allowHost?: string[];\n }) => {\n try {\n const server = await startPreviewServer({\n port: parsePort(opts.port),\n dir: opts.dir,\n theme: opts.theme,\n host: opts.host,\n allowNetwork: opts.allowNetwork,\n allowedHosts: opts.allowHost,\n });\n console.error(`Serving ${server.root} at ${server.url}`);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exitCode = 1;\n }\n },\n );\n\nasync function handlePreviewRequest(\n req: IncomingMessage,\n res: ServerResponse,\n root: string,\n themeId: string | undefined,\n maxFileBytes: number,\n): Promise<void> {\n if (req.method !== 'GET' && req.method !== 'HEAD') {\n sendText(res, 405, 'Method not allowed');\n return;\n }\n\n const headOnly = req.method === 'HEAD';\n\n const target = await resolveServeTarget(root, req.url ?? '/', maxFileBytes);\n if (target.kind === 'bad-request') {\n sendText(res, 400, 'Bad request', headOnly);\n return;\n }\n if (target.kind === 'forbidden') {\n sendText(res, 403, 'Forbidden', headOnly);\n return;\n }\n if (target.kind === 'missing') {\n sendText(res, 404, 'Not found', headOnly);\n return;\n }\n if (target.kind === 'too-large') {\n sendText(res, 413, 'File too large', headOnly);\n return;\n }\n\n if (target.markdown) {\n const markdown = decodeUtf8Text(await readContainedFile(root, target.filePath, maxFileBytes), {\n label: 'Preview document',\n path: target.filePath,\n });\n const html = await renderMarkdownHtml(markdown, {\n title: path.basename(target.filePath).replace(/\\.(md|markdown)$/i, ''),\n sourcePath: target.filePath,\n assetRoot: root,\n themeId,\n mode: 'static',\n allowReferencedAsset: ({ assetRoot, requestedPath, physicalPath }) =>\n isAllowedPreviewPath(assetRoot, requestedPath, physicalPath, 'embedded-image'),\n });\n sendBody(res, 200, html, 'text/html; charset=utf-8', headOnly);\n return;\n }\n\n const body = await readContainedFile(root, target.filePath, maxFileBytes);\n sendBody(res, 200, body, contentTypeFor(target.filePath), headOnly);\n}\n\ntype ServeTarget =\n | { kind: 'file'; filePath: string; markdown: boolean }\n | { kind: 'missing' }\n | { kind: 'forbidden' }\n | { kind: 'too-large' }\n | { kind: 'bad-request' };\n\nexport async function resolveServeTarget(\n root: string,\n requestUrl: string,\n maxFileBytes = DEFAULT_MAX_FILE_BYTES,\n): Promise<ServeTarget> {\n if (requestUrl.length > 8_192 || requestUrl.includes('\\0')) return { kind: 'bad-request' };\n let physicalRoot: string;\n try {\n physicalRoot = await realpath(path.resolve(root));\n } catch (error: unknown) {\n if (isMissingPathError(error)) return { kind: 'missing' };\n if (isPermissionError(error)) return { kind: 'forbidden' };\n throw error;\n }\n const decodedPath = decodeRequestPath(requestUrl);\n if (!decodedPath) return { kind: 'bad-request' };\n const requestedPath = decodedPath.replace(/^\\/+/, '');\n const candidate = path.resolve(physicalRoot, requestedPath);\n\n if (!isAllowedPreviewPath(physicalRoot, candidate, candidate, 'directory')) {\n return { kind: 'forbidden' };\n }\n\n const direct = await inspectTarget(physicalRoot, candidate, maxFileBytes);\n if (direct.kind === 'file') return direct;\n if (direct.kind === 'forbidden' || direct.kind === 'too-large') return direct;\n\n if (direct.kind === 'directory') {\n const dirIndex = await directoryIndexTarget(physicalRoot, direct.filePath, maxFileBytes);\n if (dirIndex.kind !== 'missing') return dirIndex;\n }\n\n if (/\\.html?$/i.test(candidate)) {\n const markdownTarget = await inspectTarget(\n physicalRoot,\n candidate.replace(/\\.html?$/i, '.md'),\n maxFileBytes,\n );\n if (markdownTarget.kind !== 'directory' && markdownTarget.kind !== 'missing') {\n return markdownTarget;\n }\n }\n\n return { kind: 'missing' };\n}\n\nfunction decodeRequestPath(requestUrl: string): string {\n const pathOnly = requestUrl.split(/[?#]/, 1)[0] || '/';\n try {\n return decodeURIComponent(pathOnly);\n } catch {\n return '';\n }\n}\n\ntype InspectedTarget =\n | { kind: 'file'; filePath: string; markdown: boolean }\n | { kind: 'directory'; filePath: string }\n | { kind: 'missing' }\n | { kind: 'forbidden' }\n | { kind: 'too-large' };\n\nasync function inspectTarget(\n root: string,\n candidate: string,\n maxFileBytes: number,\n): Promise<InspectedTarget> {\n let physical: string;\n try {\n physical = await realpath(candidate);\n } catch (error: unknown) {\n if (isMissingPathError(error)) return { kind: 'missing' };\n if (isPermissionError(error)) return { kind: 'forbidden' };\n throw error;\n }\n let info;\n try {\n info = await stat(physical);\n } catch (error: unknown) {\n if (isMissingPathError(error)) return { kind: 'missing' };\n if (isPermissionError(error)) return { kind: 'forbidden' };\n throw error;\n }\n if (info.isDirectory()) {\n return isAllowedPreviewPath(root, candidate, physical, 'directory')\n ? { kind: 'directory', filePath: physical }\n : { kind: 'forbidden' };\n }\n if (!info.isFile()) return { kind: 'forbidden' };\n if (!isAllowedPreviewPath(root, candidate, physical, 'document-or-asset')) {\n return { kind: 'forbidden' };\n }\n if (info.size > maxFileBytes) return { kind: 'too-large' };\n return { kind: 'file', filePath: physical, markdown: /\\.(md|markdown)$/i.test(physical) };\n}\n\nasync function directoryIndexTarget(\n root: string,\n dirPath: string,\n maxFileBytes: number,\n): Promise<ServeTarget> {\n for (const fileName of ['index.html', 'index.htm', 'index.md', 'index.markdown']) {\n const target = await inspectTarget(root, path.join(dirPath, fileName), maxFileBytes);\n if (target.kind === 'file' || target.kind === 'forbidden' || target.kind === 'too-large') {\n return target;\n }\n }\n\n return { kind: 'missing' };\n}\n\nfunction parsePort(value: string): number {\n const port = Number(value);\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw new Error(`Invalid port: ${value}`);\n }\n return port;\n}\n\nfunction sendText(res: ServerResponse, status: number, message: string, headOnly = false): void {\n sendBody(res, status, `${message}\\n`, 'text/plain; charset=utf-8', headOnly);\n}\n\nfunction sendBody(\n res: ServerResponse,\n status: number,\n body: string | Uint8Array,\n contentType: string,\n headOnly: boolean,\n): void {\n res.statusCode = status;\n res.setHeader('content-type', contentType);\n res.setHeader('x-content-type-options', 'nosniff');\n res.setHeader('referrer-policy', 'no-referrer');\n res.setHeader('cache-control', 'no-store');\n if (headOnly) {\n res.end();\n return;\n }\n res.end(body);\n}\n\nfunction validateHost(value: string, allowNetwork: boolean): string {\n const rawHost = value.trim().toLowerCase();\n const host = rawHost.startsWith('[') && rawHost.endsWith(']') ? rawHost.slice(1, -1) : rawHost;\n if (\n !host ||\n host.length > 255 ||\n /[\\s/\\\\\\0]/.test(host) ||\n (isIP(host) === 0 && !isValidHostname(host))\n ) {\n throw new Error('Invalid host');\n }\n if (!allowNetwork && !isLoopbackHost(host)) {\n throw new Error('Non-loopback hosts require --allow-network');\n }\n return host;\n}\n\nfunction validateAllowedHosts(values: readonly string[]): readonly string[] {\n if (values.length > MAX_ALLOWED_HOSTS) {\n throw new Error(`At most ${MAX_ALLOWED_HOSTS} --allow-host values are supported`);\n }\n // Each value is an explicit grant, so it only has to be a well-formed\n // authority name; --allow-network governs the bind, not this allowlist.\n return Object.freeze(values.map((value) => validateHost(value, true)));\n}\n\nfunction isLoopbackHost(host: string): boolean {\n if (host === 'localhost' || host === '::1') return true;\n const octets = host.split('.');\n return (\n octets.length === 4 &&\n octets[0] === '127' &&\n octets.every((octet) => /^\\d{1,3}$/.test(octet) && Number(octet) <= 255)\n );\n}\n\nfunction isWildcardHost(host: string): boolean {\n return host === '0.0.0.0' || host === '::';\n}\n\n/**\n * Host-header policy — the server's DNS-rebinding defense.\n *\n * A rebinding attack needs a *name*: the attacker's page is served from\n * `evil.example`, whose DNS record is re-pointed at this server, so the browser\n * sends `Host: evil.example` while the page's origin stays `evil.example` and\n * can read our responses. Refusing to answer to a Host we were not reached by\n * breaks that, and every rule below preserves it:\n *\n * - **Loopback binds** accept any loopback alias (`localhost`, `127.0.0.0/8`,\n * `::1`). These name only the local machine and cannot be pointed elsewhere\n * by DNS, so treating them as interchangeable grants no attacker anything —\n * it only stops rejecting the `localhost:3000` a user actually typed. A\n * public name that merely resolves to 127.0.0.1 is still refused.\n * - **Wildcard binds** (`0.0.0.0`, `::`) cannot know their own hostnames, so\n * they accept IP-literal Hosts of either family plus loopback aliases. An IP\n * literal is not rebindable: reaching us with `Host: 192.168.1.5` requires an\n * origin of `http://192.168.1.5:<port>`, which the same-origin policy already\n * isolates from the attacker's page. Blanket-accepting any Host under\n * `--allow-network` was rejected: it would surrender the defense entirely on\n * exactly the servers that are reachable by other machines.\n * - **A specific non-loopback bind** answers only to that exact host.\n * - `--allow-host` adds names the operator states this server is reached by.\n * The grant is explicit and per-name, so an arbitrary attacker name is still\n * refused.\n */\nexport function isAllowedPreviewRequestAuthority(\n header: string | undefined,\n configuredHost: string,\n configuredPort: number,\n allowedHosts: readonly string[] = [],\n): boolean {\n const authority = parseRequestAuthority(header);\n if (!authority || authority.port !== configuredPort) return false;\n if (allowedHosts.includes(authority.host)) return true;\n if (isWildcardHost(configuredHost)) {\n return isIP(authority.host) !== 0 || isLoopbackHost(authority.host);\n }\n if (isLoopbackHost(configuredHost)) return isLoopbackHost(authority.host);\n return authority.host === configuredHost;\n}\n\nfunction misdirectedRequestMessage(\n header: string | undefined,\n configuredHost: string,\n configuredPort: number,\n allowedHosts: readonly string[],\n): string {\n // Only a parsed authority is echoed. parseRequestAuthority accepts nothing\n // but hostname/IP characters and a numeric port, so nothing attacker-shaped\n // reaches this text/plain, nosniff response.\n const authority = parseRequestAuthority(header);\n const received = authority ? `\"${authority.host}:${authority.port}\"` : 'malformed';\n const accepted = isWildcardHost(configuredHost)\n ? ['any IP-literal address of this machine', 'loopback: localhost, 127.0.0.0/8, ::1']\n : isLoopbackHost(configuredHost)\n ? ['loopback: localhost, 127.0.0.0/8, ::1']\n : [configuredHost];\n return [\n 'Misdirected request',\n '',\n `This preview server is bound to ${configuredHost}:${configuredPort} and does not answer to the`,\n `Host header it received (${received}). The check blocks DNS-rebinding attacks and`,\n 'cannot be disabled.',\n '',\n `Accepted Host names on port ${configuredPort}:`,\n ...[...accepted, ...allowedHosts.map((value) => `${value} (--allow-host)`)].map(\n (value) => ` - ${value}`,\n ),\n '',\n 'Reach this server by one of those names, or restart it with',\n '--allow-host <name> to add the name you are using.',\n ].join('\\n');\n}\n\nfunction reportPreviewFailure(req: IncomingMessage, error: unknown): void {\n const target = (req.url ?? '/').slice(0, 200);\n console.error(`Error: preview request failed: ${req.method ?? 'GET'} ${target}`);\n for (let cause: unknown = error, depth = 0; cause !== undefined && depth < 5; depth += 1) {\n console.error(` ${describePreviewFailure(cause)}`);\n cause = cause instanceof Error ? (cause as Error & { cause?: unknown }).cause : undefined;\n }\n}\n\nfunction describePreviewFailure(error: unknown): string {\n if (!(error instanceof Error)) return String(error);\n return error.stack ?? `${error.name}: ${error.message}`;\n}\n\nfunction parseRequestAuthority(header: string | undefined): { host: string; port: number } | null {\n if (!header || header.length > 512 || /[\\s,\\\\/\\0]/.test(header)) return null;\n\n let host: string;\n let portText = '';\n let hasPortSeparator = false;\n if (header.startsWith('[')) {\n const closingBracket = header.indexOf(']');\n if (closingBracket < 0) return null;\n host = header.slice(1, closingBracket).toLowerCase();\n const remainder = header.slice(closingBracket + 1);\n if (remainder && !remainder.startsWith(':')) return null;\n hasPortSeparator = remainder.startsWith(':');\n portText = remainder.slice(1);\n if (isIP(host) !== 6) return null;\n } else {\n const separator = header.lastIndexOf(':');\n if (separator >= 0) {\n if (header.indexOf(':') !== separator) return null;\n hasPortSeparator = true;\n host = header.slice(0, separator).toLowerCase();\n portText = header.slice(separator + 1);\n } else {\n host = header.toLowerCase();\n }\n if (isIP(host) === 0 && !isValidHostname(host)) return null;\n }\n\n if (hasPortSeparator && !/^\\d{1,5}$/.test(portText)) return null;\n const port = portText ? Number(portText) : 80;\n if (!Number.isInteger(port) || port < 1 || port > 65535) return null;\n return { host, port };\n}\n\nfunction isValidHostname(host: string): boolean {\n return (\n host.length <= 253 &&\n !host.endsWith('.') &&\n host.split('.').every((label) => /^(?!-)[a-z0-9-]{1,63}(?<!-)$/.test(label))\n );\n}\n\nfunction urlHost(host: string): string {\n return host.includes(':') && !host.startsWith('[') ? `[${host}]` : host;\n}\n\nfunction contentTypeFor(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case '.html':\n case '.htm':\n return 'text/html; charset=utf-8';\n case '.css':\n return 'text/css; charset=utf-8';\n case '.js':\n case '.mjs':\n return 'text/javascript; charset=utf-8';\n case '.json':\n return 'application/json; charset=utf-8';\n case '.svg':\n return 'image/svg+xml';\n case '.png':\n return 'image/png';\n case '.jpg':\n case '.jpeg':\n return 'image/jpeg';\n case '.gif':\n return 'image/gif';\n case '.webp':\n return 'image/webp';\n case '.ico':\n return 'image/x-icon';\n case '.woff':\n return 'font/woff';\n case '.woff2':\n return 'font/woff2';\n case '.ttf':\n return 'font/ttf';\n case '.otf':\n return 'font/otf';\n case '.mp3':\n return 'audio/mpeg';\n case '.wav':\n return 'audio/wav';\n case '.ogg':\n return 'audio/ogg';\n case '.mp4':\n return 'video/mp4';\n case '.webm':\n return 'video/webm';\n default:\n return 'application/octet-stream';\n }\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return isNodeErrorCode(error, ['ENOENT', 'ENOTDIR']);\n}\n\nfunction isPermissionError(error: unknown): boolean {\n return isNodeErrorCode(error, ['EACCES', 'EPERM']);\n}\n","import path from 'node:path';\n\nexport type PreviewPathPurpose = 'directory' | 'document-or-asset' | 'embedded-image';\n\nconst PREVIEW_FILE_EXTENSIONS = new Set([\n '.css',\n '.gif',\n '.htm',\n '.html',\n '.ico',\n '.jpeg',\n '.jpg',\n '.js',\n '.json',\n '.markdown',\n '.md',\n '.mjs',\n '.mp3',\n '.mp4',\n '.ogg',\n '.otf',\n '.png',\n '.svg',\n '.ttf',\n '.wav',\n '.webm',\n '.webp',\n '.woff',\n '.woff2',\n]);\n\nconst EMBEDDED_IMAGE_EXTENSIONS = new Set([\n '.gif',\n '.ico',\n '.jpeg',\n '.jpg',\n '.png',\n '.svg',\n '.webp',\n]);\n\nconst SENSITIVE_FILE_EXTENSIONS = new Set(['.cer', '.crt', '.der', '.key', '.p12', '.pem', '.pfx']);\nconst SENSITIVE_FILE_NAMES = new Set([\n 'credentials',\n 'credentials.json',\n 'id_dsa',\n 'id_ecdsa',\n 'id_ed25519',\n 'id_rsa',\n]);\n\n/**\n * Apply the preview policy to both the name the document requested and the\n * physical path the filesystem resolved. Checking both closes symlink aliases\n * such as `images -> .private` and `diagram.png -> credentials.json`.\n */\nexport function isAllowedPreviewPath(\n rootPath: string,\n requestedPath: string,\n physicalPath: string,\n purpose: PreviewPathPurpose,\n): boolean {\n const root = path.resolve(rootPath);\n const requested = path.resolve(requestedPath);\n const physical = path.resolve(physicalPath);\n\n for (const candidate of new Set([requested, physical])) {\n const relative = path.relative(root, candidate);\n if (!isContainedRelativePath(relative) || containsSensitiveSegment(relative)) return false;\n\n if (purpose !== 'directory') {\n const extension = path.extname(path.basename(candidate)).toLowerCase();\n const allowedExtensions =\n purpose === 'embedded-image' ? EMBEDDED_IMAGE_EXTENSIONS : PREVIEW_FILE_EXTENSIONS;\n if (!allowedExtensions.has(extension)) return false;\n }\n }\n\n return true;\n}\n\nfunction containsSensitiveSegment(relativePath: string): boolean {\n return relativePath\n .split(/[\\\\/]+/)\n .filter(Boolean)\n .some((segment) => {\n const lower = segment.toLowerCase();\n return (\n lower.startsWith('.') ||\n SENSITIVE_FILE_NAMES.has(lower) ||\n SENSITIVE_FILE_EXTENSIONS.has(path.extname(lower))\n );\n });\n}\n\nfunction isContainedRelativePath(relativePath: string): boolean {\n return (\n relativePath === '' ||\n (!relativePath.startsWith(`..${path.sep}`) &&\n relativePath !== '..' &&\n !path.isAbsolute(relativePath))\n );\n}\n","/**\n * convert command\n *\n * Reads any input supported by the linked Squisq CLI and exports through its\n * canonical format registry. The historical default set remains DOCX, PPTX,\n * PDF, HTML, and DBK; callers may explicitly request any export-capable\n * registry format.\n *\n * Wraps the same logic as squisq-cli's convert command, reusing the\n * underlying squisq libraries directly.\n */\n\nimport { link, lstat, mkdir, open, opendir, realpath, rename, rm, stat } from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport { dirname, basename, extname, join, resolve } from 'node:path';\nimport { Command } from 'commander';\nimport type { MarkdownDocument } from '@bendyline/squisq/markdown';\nimport type { ContentContainer } from '@bendyline/squisq/storage';\nimport type { Block, Doc } from '@bendyline/squisq/schemas';\nimport type { ConvertSource, FormatId, FormatRegistry } from '@bendyline/squisq-cli/api';\nimport { positiveLimit } from '../internal/limits.js';\nimport { isLinkUnsupportedError } from '../internal/link-support.js';\nimport { isNodeErrorCode } from '../internal/node-error.js';\nimport { throwIfAborted as throwIfSignalAborted } from '../internal/cancellation.js';\n\nconst DEFAULT_FORMATS = ['docx', 'pptx', 'pdf', 'html', 'dbk'] as const;\n\nexport interface ConvertOptions {\n outputDir?: string;\n formats?: string;\n theme?: string;\n transform?: string;\n /**\n * Replace existing destination files. Off by default: the run is refused\n * before any conversion work when a destination already exists.\n */\n allowOverwrite?: boolean;\n /** Cancel reading, transformation, conversion, or publication at a bounded boundary. */\n signal?: AbortSignal;\n /** Programmatic registry override; the CLI defaults to the linked Squisq registry. */\n registry?: FormatRegistry;\n /** Programmatic aggregate input budget; CLI callers use the safe default. */\n maxInputBytes?: number;\n /** Programmatic input-tree budget; CLI callers use the safe default. */\n maxInputEntries?: number;\n /** Programmatic per-output budget; CLI callers use the safe default. */\n maxOutputBytes?: number;\n /** Programmatic aggregate output budget; CLI callers use the safe default. */\n maxTotalOutputBytes?: number;\n}\n\nexport interface ConvertResult {\n outputFiles: {\n path: string;\n format: string;\n size: number;\n mimeType: string;\n suggestedFilename: string;\n warnings: string[];\n }[];\n}\n\nconst DEFAULT_MAX_CONVERT_INPUT_BYTES = 1024 * 1024 * 1024;\nconst DEFAULT_MAX_CONVERT_INPUT_ENTRIES = 20_000;\nconst DEFAULT_MAX_CONVERT_OUTPUT_BYTES = 512 * 1024 * 1024;\nconst DEFAULT_MAX_CONVERT_TOTAL_OUTPUT_BYTES = 1024 * 1024 * 1024;\n\nexport async function runConvert(inputPath: string, opts: ConvertOptions): Promise<ConvertResult> {\n throwIfAborted(opts.signal);\n const resolvedInput = resolve(inputPath);\n const outputDir = opts.outputDir ? resolve(opts.outputDir) : dirname(resolvedInput);\n const inputBasename = basename(resolvedInput);\n const inputExt = extname(inputBasename);\n const baseName = inputExt ? inputBasename.slice(0, -inputExt.length) : inputBasename;\n const maxInputBytes = positiveLimit(\n opts.maxInputBytes,\n DEFAULT_MAX_CONVERT_INPUT_BYTES,\n 'conversion input byte',\n );\n const maxInputEntries = positiveLimit(\n opts.maxInputEntries,\n DEFAULT_MAX_CONVERT_INPUT_ENTRIES,\n 'conversion input entry',\n );\n const maxOutputBytes = positiveLimit(\n opts.maxOutputBytes,\n DEFAULT_MAX_CONVERT_OUTPUT_BYTES,\n 'conversion output byte',\n );\n const maxTotalOutputBytes = positiveLimit(\n opts.maxTotalOutputBytes,\n DEFAULT_MAX_CONVERT_TOTAL_OUTPUT_BYTES,\n 'conversion aggregate output byte',\n );\n\n await assertInputWithinBudget(resolvedInput, maxInputBytes, maxInputEntries, opts.signal);\n\n const squisq = await import('@bendyline/squisq-cli/api');\n throwIfAborted(opts.signal);\n const registry = opts.registry ?? squisq.createCliRegistry();\n const exportableIds = registry\n .list()\n .filter((definition) => definition.exportDoc !== undefined)\n .map((definition) => definition.id);\n const exportable = new Set<FormatId>(exportableIds);\n const registryHint = 'Choose a format reported by the linked Squisq CLI registry.';\n // An explicit `--formats` list is a precise instruction, so every entry in it\n // must be honored exactly. The built-in default set is DocBlocks' own choice\n // rather than the caller's, so a registry that no longer exports one of those\n // IDs degrades to a warning instead of failing an unqualified `convert`.\n const requestedList = opts.formats;\n const explicitFormats = requestedList !== undefined;\n const requested = explicitFormats\n ? requestedList\n .split(',')\n .map((format) => format.trim().toLowerCase())\n .filter(Boolean)\n : [...DEFAULT_FORMATS];\n\n if (explicitFormats) {\n // Matches the MCP conversion service, which refuses duplicate targets. A\n // repeated format would otherwise convert and publish the same destination\n // twice, and the second write would trip the overwrite refusal anyway.\n const duplicate = firstDuplicate(requested);\n if (duplicate) {\n throw new squisq.ConversionError(\n 'unknown-format',\n `Duplicate conversion target: ${duplicate}. List each requested format once.`,\n { format: duplicate, hint: registryHint },\n );\n }\n }\n\n const unknown = requested.filter((format) => !exportable.has(format));\n if (unknown.length > 0 && explicitFormats) {\n // Exiting 0 after skipping a requested format lets a typo in CI produce no\n // output under a success status. Refuse the run instead, before converting\n // anything, so `convert` keeps its all-or-nothing contract.\n throw new squisq.ConversionError(\n 'unknown-format',\n `Unknown or non-exportable format${unknown.length === 1 ? '' : 's'} \"${unknown.join(', ')}\". Valid: ${exportableIds.join(', ')}`,\n { format: unknown[0], hint: registryHint },\n );\n }\n if (unknown.length > 0) {\n console.warn(\n `Unknown or non-exportable default format${unknown.length === 1 ? '' : 's'} \"${unknown.join(', ')}\" — skipping. Valid: ${exportableIds.join(', ')}`,\n );\n }\n\n const formats = requested.filter((format): format is FormatId => exportable.has(format));\n if (formats.length === 0) {\n throw new squisq.ConversionError(\n 'unknown-format',\n `No valid formats specified. Valid: ${exportableIds.join(', ')}`,\n { format: requested[0], hint: registryHint },\n );\n }\n\n await mkdir(outputDir, { recursive: true });\n throwIfAborted(opts.signal);\n\n // Validate transform\n if (opts.transform) {\n const { getTransformStyleIds } = await import('@bendyline/squisq/transform');\n throwIfAborted(opts.signal);\n const styles = getTransformStyleIds();\n if (!styles.includes(opts.transform)) {\n throw new Error(\n `Unknown transform style \"${opts.transform}\". Available: ${styles.join(', ')}`,\n );\n }\n }\n\n // Last cheap gate before reading, transforming, and converting. Every\n // destination name is derivable up front, so a conflicting run is refused\n // whole rather than part-way through — no format is converted and no file is\n // touched unless every destination is clear.\n const allowOverwrite = opts.allowOverwrite === true;\n if (!allowOverwrite) {\n await assertOutputsAvailable(\n formats.map((format) => plannedOutputPath(outputDir, baseName, format, registry)),\n opts.signal,\n );\n }\n\n console.error(`Reading: ${resolvedInput}`);\n const result = await squisq.readInput(resolvedInput, { signal: opts.signal });\n throwIfAborted(opts.signal);\n const { container } = result;\n\n // Keep DocBlocks' source-preserving Markdown transform projection for\n // authored Markdown. JSON Doc inputs have no Markdown source to protect, so\n // they use the registry's native transform path below.\n let exportMarkdownDoc = result.markdownDoc;\n if (opts.transform && exportMarkdownDoc) {\n exportMarkdownDoc = await applyTransformToMarkdown(\n exportMarkdownDoc,\n container,\n opts.transform,\n opts.theme,\n );\n throwIfAborted(opts.signal);\n console.error(` Applied transform: ${opts.transform}`);\n }\n\n const source: ConvertSource = exportMarkdownDoc\n ? { kind: 'markdown', markdown: exportMarkdownDoc, container, baseName }\n : { kind: 'doc', doc: result.doc, container, baseName };\n const outputFiles: ConvertResult['outputFiles'] = [];\n let totalOutputBytes = 0;\n\n for (const format of formats) {\n throwIfAborted(opts.signal);\n const conversion = await squisq.convert(source, format, {\n signal: opts.signal,\n registry,\n title: baseName,\n themeId: opts.theme,\n ...(!exportMarkdownDoc && opts.transform ? { transformStyle: opts.transform } : {}),\n });\n throwIfAborted(opts.signal);\n if (conversion.bytes.byteLength > maxOutputBytes) {\n throw new Error(`${format} output exceeds the ${maxOutputBytes}-byte conversion limit.`);\n }\n totalOutputBytes += conversion.bytes.byteLength;\n if (totalOutputBytes > maxTotalOutputBytes) {\n throw new Error(`Conversion outputs exceed the ${maxTotalOutputBytes}-byte aggregate limit.`);\n }\n const suggestedFilename = basename(conversion.suggestedFilename);\n const outPath = join(outputDir, suggestedFilename);\n await publishFile(outPath, conversion.bytes, allowOverwrite, opts.signal);\n throwIfAborted(opts.signal);\n const info = await stat(outPath);\n throwIfAborted(opts.signal);\n outputFiles.push({\n path: outPath,\n format,\n size: info.size,\n mimeType: conversion.mimeType,\n suggestedFilename: conversion.suggestedFilename,\n warnings: [...conversion.warnings],\n });\n for (const warning of conversion.warnings) {\n console.error(` Warning [${format}]: ${warning}`);\n }\n console.error(` ✓ ${outPath}`);\n }\n\n console.error('Done.');\n return { outputFiles };\n}\n\nasync function assertInputWithinBudget(\n inputPath: string,\n maxBytes: number,\n maxEntries: number,\n signal?: AbortSignal,\n): Promise<void> {\n const rootInfo = await stat(inputPath);\n if (rootInfo.isFile()) {\n if (rootInfo.size > maxBytes) {\n throw new Error(`Conversion input exceeds the ${maxBytes}-byte limit.`);\n }\n return;\n }\n if (!rootInfo.isDirectory()) throw new Error(`Unsupported conversion input: ${inputPath}`);\n\n const pending = [inputPath];\n const visitedDirectories = new Set<string>();\n let entryCount = 0;\n let totalBytes = 0;\n while (pending.length > 0) {\n throwIfAborted(signal);\n const directory = pending.pop()!;\n const physicalDirectory = await realpath(directory);\n if (visitedDirectories.has(physicalDirectory)) continue;\n visitedDirectories.add(physicalDirectory);\n const entries = await opendir(directory);\n for await (const entry of entries) {\n throwIfAborted(signal);\n entryCount += 1;\n if (entryCount > maxEntries) {\n throw new Error(`Conversion input exceeds the ${maxEntries}-entry limit.`);\n }\n const entryPath = join(directory, entry.name);\n const info = await stat(entryPath);\n if (info.isDirectory()) pending.push(entryPath);\n else if (info.isFile()) {\n totalBytes += info.size;\n if (totalBytes > maxBytes) {\n throw new Error(`Conversion input exceeds the ${maxBytes}-byte limit.`);\n }\n }\n }\n }\n}\n\n/**\n * Reproduce the linked registry's destination naming without converting.\n *\n * Squisq's `convert()` derives `suggestedFilename` as\n * `<baseName>.<first extension>`, so the same inputs yield the same name here.\n * Publication re-checks the real name, so a registry that ever diverged from\n * this derivation still cannot silently clobber a file.\n */\nfunction plannedOutputPath(\n outputDir: string,\n baseName: string,\n format: FormatId,\n registry: FormatRegistry,\n): string {\n const extension = registry.get(format)?.extensions[0]?.replace(/^\\.+/u, '') ?? format;\n return join(outputDir, `${baseName}.${extension}`);\n}\n\nasync function assertOutputsAvailable(\n outputPaths: readonly string[],\n signal?: AbortSignal,\n): Promise<void> {\n const conflicts: string[] = [];\n for (const outputPath of outputPaths) {\n throwIfAborted(signal);\n if (await lstat(outputPath).catch(() => null)) conflicts.push(outputPath);\n }\n throwIfAborted(signal);\n if (conflicts.length > 0) throw new Error(overwriteConflictMessage(conflicts));\n}\n\nfunction overwriteConflictMessage(conflicts: readonly string[]): string {\n const noun = conflicts.length === 1 ? 'file' : 'files';\n const pronoun = conflicts.length === 1 ? 'it' : 'them';\n return [\n `Refusing to overwrite ${conflicts.length} existing ${noun}:`,\n ...conflicts.map((conflict) => ` ${conflict}`),\n `Pass --allow-overwrite to replace ${pronoun}, or use --output-dir to write elsewhere.`,\n ].join('\\n');\n}\n\n/**\n * Publish bounded bytes through an operation-owned sibling file.\n *\n * Mirrors the MCP authority's publication policy: replacement is opt-in, and\n * the default path publishes with `link()` — an atomic create-if-absent on one\n * filesystem — so a file that appears between the preflight check and this\n * moment is reported rather than destroyed. Volumes without hard links\n * (FAT32/exFAT, some network mounts) fall back to an exclusive create, which\n * refuses an occupied destination just as firmly.\n */\nasync function publishFile(\n outputPath: string,\n bytes: Uint8Array,\n allowOverwrite: boolean,\n signal?: AbortSignal,\n): Promise<void> {\n const temporaryPath = join(\n dirname(outputPath),\n `.${basename(outputPath)}.${process.pid}.${randomUUID()}.tmp`,\n );\n let handle: Awaited<ReturnType<typeof open>> | null = null;\n try {\n handle = await open(temporaryPath, 'wx', 0o600);\n await handle.writeFile(bytes);\n await handle.sync();\n await handle.close();\n handle = null;\n throwIfAborted(signal);\n if (allowOverwrite) {\n await rename(temporaryPath, outputPath);\n return;\n }\n try {\n await link(temporaryPath, outputPath);\n return;\n } catch (error: unknown) {\n // A genuinely occupied destination must refuse, never fall back.\n if (isNodeErrorCode(error, 'EEXIST')) throw new Error(overwriteConflictMessage([outputPath]));\n if (!isLinkUnsupportedError(error)) throw error;\n }\n\n // FAT32/exFAT and some network mounts have no hard links. `wx` is the same\n // atomic create-if-absent primitive without them: an occupied destination\n // still fails EEXIST, so publication stays refuse-don't-clobber.\n let published: Awaited<ReturnType<typeof open>>;\n try {\n published = await open(outputPath, 'wx', 0o600);\n } catch (error: unknown) {\n if (isNodeErrorCode(error, 'EEXIST')) throw new Error(overwriteConflictMessage([outputPath]));\n throw error;\n }\n try {\n await published.writeFile(bytes);\n await published.sync();\n await published.close();\n } catch (error: unknown) {\n // This run exclusively created the destination, so removing the partial\n // publication cannot destroy a file the caller wanted to keep.\n await published.close().catch(() => undefined);\n await rm(outputPath, { force: true }).catch(() => undefined);\n throw error;\n }\n } finally {\n await handle?.close().catch(() => undefined);\n await rm(temporaryPath, { force: true }).catch(() => undefined);\n }\n}\n\nfunction firstDuplicate(values: readonly string[]): string | undefined {\n const seen = new Set<string>();\n for (const value of values) {\n if (seen.has(value)) return value;\n seen.add(value);\n }\n return undefined;\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n throwIfSignalAborted(signal, 'Document conversion was cancelled');\n}\n\n/**\n * Apply a transform style to a MarkdownDocument.\n */\nexport async function applyTransformToMarkdown(\n markdownDoc: MarkdownDocument,\n container: ContentContainer,\n transformStyle: string,\n themeId?: string,\n): Promise<MarkdownDocument> {\n const { markdownToDoc, docToMarkdown } = await import('@bendyline/squisq/doc');\n const { readFrontmatterThemeId } = await import('@bendyline/squisq/markdown');\n const { applyTransform, extractDocImages } = await import('@bendyline/squisq/transform');\n\n const doc = markdownToDoc(markdownDoc);\n const images = extractDocImages(doc.blocks);\n const effectiveTheme = themeId ?? readFrontmatterThemeId(markdownDoc.frontmatter);\n const result = applyTransform(doc, transformStyle, { themeId: effectiveTheme, images });\n const projected = projectTransformOntoMarkdownSource(doc, result.doc);\n const transformedMarkdown = docToMarkdown(projected);\n const resolvedTheme = effectiveTheme ?? result.doc.themeId ?? doc.themeId;\n if (!resolvedTheme) return transformedMarkdown;\n return {\n ...transformedMarkdown,\n frontmatter: {\n ...(transformedMarkdown.frontmatter ?? {}),\n 'squisq-theme': resolvedTheme,\n },\n };\n}\n\n/**\n * Squisq transforms produce a presentation Doc whose generated highlight\n * blocks intentionally replace source blocks. Those generated blocks do not\n * carry Markdown authoring nodes, so serializing the transformed Doc directly\n * can drop complete sections. Project each selected visual template back onto\n * its source block instead: the style remains material while the authored\n * headings, body content, media references, and hierarchy stay intact.\n */\nfunction projectTransformOntoMarkdownSource(source: Doc, transformed: Doc): Doc {\n const candidatesBySource = new Map<string, Block[]>();\n const timedSourceBlocks = collectTransformSourceBlocks(source.blocks).sort(\n (left, right) => left.startTime - right.startTime,\n );\n\n const collectCandidates = (blocks: readonly Block[]): void => {\n for (const block of blocks) {\n const provenance = block as Block & {\n sourceBlockId?: string;\n sourceStartTime?: number;\n };\n const sourceBlockId =\n provenance.sourceBlockId ??\n findSourceBlockAtTime(timedSourceBlocks, provenance.sourceStartTime)?.id;\n if (sourceBlockId && block.template) {\n const candidates = candidatesBySource.get(sourceBlockId) ?? [];\n candidates.push(block);\n candidatesBySource.set(sourceBlockId, candidates);\n }\n if (block.children) collectCandidates(block.children);\n }\n };\n collectCandidates(transformed.blocks);\n\n const projectBlock = (block: Block): Block => {\n const children = block.children?.map(projectBlock);\n const visual = selectVisualCandidate(candidatesBySource.get(block.id));\n if (!visual || !block.sourceHeading) {\n return { ...block, ...(children ? { children } : {}) };\n }\n\n const { autoTemplate: _autoTemplate, ...sourceBlock } = block;\n void _autoTemplate;\n const templateOverrides = {\n ...visual.overrides,\n ...(block.sourceHeading.templateAnnotation?.params ?? {}),\n ...(block.templateOverrides ?? {}),\n };\n const sourceHeading = {\n ...block.sourceHeading,\n templateAnnotation: {\n ...(block.sourceHeading.templateAnnotation ?? {}),\n template: visual.block.template,\n ...(Object.keys(templateOverrides).length > 0 ? { params: templateOverrides } : {}),\n },\n };\n\n return {\n ...sourceBlock,\n ...(children ? { children } : {}),\n template: visual.block.template,\n templateOverrides,\n sourceHeading,\n ...(block.transition || visual.block.transition\n ? { transition: block.transition ?? visual.block.transition }\n : {}),\n };\n };\n\n return {\n ...source,\n blocks: source.blocks.map(projectBlock),\n themeId: transformed.themeId ?? source.themeId,\n };\n}\n\nfunction collectTransformSourceBlocks(blocks: readonly Block[]): Block[] {\n const sourceBlocks: Block[] = [];\n for (const block of blocks) {\n if (block.children && block.children.length > 0) {\n if (!block.contents || block.contents.length === 0) sourceBlocks.push(block);\n sourceBlocks.push(...collectTransformSourceBlocks(block.children));\n } else {\n sourceBlocks.push(block);\n }\n }\n return sourceBlocks;\n}\n\nfunction findSourceBlockAtTime(\n sourceBlocks: readonly Block[],\n sourceStartTime: number | undefined,\n): Block | undefined {\n if (sourceStartTime === undefined) return undefined;\n let match: Block | undefined;\n for (const block of sourceBlocks) {\n if (block.startTime > sourceStartTime) break;\n match = block;\n }\n return match;\n}\n\ninterface ProjectedVisual {\n block: Block;\n overrides: Record<string, string>;\n}\n\nfunction selectVisualCandidate(\n candidates: readonly Block[] | undefined,\n): ProjectedVisual | undefined {\n if (!candidates || candidates.length === 0) return undefined;\n for (const candidate of candidates) {\n if (\n candidate.id.startsWith('transform-header-') ||\n candidate.id.startsWith('transform-img-') ||\n candidate.template === 'sectionHeader'\n ) {\n continue;\n }\n const overrides = serializeVisualInputs(candidate);\n if (overrides) return { block: candidate, overrides };\n }\n return undefined;\n}\n\nfunction serializeVisualInputs(block: Block): Record<string, string> | undefined {\n const input = block as unknown as Record<string, unknown>;\n switch (block.template) {\n case 'title':\n return serializeStringInputs(input, ['title'], ['subtitle', 'backgroundColor']);\n case 'statHighlight':\n return serializeStringInputs(input, ['stat', 'description'], ['detail', 'colorScheme']);\n case 'quote':\n return serializeStringInputs(input, ['quote'], ['attribution']);\n case 'fullBleedQuote':\n return serializeStringInputs(input, ['text'], ['colorScheme']);\n case 'factCard':\n return serializeStringInputs(input, ['fact', 'explanation'], ['source']);\n case 'definitionCard':\n return serializeStringInputs(input, ['term', 'definition'], ['origin', 'colorScheme']);\n case 'dateEvent':\n return serializeStringInputs(input, ['date', 'description'], ['footer', 'mood']);\n case 'twoColumn': {\n const left = serializeLabeledPair(input.left);\n const right = serializeLabeledPair(input.right);\n if (!left || !right) return undefined;\n return {\n left,\n right,\n ...(serializeStringInputs(input, [], ['header', 'leftColor', 'rightColor']) ?? {}),\n };\n }\n default:\n // Some template inputs (lists, images, tables, and custom templates)\n // are structured and cannot be represented losslessly in one inline\n // annotation. Keep their source Markdown unchanged instead of emitting\n // a visually empty or corrupt template block.\n return undefined;\n }\n}\n\nfunction serializeStringInputs(\n input: Record<string, unknown>,\n required: readonly string[],\n optional: readonly string[],\n): Record<string, string> | undefined {\n const serialized: Record<string, string> = {};\n for (const key of required) {\n const value = input[key];\n if (typeof value !== 'string') return undefined;\n serialized[key] = value;\n }\n for (const key of optional) {\n const value = input[key];\n if (typeof value === 'string') serialized[key] = value;\n }\n return serialized;\n}\n\nfunction serializeLabeledPair(value: unknown): string | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const pair = value as Record<string, unknown>;\n if (typeof pair.label !== 'string') return undefined;\n return typeof pair.sublabel === 'string' && pair.sublabel\n ? `${pair.label}|${pair.sublabel}`\n : pair.label;\n}\n\nexport const convertCommand = new Command('convert')\n .description('Convert a document through the linked Squisq format registry')\n .argument('<input>', 'Path to a supported document, .zip/.dbk container, or folder')\n .option('-o, --output-dir <dir>', 'Output directory (default: same as input)')\n .option(\n '-f, --formats <list>',\n `Comma-separated linked Squisq export formats (default: ${DEFAULT_FORMATS.join(', ')})`,\n )\n .option('-t, --theme <id>', 'Squisq theme ID to apply (e.g., documentary, cinematic, bold)')\n .option(\n '--transform <style>',\n 'Transform style to apply before export (e.g., documentary, magazine, minimal)',\n )\n .option('--allow-overwrite', 'replace existing output files instead of refusing the run')\n .action(async (inputPath: string, opts: ConvertOptions) => {\n try {\n await runConvert(inputPath, opts);\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n if (isConversionErrorMetadata(err)) {\n console.error(` Code: ${err.code}${err.format ? ` (${err.format})` : ''}`);\n if (err.hint) console.error(` Hint: ${err.hint}`);\n }\n process.exitCode = 1;\n }\n });\n\nfunction isConversionErrorMetadata(\n error: unknown,\n): error is Error & { code: string; format?: string; hint?: string } {\n if (!(error instanceof Error)) return false;\n const candidate = error as Error & { code?: unknown; format?: unknown; hint?: unknown };\n if (typeof candidate.code !== 'string') return false;\n if (candidate.format !== undefined && typeof candidate.format !== 'string') {\n return false;\n }\n return candidate.hint === undefined || typeof candidate.hint === 'string';\n}\n","/**\n * video command\n *\n * Renders a squisq document to MP4 video using Playwright + FFmpeg.\n * Wraps the squisq-cli's renderDocToMp4 programmatic API.\n */\n\nimport { lstat, mkdir } from 'node:fs/promises';\nimport { dirname, basename, extname, resolve } from 'node:path';\nimport { Command } from 'commander';\nimport {\n resolveDimensions,\n validateVideoExportOptions,\n type VideoQuality,\n type VideoOrientation,\n} from '@bendyline/squisq-video';\nimport { throwIfAborted as throwIfSignalAborted } from '../internal/cancellation.js';\n\nconst VALID_QUALITIES = ['draft', 'normal', 'high'] as const;\nconst VALID_ORIENTATIONS = ['landscape', 'portrait'] as const;\nconst VALID_CAPTIONS = ['off', 'standard', 'social'] as const;\n\n/** Resource ceiling for direct CLI renders. 3840x2160 (4K UHD) remains supported. */\nexport const CLI_VIDEO_RENDER_LIMITS = Object.freeze({\n maximumDimension: 3_840,\n maximumPixelsPerFrame: 8_294_400,\n});\n\ntype CaptionOption = (typeof VALID_CAPTIONS)[number];\n\nexport interface VideoOptions {\n output?: string;\n fps?: number;\n quality?: VideoQuality;\n orientation?: VideoOrientation;\n captions?: CaptionOption;\n width?: number;\n height?: number;\n /**\n * Replace an existing MP4. Off by default: the render is refused before any\n * reading, browser capture, or FFmpeg encoding when the target exists.\n */\n allowOverwrite?: boolean;\n /** Cancel input preparation, browser capture, or FFmpeg encoding. */\n signal?: AbortSignal;\n}\n\nexport interface VideoResult {\n outputPath: string;\n duration: number;\n frameCount: number;\n}\n\ntype RenderDocToMp4 = typeof import('@bendyline/squisq-cli/api').renderDocToMp4;\n\nexport interface VideoRunDependencies {\n /** Test/programmatic override; production uses the linked Squisq renderer. */\n renderDocToMp4?: RenderDocToMp4;\n}\n\n/**\n * Core video rendering logic — reusable by both CLI and MCP tools.\n */\nexport async function runVideo(\n inputPath: string,\n opts: VideoOptions,\n onProgress?: (phase: string, percent: number) => void,\n dependencies: VideoRunDependencies = {},\n): Promise<VideoResult> {\n throwIfAborted(opts.signal);\n const resolvedInput = resolve(inputPath);\n\n const fps = opts.fps ?? 30;\n if (!Number.isFinite(fps) || fps < 1 || fps > 120) {\n throw new Error('FPS must be a number between 1 and 120');\n }\n\n const quality = opts.quality ?? 'normal';\n if (!VALID_QUALITIES.includes(quality as (typeof VALID_QUALITIES)[number])) {\n throw new Error(`Invalid quality \"${quality}\". Valid: ${VALID_QUALITIES.join(', ')}`);\n }\n\n const orientation = opts.orientation ?? 'landscape';\n if (!VALID_ORIENTATIONS.includes(orientation as (typeof VALID_ORIENTATIONS)[number])) {\n throw new Error(\n `Invalid orientation \"${orientation}\". Valid: ${VALID_ORIENTATIONS.join(', ')}`,\n );\n }\n\n const captions = opts.captions ?? 'off';\n if (!VALID_CAPTIONS.includes(captions as (typeof VALID_CAPTIONS)[number])) {\n throw new Error(`Invalid captions \"${captions}\". Valid: ${VALID_CAPTIONS.join(', ')}`);\n }\n const captionStyle = captions === 'off' ? undefined : (captions as 'standard' | 'social');\n\n assertCliVideoRenderBudget({\n fps,\n quality,\n orientation,\n width: opts.width,\n height: opts.height,\n });\n\n // Determine output path\n const inputBasename = basename(resolvedInput);\n const inputExt = extname(inputBasename);\n const baseName = inputExt ? inputBasename.slice(0, -inputExt.length) : inputBasename;\n const outputPath = opts.output\n ? resolve(opts.output)\n : resolve(dirname(resolvedInput), `${baseName}.mp4`);\n\n // Refuse before reading, capturing, or encoding. The linked renderer and\n // FFmpeg own the write itself, so this check is the only point at which an\n // existing MP4 can be protected.\n if (opts.allowOverwrite !== true && (await lstat(outputPath).catch(() => null))) {\n throw new Error(\n [\n 'Refusing to overwrite an existing file:',\n ` ${outputPath}`,\n 'Pass --allow-overwrite to replace it, or use --output to write elsewhere.',\n ].join('\\n'),\n );\n }\n throwIfAborted(opts.signal);\n\n await mkdir(dirname(outputPath), { recursive: true });\n throwIfAborted(opts.signal);\n\n console.error(`Reading: ${resolvedInput}`);\n const squisq = await import('@bendyline/squisq-cli/api');\n throwIfAborted(opts.signal);\n const renderDocToMp4 = dependencies.renderDocToMp4 ?? squisq.renderDocToMp4;\n const { readInput } = squisq;\n const result = await readInput(resolvedInput, { signal: opts.signal });\n throwIfAborted(opts.signal);\n const { container, doc } = result;\n console.error(`Using normalized ${result.sourceFormat} document`);\n\n console.error(\n `Rendering: ${fps} fps, quality: ${quality}, orientation: ${orientation}, captions: ${captions}`,\n );\n\n let latestProgress = 0;\n const renderResult = await renderDocToMp4(doc, container, {\n signal: opts.signal,\n outputPath,\n fps,\n quality,\n orientation,\n width: opts.width,\n height: opts.height,\n captionStyle,\n onProgress: (phase, percent) => {\n throwIfAborted(opts.signal);\n const boundedPercent = Math.max(0, Math.min(100, percent));\n if (boundedPercent < latestProgress) return;\n latestProgress = boundedPercent;\n if (onProgress) onProgress(phase, boundedPercent);\n else process.stderr.write(`\\r ${phase}: ${boundedPercent}% `);\n throwIfAborted(opts.signal);\n },\n });\n throwIfAborted(opts.signal);\n\n process.stderr.write('\\r' + ' '.repeat(60) + '\\r');\n console.error(` ✓ ${outputPath}`);\n console.error(\n ` Duration: ${renderResult.duration.toFixed(1)}s, ${renderResult.frameCount} frames`,\n );\n console.error('Done.');\n\n return {\n outputPath: renderResult.outputPath,\n duration: renderResult.duration,\n frameCount: renderResult.frameCount,\n };\n}\n\n/** Reject unsafe dimensions before reading input or launching Playwright/FFmpeg. */\nexport function assertCliVideoRenderBudget(\n options: Pick<VideoOptions, 'fps' | 'quality' | 'orientation' | 'width' | 'height'>,\n): void {\n validateVideoExportOptions(options);\n const { width, height } = resolveDimensions(options);\n for (const [label, value] of [\n ['width', width],\n ['height', height],\n ] as const) {\n if (value % 2 !== 0) {\n throw new RangeError(\n `Video ${label} must be an even number of pixels (got ${value}); H.264 yuv420p cannot encode odd dimensions.`,\n );\n }\n }\n const pixelsPerFrame = width * height;\n const violations: string[] = [];\n if (\n width > CLI_VIDEO_RENDER_LIMITS.maximumDimension ||\n height > CLI_VIDEO_RENDER_LIMITS.maximumDimension\n ) {\n violations.push(\n `${width}x${height} exceeds the ${CLI_VIDEO_RENDER_LIMITS.maximumDimension}-pixel dimension limit`,\n );\n }\n if (pixelsPerFrame > CLI_VIDEO_RENDER_LIMITS.maximumPixelsPerFrame) {\n violations.push(\n `${pixelsPerFrame} pixels per frame exceeds the ${CLI_VIDEO_RENDER_LIMITS.maximumPixelsPerFrame}-pixel limit`,\n );\n }\n if (violations.length > 0) {\n throw new RangeError(`Video render exceeds the CLI resource budget: ${violations.join('; ')}.`);\n }\n}\n\nfunction throwIfAborted(signal?: AbortSignal): void {\n throwIfSignalAborted(signal, 'Video rendering was cancelled');\n}\n\ninterface VideoCommandOptions {\n output?: string;\n fps?: string;\n quality?: string;\n orientation?: string;\n captions?: string;\n width?: string;\n height?: string;\n allowOverwrite?: boolean;\n}\n\nexport const videoCommand = new Command('video')\n .description('Render a squisq document to MP4 video')\n .argument('<input>', 'Path to a supported document, .zip/.dbk container, or folder')\n .argument('[output]', 'Output MP4 path (default: <input>.mp4)')\n .option('-o, --output <path>', 'Output MP4 path (default: <input>.mp4)')\n .option('--fps <number>', 'Frames per second', '30')\n .option('--quality <level>', `Encoding quality: ${VALID_QUALITIES.join(', ')}`, 'normal')\n .option(\n '--orientation <orient>',\n `Video orientation: ${VALID_ORIENTATIONS.join(', ')}`,\n 'landscape',\n )\n .option('--captions <style>', `Caption style: ${VALID_CAPTIONS.join(', ')}`, 'off')\n .option('--width <pixels>', 'Override video width')\n .option('--height <pixels>', 'Override video height')\n .option('--allow-overwrite', 'replace an existing output MP4 instead of refusing the run')\n .action(async (inputPath: string, outputArg: string | undefined, opts: VideoCommandOptions) => {\n try {\n await runVideo(inputPath, {\n output: selectVideoOutput(outputArg, opts.output),\n fps: parseNumberOption('--fps', opts.fps ?? '30'),\n quality: opts.quality as VideoQuality,\n orientation: opts.orientation as VideoOrientation,\n captions: opts.captions as CaptionOption,\n width: opts.width ? parseNumberOption('--width', opts.width) : undefined,\n height: opts.height ? parseNumberOption('--height', opts.height) : undefined,\n allowOverwrite: opts.allowOverwrite,\n });\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exitCode = 1;\n }\n });\n\nfunction parseNumberOption(name: string, value: string): number {\n const parsed = Number(value);\n if (!Number.isFinite(parsed)) throw new Error(`${name} must be a finite number`);\n return parsed;\n}\n\n/**\n * The destination can be named positionally or with `-o`, never both.\n *\n * Silently preferring one of two conflicting instructions writes a file the\n * caller did not ask for; a render is expensive and the loser is invisible, so\n * an ambiguous request is refused before anything is read or encoded.\n */\nexport function selectVideoOutput(\n positional: string | undefined,\n option: string | undefined,\n): string | undefined {\n if (positional !== undefined && option !== undefined) {\n throw new Error(\n [\n 'Two output paths were requested:',\n ` positional ${positional}`,\n ` --output ${option}`,\n 'Pass the output path exactly once.',\n ].join('\\n'),\n );\n }\n return option ?? positional;\n}\n","/**\n * mcp command — start the DocBlocks MCP server over stdio.\n *\n * Usage:\n * docblocks mcp\n *\n * For Claude Desktop, add to your config:\n * { \"mcpServers\": { \"docblocks\": { \"command\": \"npx\", \"args\": [\"-y\", \"@bendyline/docblocks-cli\", \"mcp\"] } } }\n */\n\nimport process from 'node:process';\nimport { Command } from 'commander';\nimport { MCP_ARTIFACT_STORE_LIMITS } from '../mcp/artifact-store.js';\nimport { MCP_FILE_AUTHORITY_LIMITS } from '../mcp/authority.js';\n\nexport const mcpCommand = new Command('mcp')\n .description('Start an MCP server over stdio for AI-assisted document operations')\n .option('--allow-read <dir...>', 'allow MCP tools to read below these directories')\n .option('--allow-write <dir...>', 'allow MCP tools to write below these directories')\n .option('--max-concurrency <count>', 'maximum simultaneous expensive tools', '2')\n .option(\n '--operation-timeout-ms <milliseconds>',\n 'runtime budget for one expensive tool',\n '120000',\n )\n .option(\n '--max-input-bytes <bytes>',\n 'maximum bytes read from one granted source file',\n '104857600',\n )\n .option('--max-artifact-bytes <bytes>', 'maximum bytes in one generated artifact', '524288000')\n .option(\n '--max-artifact-total-bytes <bytes>',\n 'maximum generated artifact bytes per session',\n '1073741824',\n )\n .option('--max-artifacts <count>', 'maximum generated artifacts per session', '64')\n .option('--artifact-ttl-ms <milliseconds>', 'generated artifact lifetime', '1800000')\n .option(\n '--max-resource-bytes <bytes>',\n 'maximum artifact bytes returned as an MCP resource',\n '26214400',\n )\n .option('--max-report-bytes <bytes>', 'maximum stored conversion report bytes', '8388608')\n .option(\n '--max-report-total-bytes <bytes>',\n 'maximum stored conversion report bytes per session',\n '67108864',\n )\n .action(\n async (opts: {\n allowRead?: string[];\n allowWrite?: string[];\n maxConcurrency: string;\n operationTimeoutMs: string;\n maxInputBytes: string;\n maxArtifactBytes: string;\n maxArtifactTotalBytes: string;\n maxArtifacts: string;\n artifactTtlMs: string;\n maxResourceBytes: string;\n maxReportBytes: string;\n maxReportTotalBytes: string;\n }) => {\n const { createMcpServer } = await import('../mcp/server.js');\n const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');\n\n const maxConcurrentOperations = Number(opts.maxConcurrency);\n if (\n !Number.isSafeInteger(maxConcurrentOperations) ||\n maxConcurrentOperations < 1 ||\n maxConcurrentOperations > 32\n ) {\n throw new Error('--max-concurrency must be an integer between 1 and 32');\n }\n const operationTimeoutMs = Number(opts.operationTimeoutMs);\n if (\n !Number.isSafeInteger(operationTimeoutMs) ||\n operationTimeoutMs < 1_000 ||\n operationTimeoutMs > 30 * 60 * 1_000\n ) {\n throw new Error('--operation-timeout-ms must be between 1000 and 1800000');\n }\n const server = createMcpServer({\n readRoots: opts.allowRead ?? [],\n writeRoots: opts.allowWrite ?? [],\n maxConcurrentOperations,\n operationTimeoutMs,\n maxInputFileBytes: boundedIntegerOption(\n '--max-input-bytes',\n opts.maxInputBytes,\n MCP_FILE_AUTHORITY_LIMITS.maxInputFileBytes,\n ),\n maxArtifactBytes: boundedIntegerOption(\n '--max-artifact-bytes',\n opts.maxArtifactBytes,\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactBytes,\n ),\n maxArtifactTotalBytes: boundedIntegerOption(\n '--max-artifact-total-bytes',\n opts.maxArtifactTotalBytes,\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactTotalBytes,\n ),\n maxArtifactCount: boundedIntegerOption(\n '--max-artifacts',\n opts.maxArtifacts,\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactCount,\n ),\n artifactTtlMs: boundedIntegerOption(\n '--artifact-ttl-ms',\n opts.artifactTtlMs,\n MCP_ARTIFACT_STORE_LIMITS.artifactTtlMs,\n ),\n maxArtifactResourceBytes: boundedIntegerOption(\n '--max-resource-bytes',\n opts.maxResourceBytes,\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactResourceBytes,\n ),\n maxArtifactReportBytes: boundedIntegerOption(\n '--max-report-bytes',\n opts.maxReportBytes,\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactReportBytes,\n ),\n maxArtifactReportTotalBytes: boundedIntegerOption(\n '--max-report-total-bytes',\n opts.maxReportTotalBytes,\n MCP_ARTIFACT_STORE_LIMITS.maxArtifactReportTotalBytes,\n ),\n });\n const transport = new StdioServerTransport();\n let markDisconnected: () => void = () => undefined;\n const disconnected = new Promise<void>((resolve) => {\n markDisconnected = resolve;\n });\n const onInputClosed = (): void => markDisconnected();\n let exitSignal: 'SIGINT' | 'SIGTERM' | null = null;\n const onSigint = (): void => {\n exitSignal = 'SIGINT';\n markDisconnected();\n };\n const onSigterm = (): void => {\n exitSignal = 'SIGTERM';\n markDisconnected();\n };\n const previousTransportClose = transport.onclose;\n transport.onclose = () => {\n previousTransportClose?.();\n markDisconnected();\n };\n process.stdin.once('end', onInputClosed);\n process.stdin.once('close', onInputClosed);\n process.once('SIGINT', onSigint);\n process.once('SIGTERM', onSigterm);\n try {\n await server.connect(transport);\n if (process.stdin.readableEnded || process.stdin.destroyed) markDisconnected();\n await disconnected;\n } finally {\n process.stdin.off('end', onInputClosed);\n process.stdin.off('close', onInputClosed);\n process.off('SIGINT', onSigint);\n process.off('SIGTERM', onSigterm);\n await server.close();\n if (exitSignal === 'SIGINT') process.exitCode = 130;\n if (exitSignal === 'SIGTERM') process.exitCode = 143;\n }\n },\n );\n\nfunction boundedIntegerOption(name: string, value: string, maximum: number): number {\n const parsed = Number(value);\n if (!Number.isSafeInteger(parsed) || parsed < 1 || parsed > maximum) {\n throw new Error(`${name} must be an integer between 1 and ${maximum}`);\n }\n return parsed;\n}\n","/**\n * themes command — list all available squisq themes.\n */\n\nimport { Command } from 'commander';\n\nexport const themesCommand = new Command('themes')\n .description('List all available visual themes')\n .action(async () => {\n const { getAvailableThemes } = await import('@bendyline/squisq/schemas');\n const themes = getAvailableThemes();\n console.error('Available themes:\\n');\n for (const theme of themes) {\n process.stdout.write(`${theme}\\n`);\n }\n });\n","/**\n * transforms command — list all available transform styles.\n */\n\nimport { Command } from 'commander';\n\nexport const transformsCommand = new Command('transforms')\n .description('List all available transform styles')\n .action(async () => {\n const { getTransformStyleIds } = await import('@bendyline/squisq/transform');\n const styles = getTransformStyleIds();\n console.error('Available transform styles:\\n');\n for (const style of styles) {\n process.stdout.write(`${style}\\n`);\n }\n });\n","/**\n * parse command — parse a markdown file and print its structure as JSON.\n */\n\nimport { open } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport { Command } from 'commander';\nimport { decodeUtf8Text } from '@bendyline/docblocks/filesystem';\nimport { positiveLimit } from '../internal/limits.js';\n\nconst DEFAULT_MAX_PARSE_INPUT_BYTES = 20 * 1024 * 1024;\nconst DEFAULT_MAX_PARSE_OUTPUT_BYTES = 128 * 1024 * 1024;\n\nexport interface ParseOptions {\n /** Programmatic input budget; CLI callers use the safe default. */\n readonly maxInputBytes?: number;\n /** Programmatic JSON output budget; CLI callers use the safe default. */\n readonly maxOutputBytes?: number;\n}\n\nexport async function runParse(inputPath: string, options: ParseOptions = {}): Promise<string> {\n const resolvedInput = resolve(inputPath);\n const maxInputBytes = positiveLimit(\n options.maxInputBytes,\n DEFAULT_MAX_PARSE_INPUT_BYTES,\n 'parse input byte',\n );\n const maxOutputBytes = positiveLimit(\n options.maxOutputBytes,\n DEFAULT_MAX_PARSE_OUTPUT_BYTES,\n 'parse output byte',\n );\n const bytes = await readBoundedFile(resolvedInput, maxInputBytes);\n const content = decodeUtf8Text(bytes, { label: 'Parse input', path: resolvedInput });\n const { parseMarkdown } = await import('@bendyline/squisq/markdown');\n const markdownDoc = parseMarkdown(content);\n\n const stats = {\n headingCount: 0,\n paragraphCount: 0,\n blockCount: markdownDoc.children?.length ?? 0,\n };\n\n if (markdownDoc.children) {\n for (const node of markdownDoc.children) {\n if (node.type === 'heading') stats.headingCount += 1;\n if (node.type === 'paragraph') stats.paragraphCount += 1;\n }\n }\n\n const serialized = `${JSON.stringify({ stats, document: markdownDoc }, null, 2)}\\n`;\n const outputBytes = Buffer.byteLength(serialized, 'utf8');\n if (outputBytes > maxOutputBytes) {\n throw new Error(`Parse output exceeds the ${maxOutputBytes}-byte limit.`);\n }\n return serialized;\n}\n\nasync function readBoundedFile(inputPath: string, maxBytes: number): Promise<Buffer> {\n const handle = await open(inputPath, 'r');\n try {\n const info = await handle.stat();\n if (!info.isFile()) throw new Error(`Parse input is not a file: ${inputPath}`);\n if (info.size > maxBytes) throw new Error(`Parse input exceeds the ${maxBytes}-byte limit.`);\n\n const chunks: Buffer[] = [];\n let totalBytes = 0;\n while (true) {\n const chunk = Buffer.allocUnsafe(Math.min(64 * 1024, maxBytes + 1 - totalBytes));\n const { bytesRead } = await handle.read(chunk, 0, chunk.byteLength, null);\n if (bytesRead === 0) break;\n totalBytes += bytesRead;\n if (totalBytes > maxBytes) {\n throw new Error(`Parse input exceeds the ${maxBytes}-byte limit.`);\n }\n chunks.push(chunk.subarray(0, bytesRead));\n }\n return Buffer.concat(chunks, totalBytes);\n } finally {\n await handle.close();\n }\n}\n\nexport const parseCommand = new Command('parse')\n .description('Parse a markdown file and print its structure as JSON')\n .argument('<input>', 'Path to UTF-8 Markdown content')\n .action(async (inputPath: string) => {\n try {\n process.stdout.write(await runParse(inputPath));\n } catch (err: unknown) {\n const message = err instanceof Error ? err.message : String(err);\n console.error(`Error: ${message}`);\n process.exitCode = 1;\n }\n });\n"],"mappings":"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","names":["path","randomUUID","open","rm","join","path","throwIfAborted","resolve","sha256","lstat","link","open","realpath","rename","stat","path","createHash","randomUUID","MCP_WIRE_LIMITS","candidate","createHash","readFile","stat","path","require","createHash","MCP_WIRE_LIMITS","createHash","basename","extname","MCP_WIRE_LIMITS","decodeUtf8Text","throwIfAborted","path","parseMarkdown","markdownToDoc","MCP_WIRE_LIMITS","throwIfAborted","counts","createCliRegistry","warningCount","resolve","mkdtemp","readFile","rm","writeFile","tmpdir","basename","extname","join","DOCBLOCKS_MCP_WIRE_VERSION","throwIfAborted","PLAYER_BUNDLE","throwIfAborted","createCliRegistry","resolve","createHash","DOCBLOCKS_MCP_WIRE_VERSION","firstDuplicate","throwIfAborted","numericOption","DOCBLOCKS_MCP_WIRE_VERSION","MCP_WIRE_LIMITS","MCP_WIRE_LIMITS","parseConversionResult","throwIfAborted","theme","format","z","MCP_WIRE_LIMITS","DOCBLOCKS_MCP_TOOL_OUTPUT_SCHEMAS","READ_ONLY","z","document","resolve","Command","stat","path","path","path","stat","Command","realpath","stat","path","path","path","realpath","isMissingPathError","stat","address","port","resolve","Command","mkdir","open","opendir","realpath","stat","Command","throwIfAborted","mkdir","stat","realpath","opendir","open","markdownToDoc","Command","lstat","mkdir","dirname","basename","extname","resolve","Command","throwIfAborted","process","Command","createMcpServer","resolve","Command","Command","open","resolve","Command","decodeUtf8Text","resolve","decodeUtf8Text","parseMarkdown","open","Command","Command"]}
|