scribe-cms 0.0.20 → 0.0.22

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/field.ts","../src/core/introspect-schema.ts","../src/core/managed-roots.ts","../src/core/types.ts","../src/i18n/build-url.ts","../src/config/resolve-config.ts","../src/core/builtin-fields.ts","../src/storage/sqlite.ts","../src/storage/translations.ts","../src/translate/normalize-mdx-body.ts","../src/translate/sanitize-mdx-jsx.ts","../src/translate/validate-mdx-body.ts","../src/loader/resolve-assets.ts","../src/inline/tokens.ts","../src/inline/resolve-tokens.ts","../src/loader/normalize-en.ts","../src/loader/create-loader.ts","../src/i18n/resolve-document.ts","../src/create-project.ts","../src/core/alias-helpers.ts","../src/i18n/translation-index.ts","../src/redirects/redirect-schema.ts","../src/redirects/load-type-redirects.ts","../src/redirects/build-json-redirects.ts","../src/redirects/build-redirects.ts","../src/sitemap/join-base-url.ts","../src/sitemap/generate-sitemap.ts","../src/create-scribe.ts","../src/config/load-config.ts","../src/validate/validate-redirects.ts","../src/validate/validate-relations.ts","../src/validate/validate-assets.ts","../src/core/localized-slug.ts","../src/validate/validate-slug-suffix.ts","../src/validate/validate-inline-tokens.ts","../src/validate/validate-project.ts","../src/hash/page-hash.ts","../src/translate/worklist.ts","../src/storage/batch-jobs.ts","../src/history/record-snapshot.ts","../src/translate/retry.ts","../src/translate/gemini-batch.ts","../src/translate/gemini-models.ts","../src/translate/gemini-client.ts","../src/translate/gemini-pricing.ts","../src/translate/prompts/translation-prompt.ts","../src/translate/response-schema.ts","../src/translate/resolve-translate-config.ts","../src/translate/validate-translation.ts","../src/translate/translate-core.ts","../src/translate/batch-worklist.ts","../src/translate/page-translator.ts","../src/loader/parse-mdx.ts","../src/export/build-static-raw-exports.ts","../src/export/write-static-raw-exports.ts","../src/delete/plan.ts","../src/delete/execute.ts"],"names":["path","prefix","z","field","fs","valStart","localizedSlug","matter","options","listEnSlugs","isStringRecord","sleep","GoogleGenAI","results","totals"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\nimport type { z as Zod } from \"zod\";\n\nconst FIELD_KIND = Symbol.for(\"@genlook/scribe/fieldKind\");\nconst RELATION_META = Symbol.for(\"@genlook/scribe/relationMeta\");\nconst ASSET_META = Symbol.for(\"@genlook/scribe/assetMeta\");\n\nexport type FieldKind = \"translatable\" | \"structural\";\n\n/**\n * What happens to a document that references a target when that target is\n * deleted (see `docs/deletion.md`).\n * - `\"restrict\"` (default) — deletion of the target is blocked.\n * - `\"detach\"` — the reference is removed (dropped from arrays, optional single\n * relations cleared). A required single relation can never be detached.\n * - `\"cascade\"` — the referencing document is deleted too, recursively.\n */\nexport type OnTargetDelete = \"restrict\" | \"detach\" | \"cascade\";\n\n/** What happens to an asset file when its own document is deleted. Default `\"delete\"`. */\nexport type AssetOnDelete = \"delete\" | \"keep\";\n\nexport interface RelationMeta {\n typeId: string;\n multiple: boolean;\n optional: boolean;\n /** Cascade behavior applied when the referenced target is deleted. */\n onTargetDelete: OnTargetDelete;\n}\n\n/** Constraints carried by a `field.asset()` schema (see `docs/assets.md`). */\nexport interface AssetMeta {\n dir?: string;\n template?: string;\n formats?: string[];\n maxKB?: number;\n optional: boolean;\n /** Whether the file is removed when its document is deleted. Default `\"delete\"`. */\n onDelete: AssetOnDelete;\n}\n\n/**\n * Type-level brand carried by `field.relation()` schemas so the target\n * content-type id (and multiplicity/optionality) survive into `related()`.\n * Never exists at runtime.\n */\nexport declare const RELATION_BRAND: unique symbol;\n\nexport interface RelationBrand<\n TTarget extends string = string,\n TMultiple extends boolean = boolean,\n TOptional extends boolean = boolean,\n> {\n target: TTarget;\n multiple: TMultiple;\n optional: TOptional;\n}\n\n/** A Zod schema branded with relation metadata (see `field.relation()`). */\nexport type RelationField<\n TZod extends Zod.ZodTypeAny,\n TBrand extends RelationBrand,\n> = TZod & { [RELATION_BRAND]: TBrand };\n\n/** Return whether a Zod field is translatable or structural. */\nexport function getFieldKind(schema: Zod.ZodTypeAny): FieldKind {\n const tagged = schema as Zod.ZodTypeAny & { [FIELD_KIND]?: FieldKind };\n return tagged[FIELD_KIND] ?? \"structural\";\n}\n\n/** Return relation metadata if the field was created with `field.relation()`. */\nexport function getRelationTarget(schema: Zod.ZodTypeAny): RelationMeta | null {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const tagged = current as Zod.ZodTypeAny & {\n [RELATION_META]?: RelationMeta;\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny };\n };\n if (tagged[RELATION_META]) {\n return tagged[RELATION_META];\n }\n if (typeof tagged.unwrap === \"function\") {\n current = tagged.unwrap();\n continue;\n }\n if (typeof tagged.removeDefault === \"function\") {\n current = tagged.removeDefault();\n continue;\n }\n if (tagged._def?.innerType) {\n current = tagged._def.innerType;\n continue;\n }\n break;\n }\n return null;\n}\n\n/** Return asset metadata if the field was created with `field.asset()`. */\nexport function getAssetMeta(schema: Zod.ZodTypeAny): AssetMeta | null {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const tagged = current as Zod.ZodTypeAny & {\n [ASSET_META]?: AssetMeta;\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny };\n };\n if (tagged[ASSET_META]) {\n return tagged[ASSET_META];\n }\n if (typeof tagged.unwrap === \"function\") {\n current = tagged.unwrap();\n continue;\n }\n if (typeof tagged.removeDefault === \"function\") {\n current = tagged.removeDefault();\n continue;\n }\n if (tagged._def?.innerType) {\n current = tagged._def.innerType;\n continue;\n }\n break;\n }\n return null;\n}\n\nfunction mark<T extends Zod.ZodTypeAny>(schema: T, kind: FieldKind): T {\n Object.defineProperty(schema, FIELD_KIND, {\n value: kind,\n enumerable: false,\n configurable: true,\n });\n return schema;\n}\n\nfunction markRelation<T extends Zod.ZodTypeAny>(schema: T, meta: RelationMeta): T {\n Object.defineProperty(schema, RELATION_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n });\n return mark(schema, \"structural\");\n}\n\nfunction markAsset<T extends Zod.ZodTypeAny>(schema: T, meta: AssetMeta): T {\n Object.defineProperty(schema, ASSET_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n });\n return mark(schema, \"structural\");\n}\n\n/**\n * Options for `field.relation()`. Constraints live here (not as chained Zod\n * methods) because chaining clones the schema and would drop the relation\n * metadata.\n */\nexport interface RelationFieldOptions {\n /** The field holds an array of slugs instead of a single slug. */\n multiple?: boolean;\n /** The field may be omitted; `related()` then returns `null` (single) or `[]` (multiple). */\n optional?: boolean;\n /** Minimum item count (`multiple: true` only). */\n min?: number;\n /** Maximum item count (`multiple: true` only). */\n max?: number;\n /**\n * What happens to THIS document when the referenced target is deleted:\n * `\"restrict\"` (default), `\"detach\"`, or `\"cascade\"`. See `docs/deletion.md`.\n */\n onTargetDelete?: OnTargetDelete;\n}\n\n/**\n * Options for `field.asset()`. Constraints live here (not as chained Zod\n * methods) because chaining clones the schema and would drop the asset\n * metadata. See `docs/assets.md` for the full design.\n */\nexport interface AssetFieldOptions {\n /** Web-path prefix the value must live under (e.g. `\"/try-on/garments\"`). Also declares a managed root. */\n dir?: string;\n /**\n * Derived-path template, e.g. `\"/try-on/garments/{slug}/product.webp\"` —\n * `{slug}` is the entry's EN slug. When set, the frontmatter field may be\n * omitted entirely; the loader fills it. An explicit frontmatter value\n * overrides the template. Its static prefix counts as a managed root.\n */\n template?: string;\n /** Allowed extensions (lowercase, no dot). Violation = validation warning. */\n formats?: string[];\n /** File-size budget in kilobytes. Violation = validation warning. */\n maxKB?: number;\n /** The field may be absent (only meaningful without `template`). A present value whose file is missing is still an error. */\n optional?: boolean;\n /**\n * What happens to the file when its own document is deleted: `\"delete\"`\n * (default) or `\"keep\"`. A shared (non-templated) path is only removed when no\n * document outside the deletion set still references it. See `docs/deletion.md`.\n */\n onDelete?: AssetOnDelete;\n}\n\ntype Bool<T> = [T] extends [true] ? true : false;\n\n/**\n * Zod shape of a `field.asset()` schema: optional only when `optional` is set.\n *\n * A non-optional `template` field types as `ZodString` even though the runtime\n * schema tolerates an absent frontmatter value: the loader materializes the\n * templated path onto every document it serves (`resolveDocumentAssets` runs on\n * both EN and locale docs), so consumers always observe a `string`.\n */\nexport type AssetField<TOpts extends AssetFieldOptions = AssetFieldOptions> =\n Bool<TOpts[\"optional\"]> extends true ? Zod.ZodOptional<Zod.ZodString> : Zod.ZodString;\n\ntype RelationZod<TOpts extends RelationFieldOptions> =\n Bool<TOpts[\"optional\"]> extends true\n ? Zod.ZodOptional<\n Bool<TOpts[\"multiple\"]> extends true ? Zod.ZodArray<Zod.ZodString> : Zod.ZodString\n >\n : Bool<TOpts[\"multiple\"]> extends true\n ? Zod.ZodArray<Zod.ZodString>\n : Zod.ZodString;\n\ntype RelationFieldFor<\n TTarget extends string,\n TOpts extends RelationFieldOptions,\n> = RelationField<\n RelationZod<TOpts>,\n RelationBrand<TTarget, Bool<TOpts[\"multiple\"]>, Bool<TOpts[\"optional\"]>>\n>;\n\n/**\n * Mark Zod fields for Scribe:\n * - `translatable(schema)` — sent to the translator per locale.\n * - `structural(schema)` — EN-only; merged from EN into every locale document.\n * - `relation(typeId, options?)` — EN slug reference(s) to another content type,\n * validated by `scribe validate` and dereferenced via `scribe.<type>.related()`.\n * - `asset(options?)` — root-relative web path to a file under `assets.dir`,\n * validated by `scribe validate` and resolved to a served URL at load time.\n */\nexport const field = {\n translatable: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"translatable\"),\n structural: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"structural\"),\n relation: <const TTarget extends string, const TOpts extends RelationFieldOptions = {}>(\n typeId: TTarget,\n options?: TOpts,\n ): RelationFieldFor<TTarget, TOpts> => {\n const multiple = options?.multiple ?? false;\n const optional = options?.optional ?? false;\n if ((options?.min !== undefined || options?.max !== undefined) && !multiple) {\n throw new Error(\n `field.relation(\"${typeId}\"): min/max require { multiple: true }`,\n );\n }\n let inner: Zod.ZodTypeAny;\n if (multiple) {\n let arr = z.array(z.string().min(1));\n if (options?.min !== undefined) arr = arr.min(options.min);\n if (options?.max !== undefined) arr = arr.max(options.max);\n inner = arr;\n } else {\n inner = z.string().min(1);\n }\n const onTargetDelete = options?.onTargetDelete ?? \"restrict\";\n markRelation(inner, { typeId, multiple, optional, onTargetDelete });\n const schema = optional ? inner.optional() : inner;\n return schema as RelationFieldFor<TTarget, TOpts>;\n },\n asset: <const TOpts extends AssetFieldOptions = {}>(options?: TOpts): AssetField<TOpts> => {\n const optional = options?.optional ?? false;\n const inner = z.string().min(1);\n markAsset(inner, {\n dir: options?.dir,\n template: options?.template,\n formats: options?.formats,\n maxKB: options?.maxKB,\n optional,\n onDelete: options?.onDelete ?? \"delete\",\n });\n // A templated field may be omitted in frontmatter — the loader materializes it.\n const schema = optional || options?.template !== undefined ? inner.optional() : inner;\n return schema as AssetField<TOpts>;\n },\n};\n\n/** Strip Zod wrappers (optional, default, etc.) to reach the inner schema. */\nexport function unwrapSchema(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const anySchema = current as Zod.ZodTypeAny & {\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny; type?: string };\n };\n if (typeof anySchema.unwrap === \"function\") {\n current = anySchema.unwrap();\n continue;\n }\n if (typeof anySchema.removeDefault === \"function\") {\n current = anySchema.removeDefault();\n continue;\n }\n if (anySchema._def?.innerType) {\n current = anySchema._def.innerType;\n continue;\n }\n break;\n }\n return current;\n}\n\n/** Strip optional/default/nullable wrappers only — preserves arrays and objects. */\nexport function peelOptionalWrappers(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const type = (current as Zod.ZodTypeAny & { _def?: { type?: string } })._def?.type;\n if (type === \"optional\" || type === \"nullable\") {\n current = (current as Zod.ZodOptional<Zod.ZodTypeAny>).unwrap();\n continue;\n }\n if (type === \"default\") {\n current = (current as Zod.ZodDefault<Zod.ZodTypeAny>).removeDefault();\n continue;\n }\n break;\n }\n return current;\n}\n","import type { z } from \"zod\";\nimport {\n getAssetMeta,\n getFieldKind,\n getRelationTarget,\n peelOptionalWrappers,\n type AssetOnDelete,\n type OnTargetDelete,\n} from \"./field.js\";\nimport type { ContentTypeInput } from \"./types.js\";\n\nexport interface SchemaFieldMeta {\n path: string[];\n kind: \"translatable\" | \"structural\" | \"relation\" | \"asset\";\n relationTarget?: string;\n relationMultiple?: boolean;\n relationOptional?: boolean;\n /** Cascade behavior when the referenced target is deleted (relation fields). */\n relationOnTargetDelete?: OnTargetDelete;\n assetDir?: string;\n assetTemplate?: string;\n assetFormats?: string[];\n assetMaxKB?: number;\n assetOptional?: boolean;\n /** Whether the asset file is deleted with its document (asset fields). */\n assetOnDelete?: AssetOnDelete;\n}\n\nfunction getArrayElement(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n if (\n schema instanceof Object &&\n \"element\" in schema &&\n (schema as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return (schema as z.ZodArray<z.ZodTypeAny>).element as z.ZodTypeAny;\n }\n return null;\n}\n\n/**\n * List schema fields with translatable/structural/relation metadata.\n * Array-of-object fields recurse with a `*` path segment (`steps.*.title`) so\n * extraction and merging preserve the array shape. Note: `peelOptionalWrappers`\n * is used (not `unwrapSchema`) because zod v4 arrays expose `unwrap()`, which\n * would silently flatten the array level out of the paths.\n */\nexport function introspectSchema(schema: z.ZodTypeAny, prefix: string[] = []): SchemaFieldMeta[] {\n const relation = getRelationTarget(schema);\n if (relation && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"relation\",\n relationTarget: relation.typeId,\n relationMultiple: relation.multiple,\n relationOptional: relation.optional,\n relationOnTargetDelete: relation.onTargetDelete,\n },\n ];\n }\n\n const asset = getAssetMeta(schema);\n if (asset && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"asset\",\n assetDir: asset.dir,\n assetTemplate: asset.template,\n assetFormats: asset.formats,\n assetMaxKB: asset.maxKB,\n assetOptional: asset.optional,\n assetOnDelete: asset.onDelete,\n },\n ];\n }\n\n // An explicit translatable mark makes the whole subtree one translation unit\n // (e.g. field.translatable(z.array(z.string()))).\n if (prefix.length > 0 && getFieldKind(schema) === \"translatable\") {\n return [{ path: prefix, kind: \"translatable\" }];\n }\n\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n const shape = (base as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, key]));\n }\n return fields;\n }\n\n const element = getArrayElement(base);\n if (element) {\n const elementBase = peelOptionalWrappers(element);\n if (elementBase instanceof Object && \"shape\" in elementBase) {\n const shape = (elementBase as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, \"*\", key]));\n }\n return fields;\n }\n }\n\n return [{ path: prefix, kind: getFieldKind(schema) }];\n}\n\ninterface PathTrie {\n leaf: boolean;\n children: Map<string, PathTrie>;\n}\n\nfunction buildPathTrie(paths: string[][]): PathTrie {\n const root: PathTrie = { leaf: false, children: new Map() };\n for (const path of paths) {\n let node = root;\n for (const segment of path) {\n let child = node.children.get(segment);\n if (!child) {\n child = { leaf: false, children: new Map() };\n node.children.set(segment, child);\n }\n node = child;\n }\n node.leaf = true;\n }\n return root;\n}\n\nfunction extractNode(data: unknown, trie: PathTrie): unknown {\n if (trie.leaf) return data;\n\n const star = trie.children.get(\"*\");\n if (star) {\n if (!Array.isArray(data)) return undefined;\n // Preserve array length so structural/translatable halves merge per index.\n return data.map((item) =>\n typeof item === \"object\" && item !== null ? (extractNode(item, star) ?? {}) : {},\n );\n }\n\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) return undefined;\n const record = data as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const [key, child] of trie.children) {\n const value = extractNode(record[key], child);\n if (value !== undefined) {\n out[key] = value;\n any = true;\n }\n }\n return any ? out : undefined;\n}\n\nexport function extractByPaths(\n data: Record<string, unknown>,\n paths: string[][],\n): Record<string, unknown> {\n if (paths.length === 0) return {};\n const extracted = extractNode(data, buildPathTrie(paths));\n return extracted && typeof extracted === \"object\" && !Array.isArray(extracted)\n ? (extracted as Record<string, unknown>)\n : {};\n}\n\n/** Extract frontmatter fields marked as translatable. */\nexport function pickTranslatable(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const translatablePaths = introspectSchema(schema)\n .filter((f) => f.kind === \"translatable\")\n .map((f) => f.path);\n return extractByPaths(data, translatablePaths);\n}\n\n/**\n * Drop nested translatable output when the EN document has no matching structural\n * parent (e.g. model-hallucinated blog `itemList` on posts with no ItemList SEO).\n */\nexport function pruneOrphanNestedTranslations(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const out = { ...localeData };\n const structuralParentsWithNested = new Set<string>();\n for (const meta of introspectSchema(schema)) {\n if (meta.kind !== \"translatable\" || meta.path.length < 3 || meta.path[1] !== \"*\") continue;\n structuralParentsWithNested.add(meta.path[0]!);\n }\n for (const parent of structuralParentsWithNested) {\n const enParent = enData[parent];\n if (enParent === undefined || enParent === null) {\n delete out[parent];\n }\n }\n return out;\n}\n\n/** Extract frontmatter fields marked as structural (EN-only). */\nexport function pickStructural(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const structuralPaths = introspectSchema(schema)\n .filter((f) => f.kind === \"structural\" || f.kind === \"relation\" || f.kind === \"asset\")\n .map((f) => f.path);\n return extractByPaths(data, structuralPaths);\n}\n\n/** Merge EN structural fields onto a locale document's frontmatter at load time. */\nexport function mergeStructuralOntoLocale(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const structural = pickStructural(enData, schema);\n const translatable = pickTranslatable(localeData, schema);\n return deepMerge(structural, translatable);\n}\n\nfunction deepMerge(base: Record<string, unknown>, overlay: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(overlay)) {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n out[key] &&\n typeof out[key] === \"object\" &&\n !Array.isArray(out[key])\n ) {\n out[key] = deepMerge(out[key] as Record<string, unknown>, value as Record<string, unknown>);\n } else if (Array.isArray(value) && Array.isArray(out[key])) {\n out[key] = mergeArrayOverlay(out[key] as unknown[], value as unknown[]);\n } else if (value !== undefined) {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction mergeArrayOverlay(base: unknown[], overlay: unknown[]): unknown[] {\n return base.map((item, index) => {\n const overlayItem = overlay[index];\n if (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n overlayItem &&\n typeof overlayItem === \"object\" &&\n !Array.isArray(overlayItem)\n ) {\n return deepMerge(item as Record<string, unknown>, overlayItem as Record<string, unknown>);\n }\n return overlayItem ?? item;\n });\n}\n\n/** Collect the schema fields marked `field.translatable()`. */\nexport function listTranslatableFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"translatable\");\n}\n\n/**\n * Whether a content type has anything to translate. A type with a body is\n * always potentially translatable; a bodyless type (`body: false`) is\n * translatable only when at least one schema field is `field.translatable()`.\n *\n * The single source of truth for every translation workflow (worklist, staleness,\n * status counts, studio dashboards, store writes): a type for which this returns\n * `false` disappears from all of them.\n */\nexport function isTypeTranslatable(type: Pick<ContentTypeInput, \"schema\" | \"body\">): boolean {\n return listTranslatableFields(type.schema).length > 0 || type.body !== false;\n}\n\n/** Collect relation field paths and targets from a content schema. */\nexport function listRelationFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"relation\");\n}\n\n/** Collect asset field paths and constraints from a content schema. */\nexport function listAssetFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"asset\");\n}\n","import { listAssetFields } from \"./introspect-schema.js\";\nimport type { ScribeConfig } from \"./types.js\";\n\nfunction normalizeRoot(root: string): string {\n const trimmed = `/${root.replace(/^\\/+|\\/+$/g, \"\")}`;\n return trimmed === \"/\" ? \"\" : trimmed;\n}\n\n/**\n * Managed root implied by a template's static prefix: the substring up to the\n * first `{`, with the trailing partial path segment dropped.\n * `\"/try-on/garments/{slug}/product.webp\"` → `\"/try-on/garments\"`.\n */\nexport function templateManagedRoot(template: string): string {\n const braceIndex = template.indexOf(\"{\");\n const staticPart = braceIndex >= 0 ? template.slice(0, braceIndex) : template;\n const lastSlash = staticPart.lastIndexOf(\"/\");\n const prefix = lastSlash >= 0 ? staticPart.slice(0, lastSlash) : staticPart;\n return normalizeRoot(prefix);\n}\n\n/**\n * Set of Scribe-owned source roots (web paths) for the phase-2 audit layer;\n * files outside these roots are never reported or touched. Union of\n * `assets.managedDirs` and every asset field's `dir`/`template` prefix.\n * Deduped and sorted; empty when the asset system is disabled.\n */\nexport function getManagedRoots(config: ScribeConfig): string[] {\n // Managed roots are meaningful only when the asset system is enabled.\n if (!config.assets) return [];\n\n const roots = new Set<string>();\n\n for (const dir of config.assets.managedDirs ?? []) {\n const normalized = normalizeRoot(dir);\n if (normalized) roots.add(normalized);\n }\n\n for (const type of config.types) {\n for (const f of listAssetFields(type.schema)) {\n if (f.assetDir) {\n const normalized = normalizeRoot(f.assetDir);\n if (normalized) roots.add(normalized);\n }\n if (f.assetTemplate) {\n const normalized = templateManagedRoot(f.assetTemplate);\n if (normalized) roots.add(normalized);\n }\n }\n }\n\n return [...roots].sort();\n}\n","import type { z } from \"zod\";\nimport type { RELATION_BRAND, RelationBrand } from \"./field.js\";\n\n/**\n * How document slugs behave across locales.\n * - `\"fixed\"` — the EN slug is used for every locale.\n * - `\"localized\"` — each locale gets its own translated slug.\n */\nexport type SlugStrategy = \"localized\" | \"fixed\";\n\n/**\n * What `resolve()` returns when a locale has no translation for a slug.\n * - `\"en\"` — fall back to the default-locale document.\n * - `\"none\"` — return no document.\n */\nexport type IndexFallback = \"en\" | \"none\";\n\n/** Sort order for `list()`. Built-in keys sort by document metadata; pass a comparator for anything else. */\nexport type OrderBy<TDoc = ScribeDocument> =\n | \"slug\"\n | \"publishedAt\"\n | \"-publishedAt\"\n | \"updatedAt\"\n | \"-updatedAt\"\n | ((a: TDoc, b: TDoc) => number);\n\nexport interface CrossValidateContext {\n locale: string;\n defaultLocale: string;\n slug: string;\n enSlug: string;\n knownLocales: readonly string[];\n englishSlugs?: ReadonlySet<string>;\n}\n\nexport interface CrossValidateIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\n/** Named locale groups usable with `scribe translate --preset <name>`. */\nexport interface LocalePresets {\n active?: string[];\n ultraLight?: string[];\n [name: string]: string[] | undefined;\n}\n\n/** Derived fallback chains: locale → ordered locales tried before the default locale when the locale has no translation. */\nexport type LocaleFallbacks = Record<string, string[]>;\n\n/** How non-default locales appear in generated URLs. */\nexport type LocaleRoutingConfig =\n | { strategy: \"path-prefix\"; prefixDefaultLocale?: boolean }\n | { strategy: \"search-param\"; param: string };\n\n/** Per-content-type translation settings (merged over the project-level defaults). */\nexport interface TranslateConfig {\n /** Replace the default system prompt entirely. */\n prompt?: string;\n /** Brand/domain context prepended to every translation request. */\n context?: string;\n /** Extra rules appended to the default rules. */\n rules?: string[];\n /** Model override for this content type. */\n model?: string;\n}\n\n/** Project-level translation defaults. */\nexport interface ScribeTranslateDefaults {\n defaultModel?: string;\n prompt?: string;\n context?: string;\n rules?: string[];\n}\n\n/**\n * A content type declaration as written in `scribe.config.ts`.\n * Most fields are optional with sensible defaults — see each field's doc.\n */\nexport interface ContentTypeInput<TSchema extends z.ZodTypeAny = z.ZodTypeAny> {\n /** Unique id. Becomes the typed accessor (`scribe.<id>`) and the default `contentDir`. */\n id: string;\n /** Zod schema for the EN frontmatter. Mark fields with `field.translatable()/structural()/relation()`. */\n schema: TSchema;\n /** Directory under the project content dir holding this type's `.mdx` files. Default: the type `id`. */\n contentDir?: string;\n /** URL template for routable types, e.g. `/blog/{slug}`. Must contain exactly one `{slug}`. Omit for reference-only types. */\n path?: string;\n /** Human label (studio UI). Default: capitalized `id`. */\n label?: string;\n /** Default: `\"fixed\"`. */\n slugStrategy?: SlugStrategy;\n /** Default: `\"en\"` when the type has a `path`, otherwise `\"none\"`. */\n indexFallback?: IndexFallback;\n /** Default sort for `list()`. Default: `\"slug\"`. */\n orderBy?: OrderBy<ScribeDocument<z.infer<TSchema>>>;\n /**\n * Whether entries carry an MDX body. Default: `true`. Set `false` for\n * frontmatter-only reference types (e.g. structural `model`/`garment`\n * catalogs): the loader skips MDX body work, validation errors on any\n * non-empty body, translation payloads never include a body, and the studio\n * shows a \"frontmatter-only\" chip instead of a body section. Combined with a\n * schema that has no `field.translatable()` fields, the type is derived to be\n * non-translatable and drops out of every translation workflow. See\n * [Bodyless types](../../docs/bodyless-types.md).\n */\n body?: boolean;\n /** Custom validation across fields, run by `scribe validate`. */\n crossValidate?: (\n data: z.infer<TSchema>,\n ctx: CrossValidateContext,\n ) => CrossValidateIssue[];\n translate?: TranslateConfig;\n}\n\n/** A content type with all defaults applied (what runtimes and the CLI consume). */\nexport interface ContentTypeConfig<TSchema extends z.ZodTypeAny = z.ZodTypeAny>\n extends ContentTypeInput<TSchema> {\n contentDir: string;\n label: string;\n slugStrategy: SlugStrategy;\n indexFallback: IndexFallback;\n}\n\n/**\n * The `assets` config group. Passing `assets: {}` opts a project into the\n * asset system with defaults; without it (and without the deprecated\n * `assetsDir`), asset validation and loader resolution are skipped entirely.\n * See [Asset management](../../docs/assets.md).\n */\nexport interface AssetsConfigInput {\n /** Where source files live on disk, relative to `rootDir`. Default: `\"public\"`. */\n dir?: string;\n /**\n * URL prefix the frontend serves assets under — a path (`\"/\"`, `\"/static/\"`)\n * or an absolute origin (`\"https://cdn.example.com/\"`). Default: `\"/\"`.\n */\n publicPath?: string;\n /**\n * Extra Scribe-owned roots (web paths) not covered by any `field.asset()`\n * `dir`/`template` — e.g. directories referenced from MDX bodies. Used by the\n * future audit layer; files outside managed roots are never reported.\n */\n managedDirs?: string[];\n}\n\n/** Resolved `assets` group (absolute `assetsPath`, defaults applied). */\nexport interface ResolvedAssetsConfig {\n /** Absolute path to the static assets folder. */\n assetsPath: string;\n /** URL prefix served under (raw string; join via the loader helper). */\n publicPath: string;\n /** Extra Scribe-owned source roots (web paths) for the audit layer. */\n managedDirs: string[];\n}\n\n/** Options reserved for the future asset preprocessing pipeline. Phase 1 throws on any provided key. */\nexport interface AssetUrlOptions {}\n\n/**\n * The shape accepted by `defineConfig()` / `createScribe()`.\n * Relative paths (`contentDir`, `store`) resolve against `rootDir`.\n */\nexport interface ScribeConfigInput<\n TTypes extends readonly ContentTypeInput<any>[] = readonly ContentTypeInput[],\n> {\n /** Absolute project root (the directory holding `scribe.config.ts`). */\n rootDir: string;\n /** Directory containing the per-type content folders. Default: `\"content\"`. */\n contentDir?: string;\n /** Path to the SQLite translation store. Default: `\".scribe/store.sqlite\"`. Commit this file; do not gitignore `.scribe/`. */\n store?: string;\n /** Path to the static assets folder (e.g. Next.js `public`). Relative to project `rootDir`. When set, `scribe validate` warns on missing image files. @deprecated Use `assets.dir` instead. */\n assetsDir?: string;\n /** Asset system config (`{ dir, publicPath, managedDirs }`). Supersedes `assetsDir`. See [Asset management](../../docs/assets.md). */\n assets?: AssetsConfigInput;\n /** All locales, including the default one. */\n locales: string[];\n /** Canonical source locale. Must be in `locales`. Default: `\"en\"`. */\n defaultLocale?: string;\n /** How locale markers are applied to generated URLs. Default: path-prefix without default locale. */\n localeRouting?: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Enable automatic locale fallback chains derived from locale tags — e.g. `\"pt-BR\"` is served from `\"pt\"` (before the default locale) when it has no translation. Default: `true`. */\n localeFallbacks?: boolean;\n translate?: ScribeTranslateDefaults;\n types: TTypes;\n}\n\n/**\n * A fully resolved Scribe config (all defaults applied, paths absolute).\n * Note: `rootDir` here is the absolute **content** root, not the project root.\n */\nexport interface ScribeConfig {\n /** Absolute content root (project `rootDir` + `contentDir`). */\n rootDir: string;\n /** Absolute path to the SQLite translation store. */\n storePath: string;\n /** Absolute path to the static assets folder, when the asset system is enabled. Mirrors `assets.assetsPath` for back-compat (existing consumers read this). */\n assetsPath?: string;\n /** Resolved asset system config; `undefined` unless `assets`/`assetsDir` was set. */\n assets?: ResolvedAssetsConfig;\n locales: string[];\n defaultLocale: string;\n localeRouting: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Fallback chains derived from locale tags (`{}` when the feature is disabled). `resolveConfig` always populates this; optional so hand-built config literals can omit it. */\n localeFallbacks?: LocaleFallbacks;\n translate?: ScribeTranslateDefaults;\n types: ContentTypeConfig[];\n}\n\n/** A loaded document (EN file or stored translation). */\nexport interface ScribeDocument<TFrontmatter = Record<string, unknown>> {\n /** Slug in this document's locale (differs from `enSlug` for localized slugs). */\n slug: string;\n /** Slug of the EN (default-locale) parent. Equal to `slug` for EN documents. */\n enSlug: string;\n locale: string;\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Explicit EN frontmatter override for canonical URL path. */\n canonicalPathOverride?: string;\n frontmatter: TFrontmatter;\n content: string;\n filePath?: string;\n}\n\nexport interface LocaleIndex<TDoc = ScribeDocument> {\n bySlug: ReadonlyMap<string, TDoc>;\n byEnSlug: ReadonlyMap<string, TDoc>;\n}\n\nexport type AllDocuments<TDoc = ScribeDocument> = ReadonlyMap<string, LocaleIndex<TDoc>>;\n\n/** Result of `resolve()`: the document plus redirect/canonical routing data. */\nexport interface ResolvedDocument<TDoc = ScribeDocument> {\n document: TDoc | null;\n /** Locale actually served (differs from the requested locale on EN fallback). */\n actualLocale: string;\n /** 301 target when the slug is an alias or belongs to another locale. */\n shouldRedirectTo?: string;\n /** Locale-aware pathname when the type has `path` and a document was found. */\n canonicalPath?: string;\n}\n\n/** `{ locale, slug }` pairs for Next.js `generateStaticParams()`. */\nexport interface StaticParam {\n locale: string;\n slug: string;\n}\n\nexport interface ListOptions<TDoc = ScribeDocument> {\n /** Override the type's configured `orderBy` for this call. */\n orderBy?: OrderBy<TDoc>;\n limit?: number;\n}\n\n/** Untyped default for the `related()` field map. */\nexport type AnyRelatedMap = Record<string, ScribeDocument | ScribeDocument[] | null>;\n\n/**\n * Per-content-type runtime API.\n *\n * Reads: `list`, `get`, `resolve`. Routing: `staticParams`, `alternates`,\n * `translation`, `url`. Relations: `related`. Low-level escape hatch: `load`.\n */\nexport interface ContentTypeRuntime<\n TDoc extends ScribeDocument = ScribeDocument,\n TRelated extends Record<string, unknown> = AnyRelatedMap,\n> {\n id: string;\n config: ContentTypeConfig;\n\n /** All documents for a locale (default: the default locale), sorted by the type's `orderBy`. */\n list: (locale?: string, options?: ListOptions<TDoc>) => TDoc[];\n /** Exact slug lookup in one locale (default: the default locale). No fallback, no redirects. */\n get: (slug: string, locale?: string) => TDoc | null;\n /** Full resolution: aliases, cross-locale slug correction, EN fallback, redirects, canonical path. */\n resolve: (slug: string, locale: string) => ResolvedDocument<TDoc>;\n\n /** Every `{ locale, slug }` pair to prerender — one call in `generateStaticParams()`. */\n staticParams: (options?: { locales?: readonly string[] }) => StaticParam[];\n /** hreflang map: locale → relative path, for every locale with a translation (default locale always included). */\n alternates: (doc: TDoc) => Record<string, string>;\n /** The same document in another locale, or null when untranslated (callers typically do `?? doc`). */\n translation: (doc: TDoc, targetLocale: string) => TDoc | null;\n /** Pathname for a slug + locale from the type's `path` template. */\n url: (slug: string, locale: string) => string;\n\n /** Dereference a `field.relation()` frontmatter field into the target type's document(s). */\n related: <K extends keyof TRelated & string>(\n doc: TDoc,\n field: K,\n locale?: string,\n ) => TRelated[K];\n\n /** Low-level access to the full locale → index map. Prefer `list`/`get`/`resolve`. */\n load: () => AllDocuments<TDoc>;\n}\n\n/** Infer the document type from a content type declaration. */\nexport type InferDocFromTypeConfig<T extends ContentTypeInput<any>> = ScribeDocument<\n z.infer<T[\"schema\"]>\n>;\n\n/** Map content type id → document type from a config types tuple. */\nexport type InferDocMap<TTypes extends readonly ContentTypeInput<any>[]> = {\n [T in TTypes[number] as T[\"id\"]]: InferDocFromTypeConfig<T>;\n};\n\n/** Document map (id → ScribeDocument) from a config object type. */\nexport type ScribeDocs<C extends { types: readonly ContentTypeInput<any>[] }> = InferDocMap<\n C[\"types\"]\n>;\n\n/** Single doc type by content-type id. */\nexport type ScribeDocOf<\n C extends { types: readonly ContentTypeInput<any>[] },\n Id extends keyof ScribeDocs<C> & string,\n> = ScribeDocs<C>[Id];\n\ntype RelationBrandOf<TField> = TField extends {\n [RELATION_BRAND]: infer B extends RelationBrand<string, boolean, boolean>;\n}\n ? B\n : never;\n\n/** Top-level `field.relation()` fields of a schema, keyed by field name. */\nexport type RelationFieldsOf<TSchema extends z.ZodTypeAny> =\n TSchema extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape as [RelationBrandOf<Shape[K]>] extends [never]\n ? never\n : K]: RelationBrandOf<Shape[K]>;\n }\n : {};\n\ntype RelatedDoc<B, TDocMap> = B extends RelationBrand<\n infer TTarget,\n infer TMultiple,\n infer TOptional\n>\n ? TTarget extends keyof TDocMap\n ? TMultiple extends true\n ? Array<TDocMap[TTarget]>\n : TOptional extends true\n ? TDocMap[TTarget] | null\n : TDocMap[TTarget]\n : never\n : never;\n\n/** `related()` return types for a content type, derived from its schema's relation fields. */\nexport type RelatedMapFor<\n T extends ContentTypeInput<any>,\n TTypes extends readonly ContentTypeInput<any>[],\n> = {\n [K in keyof RelationFieldsOf<T[\"schema\"]> & string]: RelatedDoc<\n RelationFieldsOf<T[\"schema\"]>[K],\n InferDocMap<TTypes>\n >;\n};\n\n/**\n * The typed Scribe client returned by `createScribe()`.\n * Each content type id becomes a typed accessor: `scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …\n */\nexport type Scribe<TTypes extends readonly ContentTypeInput<any>[]> = {\n readonly [T in TTypes[number] as T[\"id\"]]: ContentTypeRuntime<\n InferDocFromTypeConfig<T>,\n RelatedMapFor<T, TTypes>\n >;\n} & {\n /** Sitemap entries (with hreflang alternates) for all routable types. */\n sitemap(\n options: import(\"../sitemap/types.js\").GenerateSitemapOptions,\n ): Promise<import(\"../sitemap/types.js\").SitemapEntry[]>;\n /** Asset URL helper: applies `assets.publicPath` to a root-relative web path. Escape hatch for MDX body images. */\n assets: { url(ref: string, opts?: AssetUrlOptions): string };\n /** The resolved config (defaults applied, paths absolute). */\n config: ScribeConfig;\n project: ScribeProject;\n getType: ScribeProject[\"getType\"];\n listTypes: ScribeProject[\"listTypes\"];\n listRoutableTypes: ScribeProject[\"listRoutableTypes\"];\n};\n\n/** Typed client type from a config object type (for app-side type aliases). */\nexport type ScribeClient<C extends { types: readonly ContentTypeInput<any>[] }> = Scribe<\n C[\"types\"]\n>;\n\n/** Untyped project engine (CLI, validation, studio). Prefer `createScribe()` in apps. */\nexport interface ScribeProject {\n config: ScribeConfig;\n rootDir: string;\n storePath: string;\n getType: (id: string) => ContentTypeRuntime;\n listTypes: () => ContentTypeRuntime[];\n /** Content types with a `path` template (public URLs, hreflang, sitemap). */\n listRoutableTypes: () => ContentTypeRuntime[];\n}\n\n/** Identity helper that preserves content-type id and schema inference. */\nexport function defineConfig<const TTypes extends readonly ContentTypeInput<any>[]>(\n config: ScribeConfigInput<TTypes>,\n): ScribeConfigInput<TTypes> {\n return config;\n}\n\n/** Identity helper for a single content type entry. */\nexport function defineContentType<\n const TId extends string,\n TSchema extends z.ZodTypeAny,\n>(\n config: ContentTypeInput<TSchema> & { id: TId },\n): ContentTypeInput<TSchema> & { id: TId } {\n return config;\n}\n","import type { ContentTypeConfig, LocaleRoutingConfig, ScribeConfig } from \"../core/types.js\";\n\nconst SLUG_PLACEHOLDER = \"{slug}\";\n\n/** Whether a content type has a public URL path template. */\nexport function isRoutableType(type: Pick<ContentTypeConfig, \"path\">): boolean {\n return typeof type.path === \"string\" && type.path.length > 0;\n}\n\n/** Validate path template at project init. */\nexport function assertValidPathTemplate(path: string, typeId: string): void {\n if (!path.startsWith(\"/\")) {\n throw new Error(`Content type \"${typeId}\": path must start with / (got \"${path}\")`);\n }\n const count = (path.match(/\\{slug\\}/g) ?? []).length;\n if (count !== 1) {\n throw new Error(\n `Content type \"${typeId}\": path must contain exactly one {slug} (got \"${path}\")`,\n );\n }\n}\n\n/** Segment before `{slug}` in the template, e.g. `/blog/` from `/blog/{slug}`. */\nexport function pathPrefix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(0, idx);\n}\n\n/** Segment after `{slug}` in the template, e.g. `/advanced` from `/blog/{slug}/advanced`. */\nexport function pathSuffix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(idx + SLUG_PLACEHOLDER.length);\n}\n\nfunction resolveDefaultLocaleRouting(): LocaleRoutingConfig {\n return { strategy: \"path-prefix\", prefixDefaultLocale: false };\n}\n\nfunction splitPathAndSearch(pathname: string): { pathname: string; search: string } {\n const q = pathname.indexOf(\"?\");\n if (q === -1) return { pathname, search: \"\" };\n return { pathname: pathname.slice(0, q), search: pathname.slice(q) };\n}\n\nexport interface UrlBuilder {\n defaultLocale: string;\n locales: readonly string[];\n localeRouting: LocaleRoutingConfig;\n /** Locales that receive a non-default locale marker in generated URLs. */\n prefixedLocales: string[];\n resolvePath: (template: string, slug: string, locale: string) => string;\n extractSlugFromResolvedPath: (template: string, resolvedPath: string) => string | null;\n /** Apply locale routing to an already-resolved pathname (e.g. canonicalPath override). */\n applyLocaleToPath: (pathname: string, locale: string) => string;\n}\n\n/** Create a locale-aware URL builder from a resolved Scribe config. */\nexport function createUrlBuilder(config: Pick<ScribeConfig, \"locales\" | \"defaultLocale\" | \"localeRouting\">): UrlBuilder {\n const localeRouting = config.localeRouting ?? resolveDefaultLocaleRouting();\n const defaultLocale = config.defaultLocale;\n const prefixedLocales =\n localeRouting.strategy === \"path-prefix\"\n ? localeRouting.prefixDefaultLocale\n ? [...config.locales]\n : config.locales.filter((locale) => locale !== defaultLocale)\n : config.locales.filter((locale) => locale !== defaultLocale);\n\n function applyLocaleToPath(pathname: string, locale: string): string {\n if (locale === defaultLocale) {\n if (localeRouting.strategy === \"path-prefix\" && localeRouting.prefixDefaultLocale) {\n return `/${defaultLocale}${pathname}`;\n }\n return pathname;\n }\n\n if (localeRouting.strategy === \"search-param\") {\n const { pathname: base, search } = splitPathAndSearch(pathname);\n const params = new URLSearchParams(search.startsWith(\"?\") ? search.slice(1) : search);\n params.set(localeRouting.param, locale);\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n return `/${locale}${pathname}`;\n }\n\n function resolvePath(template: string, slug: string, locale: string): string {\n const relative = template.replace(SLUG_PLACEHOLDER, slug);\n return applyLocaleToPath(relative, locale);\n }\n\n function extractSlugFromResolvedPath(template: string, resolvedPath: string): string | null {\n let pathname = resolvedPath;\n if (localeRouting.strategy === \"search-param\") {\n pathname = splitPathAndSearch(resolvedPath).pathname;\n } else if (localeRouting.strategy === \"path-prefix\") {\n for (const locale of config.locales) {\n if (locale === defaultLocale && !localeRouting.prefixDefaultLocale) continue;\n const prefix = `/${locale}`;\n if (pathname === prefix || pathname.startsWith(`${prefix}/`)) {\n pathname = pathname.slice(prefix.length) || \"/\";\n break;\n }\n }\n }\n\n const prefix = pathPrefix(template);\n const suffix = pathSuffix(template);\n if (!pathname.startsWith(prefix)) return null;\n if (suffix && !pathname.endsWith(suffix)) return null;\n const slugEnd = suffix ? pathname.length - suffix.length : pathname.length;\n const slug = pathname.slice(prefix.length, slugEnd);\n return slug.length > 0 ? slug : null;\n }\n\n return {\n defaultLocale,\n locales: config.locales,\n localeRouting,\n prefixedLocales,\n resolvePath,\n extractSlugFromResolvedPath,\n applyLocaleToPath,\n };\n}\n\n/** Build a locale-aware pathname from a path template and slug. */\nexport function resolvePath(\n template: string,\n slug: string,\n locale: string,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const builder = createUrlBuilder({\n locales: [defaultLocale, ...(locale !== defaultLocale ? [locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.resolvePath(template, slug, locale);\n}\n\n/** Extract slug from a resolved path that matches the template. */\nexport function extractSlugFromResolvedPath(\n template: string,\n resolvedPath: string,\n localeRouting?: LocaleRoutingConfig,\n): string | null {\n const builder = createUrlBuilder({\n locales: [],\n defaultLocale: \"en\",\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.extractSlugFromResolvedPath(template, resolvedPath);\n}\n","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\n LocaleFallbacks,\n ResolvedAssetsConfig,\n ScribeConfig,\n ScribeConfigInput,\n} from \"../core/types.js\";\nimport { assertValidPathTemplate } from \"../i18n/build-url.js\";\n\nconst RESOLVED = Symbol.for(\"@genlook/scribe/resolvedConfig\");\n\n/** Whether a config object has already been normalized by `resolveConfig()`. */\nexport function isResolvedConfig(config: unknown): config is ScribeConfig {\n return (\n typeof config === \"object\" &&\n config !== null &&\n (config as Record<symbol, unknown>)[RESOLVED] === true\n );\n}\n\n/**\n * Normalize a user config: apply defaults, make paths absolute, and validate\n * invariants. Every entry point (`createScribe`, the CLI's `loadConfigSync`)\n * must pass configs through here so runtimes never see partial configs.\n *\n * @param baseDir directory used to resolve a relative `rootDir`\n * (the config file's directory for the CLI; `process.cwd()` otherwise).\n */\nexport function resolveConfig(\n input: ScribeConfigInput<any> | ScribeConfig,\n baseDir?: string,\n): ScribeConfig {\n if (isResolvedConfig(input)) return input;\n const raw = input as ScribeConfigInput;\n\n if (!raw.rootDir) {\n throw new Error(\"scribe config: rootDir is required\");\n }\n if (!raw.locales || raw.locales.length === 0) {\n throw new Error(\"scribe config: locales must be a non-empty array\");\n }\n const defaultLocale = raw.defaultLocale ?? \"en\";\n if (!raw.locales.includes(defaultLocale)) {\n throw new Error(\n `scribe config: defaultLocale \"${defaultLocale}\" is not in locales [${raw.locales.join(\", \")}]`,\n );\n }\n\n const localeRouting = raw.localeRouting ?? {\n strategy: \"path-prefix\" as const,\n prefixDefaultLocale: false,\n };\n if (localeRouting.strategy === \"search-param\" && !localeRouting.param) {\n throw new Error('scribe config: localeRouting search-param requires a \"param\" name');\n }\n\n const localeFallbacks =\n raw.localeFallbacks === false\n ? {}\n : deriveLocaleFallbacks(raw.locales, defaultLocale);\n\n const projectRoot = path.resolve(baseDir ?? process.cwd(), raw.rootDir);\n const contentRoot = path.resolve(projectRoot, raw.contentDir ?? \"content\");\n const storePath = path.resolve(projectRoot, raw.store ?? \".scribe/store.sqlite\");\n\n // The asset system is opt-in: enabled only when `assets` or the deprecated\n // `assetsDir` is set. When enabled, `assets` wins over `assetsDir`, and dir /\n // publicPath / managedDirs default to \"public\" / \"/\" / []. Left off entirely,\n // both `assetsPath` and `assets` stay undefined so no asset validation runs.\n let assetsPath: string | undefined;\n let assets: ResolvedAssetsConfig | undefined;\n if (raw.assets !== undefined || raw.assetsDir !== undefined) {\n const dir = raw.assets?.dir ?? raw.assetsDir ?? \"public\";\n const publicPath = raw.assets?.publicPath ?? \"/\";\n const managedDirs = raw.assets?.managedDirs ?? [];\n assetsPath = path.resolve(projectRoot, dir);\n assets = { assetsPath, publicPath, managedDirs };\n }\n\n const seenIds = new Set<string>();\n const types: ContentTypeConfig[] = raw.types.map((type) => {\n if (seenIds.has(type.id)) {\n throw new Error(`scribe config: duplicate content type id \"${type.id}\"`);\n }\n seenIds.add(type.id);\n if (type.path) {\n assertValidPathTemplate(type.path, type.id);\n }\n return {\n ...type,\n contentDir: type.contentDir ?? type.id,\n label: type.label ?? type.id.charAt(0).toUpperCase() + type.id.slice(1),\n slugStrategy: type.slugStrategy ?? \"fixed\",\n indexFallback: type.indexFallback ?? (type.path ? \"en\" : \"none\"),\n // `body` defaults to true (fully backwards compatible). A resolved type\n // always carries an explicit boolean so consumers read one source of truth.\n body: type.body ?? true,\n };\n });\n\n const config: ScribeConfig = {\n rootDir: contentRoot,\n storePath,\n assetsPath,\n assets,\n locales: [...raw.locales],\n defaultLocale,\n localeRouting,\n localePresets: raw.localePresets,\n localeFallbacks,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n\n/**\n * Derive fallback chains from locale tags: each locale falls back to its\n * successively shorter tag prefixes (longest first) that are themselves\n * configured, e.g. `\"zh-Hant-TW\"` → `[\"zh-Hant\", \"zh\"]`. Prefix matching is\n * case-insensitive (BCP-47 casing varies); chains store the configured\n * spelling. The default locale is excluded — it stays the implicit final\n * fallback so `indexFallback: \"none\"` keeps its meaning.\n */\nfunction deriveLocaleFallbacks(\n locales: readonly string[],\n defaultLocale: string,\n): LocaleFallbacks {\n const byLowercase = new Map(locales.map((l) => [l.toLowerCase(), l]));\n const fallbacks: LocaleFallbacks = {};\n for (const locale of locales) {\n const subtags = locale.split(\"-\");\n if (subtags.length < 2) continue;\n const chain: string[] = [];\n for (let end = subtags.length - 1; end >= 1; end--) {\n const prefix = byLowercase.get(subtags.slice(0, end).join(\"-\").toLowerCase());\n if (prefix && prefix !== locale && prefix !== defaultLocale) {\n chain.push(prefix);\n }\n }\n if (chain.length > 0) {\n fallbacks[locale] = chain;\n }\n }\n return fallbacks;\n}\n","import { z } from \"zod\";\nimport { createUrlBuilder, pathPrefix, pathSuffix } from \"../i18n/build-url.js\";\nimport type { ContentTypeConfig, LocaleRoutingConfig, ScribeDocument } from \"./types.js\";\n\nexport const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport const slugPatternSchema = z\n .string()\n .regex(SLUG_PATTERN, \"slug must be lowercase-kebab-case\");\n\nexport const isoDateSchema = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]*)?$/, \"Use ISO date YYYY-MM-DD or full ISO 8601\");\n\nconst canonicalPathSchema = z.string().regex(/^\\//, \"canonicalPath must start with /\");\n\nexport interface BuiltinEnFields {\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Set only when explicitly provided in EN frontmatter. */\n canonicalPathOverride?: string;\n /**\n * Reserved `vars` map: an optional `Record<string, string>` any entry may\n * carry WITHOUT declaring it in the type schema. Read by `${{var:key}}` inline\n * tokens; never translated (it is not a schema field). Kept verbatim (even\n * when malformed) so `scribe validate` can flag a non-string-record shape.\n */\n vars?: Record<string, string>;\n}\n\nexport interface BuiltinParseIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\nconst LOCALE_BUILTIN_KEYS: Array<[string, string]> = [\n [\"publishedAt\", \"publishedAt is EN-only; inherited from the EN parent at load time\"],\n [\"updatedAt\", \"updatedAt is EN-only; inherited from the EN parent at load time\"],\n [\"noindex\", \"noindex is EN-only; inherited from the EN parent at load time\"],\n [\"canonicalPath\", \"canonicalPath is EN-only; inherited from the EN parent at load time\"],\n [\"aliases\", \"aliases is EN-only; remove from locale translation\"],\n [\"redirect_to\", \"redirect_to is EN-only; remove from locale translation\"],\n [\"translationOf\", \"translationOf is internal; remove from locale translation\"],\n [\"enSlug\", \"enSlug is internal; remove from locale translation\"],\n];\n\nconst DEPRECATED_REDIRECT_FIELDS: Array<[string, string]> = [\n [\n \"aliases\",\n \"aliases frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n [\n \"redirect_to\",\n \"redirect_to frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n];\n\n/** Extract built-in EN frontmatter (dates, SEO) before Zod validation. */\nexport function extractBuiltinEnFields(\n data: Record<string, unknown>,\n _pathTemplate: string | undefined,\n _enSlug: string,\n _defaultLocale: string,\n): {\n builtin: BuiltinEnFields;\n rest: Record<string, unknown>;\n issues: BuiltinParseIssue[];\n} {\n const issues: BuiltinParseIssue[] = [];\n const rest = { ...data };\n\n for (const [field, message] of DEPRECATED_REDIRECT_FIELDS) {\n if (rest[field] !== undefined) {\n issues.push({ field, message, level: \"error\" });\n delete rest[field];\n }\n }\n\n let publishedAt: string | undefined;\n if (rest.publishedAt !== undefined && rest.publishedAt !== null && rest.publishedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.publishedAt);\n if (parsed.success) {\n publishedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"publishedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.publishedAt;\n }\n\n let updatedAt: string | undefined;\n if (rest.updatedAt !== undefined && rest.updatedAt !== null && rest.updatedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.updatedAt);\n if (parsed.success) {\n updatedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"updatedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.updatedAt;\n } else if (publishedAt) {\n updatedAt = publishedAt;\n }\n\n let noindex = false;\n if (rest.noindex !== undefined && rest.noindex !== null && rest.noindex !== \"\") {\n if (typeof rest.noindex === \"boolean\") {\n noindex = rest.noindex;\n } else {\n issues.push({ field: \"noindex\", message: \"noindex must be a boolean\", level: \"error\" });\n }\n delete rest.noindex;\n }\n\n let canonicalPathOverride: string | undefined;\n if (rest.canonicalPath !== undefined && rest.canonicalPath !== null && rest.canonicalPath !== \"\") {\n const parsed = canonicalPathSchema.safeParse(rest.canonicalPath);\n if (parsed.success) {\n canonicalPathOverride = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"canonicalPath\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.canonicalPath;\n }\n\n for (const internalKey of [\"translationOf\", \"enSlug\"] as const) {\n if (rest[internalKey] !== undefined) {\n issues.push({\n field: internalKey,\n message: `${internalKey} is managed internally by Scribe; remove from frontmatter`,\n level: \"warning\",\n });\n delete rest[internalKey];\n }\n }\n\n // Reserved `vars` map: pulled out before Zod validation so a schema (strict or\n // not) never rejects or strips it. Kept verbatim — even a malformed value —\n // so the inline-token validation pass can report a bad shape.\n let vars: Record<string, string> | undefined;\n if (rest.vars !== undefined) {\n vars = rest.vars as Record<string, string>;\n delete rest.vars;\n }\n\n return {\n builtin: {\n publishedAt,\n updatedAt,\n noindex,\n canonicalPathOverride,\n vars,\n },\n rest,\n issues,\n };\n}\n\n/** Reject built-in keys on locale translation frontmatter. */\nexport function validateLocaleBuiltinFields(data: Record<string, unknown>): BuiltinParseIssue[] {\n const issues: BuiltinParseIssue[] = [];\n for (const [key, message] of LOCALE_BUILTIN_KEYS) {\n if (data[key] !== undefined) {\n issues.push({ field: key, message, level: \"error\" });\n }\n }\n return issues;\n}\n\n/** ISO date for sitemap lastmod from updatedAt or publishedAt. */\nexport function documentLastModified(doc: {\n updatedAt?: string;\n publishedAt?: string;\n}): string | undefined {\n const raw = doc.updatedAt ?? doc.publishedAt;\n if (!raw) return undefined;\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\n/** Locale-aware pathname for a document. */\nexport function resolveCanonicalPathname(\n type: Pick<ContentTypeConfig, \"path\">,\n doc: Pick<ScribeDocument, \"slug\" | \"locale\" | \"canonicalPathOverride\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, ...(doc.locale !== defaultLocale ? [doc.locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n if (doc.canonicalPathOverride) {\n return urlBuilder.applyLocaleToPath(doc.canonicalPathOverride, doc.locale);\n }\n if (!type.path) return `/${doc.slug}`;\n return urlBuilder.resolvePath(type.path, doc.slug, doc.locale);\n}\n\n/** Hydrate locale frontmatter with EN-only built-in fields at load time. */\nexport function mergeBuiltinsIntoFrontmatter(\n frontmatter: Record<string, unknown>,\n doc: Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\" | \"slug\" | \"locale\"\n > & { vars?: Record<string, string> },\n type: Pick<ContentTypeConfig, \"path\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): Record<string, unknown> {\n const out = { ...frontmatter };\n if (doc.publishedAt !== undefined) out.publishedAt = doc.publishedAt;\n if (doc.updatedAt !== undefined) out.updatedAt = doc.updatedAt;\n out.noindex = doc.noindex;\n out.canonicalPath = resolveCanonicalPathname(type, doc, defaultLocale, localeRouting);\n // The reserved `vars` map rides only on EN documents (its single source of\n // truth); locale documents read it from their EN parent at token-fill time.\n if (doc.vars !== undefined) out.vars = doc.vars;\n return out;\n}\n\nexport function seoFieldsFromEn(enDoc: ScribeDocument): Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\"\n> {\n return {\n publishedAt: enDoc.publishedAt,\n updatedAt: enDoc.updatedAt,\n noindex: enDoc.noindex,\n canonicalPathOverride: enDoc.canonicalPathOverride,\n };\n}\n\nexport { pathPrefix, pathSuffix };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\n\nconst SCHEMA_VERSION = 5;\n\nconst MIGRATIONS: string[] = [\n `CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )`,\n `CREATE TABLE IF NOT EXISTS translations (\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n slug TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n translated_at TEXT NOT NULL,\n model TEXT NOT NULL,\n PRIMARY KEY (content_type, en_slug, locale)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_translations_type_locale\n ON translations(content_type, locale)`,\n `CREATE TABLE IF NOT EXISTS slug_aliases (\n content_type TEXT NOT NULL,\n canonical_en_slug TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_slug_aliases_canonical\n ON slug_aliases(content_type, canonical_en_slug)`,\n `CREATE TABLE IF NOT EXISTS alias_locale_slugs (\n content_type TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n locale_slug TEXT NOT NULL,\n captured_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug, locale)\n )`,\n `CREATE TABLE IF NOT EXISTS en_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n created_at TEXT NOT NULL,\n UNIQUE (content_type, en_slug, en_hash)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_en_snapshots_lookup\n ON en_snapshots(content_type, en_slug, created_at DESC)`,\n `CREATE TABLE IF NOT EXISTS translation_batch_jobs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n job_name TEXT NOT NULL UNIQUE,\n model TEXT NOT NULL,\n display_model TEXT NOT NULL,\n created_at TEXT NOT NULL,\n state TEXT NOT NULL,\n completed_at TEXT\n )`,\n `CREATE TABLE IF NOT EXISTS translation_batch_items (\n job_id INTEGER NOT NULL,\n request_index INTEGER NOT NULL,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n snapshot_id INTEGER NOT NULL,\n status TEXT NOT NULL,\n error TEXT,\n PRIMARY KEY (job_id, request_index)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_batch_items_status\n ON translation_batch_items(status)`,\n];\n\nexport type SqliteMode = \"readonly\" | \"readwrite\";\n\n/** Absolute path to the SQLite translation store (precomputed by `resolveConfig`). */\nexport function resolveStorePath(config: ScribeConfig): string {\n return config.storePath;\n}\n\n/** Open the SQLite translation store (creates schema if missing). */\nexport function openStore(config: ScribeConfig, mode: SqliteMode = \"readwrite\"): Database.Database {\n const storePath = resolveStorePath(config);\n if (mode === \"readwrite\") {\n fs.mkdirSync(path.dirname(storePath), { recursive: true });\n }\n const db = new Database(storePath, { readonly: mode === \"readonly\" });\n if (mode === \"readwrite\") {\n migrate(db);\n }\n return db;\n}\n\nfunction addColumnIfMissing(\n db: Database.Database,\n table: string,\n column: string,\n ddlType: string,\n): void {\n const columns = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!columns.some((c) => c.name === column)) {\n db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${ddlType}`);\n }\n}\n\nfunction readSchemaVersion(db: Database.Database): number {\n const metaTable = db\n .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'meta'`)\n .get();\n if (!metaTable) return 0;\n const row = db.prepare(`SELECT value FROM meta WHERE key = 'schema_version'`).get() as\n | { value: string }\n | undefined;\n return row ? Number.parseInt(row.value, 10) || 0 : 0;\n}\n\nfunction migrate(db: Database.Database): void {\n const previousVersion = readSchemaVersion(db);\n\n for (const sql of MIGRATIONS) {\n db.exec(sql);\n }\n\n if (previousVersion < 4) {\n db.exec(`DROP TABLE IF EXISTS revisions`);\n }\n\n addColumnIfMissing(db, \"translations\", \"snapshot_id\", \"INTEGER\");\n\n db.prepare(\n `INSERT INTO meta(key, value) VALUES('schema_version', ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`,\n ).run(String(SCHEMA_VERSION));\n}\n\nexport function closeStore(db: Database.Database): void {\n db.close();\n}\n","import type Database from \"better-sqlite3\";\n\nexport interface TranslationRow {\n content_type: string;\n en_slug: string;\n locale: string;\n slug: string;\n frontmatter_json: string;\n body: string;\n en_hash: string;\n translated_at: string;\n model: string;\n snapshot_id: number | null;\n}\n\nexport interface TranslationInput {\n contentType: string;\n enSlug: string;\n locale: string;\n slug: string;\n frontmatter: Record<string, unknown>;\n body: string;\n enHash: string;\n translatedAt: string;\n model: string;\n snapshotId: number;\n}\n\nexport interface EnSnapshotInput {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n createdAt: string;\n}\n\nexport interface EnSnapshotRow {\n id: number;\n content_type: string;\n en_slug: string;\n en_hash: string;\n frontmatter_json: string;\n body: string;\n created_at: string;\n}\n\nexport interface EnSnapshotWithLocales extends EnSnapshotRow {\n locales: string;\n}\n\nexport function getOrCreateEnSnapshot(db: Database.Database, input: EnSnapshotInput): number {\n db.prepare(\n `INSERT OR IGNORE INTO en_snapshots (\n content_type, en_slug, en_hash, frontmatter_json, body, created_at\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n input.contentType,\n input.enSlug,\n input.enHash,\n JSON.stringify(input.frontmatter),\n input.body,\n input.createdAt,\n );\n\n const row = db\n .prepare(\n `SELECT id FROM en_snapshots\n WHERE content_type = ? AND en_slug = ? AND en_hash = ?`,\n )\n .get(input.contentType, input.enSlug, input.enHash) as { id: number };\n\n return row.id;\n}\n\nexport function getEnSnapshot(\n db: Database.Database,\n snapshotId: number,\n): EnSnapshotRow | undefined {\n return db\n .prepare(`SELECT * FROM en_snapshots WHERE id = ?`)\n .get(snapshotId) as EnSnapshotRow | undefined;\n}\n\nexport function listEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): EnSnapshotWithLocales[] {\n return db\n .prepare(\n `SELECT s.*, GROUP_CONCAT(t.locale) AS locales\n FROM en_snapshots s\n LEFT JOIN translations t ON t.snapshot_id = s.id\n WHERE s.content_type = ? AND s.en_slug = ?\n GROUP BY s.id\n ORDER BY s.created_at DESC, s.id DESC`,\n )\n .all(contentType, enSlug) as EnSnapshotWithLocales[];\n}\n\nexport function upsertTranslation(db: Database.Database, input: TranslationInput): void {\n db.prepare(\n `INSERT INTO translations (\n content_type, en_slug, locale, slug, frontmatter_json, body, en_hash, translated_at, model, snapshot_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(content_type, en_slug, locale) DO UPDATE SET\n slug = excluded.slug,\n frontmatter_json = excluded.frontmatter_json,\n body = excluded.body,\n en_hash = excluded.en_hash,\n translated_at = excluded.translated_at,\n model = excluded.model,\n snapshot_id = excluded.snapshot_id`,\n ).run(\n input.contentType,\n input.enSlug,\n input.locale,\n input.slug,\n JSON.stringify(input.frontmatter),\n input.body,\n input.enHash,\n input.translatedAt,\n input.model,\n input.snapshotId,\n );\n}\n\nexport function getTranslation(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n locale: string,\n): TranslationRow | undefined {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? AND locale = ?`,\n )\n .get(contentType, enSlug, locale) as TranslationRow | undefined;\n}\n\nexport function listTranslationsForType(\n db: Database.Database,\n contentType: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? ORDER BY en_slug, locale`)\n .all(contentType) as TranslationRow[];\n}\n\nexport function listTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): TranslationRow[] {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? ORDER BY locale`,\n )\n .all(contentType, enSlug) as TranslationRow[];\n}\n\nexport function listTranslationsForLocale(\n db: Database.Database,\n contentType: string,\n locale: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? AND locale = ? ORDER BY en_slug`)\n .all(contentType, locale) as TranslationRow[];\n}\n\nexport function bulkLoadTranslations(db: Database.Database): TranslationRow[] {\n return db.prepare(`SELECT * FROM translations ORDER BY content_type, en_slug, locale`).all() as TranslationRow[];\n}\n\nexport function countTranslations(db: Database.Database): number {\n const row = db.prepare(`SELECT COUNT(*) as count FROM translations`).get() as { count: number };\n return row.count;\n}\n\nexport function countTranslationsByLocale(\n db: Database.Database,\n): Array<{ locale: string; count: number }> {\n return db\n .prepare(\n `SELECT locale, COUNT(*) as count FROM translations GROUP BY locale ORDER BY locale`,\n )\n .all() as Array<{ locale: string; count: number }>;\n}\n\nexport function latestTranslationAtByLocale(\n db: Database.Database,\n): Array<{ locale: string; latest: string }> {\n return db\n .prepare(\n `SELECT locale, MAX(translated_at) as latest FROM translations GROUP BY locale`,\n )\n .all() as Array<{ locale: string; latest: string }>;\n}\n\n/** Count translation rows for a single EN document (across every locale). */\nexport function countTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM translations WHERE content_type = ? AND en_slug = ?`,\n )\n .get(contentType, enSlug) as { count: number };\n return row.count;\n}\n\n/** Count EN snapshot rows for a single EN document. */\nexport function countEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM en_snapshots WHERE content_type = ? AND en_slug = ?`,\n )\n .get(contentType, enSlug) as { count: number };\n return row.count;\n}\n\n/** Delete every translation row for an EN document. Returns the number removed. */\nexport function deleteTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const info = db\n .prepare(`DELETE FROM translations WHERE content_type = ? AND en_slug = ?`)\n .run(contentType, enSlug);\n return info.changes;\n}\n\n/** Delete every EN snapshot row for an EN document. Returns the number removed. */\nexport function deleteEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const info = db\n .prepare(`DELETE FROM en_snapshots WHERE content_type = ? AND en_slug = ?`)\n .run(contentType, enSlug);\n return info.changes;\n}\n\nexport function countStaleTranslations(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n currentEnHash: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM translations\n WHERE content_type = ? AND en_slug = ? AND en_hash != ?`,\n )\n .get(contentType, enSlug, currentEnHash) as { count: number };\n return row.count;\n}\n","/** Detect Gemini returning JSON-style `\\n` escapes as literal characters in MDX bodies. */\nfunction needsMdxEscapeNormalization(body: string): boolean {\n return /\\\\n[ \\t/>]|<[\\w.-][^>]*\\\\n/.test(body);\n}\n\n/**\n * Gemini sometimes returns MDX body with JSON-style escape sequences as literal\n * characters (e.g. `\\n` instead of a newline), which breaks MDX parsing.\n */\nexport function normalizeTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n if (!needsMdxEscapeNormalization(body)) {\n return { body, adjusted: false };\n }\n\n const normalized = body\n .replace(/\\\\r\\\\n/g, \"\\n\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, \"\\\\\");\n\n return { body: normalized, adjusted: normalized !== body };\n}\n","/**\n * Fix JSX opening-tag attributes whose double-quoted values contain raw `\"` characters\n * (e.g. Hebrew gereshayim in דוא\"ל), which break MDX parsing.\n */\nexport function sanitizeMdxJsxAttributeQuotes(body: string): {\n body: string;\n adjusted: boolean;\n} {\n let adjusted = false;\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n if (body[i] !== \"<\" || !/[\\w.]/.test(body[i + 1] ?? \"\")) {\n out += body[i];\n i += 1;\n continue;\n }\n\n const tagStart = i;\n i += 1;\n while (i < body.length && /[\\w.-]/.test(body[i] ?? \"\")) i += 1;\n const tagName = body.slice(tagStart + 1, i);\n\n let tagOut = `<${tagName}`;\n let tagAdjusted = false;\n\n while (i < body.length && body[i] !== \">\" && body[i] !== \"/\") {\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) {\n tagOut += body[i];\n i += 1;\n }\n if (i >= body.length || body[i] === \">\" || body[i] === \"/\") break;\n\n const attrStart = i;\n while (i < body.length && /[\\w:.-]/.test(body[i] ?? \"\")) i += 1;\n const attrName = body.slice(attrStart, i);\n // Not an attribute name (e.g. `<locale,` in prose or a code fence):\n // this is not a sanitizable tag — bail and copy the text through.\n if (!attrName) break;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n if (body[i] !== \"=\") {\n tagOut += body.slice(attrStart, i);\n continue;\n }\n\n tagOut += body.slice(attrStart, i);\n tagOut += \"=\";\n i += 1;\n // Preserve any whitespace between `=` and the value so that inputs we do\n // not rewrite are copied through byte-for-byte.\n const wsStart = i;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n tagOut += body.slice(wsStart, i);\n\n const quote = body[i];\n if (quote !== '\"' && quote !== \"'\") {\n // Unquoted or expression value (`href={x}`) — nothing to sanitize;\n // bail so the scan keeps making progress.\n break;\n }\n\n if (quote === \"'\") {\n const valStart = i + 1;\n i += 1;\n while (i < body.length) {\n if (body[i] === \"\\\\\") {\n i += 2;\n continue;\n }\n if (body[i] === \"'\") break;\n i += 1;\n }\n tagOut += body.slice(valStart - 1, i + 1);\n i += 1;\n continue;\n }\n\n const valStart = i + 1;\n i += 1;\n\n let closeIdx = -1;\n for (let scan = valStart; scan < body.length; scan += 1) {\n if (body[scan] !== '\"') continue;\n let j = scan + 1;\n while (j < body.length && /\\s/.test(body[j] ?? \"\")) j += 1;\n if (\n j < body.length &&\n (body[j] === \">\" || body[j] === \"/\" || /[a-zA-Z]/.test(body[j] ?? \"\"))\n ) {\n closeIdx = scan;\n break;\n }\n }\n\n if (closeIdx === -1) {\n tagOut += body.slice(valStart - 1, i);\n break;\n }\n\n const value = body.slice(valStart, closeIdx);\n const hasInternalQuote = value.includes('\"');\n\n if (hasInternalQuote) {\n const escaped = value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n tagOut += `'${escaped}'`;\n tagAdjusted = true;\n } else {\n tagOut += `\"${value}\"`;\n }\n\n i = closeIdx + 1;\n }\n\n if (tagAdjusted) adjusted = true;\n tagOut += body[i] ?? \"\";\n out += tagOut;\n i += 1;\n }\n\n return { body: out, adjusted };\n}\n","import remarkMdx from \"remark-mdx\";\nimport remarkParse from \"remark-parse\";\nimport { unified } from \"unified\";\nimport { normalizeTranslatedMdxBody } from \"./normalize-mdx-body.js\";\nimport { sanitizeMdxJsxAttributeQuotes } from \"./sanitize-mdx-jsx.js\";\n\nconst parser = unified().use(remarkParse).use(remarkMdx);\n\nexport function prepareTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const normalized = normalizeTranslatedMdxBody(body);\n const sanitized = sanitizeMdxJsxAttributeQuotes(normalized.body);\n return {\n body: sanitized.body,\n adjusted: normalized.adjusted || sanitized.adjusted,\n };\n}\n\nexport function validateMdxBody(body: string): { ok: true } | { ok: false; error: string } {\n try {\n parser.parse(body);\n return { ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, error: message };\n }\n}\n\n/** Normalize, sanitize, and parse-check translated MDX before persistence. */\nexport function assertValidTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const prepared = prepareTranslatedMdxBody(body);\n const validated = validateMdxBody(prepared.body);\n if (!validated.ok) {\n throw new Error(`MDX validation failed: ${validated.error}`);\n }\n return prepared;\n}\n","import type { SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ResolvedAssetsConfig, ScribeDocument } from \"../core/types.js\";\n\n/**\n * Join `publicPath` in front of a root-relative web path, avoiding double\n * slashes. Handles the `\"/\"` identity case, absolute origins\n * (`https://cdn.example.com/`), and path prefixes (`/static/`).\n */\nexport function joinPublicPath(publicPath: string, webPath: string): string {\n if (publicPath === \"\" || publicPath === \"/\") return webPath;\n const suffix = webPath.startsWith(\"/\") ? webPath : `/${webPath}`;\n return publicPath.replace(/\\/+$/, \"\") + suffix;\n}\n\nfunction materializeTemplate(template: string, enSlug: string): string {\n return template.split(\"{slug}\").join(enSlug);\n}\n\n/**\n * Navigate to each concrete location of an asset field path (arrays at `*`\n * segments) and replace the leaf via `transform`. A `template`-backed field\n * whose value is absent is materialized at the leaf when the immediate parent\n * container exists; a top-level absent leaf is set directly on the frontmatter.\n */\nfunction setAssetAtPath(\n container: Record<string, unknown>,\n path: string[],\n transform: (current: string | undefined) => string | undefined,\n): void {\n const [head, ...rest] = path;\n if (head === undefined) return;\n\n if (rest.length === 0) {\n const current = container[head];\n const next = transform(typeof current === \"string\" ? current : undefined);\n if (next !== undefined) container[head] = next;\n return;\n }\n\n if (rest[0] === \"*\") {\n const arr = container[head];\n if (!Array.isArray(arr)) return;\n for (const item of arr) {\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n setAssetAtPath(item as Record<string, unknown>, rest.slice(1), transform);\n }\n }\n return;\n }\n\n const child = container[head];\n if (child && typeof child === \"object\" && !Array.isArray(child)) {\n setAssetAtPath(child as Record<string, unknown>, rest, transform);\n }\n}\n\n/**\n * Resolve declared asset fields on a freshly-built document's frontmatter,\n * in place: materialize templated paths (`{slug}` → EN slug) and prefix\n * `assets.publicPath`. Runs after `mergeStructuralOntoLocale`, so locale\n * documents resolve from the merged EN source values.\n */\nexport function resolveDocumentAssets(\n doc: ScribeDocument,\n assetFields: SchemaFieldMeta[],\n assets: ResolvedAssetsConfig,\n): void {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n for (const f of assetFields) {\n setAssetAtPath(frontmatter, f.path, (current) => {\n let value = current;\n if (value === undefined) {\n if (!f.assetTemplate) return undefined;\n value = materializeTemplate(f.assetTemplate, doc.enSlug);\n }\n return joinPublicPath(assets.publicPath, value);\n });\n }\n}\n","/**\n * Inline tokens: `${{...}}` markers embedded in MDX bodies. Four kinds — static\n * literals, relation URLs/slugs, asset URLs, and per-document vars. See\n * `docs/inline-tokens.md`.\n *\n * This module is the shared, dependency-light heart of the feature: a tokenizer\n * that turns a raw body into a `placeholderBody` (tokens swapped for inert\n * `%%n%%` markers) plus the parsed token list, and the fill/mask helpers used by\n * the loader, translator, validator, and studio.\n *\n * Why `%%n%%` and not `{{n}}`: `{{...}}` is a JSX expression to remark-mdx and\n * would break MDX validation of stored translated bodies. `%%n%%` is inert text.\n */\n\n/** Opening delimiter of an inline token. */\nconst TOKEN_OPEN = \"${{\";\n/** Escape sequence: `$\\{{` renders as a literal `${{` and is never a token. */\nconst ESCAPE_SEQUENCE = \"$\\\\{{\";\nconst ESCAPE_RESULT = \"${{\";\n\nexport type InlineTokenKind = \"static\" | \"relation\" | \"asset\" | \"var\";\n\nexport interface StaticInlineToken {\n kind: \"static\";\n /** Verbatim literal (decoded from the token's JSON string). */\n text: string;\n /** The full `${{...}}` source span. */\n raw: string;\n}\n\nexport interface RelationInlineToken {\n kind: \"relation\";\n targetTypeId: string;\n enSlug: string;\n /** `\"url\"` resolves to the localized URL; `\"slug\"` resolves to the EN slug. */\n mode: \"url\" | \"slug\";\n raw: string;\n}\n\nexport interface AssetInlineToken {\n kind: \"asset\";\n /** Root-relative web path, e.g. `/web/path.webp`. */\n webPath: string;\n raw: string;\n}\n\nexport interface VarInlineToken {\n kind: \"var\";\n key: string;\n raw: string;\n}\n\nexport type InlineToken =\n | StaticInlineToken\n | RelationInlineToken\n | AssetInlineToken\n | VarInlineToken;\n\n/** A `${{...}}` span that failed to parse. Reported by validation, left as-is. */\nexport interface MalformedInlineToken {\n raw: string;\n reason: string;\n /** Byte offset of the token's `$` in the source body. */\n index: number;\n}\n\nexport interface ExtractInlineTokensResult {\n /** Body with each well-formed token replaced by `%%n%%` (1-based). */\n placeholderBody: string;\n /** Parsed well-formed tokens, in order of appearance. */\n tokens: InlineToken[];\n /** Spans that look like tokens but failed to parse. */\n malformed: MalformedInlineToken[];\n}\n\n/** The inert marker for the n-th (1-based) extracted token. */\nexport function placeholderMarker(n: number): string {\n return `%%${n}%%`;\n}\n\n/**\n * Find the index of the closing `}}` of a token whose content starts at\n * `start`. JSON-string aware so a static literal like `${{static:\"a}}b\"}}`\n * terminates at the correct `}}`. Returns the index of the first closing brace,\n * or -1 when the token is unterminated (also bails on a newline: tokens never\n * span lines).\n */\nfunction findTokenEnd(body: string, start: number): number {\n let i = start;\n let inString = false;\n while (i < body.length) {\n const ch = body[i]!;\n if (ch === \"\\n\") return -1;\n if (inString) {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === '\"') inString = false;\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inString = true;\n i += 1;\n continue;\n }\n if (ch === \"}\" && body[i + 1] === \"}\") return i;\n i += 1;\n }\n return -1;\n}\n\n/** Omit that distributes over a union (unlike the built-in `Omit`). */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\ntype ParseResult =\n | { ok: true; token: DistributiveOmit<InlineToken, \"raw\"> }\n | { ok: false; reason: string };\n\n/** Parse the inner content of a token (everything between `${{` and `}}`). */\nfunction parseTokenInner(inner: string): ParseResult {\n const colon = inner.indexOf(\":\");\n if (colon === -1) {\n return { ok: false, reason: `missing kind separator \":\"` };\n }\n const kind = inner.slice(0, colon);\n const rest = inner.slice(colon + 1);\n\n switch (kind) {\n case \"static\": {\n let text: unknown;\n try {\n text = JSON.parse(rest);\n } catch {\n return { ok: false, reason: `static value is not a valid JSON string` };\n }\n if (typeof text !== \"string\") {\n return { ok: false, reason: `static value must be a JSON string` };\n }\n return { ok: true, token: { kind: \"static\", text } };\n }\n case \"relation\": {\n // Slugs cannot contain \":\" so splitting is unambiguous.\n const parts = rest.split(\":\");\n if (parts.length < 2 || parts.length > 3) {\n return {\n ok: false,\n reason: `relation must be relation:<typeId>:<enSlug> or relation:<typeId>:<enSlug>:slug`,\n };\n }\n const [targetTypeId, enSlug, mode] = parts;\n if (!targetTypeId || !enSlug) {\n return { ok: false, reason: `relation is missing a typeId or enSlug` };\n }\n if (mode !== undefined && mode !== \"slug\") {\n return { ok: false, reason: `relation mode must be \"slug\" (got \"${mode}\")` };\n }\n return {\n ok: true,\n token: {\n kind: \"relation\",\n targetTypeId,\n enSlug,\n mode: mode === \"slug\" ? \"slug\" : \"url\",\n },\n };\n }\n case \"asset\": {\n if (!rest.startsWith(\"/\")) {\n return { ok: false, reason: `asset path must start with \"/\" (got \"${rest}\")` };\n }\n return { ok: true, token: { kind: \"asset\", webPath: rest } };\n }\n case \"var\": {\n if (!rest) return { ok: false, reason: `var is missing a key` };\n return { ok: true, token: { kind: \"var\", key: rest } };\n }\n default:\n return { ok: false, reason: `unknown token kind \"${kind}\"` };\n }\n}\n\n/**\n * Replace every well-formed token with an inert `%%n%%` marker and return the\n * parsed token list. Malformed spans are left verbatim (validation reports them)\n * and do NOT consume a marker index. Escape sequences (`$\\{{`) are not tokens\n * and pass through untouched — so a body with zero tokens yields\n * `placeholderBody === body` byte-for-byte.\n */\nexport function extractInlineTokens(body: string): ExtractInlineTokensResult {\n const tokens: InlineToken[] = [];\n const malformed: MalformedInlineToken[] = [];\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n const open = body.indexOf(TOKEN_OPEN, i);\n if (open === -1) {\n out += body.slice(i);\n break;\n }\n out += body.slice(i, open);\n\n const contentStart = open + TOKEN_OPEN.length;\n const end = findTokenEnd(body, contentStart);\n if (end === -1) {\n // Unterminated: leave the rest verbatim; report it.\n malformed.push({\n raw: body.slice(open),\n reason: `unterminated token (missing \"}}\")`,\n index: open,\n });\n out += body.slice(open);\n break;\n }\n\n const raw = body.slice(open, end + 2);\n const inner = body.slice(contentStart, end);\n const parsed = parseTokenInner(inner);\n if (parsed.ok) {\n tokens.push({ ...parsed.token, raw } as InlineToken);\n out += placeholderMarker(tokens.length);\n } else {\n malformed.push({ raw, reason: parsed.reason, index: open });\n out += raw;\n }\n i = end + 2;\n }\n\n return { placeholderBody: out, tokens, malformed };\n}\n\n/**\n * Fill `%%n%%` markers with resolved values (1-based). A marker with no\n * corresponding value (a stale translation whose EN body lost tokens) is left\n * verbatim rather than blanked, so no meaningful text is silently dropped.\n */\nexport function fillPlaceholders(body: string, resolvedValues: string[]): string {\n return body.replace(/%%(\\d+)%%/g, (match, n: string) => {\n const idx = Number(n) - 1;\n return idx >= 0 && idx < resolvedValues.length ? resolvedValues[idx]! : match;\n });\n}\n\n/** Convert `$\\{{` escape sequences back to a literal `${{`. Render-time only. */\nexport function unescapeInlineTokens(body: string): string {\n return body.split(ESCAPE_SEQUENCE).join(ESCAPE_RESULT);\n}\n\n/**\n * Count the markers `%%1%%..%%N%%` in a body. Used by the post-receive\n * verification: each must appear exactly once in a translated body.\n */\nexport function countMarkerOccurrences(body: string, n: number): number {\n return body.split(placeholderMarker(n)).length - 1;\n}\n\n/**\n * Walk a body replacing every token span (valid OR malformed) and every escape\n * sequence via the provided callbacks. Used where the raw `${{` / `$\\{{` braces\n * must never reach a downstream MDX parser or preview renderer.\n */\nexport function replaceInlineSpans(\n body: string,\n opts: {\n token: (raw: string, inner: string) => string;\n escape: () => string;\n },\n): string {\n let out = \"\";\n let i = 0;\n while (i < body.length) {\n if (body.startsWith(ESCAPE_SEQUENCE, i)) {\n out += opts.escape();\n i += ESCAPE_SEQUENCE.length;\n continue;\n }\n if (body.startsWith(TOKEN_OPEN, i)) {\n const end = findTokenEnd(body, i + TOKEN_OPEN.length);\n if (end !== -1) {\n const raw = body.slice(i, end + 2);\n const inner = body.slice(i + TOKEN_OPEN.length, end);\n out += opts.token(raw, inner);\n i = end + 2;\n continue;\n }\n }\n out += body[i]!;\n i += 1;\n }\n return out;\n}\n\n/**\n * Neutralize inline tokens and escapes so a body can be handed to remark-mdx for\n * a structural parse check without the `${{`/`{{` braces producing false MDX\n * errors. Local to validation/preview: never used for hashing or storage.\n */\nexport function maskInlineTokensForMdx(body: string): string {\n return replaceInlineSpans(body, {\n token: () => \"inline\",\n escape: () => \"$\",\n });\n}\n","import fs from \"node:fs\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { createUrlBuilder, isRoutableType, type UrlBuilder } from \"../i18n/build-url.js\";\nimport { joinPublicPath } from \"../loader/resolve-assets.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\nimport {\n extractInlineTokens,\n fillPlaceholders,\n unescapeInlineTokens,\n type InlineToken,\n} from \"./tokens.js\";\n\n/**\n * Read-time token resolver. Maps a single inline token to its string value given\n * the EN source document's frontmatter and a target locale.\n *\n * Relations resolve to a locale-aware URL via the existing `resolvePath`\n * machinery, using the target document's *localized* slug. Localized slugs live\n * in the translation store; the resolver reads them once per store revision\n * (keyed on the store file's mtime), never through another type's loader, so\n * there is no cross-loader recursion.\n */\nexport interface InlineResolver {\n resolve(\n token: InlineToken,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n ): string;\n}\n\nfunction slugKey(typeId: string, enSlug: string, locale: string): string {\n return `${typeId}\\u0000${enSlug}\\u0000${locale}`;\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every((v) => typeof v === \"string\");\n}\n\nexport function createInlineResolver(config: ScribeConfig): InlineResolver {\n const urlBuilder: UrlBuilder = createUrlBuilder(config);\n const typeById = new Map(config.types.map((t) => [t.id, t]));\n const storePath = resolveStorePath(config);\n\n let slugCache: { mtime: number; index: Map<string, string> } | null = null;\n\n const localizedSlugIndex = (): Map<string, string> => {\n let mtime = 0;\n try {\n mtime = fs.statSync(storePath).mtimeMs;\n } catch {\n mtime = 0;\n }\n if (slugCache && slugCache.mtime === mtime) return slugCache.index;\n\n const index = new Map<string, string>();\n try {\n const db = openStore(config, \"readonly\");\n try {\n for (const row of bulkLoadTranslations(db)) {\n index.set(slugKey(row.content_type, row.en_slug, row.locale), row.slug);\n }\n } finally {\n db.close();\n }\n } catch {\n /* store missing or unreadable: fall back to EN slugs */\n }\n slugCache = { mtime, index };\n return index;\n };\n\n const localizedSlug = (typeId: string, enSlug: string, locale: string): string => {\n if (locale === config.defaultLocale) return enSlug;\n const index = localizedSlugIndex();\n const direct = index.get(slugKey(typeId, enSlug, locale));\n if (direct) return direct;\n for (const fb of config.localeFallbacks?.[locale] ?? []) {\n const hit = index.get(slugKey(typeId, enSlug, fb));\n if (hit) return hit;\n }\n return enSlug;\n };\n\n return {\n resolve(token, enFrontmatter, locale): string {\n switch (token.kind) {\n case \"static\":\n return token.text;\n\n case \"var\": {\n const vars = enFrontmatter.vars;\n if (isStringRecord(vars) && typeof vars[token.key] === \"string\") {\n return vars[token.key]!;\n }\n return \"\";\n }\n\n case \"asset\": {\n const assets = config.assets;\n return assets ? joinPublicPath(assets.publicPath, token.webPath) : token.webPath;\n }\n\n case \"relation\": {\n const type = typeById.get(token.targetTypeId);\n if (!type) return \"\";\n if (token.mode === \"slug\") return token.enSlug;\n if (!isRoutableType(type)) return \"\";\n const slug = localizedSlug(token.targetTypeId, token.enSlug, locale);\n return urlBuilder.resolvePath(type.path!, slug, locale);\n }\n }\n },\n };\n}\n\n/**\n * Substitute inline tokens in an EN body at read time: extract tokens, resolve\n * each for the default locale, fill the placeholder markers, and unescape any\n * `$\\{{` sequences. A body with no tokens is returned unchanged (aside from\n * unescaping).\n */\nexport function substituteEnInlineBody(\n rawBody: string,\n enFrontmatter: Record<string, unknown>,\n defaultLocale: string,\n resolver: InlineResolver,\n): string {\n const { placeholderBody, tokens } = extractInlineTokens(rawBody);\n if (tokens.length === 0) return unescapeInlineTokens(placeholderBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, defaultLocale));\n return unescapeInlineTokens(fillPlaceholders(placeholderBody, values));\n}\n\n/**\n * Fill a stored translated body's `%%n%%` markers at read time. Tokens are\n * extracted from the CURRENT raw EN body and resolved for the document's locale,\n * so token VALUES (relation targets, asset paths, var values) always reflect the\n * live EN source even when the translation itself is older.\n */\nexport function fillTranslatedInlineBody(\n translatedBody: string,\n enRawBody: string,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n resolver: InlineResolver,\n): string {\n const { tokens } = extractInlineTokens(enRawBody);\n if (tokens.length === 0) return unescapeInlineTokens(translatedBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, locale));\n return unescapeInlineTokens(fillPlaceholders(translatedBody, values));\n}\n","export function normalizeEnFrontmatter(data: Record<string, unknown>): Record<string, unknown> {\n const out = { ...data };\n if (!out.publishedAt && typeof out.date === \"string\") {\n out.publishedAt = out.date;\n }\n if (!out.heroImage && typeof out.image === \"string\" && out.image.startsWith(\"/\")) {\n out.heroImage = out.image;\n }\n if (!out.updatedAt && typeof out.publishedAt === \"string\") {\n out.updatedAt = out.publishedAt;\n }\n return out;\n}\n\nexport function isPublishableContentFile(name: string): boolean {\n if (!name.endsWith(\".md\") && !name.endsWith(\".mdx\")) return false;\n const first = name.charAt(0);\n return first === first.toLowerCase() && first !== \"_\";\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { z } from \"zod\";\nimport {\n extractBuiltinEnFields,\n mergeBuiltinsIntoFrontmatter,\n seoFieldsFromEn,\n} from \"../core/builtin-fields.js\";\nimport {\n listAssetFields,\n mergeStructuralOntoLocale,\n pickTranslatable,\n type SchemaFieldMeta,\n} from \"../core/introspect-schema.js\";\nimport type {\n AllDocuments,\n ContentTypeConfig,\n LocaleIndex,\n ScribeConfig,\n ScribeDocument,\n} from \"../core/types.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { listTranslationsForType } from \"../storage/translations.js\";\nimport { prepareTranslatedMdxBody } from \"../translate/validate-mdx-body.js\";\nimport {\n fillTranslatedInlineBody,\n substituteEnInlineBody,\n type InlineResolver,\n} from \"../inline/resolve-tokens.js\";\nimport { isPublishableContentFile, normalizeEnFrontmatter } from \"./normalize-en.js\";\nimport { resolveDocumentAssets } from \"./resolve-assets.js\";\n\nfunction isPostFile(name: string): boolean {\n return isPublishableContentFile(name);\n}\n\nfunction listEnFiles(contentDir: string): string[] {\n if (!fs.existsSync(contentDir)) return [];\n return fs\n .readdirSync(contentDir)\n .filter(isPostFile)\n .map((f) => path.join(contentDir, f));\n}\n\nfunction slugFromPath(filePath: string): string {\n return path.basename(filePath).replace(/\\.(md|mdx)$/, \"\");\n}\n\nexport interface ParseEnResult {\n document: ScribeDocument | null;\n issues: Array<{ field: string; message: string; level: \"error\" | \"warning\" }>;\n}\n\nexport function parseEnMdx(\n filePath: string,\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ParseEnResult {\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = matter(raw);\n const slug = slugFromPath(filePath);\n const normalized = normalizeEnFrontmatter(parsed.data as Record<string, unknown>);\n const { builtin, rest, issues: builtinIssues } = extractBuiltinEnFields(\n normalized,\n type.path,\n slug,\n config.defaultLocale,\n );\n const issues = builtinIssues.map((issue) => ({\n field: issue.field,\n message: issue.message,\n level: issue.level,\n }));\n\n const result = type.schema.safeParse(rest);\n if (!result.success) {\n return {\n document: null,\n issues: [\n ...issues,\n ...result.error.issues.map((issue) => ({\n field: issue.path.join(\".\"),\n message: issue.message,\n level: \"error\" as const,\n })),\n ],\n };\n }\n\n if (issues.some((i) => i.level === \"error\")) {\n return { document: null, issues };\n }\n\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n result.data as Record<string, unknown>,\n {\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n vars: builtin.vars,\n slug,\n locale: config.defaultLocale,\n },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n const crossIssues = type.crossValidate?.(result.data as z.infer<typeof type.schema>, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug,\n enSlug: slug,\n knownLocales: config.locales,\n }) ?? [];\n issues.push(...crossIssues);\n\n const document: ScribeDocument = {\n slug,\n enSlug: slug,\n locale: config.defaultLocale,\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n frontmatter,\n // Bodyless types (`body: false`) never carry a body: the loader skips the\n // MDX body entirely so runtimes, exports, and hashing all see an empty body.\n // A stray body is reported separately by `scribe validate`.\n content: type.body === false ? \"\" : parsed.content,\n filePath,\n };\n\n return { document, issues };\n}\n\nfunction buildDocumentFromTranslation(\n row: {\n slug: string;\n en_slug: string;\n locale: string;\n frontmatter_json: string;\n body: string;\n },\n enDoc: ScribeDocument,\n type: ContentTypeConfig,\n config: ScribeConfig,\n inlineResolver?: InlineResolver,\n): ScribeDocument {\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n const merged = mergeStructuralOntoLocale(localeFm, enDoc.frontmatter, type.schema);\n const seo = seoFieldsFromEn(enDoc);\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n merged,\n { ...seo, slug: row.slug, locale: row.locale },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n // The stored body carries `%%n%%` markers. When token substitution is enabled\n // (runtime read path only) fill them from the CURRENT EN body's tokens,\n // resolved for this locale; otherwise leave the raw markers in place.\n const preparedBody = prepareTranslatedMdxBody(row.body).body;\n const content = inlineResolver\n ? fillTranslatedInlineBody(\n preparedBody,\n enDoc.content,\n enDoc.frontmatter as Record<string, unknown>,\n row.locale,\n inlineResolver,\n )\n : preparedBody;\n\n return {\n slug: row.slug,\n enSlug: row.en_slug,\n locale: row.locale,\n publishedAt: seo.publishedAt,\n updatedAt: seo.updatedAt,\n noindex: seo.noindex,\n canonicalPathOverride: seo.canonicalPathOverride,\n frontmatter,\n content,\n };\n}\n\nconst DEV_REVALIDATE_MS = 1500;\n\n/**\n * Package-internal monotonic content version. A mutation that writes/removes\n * content files (currently only entry deletion) bumps this so every loader\n * treats its cached document list as stale immediately, bypassing the dev\n * revalidation window. Not exported from the package's public entrypoint.\n */\nlet contentVersion = 0;\n\n/** Invalidate every content loader's cache after an in-process content mutation. */\nexport function bumpContentVersion(): void {\n contentVersion++;\n}\n\nexport function createContentLoader(\n config: ScribeConfig,\n type: ContentTypeConfig,\n options: { resolveAssets?: boolean; inlineResolver?: InlineResolver } = {},\n): () => AllDocuments {\n let cached: AllDocuments | null = null;\n let signature = \"\";\n let lastCheck = 0;\n let builtVersion = contentVersion;\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n const storePath = resolveStorePath(config);\n const isProd = process.env.NODE_ENV === \"production\";\n\n // Asset resolution is a runtime read-path concern (createScribe only); the CLI,\n // validation, and static exports build the project without it and see source values.\n const assets = config.assets;\n const assetFields: SchemaFieldMeta[] =\n assets && options.resolveAssets ? listAssetFields(type.schema) : [];\n const resolveAssets = (doc: ScribeDocument): void => {\n if (assetFields.length > 0 && assets) resolveDocumentAssets(doc, assetFields, assets);\n };\n\n // Inline-token substitution is a runtime read-path concern (createScribe only),\n // gated exactly like asset resolution: the CLI, validation, and studio keep raw\n // token syntax so they can introspect and re-hash source bodies.\n const inlineResolver = options.inlineResolver;\n const resolveEnInline = (doc: ScribeDocument): void => {\n if (inlineResolver) {\n doc.content = substituteEnInlineBody(\n doc.content,\n doc.frontmatter as Record<string, unknown>,\n config.defaultLocale,\n inlineResolver,\n );\n }\n };\n\n function computeSignature(): string {\n const files = listEnFiles(contentDir);\n let newest = 0;\n for (const f of files) {\n try {\n newest = Math.max(newest, fs.statSync(f).mtimeMs);\n } catch {\n /* ignore */\n }\n }\n let store = 0;\n try {\n store = fs.statSync(storePath).mtimeMs;\n } catch {\n /* ignore */\n }\n return `${files.length}:${newest}:${store}`;\n }\n\n function build(): AllDocuments {\n const out = new Map<string, LocaleIndex>();\n const englishBySlug = new Map<string, ScribeDocument>();\n\n for (const file of listEnFiles(contentDir)) {\n const { document, issues } = parseEnMdx(file, config, type);\n if (document) {\n englishBySlug.set(document.slug, document);\n if (issues.length > 0) {\n for (const issue of issues) {\n console.warn(\n `[scribe:${type.id}] ${file} ${issue.level}: ${issue.field}: ${issue.message}`,\n );\n }\n }\n } else {\n console.warn(\n `[scribe:${type.id}] Skipping ${file} — validation failed:\\n` +\n issues.map((i) => ` - ${i.field}: ${i.message}`).join(\"\\n\"),\n );\n }\n }\n\n out.set(config.defaultLocale, {\n bySlug: englishBySlug,\n byEnSlug: englishBySlug,\n });\n\n const db = openStore(config, \"readonly\");\n const rows = listTranslationsForType(db, type.id);\n db.close();\n\n const rowsByLocale = new Map<string, typeof rows>();\n for (const row of rows) {\n const list = rowsByLocale.get(row.locale) ?? [];\n list.push(row);\n rowsByLocale.set(row.locale, list);\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const bySlug = new Map<string, ScribeDocument>();\n const byEnSlug = new Map<string, ScribeDocument>();\n for (const row of rowsByLocale.get(locale) ?? []) {\n const enDoc = englishBySlug.get(row.en_slug);\n if (!enDoc) continue;\n // Merge structural (incl. asset) fields from the *unresolved* EN source,\n // then resolve the locale doc's own fresh frontmatter.\n const doc = buildDocumentFromTranslation(row, enDoc, type, config, inlineResolver);\n resolveAssets(doc);\n bySlug.set(doc.slug, doc);\n byEnSlug.set(row.en_slug, doc);\n }\n out.set(locale, { bySlug, byEnSlug });\n }\n\n // Resolve EN docs last: locale docs merged from their unresolved frontmatter\n // above, and translated bodies extract tokens from the still-raw EN content.\n for (const doc of englishBySlug.values()) {\n resolveAssets(doc);\n resolveEnInline(doc);\n }\n\n return out;\n }\n\n return () => {\n if (cached) {\n // An in-process content mutation (e.g. entry deletion) forces an\n // unconditional rebuild regardless of prod mode or the dev window.\n if (contentVersion !== builtVersion) {\n cached = build();\n builtVersion = contentVersion;\n lastCheck = Date.now();\n signature = isProd ? \"\" : computeSignature();\n return cached;\n }\n if (isProd) return cached;\n const now = Date.now();\n if (now - lastCheck < DEV_REVALIDATE_MS) return cached;\n lastCheck = now;\n const sig = computeSignature();\n if (sig === signature) return cached;\n cached = build();\n signature = sig;\n return cached;\n }\n lastCheck = Date.now();\n cached = build();\n builtVersion = contentVersion;\n signature = isProd ? \"\" : computeSignature();\n return cached;\n };\n}\n\nexport function readEnDocument(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): ScribeDocument | null {\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n for (const ext of [\".mdx\", \".md\"]) {\n const filePath = path.join(contentDir, `${enSlug}${ext}`);\n if (!fs.existsSync(filePath)) continue;\n const { document } = parseEnMdx(filePath, config, type);\n return document;\n }\n return null;\n}\n\nexport function getTranslatablePayload(\n doc: ScribeDocument,\n type: ContentTypeConfig,\n): { frontmatter: Record<string, unknown>; body: string } {\n return {\n frontmatter: pickTranslatable(doc.frontmatter, type.schema),\n // Bodyless types never contribute a body to any translation payload, hash,\n // or snapshot — regardless of what a document's `content` happens to hold.\n body: type.body === false ? \"\" : doc.content,\n };\n}\n","import type { ContentTypeConfig, ScribeDocument, ResolvedDocument } from \"../core/types.js\";\nimport { createUrlBuilder } from \"./build-url.js\";\nimport type { LocaleRoutingConfig } from \"../core/types.js\";\n\n/** Resolve a document by slug and locale (fallback, cross-locale slug correction). */\nexport function resolveLocalizedDocument<TDoc extends ScribeDocument>(\n slug: string,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n localeRouting?: LocaleRoutingConfig,\n fallbackLocales: readonly string[] = [],\n): ResolvedDocument<TDoc> {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, locale],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n const idx = allDocs.get(locale);\n const direct = idx?.bySlug.get(slug);\n if (direct) {\n return { document: direct, actualLocale: locale };\n }\n\n for (const [docLocale, docIdx] of allDocs) {\n const found = docIdx.bySlug.get(slug);\n if (!found) continue;\n\n const enSlug = docLocale === defaultLocale ? found.slug : found.enSlug;\n\n // Which document should canonically serve the requested locale? Try the\n // requested locale first, then its configured fallback chain.\n let target: TDoc | undefined;\n let targetLocale = locale;\n for (const candidateLocale of [locale, ...fallbackLocales]) {\n const cand =\n candidateLocale === defaultLocale\n ? allDocs.get(candidateLocale)?.bySlug.get(enSlug)\n : allDocs.get(candidateLocale)?.byEnSlug.get(enSlug);\n if (cand) {\n target = cand;\n targetLocale = candidateLocale;\n break;\n }\n }\n\n if (target) {\n if (target.slug === slug) {\n return { document: target, actualLocale: targetLocale };\n }\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, target.slug, locale),\n };\n }\n\n if (docLocale === defaultLocale) {\n return { document: found as TDoc, actualLocale: defaultLocale };\n }\n\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, found.enSlug, locale),\n };\n }\n\n if (locale !== defaultLocale) {\n const enDoc = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (enDoc && type.indexFallback === \"en\") {\n return { document: enDoc as TDoc, actualLocale: defaultLocale };\n }\n const byEn = idx?.byEnSlug.get(slug);\n if (byEn) {\n return { document: byEn as TDoc, actualLocale: locale };\n }\n const fallback = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (fallback && type.indexFallback === \"en\") {\n return { document: fallback as TDoc, actualLocale: defaultLocale };\n }\n }\n\n return { document: null, actualLocale: locale };\n}\n\n/** Map a document slug from one locale to another via the EN parent slug. */\nexport function getSlugForLocale<TDoc extends ScribeDocument>(\n document: TDoc,\n sourceLocale: string,\n targetLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): string | null {\n if (sourceLocale === targetLocale) return document.slug;\n\n const englishSlug = sourceLocale === defaultLocale ? document.slug : document.enSlug;\n if (!englishSlug) return null;\n if (targetLocale === defaultLocale) return englishSlug;\n\n return allDocs.get(targetLocale)?.byEnSlug.get(englishSlug)?.slug ?? null;\n}\n","import type {\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n ScribeConfig,\n ScribeDocument,\n ScribeProject,\n StaticParam,\n} from \"./core/types.js\";\nimport { listRelationFields, type SchemaFieldMeta } from \"./core/introspect-schema.js\";\nimport { createContentLoader } from \"./loader/create-loader.js\";\nimport { createInlineResolver, type InlineResolver } from \"./inline/resolve-tokens.js\";\nimport { resolveLocalizedDocument } from \"./i18n/resolve-document.js\";\nimport { createUrlBuilder, isRoutableType } from \"./i18n/build-url.js\";\n\nfunction comparatorFor(orderBy: OrderBy): (a: ScribeDocument, b: ScribeDocument) => number {\n if (typeof orderBy === \"function\") return orderBy;\n switch (orderBy) {\n case \"publishedAt\":\n return (a, b) => (a.publishedAt ?? \"\").localeCompare(b.publishedAt ?? \"\");\n case \"-publishedAt\":\n return (a, b) => (b.publishedAt ?? \"\").localeCompare(a.publishedAt ?? \"\");\n case \"updatedAt\":\n return (a, b) => (a.updatedAt ?? \"\").localeCompare(b.updatedAt ?? \"\");\n case \"-updatedAt\":\n return (a, b) => (b.updatedAt ?? \"\").localeCompare(a.updatedAt ?? \"\");\n default:\n return (a, b) => a.slug.localeCompare(b.slug);\n }\n}\n\nfunction buildRuntime(\n config: ScribeConfig,\n type: ContentTypeConfig,\n getRuntime: (id: string) => ContentTypeRuntime,\n options: { resolveAssets?: boolean; inlineResolver?: InlineResolver } = {},\n): ContentTypeRuntime {\n const load = createContentLoader(config, type, {\n resolveAssets: options.resolveAssets,\n inlineResolver: options.inlineResolver,\n });\n const relationFields = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.schema)\n .filter((f) => f.path.length === 1)\n .map((f) => [f.path[0]!, f]),\n );\n\n function assertRoutable(method: string): string {\n if (!type.path) {\n throw new Error(\n `Content type \"${type.id}\" has no path template — ${method}() requires one`,\n );\n }\n return type.path;\n }\n\n const urlBuilder = createUrlBuilder(config);\n\n const runtime: ContentTypeRuntime = {\n id: type.id,\n config: type,\n load,\n\n list(locale = config.defaultLocale, options: ListOptions = {}) {\n const idx = load().get(locale);\n if (!idx) return [];\n const docs = Array.from(idx.bySlug.values());\n docs.sort(comparatorFor(options.orderBy ?? type.orderBy ?? \"slug\"));\n return options.limit !== undefined ? docs.slice(0, options.limit) : docs;\n },\n\n get(slug: string, locale = config.defaultLocale) {\n return load().get(locale)?.bySlug.get(slug) ?? null;\n },\n\n resolve(slug: string, locale: string) {\n const result = resolveLocalizedDocument(\n slug,\n locale,\n config.defaultLocale,\n load(),\n type,\n config.localeRouting,\n config.localeFallbacks?.[locale] ?? [],\n );\n if (result.document && type.path) {\n return {\n ...result,\n canonicalPath: urlBuilder.resolvePath(\n type.path,\n result.document.slug,\n result.actualLocale,\n ),\n };\n }\n return result;\n },\n\n staticParams(options = {}) {\n assertRoutable(\"staticParams\");\n const all = load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) return [];\n const params: StaticParam[] = [];\n for (const locale of options.locales ?? config.locales) {\n const localeIdx = all.get(locale);\n const fallbacks = config.localeFallbacks?.[locale] ?? [];\n for (const doc of enIdx.bySlug.values()) {\n let slug: string;\n if (locale === config.defaultLocale) {\n slug = doc.slug;\n } else {\n // Prefer the locale's own translated slug, then each fallback\n // locale's translated slug, then the EN slug — matching resolve().\n slug =\n localeIdx?.byEnSlug.get(doc.slug)?.slug ??\n fallbacks\n .map((fb) => all.get(fb)?.byEnSlug.get(doc.slug)?.slug)\n .find((s): s is string => s !== undefined) ??\n doc.slug;\n }\n params.push({ locale, slug });\n }\n }\n return params;\n },\n\n alternates(doc: ScribeDocument) {\n const pathTemplate = assertRoutable(\"alternates\");\n const out: Record<string, string> = {\n [config.defaultLocale]: urlBuilder.resolvePath(\n pathTemplate,\n doc.enSlug,\n config.defaultLocale,\n ),\n };\n const all = load();\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const translated = all.get(locale)?.byEnSlug.get(doc.enSlug);\n if (translated) {\n out[locale] = urlBuilder.resolvePath(pathTemplate, translated.slug, locale);\n }\n }\n return out;\n },\n\n translation(doc: ScribeDocument, targetLocale: string) {\n if (targetLocale === doc.locale) return doc;\n const all = load();\n if (targetLocale === config.defaultLocale) {\n return all.get(config.defaultLocale)?.bySlug.get(doc.enSlug) ?? null;\n }\n return all.get(targetLocale)?.byEnSlug.get(doc.enSlug) ?? null;\n },\n\n url(slug: string, locale: string) {\n const pathTemplate = assertRoutable(\"url\");\n return urlBuilder.resolvePath(pathTemplate, slug, locale);\n },\n\n related(doc: ScribeDocument, fieldName: string, locale?: string) {\n const meta = relationFields.get(fieldName);\n if (!meta) {\n throw new Error(\n `Content type \"${type.id}\" has no top-level relation field \"${fieldName}\"`,\n );\n }\n const target = getRuntime(meta.relationTarget!);\n const lookupLocale = locale ?? doc.locale;\n const value = (doc.frontmatter as Record<string, unknown>)[fieldName];\n\n // Relations always hold EN slugs (structural fields are merged from EN).\n // Deref in the requested locale, falling back to the EN doc unconditionally.\n const deref = (enSlug: string): ScribeDocument | null => {\n const all = target.load();\n return (\n all.get(lookupLocale)?.byEnSlug.get(enSlug) ??\n all.get(config.defaultLocale)?.bySlug.get(enSlug) ??\n null\n );\n };\n\n if (meta.relationMultiple) {\n if (!Array.isArray(value)) return [];\n return value\n .filter((slug): slug is string => typeof slug === \"string\" && slug.length > 0)\n .map(deref)\n .filter((d): d is ScribeDocument => d !== null);\n }\n\n if (typeof value !== \"string\" || value.length === 0) {\n if (meta.relationOptional) return null;\n throw new Error(\n `${type.id} \"${doc.enSlug}\": required relation \"${fieldName}\" is missing`,\n );\n }\n const resolved = deref(value);\n if (!resolved && !meta.relationOptional) {\n throw new Error(\n `${type.id} \"${doc.enSlug}\": relation \"${fieldName}\" references missing ` +\n `${meta.relationTarget} \"${value}\" — run \\`scribe validate\\``,\n );\n }\n return resolved;\n },\n } as ContentTypeRuntime;\n\n return runtime;\n}\n\n/**\n * Create the untyped project engine (CLI, validation, studio).\n * Apps should use `createScribe()` for typed per-type accessors.\n * Expects a resolved config (`resolveConfig` / `loadConfigSync`).\n *\n * @param options.resolveAssets resolve declared asset fields to served URLs on\n * read (publicPath applied, templates materialized). Only `createScribe` sets\n * this; the CLI, validation, and static exports keep source values.\n * @param options.resolveInlineTokens substitute `${{...}}` inline tokens in\n * document bodies on read (EN tokens filled in place, translated `%%n%%`\n * markers filled from the current EN tokens). Only `createScribe` sets this;\n * the CLI, validation, and studio keep raw token syntax.\n * @internal\n */\nexport function createProject(\n config: ScribeConfig,\n options: { resolveAssets?: boolean; resolveInlineTokens?: boolean } = {},\n): ScribeProject {\n const runtimes = new Map<string, ContentTypeRuntime>();\n const getRuntime = (id: string): ContentTypeRuntime => {\n const runtime = runtimes.get(id);\n if (!runtime) {\n throw new Error(`Unknown content type \"${id}\"`);\n }\n return runtime;\n };\n\n // One resolver instance shared across every type's loader. It reads localized\n // slugs straight from the store (never through another loader), so building it\n // here cannot recurse into the runtimes it lives alongside.\n const inlineResolver = options.resolveInlineTokens\n ? createInlineResolver(config)\n : undefined;\n\n for (const type of config.types) {\n runtimes.set(\n type.id,\n buildRuntime(config, type, getRuntime, {\n resolveAssets: options.resolveAssets,\n inlineResolver,\n }),\n );\n }\n\n return {\n config,\n rootDir: config.rootDir,\n storePath: config.storePath,\n getType: getRuntime,\n listTypes() {\n return Array.from(runtimes.values());\n },\n listRoutableTypes() {\n return Array.from(runtimes.values()).filter((runtime) => isRoutableType(runtime.config));\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeConfig } from \"./types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport function enFileExists(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): boolean {\n const dir = path.join(config.rootDir, type.contentDir);\n return (\n fs.existsSync(path.join(dir, `${enSlug}.mdx`)) ||\n fs.existsSync(path.join(dir, `${enSlug}.md`))\n );\n}\n\nexport function sqliteHasTranslations(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n): boolean {\n return listTranslationsForEnSlug(db, contentTypeId, enSlug).length > 0;\n}\n\nexport function isAliasKnown(\n config: ScribeConfig,\n type: ContentTypeConfig,\n aliasEnSlug: string,\n db: Database.Database,\n): boolean {\n return enFileExists(config, type, aliasEnSlug) || sqliteHasTranslations(db, type.id, aliasEnSlug);\n}\n\nexport function listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n","import type { AllDocuments } from \"../core/types.js\";\n\n/**\n * Internal: locale → (en_slug → locale slug) map for all non-default locales.\n * Consumed by `staticParams()`, `alternates()`, and redirect expansion.\n */\nexport function buildTranslationIndex(\n allDocs: AllDocuments,\n locales: readonly string[],\n defaultLocale: string,\n): Map<string, Map<string, string>> {\n const index = new Map<string, Map<string, string>>();\n for (const locale of locales) {\n if (locale === defaultLocale) continue;\n const idx = allDocs.get(locale);\n if (!idx) continue;\n const localeMap = new Map<string, string>();\n for (const [enSlug, doc] of idx.byEnSlug) {\n localeMap.set(enSlug, doc.slug);\n }\n index.set(locale, localeMap);\n }\n return index;\n}\n","import { z } from \"zod\";\nimport { slugPatternSchema } from \"../core/builtin-fields.js\";\n\nconst redirectFromSchema = z.union([\n slugPatternSchema,\n z.array(slugPatternSchema).min(1).max(20),\n]);\n\nexport const typeRedirectEntrySchema = z\n .object({\n from: redirectFromSchema,\n toSlug: slugPatternSchema.optional(),\n toType: z.string().min(1).optional(),\n toUrl: z.string().min(1).optional(),\n permanent: z.boolean().optional(),\n })\n .superRefine((entry, ctx) => {\n const hasToSlug = entry.toSlug !== undefined;\n const hasToUrl = entry.toUrl !== undefined;\n const hasToType = entry.toType !== undefined;\n const targetCount = Number(hasToSlug) + Number(hasToUrl);\n\n if (targetCount !== 1) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Each redirect must specify exactly one of toSlug/toType+toSlug or toUrl\",\n path: [\"toSlug\"],\n });\n return;\n }\n\n if (hasToUrl && hasToType) {\n ctx.addIssue({\n code: \"custom\",\n message: \"toUrl cannot be combined with toType\",\n path: [\"toUrl\"],\n });\n }\n\n if (hasToType && !hasToSlug) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Cross-type redirects require both toType and toSlug\",\n path: [\"toSlug\"],\n });\n }\n });\n\nexport const typeRedirectsFileSchema = z.object({\n redirects: z.array(typeRedirectEntrySchema).max(500),\n});\n\nexport type TypeRedirectEntry = z.infer<typeof typeRedirectEntrySchema>;\nexport type TypeRedirectsFile = z.infer<typeof typeRedirectsFileSchema>;\n\nexport type RedirectTargetKind = \"same-type\" | \"cross-type\" | \"anywhere\";\n\nexport interface ParsedRedirectEntry {\n fromSlugs: string[];\n kind: RedirectTargetKind;\n toSlug?: string;\n toType?: string;\n toUrl?: string;\n permanent: boolean;\n}\n\nexport function normalizeRedirectFrom(from: string | string[]): string[] {\n return Array.isArray(from) ? from : [from];\n}\n\nexport function parseRedirectEntry(entry: TypeRedirectEntry): ParsedRedirectEntry {\n const fromSlugs = normalizeRedirectFrom(entry.from);\n if (entry.toUrl !== undefined) {\n return {\n fromSlugs,\n kind: \"anywhere\",\n toUrl: entry.toUrl,\n permanent: entry.permanent ?? true,\n };\n }\n if (entry.toType !== undefined) {\n return {\n fromSlugs,\n kind: \"cross-type\",\n toType: entry.toType,\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n }\n return {\n fromSlugs,\n kind: \"same-type\",\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport {\n parseRedirectEntry,\n type ParsedRedirectEntry,\n typeRedirectsFileSchema,\n} from \"./redirect-schema.js\";\n\nexport const TYPE_REDIRECTS_FILENAME = \"_redirects.json\";\n\nexport interface LoadedTypeRedirects {\n contentTypeId: string;\n contentDir: string;\n filePath: string;\n entries: ParsedRedirectEntry[];\n}\n\nfunction redirectsFilePath(config: ScribeConfig, type: ContentTypeConfig): string {\n return path.join(config.rootDir, type.contentDir, TYPE_REDIRECTS_FILENAME);\n}\n\nexport function loadTypeRedirectsFile(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): LoadedTypeRedirects | null {\n const filePath = redirectsFilePath(config, type);\n if (!fs.existsSync(filePath)) return null;\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n } catch (error) {\n throw new Error(\n `${type.id}: failed to parse ${TYPE_REDIRECTS_FILENAME}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const parsed = typeRedirectsFileSchema.safeParse(raw);\n if (!parsed.success) {\n const details = parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"root\"}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`${type.id}: invalid ${TYPE_REDIRECTS_FILENAME}: ${details}`);\n }\n\n return {\n contentTypeId: type.id,\n contentDir: type.contentDir,\n filePath,\n entries: parsed.data.redirects.map(parseRedirectEntry),\n };\n}\n\nexport function loadAllTypeRedirects(config: ScribeConfig): LoadedTypeRedirects[] {\n const out: LoadedTypeRedirects[] = [];\n for (const type of config.types) {\n const loaded = loadTypeRedirectsFile(config, type);\n if (loaded) out.push(loaded);\n }\n return out;\n}\n\nexport function collectRedirectSourceSlugs(loaded: LoadedTypeRedirects[]): Set<string> {\n const slugs = new Set<string>();\n for (const file of loaded) {\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n slugs.add(from);\n }\n }\n }\n return slugs;\n}\n\nexport function collectOutboundRedirectSourcesByType(\n loaded: LoadedTypeRedirects[],\n): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>();\n for (const file of loaded) {\n const set = out.get(file.contentTypeId) ?? new Set<string>();\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n set.add(from);\n }\n }\n out.set(file.contentTypeId, set);\n }\n return out;\n}\n","import type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport { loadTypeRedirectsFile } from \"./load-type-redirects.js\";\nimport type { ParsedRedirectEntry } from \"./redirect-schema.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nfunction localizedSlug(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n locale: string,\n defaultLocale: string,\n): string {\n if (locale === defaultLocale) return enSlug;\n const row = listTranslationsForEnSlug(db, contentTypeId, enSlug).find(\n (translation) => translation.locale === locale,\n );\n return row?.slug ?? enSlug;\n}\n\nfunction resolveSlugTargetDestination(\n project: ScribeProject,\n db: Database.Database,\n targetType: ContentTypeConfig,\n toSlug: string,\n locale: string,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): string {\n const targetSlug = localizedSlug(\n db,\n targetType.id,\n toSlug,\n locale,\n project.config.defaultLocale,\n );\n return urlBuilder.resolvePath(targetType.path!, targetSlug, locale);\n}\n\nfunction buildEntryRules(\n project: ScribeProject,\n sourceType: ContentTypeConfig,\n entry: ParsedRedirectEntry,\n db: Database.Database,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): NextRedirectRule[] {\n if (!isRoutableType(sourceType)) return [];\n\n const out: NextRedirectRule[] = [];\n const { defaultLocale } = project.config;\n\n let targetType: ContentTypeConfig = sourceType;\n if (entry.kind === \"cross-type\") {\n const resolvedTarget = project.config.types.find((type) => type.id === entry.toType);\n if (!resolvedTarget?.path) return out;\n targetType = resolvedTarget;\n }\n\n for (const fromEnSlug of entry.fromSlugs) {\n const locales = project.config.locales;\n for (const locale of locales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n const source = urlBuilder.resolvePath(sourceType.path!, fromSlug, locale);\n\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n if (source === destination) continue;\n\n out.push({\n source,\n destination,\n permanent: entry.permanent,\n });\n }\n\n if (sourceType.id === \"blog\") {\n let destinationEn: string;\n if (entry.kind === \"anywhere\") {\n destinationEn = entry.toUrl!;\n } else {\n destinationEn = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n defaultLocale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${fromEnSlug}`,\n destination: destinationEn,\n permanent: entry.permanent,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${locale}/${fromSlug}`,\n destination,\n permanent: entry.permanent,\n });\n\n out.push({\n source: `/${locale}/${fromEnSlug}`,\n destination,\n permanent: entry.permanent,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function buildJsonRedirects(project: ScribeProject): NextRedirectRule[] {\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n\n for (const entry of loaded.entries) {\n out.push(...buildEntryRules(project, type, entry, db, urlBuilder));\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n\nexport function buildRedirectSourceSlugSet(project: ScribeProject): Set<string> {\n const out = new Set<string>();\n for (const type of project.config.types) {\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n out.add(`${type.id}:${from}`);\n }\n }\n }\n return out;\n}\n\nexport function buildLegacyNoBlogPathRedirects(\n project: ScribeProject,\n redirectSourceKeys: Set<string>,\n): NextRedirectRule[] {\n const blogType = project.config.types.find((type) => type.id === \"blog\" && type.path);\n if (!blogType?.path) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const enSlug of listEnSlugs(project.config.rootDir, blogType.contentDir)) {\n if (redirectSourceKeys.has(`blog:${enSlug}`)) continue;\n\n out.push({\n source: `/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, enSlug, project.config.defaultLocale),\n permanent: true,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const translatedSlug = localizedSlug(\n db,\n blogType.id,\n enSlug,\n locale,\n project.config.defaultLocale,\n );\n out.push({\n source: `/${locale}/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport {\n buildJsonRedirects,\n buildLegacyNoBlogPathRedirects,\n buildRedirectSourceSlugSet,\n} from \"./build-json-redirects.js\";\nimport {\n collectOutboundRedirectSourcesByType,\n collectRedirectSourceSlugs,\n loadAllTypeRedirects,\n} from \"./load-type-redirects.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). Deprecated: derived from localeRouting when omitted. */\n prefixedLocales?: string[];\n}\n\nfunction buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): Map<string, Map<string, string>> {\n const runtime = project.getType(typeId);\n const { config } = project;\n const merged = buildTranslationIndex(\n runtime.load(),\n config.locales,\n config.defaultLocale,\n );\n\n const db = openStore(project.config, \"readonly\");\n try {\n for (const alias of redirectSourceSlugs) {\n for (const row of listTranslationsForEnSlug(db, typeId, alias)) {\n const localeMap = merged.get(row.locale) ?? new Map<string, string>();\n if (!localeMap.has(alias)) {\n localeMap.set(alias, row.slug);\n }\n merged.set(row.locale, localeMap);\n }\n }\n } finally {\n db.close();\n }\n\n return merged;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const translationIndex = buildRedirectTranslationIndex(project, typeId, redirectSourceSlugs);\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const [locale, localeMap] of translationIndex) {\n for (const [enSlug, translatedSlug] of localeMap) {\n if (enSlug === translatedSlug) continue;\n if (redirectSourceSlugs.has(enSlug)) continue;\n out.push({\n source: urlBuilder.resolvePath(pathTemplate, enSlug, locale),\n destination: urlBuilder.resolvePath(pathTemplate, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(project: ScribeProject, typeId: string): NextRedirectRule[] {\n const loaded = loadAllTypeRedirects(project.config).find((file) => file.contentTypeId === typeId);\n const redirectSourceSlugs = new Set<string>();\n if (loaded) {\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n redirectSourceSlugs.add(from);\n }\n }\n }\n\n return [\n ...buildCrossLocaleSlugRedirects(project, typeId, redirectSourceSlugs),\n ];\n}\n\n/** Build Next.js redirect rules from `_redirects.json`, locale slug fixes, and legacy blog paths. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n _options: BuildRedirectsOptions = {},\n): NextRedirectRule[] {\n const redirectSourceKeys = buildRedirectSourceSlugSet(project);\n const out: NextRedirectRule[] = [\n ...buildJsonRedirects(project),\n ...buildLegacyNoBlogPathRedirects(project, redirectSourceKeys),\n ];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All inbound redirect source slugs — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirects — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (redirect sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const loaded = loadAllTypeRedirects(project.config);\n const aliasSlugs = collectRedirectSourceSlugs(loaded);\n const outboundByType = collectOutboundRedirectSourcesByType(loaded);\n\n for (const type of project.config.types) {\n if (!outboundByType.has(type.id)) {\n outboundByType.set(type.id, new Set());\n }\n }\n\n return {\n aliasSlugs,\n outboundByType,\n };\n}\n\nexport { listEnSlugs };\n","/** Join site origin and pathname without double slashes. */\nexport function joinBaseUrl(baseUrl: string, pathname: string): string {\n const origin = baseUrl.replace(/\\/$/, \"\");\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${origin}${path}`;\n}\n","import { documentLastModified, resolveCanonicalPathname } from \"../core/builtin-fields.js\";\nimport type { AllDocuments, ContentTypeConfig, ScribeConfig, ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { getRedirectSourceSlugs } from \"../redirects/build-redirects.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { joinBaseUrl } from \"./join-base-url.js\";\nimport type { GenerateSitemapOptions, SitemapEntry } from \"./types.js\";\n\nfunction shouldIncludeEnDoc(\n enDoc: ScribeDocument,\n enSlug: string,\n redirectSources: ReturnType<typeof getRedirectSourceSlugs>,\n contentTypeId: string,\n excludeNoindex: boolean,\n): boolean {\n if (redirectSources.aliasSlugs.has(enSlug)) return false;\n const outbound = redirectSources.outboundByType.get(contentTypeId);\n if (outbound?.has(enSlug)) return false;\n if (excludeNoindex && enDoc.noindex) return false;\n return true;\n}\n\ntype ResolvedSitemapOptions = GenerateSitemapOptions & {\n resolveUrl: (locale: string, pathname: string) => string | Promise<string>;\n};\n\nfunction resolveSitemapOptions(options: GenerateSitemapOptions): ResolvedSitemapOptions {\n return {\n ...options,\n resolveUrl:\n options.resolveUrl ??\n ((_locale, pathname) => joinBaseUrl(options.baseUrl, pathname)),\n };\n}\n\nasync function buildClusterEntry(\n type: ContentTypeConfig,\n enSlug: string,\n enDoc: ScribeDocument,\n allDocs: AllDocuments,\n config: ScribeConfig,\n options: ResolvedSitemapOptions,\n): Promise<SitemapEntry | null> {\n const { defaultLocale, locales } = config;\n const excludeNoindex = options.excludeNoindex !== false;\n const includeXDefault = options.includeXDefault !== false;\n const typeDefaults = options.typeDefaults?.[type.id];\n\n const pathnameFor = (doc: ScribeDocument): string =>\n options.resolvePathname?.(type, doc, defaultLocale) ??\n resolveCanonicalPathname(type, doc, defaultLocale);\n\n const alternates: Record<string, string> = {};\n\n for (const locale of locales) {\n const idx = allDocs.get(locale);\n if (!idx) continue;\n\n const doc =\n locale === defaultLocale\n ? idx.bySlug.get(enSlug)\n : idx.byEnSlug.get(enSlug);\n\n if (!doc) continue;\n if (excludeNoindex && doc.noindex) continue;\n\n const pathname = pathnameFor(doc);\n alternates[locale] = await options.resolveUrl(locale, pathname);\n }\n\n if (Object.keys(alternates).length === 0) return null;\n\n const mainUrl =\n alternates[defaultLocale] ?? alternates[Object.keys(alternates)[0]!]!;\n\n if (includeXDefault && alternates[defaultLocale]) {\n alternates[\"x-default\"] = alternates[defaultLocale];\n }\n\n const lastModified = documentLastModified(enDoc);\n\n return {\n url: mainUrl,\n ...(lastModified ? { lastModified } : {}),\n ...(typeDefaults?.changeFrequency\n ? { changeFrequency: typeDefaults.changeFrequency }\n : {}),\n ...(typeDefaults?.priority !== undefined ? { priority: typeDefaults.priority } : {}),\n alternates: { languages: alternates },\n };\n}\n\n/** Build sitemap entries with hreflang alternates for routable content types. */\nexport async function generateSitemap(\n project: ScribeProject,\n options: GenerateSitemapOptions,\n): Promise<SitemapEntry[]> {\n const resolvedOptions = resolveSitemapOptions(options);\n const { config } = project;\n const redirectSources = getRedirectSourceSlugs(project);\n const excludeNoindex = options.excludeNoindex !== false;\n\n const typeIds =\n options.contentTypes ??\n config.types.filter(isRoutableType).map((t) => t.id);\n\n const entries: SitemapEntry[] = [];\n\n for (const typeId of typeIds) {\n const runtime = project.getType(typeId);\n const type = runtime.config;\n if (!isRoutableType(type)) continue;\n\n const allDocs = runtime.load();\n const enIndex = allDocs.get(config.defaultLocale);\n if (!enIndex) continue;\n\n const processed = new Set<string>();\n\n for (const [enSlug, enDoc] of enIndex.bySlug) {\n if (processed.has(enSlug)) continue;\n processed.add(enSlug);\n\n if (\n !shouldIncludeEnDoc(enDoc, enSlug, redirectSources, typeId, excludeNoindex)\n ) {\n continue;\n }\n\n const entry = await buildClusterEntry(\n type,\n enSlug,\n enDoc,\n allDocs,\n config,\n resolvedOptions,\n );\n if (entry) entries.push(entry);\n }\n }\n\n return entries;\n}\n","import type {\n AssetUrlOptions,\n ContentTypeInput,\n ContentTypeRuntime,\n Scribe,\n ScribeConfigInput,\n} from \"./core/types.js\";\nimport { resolveConfig } from \"./config/resolve-config.js\";\nimport { createProject } from \"./create-project.js\";\nimport { joinPublicPath } from \"./loader/resolve-assets.js\";\nimport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nimport type { GenerateSitemapOptions } from \"./sitemap/types.js\";\n\n/**\n * Create the typed Scribe client. Each content type id becomes a typed\n * accessor (`scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …),\n * plus `scribe.sitemap()`.\n *\n * Pass the object returned by `defineConfig()`; defaults and path resolution\n * are applied here.\n */\nexport function createScribe<const TTypes extends readonly ContentTypeInput<any>[]>(\n input: ScribeConfigInput<TTypes>,\n): Scribe<TTypes> {\n const config = resolveConfig(input);\n const project = createProject(config, { resolveAssets: true, resolveInlineTokens: true });\n const scribe = {\n config,\n project,\n getType: project.getType,\n listTypes: project.listTypes,\n listRoutableTypes: project.listRoutableTypes,\n sitemap(options: GenerateSitemapOptions) {\n return generateSitemap(project, options);\n },\n assets: {\n url(ref: string, opts?: AssetUrlOptions) {\n if (opts && Object.keys(opts).length > 0) {\n throw new Error(\n `scribe.assets.url: options are reserved for a future pipeline; got ${Object.keys(opts).join(\", \")}`,\n );\n }\n const assetsConfig = config.assets;\n return assetsConfig ? joinPublicPath(assetsConfig.publicPath, ref) : ref;\n },\n },\n } as unknown as Scribe<TTypes>;\n\n for (const type of config.types) {\n (scribe as unknown as Record<string, ContentTypeRuntime>)[type.id] =\n project.getType(type.id);\n }\n\n return scribe;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ScribeConfig, ScribeConfigInput } from \"../core/types.js\";\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\n/** Find scribe.config.ts/mts/js in a directory. */\nexport function findConfigPath(cwd: string): string | null {\n const candidates = [\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.ts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.mts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.js\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate;\n }\n }\n return null;\n}\n\n/** Load and resolve scribe.config.ts synchronously (CLI). */\nexport function loadConfigSync(options: LoadConfigOptions = {}): ScribeConfig {\n const cwd = options.cwd ?? /* turbopackIgnore: true */ process.cwd();\n const configPath = options.configPath ?? findConfigPath(cwd);\n if (!configPath) {\n throw new Error(`No scribe.config.ts found in ${cwd} (pass --config)`);\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const loaded = jiti(configPath) as ScribeConfigInput | { default: ScribeConfigInput };\n const config = \"default\" in loaded ? loaded.default : loaded;\n if (!config?.rootDir) {\n throw new Error(`Invalid scribe config at ${configPath}: missing rootDir`);\n }\n return resolveConfig(config, path.dirname(configPath));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig, ScribeProject } from \"../core/types.js\";\nimport { enFileExists, listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport {\n loadAllTypeRedirects,\n loadTypeRedirectsFile,\n TYPE_REDIRECTS_FILENAME,\n} from \"../redirects/load-type-redirects.js\";\nimport type { ParsedRedirectEntry } from \"../redirects/redirect-schema.js\";\nimport type { ValidateIssue } from \"../validate/validate-project.js\";\n\nfunction liveDocExists(config: ScribeConfig, typeId: string, enSlug: string): boolean {\n const type = config.types.find((entry) => entry.id === typeId);\n if (!type) return false;\n return enFileExists(config, type, enSlug);\n}\n\nfunction resolveRedirectTarget(\n project: ScribeProject,\n sourceTypeId: string,\n entry: ParsedRedirectEntry,\n): { typeId: string; enSlug: string } | null {\n if (entry.kind === \"anywhere\") return null;\n if (entry.kind === \"cross-type\") {\n return { typeId: entry.toType!, enSlug: entry.toSlug! };\n }\n return { typeId: sourceTypeId, enSlug: entry.toSlug! };\n}\n\nfunction matchRoutableTarget(\n project: ScribeProject,\n toUrl: string,\n): { typeId: string; enSlug: string } | null {\n const urlBuilder = createUrlBuilder(project.config);\n for (const type of project.config.types) {\n if (!type.path) continue;\n const enSlug = urlBuilder.extractSlugFromResolvedPath(type.path, toUrl);\n if (enSlug && liveDocExists(project.config, type.id, enSlug)) {\n return { typeId: type.id, enSlug };\n }\n }\n return null;\n}\n\nexport function validateTypeRedirects(project: ScribeProject): ValidateIssue[] {\n const issues: ValidateIssue[] = [];\n const globalFrom = new Map<string, { typeId: string; filePath: string }>();\n\n for (const type of project.config.types) {\n const filePath = path.join(project.config.rootDir, type.contentDir, TYPE_REDIRECTS_FILENAME);\n if (!fs.existsSync(filePath)) continue;\n\n let loaded;\n try {\n loaded = loadTypeRedirectsFile(project.config, type);\n } catch (error) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n if (!loaded) continue;\n\n if (!isRoutableType(type)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirects are only supported on routable content types (missing path)`,\n });\n continue;\n }\n\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n if (entry.kind === \"same-type\" && from === entry.toSlug) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect source \"${from}\" must not equal its target slug`,\n });\n }\n\n if (liveDocExists(project.config, type.id, from)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect source \"${from}\" still has a live EN file — delete or rename the MDX first`,\n });\n }\n\n const existing = globalFrom.get(from);\n if (existing && existing.typeId !== type.id) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect source \"${from}\" is already claimed by ${existing.typeId}`,\n });\n } else if (existing) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Duplicate redirect source \"${from}\" in ${TYPE_REDIRECTS_FILENAME}`,\n });\n } else {\n globalFrom.set(from, { typeId: type.id, filePath: loaded.filePath });\n }\n }\n\n if (entry.kind === \"cross-type\") {\n const targetType = project.config.types.find((candidate) => candidate.id === entry.toType);\n if (!targetType) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Unknown redirect target type \"${entry.toType}\"`,\n });\n continue;\n }\n if (!isRoutableType(targetType)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect target type \"${entry.toType}\" is not routable (missing path)`,\n });\n continue;\n }\n }\n\n const target = resolveRedirectTarget(project, type.id, entry);\n if (target) {\n if (!liveDocExists(project.config, target.typeId, target.enSlug)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect target ${target.typeId}/${target.enSlug} does not exist`,\n });\n }\n continue;\n }\n\n if (entry.kind === \"anywhere\" && entry.toUrl?.startsWith(\"/\")) {\n const matched = matchRoutableTarget(project, entry.toUrl);\n if (matched && !liveDocExists(project.config, matched.typeId, matched.enSlug)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect toUrl \"${entry.toUrl}\" does not resolve to a live document`,\n });\n }\n }\n }\n }\n\n const allLoaded = loadAllTypeRedirects(project.config);\n for (const file of allLoaded) {\n for (const entry of file.entries) {\n if (entry.kind === \"anywhere\" || !entry.toSlug) continue;\n const targetTypeId = entry.kind === \"cross-type\" ? entry.toType! : file.contentTypeId;\n const targetType = project.config.types.find((type) => type.id === targetTypeId);\n if (!targetType?.path) continue;\n\n for (const from of entry.fromSlugs) {\n if (globalFrom.get(from)?.typeId !== file.contentTypeId) continue;\n\n const targetAsSource = globalFrom.get(entry.toSlug!);\n if (!targetAsSource) continue;\n\n const sameSlugCrossType =\n entry.kind === \"cross-type\" &&\n entry.fromSlugs.includes(entry.toSlug!) &&\n targetAsSource.typeId === file.contentTypeId;\n\n if (sameSlugCrossType) continue;\n\n issues.push({\n level: \"error\",\n contentType: file.contentTypeId,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect chain detected: \"${from}\" → \"${entry.toSlug}\" → existing redirect source`,\n });\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { listRelationFields } from \"../core/introspect-schema.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\n\nexport interface RelationValidateIssue {\n contentTypeId: string;\n enSlug: string;\n locale?: string;\n field: string;\n message: string;\n /**\n * Dangling required single relations are errors (`related()` would throw at\n * render); dangling optional/multiple relations degrade gracefully to\n * null/dropped items, so they only warn.\n */\n level: \"error\" | \"warning\";\n}\n\nfunction getAtPath(obj: Record<string, unknown>, fieldPath: string[]): unknown {\n let current: unknown = obj;\n for (const segment of fieldPath) {\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nexport function buildEnSlugIndex(config: ScribeConfig): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>();\n for (const type of config.types) {\n const slugs = new Set(listEnSlugs(config.rootDir, type.contentDir));\n index.set(type.id, slugs);\n }\n return index;\n}\n\nfunction listEnSlugsForType(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/**\n * Warn when a relation field references a slug that does not exist in the target type.\n */\nexport function validateRelations(project: ScribeProject): RelationValidateIssue[] {\n const { config } = project;\n const slugIndex = buildEnSlugIndex(config);\n const issues: RelationValidateIssue[] = [];\n\n const typeIds = new Set(config.types.map((t) => t.id));\n\n for (const type of config.types) {\n const relationFields = listRelationFields(type.schema);\n if (relationFields.length === 0) continue;\n\n for (const enSlug of listEnSlugsForType(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n for (const fieldMeta of relationFields) {\n const targetTypeId = fieldMeta.relationTarget!;\n const danglingLevel =\n fieldMeta.relationOptional || fieldMeta.relationMultiple ? \"warning\" : \"error\";\n if (!typeIds.has(targetTypeId)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldMeta.path.join(\".\"),\n message: `Relation target type \"${targetTypeId}\" is not registered`,\n level: \"error\",\n });\n continue;\n }\n\n const value = getAtPath(doc.frontmatter as Record<string, unknown>, fieldMeta.path);\n if (value === undefined || value === null || value === \"\") continue;\n\n const targetSlugs = slugIndex.get(targetTypeId) ?? new Set<string>();\n const fieldLabel = fieldMeta.path.join(\".\");\n\n if (fieldMeta.relationMultiple) {\n if (!Array.isArray(value)) continue;\n for (const slug of value) {\n if (typeof slug !== \"string\" || !slug) continue;\n if (!targetSlugs.has(slug)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${slug}\" — no ${targetTypeId} doc with that slug`,\n level: danglingLevel,\n });\n }\n }\n } else if (typeof value === \"string\") {\n if (!targetSlugs.has(value)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${value}\" — no ${targetTypeId} doc with slug \"${value}\"`,\n level: danglingLevel,\n });\n }\n }\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { z } from \"zod\";\nimport { listAssetFields, type SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ScribeConfig } from \"../core/types.js\";\n\nconst IMAGE_EXT = String.raw`(?:png|jpe?g|webp|gif|svg)`;\nconst IMAGE_WEB_PATH = String.raw`\\/[\\w\\-./]+\\.${IMAGE_EXT}`;\nconst MARKDOWN_IMAGE_RE = new RegExp(\n String.raw`!\\[[^\\]]*\\]\\((${IMAGE_WEB_PATH})\\)`,\n \"gi\",\n);\nconst HTML_SRC_RE = new RegExp(String.raw`src=[\"'](${IMAGE_WEB_PATH})[\"']`, \"gi\");\n\nfunction isImageWebPath(value: string): boolean {\n return new RegExp(String.raw`^${IMAGE_WEB_PATH}$`, \"i\").test(value);\n}\n\nfunction isSiteAssetPath(webPath: string): boolean {\n const segment = webPath.split(\"/\")[1];\n return Boolean(segment && !segment.includes(\".\"));\n}\n\nfunction addImagePath(webPath: string, out: Set<string>): void {\n if (isSiteAssetPath(webPath)) out.add(webPath);\n}\n\nfunction collectBodyImagePaths(body: string, out: Set<string>): void {\n for (const re of [MARKDOWN_IMAGE_RE, HTML_SRC_RE]) {\n for (const match of body.matchAll(re)) {\n addImagePath(match[1]!, out);\n }\n }\n}\n\nfunction collectFrontmatterImagePaths(value: unknown, out: Set<string>): void {\n if (typeof value === \"string\") {\n if (isImageWebPath(value)) addImagePath(value, out);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectFrontmatterImagePaths(item, out);\n return;\n }\n if (value && typeof value === \"object\") {\n for (const nested of Object.values(value as Record<string, unknown>)) {\n collectFrontmatterImagePaths(nested, out);\n }\n }\n}\n\n/** Collect absolute web paths to image assets from frontmatter values and MDX body. */\nexport function collectImagePaths(frontmatter: unknown, body: string): string[] {\n const paths = new Set<string>();\n collectFrontmatterImagePaths(frontmatter, paths);\n collectBodyImagePaths(body, paths);\n return [...paths].sort();\n}\n\nfunction assetFilePath(assetsPath: string, webPath: string): string {\n return path.join(assetsPath, webPath.replace(/^\\//, \"\"));\n}\n\nexport interface AssetValidateIssue {\n level: \"error\" | \"warning\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\n/**\n * Warn when referenced image paths are missing from the configured assets\n * folder. Heuristic pass over frontmatter strings and MDX body images.\n *\n * @param skipPaths web paths already covered by declared-asset validation\n * (`validateDeclaredAssetFields`), skipped here to avoid duplicate reporting.\n */\nexport function validateDocumentAssets(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n locale?: string;\n frontmatter: unknown;\n body: string;\n },\n skipPaths?: Set<string>,\n): AssetValidateIssue[] {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return [];\n\n const issues: AssetValidateIssue[] = [];\n for (const webPath of collectImagePaths(input.frontmatter, input.body)) {\n if (skipPaths?.has(webPath)) continue;\n const filePath = assetFilePath(assetsPath, webPath);\n if (fs.existsSync(filePath)) continue;\n issues.push({\n level: \"warning\",\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n field: \"asset\",\n message: `Missing image asset ${webPath} (expected ${filePath})`,\n });\n }\n return issues;\n}\n\n/** Collect each concrete asset-field location value from frontmatter (arrays at `*`). */\nfunction collectAssetValues(\n container: unknown,\n path: string[],\n out: Array<{ fieldPath: string; value: string | undefined }>,\n fieldPathSoFar: string[] = [],\n): void {\n const [head, ...rest] = path;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n\n if (rest.length === 0) {\n const value = record[head];\n out.push({\n fieldPath: [...fieldPathSoFar, head].join(\".\"),\n value: typeof value === \"string\" ? value : undefined,\n });\n return;\n }\n\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (!Array.isArray(arr)) {\n // No array present: report a single absent location for attribution.\n out.push({ fieldPath: [...fieldPathSoFar, head, \"*\", ...rest.slice(1)].join(\".\"), value: undefined });\n return;\n }\n arr.forEach((item) => {\n collectAssetValues(item, rest.slice(1), out, [...fieldPathSoFar, head, \"*\"]);\n });\n return;\n }\n\n collectAssetValues(record[head], rest, out, [...fieldPathSoFar, head]);\n}\n\nfunction normalizeDir(dir: string): string {\n return `/${dir.replace(/^\\/+|\\/+$/g, \"\")}`;\n}\n\n/**\n * Validate declared `field.asset()` fields against the assets folder: required\n * fields present, files exist, values inside `dir`, extensions in `formats`,\n * sizes within `maxKB`, and templated paths materialized. Missing required or\n * present-but-absent files are errors; format/size violations are warnings.\n * Source frontmatter (unresolved) is expected. EN-sourced (structural) only.\n */\nexport function validateDeclaredAssetFields(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n locale?: string;\n frontmatter: Record<string, unknown>;\n schema: z.ZodTypeAny;\n },\n): AssetValidateIssue[] {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return [];\n\n const issues: AssetValidateIssue[] = [];\n const attrib = (fieldPath: string, level: \"error\" | \"warning\", message: string) =>\n issues.push({\n level,\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n field: fieldPath,\n message,\n });\n\n for (const f of listAssetFields(input.schema)) {\n const locations: Array<{ fieldPath: string; value: string | undefined }> = [];\n collectAssetValues(input.frontmatter, f.path, locations);\n\n for (const { fieldPath, value } of locations) {\n let effective = value;\n // Templated field with no explicit value: materialize the derived path.\n if (effective === undefined && f.assetTemplate) {\n effective = f.assetTemplate.split(\"{slug}\").join(input.enSlug);\n }\n\n if (effective === undefined) {\n if (!f.assetOptional) {\n attrib(fieldPath, \"error\", `${input.contentType}/${input.enSlug}: ${fieldPath} is required but missing`);\n }\n continue;\n }\n\n if (f.assetDir) {\n const dir = normalizeDir(f.assetDir);\n if (!(effective === dir || effective.startsWith(`${dir}/`))) {\n attrib(\n fieldPath,\n \"error\",\n `${input.contentType}/${input.enSlug}: ${fieldPath} value ${effective} is outside declared dir ${dir}`,\n );\n }\n }\n\n const filePath = assetFilePath(assetsPath, effective);\n if (!fs.existsSync(filePath)) {\n attrib(fieldPath, \"error\", `${input.contentType}/${input.enSlug}: ${fieldPath} → ${effective} not found`);\n continue;\n }\n\n if (f.assetFormats && f.assetFormats.length > 0) {\n const ext = path.extname(effective).slice(1).toLowerCase();\n if (!f.assetFormats.includes(ext)) {\n attrib(\n fieldPath,\n \"warning\",\n `${input.contentType}/${input.enSlug}: ${fieldPath} → ${effective} extension .${ext} not in formats [${f.assetFormats.join(\", \")}]`,\n );\n }\n }\n\n if (f.assetMaxKB !== undefined) {\n try {\n const sizeKB = fs.statSync(filePath).size / 1024;\n if (sizeKB > f.assetMaxKB) {\n attrib(\n fieldPath,\n \"warning\",\n `${input.contentType}/${input.enSlug}: ${fieldPath} → ${effective} is ${Math.round(sizeKB)}KB, over the ${f.assetMaxKB}KB budget`,\n );\n }\n } catch {\n /* stat failure already implies a missing file, handled above */\n }\n }\n }\n }\n\n return issues;\n}\n\n/** Source (unresolved) web paths of every declared asset field, for heuristic skip. */\nexport function collectDeclaredAssetPaths(\n frontmatter: Record<string, unknown>,\n enSlug: string,\n schema: z.ZodTypeAny,\n fields?: SchemaFieldMeta[],\n): Set<string> {\n const out = new Set<string>();\n for (const f of fields ?? listAssetFields(schema)) {\n const locations: Array<{ fieldPath: string; value: string | undefined }> = [];\n collectAssetValues(frontmatter, f.path, locations);\n for (const { value } of locations) {\n if (value !== undefined) out.add(value);\n else if (f.assetTemplate) out.add(f.assetTemplate.split(\"{slug}\").join(enSlug));\n }\n }\n return out;\n}\n","/** GEN-241: translated slugs must not end with a locale code suffix. */\n\nexport function findLocaleSuffixInSlug(\n slug: string,\n localeCodes: readonly string[],\n): string | undefined {\n const sorted = [...localeCodes].sort((a, b) => b.length - a.length);\n for (const code of sorted) {\n if (slug.endsWith(`-${code}`)) {\n return code;\n }\n }\n return undefined;\n}\n\nexport function stripLocaleSuffixFromSlug(\n slug: string,\n localeCodes: readonly string[],\n): { slug: string; stripped: boolean; matchedCode?: string } {\n const matchedCode = findLocaleSuffixInSlug(slug, localeCodes);\n if (!matchedCode) {\n return { slug, stripped: false };\n }\n return {\n slug: slug.slice(0, -(matchedCode.length + 1)),\n stripped: true,\n matchedCode,\n };\n}\n","import type Database from \"better-sqlite3\";\nimport { findLocaleSuffixInSlug } from \"../core/localized-slug.js\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\n\nexport interface SlugSuffixIssue {\n contentTypeId: string;\n enSlug: string;\n locale: string;\n slug: string;\n message: string;\n}\n\n/** GEN-241: translated slugs must not end with a locale code suffix. */\nexport function validateTranslationSlugSuffixes(\n config: ScribeConfig,\n db: Database.Database,\n): SlugSuffixIssue[] {\n const issues: SlugSuffixIssue[] = [];\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n\n for (const row of bulkLoadTranslations(db)) {\n if (row.locale === config.defaultLocale) continue;\n\n const matchedCode = findLocaleSuffixInSlug(row.slug, localeCodes);\n if (matchedCode) {\n issues.push({\n contentTypeId: row.content_type,\n enSlug: row.en_slug,\n locale: row.locale,\n slug: row.slug,\n message: `Translation slug \"${row.slug}\" ends with locale code \"-${matchedCode}\"`,\n });\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { extractInlineTokens } from \"../inline/tokens.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { buildEnSlugIndex } from \"./validate-relations.js\";\nimport type { ValidateIssue } from \"./validate-project.js\";\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every((v) => typeof v === \"string\");\n}\n\nfunction assetFileExists(config: ScribeConfig, webPath: string): boolean {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return true; // no asset system configured: cannot check\n return fs.existsSync(path.join(assetsPath, webPath.replace(/^\\//, \"\")));\n}\n\n/**\n * Validate `${{...}}` inline tokens in EN document bodies. Entry-level issues so\n * the studio badges pick them up automatically. Covers malformed syntax and each\n * token kind's referential integrity (relation target/slug, asset file, var\n * key). Static tokens are always valid.\n */\nexport function validateInlineTokens(config: ScribeConfig): ValidateIssue[] {\n const issues: ValidateIssue[] = [];\n const slugIndex = buildEnSlugIndex(config);\n const typeIds = new Set(config.types.map((t) => t.id));\n const typeById = new Map(config.types.map((t) => [t.id, t]));\n\n for (const type of config.types) {\n for (const enSlug of listEnSlugs(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n const { tokens, malformed } = extractInlineTokens(doc.content);\n\n for (const bad of malformed) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Malformed inline token (${bad.reason}): ${bad.raw}`,\n });\n }\n\n let varsReported = false;\n const vars = (doc.frontmatter as Record<string, unknown>).vars;\n\n for (const token of tokens) {\n switch (token.kind) {\n case \"static\":\n break;\n\n case \"relation\": {\n if (!typeIds.has(token.targetTypeId)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token targets unknown type \"${token.targetTypeId}\"`,\n });\n break;\n }\n const targetSlugs = slugIndex.get(token.targetTypeId) ?? new Set<string>();\n if (!targetSlugs.has(token.enSlug)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token references \"${token.enSlug}\", but no ${token.targetTypeId} doc has that slug`,\n });\n break;\n }\n if (token.mode === \"url\") {\n const targetType = typeById.get(token.targetTypeId)!;\n if (!isRoutableType(targetType)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token resolves a URL for \"${token.targetTypeId}\", which has no path template (not routable)`,\n });\n }\n }\n break;\n }\n\n case \"asset\": {\n if (!assetFileExists(config, token.webPath)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline asset token references ${token.webPath}, which is missing on disk`,\n });\n }\n break;\n }\n\n case \"var\": {\n if (vars !== undefined && !isStringRecord(vars)) {\n if (!varsReported) {\n varsReported = true;\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"vars\",\n message: `Frontmatter \"vars\" must be a string-to-string map`,\n });\n }\n break;\n }\n if (!isStringRecord(vars) || !(token.key in vars)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline var token references \"${token.key}\", absent from this document's vars map`,\n });\n }\n break;\n }\n }\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport { createProject } from \"../create-project.js\";\nimport { validateTypeRedirects } from \"./validate-redirects.js\";\nimport { validateLocaleBuiltinFields } from \"../core/builtin-fields.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { getTranslation } from \"../storage/translations.js\";\nimport { validateRelations } from \"./validate-relations.js\";\nimport {\n collectDeclaredAssetPaths,\n validateDeclaredAssetFields,\n validateDocumentAssets,\n} from \"./validate-assets.js\";\nimport { validateTranslationSlugSuffixes } from \"./validate-slug-suffix.js\";\nimport { validateInlineTokens } from \"./validate-inline-tokens.js\";\nimport { maskInlineTokensForMdx } from \"../inline/tokens.js\";\nimport { prepareTranslatedMdxBody, validateMdxBody } from \"../translate/validate-mdx-body.js\";\n\nexport interface ValidateIssue {\n level: \"error\" | \"warning\" | \"info\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: ValidateIssue[];\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/**\n * Read the raw MDX body of a bodyless-type EN entry (the loader zeroes it, so we\n * re-read the source) and report an error when it holds anything but whitespace.\n */\nfunction validateBodylessEntry(\n issues: ValidateIssue[],\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): void {\n const contentDir = path.join(config.rootDir, type.contentDir);\n for (const ext of [\".mdx\", \".md\"]) {\n const filePath = path.join(contentDir, `${enSlug}${ext}`);\n if (!fs.existsSync(filePath)) continue;\n const body = matter(fs.readFileSync(filePath, \"utf8\")).content;\n if (body.trim().length > 0) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `type \"${type.id}\" is frontmatter-only (body: false) but the entry has body content`,\n });\n }\n return;\n }\n}\n\nfunction validateDocumentMdxBody(\n issues: ValidateIssue[],\n input: {\n contentType: string;\n enSlug: string;\n locale: string;\n body: string;\n },\n): void {\n // Mask inline tokens (and escapes) to inert text first so their `${{`/`{{`\n // braces never register as MDX parse errors. Well-formed and malformed tokens\n // alike are neutralized here; malformed ones are reported by the dedicated\n // inline-token validation pass instead.\n const preparedBody = prepareTranslatedMdxBody(maskInlineTokensForMdx(input.body)).body;\n const mdxValidation = validateMdxBody(preparedBody);\n if (!mdxValidation.ok) {\n issues.push({\n level: \"error\",\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n field: \"body\",\n message: `Invalid MDX: ${mdxValidation.error}`,\n });\n }\n}\n\n/** Validate EN files, SQLite consistency, relations, aliases, slug rules, and assets. */\nexport function validateProject(config: ScribeConfig): ValidateResult {\n const issues: ValidateIssue[] = [];\n const project = createProject(config);\n const storePath = project.storePath;\n\n if (!fs.existsSync(storePath)) {\n issues.push({\n level: \"error\",\n message: `Missing store.sqlite at ${storePath}`,\n });\n return { ok: false, issues };\n }\n\n const db = openStore(config, \"readonly\");\n\n for (const type of config.types) {\n const enSlugs = listEnSlugs(config.rootDir, type.contentDir);\n const englishSlugs = new Set(enSlugs);\n\n if (!type.translate && isRoutableType(type)) {\n issues.push({\n level: \"warning\",\n contentType: type.id,\n message: `No translate config on content type \"${type.id}\" — using Scribe defaults`,\n });\n }\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n message: \"Failed to parse EN document\",\n });\n continue;\n }\n\n const crossIssues =\n type.crossValidate?.(enDoc.frontmatter as never, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug: enSlug,\n enSlug,\n knownLocales: config.locales,\n englishSlugs,\n }) ?? [];\n for (const issue of crossIssues) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n // Declared asset fields are EN-sourced structural: validate on EN only.\n // Locale docs never store them, so they'd otherwise read as \"required missing\".\n for (const issue of validateDeclaredAssetFields(config, {\n contentType: type.id,\n enSlug,\n frontmatter: enDoc.frontmatter as Record<string, unknown>,\n schema: type.schema,\n })) {\n issues.push(issue);\n }\n\n // Skip declared-asset web paths in the heuristic pass (EN + locales) to\n // avoid double reporting the same missing file at different levels.\n const declaredAssetPaths = collectDeclaredAssetPaths(\n enDoc.frontmatter as Record<string, unknown>,\n enSlug,\n type.schema,\n );\n\n for (const issue of validateDocumentAssets(\n config,\n {\n contentType: type.id,\n enSlug,\n frontmatter: enDoc.frontmatter,\n body: enDoc.content,\n },\n declaredAssetPaths,\n )) {\n issues.push(issue);\n }\n\n if (type.body === false) {\n // Frontmatter-only type: no MDX body work; instead flag a stray body.\n validateBodylessEntry(issues, config, type, enSlug);\n } else {\n validateDocumentMdxBody(issues, {\n contentType: type.id,\n enSlug,\n locale: config.defaultLocale,\n body: enDoc.content,\n });\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const row = getTranslation(db, type.id, enSlug, locale);\n if (!row) continue;\n\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n for (const issue of validateLocaleBuiltinFields(localeFm)) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n locale,\n field: issue.field,\n message: issue.message,\n });\n }\n\n const preparedBody = prepareTranslatedMdxBody(row.body).body;\n for (const issue of validateDocumentAssets(\n config,\n {\n contentType: type.id,\n enSlug,\n locale,\n frontmatter: localeFm,\n body: preparedBody,\n },\n declaredAssetPaths,\n )) {\n issues.push(issue);\n }\n\n if (type.body !== false) {\n validateDocumentMdxBody(issues, {\n contentType: type.id,\n enSlug,\n locale,\n body: row.body,\n });\n }\n }\n }\n\n try {\n project.getType(type.id).load();\n } catch (error) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n db.close();\n\n for (const issue of validateTypeRedirects(project)) {\n issues.push(issue);\n }\n\n for (const issue of validateRelations(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateInlineTokens(config)) {\n issues.push(issue);\n }\n\n const dbForSuffix = openStore(config, \"readonly\");\n try {\n for (const issue of validateTranslationSlugSuffixes(config, dbForSuffix)) {\n issues.push({\n level: \"warning\",\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n locale: issue.locale,\n field: \"slug\",\n message: issue.message,\n });\n }\n } finally {\n dbForSuffix.close();\n }\n\n return { ok: issues.every((i) => i.level !== \"error\"), issues };\n}\n","import { createHash } from \"node:crypto\";\n// tokens.js is dependency-light (it imports nothing back into hashing), so this\n// import introduces no cycle.\nimport { extractInlineTokens } from \"../inline/tokens.js\";\n\n/** SHA-256 hex digest of a UTF-8 string. */\nexport function sha256(input: string): string {\n return createHash(\"sha256\").update(input, \"utf8\").digest(\"hex\");\n}\n\n/** Hash translatable frontmatter + body for translation staleness detection. */\nexport function computePageEnHash(\n translatableFrontmatter: Record<string, unknown>,\n body: string,\n): string {\n const payload = JSON.stringify({ frontmatter: translatableFrontmatter, body });\n return sha256(payload);\n}\n\n/**\n * Canonical EN hash for translation staleness. Extracts inline tokens first and\n * hashes the PLACEHOLDER body, so a token's value never restales a locale while\n * adding/removing/moving tokens does. Every staleness-relevant site (translation\n * prepare, worklist, studio badges) MUST route through this so the two ends of a\n * comparison cannot diverge. A tokenless body hashes identically to\n * `computePageEnHash(frontmatter, body)`.\n */\nexport function computeTranslationEnHash(\n translatableFrontmatter: Record<string, unknown>,\n body: string,\n): string {\n const { placeholderBody } = extractInlineTokens(body);\n return computePageEnHash(translatableFrontmatter, placeholderBody);\n}\n\n/** Hash MDX body content for revision tracking. */\nexport function computeBodyHash(body: string): string {\n return sha256(body);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport { isTypeTranslatable } from \"../core/introspect-schema.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { computeTranslationEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation } from \"../storage/translations.js\";\n\nexport interface TranslationWorkItem {\n contentType: string;\n enSlug: string;\n locale: string;\n reason: \"missing\" | \"stale\" | \"forced\";\n currentEnHash: string;\n storedEnHash?: string;\n /**\n * Verbatim validation error from a prior attempt in the same run. Set only for\n * the one-shot retry round; appended to the prompt's locale-specific suffix so\n * the model can correct the exact issues.\n */\n previousError?: string;\n}\n\nexport type TranslationWorklistStrategy = \"all\" | \"missing-only\";\n\nexport interface WorklistOptions {\n /** Single id or comma-separated ids (e.g. `vertical,platform`). */\n contentType?: string;\n locales?: string[];\n enSlug?: string;\n /** Which pages to include: all stale/missing (default) or missing only. */\n strategy?: TranslationWorklistStrategy;\n /** Include fresh translations so prepareTranslation re-runs despite matching hashes. */\n force?: boolean;\n /**\n * Called once for each content type skipped because it is not translatable\n * (bodyless with no translatable fields). The CLI uses it to emit the\n * per-type \"skipped\" log line; other callers (studio) leave it unset for a\n * silent skip.\n */\n onSkipType?: (type: ContentTypeConfig) => void;\n}\n\nfunction parseContentTypeFilter(contentType?: string): Set<string> | undefined {\n if (!contentType) return undefined;\n const ids = contentType\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n return ids.length > 0 ? new Set(ids) : undefined;\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/** List locale pages that are missing or stale vs current EN content. */\nexport function buildWorklist(config: ScribeConfig, options: WorklistOptions = {}): TranslationWorkItem[] {\n const db = openStore(config, \"readonly\");\n const items: TranslationWorkItem[] = [];\n const locales =\n options.locales ??\n config.locales.filter((locale) => locale !== config.defaultLocale);\n const contentTypes = parseContentTypeFilter(options.contentType);\n\n for (const type of config.types) {\n if (contentTypes && !contentTypes.has(type.id)) continue;\n // A type with nothing to translate (bodyless, no translatable fields) never\n // produces work items — it stays out of the worklist, staleness totals, and\n // the store. This is the single predicate every translation workflow shares.\n if (!isTypeTranslatable(type)) {\n options.onSkipType?.(type);\n continue;\n }\n const enSlugs = options.enSlug ? [options.enSlug] : listEnSlugs(config.rootDir, type.contentDir);\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) continue;\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computeTranslationEnHash(payload.frontmatter, payload.body);\n\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n const existing = getTranslation(db, type.id, enSlug, locale);\n if (!existing) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: \"missing\",\n currentEnHash,\n });\n continue;\n }\n const stale = existing.en_hash !== currentEnHash;\n if (stale || options.force) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: stale ? \"stale\" : \"forced\",\n currentEnHash,\n storedEnHash: existing.en_hash,\n });\n }\n }\n }\n }\n\n db.close();\n const strategy = options.strategy ?? \"all\";\n if (strategy === \"missing-only\") {\n return items.filter((item) => item.reason === \"missing\");\n }\n return items;\n}\n\n/** Resolve target locales from CLI flags or a named preset. */\nexport function resolveLocalesFromPreset(\n config: ScribeConfig,\n preset?: string,\n explicitLocales?: string[],\n): string[] {\n if (explicitLocales?.length) return explicitLocales;\n if (preset && config.localePresets?.[preset]) {\n return config.localePresets[preset]!.filter((l) => l !== config.defaultLocale);\n }\n return config.locales.filter((l) => l !== config.defaultLocale);\n}\n","import type Database from \"better-sqlite3\";\n\nexport type BatchItemStatus = \"pending\" | \"done\" | \"failed\" | \"stale-skipped\";\n\nexport interface BatchJobRow {\n id: number;\n job_name: string;\n model: string;\n display_model: string;\n created_at: string;\n state: string;\n completed_at: string | null;\n}\n\nexport interface BatchItemRow {\n job_id: number;\n request_index: number;\n content_type: string;\n en_slug: string;\n locale: string;\n en_hash: string;\n snapshot_id: number;\n status: BatchItemStatus;\n error: string | null;\n}\n\nexport interface BatchJobInput {\n jobName: string;\n model: string;\n displayModel: string;\n state: string;\n createdAt: string;\n}\n\nexport interface BatchItemInput {\n requestIndex: number;\n contentType: string;\n enSlug: string;\n locale: string;\n enHash: string;\n snapshotId: number;\n}\n\nexport function insertBatchJob(db: Database.Database, input: BatchJobInput): number {\n const info = db\n .prepare(\n `INSERT INTO translation_batch_jobs (job_name, model, display_model, created_at, state)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(input.jobName, input.model, input.displayModel, input.createdAt, input.state);\n return Number(info.lastInsertRowid);\n}\n\nexport function insertBatchItems(\n db: Database.Database,\n jobId: number,\n items: BatchItemInput[],\n): void {\n const stmt = db.prepare(\n `INSERT INTO translation_batch_items (\n job_id, request_index, content_type, en_slug, locale, en_hash, snapshot_id, status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')`,\n );\n for (const item of items) {\n stmt.run(\n jobId,\n item.requestIndex,\n item.contentType,\n item.enSlug,\n item.locale,\n item.enHash,\n item.snapshotId,\n );\n }\n}\n\n/** Jobs not yet fully ingested (no completed_at), oldest first. */\nexport function listPendingBatchJobs(db: Database.Database): BatchJobRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_jobs WHERE completed_at IS NULL ORDER BY id`)\n .all() as BatchJobRow[];\n}\n\nexport function listBatchItems(db: Database.Database, jobId: number): BatchItemRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_items WHERE job_id = ? ORDER BY request_index`)\n .all(jobId) as BatchItemRow[];\n}\n\n/** Pending items across all non-completed jobs (i.e. requests still in flight). */\nexport function listPendingBatchItems(db: Database.Database): BatchItemRow[] {\n return db\n .prepare(\n `SELECT i.* FROM translation_batch_items i\n JOIN translation_batch_jobs j ON j.id = i.job_id\n WHERE j.completed_at IS NULL AND i.status = 'pending'\n ORDER BY i.job_id, i.request_index`,\n )\n .all() as BatchItemRow[];\n}\n\n/**\n * Atomically claim a terminal job for ingestion by stamping completed_at.\n * Returns false when another process already completed it — concurrent scribe\n * runs adopt each other's pending jobs, so two pollers can reach the same\n * terminal job; only the one whose claim succeeds may ingest its results.\n */\nexport function claimBatchJobCompletion(\n db: Database.Database,\n jobId: number,\n state: string,\n completedAt: string,\n): boolean {\n const info = db\n .prepare(\n `UPDATE translation_batch_jobs SET state = ?, completed_at = ?\n WHERE id = ? AND completed_at IS NULL`,\n )\n .run(state, completedAt, jobId);\n return info.changes > 0;\n}\n\nexport function updateBatchItemStatus(\n db: Database.Database,\n jobId: number,\n requestIndex: number,\n status: BatchItemStatus,\n error?: string,\n): void {\n db.prepare(\n `UPDATE translation_batch_items SET status = ?, error = ? WHERE job_id = ? AND request_index = ?`,\n ).run(status, error ?? null, jobId, requestIndex);\n}\n","import type Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getOrCreateEnSnapshot } from \"../storage/translations.js\";\n\n/** Record (or reuse) a deduplicated EN-source snapshot for a translation run. */\nexport function recordEnSnapshot(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n },\n db?: Database.Database,\n): number {\n const ownDb = db ?? openStore(config, \"readwrite\");\n const id = getOrCreateEnSnapshot(ownDb, {\n contentType: input.contentType,\n enSlug: input.enSlug,\n enHash: input.enHash,\n frontmatter: input.frontmatter,\n body: input.body,\n createdAt: new Date().toISOString(),\n });\n if (!db) ownDb.close();\n return id;\n}\n","import { ApiError } from \"@google/genai\";\n\n/** HTTP status codes worth retrying: rate limiting + transient server errors. */\nconst TRANSIENT_STATUS = new Set([429, 500, 502, 503, 504]);\n\nfunction statusFromError(error: unknown): number | undefined {\n if (error instanceof ApiError && typeof error.status === \"number\") {\n return error.status;\n }\n // Some SDK paths surface a plain object/error with a numeric `status`.\n if (error && typeof error === \"object\" && \"status\" in error) {\n const status = (error as { status?: unknown }).status;\n if (typeof status === \"number\") return status;\n }\n // Fall back to matching a status code embedded in the message.\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/\\b(429|500|502|503|504)\\b/);\n if (match) return Number(match[1]);\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n const err = error as { code?: unknown; name?: unknown } | null;\n const code = typeof err?.code === \"string\" ? err.code : \"\";\n if (\n code === \"ECONNRESET\" ||\n code === \"ETIMEDOUT\" ||\n code === \"ECONNREFUSED\" ||\n code === \"ENOTFOUND\" ||\n code === \"EAI_AGAIN\" ||\n code === \"EPIPE\" ||\n code === \"UND_ERR_SOCKET\"\n ) {\n return true;\n }\n const message = error instanceof Error ? error.message.toLowerCase() : \"\";\n return (\n message.includes(\"network\") ||\n message.includes(\"fetch failed\") ||\n message.includes(\"socket hang up\") ||\n message.includes(\"terminated\")\n );\n}\n\n/** Classify whether an error is transient and safe to retry. */\nexport function isTransientError(error: unknown): boolean {\n const status = statusFromError(error);\n if (status !== undefined) return TRANSIENT_STATUS.has(status);\n return isNetworkError(error);\n}\n\nexport interface RetryOptions {\n attempts?: number;\n baseDelayMs?: number;\n /** Injectable sleep for tests; defaults to real setTimeout. */\n sleep?: (ms: number) => Promise<void>;\n /** Injectable jitter in [0, 1); defaults to Math.random. */\n random?: () => number;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/**\n * Run `fn` with exponential backoff + jitter, retrying only transient failures\n * (HTTP 429/5xx and network errors). Non-transient errors throw immediately.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const attempts = Math.max(1, options.attempts ?? 3);\n const baseDelayMs = options.baseDelayMs ?? 1000;\n const sleep = options.sleep ?? defaultSleep;\n const random = options.random ?? Math.random;\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (attempt >= attempts || !isTransientError(error)) throw error;\n // Exponential backoff with full jitter: attempt 1 -> ~1s, attempt 2 -> ~2-4s.\n const backoff = baseDelayMs * 2 ** (attempt - 1);\n const delay = backoff + random() * backoff;\n await sleep(delay);\n }\n }\n throw lastError;\n}\n","import {\n type BatchJob,\n GoogleGenAI,\n type JobState,\n type GenerateContentResponse,\n type InlinedRequest,\n} from \"@google/genai\";\nimport { withRetry } from \"./retry.js\";\n\n// The SDK documents JOB_STATE_* names but the live API reports BATCH_STATE_*;\n// the SDK maps only the states it knows to JOB_STATE_* and passes the rest\n// through, so both families (and states persisted in either form) must be\n// tolerated. Compare on the bare state name.\nconst STATE_FAMILY_PREFIX = /^(JOB_STATE_|BATCH_STATE_)/;\n\nconst TERMINAL_STATES = new Set([\n \"SUCCEEDED\",\n \"FAILED\",\n \"CANCELLED\",\n \"EXPIRED\",\n \"PARTIALLY_SUCCEEDED\",\n]);\n\nconst SUCCESSFUL_STATES = new Set([\"SUCCEEDED\", \"PARTIALLY_SUCCEEDED\"]);\n\n/** Strip the JOB_STATE_/BATCH_STATE_ family prefix: \"BATCH_STATE_RUNNING\" -> \"RUNNING\". */\nexport function normalizeBatchState(state: JobState | string | undefined): string {\n return String(state ?? \"UNKNOWN\").replace(STATE_FAMILY_PREFIX, \"\");\n}\n\nexport function isTerminalBatchState(state: JobState | string | undefined): boolean {\n return TERMINAL_STATES.has(normalizeBatchState(state));\n}\n\nexport function isSuccessfulBatchState(state: JobState | string | undefined): boolean {\n return SUCCESSFUL_STATES.has(normalizeBatchState(state));\n}\n\nfunction makeClient(apiKey?: string): GoogleGenAI {\n const key = apiKey ?? process.env.GEMINI_API_KEY;\n if (!key) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n return new GoogleGenAI({ apiKey: key });\n}\n\n/**\n * Extract the text payload from a batch GenerateContentResponse. Batch inlined\n * responses are plain JSON objects (the SDK does not rebuild the class), so the\n * `.text` getter is unavailable — read candidates/parts directly and skip\n * thought parts.\n */\nexport function textFromBatchResponse(response: GenerateContentResponse): string {\n if (typeof response.text === \"string\") return response.text;\n const parts = response.candidates?.[0]?.content?.parts ?? [];\n return parts\n .filter((part) => !part.thought && typeof part.text === \"string\")\n .map((part) => part.text)\n .join(\"\");\n}\n\n/** Submit one Gemini Batch API job with inlined requests. */\nexport async function createGeminiBatchJob(input: {\n /** API model id (already resolved from the display name). */\n model: string;\n requests: InlinedRequest[];\n apiKey?: string;\n displayName?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n const job = await withRetry(() =>\n ai.batches.create({\n model: input.model,\n src: input.requests,\n config: { displayName: input.displayName ?? `scribe-translate-${Date.now()}` },\n }),\n );\n if (!job.name) throw new Error(\"Gemini batch job was created without a name\");\n return job;\n}\n\n/** Fetch the current state (and, when terminal, results) of a batch job. */\nexport async function getGeminiBatchJob(input: {\n name: string;\n apiKey?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n return withRetry(() => ai.batches.get({ name: input.name }));\n}\n","import { ThinkingLevel, type ThinkingConfig } from \"@google/genai\";\n\n/** Display name -> Gemini API model id. Pricing and logs use the display name. */\nexport const GEMINI_MODEL_IDS: Record<string, string> = {\n \"gemini-2.5-pro\": \"gemini-2.5-pro\",\n \"gemini-3.1-pro\": \"gemini-3.1-pro-preview\",\n};\n\nexport const DEFAULT_GEMINI_MODEL = \"gemini-3.1-pro\";\n\nfunction stripModelsPrefix(model: string): string {\n return model.replace(/^models\\//, \"\");\n}\n\n/** Map a display name (or passthrough id) to the API model id. */\nexport function resolveGeminiModelId(model: string): string {\n const name = stripModelsPrefix(model);\n return GEMINI_MODEL_IDS[name] ?? name;\n}\n\n/** Normalize any model id/alias to the display name used for pricing. */\nexport function normalizeGeminiDisplayName(model: string): string {\n const name = stripModelsPrefix(model);\n if (name in GEMINI_MODEL_IDS) return name;\n\n const alias = Object.entries(GEMINI_MODEL_IDS).find(([, apiId]) => apiId === name);\n if (alias) return alias[0];\n\n return name;\n}\n\n/**\n * Resolve the thinking config to keep translation cheap and predictable.\n * - Gemini 3.x: `thinkingLevel: LOW` (the 2.5-style `thinkingBudget` is unsupported).\n * - Gemini 2.5-pro: cannot fully disable thinking; use the minimum budget of 128.\n * - Unknown/passthrough ids: LOW for \"gemini-3*\", budget 128 for ids containing \"2.5\",\n * otherwise no thinking config (let the model default).\n */\nexport function resolveThinkingConfig(apiModelId: string): ThinkingConfig | undefined {\n const id = stripModelsPrefix(apiModelId).toLowerCase();\n if (id.startsWith(\"gemini-3\")) return { thinkingLevel: ThinkingLevel.LOW };\n if (id.includes(\"2.5\")) return { thinkingBudget: 128 };\n return undefined;\n}\n","import { GoogleGenAI, type GenerateContentConfig, type GenerateContentResponse } from \"@google/genai\";\nimport {\n DEFAULT_GEMINI_MODEL,\n normalizeGeminiDisplayName,\n resolveGeminiModelId,\n resolveThinkingConfig,\n} from \"./gemini-models.js\";\nimport { withRetry } from \"./retry.js\";\n\nconst DEFAULT_MODEL = DEFAULT_GEMINI_MODEL;\n\nexport interface GeminiTokenUsage {\n inputTokens: number;\n /** Billed output tokens; INCLUDES thoughts tokens. */\n outputTokens: number;\n /** Thoughts (reasoning) tokens, billed as output. */\n thoughtsTokens: number;\n totalTokens: number;\n}\n\nexport interface GeminiTranslationResult {\n model: string;\n raw: string;\n parsed: {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n usage: GeminiTokenUsage;\n}\n\nfunction extractJson(text: string): string {\n const trimmed = text.trim();\n // Only strip a fence that wraps the entire payload, so fences inside string\n // values (e.g. a translated MDX body with ```ts blocks) are left untouched.\n const fenced = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```$/);\n if (fenced?.[1]) return fenced[1].trim();\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n return trimmed;\n}\n\nexport function parseGeminiResponse(text: string): {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n} {\n // With responseMimeType \"application/json\" the payload is already pure JSON.\n // Parse it directly first; only fall back to extraction when the model wraps\n // or pads the JSON (extraction is fragile when the body contains code fences).\n let parsed: { frontmatter?: Record<string, unknown>; body: string; slug?: string };\n try {\n parsed = JSON.parse(text.trim());\n } catch {\n parsed = JSON.parse(extractJson(text));\n }\n // Types without translatable frontmatter use a body-only response schema;\n // default the frontmatter so downstream merge/validation sees an object.\n if (parsed !== null && typeof parsed === \"object\" && parsed.frontmatter === undefined) {\n parsed.frontmatter = {};\n }\n return parsed as { frontmatter: Record<string, unknown>; body: string; slug?: string };\n}\n\n/**\n * Build the per-request generation config shared by the direct and batch paths.\n * The same shape is passed to `generateContent` and to each inlined batch request.\n */\nexport function buildGeminiRequestConfig(input: {\n apiModelId: string;\n responseSchema?: Record<string, unknown>;\n}): GenerateContentConfig {\n const thinkingConfig = resolveThinkingConfig(input.apiModelId);\n return {\n responseMimeType: \"application/json\",\n ...(input.responseSchema ? { responseSchema: input.responseSchema } : {}),\n ...(thinkingConfig ? { thinkingConfig } : {}),\n };\n}\n\ninterface WireUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n thoughtsTokenCount?: number;\n totalTokenCount?: number;\n prompt_token_count?: number;\n candidates_token_count?: number;\n thoughts_token_count?: number;\n total_token_count?: number;\n}\n\n/**\n * Extract token usage from a Gemini response; thoughts are folded into output.\n * Batch inlined responses arrive as raw JSON rather than SDK class instances,\n * so tolerate both camelCase and snake_case field names.\n */\nexport function usageFromResponse(response: GenerateContentResponse): GeminiTokenUsage {\n const meta = (response.usageMetadata ??\n (response as unknown as { usage_metadata?: WireUsageMetadata }).usage_metadata ??\n {}) as WireUsageMetadata;\n const thoughtsTokens = meta.thoughtsTokenCount ?? meta.thoughts_token_count ?? 0;\n return {\n inputTokens: meta.promptTokenCount ?? meta.prompt_token_count ?? 0,\n // candidatesTokenCount does not include thoughts, but thoughts are billed as\n // output tokens, so fold them in here for accurate cost accounting.\n outputTokens: (meta.candidatesTokenCount ?? meta.candidates_token_count ?? 0) + thoughtsTokens,\n thoughtsTokens,\n totalTokens: meta.totalTokenCount ?? meta.total_token_count ?? 0,\n };\n}\n\nexport async function translatePageWithGemini(input: {\n prompt: string;\n model?: string;\n apiKey?: string;\n responseSchema?: Record<string, unknown>;\n}): Promise<GeminiTranslationResult> {\n const apiKey = input.apiKey ?? process.env.GEMINI_API_KEY;\n if (!apiKey) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n\n const displayModel = normalizeGeminiDisplayName(\n input.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_MODEL,\n );\n const apiModel = resolveGeminiModelId(displayModel);\n const ai = new GoogleGenAI({ apiKey });\n const response = await withRetry(() =>\n ai.models.generateContent({\n model: apiModel,\n contents: input.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: apiModel,\n responseSchema: input.responseSchema,\n }),\n }),\n );\n\n const raw = response.text ?? \"\";\n const parsed = parseGeminiResponse(raw);\n\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n\n return { model: displayModel, raw, parsed, usage: usageFromResponse(response) };\n}\n","const CONTEXT_TIER_TOKENS = 200_000;\n\nexport interface TieredModelPricing {\n input: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n output: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n}\n\n/** display_name -> { input: (le_200k, gt_200k), output: (le_200k, gt_200k) } in USD per 1M tokens */\nexport const GEMINI_PRICING_USD: Record<string, TieredModelPricing> = {\n \"gemini-3.1-pro\": { input: [2.0, 4.0], output: [12.0, 18.0] },\n};\n\nfunction normalizeModelId(model: string): string {\n return model.replace(/^models\\//, \"\").toLowerCase();\n}\n\nfunction tierRate(tokens: number, tiers: readonly [number, number]): number {\n return tokens <= CONTEXT_TIER_TOKENS ? tiers[0] : tiers[1];\n}\n\nexport function resolveModelPricing(model: string): TieredModelPricing | undefined {\n const id = normalizeModelId(model);\n if (GEMINI_PRICING_USD[id]) return GEMINI_PRICING_USD[id];\n\n const match = Object.entries(GEMINI_PRICING_USD).find(([key]) => id.includes(key));\n return match?.[1];\n}\n\nexport type TranslationCostMode = \"interactive\" | \"batch\";\n\n/** Batch API tokens are billed at 50% of interactive rates. */\nconst BATCH_DISCOUNT = 0.5;\n\nexport function estimateTranslationCostUsd(\n model: string,\n inputTokens: number,\n outputTokens: number,\n mode: TranslationCostMode = \"interactive\",\n): number | undefined {\n const pricing = resolveModelPricing(model);\n if (!pricing) return undefined;\n\n const inputRate = tierRate(inputTokens, pricing.input);\n const outputRate = tierRate(outputTokens, pricing.output);\n const multiplier = mode === \"batch\" ? BATCH_DISCOUNT : 1;\n\n return (\n ((inputTokens / 1_000_000) * inputRate +\n (outputTokens / 1_000_000) * outputRate) *\n multiplier\n );\n}\n\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1_000_000) return `${(tokens / 1_000_000).toFixed(2)}M`;\n if (tokens >= 1_000) return `${(tokens / 1_000).toFixed(1)}k`;\n return String(tokens);\n}\n\nexport function formatUsd(amount: number | undefined): string {\n if (amount === undefined) return \"n/a\";\n if (amount >= 1) return `$${amount.toFixed(2)}`;\n if (amount >= 0.01) return `$${amount.toFixed(3)}`;\n return `$${amount.toFixed(4)}`;\n}\n","import type { ResolvedTranslateConfig } from \"../resolve-translate-config.js\";\nimport type { SlugStrategy } from \"../../core/types.js\";\n\nexport const LOCALE_NAMES: Record<string, string> = {\n fr: \"French\",\n es: \"Spanish\",\n de: \"German\",\n nl: \"Dutch\",\n uk: \"Ukrainian\",\n tr: \"Turkish\",\n da: \"Danish\",\n he: \"Hebrew\",\n \"zh-CN\": \"Simplified Chinese\",\n \"zh-TW\": \"Traditional Chinese\",\n pt: \"Portuguese\",\n \"pt-BR\": \"Brazilian Portuguese\",\n ja: \"Japanese\",\n ru: \"Russian\",\n it: \"Italian\",\n ar: \"Arabic\",\n};\n\nexport function defaultLocalizationPrompt(localeName: string, locale: string): string {\n return [\n `Localize the content above into natural ${localeName} (${locale}).`,\n \"Do not translate word-for-word.\",\n \"Preserve the source tone and brand voice.\",\n \"Write as if a native speaker authored it for the target market.\",\n ].join(\" \");\n}\n\n/** Type/project `translate.prompt` extras are appended before the locale directive. */\nexport function buildLocalizationPrompt(\n promptOverride: string | undefined,\n localeName: string,\n locale: string,\n): string {\n const localeDirective = defaultLocalizationPrompt(localeName, locale);\n if (!promptOverride) return localeDirective;\n return `${promptOverride}\\n\\n${localeDirective}`;\n}\n\n/**\n * Static, locale-independent framing. Kept first so the whole prompt PREFIX\n * (framing + context + rules + EN payload) is byte-identical across every locale\n * of a given page, enabling Gemini implicit prefix caching. The locale-specific\n * localization directive lives in the SUFFIX, after the EN body.\n */\nconst TASK_FRAMING =\n \"You are localizing the content below into a target language specified at the end of this prompt.\";\n\n/**\n * Describe the expected JSON keys. Mirrors buildGeminiResponseSchema: types\n * without translatable frontmatter get a body-only response (their structural\n * frontmatter is carried over from EN, not translated).\n */\nfunction buildOutputFormatLine(hasFrontmatter: boolean, slugStrategy: SlugStrategy): string {\n if (!hasFrontmatter) {\n return slugStrategy === \"localized\"\n ? \"`body` (string, full MDX body), `slug` (string).\"\n : \"`body` (string, full MDX body).\";\n }\n return slugStrategy === \"localized\"\n ? \"`frontmatter` (object with translated frontmatter fields), `body` (string, full MDX body), `slug` (string).\"\n : \"`frontmatter` (object), `body` (string).\";\n}\n\n/**\n * Build a page translation prompt whose prefix (everything up to and including\n * the EN body) does not vary with locale, and whose suffix carries all\n * locale-specific instructions. This lets Gemini reuse the cached prefix when the\n * same page is translated into multiple locales.\n */\n/**\n * Compose the retry-context section appended (locale-specific suffix only, never\n * the cached prefix) when a previous attempt was rejected by validation. The\n * validation errors are included verbatim so the model can fix the exact issues.\n */\nfunction buildRetryContextSection(previousError: string): string[] {\n return [\n \"\",\n \"## Previous attempt\",\n `A previous attempt at this translation was rejected with the following validation errors: ${previousError}. Produce a corrected translation that fixes these issues while re-checking every schema constraint (required fields, array minimums, maximum lengths).`,\n ];\n}\n\nexport function buildPageTranslationPrompt(input: {\n resolved: ResolvedTranslateConfig;\n targetLocale: string;\n contextLabel?: string;\n translatableFrontmatter: Record<string, unknown>;\n enBody: string;\n slugStrategy: SlugStrategy;\n /** Verbatim validation errors from a prior rejected attempt (retry round). */\n previousError?: string;\n}): string {\n const localeName = LOCALE_NAMES[input.targetLocale] ?? input.targetLocale;\n const localizationPrompt = buildLocalizationPrompt(\n input.resolved.promptOverride,\n localeName,\n input.targetLocale,\n );\n\n // PREFIX — locale-independent. Identical for every locale of a given page.\n const prefix = [\n TASK_FRAMING,\n \"\",\n ...(input.resolved.context ? [\"## Context\", input.resolved.context, \"\"] : []),\n ...(input.contextLabel ? [`Document: ${input.contextLabel}`, \"\"] : []),\n \"## Rules\",\n ...input.resolved.rules.map((rule) => `- ${rule}`),\n \"\",\n \"## EN translatable frontmatter (JSON)\",\n JSON.stringify(input.translatableFrontmatter, null, 2),\n \"\",\n \"## EN body (MDX)\",\n input.enBody,\n ];\n\n // SUFFIX — locale-specific. Everything that depends on the target locale must\n // come after the EN body so it never changes the cacheable prefix.\n const suffix = [\n \"\",\n \"## Target language\",\n localizationPrompt,\n ...(input.slugStrategy === \"localized\"\n ? [\n `The slug MUST be written in ${localeName}, derived from the ${localeName} title and its meaning — never the English slug.`,\n ]\n : []),\n \"\",\n \"## Output format\",\n \"Return ONLY valid JSON with keys:\",\n buildOutputFormatLine(\n Object.keys(input.translatableFrontmatter).length > 0,\n input.slugStrategy,\n ),\n // Retry context is locale-specific suffix material: it MUST stay after the\n // EN body so the cacheable prefix is byte-identical with and without it.\n ...(input.previousError ? buildRetryContextSection(input.previousError) : []),\n ];\n\n return [...prefix, ...suffix].join(\"\\n\");\n}\n","import { z } from \"zod\";\nimport { getFieldKind, peelOptionalWrappers } from \"../core/field.js\";\nimport type { SlugStrategy } from \"../core/types.js\";\n\nfunction getObjectShape(schema: z.ZodTypeAny): z.ZodRawShape | null {\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n return (base as z.ZodObject<z.ZodRawShape>).shape;\n }\n return null;\n}\n\nfunction getArraySchema(schema: z.ZodTypeAny): z.ZodArray | null {\n const base = peelOptionalWrappers(schema);\n if (\n base instanceof Object &&\n \"element\" in base &&\n (base as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return base as z.ZodArray;\n }\n return null;\n}\n\nfunction extractTranslatableFromStructural(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n const arraySchema = getArraySchema(schema);\n if (arraySchema) {\n const inner = buildTranslatableSubschema(arraySchema.element as z.ZodTypeAny);\n if (inner) return z.array(inner);\n return null;\n }\n if (getObjectShape(schema)) {\n return buildTranslatableSubschema(schema);\n }\n return null;\n}\n\n/** Build a Zod object schema containing only translatable fields (including nested in structural arrays). */\nexport function buildTranslatableSubschema(schema: z.ZodTypeAny): z.ZodObject | null {\n const shape = getObjectShape(schema);\n if (!shape) return null;\n\n const out: Record<string, z.ZodTypeAny> = {};\n for (const [key, child] of Object.entries(shape)) {\n const childSchema = child as z.ZodTypeAny;\n const kind = getFieldKind(childSchema);\n if (kind === \"translatable\") {\n out[key] = peelOptionalWrappers(childSchema);\n } else if (kind === \"structural\") {\n const nested = extractTranslatableFromStructural(childSchema);\n if (nested) out[key] = nested;\n }\n }\n\n if (Object.keys(out).length === 0) return null;\n return z.object(out);\n}\n\n/**\n * Like `buildTranslatableSubschema`, but only includes keys present in the EN\n * translatable payload. Prevents the model from hallucinating nested structural\n * arrays (e.g. blog `itemList`) when the source document has none.\n */\nexport function buildTranslatableSubschemaForPayload(\n schema: z.ZodTypeAny,\n translatableFrontmatter: Record<string, unknown>,\n): z.ZodObject | null {\n const full = buildTranslatableSubschema(schema);\n if (!full) return null;\n\n const filtered: Record<string, z.ZodTypeAny> = {};\n for (const [key, childSchema] of Object.entries(full.shape)) {\n if (!(key in translatableFrontmatter)) continue;\n const value = translatableFrontmatter[key];\n if (value === undefined || value === null) continue;\n filtered[key] = childSchema as z.ZodTypeAny;\n }\n\n if (Object.keys(filtered).length === 0) return null;\n return z.object(filtered);\n}\n\n/**\n * JSON Schema for Gemini structured output: `{ frontmatter, body, slug? }`.\n * Types without translatable frontmatter get a body-only schema (Gemini\n * rejects OBJECT schemas with empty `properties`); parsing then defaults the\n * missing frontmatter to `{}`. Skipping the schema entirely instead would\n * leave the model free-handing JSON, which fails often on MDX bodies\n * (unescaped newlines, trailing prose after the JSON).\n */\nexport function buildGeminiResponseSchema(\n schema: z.ZodTypeAny,\n slugStrategy: SlugStrategy,\n translatableFrontmatter?: Record<string, unknown>,\n): Record<string, unknown> | null {\n try {\n const translatable =\n translatableFrontmatter !== undefined\n ? buildTranslatableSubschemaForPayload(schema, translatableFrontmatter)\n : buildTranslatableSubschema(schema);\n\n const responseShape: Record<string, z.ZodTypeAny> = {\n ...(translatable ? { frontmatter: translatable } : {}),\n body: z.string(),\n };\n if (slugStrategy === \"localized\") {\n responseShape.slug = z.string();\n }\n\n const jsonSchema = z.toJSONSchema(z.object(responseShape), {\n target: \"draft-2020-12\",\n unrepresentable: \"any\",\n io: \"output\",\n }) as Record<string, unknown>;\n delete jsonSchema.$schema;\n return jsonSchema;\n } catch {\n return null;\n }\n}\n","import type {\n ContentTypeConfig,\n ScribeConfig,\n ScribeTranslateDefaults,\n SlugStrategy,\n TranslateConfig,\n} from \"../core/types.js\";\n\nexport interface ResolvedTranslateConfig {\n promptOverride?: string;\n context?: string;\n rules: string[];\n model?: string;\n}\n\nconst BUILTIN_TRANSLATE_RULES = [\n \"Placeholders written as %%1%%, %%2%%, %%3%% (double percent signs around a number) are immutable. Reproduce each placeholder that appears in the source EXACTLY as-is, exactly once, and never translate, edit, renumber, or add spaces inside it. You may move a placeholder to a different position within its sentence when the target grammar requires it.\",\n \"Do not translate brand or product names unless the brand has a well-known localized name in the target market (rare). Keep the original spelling and capitalization.\",\n \"Return the MDX body with real line breaks; do not use JSON escape sequences like \\\\n or \\\\t in the body string.\",\n 'In JSX attributes (e.g. FaqItem question=\"...\"), use single quotes when the value contains double-quote characters (e.g. Hebrew דוא\"ל), or escape them as \\\\\".',\n \"Match the EN source format: when the EN body uses Markdown/MDX (headings, paragraphs, GFM tables, links), keep that structure in the translation. Do not convert markdown elements into raw HTML (<p>, <h2>, <table>, etc.).\",\n \"Otherwise match the format and components used in the EN source.\",\n];\n\nfunction slugStrategyRules(slugStrategy: SlugStrategy): string[] {\n if (slugStrategy === \"localized\") {\n return [\n \"Provide a URL slug in JSON field `slug` that is Localized into the target language.\",\n \"Base the slug on the meaning of the translated title — do NOT reuse the English slug words.\",\n \"Slug MUST be ASCII only: a-z, 0-9, hyphens. No uppercase, accents, underscores, or spaces.\",\n \"For non-Latin languages, write the words in the target language and transliterate them into Latin script (e.g. Russian -> romanized Russian, not English).\",\n \"Do NOT append locale codes to the slug (e.g. -fr, -he, -zh-cn). Locale routing is handled by the URL prefix, not the slug.\",\n \"Preserve 4-digit years and proper nouns in slugs.\",\n ];\n }\n return [\"Do NOT output a slug — slugStrategy is fixed.\"];\n}\n\nfunction mergeContext(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n): string | undefined {\n const parts = [project?.context, type?.context].filter(Boolean);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : undefined;\n}\n\nfunction mergeTranslateConfig(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n slugStrategy: SlugStrategy,\n): ResolvedTranslateConfig {\n return {\n promptOverride: type?.prompt ?? project?.prompt,\n context: mergeContext(project, type),\n rules: [\n ...BUILTIN_TRANSLATE_RULES,\n ...(project?.rules ?? []),\n ...(type?.rules ?? []),\n ...slugStrategyRules(slugStrategy),\n ],\n model: type?.model ?? project?.defaultModel,\n };\n}\n\n/** Merge project and content-type translation settings. */\nexport function resolveTranslateConfig(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ResolvedTranslateConfig {\n return mergeTranslateConfig(config.translate, type.translate, type.slugStrategy);\n}\n","import type { z } from \"zod\";\nimport type { ScribeDocument } from \"../core/types.js\";\nimport { mergeStructuralOntoLocale, pickTranslatable, pruneOrphanNestedTranslations } from \"../core/introspect-schema.js\";\n\nexport function formatZodIssues(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n}\n\n/** Strip non-translatable keys from Gemini frontmatter output. */\nexport function sanitizeTranslatedFrontmatter(\n rawFrontmatter: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n return pickTranslatable(rawFrontmatter, schema);\n}\n\n/** Validate locale frontmatter against the full content schema (merged with EN structural fields). */\nexport function validateTranslatedFrontmatter(\n enDoc: ScribeDocument,\n localeFrontmatter: Record<string, unknown>,\n typeSchema: z.ZodTypeAny,\n): { ok: true; frontmatter: Record<string, unknown> } | { ok: false; error: string } {\n const enFrontmatter = enDoc.frontmatter as Record<string, unknown>;\n const frontmatter = pruneOrphanNestedTranslations(\n sanitizeTranslatedFrontmatter(localeFrontmatter, typeSchema),\n enFrontmatter,\n typeSchema,\n );\n const merged = mergeStructuralOntoLocale(frontmatter, enFrontmatter, typeSchema);\n const parsed = typeSchema.safeParse(merged);\n if (!parsed.success) {\n return { ok: false, error: formatZodIssues(parsed.error) };\n }\n return { ok: true, frontmatter };\n}\n","import { stripLocaleSuffixFromSlug } from \"../core/localized-slug.js\";\nimport type { ContentTypeConfig, ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { computeTranslationEnHash } from \"../hash/page-hash.js\";\nimport { countMarkerOccurrences, extractInlineTokens, placeholderMarker } from \"../inline/tokens.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation, upsertTranslation } from \"../storage/translations.js\";\nimport type { GeminiTokenUsage } from \"./gemini-client.js\";\nimport { estimateTranslationCostUsd, type TranslationCostMode } from \"./gemini-pricing.js\";\nimport { DEFAULT_GEMINI_MODEL, normalizeGeminiDisplayName } from \"./gemini-models.js\";\nimport { buildPageTranslationPrompt } from \"./prompts/translation-prompt.js\";\nimport { buildGeminiResponseSchema } from \"./response-schema.js\";\nimport { resolveTranslateConfig } from \"./resolve-translate-config.js\";\nimport { assertValidTranslatedMdxBody } from \"./validate-mdx-body.js\";\nimport { validateTranslatedFrontmatter } from \"./validate-translation.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport type TranslateMode = \"batch\" | \"direct\";\n\nexport interface TranslatePageResult {\n contentType: string;\n enSlug: string;\n locale: string;\n skipped: boolean;\n failed?: boolean;\n reason?: \"fresh\" | \"in-flight\";\n model?: string;\n usage?: GeminiTokenUsage;\n estimatedCostUsd?: number;\n durationMs?: number;\n error?: string;\n slugAdjusted?: { from: string; to: string; matchedCode: string };\n mdxAdjusted?: boolean;\n}\n\nexport interface TranslateWorklistTotals {\n translated: number;\n skipped: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n durationMs: number;\n}\n\nexport type TranslateProgressEvent =\n | {\n type: \"start\";\n total: number;\n concurrency: number;\n dryRun: boolean;\n model?: string;\n mode?: TranslateMode;\n }\n | { type: \"item-start\"; item: TranslationWorkItem; active: string[] }\n | { type: \"item-done\"; result: TranslatePageResult }\n | {\n type: \"batch-submitted\";\n name: string;\n count: number;\n model?: string;\n jobIndex: number;\n jobCount: number;\n resumed?: boolean;\n /** ISO timestamp of the job's actual submission (persisted created_at). */\n createdAt?: string;\n }\n | {\n type: \"batch-polling\";\n name: string;\n state: string;\n /** Elapsed since the job was submitted (not since the CLI started). */\n elapsedMs: number;\n jobIndex: number;\n jobCount: number;\n }\n | {\n type: \"batch-done\";\n name: string;\n state: string;\n model?: string;\n count: number;\n jobIndex: number;\n jobCount: number;\n translated: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n /** Elapsed since the job was submitted. */\n elapsedMs: number;\n /**\n * True when a concurrent scribe process won the ingestion claim: the\n * job's results were saved by that process, this one has nothing to add.\n */\n alreadyIngested?: boolean;\n }\n | {\n /**\n * Emitted once, after the main pass, when validation failures will be\n * retried. Carries the failed items so reporters can print the recap.\n */\n type: \"retry-start\";\n failed: TranslatePageResult[];\n }\n | {\n type: \"done\";\n results: TranslatePageResult[];\n totals: TranslateWorklistTotals;\n /** How many results in `results` succeeded only on the retry round. */\n retriedTranslated?: number;\n };\n\n/** Stable identity for a worklist item / batch item row. */\nexport function translationItemKey(item: {\n contentType?: string;\n content_type?: string;\n enSlug?: string;\n en_slug?: string;\n locale: string;\n}): string {\n const contentType = item.contentType ?? item.content_type ?? \"\";\n const enSlug = item.enSlug ?? item.en_slug ?? \"\";\n return `${contentType}\\u0000${enSlug}\\u0000${item.locale}`;\n}\n\nexport function summarizeResults(\n results: TranslatePageResult[],\n durationMs: number,\n): TranslateWorklistTotals {\n return results.reduce<TranslateWorklistTotals>(\n (totals, result) => {\n if (result.failed) totals.failed += 1;\n else if (result.skipped) totals.skipped += 1;\n else totals.translated += 1;\n\n totals.inputTokens += result.usage?.inputTokens ?? 0;\n totals.outputTokens += result.usage?.outputTokens ?? 0;\n totals.estimatedCostUsd += result.estimatedCostUsd ?? 0;\n return totals;\n },\n {\n translated: 0,\n skipped: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n durationMs,\n },\n );\n}\n\nexport function formatTranslateError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n try {\n const parsed = JSON.parse(message) as { error?: { message?: string } };\n if (parsed.error?.message) return parsed.error.message;\n } catch {\n // not JSON\n }\n const embedded = message.match(/\"message\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)\"/);\n if (embedded?.[1]) {\n return embedded[1].replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n return message.length > 160 ? `${message.slice(0, 157)}…` : message;\n}\n\n/**\n * Post-receive verification: a translated body must reproduce every inline-token\n * marker `%%1%%..%%N%%` (N = tokens in the current EN body) exactly once. A model\n * that drops, duplicates, or mangles a marker fails the row so it retries.\n */\nexport function verifyInlineMarkers(enRawBody: string, translatedBody: string): void {\n const { tokens } = extractInlineTokens(enRawBody);\n if (tokens.length === 0) return;\n const missing: string[] = [];\n const duplicated: string[] = [];\n for (let i = 1; i <= tokens.length; i++) {\n const count = countMarkerOccurrences(translatedBody, i);\n if (count === 0) missing.push(placeholderMarker(i));\n else if (count > 1) duplicated.push(placeholderMarker(i));\n }\n if (missing.length === 0 && duplicated.length === 0) return;\n const parts: string[] = [];\n if (missing.length > 0) parts.push(`missing ${missing.join(\", \")}`);\n if (duplicated.length > 0) parts.push(`duplicated ${duplicated.join(\", \")}`);\n throw new Error(`Inline token markers mismatch: ${parts.join(\"; \")}`);\n}\n\nfunction resolveContextLabel(enDoc: ScribeDocument, enSlug: string): string {\n const fm = enDoc.frontmatter as Record<string, unknown>;\n for (const key of [\"title\", \"name\", \"h1\"]) {\n const value = fm[key];\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return enSlug;\n}\n\nexport function baseForItem(\n item: TranslationWorkItem,\n): Pick<TranslatePageResult, \"contentType\" | \"enSlug\" | \"locale\"> {\n return {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n };\n}\n\n/** Everything needed to submit and finalize one translation request. */\nexport interface PreparedTranslation {\n item: TranslationWorkItem;\n type: ContentTypeConfig;\n enDoc: ScribeDocument;\n payload: { frontmatter: Record<string, unknown>; body: string };\n currentEnHash: string;\n existingSlug?: string;\n /** Configured model (may be undefined; env/default applies downstream). */\n model?: string;\n prompt: string;\n responseSchema?: Record<string, unknown>;\n}\n\nexport type PrepareOutcome =\n | { status: \"ready\"; prepared: PreparedTranslation }\n | { status: \"done\"; result: TranslatePageResult };\n\n/**\n * Shared pre-flight for the direct and batch paths: read the EN doc, skip when\n * the stored translation is fresh, and build the prompt + response schema.\n * Throws on unrecoverable item errors (unknown type, missing EN doc).\n */\nexport function prepareTranslation(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; force?: boolean },\n startedAt: number,\n): PrepareOutcome {\n const type = config.types.find((t) => t.id === item.contentType);\n if (!type) throw new Error(`Unknown content type ${item.contentType}`);\n\n const enDoc = readEnDocument(config, type, item.enSlug);\n if (!enDoc) throw new Error(`EN document not found: ${item.enSlug}`);\n\n const payload = getTranslatablePayload(enDoc, type);\n // Hash and translate the PLACEHOLDER body (tokens swapped for inert `%%n%%`\n // markers): a token's VALUE never affects the hash, so changing a relation\n // target / asset path / var value never staleness-flags a locale, while\n // adding/removing/moving tokens does. The hash goes through the shared helper\n // so it can never diverge from the worklist's staleness check.\n const { placeholderBody } = extractInlineTokens(payload.body);\n const currentEnHash = computeTranslationEnHash(payload.frontmatter, payload.body);\n\n const db = openStore(config, \"readonly\");\n const existing = getTranslation(db, type.id, item.enSlug, item.locale);\n db.close();\n\n if (!options.force && existing && existing.en_hash === currentEnHash) {\n return {\n status: \"done\",\n result: {\n ...baseForItem(item),\n skipped: true,\n reason: \"fresh\",\n durationMs: Date.now() - startedAt,\n },\n };\n }\n\n const resolvedTranslate = resolveTranslateConfig(config, type);\n const model = options.model ?? resolvedTranslate.model;\n\n const prompt = buildPageTranslationPrompt({\n resolved: resolvedTranslate,\n targetLocale: item.locale,\n contextLabel: resolveContextLabel(enDoc, item.enSlug),\n translatableFrontmatter: payload.frontmatter,\n enBody: placeholderBody,\n slugStrategy: type.slugStrategy,\n previousError: item.previousError,\n });\n\n const responseSchema = buildGeminiResponseSchema(\n type.schema,\n type.slugStrategy,\n payload.frontmatter,\n );\n\n return {\n status: \"ready\",\n prepared: {\n item,\n type,\n enDoc,\n payload,\n currentEnHash,\n existingSlug: existing?.slug,\n model,\n prompt,\n responseSchema: responseSchema ?? undefined,\n },\n };\n}\n\n/**\n * Shared post-processing for the direct and batch paths: strip locale suffixes\n * from the slug, validate frontmatter + MDX body, snapshot the EN source and\n * upsert the translation. Never throws — failures come back as a failed result.\n * Pass `snapshotId` when the EN snapshot was already recorded (batch submission\n * time) so ingestion does not depend on the current EN files.\n */\nexport function finalizeTranslation(\n config: ScribeConfig,\n prepared: PreparedTranslation,\n output: {\n model: string;\n parsed: { frontmatter: Record<string, unknown>; body: string; slug?: string };\n usage: GeminiTokenUsage;\n },\n options: { costMode: TranslationCostMode; startedAt: number; snapshotId?: number },\n): TranslatePageResult {\n const { item, type, enDoc, payload } = prepared;\n const base = baseForItem(item);\n\n try {\n const rawSlug =\n type.slugStrategy === \"localized\"\n ? (output.parsed.slug ?? prepared.existingSlug ?? item.enSlug)\n : item.enSlug;\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n const { slug, stripped, matchedCode } = stripLocaleSuffixFromSlug(rawSlug, localeCodes);\n const slugAdjusted =\n stripped && matchedCode ? { from: rawSlug, to: slug, matchedCode } : undefined;\n\n const validated = validateTranslatedFrontmatter(enDoc, output.parsed.frontmatter, type.schema);\n if (!validated.ok) {\n throw new Error(`Translation validation failed: ${validated.error}`);\n }\n\n // Bodyless types (`body: false`) never persist a body: the translatable\n // payload excluded it, so any body the model echoed back is dropped and the\n // MDX validation pass is skipped.\n const { body: translatedBody, adjusted: mdxAdjusted } =\n type.body === false\n ? { body: \"\", adjusted: false }\n : assertValidTranslatedMdxBody(output.parsed.body);\n\n // Placeholder markers must survive translation intact (choke point shared by\n // the direct and batch paths). `payload.body` is the raw EN body used to\n // build this translation, so its token count matches the markers the model\n // was asked to reproduce.\n verifyInlineMarkers(payload.body, translatedBody);\n\n const writeDb = openStore(config, \"readwrite\");\n const snapshotId =\n options.snapshotId ??\n recordEnSnapshot(\n config,\n {\n contentType: type.id,\n enSlug: item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: payload.frontmatter,\n body: payload.body,\n },\n writeDb,\n );\n upsertTranslation(writeDb, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n slug,\n frontmatter: validated.frontmatter,\n body: translatedBody,\n enHash: prepared.currentEnHash,\n translatedAt: new Date().toISOString(),\n model: output.model,\n snapshotId,\n });\n writeDb.close();\n\n const estimatedCostUsd = estimateTranslationCostUsd(\n normalizeGeminiDisplayName(output.model),\n output.usage.inputTokens,\n output.usage.outputTokens,\n options.costMode,\n );\n\n return {\n ...base,\n skipped: false,\n model: output.model,\n usage: output.usage,\n estimatedCostUsd,\n durationMs: Date.now() - options.startedAt,\n slugAdjusted,\n mdxAdjusted: mdxAdjusted || undefined,\n };\n } catch (error) {\n return {\n ...base,\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - options.startedAt,\n };\n }\n}\n\nexport function displayModelFor(prepared: PreparedTranslation): string {\n return normalizeGeminiDisplayName(\n prepared.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_GEMINI_MODEL,\n );\n}\n","import type { BatchJob } from \"@google/genai\";\nimport type { ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport {\n claimBatchJobCompletion,\n insertBatchItems,\n insertBatchJob,\n listBatchItems,\n listPendingBatchItems,\n listPendingBatchJobs,\n updateBatchItemStatus,\n type BatchItemRow,\n type BatchJobRow,\n} from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getEnSnapshot, getTranslation } from \"../storage/translations.js\";\nimport {\n createGeminiBatchJob,\n getGeminiBatchJob,\n isSuccessfulBatchState,\n isTerminalBatchState,\n normalizeBatchState,\n textFromBatchResponse,\n} from \"./gemini-batch.js\";\nimport { buildGeminiRequestConfig, parseGeminiResponse, usageFromResponse } from \"./gemini-client.js\";\nimport {\n baseForItem,\n finalizeTranslation,\n formatTranslateError,\n translationItemKey,\n type PreparedTranslation,\n type TranslatePageResult,\n type TranslateProgressEvent,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\n// The Gemini Batch API caps inline (non-file) submissions at 20MB of request\n// payload per job; the SDK types expose no explicit request-count limit. Stay\n// conservative: chunk at 100 requests or ~15MB of prompt text per job,\n// whichever comes first, leaving headroom for JSON envelope + schemas.\nexport const MAX_REQUESTS_PER_JOB = 100;\nexport const MAX_PROMPT_BYTES_PER_JOB = 15 * 1024 * 1024;\n\nconst INITIAL_POLL_MS = 5_000;\nconst MAX_POLL_MS = 30_000;\nconst POLL_BACKOFF_FACTOR = 1.5;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface BatchPlanEntry {\n apiModel: string;\n prompt: string;\n}\n\nexport interface BatchJobPlan<T extends BatchPlanEntry> {\n apiModel: string;\n entries: T[];\n}\n\n/**\n * Group entries by API model, then chunk each group by request count and total\n * prompt bytes so every plan fits in one inline batch job.\n */\nexport function planBatchJobs<T extends BatchPlanEntry>(entries: T[]): BatchJobPlan<T>[] {\n const byModel = new Map<string, T[]>();\n for (const entry of entries) {\n const group = byModel.get(entry.apiModel);\n if (group) group.push(entry);\n else byModel.set(entry.apiModel, [entry]);\n }\n\n const plans: BatchJobPlan<T>[] = [];\n for (const [apiModel, group] of byModel) {\n let current: T[] = [];\n let currentBytes = 0;\n for (const entry of group) {\n const size = Buffer.byteLength(entry.prompt, \"utf8\");\n if (\n current.length > 0 &&\n (current.length >= MAX_REQUESTS_PER_JOB || currentBytes + size > MAX_PROMPT_BYTES_PER_JOB)\n ) {\n plans.push({ apiModel, entries: current });\n current = [];\n currentBytes = 0;\n }\n current.push(entry);\n currentBytes += size;\n }\n if (current.length > 0) plans.push({ apiModel, entries: current });\n }\n return plans;\n}\n\nexport interface PendingBatchWork {\n jobs: BatchJobRow[];\n /** translationItemKey() of every request still in flight. */\n inFlightKeys: Set<string>;\n pendingItems: BatchItemRow[];\n}\n\n/**\n * Load non-completed batch jobs and their in-flight items from the store.\n * Opens the store readwrite so migrations run before the new tables are read.\n */\nexport function readPendingBatchWork(config: ScribeConfig): PendingBatchWork {\n const db = openStore(config, \"readwrite\");\n const jobs = listPendingBatchJobs(db);\n const pendingItems = listPendingBatchItems(db);\n db.close();\n const inFlightKeys = new Set(pendingItems.map((item) => translationItemKey(item)));\n return { jobs, inFlightKeys, pendingItems };\n}\n\nexport interface SubmitPlanInput<T extends BatchPlanEntry & { prepared: PreparedTranslation }> {\n plan: BatchJobPlan<T>;\n displayModel: string;\n jobIndex: number;\n jobCount: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n}\n\n/**\n * Submit one planned job and persist it (job row + item rows + EN snapshots)\n * immediately, before any polling starts, so an interrupt loses nothing.\n */\nexport async function submitBatchJobPlan<\n T extends BatchPlanEntry & { prepared: PreparedTranslation },\n>(config: ScribeConfig, input: SubmitPlanInput<T>): Promise<BatchJobRow> {\n const { plan, displayModel, jobIndex, jobCount } = input;\n const job = await createGeminiBatchJob({\n model: plan.apiModel,\n requests: plan.entries.map(({ prepared }) => ({\n contents: prepared.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: plan.apiModel,\n responseSchema: prepared.responseSchema,\n }),\n })),\n displayName: `scribe-translate-${new Date().toISOString().replace(/[:.]/g, \"-\")}-${jobIndex + 1}`,\n });\n\n const createdAt = new Date().toISOString();\n const db = openStore(config, \"readwrite\");\n const jobId = insertBatchJob(db, {\n jobName: job.name!,\n model: plan.apiModel,\n displayModel,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n createdAt,\n });\n insertBatchItems(\n db,\n jobId,\n plan.entries.map(({ prepared }, requestIndex) => ({\n requestIndex,\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n locale: prepared.item.locale,\n enHash: prepared.currentEnHash,\n // Snapshot the EN source now so ingestion after a resume does not depend\n // on the EN files still matching (or existing) on disk.\n snapshotId: recordEnSnapshot(\n config,\n {\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: prepared.payload.frontmatter,\n body: prepared.payload.body,\n },\n db,\n ),\n })),\n );\n const row: BatchJobRow = {\n id: jobId,\n job_name: job.name!,\n model: plan.apiModel,\n display_model: displayModel,\n created_at: createdAt,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n completed_at: null,\n };\n db.close();\n\n input.onProgress?.({\n type: \"batch-submitted\",\n name: job.name!,\n count: plan.entries.length,\n model: displayModel,\n jobIndex,\n jobCount,\n createdAt,\n });\n return row;\n}\n\n/** The subset of a Gemini BatchJob that ingestion needs (test-friendly). */\nexport interface BatchJobResultLike {\n state?: string;\n error?: { message?: string };\n dest?: { inlinedResponses?: Array<{ response?: unknown; error?: { message?: string } }> };\n}\n\n/**\n * Reconstruct a finalize-ready context from a persisted batch item. Prefers the\n * EN doc on disk (for structural frontmatter merging); falls back to the stored\n * EN snapshot when the file is gone.\n */\nfunction buildIngestContext(\n config: ScribeConfig,\n db: ReturnType<typeof openStore>,\n jobRow: BatchJobRow,\n itemRow: BatchItemRow,\n): PreparedTranslation {\n const type = config.types.find((t) => t.id === itemRow.content_type);\n if (!type) throw new Error(`Unknown content type ${itemRow.content_type}`);\n\n let enDoc: ScribeDocument | null = readEnDocument(config, type, itemRow.en_slug);\n if (!enDoc) {\n const snapshot = getEnSnapshot(db, itemRow.snapshot_id);\n if (!snapshot) {\n throw new Error(\n `EN document and snapshot #${itemRow.snapshot_id} not found for ${itemRow.en_slug}`,\n );\n }\n enDoc = {\n slug: itemRow.en_slug,\n enSlug: itemRow.en_slug,\n locale: config.defaultLocale,\n noindex: false,\n frontmatter: JSON.parse(snapshot.frontmatter_json) as Record<string, unknown>,\n content: snapshot.body,\n };\n }\n\n const item: TranslationWorkItem = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n reason: \"missing\",\n currentEnHash: itemRow.en_hash,\n };\n return {\n item,\n type,\n enDoc,\n // Unused on ingest: finalizeTranslation receives the pre-recorded snapshotId.\n payload: { frontmatter: enDoc.frontmatter as Record<string, unknown>, body: enDoc.content },\n currentEnHash: itemRow.en_hash,\n existingSlug: getTranslation(db, type.id, itemRow.en_slug, itemRow.locale)?.slug,\n model: jobRow.display_model,\n prompt: \"\",\n responseSchema: undefined,\n };\n}\n\n/**\n * Ingest a terminal batch job: run every pending item through the shared\n * finalize path (or mark it failed), update item statuses, and mark the job\n * completed. Returns one result per pending item, or null when a concurrent\n * scribe process already claimed and ingested the job (runs adopt each\n * other's pending jobs, so two pollers can reach the same terminal job).\n *\n * The completion claim is stamped before items are processed so exactly one\n * process ingests. Ingestion is synchronous end-to-end; should a hard kill\n * still land mid-way, the leftover items are no longer counted in-flight and\n * the next run simply resubmits them.\n */\nexport function ingestBatchJob(\n config: ScribeConfig,\n jobRow: BatchJobRow,\n batchJob: BatchJobResultLike,\n onResult?: (result: TranslatePageResult) => void,\n): TranslatePageResult[] | null {\n const state = String(batchJob.state ?? \"UNKNOWN\");\n const db = openStore(config, \"readwrite\");\n if (!claimBatchJobCompletion(db, jobRow.id, state, new Date().toISOString())) {\n db.close();\n return null;\n }\n const pendingItems = listBatchItems(db, jobRow.id).filter((item) => item.status === \"pending\");\n const results: TranslatePageResult[] = [];\n\n const failItem = (itemRow: BatchItemRow, message: string, startedAt: number): void => {\n const result: TranslatePageResult = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n skipped: false,\n failed: true,\n error: formatTranslateError(new Error(message)),\n durationMs: Date.now() - startedAt,\n };\n updateBatchItemStatus(db, jobRow.id, itemRow.request_index, \"failed\", result.error);\n results.push(result);\n onResult?.(result);\n };\n\n if (isSuccessfulBatchState(state)) {\n const responses = batchJob.dest?.inlinedResponses ?? [];\n for (const itemRow of pendingItems) {\n const startedAt = Date.now();\n const inlined = responses[itemRow.request_index];\n if (!inlined || inlined.error || !inlined.response) {\n failItem(\n itemRow,\n inlined?.error?.message ??\n (inlined ? \"Batch response missing content\" : \"Batch response missing\"),\n startedAt,\n );\n continue;\n }\n let result: TranslatePageResult;\n try {\n const response = inlined.response as Parameters<typeof usageFromResponse>[0];\n const raw = textFromBatchResponse(response);\n const parsed = parseGeminiResponse(raw);\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n const prepared = buildIngestContext(config, db, jobRow, itemRow);\n result = finalizeTranslation(\n config,\n prepared,\n { model: jobRow.display_model, parsed, usage: usageFromResponse(response) },\n { costMode: \"batch\", startedAt, snapshotId: itemRow.snapshot_id },\n );\n } catch (error) {\n failItem(itemRow, error instanceof Error ? error.message : String(error), startedAt);\n continue;\n }\n updateBatchItemStatus(\n db,\n jobRow.id,\n itemRow.request_index,\n result.failed ? \"failed\" : \"done\",\n result.error,\n );\n results.push(result);\n onResult?.(result);\n }\n } else {\n // FAILED / CANCELLED / EXPIRED: every in-flight item fails with the job error.\n const message =\n batchJob.error?.message ?? `Batch job ended in state ${normalizeBatchState(state)}`;\n const startedAt = Date.now();\n for (const itemRow of pendingItems) {\n failItem(itemRow, message, startedAt);\n }\n }\n\n db.close();\n return results;\n}\n\n/**\n * Poll every tracked job together and ingest each one the moment it reaches a\n * terminal state — no job waits for another. The first status check happens\n * immediately so already-finished jobs (resume) ingest without delay.\n */\nexport async function pollAndIngestBatchJobs(\n config: ScribeConfig,\n jobs: BatchJobRow[],\n options: {\n jobCount?: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n onResult?: (result: TranslatePageResult) => void;\n } = {},\n): Promise<void> {\n const jobCount = options.jobCount ?? jobs.length;\n const active = jobs.map((row, jobIndex) => ({ row, jobIndex }));\n const loopStartedAt = Date.now();\n let delay = INITIAL_POLL_MS;\n let firstRound = true;\n\n // Elapsed anchors to the job's actual submission time, so resumed jobs show\n // their true age rather than time since this CLI started.\n const elapsedFor = (row: BatchJobRow): number => {\n const createdAtMs = Date.parse(row.created_at);\n return Number.isNaN(createdAtMs) ? Date.now() - loopStartedAt : Date.now() - createdAtMs;\n };\n\n while (active.length > 0) {\n if (!firstRound) {\n await sleep(delay);\n delay = Math.min(delay * POLL_BACKOFF_FACTOR, MAX_POLL_MS);\n }\n firstRound = false;\n\n for (const tracked of [...active]) {\n const batchJob: BatchJob = await getGeminiBatchJob({ name: tracked.row.job_name });\n const state = normalizeBatchState(batchJob.state);\n options.onProgress?.({\n type: \"batch-polling\",\n name: tracked.row.job_name,\n state,\n elapsedMs: elapsedFor(tracked.row),\n jobIndex: tracked.jobIndex,\n jobCount,\n });\n if (isTerminalBatchState(batchJob.state)) {\n active.splice(active.indexOf(tracked), 1);\n const results = ingestBatchJob(\n config,\n tracked.row,\n batchJob as BatchJobResultLike,\n options.onResult,\n );\n if (results === null) {\n // A concurrent scribe process claimed the job first; its results\n // are already in the store. Report that instead of zero counts.\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: 0,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n elapsedMs: elapsedFor(tracked.row),\n alreadyIngested: true,\n });\n continue;\n }\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: results.length,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: results.filter((r) => !r.failed && !r.skipped).length,\n failed: results.filter((r) => r.failed).length,\n inputTokens: results.reduce((sum, r) => sum + (r.usage?.inputTokens ?? 0), 0),\n outputTokens: results.reduce((sum, r) => sum + (r.usage?.outputTokens ?? 0), 0),\n estimatedCostUsd: results.reduce((sum, r) => sum + (r.estimatedCostUsd ?? 0), 0),\n elapsedMs: elapsedFor(tracked.row),\n });\n }\n }\n }\n}\n\n/** Result shape helper for items that never reached submission. */\nexport function failedResultForItem(\n item: TranslationWorkItem,\n error: unknown,\n startedAt: number,\n): TranslatePageResult {\n return {\n ...baseForItem(item),\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - startedAt,\n };\n}\n","import type { ScribeConfig } from \"../core/types.js\";\nimport { listBatchItems, type BatchJobRow } from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n failedResultForItem,\n planBatchJobs,\n pollAndIngestBatchJobs,\n readPendingBatchWork,\n submitBatchJobPlan,\n} from \"./batch-worklist.js\";\nimport { translatePageWithGemini } from \"./gemini-client.js\";\nimport { normalizeGeminiDisplayName, resolveGeminiModelId } from \"./gemini-models.js\";\nimport {\n baseForItem,\n displayModelFor,\n finalizeTranslation,\n prepareTranslation,\n summarizeResults,\n translationItemKey,\n type PreparedTranslation,\n type PrepareOutcome,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport {\n finalizeTranslation,\n type PreparedTranslation,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n};\n\nasync function runPool<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) return;\n let nextIndex = 0;\n const runners = Array.from({ length: Math.min(concurrency, items.length) }, async () => {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n await worker(items[index]!, index);\n }\n });\n await Promise.all(runners);\n}\n\nfunction labelForItem(item: TranslationWorkItem): string {\n return `${item.contentType}/${item.enSlug}@${item.locale}`;\n}\n\n/**\n * Build the retry worklist from the failed results of a completed pass. Each\n * retry item carries the original item's EN hash plus the verbatim error from\n * the failed attempt, so the retry prompt can ask the model to fix exactly those\n * validation issues. Items whose failure has no original work item (e.g. resumed\n * batch items from a prior run) are rebuilt from the result alone; `force` is set\n * so a freshly-upserted-then-rejected slot is not treated as up to date.\n */\nexport function buildRetryWorklist(\n failed: TranslatePageResult[],\n originalByKey: Map<string, TranslationWorkItem>,\n): TranslationWorkItem[] {\n return failed.map((result) => {\n const key = translationItemKey(result);\n const original = originalByKey.get(key);\n return {\n contentType: result.contentType,\n enSlug: result.enSlug,\n locale: result.locale,\n reason: original?.reason ?? \"missing\",\n currentEnHash: original?.currentEnHash ?? \"\",\n storedEnHash: original?.storedEnHash,\n previousError: result.error ?? \"Translation failed\",\n };\n });\n}\n\n/**\n * Re-translate a set of already-failed items exactly once, appending each item's\n * verbatim validation error to the prompt suffix. Batch runs submit the retry\n * items as one additional batch job (batch-priced); direct runs retry with a\n * direct pool honoring `concurrency`. Pending jobs from prior runs are NOT\n * touched here — this only covers the items that failed in the just-finished\n * pass. Returns one result per retry item (translated or newly failed); these\n * items are never retried a second time within the run.\n */\nexport async function runRetryRound(\n config: ScribeConfig,\n retryItems: TranslationWorkItem[],\n options: {\n model?: string;\n force?: boolean;\n concurrency: number;\n mode: TranslateMode;\n onResult: (result: TranslatePageResult) => void;\n onProgress?: (event: TranslateProgressEvent) => void;\n /** Injectable single-item translator (tests); defaults to translatePage. */\n translateOne?: (\n item: TranslationWorkItem,\n ) => Promise<TranslatePageResult>;\n },\n): Promise<void> {\n const startedAt = Date.now();\n // force: the failed pass may have left nothing stored, but if a stale row\n // exists we must still re-translate rather than skip as fresh.\n const translateOne =\n options.translateOne ??\n ((item: TranslationWorkItem) =>\n translatePage(config, item, { model: options.model, force: true }));\n\n if (options.mode === \"direct\") {\n const active = new Set<string>();\n await runPool(retryItems, options.concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translateOne(item);\n active.delete(label);\n options.onResult(result);\n });\n return;\n }\n\n // Batch retry: prepare, plan one job group, submit, poll+ingest — the same\n // machinery as the main batch pass but scoped to just the retry items and\n // without adopting any pending jobs.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of retryItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, { model: options.model, force: true }, itemStartedAt);\n if (outcome.status === \"done\") {\n options.onResult(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n options.onResult(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: planIndex,\n jobCount: plans.length,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n options.onResult(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll = submitted.filter((row): row is BatchJobRow => row !== undefined);\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount: jobsToPoll.length,\n onProgress: options.onProgress,\n onResult: options.onResult,\n });\n }\n}\n\n/**\n * Translate one locale page via a direct (interactive) Gemini call and upsert\n * into SQLite. Used by the studio server and other single-page callers; the\n * worklist path defaults to the Batch API instead.\n */\nexport async function translatePage(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<TranslatePageResult> {\n const startedAt = Date.now();\n\n let outcome: PrepareOutcome;\n try {\n outcome = prepareTranslation(config, item, options, startedAt);\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n if (outcome.status === \"done\") return outcome.result;\n const prepared = outcome.prepared;\n\n if (options.dryRun) {\n return {\n ...baseForItem(item),\n skipped: false,\n model: prepared.model,\n durationMs: Date.now() - startedAt,\n };\n }\n\n try {\n const result = await translatePageWithGemini({\n prompt: prepared.prompt,\n model: prepared.model,\n responseSchema: prepared.responseSchema,\n });\n return finalizeTranslation(\n config,\n prepared,\n { model: result.model, parsed: result.parsed, usage: result.usage },\n { costMode: \"interactive\", startedAt },\n );\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n}\n\ninterface ResultCollector {\n emit: (result: TranslatePageResult) => void;\n assemble: () => TranslatePageResult[];\n}\n\n/**\n * Route results into their input worklist slot (by item identity) so output\n * order matches input; results with no matching input item (resumed jobs from\n * a previous run) are appended after.\n */\nfunction createResultCollector(\n items: TranslationWorkItem[],\n onProgress?: (event: TranslateProgressEvent) => void,\n): ResultCollector {\n const slotByKey = new Map<string, number>();\n items.forEach((item, index) => slotByKey.set(translationItemKey(item), index));\n const slots: (TranslatePageResult | undefined)[] = new Array(items.length);\n const extras: TranslatePageResult[] = [];\n\n return {\n emit(result) {\n const slot = slotByKey.get(translationItemKey(result));\n if (slot !== undefined && slots[slot] === undefined) slots[slot] = result;\n else extras.push(result);\n onProgress?.({ type: \"item-done\", result });\n },\n assemble() {\n return [\n ...slots.filter((result): result is TranslatePageResult => result !== undefined),\n ...extras,\n ];\n },\n };\n}\n\n/**\n * Translate a batch of worklist items. By default the whole worklist goes\n * through the Gemini Batch API (50% token pricing): jobs are planned upfront\n * (grouped by model, chunked by size), submitted together, persisted for\n * resumability, then polled until every job lands. `mode: \"direct\"` restores\n * the interactive per-page pool (where `concurrency` applies). Any pending\n * jobs from a previous interrupted run are polled and ingested alongside the\n * new work, and their in-flight items are excluded from resubmission.\n */\nexport async function translateWorklist(\n config: ScribeConfig,\n items: TranslationWorkItem[],\n options: {\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n concurrency?: number;\n mode?: TranslateMode;\n onProgress?: (event: TranslateProgressEvent) => void;\n } = {},\n): Promise<TranslatePageResult[]> {\n const mode: TranslateMode = options.mode ?? \"batch\";\n const concurrency = Math.max(1, options.concurrency ?? 3);\n const startedAt = Date.now();\n\n // Dry run: report per-item work without touching the API or pending jobs.\n if (options.dryRun) {\n options.onProgress?.({\n type: \"start\",\n total: items.length,\n concurrency,\n dryRun: true,\n model: options.model,\n mode,\n });\n const results = items.map((item) => {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n return outcome.status === \"done\"\n ? outcome.result\n : {\n ...baseForItem(item),\n skipped: false,\n model: outcome.prepared.model,\n durationMs: Date.now() - itemStartedAt,\n };\n } catch (error) {\n return failedResultForItem(item, error, itemStartedAt);\n }\n });\n for (const result of results) options.onProgress?.({ type: \"item-done\", result });\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n }\n\n // Pending jobs from a previous run are polled alongside the new work; their\n // in-flight items are excluded from resubmission (their results arrive when\n // the pending job is ingested).\n const pending = readPendingBatchWork(config);\n const inputKeys = new Set(items.map((item) => translationItemKey(item)));\n const resumedExtraCount = pending.pendingItems.filter(\n (item) => !inputKeys.has(translationItemKey(item)),\n ).length;\n\n options.onProgress?.({\n type: \"start\",\n total: items.length + resumedExtraCount,\n concurrency,\n dryRun: false,\n model: options.model,\n mode,\n });\n\n const collector = createResultCollector(items, options.onProgress);\n const workItems = items.filter((item) => !pending.inFlightKeys.has(translationItemKey(item)));\n\n if (mode === \"direct\") {\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, pending.jobs.length, options.onProgress);\n const active = new Set<string>();\n await Promise.all([\n runPool(workItems, concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translatePage(config, item, options);\n active.delete(label);\n collector.emit(result);\n }),\n pending.jobs.length > 0\n ? pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: collector.emit,\n })\n : Promise.resolve(),\n ]);\n } else {\n // Prepare every remaining item; fresh pages skip, broken items fail.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of workItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n if (outcome.status === \"done\") {\n collector.emit(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n collector.emit(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const jobCount = pending.jobs.length + plans.length;\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, jobCount, options.onProgress);\n\n // Submit every job upfront (concurrently), persisting each as soon as its\n // create call returns — Ctrl+C during polling loses nothing.\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: pending.jobs.length + planIndex,\n jobCount,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n collector.emit(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll: BatchJobRow[] = [\n ...pending.jobs,\n ...submitted.filter((row): row is BatchJobRow => row !== undefined),\n ];\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount,\n onProgress: options.onProgress,\n onResult: collector.emit,\n });\n }\n }\n\n const mainResults = collector.assemble();\n\n // One-shot retry round: re-translate every validation failure once, feeding\n // the verbatim error back into the prompt suffix. Items still failing after\n // this are not retried again in the same run.\n const failed = mainResults.filter((result) => result.failed);\n if (failed.length === 0) {\n const totals = summarizeResults(mainResults, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results: mainResults, totals });\n return mainResults;\n }\n\n options.onProgress?.({ type: \"retry-start\", failed });\n\n const originalByKey = new Map<string, TranslationWorkItem>(\n items.map((item) => [translationItemKey(item), item]),\n );\n const retryItems = buildRetryWorklist(failed, originalByKey);\n const retryByKey = new Map<string, TranslatePageResult>();\n await runRetryRound(config, retryItems, {\n model: options.model,\n force: options.force,\n concurrency,\n mode,\n onProgress: options.onProgress,\n onResult: (result) => {\n retryByKey.set(translationItemKey(result), result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n // Merge: replace each failed slot with its retry outcome (translated or newly\n // failed). Results with no retry outcome (should not happen) keep the original.\n const results = mainResults.map((result) => {\n if (!result.failed) return result;\n return retryByKey.get(translationItemKey(result)) ?? result;\n });\n const retriedTranslated = failed.filter((original) => {\n const retried = retryByKey.get(translationItemKey(original));\n return retried !== undefined && !retried.failed && !retried.skipped;\n }).length;\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals, retriedTranslated });\n return results;\n}\n\nfunction countPendingItems(config: ScribeConfig, jobs: BatchJobRow[]): Map<number, number> {\n if (jobs.length === 0) return new Map();\n const db = openStore(config, \"readonly\");\n const counts = new Map<number, number>();\n for (const job of jobs) {\n counts.set(job.id, listBatchItems(db, job.id).filter((i) => i.status === \"pending\").length);\n }\n db.close();\n return counts;\n}\n\nfunction emitResumedJobs(\n jobs: BatchJobRow[],\n counts: Map<number, number>,\n jobCount: number,\n onProgress?: (event: TranslateProgressEvent) => void,\n): void {\n jobs.forEach((job, jobIndex) => {\n onProgress?.({\n type: \"batch-submitted\",\n name: job.job_name,\n count: counts.get(job.id) ?? 0,\n model: job.display_model,\n jobIndex,\n jobCount,\n resumed: true,\n createdAt: job.created_at,\n });\n });\n}\n\n/**\n * Poll and ingest pending batch jobs from a previous run without submitting\n * anything new (`scribe translate --resume`). Returns null when there is\n * nothing to resume.\n */\nexport async function resumeTranslationJobs(\n config: ScribeConfig,\n options: { onProgress?: (event: TranslateProgressEvent) => void } = {},\n): Promise<TranslatePageResult[] | null> {\n const startedAt = Date.now();\n const pending = readPendingBatchWork(config);\n if (pending.jobs.length === 0) return null;\n\n options.onProgress?.({\n type: \"start\",\n total: pending.pendingItems.length,\n concurrency: 1,\n dryRun: false,\n mode: \"batch\",\n });\n const counts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, counts, pending.jobs.length, options.onProgress);\n\n const results: TranslatePageResult[] = [];\n await pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: (result) => {\n results.push(result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n}\n","import matter from \"gray-matter\";\n\nexport interface ParsedMdx {\n frontmatter: Record<string, unknown>;\n content: string;\n}\n\nexport function parseMdx(raw: string): ParsedMdx {\n const parsed = matter(raw);\n return {\n frontmatter: parsed.data as Record<string, unknown>,\n content: parsed.content,\n };\n}\n\nexport function serializeMdx(frontmatter: Record<string, unknown>, content: string): string {\n return matter.stringify(content, frontmatter);\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { isRoutableType, pathPrefix, createUrlBuilder } from \"../i18n/build-url.js\";\nimport { serializeMdx } from \"../loader/parse-mdx.js\";\n\nexport interface StaticRawExport {\n /** Path relative to the output root (e.g. `blog/foo.mdx`, `fr/glossary/bar.mdx`). */\n relativePath: string;\n /** Public URL pathname (e.g. `/blog/foo.mdx`, `/fr/glossary/bar.mdx`). */\n urlPath: string;\n locale: string;\n typeId: string;\n enSlug: string;\n /** Full MDX source (YAML frontmatter + body). */\n source: string;\n}\n\nexport interface BuildStaticRawExportsOptions {\n /** File extension including the dot. Default `.mdx`. */\n extension?: `.${string}`;\n /** Content type ids to export. Default: all routable types. */\n types?: string[];\n /** Locales to export. Default: `config.locales`. */\n locales?: readonly string[];\n /** Skip documents where `resolve()` sets `shouldRedirectTo`. Default `true`. */\n excludeRedirected?: boolean;\n /** Skip documents with `noindex: true`. Default `false`. */\n excludeNoindex?: boolean;\n}\n\nfunction normalizeExtension(ext: string): `.${string}` {\n return (ext.startsWith(\".\") ? ext : `.${ext}`) as `.${string}`;\n}\n\n/** Segment name for export directories, e.g. `blog` from `/blog/{slug}`. */\nexport function exportDirSegment(pathTemplate: string): string {\n const prefix = pathPrefix(pathTemplate);\n return prefix.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Relative directory roots to clean before writing static exports.\n * EN: `{segment}/` (e.g. `blog/`). Prefixed locales: `{locale}/{segment}/`.\n */\nexport function getStaticExportRoots(\n project: ScribeProject,\n options: { types?: string[]; locales?: readonly string[] } = {},\n): string[] {\n const { config } = project;\n const locales = options.locales ?? config.locales;\n const typeFilter = options.types ? new Set(options.types) : null;\n const roots = new Set<string>();\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n const segment = exportDirSegment(type.config.path!);\n roots.add(`${segment}/`);\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n roots.add(`${locale}/${segment}/`);\n }\n }\n\n return [...roots].sort();\n}\n\n/** Build static raw MDX exports for all routable content types. */\nexport function buildStaticRawExports(\n project: ScribeProject,\n options: BuildStaticRawExportsOptions = {},\n): StaticRawExport[] {\n const { config } = project;\n const extension = normalizeExtension(options.extension ?? \".mdx\");\n const locales = options.locales ?? config.locales;\n const excludeRedirected = options.excludeRedirected ?? true;\n const excludeNoindex = options.excludeNoindex ?? false;\n const typeFilter = options.types ? new Set(options.types) : null;\n\n const out: StaticRawExport[] = [];\n const urlBuilder = createUrlBuilder(config);\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n\n const pathTemplate = type.config.path!;\n const all = type.load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) continue;\n\n for (const locale of locales) {\n for (const enDoc of enIdx.bySlug.values()) {\n const resolved = type.resolve(enDoc.slug, locale);\n if (!resolved.document) continue;\n if (excludeRedirected && resolved.shouldRedirectTo) continue;\n if (excludeNoindex && resolved.document.noindex) continue;\n\n const doc = resolved.document;\n const slugWithExt = `${doc.slug}${extension}`;\n const urlPath = urlBuilder.resolvePath(pathTemplate, slugWithExt, locale);\n\n out.push({\n relativePath: urlPath.slice(1),\n urlPath,\n locale,\n typeId: type.id,\n enSlug: doc.enSlug,\n source: serializeMdx(doc.frontmatter, doc.content),\n });\n }\n }\n }\n\n return out;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport {\n buildStaticRawExports,\n getStaticExportRoots,\n type BuildStaticRawExportsOptions,\n} from \"./build-static-raw-exports.js\";\n\nexport interface WriteStaticRawExportsOptions extends BuildStaticRawExportsOptions {\n /** Output directory (typically `public`). Default `public`. */\n outDir?: string;\n}\n\nfunction rmDirIfExists(dir: string): void {\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/** Remove managed export roots, write fresh static raw MDX files, return exports written. */\nexport function writeStaticRawExports(\n project: ScribeProject,\n options: WriteStaticRawExportsOptions = {},\n): { exports: ReturnType<typeof buildStaticRawExports>; written: number } {\n const outDir = path.resolve(options.outDir ?? \"public\");\n const typeFilter = options.types;\n\n for (const root of getStaticExportRoots(project, {\n types: typeFilter,\n locales: options.locales,\n })) {\n rmDirIfExists(path.join(outDir, root));\n }\n\n const exports = buildStaticRawExports(project, options);\n const counts = new Map<string, number>();\n\n for (const item of exports) {\n const filePath = path.join(outDir, item.relativePath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, item.source, \"utf8\");\n const key = `${item.typeId}/${item.locale}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n for (const [key, count] of [...counts.entries()].sort()) {\n console.log(` ${key}: ${count}`);\n }\n\n return { exports, written: exports.length };\n}\n","import type { OnTargetDelete } from \"../core/field.js\";\nimport {\n listAssetFields,\n listRelationFields,\n type SchemaFieldMeta,\n} from \"../core/introspect-schema.js\";\nimport type { ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { extractInlineTokens } from \"../inline/tokens.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n countEnSnapshotsForEnSlug,\n countTranslationsForEnSlug,\n} from \"../storage/translations.js\";\n\n/**\n * Deletion planning for `scribe delete` (CLI + studio). One module computes the\n * full impact of deleting an entry — transitive cascades, reference detaches,\n * blockers, asset files, and store rows — so both surfaces render and execute\n * exactly the same plan. See `docs/deletion.md`.\n */\n\n/** The requested deletion (and any title for display). */\nexport interface DeletionRoot {\n typeId: string;\n enSlug: string;\n title?: string;\n}\n\n/** A document deleted transitively because it cascaded from a deleted target. */\nexport interface DeletionCascade {\n typeId: string;\n enSlug: string;\n /** Human-readable edge that pulled it in, e.g. `model=alice`. */\n via: string;\n}\n\n/** A surviving document whose reference to a deleted target is removed. */\nexport interface DeletionDetach {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n removedSlug: string;\n}\n\n/** A document that prevents the deletion (restrict, or a required single relation). */\nexport interface DeletionBlocker {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n reason: \"restrict\" | \"required-single\";\n}\n\n/** An asset file owned by a deleted document. */\nexport interface DeletionAsset {\n path: string;\n ownerTypeId: string;\n ownerEnSlug: string;\n action: \"delete\" | \"keep\";\n /** Why an asset is kept: config `onDelete: \"keep\"`, or a shared path referenced elsewhere. */\n reason?: \"config-keep\" | \"shared\";\n}\n\n/** Per-document store row counts removed by the deletion. */\nexport interface DeletionStoreCounts {\n typeId: string;\n enSlug: string;\n translations: number;\n snapshots: number;\n}\n\n/**\n * A surviving document whose MDX body references (via `${{relation:...}}`) a doc\n * in the deletion set. Body relation tokens never cascade, detach, or block —\n * they will simply dangle and become validation errors after the deletion.\n */\nexport interface BodyRefWarning {\n typeId: string;\n enSlug: string;\n targetTypeId: string;\n targetEnSlug: string;\n}\n\nexport interface DeletionPlan {\n roots: DeletionRoot[];\n cascades: DeletionCascade[];\n detaches: DeletionDetach[];\n blocked: DeletionBlocker[];\n assets: DeletionAsset[];\n store: DeletionStoreCounts[];\n /** Warn-only: surviving body references that will dangle after deletion. */\n bodyRefWarnings: BodyRefWarning[];\n}\n\n/** Whether a plan can be executed (no blockers). */\nexport function isPlanBlocked(plan: DeletionPlan): boolean {\n return plan.blocked.length > 0;\n}\n\n/** Every document the plan removes (roots first, then transitive cascades). */\nexport function deletedDocs(plan: DeletionPlan): Array<{ typeId: string; enSlug: string }> {\n return [\n ...plan.roots.map((r) => ({ typeId: r.typeId, enSlug: r.enSlug })),\n ...plan.cascades.map((c) => ({ typeId: c.typeId, enSlug: c.enSlug })),\n ];\n}\n\nfunction docKey(typeId: string, enSlug: string): string {\n return `${typeId}\\u0000${enSlug}`;\n}\n\n/** Collect the EN slugs a relation field points at (handles arrays and `*` paths). */\nfunction relationSlugsAt(frontmatter: Record<string, unknown>, path: string[]): string[] {\n const out: string[] = [];\n const walk = (container: unknown, remaining: string[]): void => {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n const value = record[head];\n if (Array.isArray(value)) {\n for (const slug of value) if (typeof slug === \"string\" && slug) out.push(slug);\n } else if (typeof value === \"string\" && value) {\n out.push(value);\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) for (const item of arr) walk(item, rest.slice(1));\n return;\n }\n walk(record[head], rest);\n };\n walk(frontmatter, path);\n return out;\n}\n\n/** Collect the source web paths a declared asset field resolves to (materializing templates). */\nfunction assetValuesAt(\n frontmatter: Record<string, unknown>,\n field: SchemaFieldMeta,\n enSlug: string,\n): string[] {\n const out: string[] = [];\n const walk = (container: unknown, remaining: string[]): void => {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n const value = record[head];\n if (typeof value === \"string\" && value) out.push(value);\n else if (value === undefined && field.assetTemplate) {\n out.push(field.assetTemplate.split(\"{slug}\").join(enSlug));\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) for (const item of arr) walk(item, rest.slice(1));\n return;\n }\n walk(record[head], rest);\n };\n walk(frontmatter, field.path);\n return out;\n}\n\ninterface Referrer {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n multiple: boolean;\n optional: boolean;\n onTargetDelete: OnTargetDelete;\n}\n\ninterface DocRecord {\n typeId: string;\n enSlug: string;\n frontmatter: Record<string, unknown>;\n}\n\n/**\n * Compute the full deletion plan for one entry. Reads source (unresolved)\n * frontmatter from the project's cached document lists — no side effects. Store\n * row counts are read from the (read-only) SQLite store when it exists.\n */\nexport function buildDeletionPlan(\n project: ScribeProject,\n typeId: string,\n enSlug: string,\n): DeletionPlan {\n const rootType = (() => {\n try {\n return project.getType(typeId);\n } catch {\n return null;\n }\n })();\n if (!rootType) {\n throw new Error(`Unknown content type \"${typeId}\"`);\n }\n const rootDoc = rootType.get(enSlug);\n if (!rootDoc) {\n throw new Error(`No ${typeId} entry \"${enSlug}\"`);\n }\n\n // Snapshot every document's source frontmatter, plus per-type field metadata.\n const docByKey = new Map<string, DocRecord>();\n const relationFieldsByType = new Map<string, SchemaFieldMeta[]>();\n const assetFieldsByType = new Map<string, SchemaFieldMeta[]>();\n const referrers = new Map<string, Referrer[]>();\n const assetRefs = new Map<string, Set<string>>();\n // Every `${{relation:...}}` body reference, collected up front; filtered\n // against the deletion set once it is known.\n const bodyRelationRefs: BodyRefWarning[] = [];\n\n for (const type of project.listTypes()) {\n const relFields = listRelationFields(type.config.schema);\n const assetFields = listAssetFields(type.config.schema);\n relationFieldsByType.set(type.id, relFields);\n assetFieldsByType.set(type.id, assetFields);\n for (const doc of type.list() as ScribeDocument[]) {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n docByKey.set(docKey(type.id, doc.enSlug), {\n typeId: type.id,\n enSlug: doc.enSlug,\n frontmatter,\n });\n // Reverse relation index: (targetType, targetSlug) -> referrers.\n for (const field of relFields) {\n const target = field.relationTarget;\n if (!target) continue;\n for (const slug of relationSlugsAt(frontmatter, field.path)) {\n const list = referrers.get(docKey(target, slug)) ?? [];\n list.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n fieldPath: field.path.join(\".\"),\n multiple: Boolean(field.relationMultiple),\n optional: Boolean(field.relationOptional),\n onTargetDelete: field.relationOnTargetDelete ?? \"restrict\",\n });\n referrers.set(docKey(target, slug), list);\n }\n }\n // Asset reference graph (declared fields only), keyed by source web path.\n for (const field of assetFields) {\n for (const webPath of assetValuesAt(frontmatter, field, doc.enSlug)) {\n const set = assetRefs.get(webPath) ?? new Set<string>();\n set.add(docKey(type.id, doc.enSlug));\n assetRefs.set(webPath, set);\n }\n }\n // Body relation tokens: recorded now, filtered against the deletion set later.\n for (const token of extractInlineTokens(doc.content).tokens) {\n if (token.kind === \"relation\") {\n bodyRelationRefs.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n targetTypeId: token.targetTypeId,\n targetEnSlug: token.enSlug,\n });\n }\n }\n }\n }\n\n // ---- Transitive cascade (cycle-safe: visited keyed by type + enSlug). ----\n const deleted = new Map<string, { typeId: string; enSlug: string; via?: string }>();\n deleted.set(docKey(typeId, enSlug), { typeId, enSlug });\n const queue: Array<{ typeId: string; enSlug: string }> = [{ typeId, enSlug }];\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const ref of referrers.get(docKey(current.typeId, current.enSlug)) ?? []) {\n if (ref.onTargetDelete !== \"cascade\") continue;\n const refKey = docKey(ref.typeId, ref.enSlug);\n if (deleted.has(refKey)) continue;\n deleted.set(refKey, {\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n via: `${ref.fieldPath}=${current.enSlug}`,\n });\n queue.push({ typeId: ref.typeId, enSlug: ref.enSlug });\n }\n }\n\n // ---- Detaches + blockers over surviving referrers of every deleted doc. ----\n const detaches: DeletionDetach[] = [];\n const blocked: DeletionBlocker[] = [];\n const seenDetach = new Set<string>();\n const seenBlock = new Set<string>();\n for (const del of deleted.values()) {\n for (const ref of referrers.get(docKey(del.typeId, del.enSlug)) ?? []) {\n // A referrer that is itself deleted loses the reference with its own file.\n if (deleted.has(docKey(ref.typeId, ref.enSlug))) continue;\n if (ref.onTargetDelete === \"restrict\") {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000restrict`;\n if (!seenBlock.has(k)) {\n seenBlock.add(k);\n blocked.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n reason: \"restrict\",\n });\n }\n } else if (ref.onTargetDelete === \"detach\") {\n const requiredSingle = !ref.multiple && !ref.optional;\n if (requiredSingle) {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000required-single`;\n if (!seenBlock.has(k)) {\n seenBlock.add(k);\n blocked.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n reason: \"required-single\",\n });\n }\n } else {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000${del.enSlug}`;\n if (!seenDetach.has(k)) {\n seenDetach.add(k);\n detaches.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n removedSlug: del.enSlug,\n });\n }\n }\n }\n // cascade referrers are already in `deleted` and handled above.\n }\n }\n\n // ---- Assets owned by deleted docs. ----\n const assets: DeletionAsset[] = [];\n const seenAsset = new Set<string>();\n for (const del of deleted.values()) {\n const record = docByKey.get(docKey(del.typeId, del.enSlug));\n if (!record) continue;\n for (const field of assetFieldsByType.get(del.typeId) ?? []) {\n for (const webPath of assetValuesAt(record.frontmatter, field, del.enSlug)) {\n const dedupeKey = `${del.typeId}\\u0000${del.enSlug}\\u0000${webPath}`;\n if (seenAsset.has(dedupeKey)) continue;\n seenAsset.add(dedupeKey);\n if (field.assetOnDelete === \"keep\") {\n assets.push({\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"keep\",\n reason: \"config-keep\",\n });\n continue;\n }\n // Delete only when no surviving doc references the same path.\n const refs = assetRefs.get(webPath) ?? new Set<string>();\n let sharedOutside = false;\n for (const owner of refs) {\n if (!deleted.has(owner)) {\n sharedOutside = true;\n break;\n }\n }\n assets.push(\n sharedOutside\n ? {\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"keep\",\n reason: \"shared\",\n }\n : {\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"delete\",\n },\n );\n }\n }\n }\n\n // ---- Store row counts (best-effort; store may not exist yet). ----\n const store: DeletionStoreCounts[] = [];\n try {\n const db = openStore(project.config, \"readonly\");\n try {\n for (const del of deleted.values()) {\n store.push({\n typeId: del.typeId,\n enSlug: del.enSlug,\n translations: countTranslationsForEnSlug(db, del.typeId, del.enSlug),\n snapshots: countEnSnapshotsForEnSlug(db, del.typeId, del.enSlug),\n });\n }\n } finally {\n db.close();\n }\n } catch {\n for (const del of deleted.values()) {\n store.push({ typeId: del.typeId, enSlug: del.enSlug, translations: 0, snapshots: 0 });\n }\n }\n\n const rootTitle = (() => {\n const title = (rootDoc.frontmatter as Record<string, unknown>).title;\n return typeof title === \"string\" && title.trim() ? title : undefined;\n })();\n\n const cascades: DeletionCascade[] = [];\n for (const del of deleted.values()) {\n if (del.typeId === typeId && del.enSlug === enSlug) continue;\n cascades.push({ typeId: del.typeId, enSlug: del.enSlug, via: del.via ?? \"\" });\n }\n\n // Body references that point INTO the deletion set from a SURVIVING document\n // will dangle. Never block or mutate execution — warn only.\n const bodyRefWarnings = bodyRelationRefs.filter(\n (ref) =>\n deleted.has(docKey(ref.targetTypeId, ref.targetEnSlug)) &&\n !deleted.has(docKey(ref.typeId, ref.enSlug)),\n );\n\n return {\n roots: [{ typeId, enSlug, title: rootTitle }],\n cascades,\n detaches,\n blocked,\n assets,\n store,\n bodyRefWarnings,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport { listRelationFields, type SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport { bumpContentVersion } from \"../loader/create-loader.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n deleteEnSnapshotsForEnSlug,\n deleteTranslationsForEnSlug,\n} from \"../storage/translations.js\";\nimport { deletedDocs, isPlanBlocked, type DeletionPlan } from \"./plan.js\";\n\nexport interface ExecuteDeletionResult {\n /** EN files removed from disk. */\n deletedFiles: string[];\n /** Asset files removed from disk. */\n deletedAssets: string[];\n /** EN files rewritten to drop a detached reference. */\n detachedFiles: string[];\n /** Translation rows removed from the store. */\n translationsDeleted: number;\n /** EN snapshot rows removed from the store. */\n snapshotsDeleted: number;\n}\n\n/** Locate the on-disk EN file for a document, trying `.mdx` then `.md`. */\nfunction enFilePath(rootDir: string, contentDir: string, enSlug: string): string | null {\n for (const ext of [\".mdx\", \".md\"]) {\n const candidate = path.join(rootDir, contentDir, `${enSlug}${ext}`);\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Rewrite the frontmatter block of a raw MDX string, leaving the body bytes\n * exactly as they were. The YAML is re-serialized (minor reformatting is\n * acceptable); everything after the closing `---` line is preserved verbatim.\n */\nfunction rewriteFrontmatter(raw: string, data: Record<string, unknown>): string {\n const match = raw.match(/^()?---[ \\t]*\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*(\\r?\\n|$)/);\n if (!match) {\n throw new Error(\"Cannot rewrite frontmatter: no leading YAML block found\");\n }\n const bom = match[1] ?? \"\";\n const body = raw.slice(match[0].length);\n const serialized = matter.stringify(\"\", data);\n const blockMatch = serialized.match(/^---[ \\t]*\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*\\r?\\n/);\n const block = blockMatch ? blockMatch[0] : serialized;\n return `${bom}${block}${body}`;\n}\n\n/** Remove a detached slug at a relation field path (handles arrays and `*` paths). */\nfunction removeSlugAtPath(\n container: unknown,\n remaining: string[],\n removedSlug: string,\n multiple: boolean,\n): void {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n if (multiple) {\n const value = record[head];\n if (Array.isArray(value)) {\n record[head] = value.filter((slug) => slug !== removedSlug);\n }\n } else if (record[head] === removedSlug) {\n // Optional single relation: clear it only when it points at the deleted target.\n delete record[head];\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) {\n for (const item of arr) removeSlugAtPath(item, rest.slice(1), removedSlug, multiple);\n }\n return;\n }\n removeSlugAtPath(record[head], rest, removedSlug, multiple);\n}\n\n/**\n * Execute a deletion plan: remove EN files, delete asset files, rewrite detach\n * references, and clean up store rows. Refuses to run while the plan is blocked.\n * Performs exactly the plan and nothing else.\n */\nexport function executeDeletionPlan(\n project: ScribeProject,\n plan: DeletionPlan,\n): ExecuteDeletionResult {\n if (isPlanBlocked(plan)) {\n throw new Error(\"Refusing to execute a blocked deletion plan\");\n }\n\n const config = project.config;\n const result: ExecuteDeletionResult = {\n deletedFiles: [],\n deletedAssets: [],\n detachedFiles: [],\n translationsDeleted: 0,\n snapshotsDeleted: 0,\n };\n\n // 1. Detach rewrites first (grouped by referring file), before the referenced\n // files vanish. Body bytes are preserved.\n const detachesByFile = new Map<string, typeof plan.detaches>();\n for (const detach of plan.detaches) {\n const key = `${detach.typeId} ${detach.enSlug}`;\n const list = detachesByFile.get(key) ?? [];\n list.push(detach);\n detachesByFile.set(key, list);\n }\n for (const [, detaches] of detachesByFile) {\n const { typeId, enSlug } = detaches[0]!;\n const type = project.getType(typeId);\n const file = enFilePath(config.rootDir, type.config.contentDir, enSlug);\n if (!file) continue;\n const fieldByPath = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.config.schema).map((f) => [f.path.join(\".\"), f]),\n );\n const raw = fs.readFileSync(file, \"utf8\");\n // gray-matter caches its parse result per input string; clone before mutating\n // so we never corrupt that shared object.\n const data = structuredClone(matter(raw).data) as Record<string, unknown>;\n for (const detach of detaches) {\n const field = fieldByPath.get(detach.fieldPath);\n if (!field) continue;\n removeSlugAtPath(\n data,\n detach.fieldPath.split(\".\"),\n detach.removedSlug,\n Boolean(field.relationMultiple),\n );\n }\n fs.writeFileSync(file, rewriteFrontmatter(raw, data), \"utf8\");\n result.detachedFiles.push(file);\n }\n\n // 2. Delete asset files (only those the plan marks for deletion).\n const assetsDir = config.assets?.assetsPath ?? config.assetsPath;\n for (const asset of plan.assets) {\n if (asset.action !== \"delete\") continue;\n if (!assetsDir) continue;\n const root = path.resolve(assetsDir);\n const relative = asset.path.replace(/^\\/+/, \"\");\n const abs = path.resolve(root, relative);\n const rootWithSep = root.endsWith(path.sep) ? root : root + path.sep;\n if (abs !== root && !abs.startsWith(rootWithSep)) continue;\n if (fs.existsSync(abs)) {\n fs.rmSync(abs, { force: true });\n result.deletedAssets.push(abs);\n }\n }\n\n // 3. Delete EN files.\n for (const doc of deletedDocs(plan)) {\n const type = project.getType(doc.typeId);\n const file = enFilePath(config.rootDir, type.config.contentDir, doc.enSlug);\n if (file && fs.existsSync(file)) {\n fs.rmSync(file, { force: true });\n result.deletedFiles.push(file);\n }\n }\n\n // 4. Store cleanup: translation rows + EN snapshots for every deleted doc.\n const db = openStore(config, \"readwrite\");\n try {\n for (const doc of deletedDocs(plan)) {\n result.translationsDeleted += deleteTranslationsForEnSlug(db, doc.typeId, doc.enSlug);\n result.snapshotsDeleted += deleteEnSnapshotsForEnSlug(db, doc.typeId, doc.enSlug);\n }\n } finally {\n db.close();\n }\n\n // Force every in-process content loader to rebuild on next read so the deleted\n // (and detached) docs disappear immediately, bypassing the dev revalidation\n // window and the studio's fingerprint-keyed derived cache.\n bumpContentVersion();\n\n return result;\n}\n"]}
1
+ {"version":3,"sources":["../src/core/field.ts","../src/core/introspect-schema.ts","../src/core/managed-roots.ts","../src/core/types.ts","../src/i18n/build-url.ts","../src/config/resolve-config.ts","../src/core/builtin-fields.ts","../src/storage/sqlite.ts","../src/storage/translations.ts","../src/translate/normalize-mdx-body.ts","../src/translate/sanitize-mdx-jsx.ts","../src/translate/validate-mdx-body.ts","../src/loader/resolve-assets.ts","../src/inline/tokens.ts","../src/inline/resolve-tokens.ts","../src/loader/normalize-en.ts","../src/loader/create-loader.ts","../src/i18n/resolve-document.ts","../src/create-project.ts","../src/core/alias-helpers.ts","../src/i18n/translation-index.ts","../src/redirects/redirect-schema.ts","../src/redirects/load-type-redirects.ts","../src/redirects/build-json-redirects.ts","../src/redirects/build-redirects.ts","../src/sitemap/join-base-url.ts","../src/sitemap/generate-sitemap.ts","../src/create-scribe.ts","../src/config/load-config.ts","../src/validate/validate-redirects.ts","../src/validate/validate-relations.ts","../src/validate/validate-assets.ts","../src/core/localized-slug.ts","../src/validate/validate-slug-suffix.ts","../src/validate/validate-inline-tokens.ts","../src/validate/validate-project.ts","../src/hash/page-hash.ts","../src/translate/worklist.ts","../src/storage/batch-jobs.ts","../src/history/record-snapshot.ts","../src/translate/retry.ts","../src/translate/gemini-batch.ts","../src/translate/gemini-models.ts","../src/translate/gemini-client.ts","../src/translate/gemini-pricing.ts","../src/translate/prompts/translation-prompt.ts","../src/translate/response-schema.ts","../src/translate/resolve-translate-config.ts","../src/translate/validate-translation.ts","../src/translate/translate-core.ts","../src/translate/batch-worklist.ts","../src/translate/page-translator.ts","../src/loader/parse-mdx.ts","../src/export/build-static-raw-exports.ts","../src/export/write-static-raw-exports.ts","../src/delete/plan.ts","../src/delete/execute.ts"],"names":["path","prefix","z","field","fs","valStart","localizedSlug","matter","options","listEnSlugs","isStringRecord","sleep","GoogleGenAI","results","totals"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\nimport type { z as Zod } from \"zod\";\n\nconst FIELD_KIND = Symbol.for(\"@genlook/scribe/fieldKind\");\nconst RELATION_META = Symbol.for(\"@genlook/scribe/relationMeta\");\nconst ASSET_META = Symbol.for(\"@genlook/scribe/assetMeta\");\n\nexport type FieldKind = \"translatable\" | \"structural\";\n\n/**\n * What happens to a document that references a target when that target is\n * deleted (see `docs/deletion.md`).\n * - `\"restrict\"` (default) — deletion of the target is blocked.\n * - `\"detach\"` — the reference is removed (dropped from arrays, optional single\n * relations cleared). A required single relation can never be detached.\n * - `\"cascade\"` — the referencing document is deleted too, recursively.\n */\nexport type OnTargetDelete = \"restrict\" | \"detach\" | \"cascade\";\n\n/** What happens to an asset file when its own document is deleted. Default `\"delete\"`. */\nexport type AssetOnDelete = \"delete\" | \"keep\";\n\nexport interface RelationMeta {\n typeId: string;\n multiple: boolean;\n optional: boolean;\n /** Cascade behavior applied when the referenced target is deleted. */\n onTargetDelete: OnTargetDelete;\n}\n\n/** Constraints carried by a `field.asset()` schema (see `docs/assets.md`). */\nexport interface AssetMeta {\n dir?: string;\n template?: string;\n formats?: string[];\n maxKB?: number;\n optional: boolean;\n /** Whether the file is removed when its document is deleted. Default `\"delete\"`. */\n onDelete: AssetOnDelete;\n}\n\n/**\n * Type-level brand carried by `field.relation()` schemas so the target\n * content-type id (and multiplicity/optionality) survive into `related()`.\n * Never exists at runtime.\n */\nexport declare const RELATION_BRAND: unique symbol;\n\nexport interface RelationBrand<\n TTarget extends string = string,\n TMultiple extends boolean = boolean,\n TOptional extends boolean = boolean,\n> {\n target: TTarget;\n multiple: TMultiple;\n optional: TOptional;\n}\n\n/** A Zod schema branded with relation metadata (see `field.relation()`). */\nexport type RelationField<\n TZod extends Zod.ZodTypeAny,\n TBrand extends RelationBrand,\n> = TZod & { [RELATION_BRAND]: TBrand };\n\n/** Return whether a Zod field is translatable or structural. */\nexport function getFieldKind(schema: Zod.ZodTypeAny): FieldKind {\n const tagged = schema as Zod.ZodTypeAny & { [FIELD_KIND]?: FieldKind };\n return tagged[FIELD_KIND] ?? \"structural\";\n}\n\n/** Return relation metadata if the field was created with `field.relation()`. */\nexport function getRelationTarget(schema: Zod.ZodTypeAny): RelationMeta | null {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const tagged = current as Zod.ZodTypeAny & {\n [RELATION_META]?: RelationMeta;\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny };\n };\n if (tagged[RELATION_META]) {\n return tagged[RELATION_META];\n }\n if (typeof tagged.unwrap === \"function\") {\n current = tagged.unwrap();\n continue;\n }\n if (typeof tagged.removeDefault === \"function\") {\n current = tagged.removeDefault();\n continue;\n }\n if (tagged._def?.innerType) {\n current = tagged._def.innerType;\n continue;\n }\n break;\n }\n return null;\n}\n\n/** Return asset metadata if the field was created with `field.asset()`. */\nexport function getAssetMeta(schema: Zod.ZodTypeAny): AssetMeta | null {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const tagged = current as Zod.ZodTypeAny & {\n [ASSET_META]?: AssetMeta;\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny };\n };\n if (tagged[ASSET_META]) {\n return tagged[ASSET_META];\n }\n if (typeof tagged.unwrap === \"function\") {\n current = tagged.unwrap();\n continue;\n }\n if (typeof tagged.removeDefault === \"function\") {\n current = tagged.removeDefault();\n continue;\n }\n if (tagged._def?.innerType) {\n current = tagged._def.innerType;\n continue;\n }\n break;\n }\n return null;\n}\n\nfunction mark<T extends Zod.ZodTypeAny>(schema: T, kind: FieldKind): T {\n Object.defineProperty(schema, FIELD_KIND, {\n value: kind,\n enumerable: false,\n configurable: true,\n });\n return schema;\n}\n\nfunction markRelation<T extends Zod.ZodTypeAny>(schema: T, meta: RelationMeta): T {\n Object.defineProperty(schema, RELATION_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n });\n return mark(schema, \"structural\");\n}\n\nfunction markAsset<T extends Zod.ZodTypeAny>(schema: T, meta: AssetMeta): T {\n Object.defineProperty(schema, ASSET_META, {\n value: meta,\n enumerable: false,\n configurable: true,\n });\n return mark(schema, \"structural\");\n}\n\n/**\n * Options for `field.relation()`. Constraints live here (not as chained Zod\n * methods) because chaining clones the schema and would drop the relation\n * metadata.\n */\nexport interface RelationFieldOptions {\n /** The field holds an array of slugs instead of a single slug. */\n multiple?: boolean;\n /** The field may be omitted; `related()` then returns `null` (single) or `[]` (multiple). */\n optional?: boolean;\n /** Minimum item count (`multiple: true` only). */\n min?: number;\n /** Maximum item count (`multiple: true` only). */\n max?: number;\n /**\n * What happens to THIS document when the referenced target is deleted:\n * `\"restrict\"` (default), `\"detach\"`, or `\"cascade\"`. See `docs/deletion.md`.\n */\n onTargetDelete?: OnTargetDelete;\n}\n\n/**\n * Options for `field.asset()`. Constraints live here (not as chained Zod\n * methods) because chaining clones the schema and would drop the asset\n * metadata. See `docs/assets.md` for the full design.\n */\nexport interface AssetFieldOptions {\n /** Web-path prefix the value must live under (e.g. `\"/try-on/garments\"`). Also declares a managed root. */\n dir?: string;\n /**\n * Derived-path template, e.g. `\"/try-on/garments/{slug}/product.webp\"` —\n * `{slug}` is the entry's EN slug. When set, the frontmatter field may be\n * omitted entirely; the loader fills it. An explicit frontmatter value\n * overrides the template. Its static prefix counts as a managed root.\n */\n template?: string;\n /** Allowed extensions (lowercase, no dot). Violation = validation warning. */\n formats?: string[];\n /** File-size budget in kilobytes. Violation = validation warning. */\n maxKB?: number;\n /** The field may be absent (only meaningful without `template`). A present value whose file is missing is still an error. */\n optional?: boolean;\n /**\n * What happens to the file when its own document is deleted: `\"delete\"`\n * (default) or `\"keep\"`. A shared (non-templated) path is only removed when no\n * document outside the deletion set still references it. See `docs/deletion.md`.\n */\n onDelete?: AssetOnDelete;\n}\n\ntype Bool<T> = [T] extends [true] ? true : false;\n\n/**\n * Zod shape of a `field.asset()` schema: optional only when `optional` is set.\n *\n * A non-optional `template` field types as `ZodString` even though the runtime\n * schema tolerates an absent frontmatter value: the loader materializes the\n * templated path onto every document it serves (`resolveDocumentAssets` runs on\n * both EN and locale docs), so consumers always observe a `string`.\n */\nexport type AssetField<TOpts extends AssetFieldOptions = AssetFieldOptions> =\n Bool<TOpts[\"optional\"]> extends true ? Zod.ZodOptional<Zod.ZodString> : Zod.ZodString;\n\ntype RelationZod<TOpts extends RelationFieldOptions> =\n Bool<TOpts[\"optional\"]> extends true\n ? Zod.ZodOptional<\n Bool<TOpts[\"multiple\"]> extends true ? Zod.ZodArray<Zod.ZodString> : Zod.ZodString\n >\n : Bool<TOpts[\"multiple\"]> extends true\n ? Zod.ZodArray<Zod.ZodString>\n : Zod.ZodString;\n\ntype RelationFieldFor<\n TTarget extends string,\n TOpts extends RelationFieldOptions,\n> = RelationField<\n RelationZod<TOpts>,\n RelationBrand<TTarget, Bool<TOpts[\"multiple\"]>, Bool<TOpts[\"optional\"]>>\n>;\n\n/**\n * Mark Zod fields for Scribe:\n * - `translatable(schema)` — sent to the translator per locale.\n * - `structural(schema)` — EN-only; merged from EN into every locale document.\n * - `relation(typeId, options?)` — EN slug reference(s) to another content type,\n * validated by `scribe validate` and dereferenced via `scribe.<type>.related()`.\n * - `asset(options?)` — root-relative web path to a file under `assets.dir`,\n * validated by `scribe validate` and resolved to a served URL at load time.\n */\nexport const field = {\n translatable: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"translatable\"),\n structural: <T extends Zod.ZodTypeAny>(schema: T): T => mark(schema, \"structural\"),\n relation: <const TTarget extends string, const TOpts extends RelationFieldOptions = {}>(\n typeId: TTarget,\n options?: TOpts,\n ): RelationFieldFor<TTarget, TOpts> => {\n const multiple = options?.multiple ?? false;\n const optional = options?.optional ?? false;\n if ((options?.min !== undefined || options?.max !== undefined) && !multiple) {\n throw new Error(\n `field.relation(\"${typeId}\"): min/max require { multiple: true }`,\n );\n }\n let inner: Zod.ZodTypeAny;\n if (multiple) {\n let arr = z.array(z.string().min(1));\n if (options?.min !== undefined) arr = arr.min(options.min);\n if (options?.max !== undefined) arr = arr.max(options.max);\n inner = arr;\n } else {\n inner = z.string().min(1);\n }\n const onTargetDelete = options?.onTargetDelete ?? \"restrict\";\n markRelation(inner, { typeId, multiple, optional, onTargetDelete });\n const schema = optional ? inner.optional() : inner;\n return schema as RelationFieldFor<TTarget, TOpts>;\n },\n asset: <const TOpts extends AssetFieldOptions = {}>(options?: TOpts): AssetField<TOpts> => {\n const optional = options?.optional ?? false;\n const inner = z.string().min(1);\n markAsset(inner, {\n dir: options?.dir,\n template: options?.template,\n formats: options?.formats,\n maxKB: options?.maxKB,\n optional,\n onDelete: options?.onDelete ?? \"delete\",\n });\n // A templated field may be omitted in frontmatter — the loader materializes it.\n const schema = optional || options?.template !== undefined ? inner.optional() : inner;\n return schema as AssetField<TOpts>;\n },\n};\n\n/** Strip Zod wrappers (optional, default, etc.) to reach the inner schema. */\nexport function unwrapSchema(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const anySchema = current as Zod.ZodTypeAny & {\n unwrap?: () => Zod.ZodTypeAny;\n removeDefault?: () => Zod.ZodTypeAny;\n _def?: { innerType?: Zod.ZodTypeAny; type?: string };\n };\n if (typeof anySchema.unwrap === \"function\") {\n current = anySchema.unwrap();\n continue;\n }\n if (typeof anySchema.removeDefault === \"function\") {\n current = anySchema.removeDefault();\n continue;\n }\n if (anySchema._def?.innerType) {\n current = anySchema._def.innerType;\n continue;\n }\n break;\n }\n return current;\n}\n\n/** Strip optional/default/nullable wrappers only — preserves arrays and objects. */\nexport function peelOptionalWrappers(schema: Zod.ZodTypeAny): Zod.ZodTypeAny {\n let current: Zod.ZodTypeAny = schema;\n for (let i = 0; i < 8; i++) {\n const type = (current as Zod.ZodTypeAny & { _def?: { type?: string } })._def?.type;\n if (type === \"optional\" || type === \"nullable\") {\n current = (current as Zod.ZodOptional<Zod.ZodTypeAny>).unwrap();\n continue;\n }\n if (type === \"default\") {\n current = (current as Zod.ZodDefault<Zod.ZodTypeAny>).removeDefault();\n continue;\n }\n break;\n }\n return current;\n}\n","import type { z } from \"zod\";\nimport {\n getAssetMeta,\n getFieldKind,\n getRelationTarget,\n peelOptionalWrappers,\n type AssetOnDelete,\n type OnTargetDelete,\n} from \"./field.js\";\nimport type { ContentTypeInput } from \"./types.js\";\n\nexport interface SchemaFieldMeta {\n path: string[];\n kind: \"translatable\" | \"structural\" | \"relation\" | \"asset\";\n relationTarget?: string;\n relationMultiple?: boolean;\n relationOptional?: boolean;\n /** Cascade behavior when the referenced target is deleted (relation fields). */\n relationOnTargetDelete?: OnTargetDelete;\n assetDir?: string;\n assetTemplate?: string;\n assetFormats?: string[];\n assetMaxKB?: number;\n assetOptional?: boolean;\n /** Whether the asset file is deleted with its document (asset fields). */\n assetOnDelete?: AssetOnDelete;\n}\n\nfunction getArrayElement(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n if (\n schema instanceof Object &&\n \"element\" in schema &&\n (schema as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return (schema as z.ZodArray<z.ZodTypeAny>).element as z.ZodTypeAny;\n }\n return null;\n}\n\n/**\n * List schema fields with translatable/structural/relation metadata.\n * Array-of-object fields recurse with a `*` path segment (`steps.*.title`) so\n * extraction and merging preserve the array shape. Note: `peelOptionalWrappers`\n * is used (not `unwrapSchema`) because zod v4 arrays expose `unwrap()`, which\n * would silently flatten the array level out of the paths.\n */\nexport function introspectSchema(schema: z.ZodTypeAny, prefix: string[] = []): SchemaFieldMeta[] {\n const relation = getRelationTarget(schema);\n if (relation && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"relation\",\n relationTarget: relation.typeId,\n relationMultiple: relation.multiple,\n relationOptional: relation.optional,\n relationOnTargetDelete: relation.onTargetDelete,\n },\n ];\n }\n\n const asset = getAssetMeta(schema);\n if (asset && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"asset\",\n assetDir: asset.dir,\n assetTemplate: asset.template,\n assetFormats: asset.formats,\n assetMaxKB: asset.maxKB,\n assetOptional: asset.optional,\n assetOnDelete: asset.onDelete,\n },\n ];\n }\n\n // An explicit translatable mark makes the whole subtree one translation unit\n // (e.g. field.translatable(z.array(z.string()))).\n if (prefix.length > 0 && getFieldKind(schema) === \"translatable\") {\n return [{ path: prefix, kind: \"translatable\" }];\n }\n\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n const shape = (base as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, key]));\n }\n return fields;\n }\n\n const element = getArrayElement(base);\n if (element) {\n const elementBase = peelOptionalWrappers(element);\n if (elementBase instanceof Object && \"shape\" in elementBase) {\n const shape = (elementBase as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, \"*\", key]));\n }\n return fields;\n }\n }\n\n return [{ path: prefix, kind: getFieldKind(schema) }];\n}\n\ninterface PathTrie {\n leaf: boolean;\n children: Map<string, PathTrie>;\n}\n\nfunction buildPathTrie(paths: string[][]): PathTrie {\n const root: PathTrie = { leaf: false, children: new Map() };\n for (const path of paths) {\n let node = root;\n for (const segment of path) {\n let child = node.children.get(segment);\n if (!child) {\n child = { leaf: false, children: new Map() };\n node.children.set(segment, child);\n }\n node = child;\n }\n node.leaf = true;\n }\n return root;\n}\n\nfunction extractNode(data: unknown, trie: PathTrie): unknown {\n if (trie.leaf) return data;\n\n const star = trie.children.get(\"*\");\n if (star) {\n if (!Array.isArray(data)) return undefined;\n // Preserve array length so structural/translatable halves merge per index.\n return data.map((item) =>\n typeof item === \"object\" && item !== null ? (extractNode(item, star) ?? {}) : {},\n );\n }\n\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) return undefined;\n const record = data as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const [key, child] of trie.children) {\n const value = extractNode(record[key], child);\n if (value !== undefined) {\n out[key] = value;\n any = true;\n }\n }\n return any ? out : undefined;\n}\n\nexport function extractByPaths(\n data: Record<string, unknown>,\n paths: string[][],\n): Record<string, unknown> {\n if (paths.length === 0) return {};\n const extracted = extractNode(data, buildPathTrie(paths));\n return extracted && typeof extracted === \"object\" && !Array.isArray(extracted)\n ? (extracted as Record<string, unknown>)\n : {};\n}\n\n/** Extract frontmatter fields marked as translatable. */\nexport function pickTranslatable(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const translatablePaths = introspectSchema(schema)\n .filter((f) => f.kind === \"translatable\")\n .map((f) => f.path);\n return extractByPaths(data, translatablePaths);\n}\n\n/**\n * Drop nested translatable output when the EN document has no matching structural\n * parent (e.g. model-hallucinated blog `itemList` on posts with no ItemList SEO).\n */\nexport function pruneOrphanNestedTranslations(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const out = { ...localeData };\n const structuralParentsWithNested = new Set<string>();\n for (const meta of introspectSchema(schema)) {\n if (meta.kind !== \"translatable\" || meta.path.length < 3 || meta.path[1] !== \"*\") continue;\n structuralParentsWithNested.add(meta.path[0]!);\n }\n for (const parent of structuralParentsWithNested) {\n const enParent = enData[parent];\n if (enParent === undefined || enParent === null) {\n delete out[parent];\n }\n }\n return out;\n}\n\n/** Extract frontmatter fields marked as structural (EN-only). */\nexport function pickStructural(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const structuralPaths = introspectSchema(schema)\n .filter((f) => f.kind === \"structural\" || f.kind === \"relation\" || f.kind === \"asset\")\n .map((f) => f.path);\n return extractByPaths(data, structuralPaths);\n}\n\n/** Merge EN structural fields onto a locale document's frontmatter at load time. */\nexport function mergeStructuralOntoLocale(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const structural = pickStructural(enData, schema);\n const translatable = pickTranslatable(localeData, schema);\n return deepMerge(structural, translatable);\n}\n\nfunction deepMerge(base: Record<string, unknown>, overlay: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(overlay)) {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n out[key] &&\n typeof out[key] === \"object\" &&\n !Array.isArray(out[key])\n ) {\n out[key] = deepMerge(out[key] as Record<string, unknown>, value as Record<string, unknown>);\n } else if (Array.isArray(value) && Array.isArray(out[key])) {\n out[key] = mergeArrayOverlay(out[key] as unknown[], value as unknown[]);\n } else if (value !== undefined) {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction mergeArrayOverlay(base: unknown[], overlay: unknown[]): unknown[] {\n return base.map((item, index) => {\n const overlayItem = overlay[index];\n if (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n overlayItem &&\n typeof overlayItem === \"object\" &&\n !Array.isArray(overlayItem)\n ) {\n return deepMerge(item as Record<string, unknown>, overlayItem as Record<string, unknown>);\n }\n return overlayItem ?? item;\n });\n}\n\n/** Collect the schema fields marked `field.translatable()`. */\nexport function listTranslatableFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"translatable\");\n}\n\n/**\n * Whether a content type has anything to translate. A type with a body is\n * always potentially translatable; a bodyless type (`body: false`) is\n * translatable only when at least one schema field is `field.translatable()`.\n *\n * The single source of truth for every translation workflow (worklist, staleness,\n * status counts, studio dashboards, store writes): a type for which this returns\n * `false` disappears from all of them.\n */\nexport function isTypeTranslatable(type: Pick<ContentTypeInput, \"schema\" | \"body\">): boolean {\n return listTranslatableFields(type.schema).length > 0 || type.body !== false;\n}\n\n/** Collect relation field paths and targets from a content schema. */\nexport function listRelationFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"relation\");\n}\n\n/** Collect asset field paths and constraints from a content schema. */\nexport function listAssetFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"asset\");\n}\n","import { listAssetFields } from \"./introspect-schema.js\";\nimport type { ScribeConfig } from \"./types.js\";\n\nfunction normalizeRoot(root: string): string {\n const trimmed = `/${root.replace(/^\\/+|\\/+$/g, \"\")}`;\n return trimmed === \"/\" ? \"\" : trimmed;\n}\n\n/**\n * Managed root implied by a template's static prefix: the substring up to the\n * first `{`, with the trailing partial path segment dropped.\n * `\"/try-on/garments/{slug}/product.webp\"` → `\"/try-on/garments\"`.\n */\nexport function templateManagedRoot(template: string): string {\n const braceIndex = template.indexOf(\"{\");\n const staticPart = braceIndex >= 0 ? template.slice(0, braceIndex) : template;\n const lastSlash = staticPart.lastIndexOf(\"/\");\n const prefix = lastSlash >= 0 ? staticPart.slice(0, lastSlash) : staticPart;\n return normalizeRoot(prefix);\n}\n\n/**\n * Set of Scribe-owned source roots (web paths) for the phase-2 audit layer;\n * files outside these roots are never reported or touched. Union of\n * `assets.managedDirs` and every asset field's `dir`/`template` prefix.\n * Deduped and sorted; empty when the asset system is disabled.\n */\nexport function getManagedRoots(config: ScribeConfig): string[] {\n // Managed roots are meaningful only when the asset system is enabled.\n if (!config.assets) return [];\n\n const roots = new Set<string>();\n\n for (const dir of config.assets.managedDirs ?? []) {\n const normalized = normalizeRoot(dir);\n if (normalized) roots.add(normalized);\n }\n\n for (const type of config.types) {\n for (const f of listAssetFields(type.schema)) {\n if (f.assetDir) {\n const normalized = normalizeRoot(f.assetDir);\n if (normalized) roots.add(normalized);\n }\n if (f.assetTemplate) {\n const normalized = templateManagedRoot(f.assetTemplate);\n if (normalized) roots.add(normalized);\n }\n }\n }\n\n return [...roots].sort();\n}\n","import type { z } from \"zod\";\nimport type { RELATION_BRAND, RelationBrand } from \"./field.js\";\n\n/**\n * How document slugs behave across locales.\n * - `\"fixed\"` — the EN slug is used for every locale.\n * - `\"localized\"` — each locale gets its own translated slug.\n */\nexport type SlugStrategy = \"localized\" | \"fixed\";\n\n/**\n * What `resolve()` returns when a locale has no translation for a slug.\n * - `\"en\"` — fall back to the default-locale document.\n * - `\"none\"` — return no document.\n */\nexport type IndexFallback = \"en\" | \"none\";\n\n/** Sort order for `list()`. Built-in keys sort by document metadata; pass a comparator for anything else. */\nexport type OrderBy<TDoc = ScribeDocument> =\n | \"slug\"\n | \"publishedAt\"\n | \"-publishedAt\"\n | \"updatedAt\"\n | \"-updatedAt\"\n | ((a: TDoc, b: TDoc) => number);\n\nexport interface CrossValidateContext {\n locale: string;\n defaultLocale: string;\n slug: string;\n enSlug: string;\n knownLocales: readonly string[];\n englishSlugs?: ReadonlySet<string>;\n}\n\nexport interface CrossValidateIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\n/** Named locale groups usable with `scribe translate --preset <name>`. */\nexport interface LocalePresets {\n active?: string[];\n ultraLight?: string[];\n [name: string]: string[] | undefined;\n}\n\n/** Derived fallback chains: locale → ordered locales tried before the default locale when the locale has no translation. */\nexport type LocaleFallbacks = Record<string, string[]>;\n\n/** How non-default locales appear in generated URLs. */\nexport type LocaleRoutingConfig =\n | { strategy: \"path-prefix\"; prefixDefaultLocale?: boolean }\n | { strategy: \"search-param\"; param: string };\n\n/** Per-content-type translation settings (merged over the project-level defaults). */\nexport interface TranslateConfig {\n /** Replace the default system prompt entirely. */\n prompt?: string;\n /** Brand/domain context prepended to every translation request. */\n context?: string;\n /** Extra rules appended to the default rules. */\n rules?: string[];\n /** Model override for this content type. */\n model?: string;\n}\n\n/** Project-level translation defaults. */\nexport interface ScribeTranslateDefaults {\n defaultModel?: string;\n prompt?: string;\n context?: string;\n rules?: string[];\n}\n\n/**\n * A content type declaration as written in `scribe.config.ts`.\n * Most fields are optional with sensible defaults — see each field's doc.\n */\nexport interface ContentTypeInput<TSchema extends z.ZodTypeAny = z.ZodTypeAny> {\n /** Unique id. Becomes the typed accessor (`scribe.<id>`) and the default `contentDir`. */\n id: string;\n /** Zod schema for the EN frontmatter. Mark fields with `field.translatable()/structural()/relation()`. */\n schema: TSchema;\n /** Directory under the project content dir holding this type's `.mdx` files. Default: the type `id`. */\n contentDir?: string;\n /** URL template for routable types, e.g. `/blog/{slug}`. Must contain exactly one `{slug}`. Omit for reference-only types. */\n path?: string;\n /** Human label (studio UI). Default: capitalized `id`. */\n label?: string;\n /** Default: `\"fixed\"`. */\n slugStrategy?: SlugStrategy;\n /** Default: `\"en\"` when the type has a `path`, otherwise `\"none\"`. */\n indexFallback?: IndexFallback;\n /** Default sort for `list()`. Default: `\"slug\"`. */\n orderBy?: OrderBy<ScribeDocument<z.infer<TSchema>>>;\n /**\n * Whether entries carry an MDX body. Default: `true`. Set `false` for\n * frontmatter-only reference types (e.g. structural `model`/`garment`\n * catalogs): the loader skips MDX body work, validation errors on any\n * non-empty body, translation payloads never include a body, and the studio\n * shows a \"frontmatter-only\" chip instead of a body section. Combined with a\n * schema that has no `field.translatable()` fields, the type is derived to be\n * non-translatable and drops out of every translation workflow. See\n * [Bodyless types](../../docs/bodyless-types.md).\n */\n body?: boolean;\n /** Custom validation across fields, run by `scribe validate`. */\n crossValidate?: (\n data: z.infer<TSchema>,\n ctx: CrossValidateContext,\n ) => CrossValidateIssue[];\n translate?: TranslateConfig;\n}\n\n/** A content type with all defaults applied (what runtimes and the CLI consume). */\nexport interface ContentTypeConfig<TSchema extends z.ZodTypeAny = z.ZodTypeAny>\n extends ContentTypeInput<TSchema> {\n contentDir: string;\n label: string;\n slugStrategy: SlugStrategy;\n indexFallback: IndexFallback;\n}\n\n/**\n * The `assets` config group. Passing `assets: {}` opts a project into the\n * asset system with defaults; without it (and without the deprecated\n * `assetsDir`), asset validation and loader resolution are skipped entirely.\n * See [Asset management](../../docs/assets.md).\n */\nexport interface AssetsConfigInput {\n /** Where source files live on disk, relative to `rootDir`. Default: `\"public\"`. */\n dir?: string;\n /**\n * URL prefix the frontend serves assets under — a path (`\"/\"`, `\"/static/\"`)\n * or an absolute origin (`\"https://cdn.example.com/\"`). Default: `\"/\"`.\n */\n publicPath?: string;\n /**\n * Extra Scribe-owned roots (web paths) not covered by any `field.asset()`\n * `dir`/`template` — e.g. directories referenced from MDX bodies. Used by the\n * future audit layer; files outside managed roots are never reported.\n */\n managedDirs?: string[];\n}\n\n/** Resolved `assets` group (absolute `assetsPath`, defaults applied). */\nexport interface ResolvedAssetsConfig {\n /** Absolute path to the static assets folder. */\n assetsPath: string;\n /** URL prefix served under (raw string; join via the loader helper). */\n publicPath: string;\n /** Extra Scribe-owned source roots (web paths) for the audit layer. */\n managedDirs: string[];\n}\n\n/** Options reserved for the future asset preprocessing pipeline. Phase 1 throws on any provided key. */\nexport interface AssetUrlOptions {}\n\n/**\n * The shape accepted by `defineConfig()` / `createScribe()`.\n * Relative paths (`contentDir`, `store`) resolve against `rootDir`.\n */\nexport interface ScribeConfigInput<\n TTypes extends readonly ContentTypeInput<any>[] = readonly ContentTypeInput[],\n> {\n /** Absolute project root (the directory holding `scribe.config.ts`). */\n rootDir: string;\n /** Directory containing the per-type content folders. Default: `\"content\"`. */\n contentDir?: string;\n /** Path to the SQLite translation store. Default: `\".scribe/store.sqlite\"`. Commit this file; do not gitignore `.scribe/`. */\n store?: string;\n /** Path to the static assets folder (e.g. Next.js `public`). Relative to project `rootDir`. When set, `scribe validate` warns on missing image files. @deprecated Use `assets.dir` instead. */\n assetsDir?: string;\n /** Asset system config (`{ dir, publicPath, managedDirs }`). Supersedes `assetsDir`. See [Asset management](../../docs/assets.md). */\n assets?: AssetsConfigInput;\n /** All locales, including the default one. */\n locales: string[];\n /** Canonical source locale. Must be in `locales`. Default: `\"en\"`. */\n defaultLocale?: string;\n /** How locale markers are applied to generated URLs. Default: path-prefix without default locale. */\n localeRouting?: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Enable automatic locale fallback chains derived from locale tags — e.g. `\"pt-BR\"` is served from `\"pt\"` (before the default locale) when it has no translation. Default: `true`. */\n localeFallbacks?: boolean;\n translate?: ScribeTranslateDefaults;\n types: TTypes;\n}\n\n/**\n * A fully resolved Scribe config (all defaults applied, paths absolute).\n * Note: `rootDir` here is the absolute **content** root, not the project root.\n */\nexport interface ScribeConfig {\n /** Absolute content root (project `rootDir` + `contentDir`). */\n rootDir: string;\n /** Absolute path to the SQLite translation store. */\n storePath: string;\n /** Absolute path to the static assets folder, when the asset system is enabled. Mirrors `assets.assetsPath` for back-compat (existing consumers read this). */\n assetsPath?: string;\n /** Resolved asset system config; `undefined` unless `assets`/`assetsDir` was set. */\n assets?: ResolvedAssetsConfig;\n locales: string[];\n defaultLocale: string;\n localeRouting: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Fallback chains derived from locale tags (`{}` when the feature is disabled). `resolveConfig` always populates this; optional so hand-built config literals can omit it. */\n localeFallbacks?: LocaleFallbacks;\n translate?: ScribeTranslateDefaults;\n types: ContentTypeConfig[];\n}\n\n/** A loaded document (EN file or stored translation). */\nexport interface ScribeDocument<TFrontmatter = Record<string, unknown>> {\n /** Slug in this document's locale (differs from `enSlug` for localized slugs). */\n slug: string;\n /** Slug of the EN (default-locale) parent. Equal to `slug` for EN documents. */\n enSlug: string;\n locale: string;\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Explicit EN frontmatter override for canonical URL path. */\n canonicalPathOverride?: string;\n frontmatter: TFrontmatter;\n content: string;\n filePath?: string;\n}\n\nexport interface LocaleIndex<TDoc = ScribeDocument> {\n bySlug: ReadonlyMap<string, TDoc>;\n byEnSlug: ReadonlyMap<string, TDoc>;\n}\n\nexport type AllDocuments<TDoc = ScribeDocument> = ReadonlyMap<string, LocaleIndex<TDoc>>;\n\n/** Result of `resolve()`: the document plus redirect/canonical routing data. */\nexport interface ResolvedDocument<TDoc = ScribeDocument> {\n document: TDoc | null;\n /** Locale actually served (differs from the requested locale on EN fallback). */\n actualLocale: string;\n /** 301 target when the slug is an alias or belongs to another locale. */\n shouldRedirectTo?: string;\n /** Locale-aware pathname when the type has `path` and a document was found. */\n canonicalPath?: string;\n}\n\n/** `{ locale, slug }` pairs for Next.js `generateStaticParams()`. */\nexport interface StaticParam {\n locale: string;\n slug: string;\n}\n\nexport interface ListOptions<TDoc = ScribeDocument> {\n /** Override the type's configured `orderBy` for this call. */\n orderBy?: OrderBy<TDoc>;\n limit?: number;\n}\n\n/** Untyped default for the `related()` field map. */\nexport type AnyRelatedMap = Record<string, ScribeDocument | ScribeDocument[] | null>;\n\n/**\n * Per-content-type runtime API.\n *\n * Reads: `list`, `get`, `resolve`. Routing: `staticParams`, `alternates`,\n * `translation`, `url`. Relations: `related`. Low-level escape hatch: `load`.\n */\nexport interface ContentTypeRuntime<\n TDoc extends ScribeDocument = ScribeDocument,\n TRelated extends Record<string, unknown> = AnyRelatedMap,\n> {\n id: string;\n config: ContentTypeConfig;\n\n /** All documents for a locale (default: the default locale), sorted by the type's `orderBy`. */\n list: (locale?: string, options?: ListOptions<TDoc>) => TDoc[];\n /** Exact slug lookup in one locale (default: the default locale). No fallback, no redirects. */\n get: (slug: string, locale?: string) => TDoc | null;\n /** Full resolution: aliases, cross-locale slug correction, EN fallback, redirects, canonical path. */\n resolve: (slug: string, locale: string) => ResolvedDocument<TDoc>;\n\n /** Every `{ locale, slug }` pair to prerender — one call in `generateStaticParams()`. */\n staticParams: (options?: { locales?: readonly string[] }) => StaticParam[];\n /** hreflang map: locale → relative path, for every locale with a translation (default locale always included). */\n alternates: (doc: TDoc) => Record<string, string>;\n /** The same document in another locale, or null when untranslated (callers typically do `?? doc`). */\n translation: (doc: TDoc, targetLocale: string) => TDoc | null;\n /** Pathname for a slug + locale from the type's `path` template. */\n url: (slug: string, locale: string) => string;\n\n /** Dereference a `field.relation()` frontmatter field into the target type's document(s). */\n related: <K extends keyof TRelated & string>(\n doc: TDoc,\n field: K,\n locale?: string,\n ) => TRelated[K];\n\n /** Low-level access to the full locale → index map. Prefer `list`/`get`/`resolve`. */\n load: () => AllDocuments<TDoc>;\n}\n\n/** Infer the document type from a content type declaration. */\nexport type InferDocFromTypeConfig<T extends ContentTypeInput<any>> = ScribeDocument<\n z.infer<T[\"schema\"]>\n>;\n\n/** Map content type id → document type from a config types tuple. */\nexport type InferDocMap<TTypes extends readonly ContentTypeInput<any>[]> = {\n [T in TTypes[number] as T[\"id\"]]: InferDocFromTypeConfig<T>;\n};\n\n/** Document map (id → ScribeDocument) from a config object type. */\nexport type ScribeDocs<C extends { types: readonly ContentTypeInput<any>[] }> = InferDocMap<\n C[\"types\"]\n>;\n\n/** Single doc type by content-type id. */\nexport type ScribeDocOf<\n C extends { types: readonly ContentTypeInput<any>[] },\n Id extends keyof ScribeDocs<C> & string,\n> = ScribeDocs<C>[Id];\n\ntype RelationBrandOf<TField> = TField extends {\n [RELATION_BRAND]: infer B extends RelationBrand<string, boolean, boolean>;\n}\n ? B\n : never;\n\n/** Top-level `field.relation()` fields of a schema, keyed by field name. */\nexport type RelationFieldsOf<TSchema extends z.ZodTypeAny> =\n TSchema extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape as [RelationBrandOf<Shape[K]>] extends [never]\n ? never\n : K]: RelationBrandOf<Shape[K]>;\n }\n : {};\n\ntype RelatedDoc<B, TDocMap> = B extends RelationBrand<\n infer TTarget,\n infer TMultiple,\n infer TOptional\n>\n ? TTarget extends keyof TDocMap\n ? TMultiple extends true\n ? Array<TDocMap[TTarget]>\n : TOptional extends true\n ? TDocMap[TTarget] | null\n : TDocMap[TTarget]\n : never\n : never;\n\n/** `related()` return types for a content type, derived from its schema's relation fields. */\nexport type RelatedMapFor<\n T extends ContentTypeInput<any>,\n TTypes extends readonly ContentTypeInput<any>[],\n> = {\n [K in keyof RelationFieldsOf<T[\"schema\"]> & string]: RelatedDoc<\n RelationFieldsOf<T[\"schema\"]>[K],\n InferDocMap<TTypes>\n >;\n};\n\n/**\n * The typed Scribe client returned by `createScribe()`.\n * Each content type id becomes a typed accessor: `scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …\n */\nexport type Scribe<TTypes extends readonly ContentTypeInput<any>[]> = {\n readonly [T in TTypes[number] as T[\"id\"]]: ContentTypeRuntime<\n InferDocFromTypeConfig<T>,\n RelatedMapFor<T, TTypes>\n >;\n} & {\n /** Sitemap entries (with hreflang alternates) for all routable types. */\n sitemap(\n options: import(\"../sitemap/types.js\").GenerateSitemapOptions,\n ): Promise<import(\"../sitemap/types.js\").SitemapEntry[]>;\n /** Asset URL helper: applies `assets.publicPath` to a root-relative web path. Escape hatch for MDX body images. */\n assets: { url(ref: string, opts?: AssetUrlOptions): string };\n /** The resolved config (defaults applied, paths absolute). */\n config: ScribeConfig;\n project: ScribeProject;\n getType: ScribeProject[\"getType\"];\n listTypes: ScribeProject[\"listTypes\"];\n listRoutableTypes: ScribeProject[\"listRoutableTypes\"];\n};\n\n/** Typed client type from a config object type (for app-side type aliases). */\nexport type ScribeClient<C extends { types: readonly ContentTypeInput<any>[] }> = Scribe<\n C[\"types\"]\n>;\n\n/** Untyped project engine (CLI, validation, studio). Prefer `createScribe()` in apps. */\nexport interface ScribeProject {\n config: ScribeConfig;\n rootDir: string;\n storePath: string;\n getType: (id: string) => ContentTypeRuntime;\n listTypes: () => ContentTypeRuntime[];\n /** Content types with a `path` template (public URLs, hreflang, sitemap). */\n listRoutableTypes: () => ContentTypeRuntime[];\n}\n\n/** Identity helper that preserves content-type id and schema inference. */\nexport function defineConfig<const TTypes extends readonly ContentTypeInput<any>[]>(\n config: ScribeConfigInput<TTypes>,\n): ScribeConfigInput<TTypes> {\n return config;\n}\n\n/** Identity helper for a single content type entry. */\nexport function defineContentType<\n const TId extends string,\n TSchema extends z.ZodTypeAny,\n>(\n config: ContentTypeInput<TSchema> & { id: TId },\n): ContentTypeInput<TSchema> & { id: TId } {\n return config;\n}\n","import type { ContentTypeConfig, LocaleRoutingConfig, ScribeConfig } from \"../core/types.js\";\n\nconst SLUG_PLACEHOLDER = \"{slug}\";\n\n/** Whether a content type has a public URL path template. */\nexport function isRoutableType(type: Pick<ContentTypeConfig, \"path\">): boolean {\n return typeof type.path === \"string\" && type.path.length > 0;\n}\n\n/** Validate path template at project init. */\nexport function assertValidPathTemplate(path: string, typeId: string): void {\n if (!path.startsWith(\"/\")) {\n throw new Error(`Content type \"${typeId}\": path must start with / (got \"${path}\")`);\n }\n const count = (path.match(/\\{slug\\}/g) ?? []).length;\n if (count !== 1) {\n throw new Error(\n `Content type \"${typeId}\": path must contain exactly one {slug} (got \"${path}\")`,\n );\n }\n}\n\n/** Segment before `{slug}` in the template, e.g. `/blog/` from `/blog/{slug}`. */\nexport function pathPrefix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(0, idx);\n}\n\n/** Segment after `{slug}` in the template, e.g. `/advanced` from `/blog/{slug}/advanced`. */\nexport function pathSuffix(template: string): string {\n const idx = template.indexOf(SLUG_PLACEHOLDER);\n if (idx === -1) throw new Error(`Invalid path template (missing {slug}): ${template}`);\n return template.slice(idx + SLUG_PLACEHOLDER.length);\n}\n\nfunction resolveDefaultLocaleRouting(): LocaleRoutingConfig {\n return { strategy: \"path-prefix\", prefixDefaultLocale: false };\n}\n\nfunction splitPathAndSearch(pathname: string): { pathname: string; search: string } {\n const q = pathname.indexOf(\"?\");\n if (q === -1) return { pathname, search: \"\" };\n return { pathname: pathname.slice(0, q), search: pathname.slice(q) };\n}\n\nexport interface UrlBuilder {\n defaultLocale: string;\n locales: readonly string[];\n localeRouting: LocaleRoutingConfig;\n /** Locales that receive a non-default locale marker in generated URLs. */\n prefixedLocales: string[];\n resolvePath: (template: string, slug: string, locale: string) => string;\n extractSlugFromResolvedPath: (template: string, resolvedPath: string) => string | null;\n /** Apply locale routing to an already-resolved pathname (e.g. canonicalPath override). */\n applyLocaleToPath: (pathname: string, locale: string) => string;\n}\n\n/** Create a locale-aware URL builder from a resolved Scribe config. */\nexport function createUrlBuilder(config: Pick<ScribeConfig, \"locales\" | \"defaultLocale\" | \"localeRouting\">): UrlBuilder {\n const localeRouting = config.localeRouting ?? resolveDefaultLocaleRouting();\n const defaultLocale = config.defaultLocale;\n const prefixedLocales =\n localeRouting.strategy === \"path-prefix\"\n ? localeRouting.prefixDefaultLocale\n ? [...config.locales]\n : config.locales.filter((locale) => locale !== defaultLocale)\n : config.locales.filter((locale) => locale !== defaultLocale);\n\n function applyLocaleToPath(pathname: string, locale: string): string {\n if (locale === defaultLocale) {\n if (localeRouting.strategy === \"path-prefix\" && localeRouting.prefixDefaultLocale) {\n return `/${defaultLocale}${pathname}`;\n }\n return pathname;\n }\n\n if (localeRouting.strategy === \"search-param\") {\n const { pathname: base, search } = splitPathAndSearch(pathname);\n const params = new URLSearchParams(search.startsWith(\"?\") ? search.slice(1) : search);\n params.set(localeRouting.param, locale);\n const qs = params.toString();\n return qs ? `${base}?${qs}` : base;\n }\n\n return `/${locale}${pathname}`;\n }\n\n function resolvePath(template: string, slug: string, locale: string): string {\n const relative = template.replace(SLUG_PLACEHOLDER, slug);\n return applyLocaleToPath(relative, locale);\n }\n\n function extractSlugFromResolvedPath(template: string, resolvedPath: string): string | null {\n let pathname = resolvedPath;\n if (localeRouting.strategy === \"search-param\") {\n pathname = splitPathAndSearch(resolvedPath).pathname;\n } else if (localeRouting.strategy === \"path-prefix\") {\n for (const locale of config.locales) {\n if (locale === defaultLocale && !localeRouting.prefixDefaultLocale) continue;\n const prefix = `/${locale}`;\n if (pathname === prefix || pathname.startsWith(`${prefix}/`)) {\n pathname = pathname.slice(prefix.length) || \"/\";\n break;\n }\n }\n }\n\n const prefix = pathPrefix(template);\n const suffix = pathSuffix(template);\n if (!pathname.startsWith(prefix)) return null;\n if (suffix && !pathname.endsWith(suffix)) return null;\n const slugEnd = suffix ? pathname.length - suffix.length : pathname.length;\n const slug = pathname.slice(prefix.length, slugEnd);\n return slug.length > 0 ? slug : null;\n }\n\n return {\n defaultLocale,\n locales: config.locales,\n localeRouting,\n prefixedLocales,\n resolvePath,\n extractSlugFromResolvedPath,\n applyLocaleToPath,\n };\n}\n\n/** Build a locale-aware pathname from a path template and slug. */\nexport function resolvePath(\n template: string,\n slug: string,\n locale: string,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const builder = createUrlBuilder({\n locales: [defaultLocale, ...(locale !== defaultLocale ? [locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.resolvePath(template, slug, locale);\n}\n\n/** Extract slug from a resolved path that matches the template. */\nexport function extractSlugFromResolvedPath(\n template: string,\n resolvedPath: string,\n localeRouting?: LocaleRoutingConfig,\n): string | null {\n const builder = createUrlBuilder({\n locales: [],\n defaultLocale: \"en\",\n localeRouting: localeRouting ?? resolveDefaultLocaleRouting(),\n });\n return builder.extractSlugFromResolvedPath(template, resolvedPath);\n}\n","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\n LocaleFallbacks,\n ResolvedAssetsConfig,\n ScribeConfig,\n ScribeConfigInput,\n} from \"../core/types.js\";\nimport { assertValidPathTemplate } from \"../i18n/build-url.js\";\n\nconst RESOLVED = Symbol.for(\"@genlook/scribe/resolvedConfig\");\n\n/** Whether a config object has already been normalized by `resolveConfig()`. */\nexport function isResolvedConfig(config: unknown): config is ScribeConfig {\n return (\n typeof config === \"object\" &&\n config !== null &&\n (config as Record<symbol, unknown>)[RESOLVED] === true\n );\n}\n\n/**\n * Normalize a user config: apply defaults, make paths absolute, and validate\n * invariants. Every entry point (`createScribe`, the CLI's `loadConfigSync`)\n * must pass configs through here so runtimes never see partial configs.\n *\n * @param baseDir directory used to resolve a relative `rootDir`\n * (the config file's directory for the CLI; `process.cwd()` otherwise).\n */\nexport function resolveConfig(\n input: ScribeConfigInput<any> | ScribeConfig,\n baseDir?: string,\n): ScribeConfig {\n if (isResolvedConfig(input)) return input;\n const raw = input as ScribeConfigInput;\n\n if (!raw.rootDir) {\n throw new Error(\"scribe config: rootDir is required\");\n }\n if (!raw.locales || raw.locales.length === 0) {\n throw new Error(\"scribe config: locales must be a non-empty array\");\n }\n const defaultLocale = raw.defaultLocale ?? \"en\";\n if (!raw.locales.includes(defaultLocale)) {\n throw new Error(\n `scribe config: defaultLocale \"${defaultLocale}\" is not in locales [${raw.locales.join(\", \")}]`,\n );\n }\n\n const localeRouting = raw.localeRouting ?? {\n strategy: \"path-prefix\" as const,\n prefixDefaultLocale: false,\n };\n if (localeRouting.strategy === \"search-param\" && !localeRouting.param) {\n throw new Error('scribe config: localeRouting search-param requires a \"param\" name');\n }\n\n const localeFallbacks =\n raw.localeFallbacks === false\n ? {}\n : deriveLocaleFallbacks(raw.locales, defaultLocale);\n\n const projectRoot = path.resolve(baseDir ?? process.cwd(), raw.rootDir);\n const contentRoot = path.resolve(projectRoot, raw.contentDir ?? \"content\");\n const storePath = path.resolve(projectRoot, raw.store ?? \".scribe/store.sqlite\");\n\n // The asset system is opt-in: enabled only when `assets` or the deprecated\n // `assetsDir` is set. When enabled, `assets` wins over `assetsDir`, and dir /\n // publicPath / managedDirs default to \"public\" / \"/\" / []. Left off entirely,\n // both `assetsPath` and `assets` stay undefined so no asset validation runs.\n let assetsPath: string | undefined;\n let assets: ResolvedAssetsConfig | undefined;\n if (raw.assets !== undefined || raw.assetsDir !== undefined) {\n const dir = raw.assets?.dir ?? raw.assetsDir ?? \"public\";\n const publicPath = raw.assets?.publicPath ?? \"/\";\n const managedDirs = raw.assets?.managedDirs ?? [];\n assetsPath = path.resolve(projectRoot, dir);\n assets = { assetsPath, publicPath, managedDirs };\n }\n\n const seenIds = new Set<string>();\n const types: ContentTypeConfig[] = raw.types.map((type) => {\n if (seenIds.has(type.id)) {\n throw new Error(`scribe config: duplicate content type id \"${type.id}\"`);\n }\n seenIds.add(type.id);\n if (type.path) {\n assertValidPathTemplate(type.path, type.id);\n }\n return {\n ...type,\n contentDir: type.contentDir ?? type.id,\n label: type.label ?? type.id.charAt(0).toUpperCase() + type.id.slice(1),\n slugStrategy: type.slugStrategy ?? \"fixed\",\n indexFallback: type.indexFallback ?? (type.path ? \"en\" : \"none\"),\n // `body` defaults to true (fully backwards compatible). A resolved type\n // always carries an explicit boolean so consumers read one source of truth.\n body: type.body ?? true,\n };\n });\n\n const config: ScribeConfig = {\n rootDir: contentRoot,\n storePath,\n assetsPath,\n assets,\n locales: [...raw.locales],\n defaultLocale,\n localeRouting,\n localePresets: raw.localePresets,\n localeFallbacks,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n\n/**\n * Derive fallback chains from locale tags: each locale falls back to its\n * successively shorter tag prefixes (longest first) that are themselves\n * configured, e.g. `\"zh-Hant-TW\"` → `[\"zh-Hant\", \"zh\"]`. Prefix matching is\n * case-insensitive (BCP-47 casing varies); chains store the configured\n * spelling. The default locale is excluded — it stays the implicit final\n * fallback so `indexFallback: \"none\"` keeps its meaning.\n */\nfunction deriveLocaleFallbacks(\n locales: readonly string[],\n defaultLocale: string,\n): LocaleFallbacks {\n const byLowercase = new Map(locales.map((l) => [l.toLowerCase(), l]));\n const fallbacks: LocaleFallbacks = {};\n for (const locale of locales) {\n const subtags = locale.split(\"-\");\n if (subtags.length < 2) continue;\n const chain: string[] = [];\n for (let end = subtags.length - 1; end >= 1; end--) {\n const prefix = byLowercase.get(subtags.slice(0, end).join(\"-\").toLowerCase());\n if (prefix && prefix !== locale && prefix !== defaultLocale) {\n chain.push(prefix);\n }\n }\n if (chain.length > 0) {\n fallbacks[locale] = chain;\n }\n }\n return fallbacks;\n}\n","import { z } from \"zod\";\nimport { createUrlBuilder, pathPrefix, pathSuffix } from \"../i18n/build-url.js\";\nimport type { ContentTypeConfig, LocaleRoutingConfig, ScribeDocument } from \"./types.js\";\n\nexport const SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n\nexport const slugPatternSchema = z\n .string()\n .regex(SLUG_PATTERN, \"slug must be lowercase-kebab-case\");\n\nexport const isoDateSchema = z\n .string()\n .regex(/^\\d{4}-\\d{2}-\\d{2}(T[\\d:.Z+-]*)?$/, \"Use ISO date YYYY-MM-DD or full ISO 8601\");\n\nconst canonicalPathSchema = z.string().regex(/^\\//, \"canonicalPath must start with /\");\n\nexport interface BuiltinEnFields {\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Set only when explicitly provided in EN frontmatter. */\n canonicalPathOverride?: string;\n /**\n * Reserved `vars` map: an optional `Record<string, string>` any entry may\n * carry WITHOUT declaring it in the type schema. Read by `${{var:key}}` inline\n * tokens; never translated (it is not a schema field). Kept verbatim (even\n * when malformed) so `scribe validate` can flag a non-string-record shape.\n */\n vars?: Record<string, string>;\n}\n\nexport interface BuiltinParseIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\nconst LOCALE_BUILTIN_KEYS: Array<[string, string]> = [\n [\"publishedAt\", \"publishedAt is EN-only; inherited from the EN parent at load time\"],\n [\"updatedAt\", \"updatedAt is EN-only; inherited from the EN parent at load time\"],\n [\"noindex\", \"noindex is EN-only; inherited from the EN parent at load time\"],\n [\"canonicalPath\", \"canonicalPath is EN-only; inherited from the EN parent at load time\"],\n [\"aliases\", \"aliases is EN-only; remove from locale translation\"],\n [\"redirect_to\", \"redirect_to is EN-only; remove from locale translation\"],\n [\"translationOf\", \"translationOf is internal; remove from locale translation\"],\n [\"enSlug\", \"enSlug is internal; remove from locale translation\"],\n];\n\nconst DEPRECATED_REDIRECT_FIELDS: Array<[string, string]> = [\n [\n \"aliases\",\n \"aliases frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n [\n \"redirect_to\",\n \"redirect_to frontmatter is removed — add redirects to content/<type>/_redirects.json instead\",\n ],\n];\n\n/** Extract built-in EN frontmatter (dates, SEO) before Zod validation. */\nexport function extractBuiltinEnFields(\n data: Record<string, unknown>,\n _pathTemplate: string | undefined,\n _enSlug: string,\n _defaultLocale: string,\n): {\n builtin: BuiltinEnFields;\n rest: Record<string, unknown>;\n issues: BuiltinParseIssue[];\n} {\n const issues: BuiltinParseIssue[] = [];\n const rest = { ...data };\n\n for (const [field, message] of DEPRECATED_REDIRECT_FIELDS) {\n if (rest[field] !== undefined) {\n issues.push({ field, message, level: \"error\" });\n delete rest[field];\n }\n }\n\n let publishedAt: string | undefined;\n if (rest.publishedAt !== undefined && rest.publishedAt !== null && rest.publishedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.publishedAt);\n if (parsed.success) {\n publishedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"publishedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.publishedAt;\n }\n\n let updatedAt: string | undefined;\n if (rest.updatedAt !== undefined && rest.updatedAt !== null && rest.updatedAt !== \"\") {\n const parsed = isoDateSchema.safeParse(rest.updatedAt);\n if (parsed.success) {\n updatedAt = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"updatedAt\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.updatedAt;\n } else if (publishedAt) {\n updatedAt = publishedAt;\n }\n\n let noindex = false;\n if (rest.noindex !== undefined && rest.noindex !== null && rest.noindex !== \"\") {\n if (typeof rest.noindex === \"boolean\") {\n noindex = rest.noindex;\n } else {\n issues.push({ field: \"noindex\", message: \"noindex must be a boolean\", level: \"error\" });\n }\n delete rest.noindex;\n }\n\n let canonicalPathOverride: string | undefined;\n if (rest.canonicalPath !== undefined && rest.canonicalPath !== null && rest.canonicalPath !== \"\") {\n const parsed = canonicalPathSchema.safeParse(rest.canonicalPath);\n if (parsed.success) {\n canonicalPathOverride = parsed.data;\n } else {\n for (const issue of parsed.error.issues) {\n issues.push({ field: \"canonicalPath\", message: issue.message, level: \"error\" });\n }\n }\n delete rest.canonicalPath;\n }\n\n for (const internalKey of [\"translationOf\", \"enSlug\"] as const) {\n if (rest[internalKey] !== undefined) {\n issues.push({\n field: internalKey,\n message: `${internalKey} is managed internally by Scribe; remove from frontmatter`,\n level: \"warning\",\n });\n delete rest[internalKey];\n }\n }\n\n // Reserved `vars` map: pulled out before Zod validation so a schema (strict or\n // not) never rejects or strips it. Kept verbatim — even a malformed value —\n // so the inline-token validation pass can report a bad shape.\n let vars: Record<string, string> | undefined;\n if (rest.vars !== undefined) {\n vars = rest.vars as Record<string, string>;\n delete rest.vars;\n }\n\n return {\n builtin: {\n publishedAt,\n updatedAt,\n noindex,\n canonicalPathOverride,\n vars,\n },\n rest,\n issues,\n };\n}\n\n/** Reject built-in keys on locale translation frontmatter. */\nexport function validateLocaleBuiltinFields(data: Record<string, unknown>): BuiltinParseIssue[] {\n const issues: BuiltinParseIssue[] = [];\n for (const [key, message] of LOCALE_BUILTIN_KEYS) {\n if (data[key] !== undefined) {\n issues.push({ field: key, message, level: \"error\" });\n }\n }\n return issues;\n}\n\n/** ISO date for sitemap lastmod from updatedAt or publishedAt. */\nexport function documentLastModified(doc: {\n updatedAt?: string;\n publishedAt?: string;\n}): string | undefined {\n const raw = doc.updatedAt ?? doc.publishedAt;\n if (!raw) return undefined;\n const date = new Date(raw);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\n/** Locale-aware pathname for a document. */\nexport function resolveCanonicalPathname(\n type: Pick<ContentTypeConfig, \"path\">,\n doc: Pick<ScribeDocument, \"slug\" | \"locale\" | \"canonicalPathOverride\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): string {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, ...(doc.locale !== defaultLocale ? [doc.locale] : [])],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n if (doc.canonicalPathOverride) {\n return urlBuilder.applyLocaleToPath(doc.canonicalPathOverride, doc.locale);\n }\n if (!type.path) return `/${doc.slug}`;\n return urlBuilder.resolvePath(type.path, doc.slug, doc.locale);\n}\n\n/** Hydrate locale frontmatter with EN-only built-in fields at load time. */\nexport function mergeBuiltinsIntoFrontmatter(\n frontmatter: Record<string, unknown>,\n doc: Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\" | \"slug\" | \"locale\"\n > & { vars?: Record<string, string> },\n type: Pick<ContentTypeConfig, \"path\">,\n defaultLocale: string,\n localeRouting?: LocaleRoutingConfig,\n): Record<string, unknown> {\n const out = { ...frontmatter };\n if (doc.publishedAt !== undefined) out.publishedAt = doc.publishedAt;\n if (doc.updatedAt !== undefined) out.updatedAt = doc.updatedAt;\n out.noindex = doc.noindex;\n out.canonicalPath = resolveCanonicalPathname(type, doc, defaultLocale, localeRouting);\n // The reserved `vars` map rides only on EN documents (its single source of\n // truth); locale documents read it from their EN parent at token-fill time.\n if (doc.vars !== undefined) out.vars = doc.vars;\n return out;\n}\n\nexport function seoFieldsFromEn(enDoc: ScribeDocument): Pick<\n ScribeDocument,\n \"publishedAt\" | \"updatedAt\" | \"noindex\" | \"canonicalPathOverride\"\n> {\n return {\n publishedAt: enDoc.publishedAt,\n updatedAt: enDoc.updatedAt,\n noindex: enDoc.noindex,\n canonicalPathOverride: enDoc.canonicalPathOverride,\n };\n}\n\nexport { pathPrefix, pathSuffix };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\n\nconst SCHEMA_VERSION = 5;\n\nconst MIGRATIONS: string[] = [\n `CREATE TABLE IF NOT EXISTS meta (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n )`,\n `CREATE TABLE IF NOT EXISTS translations (\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n slug TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n translated_at TEXT NOT NULL,\n model TEXT NOT NULL,\n PRIMARY KEY (content_type, en_slug, locale)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_translations_type_locale\n ON translations(content_type, locale)`,\n `CREATE TABLE IF NOT EXISTS slug_aliases (\n content_type TEXT NOT NULL,\n canonical_en_slug TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n created_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_slug_aliases_canonical\n ON slug_aliases(content_type, canonical_en_slug)`,\n `CREATE TABLE IF NOT EXISTS alias_locale_slugs (\n content_type TEXT NOT NULL,\n alias_en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n locale_slug TEXT NOT NULL,\n captured_at TEXT NOT NULL,\n PRIMARY KEY (content_type, alias_en_slug, locale)\n )`,\n `CREATE TABLE IF NOT EXISTS en_snapshots (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n frontmatter_json TEXT NOT NULL,\n body TEXT NOT NULL,\n created_at TEXT NOT NULL,\n UNIQUE (content_type, en_slug, en_hash)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_en_snapshots_lookup\n ON en_snapshots(content_type, en_slug, created_at DESC)`,\n `CREATE TABLE IF NOT EXISTS translation_batch_jobs (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n job_name TEXT NOT NULL UNIQUE,\n model TEXT NOT NULL,\n display_model TEXT NOT NULL,\n created_at TEXT NOT NULL,\n state TEXT NOT NULL,\n completed_at TEXT\n )`,\n `CREATE TABLE IF NOT EXISTS translation_batch_items (\n job_id INTEGER NOT NULL,\n request_index INTEGER NOT NULL,\n content_type TEXT NOT NULL,\n en_slug TEXT NOT NULL,\n locale TEXT NOT NULL,\n en_hash TEXT NOT NULL,\n snapshot_id INTEGER NOT NULL,\n status TEXT NOT NULL,\n error TEXT,\n PRIMARY KEY (job_id, request_index)\n )`,\n `CREATE INDEX IF NOT EXISTS idx_batch_items_status\n ON translation_batch_items(status)`,\n];\n\nexport type SqliteMode = \"readonly\" | \"readwrite\";\n\n/** Absolute path to the SQLite translation store (precomputed by `resolveConfig`). */\nexport function resolveStorePath(config: ScribeConfig): string {\n return config.storePath;\n}\n\n/** Open the SQLite translation store (creates schema if missing). */\nexport function openStore(config: ScribeConfig, mode: SqliteMode = \"readwrite\"): Database.Database {\n const storePath = resolveStorePath(config);\n if (mode === \"readwrite\") {\n fs.mkdirSync(path.dirname(storePath), { recursive: true });\n }\n const db = new Database(storePath, { readonly: mode === \"readonly\" });\n if (mode === \"readwrite\") {\n migrate(db);\n }\n return db;\n}\n\nfunction addColumnIfMissing(\n db: Database.Database,\n table: string,\n column: string,\n ddlType: string,\n): void {\n const columns = db.prepare(`PRAGMA table_info(${table})`).all() as Array<{ name: string }>;\n if (!columns.some((c) => c.name === column)) {\n db.exec(`ALTER TABLE ${table} ADD COLUMN ${column} ${ddlType}`);\n }\n}\n\nfunction readSchemaVersion(db: Database.Database): number {\n const metaTable = db\n .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'meta'`)\n .get();\n if (!metaTable) return 0;\n const row = db.prepare(`SELECT value FROM meta WHERE key = 'schema_version'`).get() as\n | { value: string }\n | undefined;\n return row ? Number.parseInt(row.value, 10) || 0 : 0;\n}\n\nfunction migrate(db: Database.Database): void {\n const previousVersion = readSchemaVersion(db);\n\n for (const sql of MIGRATIONS) {\n db.exec(sql);\n }\n\n if (previousVersion < 4) {\n db.exec(`DROP TABLE IF EXISTS revisions`);\n }\n\n addColumnIfMissing(db, \"translations\", \"snapshot_id\", \"INTEGER\");\n\n db.prepare(\n `INSERT INTO meta(key, value) VALUES('schema_version', ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value`,\n ).run(String(SCHEMA_VERSION));\n}\n\nexport function closeStore(db: Database.Database): void {\n db.close();\n}\n","import type Database from \"better-sqlite3\";\n\nexport interface TranslationRow {\n content_type: string;\n en_slug: string;\n locale: string;\n slug: string;\n frontmatter_json: string;\n body: string;\n en_hash: string;\n translated_at: string;\n model: string;\n snapshot_id: number | null;\n}\n\nexport interface TranslationInput {\n contentType: string;\n enSlug: string;\n locale: string;\n slug: string;\n frontmatter: Record<string, unknown>;\n body: string;\n enHash: string;\n translatedAt: string;\n model: string;\n snapshotId: number;\n}\n\nexport interface EnSnapshotInput {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n createdAt: string;\n}\n\nexport interface EnSnapshotRow {\n id: number;\n content_type: string;\n en_slug: string;\n en_hash: string;\n frontmatter_json: string;\n body: string;\n created_at: string;\n}\n\nexport interface EnSnapshotWithLocales extends EnSnapshotRow {\n locales: string;\n}\n\nexport function getOrCreateEnSnapshot(db: Database.Database, input: EnSnapshotInput): number {\n db.prepare(\n `INSERT OR IGNORE INTO en_snapshots (\n content_type, en_slug, en_hash, frontmatter_json, body, created_at\n ) VALUES (?, ?, ?, ?, ?, ?)`,\n ).run(\n input.contentType,\n input.enSlug,\n input.enHash,\n JSON.stringify(input.frontmatter),\n input.body,\n input.createdAt,\n );\n\n const row = db\n .prepare(\n `SELECT id FROM en_snapshots\n WHERE content_type = ? AND en_slug = ? AND en_hash = ?`,\n )\n .get(input.contentType, input.enSlug, input.enHash) as { id: number };\n\n return row.id;\n}\n\nexport function getEnSnapshot(\n db: Database.Database,\n snapshotId: number,\n): EnSnapshotRow | undefined {\n return db\n .prepare(`SELECT * FROM en_snapshots WHERE id = ?`)\n .get(snapshotId) as EnSnapshotRow | undefined;\n}\n\nexport function listEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): EnSnapshotWithLocales[] {\n return db\n .prepare(\n `SELECT s.*, GROUP_CONCAT(t.locale) AS locales\n FROM en_snapshots s\n LEFT JOIN translations t ON t.snapshot_id = s.id\n WHERE s.content_type = ? AND s.en_slug = ?\n GROUP BY s.id\n ORDER BY s.created_at DESC, s.id DESC`,\n )\n .all(contentType, enSlug) as EnSnapshotWithLocales[];\n}\n\nexport function upsertTranslation(db: Database.Database, input: TranslationInput): void {\n db.prepare(\n `INSERT INTO translations (\n content_type, en_slug, locale, slug, frontmatter_json, body, en_hash, translated_at, model, snapshot_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(content_type, en_slug, locale) DO UPDATE SET\n slug = excluded.slug,\n frontmatter_json = excluded.frontmatter_json,\n body = excluded.body,\n en_hash = excluded.en_hash,\n translated_at = excluded.translated_at,\n model = excluded.model,\n snapshot_id = excluded.snapshot_id`,\n ).run(\n input.contentType,\n input.enSlug,\n input.locale,\n input.slug,\n JSON.stringify(input.frontmatter),\n input.body,\n input.enHash,\n input.translatedAt,\n input.model,\n input.snapshotId,\n );\n}\n\nexport function getTranslation(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n locale: string,\n): TranslationRow | undefined {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? AND locale = ?`,\n )\n .get(contentType, enSlug, locale) as TranslationRow | undefined;\n}\n\nexport function listTranslationsForType(\n db: Database.Database,\n contentType: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? ORDER BY en_slug, locale`)\n .all(contentType) as TranslationRow[];\n}\n\nexport function listTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): TranslationRow[] {\n return db\n .prepare(\n `SELECT * FROM translations WHERE content_type = ? AND en_slug = ? ORDER BY locale`,\n )\n .all(contentType, enSlug) as TranslationRow[];\n}\n\nexport function listTranslationsForLocale(\n db: Database.Database,\n contentType: string,\n locale: string,\n): TranslationRow[] {\n return db\n .prepare(`SELECT * FROM translations WHERE content_type = ? AND locale = ? ORDER BY en_slug`)\n .all(contentType, locale) as TranslationRow[];\n}\n\nexport function bulkLoadTranslations(db: Database.Database): TranslationRow[] {\n return db.prepare(`SELECT * FROM translations ORDER BY content_type, en_slug, locale`).all() as TranslationRow[];\n}\n\nexport function countTranslations(db: Database.Database): number {\n const row = db.prepare(`SELECT COUNT(*) as count FROM translations`).get() as { count: number };\n return row.count;\n}\n\nexport function countTranslationsByLocale(\n db: Database.Database,\n): Array<{ locale: string; count: number }> {\n return db\n .prepare(\n `SELECT locale, COUNT(*) as count FROM translations GROUP BY locale ORDER BY locale`,\n )\n .all() as Array<{ locale: string; count: number }>;\n}\n\nexport function latestTranslationAtByLocale(\n db: Database.Database,\n): Array<{ locale: string; latest: string }> {\n return db\n .prepare(\n `SELECT locale, MAX(translated_at) as latest FROM translations GROUP BY locale`,\n )\n .all() as Array<{ locale: string; latest: string }>;\n}\n\n/** Count translation rows for a single EN document (across every locale). */\nexport function countTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM translations WHERE content_type = ? AND en_slug = ?`,\n )\n .get(contentType, enSlug) as { count: number };\n return row.count;\n}\n\n/** Count EN snapshot rows for a single EN document. */\nexport function countEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM en_snapshots WHERE content_type = ? AND en_slug = ?`,\n )\n .get(contentType, enSlug) as { count: number };\n return row.count;\n}\n\n/** Delete every translation row for an EN document. Returns the number removed. */\nexport function deleteTranslationsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const info = db\n .prepare(`DELETE FROM translations WHERE content_type = ? AND en_slug = ?`)\n .run(contentType, enSlug);\n return info.changes;\n}\n\n/** Delete every EN snapshot row for an EN document. Returns the number removed. */\nexport function deleteEnSnapshotsForEnSlug(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n): number {\n const info = db\n .prepare(`DELETE FROM en_snapshots WHERE content_type = ? AND en_slug = ?`)\n .run(contentType, enSlug);\n return info.changes;\n}\n\nexport function countStaleTranslations(\n db: Database.Database,\n contentType: string,\n enSlug: string,\n currentEnHash: string,\n): number {\n const row = db\n .prepare(\n `SELECT COUNT(*) as count FROM translations\n WHERE content_type = ? AND en_slug = ? AND en_hash != ?`,\n )\n .get(contentType, enSlug, currentEnHash) as { count: number };\n return row.count;\n}\n","/** Detect Gemini returning JSON-style `\\n` escapes as literal characters in MDX bodies. */\nfunction needsMdxEscapeNormalization(body: string): boolean {\n return /\\\\n[ \\t/>]|<[\\w.-][^>]*\\\\n/.test(body);\n}\n\n/**\n * Gemini sometimes returns MDX body with JSON-style escape sequences as literal\n * characters (e.g. `\\n` instead of a newline), which breaks MDX parsing.\n */\nexport function normalizeTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n if (!needsMdxEscapeNormalization(body)) {\n return { body, adjusted: false };\n }\n\n const normalized = body\n .replace(/\\\\r\\\\n/g, \"\\n\")\n .replace(/\\\\n/g, \"\\n\")\n .replace(/\\\\t/g, \"\\t\")\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, \"\\\\\");\n\n return { body: normalized, adjusted: normalized !== body };\n}\n","/**\n * Fix JSX opening-tag attributes whose double-quoted values contain raw `\"` characters\n * (e.g. Hebrew gereshayim in דוא\"ל), which break MDX parsing.\n */\nexport function sanitizeMdxJsxAttributeQuotes(body: string): {\n body: string;\n adjusted: boolean;\n} {\n let adjusted = false;\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n if (body[i] !== \"<\" || !/[\\w.]/.test(body[i + 1] ?? \"\")) {\n out += body[i];\n i += 1;\n continue;\n }\n\n const tagStart = i;\n i += 1;\n while (i < body.length && /[\\w.-]/.test(body[i] ?? \"\")) i += 1;\n const tagName = body.slice(tagStart + 1, i);\n\n let tagOut = `<${tagName}`;\n let tagAdjusted = false;\n\n while (i < body.length && body[i] !== \">\" && body[i] !== \"/\") {\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) {\n tagOut += body[i];\n i += 1;\n }\n if (i >= body.length || body[i] === \">\" || body[i] === \"/\") break;\n\n const attrStart = i;\n while (i < body.length && /[\\w:.-]/.test(body[i] ?? \"\")) i += 1;\n const attrName = body.slice(attrStart, i);\n // Not an attribute name (e.g. `<locale,` in prose or a code fence):\n // this is not a sanitizable tag — bail and copy the text through.\n if (!attrName) break;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n if (body[i] !== \"=\") {\n tagOut += body.slice(attrStart, i);\n continue;\n }\n\n tagOut += body.slice(attrStart, i);\n tagOut += \"=\";\n i += 1;\n // Preserve any whitespace between `=` and the value so that inputs we do\n // not rewrite are copied through byte-for-byte.\n const wsStart = i;\n while (i < body.length && /\\s/.test(body[i] ?? \"\")) i += 1;\n tagOut += body.slice(wsStart, i);\n\n const quote = body[i];\n if (quote !== '\"' && quote !== \"'\") {\n // Unquoted or expression value (`href={x}`) — nothing to sanitize;\n // bail so the scan keeps making progress.\n break;\n }\n\n if (quote === \"'\") {\n const valStart = i + 1;\n i += 1;\n while (i < body.length) {\n if (body[i] === \"\\\\\") {\n i += 2;\n continue;\n }\n if (body[i] === \"'\") break;\n i += 1;\n }\n tagOut += body.slice(valStart - 1, i + 1);\n i += 1;\n continue;\n }\n\n const valStart = i + 1;\n i += 1;\n\n let closeIdx = -1;\n for (let scan = valStart; scan < body.length; scan += 1) {\n if (body[scan] !== '\"') continue;\n let j = scan + 1;\n while (j < body.length && /\\s/.test(body[j] ?? \"\")) j += 1;\n if (\n j < body.length &&\n (body[j] === \">\" || body[j] === \"/\" || /[a-zA-Z]/.test(body[j] ?? \"\"))\n ) {\n closeIdx = scan;\n break;\n }\n }\n\n if (closeIdx === -1) {\n tagOut += body.slice(valStart - 1, i);\n break;\n }\n\n const value = body.slice(valStart, closeIdx);\n const hasInternalQuote = value.includes('\"');\n\n if (hasInternalQuote) {\n const escaped = value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\");\n tagOut += `'${escaped}'`;\n tagAdjusted = true;\n } else {\n tagOut += `\"${value}\"`;\n }\n\n i = closeIdx + 1;\n }\n\n if (tagAdjusted) adjusted = true;\n tagOut += body[i] ?? \"\";\n out += tagOut;\n i += 1;\n }\n\n return { body: out, adjusted };\n}\n","import remarkMdx from \"remark-mdx\";\nimport remarkParse from \"remark-parse\";\nimport { unified } from \"unified\";\nimport { normalizeTranslatedMdxBody } from \"./normalize-mdx-body.js\";\nimport { sanitizeMdxJsxAttributeQuotes } from \"./sanitize-mdx-jsx.js\";\n\nconst parser = unified().use(remarkParse).use(remarkMdx);\n\nexport function prepareTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const normalized = normalizeTranslatedMdxBody(body);\n const sanitized = sanitizeMdxJsxAttributeQuotes(normalized.body);\n return {\n body: sanitized.body,\n adjusted: normalized.adjusted || sanitized.adjusted,\n };\n}\n\nexport function validateMdxBody(body: string): { ok: true } | { ok: false; error: string } {\n try {\n parser.parse(body);\n return { ok: true };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { ok: false, error: message };\n }\n}\n\n/** Normalize, sanitize, and parse-check translated MDX before persistence. */\nexport function assertValidTranslatedMdxBody(body: string): {\n body: string;\n adjusted: boolean;\n} {\n const prepared = prepareTranslatedMdxBody(body);\n const validated = validateMdxBody(prepared.body);\n if (!validated.ok) {\n throw new Error(`MDX validation failed: ${validated.error}`);\n }\n return prepared;\n}\n","import type { SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ResolvedAssetsConfig, ScribeDocument } from \"../core/types.js\";\n\n/**\n * Join `publicPath` in front of a root-relative web path, avoiding double\n * slashes. Handles the `\"/\"` identity case, absolute origins\n * (`https://cdn.example.com/`), and path prefixes (`/static/`).\n */\nexport function joinPublicPath(publicPath: string, webPath: string): string {\n if (publicPath === \"\" || publicPath === \"/\") return webPath;\n const suffix = webPath.startsWith(\"/\") ? webPath : `/${webPath}`;\n return publicPath.replace(/\\/+$/, \"\") + suffix;\n}\n\nfunction materializeTemplate(template: string, enSlug: string): string {\n return template.split(\"{slug}\").join(enSlug);\n}\n\n/**\n * Navigate to each concrete location of an asset field path (arrays at `*`\n * segments) and replace the leaf via `transform`. A `template`-backed field\n * whose value is absent is materialized at the leaf when the immediate parent\n * container exists; a top-level absent leaf is set directly on the frontmatter.\n */\nfunction setAssetAtPath(\n container: Record<string, unknown>,\n path: string[],\n transform: (current: string | undefined) => string | undefined,\n): void {\n const [head, ...rest] = path;\n if (head === undefined) return;\n\n if (rest.length === 0) {\n const current = container[head];\n const next = transform(typeof current === \"string\" ? current : undefined);\n if (next !== undefined) container[head] = next;\n return;\n }\n\n if (rest[0] === \"*\") {\n const arr = container[head];\n if (!Array.isArray(arr)) return;\n for (const item of arr) {\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n setAssetAtPath(item as Record<string, unknown>, rest.slice(1), transform);\n }\n }\n return;\n }\n\n const child = container[head];\n if (child && typeof child === \"object\" && !Array.isArray(child)) {\n setAssetAtPath(child as Record<string, unknown>, rest, transform);\n }\n}\n\n/**\n * Resolve declared asset fields on a freshly-built document's frontmatter,\n * in place: materialize templated paths (`{slug}` → EN slug) and prefix\n * `assets.publicPath`. Runs after `mergeStructuralOntoLocale`, so locale\n * documents resolve from the merged EN source values.\n */\nexport function resolveDocumentAssets(\n doc: ScribeDocument,\n assetFields: SchemaFieldMeta[],\n assets: ResolvedAssetsConfig,\n): void {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n for (const f of assetFields) {\n setAssetAtPath(frontmatter, f.path, (current) => {\n let value = current;\n if (value === undefined) {\n if (!f.assetTemplate) return undefined;\n value = materializeTemplate(f.assetTemplate, doc.enSlug);\n }\n return joinPublicPath(assets.publicPath, value);\n });\n }\n}\n","/**\n * Inline tokens: `${{...}}` markers embedded in MDX bodies. Four kinds — static\n * literals, relation URLs/slugs, asset URLs, and per-document vars. See\n * `docs/inline-tokens.md`.\n *\n * This module is the shared, dependency-light heart of the feature: a tokenizer\n * that turns a raw body into a `placeholderBody` (tokens swapped for inert\n * `%%n%%` markers) plus the parsed token list, and the fill/mask helpers used by\n * the loader, translator, validator, and studio.\n *\n * Why `%%n%%` and not `{{n}}`: `{{...}}` is a JSX expression to remark-mdx and\n * would break MDX validation of stored translated bodies. `%%n%%` is inert text.\n */\n\n/** Opening delimiter of an inline token. */\nconst TOKEN_OPEN = \"${{\";\n/** Escape sequence: `$\\{{` renders as a literal `${{` and is never a token. */\nconst ESCAPE_SEQUENCE = \"$\\\\{{\";\nconst ESCAPE_RESULT = \"${{\";\n\nexport type InlineTokenKind = \"static\" | \"relation\" | \"asset\" | \"var\";\n\nexport interface StaticInlineToken {\n kind: \"static\";\n /** Verbatim literal (decoded from the token's JSON string). */\n text: string;\n /** The full `${{...}}` source span. */\n raw: string;\n}\n\nexport interface RelationInlineToken {\n kind: \"relation\";\n targetTypeId: string;\n enSlug: string;\n /** `\"href\"` resolves to a link path; `\"slug\"` resolves to the EN slug. */\n mode: \"href\" | \"slug\";\n raw: string;\n}\n\nexport interface AssetInlineToken {\n kind: \"asset\";\n /** Root-relative web path, e.g. `/web/path.webp`. */\n webPath: string;\n raw: string;\n}\n\nexport interface VarInlineToken {\n kind: \"var\";\n key: string;\n raw: string;\n}\n\nexport type InlineToken =\n | StaticInlineToken\n | RelationInlineToken\n | AssetInlineToken\n | VarInlineToken;\n\n/** A `${{...}}` span that failed to parse. Reported by validation, left as-is. */\nexport interface MalformedInlineToken {\n raw: string;\n reason: string;\n /** Byte offset of the token's `$` in the source body. */\n index: number;\n}\n\nexport interface ExtractInlineTokensResult {\n /** Body with each well-formed token replaced by `%%n%%` (1-based). */\n placeholderBody: string;\n /** Parsed well-formed tokens, in order of appearance. */\n tokens: InlineToken[];\n /** Spans that look like tokens but failed to parse. */\n malformed: MalformedInlineToken[];\n}\n\n/** The inert marker for the n-th (1-based) extracted token. */\nexport function placeholderMarker(n: number): string {\n return `%%${n}%%`;\n}\n\n/**\n * Find the index of the closing `}}` of a token whose content starts at\n * `start`. JSON-string aware so a static literal like `${{static:\"a}}b\"}}`\n * terminates at the correct `}}`. Returns the index of the first closing brace,\n * or -1 when the token is unterminated (also bails on a newline: tokens never\n * span lines).\n */\nfunction findTokenEnd(body: string, start: number): number {\n let i = start;\n let inString = false;\n while (i < body.length) {\n const ch = body[i]!;\n if (ch === \"\\n\") return -1;\n if (inString) {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === '\"') inString = false;\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inString = true;\n i += 1;\n continue;\n }\n if (ch === \"}\" && body[i + 1] === \"}\") return i;\n i += 1;\n }\n return -1;\n}\n\n/** Omit that distributes over a union (unlike the built-in `Omit`). */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\ntype ParseResult =\n | { ok: true; token: DistributiveOmit<InlineToken, \"raw\"> }\n | { ok: false; reason: string };\n\n/** Parse the inner content of a token (everything between `${{` and `}}`). */\nfunction parseTokenInner(inner: string): ParseResult {\n const colon = inner.indexOf(\":\");\n if (colon === -1) {\n return { ok: false, reason: `missing kind separator \":\"` };\n }\n const kind = inner.slice(0, colon);\n const rest = inner.slice(colon + 1);\n\n switch (kind) {\n case \"static\": {\n let text: unknown;\n try {\n text = JSON.parse(rest);\n } catch {\n return { ok: false, reason: `static value is not a valid JSON string` };\n }\n if (typeof text !== \"string\") {\n return { ok: false, reason: `static value must be a JSON string` };\n }\n return { ok: true, token: { kind: \"static\", text } };\n }\n case \"relation\": {\n // Slugs cannot contain \":\" so splitting is unambiguous.\n const parts = rest.split(\":\");\n if (parts.length !== 3) {\n return {\n ok: false,\n reason: `relation must be relation:<typeId>:<enSlug>:href or relation:<typeId>:<enSlug>:slug`,\n };\n }\n const [targetTypeId, enSlug, mode] = parts;\n if (!targetTypeId || !enSlug) {\n return { ok: false, reason: `relation is missing a typeId or enSlug` };\n }\n if (mode !== \"href\" && mode !== \"slug\") {\n return { ok: false, reason: `relation mode must be \"href\" or \"slug\" (got \"${mode}\")` };\n }\n return {\n ok: true,\n token: {\n kind: \"relation\",\n targetTypeId,\n enSlug,\n mode,\n },\n };\n }\n case \"asset\": {\n if (!rest.startsWith(\"/\")) {\n return { ok: false, reason: `asset path must start with \"/\" (got \"${rest}\")` };\n }\n return { ok: true, token: { kind: \"asset\", webPath: rest } };\n }\n case \"var\": {\n if (!rest) return { ok: false, reason: `var is missing a key` };\n return { ok: true, token: { kind: \"var\", key: rest } };\n }\n default:\n return { ok: false, reason: `unknown token kind \"${kind}\"` };\n }\n}\n\n/**\n * Replace every well-formed token with an inert `%%n%%` marker and return the\n * parsed token list. Malformed spans are left verbatim (validation reports them)\n * and do NOT consume a marker index. Escape sequences (`$\\{{`) are not tokens\n * and pass through untouched — so a body with zero tokens yields\n * `placeholderBody === body` byte-for-byte.\n */\nexport function extractInlineTokens(body: string): ExtractInlineTokensResult {\n const tokens: InlineToken[] = [];\n const malformed: MalformedInlineToken[] = [];\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n const open = body.indexOf(TOKEN_OPEN, i);\n if (open === -1) {\n out += body.slice(i);\n break;\n }\n out += body.slice(i, open);\n\n const contentStart = open + TOKEN_OPEN.length;\n const end = findTokenEnd(body, contentStart);\n if (end === -1) {\n // Unterminated: leave the rest verbatim; report it.\n malformed.push({\n raw: body.slice(open),\n reason: `unterminated token (missing \"}}\")`,\n index: open,\n });\n out += body.slice(open);\n break;\n }\n\n const raw = body.slice(open, end + 2);\n const inner = body.slice(contentStart, end);\n const parsed = parseTokenInner(inner);\n if (parsed.ok) {\n tokens.push({ ...parsed.token, raw } as InlineToken);\n out += placeholderMarker(tokens.length);\n } else {\n malformed.push({ raw, reason: parsed.reason, index: open });\n out += raw;\n }\n i = end + 2;\n }\n\n return { placeholderBody: out, tokens, malformed };\n}\n\n/**\n * Fill `%%n%%` markers with resolved values (1-based). A marker with no\n * corresponding value (a stale translation whose EN body lost tokens) is left\n * verbatim rather than blanked, so no meaningful text is silently dropped.\n */\nexport function fillPlaceholders(body: string, resolvedValues: string[]): string {\n return body.replace(/%%(\\d+)%%/g, (match, n: string) => {\n const idx = Number(n) - 1;\n return idx >= 0 && idx < resolvedValues.length ? resolvedValues[idx]! : match;\n });\n}\n\n/** Convert `$\\{{` escape sequences back to a literal `${{`. Render-time only. */\nexport function unescapeInlineTokens(body: string): string {\n return body.split(ESCAPE_SEQUENCE).join(ESCAPE_RESULT);\n}\n\n/**\n * Count the markers `%%1%%..%%N%%` in a body. Used by the post-receive\n * verification: each must appear exactly once in a translated body.\n */\nexport function countMarkerOccurrences(body: string, n: number): number {\n return body.split(placeholderMarker(n)).length - 1;\n}\n\n/**\n * Walk a body replacing every token span (valid OR malformed) and every escape\n * sequence via the provided callbacks. Used where the raw `${{` / `$\\{{` braces\n * must never reach a downstream MDX parser or preview renderer.\n */\nexport function replaceInlineSpans(\n body: string,\n opts: {\n token: (raw: string, inner: string) => string;\n escape: () => string;\n },\n): string {\n let out = \"\";\n let i = 0;\n while (i < body.length) {\n if (body.startsWith(ESCAPE_SEQUENCE, i)) {\n out += opts.escape();\n i += ESCAPE_SEQUENCE.length;\n continue;\n }\n if (body.startsWith(TOKEN_OPEN, i)) {\n const end = findTokenEnd(body, i + TOKEN_OPEN.length);\n if (end !== -1) {\n const raw = body.slice(i, end + 2);\n const inner = body.slice(i + TOKEN_OPEN.length, end);\n out += opts.token(raw, inner);\n i = end + 2;\n continue;\n }\n }\n out += body[i]!;\n i += 1;\n }\n return out;\n}\n\n/**\n * Neutralize inline tokens and escapes so a body can be handed to remark-mdx for\n * a structural parse check without the `${{`/`{{` braces producing false MDX\n * errors. Local to validation/preview: never used for hashing or storage.\n */\nexport function maskInlineTokensForMdx(body: string): string {\n return replaceInlineSpans(body, {\n token: () => \"inline\",\n escape: () => \"$\",\n });\n}\n","import fs from \"node:fs\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { createUrlBuilder, isRoutableType, type UrlBuilder } from \"../i18n/build-url.js\";\nimport { joinPublicPath } from \"../loader/resolve-assets.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\nimport {\n extractInlineTokens,\n fillPlaceholders,\n unescapeInlineTokens,\n type InlineToken,\n} from \"./tokens.js\";\n\n/**\n * Read-time token resolver. Maps a single inline token to its string value given\n * the EN source document's frontmatter and a target locale.\n *\n * Relations resolve to a locale-aware URL via the existing `resolvePath`\n * machinery, using the target document's *localized* slug. Localized slugs live\n * in the translation store; the resolver reads them once per store revision\n * (keyed on the store file's mtime), never through another type's loader, so\n * there is no cross-loader recursion.\n */\nexport interface InlineResolver {\n resolve(\n token: InlineToken,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n ): string;\n}\n\n/** How `:href` relation tokens resolve (see `docs/inline-tokens.md`). */\nexport type InlineLinkStyle = \"app\" | \"export\";\n\nexport interface CreateInlineResolverOptions {\n /** Default `\"app\"` — locale-free pathnames for framework routers. */\n linkStyle?: InlineLinkStyle;\n /** File extension appended to localized slugs in `\"export\"` mode. Default `.md`. */\n exportExtension?: `.${string}`;\n}\n\nfunction slugKey(typeId: string, enSlug: string, locale: string): string {\n return `${typeId}\\u0000${enSlug}\\u0000${locale}`;\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every((v) => typeof v === \"string\");\n}\n\nexport function createInlineResolver(\n config: ScribeConfig,\n options: CreateInlineResolverOptions = {},\n): InlineResolver {\n const linkStyle = options.linkStyle ?? \"app\";\n const exportExtension = options.exportExtension ?? \".md\";\n const urlBuilder: UrlBuilder = createUrlBuilder(config);\n const typeById = new Map(config.types.map((t) => [t.id, t]));\n const storePath = resolveStorePath(config);\n\n let slugCache: { mtime: number; index: Map<string, string> } | null = null;\n\n const localizedSlugIndex = (): Map<string, string> => {\n let mtime = 0;\n try {\n mtime = fs.statSync(storePath).mtimeMs;\n } catch {\n mtime = 0;\n }\n if (slugCache && slugCache.mtime === mtime) return slugCache.index;\n\n const index = new Map<string, string>();\n try {\n const db = openStore(config, \"readonly\");\n try {\n for (const row of bulkLoadTranslations(db)) {\n index.set(slugKey(row.content_type, row.en_slug, row.locale), row.slug);\n }\n } finally {\n db.close();\n }\n } catch {\n /* store missing or unreadable: fall back to EN slugs */\n }\n slugCache = { mtime, index };\n return index;\n };\n\n const localizedSlug = (typeId: string, enSlug: string, locale: string): string => {\n if (locale === config.defaultLocale) return enSlug;\n const index = localizedSlugIndex();\n const direct = index.get(slugKey(typeId, enSlug, locale));\n if (direct) return direct;\n for (const fb of config.localeFallbacks?.[locale] ?? []) {\n const hit = index.get(slugKey(typeId, enSlug, fb));\n if (hit) return hit;\n }\n return enSlug;\n };\n\n return {\n resolve(token, enFrontmatter, locale): string {\n switch (token.kind) {\n case \"static\":\n return token.text;\n\n case \"var\": {\n const vars = enFrontmatter.vars;\n if (isStringRecord(vars) && typeof vars[token.key] === \"string\") {\n return vars[token.key]!;\n }\n return \"\";\n }\n\n case \"asset\": {\n const assets = config.assets;\n return assets ? joinPublicPath(assets.publicPath, token.webPath) : token.webPath;\n }\n\n case \"relation\": {\n const type = typeById.get(token.targetTypeId);\n if (!type) return \"\";\n if (token.mode === \"slug\") return token.enSlug;\n if (!isRoutableType(type)) return \"\";\n const slug = localizedSlug(token.targetTypeId, token.enSlug, locale);\n if (linkStyle === \"export\") {\n return urlBuilder.resolvePath(type.path!, `${slug}${exportExtension}`, locale);\n }\n return type.path!.replace(\"{slug}\", slug);\n }\n }\n },\n };\n}\n\n/**\n * Substitute inline tokens in an EN body at read time: extract tokens, resolve\n * each for the default locale, fill the placeholder markers, and unescape any\n * `$\\{{` sequences. A body with no tokens is returned unchanged (aside from\n * unescaping).\n */\nexport function substituteEnInlineBody(\n rawBody: string,\n enFrontmatter: Record<string, unknown>,\n defaultLocale: string,\n resolver: InlineResolver,\n): string {\n const { placeholderBody, tokens } = extractInlineTokens(rawBody);\n if (tokens.length === 0) return unescapeInlineTokens(placeholderBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, defaultLocale));\n return unescapeInlineTokens(fillPlaceholders(placeholderBody, values));\n}\n\n/**\n * Fill a stored translated body's `%%n%%` markers at read time. Tokens are\n * extracted from the CURRENT raw EN body and resolved for the document's locale,\n * so token VALUES (relation targets, asset paths, var values) always reflect the\n * live EN source even when the translation itself is older.\n */\nexport function fillTranslatedInlineBody(\n translatedBody: string,\n enRawBody: string,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n resolver: InlineResolver,\n): string {\n const { tokens } = extractInlineTokens(enRawBody);\n if (tokens.length === 0) return unescapeInlineTokens(translatedBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, locale));\n return unescapeInlineTokens(fillPlaceholders(translatedBody, values));\n}\n","export function normalizeEnFrontmatter(data: Record<string, unknown>): Record<string, unknown> {\n const out = { ...data };\n if (!out.publishedAt && typeof out.date === \"string\") {\n out.publishedAt = out.date;\n }\n if (!out.heroImage && typeof out.image === \"string\" && out.image.startsWith(\"/\")) {\n out.heroImage = out.image;\n }\n if (!out.updatedAt && typeof out.publishedAt === \"string\") {\n out.updatedAt = out.publishedAt;\n }\n return out;\n}\n\nexport function isPublishableContentFile(name: string): boolean {\n if (!name.endsWith(\".md\") && !name.endsWith(\".mdx\")) return false;\n const first = name.charAt(0);\n return first === first.toLowerCase() && first !== \"_\";\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { z } from \"zod\";\nimport {\n extractBuiltinEnFields,\n mergeBuiltinsIntoFrontmatter,\n seoFieldsFromEn,\n} from \"../core/builtin-fields.js\";\nimport {\n listAssetFields,\n mergeStructuralOntoLocale,\n pickTranslatable,\n type SchemaFieldMeta,\n} from \"../core/introspect-schema.js\";\nimport type {\n AllDocuments,\n ContentTypeConfig,\n LocaleIndex,\n ScribeConfig,\n ScribeDocument,\n} from \"../core/types.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { listTranslationsForType } from \"../storage/translations.js\";\nimport { prepareTranslatedMdxBody } from \"../translate/validate-mdx-body.js\";\nimport {\n fillTranslatedInlineBody,\n substituteEnInlineBody,\n type InlineResolver,\n} from \"../inline/resolve-tokens.js\";\nimport { isPublishableContentFile, normalizeEnFrontmatter } from \"./normalize-en.js\";\nimport { resolveDocumentAssets } from \"./resolve-assets.js\";\n\nfunction isPostFile(name: string): boolean {\n return isPublishableContentFile(name);\n}\n\nfunction listEnFiles(contentDir: string): string[] {\n if (!fs.existsSync(contentDir)) return [];\n return fs\n .readdirSync(contentDir)\n .filter(isPostFile)\n .map((f) => path.join(contentDir, f));\n}\n\nfunction slugFromPath(filePath: string): string {\n return path.basename(filePath).replace(/\\.(md|mdx)$/, \"\");\n}\n\nexport interface ParseEnResult {\n document: ScribeDocument | null;\n issues: Array<{ field: string; message: string; level: \"error\" | \"warning\" }>;\n}\n\nexport function parseEnMdx(\n filePath: string,\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ParseEnResult {\n const raw = fs.readFileSync(filePath, \"utf8\");\n const parsed = matter(raw);\n const slug = slugFromPath(filePath);\n const normalized = normalizeEnFrontmatter(parsed.data as Record<string, unknown>);\n const { builtin, rest, issues: builtinIssues } = extractBuiltinEnFields(\n normalized,\n type.path,\n slug,\n config.defaultLocale,\n );\n const issues = builtinIssues.map((issue) => ({\n field: issue.field,\n message: issue.message,\n level: issue.level,\n }));\n\n const result = type.schema.safeParse(rest);\n if (!result.success) {\n return {\n document: null,\n issues: [\n ...issues,\n ...result.error.issues.map((issue) => ({\n field: issue.path.join(\".\"),\n message: issue.message,\n level: \"error\" as const,\n })),\n ],\n };\n }\n\n if (issues.some((i) => i.level === \"error\")) {\n return { document: null, issues };\n }\n\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n result.data as Record<string, unknown>,\n {\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n vars: builtin.vars,\n slug,\n locale: config.defaultLocale,\n },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n const crossIssues = type.crossValidate?.(result.data as z.infer<typeof type.schema>, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug,\n enSlug: slug,\n knownLocales: config.locales,\n }) ?? [];\n issues.push(...crossIssues);\n\n const document: ScribeDocument = {\n slug,\n enSlug: slug,\n locale: config.defaultLocale,\n publishedAt: builtin.publishedAt,\n updatedAt: builtin.updatedAt,\n noindex: builtin.noindex,\n canonicalPathOverride: builtin.canonicalPathOverride,\n frontmatter,\n // Bodyless types (`body: false`) never carry a body: the loader skips the\n // MDX body entirely so runtimes, exports, and hashing all see an empty body.\n // A stray body is reported separately by `scribe validate`.\n content: type.body === false ? \"\" : parsed.content,\n filePath,\n };\n\n return { document, issues };\n}\n\nfunction buildDocumentFromTranslation(\n row: {\n slug: string;\n en_slug: string;\n locale: string;\n frontmatter_json: string;\n body: string;\n },\n enDoc: ScribeDocument,\n type: ContentTypeConfig,\n config: ScribeConfig,\n inlineResolver?: InlineResolver,\n): ScribeDocument {\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n const merged = mergeStructuralOntoLocale(localeFm, enDoc.frontmatter, type.schema);\n const seo = seoFieldsFromEn(enDoc);\n const frontmatter = mergeBuiltinsIntoFrontmatter(\n merged,\n { ...seo, slug: row.slug, locale: row.locale },\n type,\n config.defaultLocale,\n config.localeRouting,\n );\n\n // The stored body carries `%%n%%` markers. When token substitution is enabled\n // (runtime read path only) fill them from the CURRENT EN body's tokens,\n // resolved for this locale; otherwise leave the raw markers in place.\n const preparedBody = prepareTranslatedMdxBody(row.body).body;\n const content = inlineResolver\n ? fillTranslatedInlineBody(\n preparedBody,\n enDoc.content,\n enDoc.frontmatter as Record<string, unknown>,\n row.locale,\n inlineResolver,\n )\n : preparedBody;\n\n return {\n slug: row.slug,\n enSlug: row.en_slug,\n locale: row.locale,\n publishedAt: seo.publishedAt,\n updatedAt: seo.updatedAt,\n noindex: seo.noindex,\n canonicalPathOverride: seo.canonicalPathOverride,\n frontmatter,\n content,\n };\n}\n\nconst DEV_REVALIDATE_MS = 1500;\n\n/**\n * Package-internal monotonic content version. A mutation that writes/removes\n * content files (currently only entry deletion) bumps this so every loader\n * treats its cached document list as stale immediately, bypassing the dev\n * revalidation window. Not exported from the package's public entrypoint.\n */\nlet contentVersion = 0;\n\n/** Invalidate every content loader's cache after an in-process content mutation. */\nexport function bumpContentVersion(): void {\n contentVersion++;\n}\n\nexport function createContentLoader(\n config: ScribeConfig,\n type: ContentTypeConfig,\n options: { resolveAssets?: boolean; inlineResolver?: InlineResolver } = {},\n): () => AllDocuments {\n let cached: AllDocuments | null = null;\n let signature = \"\";\n let lastCheck = 0;\n let builtVersion = contentVersion;\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n const storePath = resolveStorePath(config);\n const isProd = process.env.NODE_ENV === \"production\";\n\n // Asset resolution is a runtime read-path concern (createScribe only); the CLI,\n // validation, and static exports build the project without it and see source values.\n const assets = config.assets;\n const assetFields: SchemaFieldMeta[] =\n assets && options.resolveAssets ? listAssetFields(type.schema) : [];\n const resolveAssets = (doc: ScribeDocument): void => {\n if (assetFields.length > 0 && assets) resolveDocumentAssets(doc, assetFields, assets);\n };\n\n // Inline-token substitution is a runtime read-path concern (createScribe only),\n // gated exactly like asset resolution: the CLI, validation, and studio keep raw\n // token syntax so they can introspect and re-hash source bodies.\n const inlineResolver = options.inlineResolver;\n const resolveEnInline = (doc: ScribeDocument): void => {\n if (inlineResolver) {\n doc.content = substituteEnInlineBody(\n doc.content,\n doc.frontmatter as Record<string, unknown>,\n config.defaultLocale,\n inlineResolver,\n );\n }\n };\n\n function computeSignature(): string {\n const files = listEnFiles(contentDir);\n let newest = 0;\n for (const f of files) {\n try {\n newest = Math.max(newest, fs.statSync(f).mtimeMs);\n } catch {\n /* ignore */\n }\n }\n let store = 0;\n try {\n store = fs.statSync(storePath).mtimeMs;\n } catch {\n /* ignore */\n }\n return `${files.length}:${newest}:${store}`;\n }\n\n function build(): AllDocuments {\n const out = new Map<string, LocaleIndex>();\n const englishBySlug = new Map<string, ScribeDocument>();\n\n for (const file of listEnFiles(contentDir)) {\n const { document, issues } = parseEnMdx(file, config, type);\n if (document) {\n englishBySlug.set(document.slug, document);\n if (issues.length > 0) {\n for (const issue of issues) {\n console.warn(\n `[scribe:${type.id}] ${file} ${issue.level}: ${issue.field}: ${issue.message}`,\n );\n }\n }\n } else {\n console.warn(\n `[scribe:${type.id}] Skipping ${file} — validation failed:\\n` +\n issues.map((i) => ` - ${i.field}: ${i.message}`).join(\"\\n\"),\n );\n }\n }\n\n out.set(config.defaultLocale, {\n bySlug: englishBySlug,\n byEnSlug: englishBySlug,\n });\n\n const db = openStore(config, \"readonly\");\n const rows = listTranslationsForType(db, type.id);\n db.close();\n\n const rowsByLocale = new Map<string, typeof rows>();\n for (const row of rows) {\n const list = rowsByLocale.get(row.locale) ?? [];\n list.push(row);\n rowsByLocale.set(row.locale, list);\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const bySlug = new Map<string, ScribeDocument>();\n const byEnSlug = new Map<string, ScribeDocument>();\n for (const row of rowsByLocale.get(locale) ?? []) {\n const enDoc = englishBySlug.get(row.en_slug);\n if (!enDoc) continue;\n // Merge structural (incl. asset) fields from the *unresolved* EN source,\n // then resolve the locale doc's own fresh frontmatter.\n const doc = buildDocumentFromTranslation(row, enDoc, type, config, inlineResolver);\n resolveAssets(doc);\n bySlug.set(doc.slug, doc);\n byEnSlug.set(row.en_slug, doc);\n }\n out.set(locale, { bySlug, byEnSlug });\n }\n\n // Resolve EN docs last: locale docs merged from their unresolved frontmatter\n // above, and translated bodies extract tokens from the still-raw EN content.\n for (const doc of englishBySlug.values()) {\n resolveAssets(doc);\n resolveEnInline(doc);\n }\n\n return out;\n }\n\n return () => {\n if (cached) {\n // An in-process content mutation (e.g. entry deletion) forces an\n // unconditional rebuild regardless of prod mode or the dev window.\n if (contentVersion !== builtVersion) {\n cached = build();\n builtVersion = contentVersion;\n lastCheck = Date.now();\n signature = isProd ? \"\" : computeSignature();\n return cached;\n }\n if (isProd) return cached;\n const now = Date.now();\n if (now - lastCheck < DEV_REVALIDATE_MS) return cached;\n lastCheck = now;\n const sig = computeSignature();\n if (sig === signature) return cached;\n cached = build();\n signature = sig;\n return cached;\n }\n lastCheck = Date.now();\n cached = build();\n builtVersion = contentVersion;\n signature = isProd ? \"\" : computeSignature();\n return cached;\n };\n}\n\nexport function readEnDocument(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): ScribeDocument | null {\n const contentDir = path.join(/* turbopackIgnore: true */ config.rootDir, type.contentDir);\n for (const ext of [\".mdx\", \".md\"]) {\n const filePath = path.join(contentDir, `${enSlug}${ext}`);\n if (!fs.existsSync(filePath)) continue;\n const { document } = parseEnMdx(filePath, config, type);\n return document;\n }\n return null;\n}\n\nexport function getTranslatablePayload(\n doc: ScribeDocument,\n type: ContentTypeConfig,\n): { frontmatter: Record<string, unknown>; body: string } {\n return {\n frontmatter: pickTranslatable(doc.frontmatter, type.schema),\n // Bodyless types never contribute a body to any translation payload, hash,\n // or snapshot — regardless of what a document's `content` happens to hold.\n body: type.body === false ? \"\" : doc.content,\n };\n}\n","import type { ContentTypeConfig, ScribeDocument, ResolvedDocument } from \"../core/types.js\";\nimport { createUrlBuilder } from \"./build-url.js\";\nimport type { LocaleRoutingConfig } from \"../core/types.js\";\n\n/** Resolve a document by slug and locale (fallback, cross-locale slug correction). */\nexport function resolveLocalizedDocument<TDoc extends ScribeDocument>(\n slug: string,\n locale: string,\n defaultLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n type: ContentTypeConfig,\n localeRouting?: LocaleRoutingConfig,\n fallbackLocales: readonly string[] = [],\n): ResolvedDocument<TDoc> {\n const urlBuilder = createUrlBuilder({\n locales: [defaultLocale, locale],\n defaultLocale,\n localeRouting: localeRouting ?? { strategy: \"path-prefix\", prefixDefaultLocale: false },\n });\n\n const idx = allDocs.get(locale);\n const direct = idx?.bySlug.get(slug);\n if (direct) {\n return { document: direct, actualLocale: locale };\n }\n\n for (const [docLocale, docIdx] of allDocs) {\n const found = docIdx.bySlug.get(slug);\n if (!found) continue;\n\n const enSlug = docLocale === defaultLocale ? found.slug : found.enSlug;\n\n // Which document should canonically serve the requested locale? Try the\n // requested locale first, then its configured fallback chain.\n let target: TDoc | undefined;\n let targetLocale = locale;\n for (const candidateLocale of [locale, ...fallbackLocales]) {\n const cand =\n candidateLocale === defaultLocale\n ? allDocs.get(candidateLocale)?.bySlug.get(enSlug)\n : allDocs.get(candidateLocale)?.byEnSlug.get(enSlug);\n if (cand) {\n target = cand;\n targetLocale = candidateLocale;\n break;\n }\n }\n\n if (target) {\n if (target.slug === slug) {\n return { document: target, actualLocale: targetLocale };\n }\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, target.slug, locale),\n };\n }\n\n if (docLocale === defaultLocale) {\n return { document: found as TDoc, actualLocale: defaultLocale };\n }\n\n if (!type.path) {\n return { document: null, actualLocale: locale };\n }\n return {\n document: null,\n actualLocale: locale,\n shouldRedirectTo: urlBuilder.resolvePath(type.path, found.enSlug, locale),\n };\n }\n\n if (locale !== defaultLocale) {\n const enDoc = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (enDoc && type.indexFallback === \"en\") {\n return { document: enDoc as TDoc, actualLocale: defaultLocale };\n }\n const byEn = idx?.byEnSlug.get(slug);\n if (byEn) {\n return { document: byEn as TDoc, actualLocale: locale };\n }\n const fallback = allDocs.get(defaultLocale)?.bySlug.get(slug);\n if (fallback && type.indexFallback === \"en\") {\n return { document: fallback as TDoc, actualLocale: defaultLocale };\n }\n }\n\n return { document: null, actualLocale: locale };\n}\n\n/** Map a document slug from one locale to another via the EN parent slug. */\nexport function getSlugForLocale<TDoc extends ScribeDocument>(\n document: TDoc,\n sourceLocale: string,\n targetLocale: string,\n allDocs: ReadonlyMap<string, { bySlug: ReadonlyMap<string, TDoc>; byEnSlug: ReadonlyMap<string, TDoc> }>,\n defaultLocale: string,\n): string | null {\n if (sourceLocale === targetLocale) return document.slug;\n\n const englishSlug = sourceLocale === defaultLocale ? document.slug : document.enSlug;\n if (!englishSlug) return null;\n if (targetLocale === defaultLocale) return englishSlug;\n\n return allDocs.get(targetLocale)?.byEnSlug.get(englishSlug)?.slug ?? null;\n}\n","import type {\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n ScribeConfig,\n ScribeDocument,\n ScribeProject,\n StaticParam,\n} from \"./core/types.js\";\nimport { listRelationFields, type SchemaFieldMeta } from \"./core/introspect-schema.js\";\nimport { createContentLoader } from \"./loader/create-loader.js\";\nimport {\n createInlineResolver,\n type InlineLinkStyle,\n type InlineResolver,\n} from \"./inline/resolve-tokens.js\";\nimport { resolveLocalizedDocument } from \"./i18n/resolve-document.js\";\nimport { createUrlBuilder, isRoutableType } from \"./i18n/build-url.js\";\n\nfunction comparatorFor(orderBy: OrderBy): (a: ScribeDocument, b: ScribeDocument) => number {\n if (typeof orderBy === \"function\") return orderBy;\n switch (orderBy) {\n case \"publishedAt\":\n return (a, b) => (a.publishedAt ?? \"\").localeCompare(b.publishedAt ?? \"\");\n case \"-publishedAt\":\n return (a, b) => (b.publishedAt ?? \"\").localeCompare(a.publishedAt ?? \"\");\n case \"updatedAt\":\n return (a, b) => (a.updatedAt ?? \"\").localeCompare(b.updatedAt ?? \"\");\n case \"-updatedAt\":\n return (a, b) => (b.updatedAt ?? \"\").localeCompare(a.updatedAt ?? \"\");\n default:\n return (a, b) => a.slug.localeCompare(b.slug);\n }\n}\n\nfunction buildRuntime(\n config: ScribeConfig,\n type: ContentTypeConfig,\n getRuntime: (id: string) => ContentTypeRuntime,\n options: { resolveAssets?: boolean; inlineResolver?: InlineResolver } = {},\n): ContentTypeRuntime {\n const load = createContentLoader(config, type, {\n resolveAssets: options.resolveAssets,\n inlineResolver: options.inlineResolver,\n });\n const relationFields = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.schema)\n .filter((f) => f.path.length === 1)\n .map((f) => [f.path[0]!, f]),\n );\n\n function assertRoutable(method: string): string {\n if (!type.path) {\n throw new Error(\n `Content type \"${type.id}\" has no path template — ${method}() requires one`,\n );\n }\n return type.path;\n }\n\n const urlBuilder = createUrlBuilder(config);\n\n const runtime: ContentTypeRuntime = {\n id: type.id,\n config: type,\n load,\n\n list(locale = config.defaultLocale, options: ListOptions = {}) {\n const idx = load().get(locale);\n if (!idx) return [];\n const docs = Array.from(idx.bySlug.values());\n docs.sort(comparatorFor(options.orderBy ?? type.orderBy ?? \"slug\"));\n return options.limit !== undefined ? docs.slice(0, options.limit) : docs;\n },\n\n get(slug: string, locale = config.defaultLocale) {\n return load().get(locale)?.bySlug.get(slug) ?? null;\n },\n\n resolve(slug: string, locale: string) {\n const result = resolveLocalizedDocument(\n slug,\n locale,\n config.defaultLocale,\n load(),\n type,\n config.localeRouting,\n config.localeFallbacks?.[locale] ?? [],\n );\n if (result.document && type.path) {\n return {\n ...result,\n canonicalPath: urlBuilder.resolvePath(\n type.path,\n result.document.slug,\n result.actualLocale,\n ),\n };\n }\n return result;\n },\n\n staticParams(options = {}) {\n assertRoutable(\"staticParams\");\n const all = load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) return [];\n const params: StaticParam[] = [];\n for (const locale of options.locales ?? config.locales) {\n const localeIdx = all.get(locale);\n const fallbacks = config.localeFallbacks?.[locale] ?? [];\n for (const doc of enIdx.bySlug.values()) {\n let slug: string;\n if (locale === config.defaultLocale) {\n slug = doc.slug;\n } else {\n // Prefer the locale's own translated slug, then each fallback\n // locale's translated slug, then the EN slug — matching resolve().\n slug =\n localeIdx?.byEnSlug.get(doc.slug)?.slug ??\n fallbacks\n .map((fb) => all.get(fb)?.byEnSlug.get(doc.slug)?.slug)\n .find((s): s is string => s !== undefined) ??\n doc.slug;\n }\n params.push({ locale, slug });\n }\n }\n return params;\n },\n\n alternates(doc: ScribeDocument) {\n const pathTemplate = assertRoutable(\"alternates\");\n const out: Record<string, string> = {\n [config.defaultLocale]: urlBuilder.resolvePath(\n pathTemplate,\n doc.enSlug,\n config.defaultLocale,\n ),\n };\n const all = load();\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const translated = all.get(locale)?.byEnSlug.get(doc.enSlug);\n if (translated) {\n out[locale] = urlBuilder.resolvePath(pathTemplate, translated.slug, locale);\n }\n }\n return out;\n },\n\n translation(doc: ScribeDocument, targetLocale: string) {\n if (targetLocale === doc.locale) return doc;\n const all = load();\n if (targetLocale === config.defaultLocale) {\n return all.get(config.defaultLocale)?.bySlug.get(doc.enSlug) ?? null;\n }\n return all.get(targetLocale)?.byEnSlug.get(doc.enSlug) ?? null;\n },\n\n url(slug: string, locale: string) {\n const pathTemplate = assertRoutable(\"url\");\n return urlBuilder.resolvePath(pathTemplate, slug, locale);\n },\n\n related(doc: ScribeDocument, fieldName: string, locale?: string) {\n const meta = relationFields.get(fieldName);\n if (!meta) {\n throw new Error(\n `Content type \"${type.id}\" has no top-level relation field \"${fieldName}\"`,\n );\n }\n const target = getRuntime(meta.relationTarget!);\n const lookupLocale = locale ?? doc.locale;\n const value = (doc.frontmatter as Record<string, unknown>)[fieldName];\n\n // Relations always hold EN slugs (structural fields are merged from EN).\n // Deref in the requested locale, falling back to the EN doc unconditionally.\n const deref = (enSlug: string): ScribeDocument | null => {\n const all = target.load();\n return (\n all.get(lookupLocale)?.byEnSlug.get(enSlug) ??\n all.get(config.defaultLocale)?.bySlug.get(enSlug) ??\n null\n );\n };\n\n if (meta.relationMultiple) {\n if (!Array.isArray(value)) return [];\n return value\n .filter((slug): slug is string => typeof slug === \"string\" && slug.length > 0)\n .map(deref)\n .filter((d): d is ScribeDocument => d !== null);\n }\n\n if (typeof value !== \"string\" || value.length === 0) {\n if (meta.relationOptional) return null;\n throw new Error(\n `${type.id} \"${doc.enSlug}\": required relation \"${fieldName}\" is missing`,\n );\n }\n const resolved = deref(value);\n if (!resolved && !meta.relationOptional) {\n throw new Error(\n `${type.id} \"${doc.enSlug}\": relation \"${fieldName}\" references missing ` +\n `${meta.relationTarget} \"${value}\" — run \\`scribe validate\\``,\n );\n }\n return resolved;\n },\n } as ContentTypeRuntime;\n\n return runtime;\n}\n\n/**\n * Create the untyped project engine (CLI, validation, studio).\n * Apps should use `createScribe()` for typed per-type accessors.\n * Expects a resolved config (`resolveConfig` / `loadConfigSync`).\n *\n * @param options.resolveAssets resolve declared asset fields to served URLs on\n * read (publicPath applied, templates materialized). Only `createScribe` sets\n * this; the CLI, validation, and static exports keep source values.\n * @param options.resolveInlineTokens substitute `${{...}}` inline tokens in\n * document bodies on read (EN tokens filled in place, translated `%%n%%`\n * markers filled from the current EN tokens). Only `createScribe` sets this;\n * the CLI, validation, and studio keep raw token syntax.\n * @internal\n */\nexport interface CreateProjectOptions {\n resolveAssets?: boolean;\n resolveInlineTokens?: boolean;\n /** How `:href` relation tokens resolve. Default `\"app\"`. */\n inlineLinkStyle?: InlineLinkStyle;\n /** Extension for `:href` in `\"export\"` mode. Default `.md`. */\n exportLinkExtension?: `.${string}`;\n}\n\nexport function createProject(\n config: ScribeConfig,\n options: CreateProjectOptions = {},\n): ScribeProject {\n const runtimes = new Map<string, ContentTypeRuntime>();\n const getRuntime = (id: string): ContentTypeRuntime => {\n const runtime = runtimes.get(id);\n if (!runtime) {\n throw new Error(`Unknown content type \"${id}\"`);\n }\n return runtime;\n };\n\n // One resolver instance shared across every type's loader. It reads localized\n // slugs straight from the store (never through another loader), so building it\n // here cannot recurse into the runtimes it lives alongside.\n const inlineResolver = options.resolveInlineTokens\n ? createInlineResolver(config, {\n linkStyle: options.inlineLinkStyle,\n exportExtension: options.exportLinkExtension,\n })\n : undefined;\n\n for (const type of config.types) {\n runtimes.set(\n type.id,\n buildRuntime(config, type, getRuntime, {\n resolveAssets: options.resolveAssets,\n inlineResolver,\n }),\n );\n }\n\n return {\n config,\n rootDir: config.rootDir,\n storePath: config.storePath,\n getType: getRuntime,\n listTypes() {\n return Array.from(runtimes.values());\n },\n listRoutableTypes() {\n return Array.from(runtimes.values()).filter((runtime) => isRoutableType(runtime.config));\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeConfig } from \"./types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport function enFileExists(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): boolean {\n const dir = path.join(config.rootDir, type.contentDir);\n return (\n fs.existsSync(path.join(dir, `${enSlug}.mdx`)) ||\n fs.existsSync(path.join(dir, `${enSlug}.md`))\n );\n}\n\nexport function sqliteHasTranslations(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n): boolean {\n return listTranslationsForEnSlug(db, contentTypeId, enSlug).length > 0;\n}\n\nexport function isAliasKnown(\n config: ScribeConfig,\n type: ContentTypeConfig,\n aliasEnSlug: string,\n db: Database.Database,\n): boolean {\n return enFileExists(config, type, aliasEnSlug) || sqliteHasTranslations(db, type.id, aliasEnSlug);\n}\n\nexport function listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n","import type { AllDocuments } from \"../core/types.js\";\n\n/**\n * Internal: locale → (en_slug → locale slug) map for all non-default locales.\n * Consumed by `staticParams()`, `alternates()`, and redirect expansion.\n */\nexport function buildTranslationIndex(\n allDocs: AllDocuments,\n locales: readonly string[],\n defaultLocale: string,\n): Map<string, Map<string, string>> {\n const index = new Map<string, Map<string, string>>();\n for (const locale of locales) {\n if (locale === defaultLocale) continue;\n const idx = allDocs.get(locale);\n if (!idx) continue;\n const localeMap = new Map<string, string>();\n for (const [enSlug, doc] of idx.byEnSlug) {\n localeMap.set(enSlug, doc.slug);\n }\n index.set(locale, localeMap);\n }\n return index;\n}\n","import { z } from \"zod\";\nimport { slugPatternSchema } from \"../core/builtin-fields.js\";\n\nconst redirectFromSchema = z.union([\n slugPatternSchema,\n z.array(slugPatternSchema).min(1).max(20),\n]);\n\nexport const typeRedirectEntrySchema = z\n .object({\n from: redirectFromSchema,\n toSlug: slugPatternSchema.optional(),\n toType: z.string().min(1).optional(),\n toUrl: z.string().min(1).optional(),\n permanent: z.boolean().optional(),\n })\n .superRefine((entry, ctx) => {\n const hasToSlug = entry.toSlug !== undefined;\n const hasToUrl = entry.toUrl !== undefined;\n const hasToType = entry.toType !== undefined;\n const targetCount = Number(hasToSlug) + Number(hasToUrl);\n\n if (targetCount !== 1) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Each redirect must specify exactly one of toSlug/toType+toSlug or toUrl\",\n path: [\"toSlug\"],\n });\n return;\n }\n\n if (hasToUrl && hasToType) {\n ctx.addIssue({\n code: \"custom\",\n message: \"toUrl cannot be combined with toType\",\n path: [\"toUrl\"],\n });\n }\n\n if (hasToType && !hasToSlug) {\n ctx.addIssue({\n code: \"custom\",\n message: \"Cross-type redirects require both toType and toSlug\",\n path: [\"toSlug\"],\n });\n }\n });\n\nexport const typeRedirectsFileSchema = z.object({\n redirects: z.array(typeRedirectEntrySchema).max(500),\n});\n\nexport type TypeRedirectEntry = z.infer<typeof typeRedirectEntrySchema>;\nexport type TypeRedirectsFile = z.infer<typeof typeRedirectsFileSchema>;\n\nexport type RedirectTargetKind = \"same-type\" | \"cross-type\" | \"anywhere\";\n\nexport interface ParsedRedirectEntry {\n fromSlugs: string[];\n kind: RedirectTargetKind;\n toSlug?: string;\n toType?: string;\n toUrl?: string;\n permanent: boolean;\n}\n\nexport function normalizeRedirectFrom(from: string | string[]): string[] {\n return Array.isArray(from) ? from : [from];\n}\n\nexport function parseRedirectEntry(entry: TypeRedirectEntry): ParsedRedirectEntry {\n const fromSlugs = normalizeRedirectFrom(entry.from);\n if (entry.toUrl !== undefined) {\n return {\n fromSlugs,\n kind: \"anywhere\",\n toUrl: entry.toUrl,\n permanent: entry.permanent ?? true,\n };\n }\n if (entry.toType !== undefined) {\n return {\n fromSlugs,\n kind: \"cross-type\",\n toType: entry.toType,\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n }\n return {\n fromSlugs,\n kind: \"same-type\",\n toSlug: entry.toSlug,\n permanent: entry.permanent ?? true,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport {\n parseRedirectEntry,\n type ParsedRedirectEntry,\n typeRedirectsFileSchema,\n} from \"./redirect-schema.js\";\n\nexport const TYPE_REDIRECTS_FILENAME = \"_redirects.json\";\n\nexport interface LoadedTypeRedirects {\n contentTypeId: string;\n contentDir: string;\n filePath: string;\n entries: ParsedRedirectEntry[];\n}\n\nfunction redirectsFilePath(config: ScribeConfig, type: ContentTypeConfig): string {\n return path.join(config.rootDir, type.contentDir, TYPE_REDIRECTS_FILENAME);\n}\n\nexport function loadTypeRedirectsFile(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): LoadedTypeRedirects | null {\n const filePath = redirectsFilePath(config, type);\n if (!fs.existsSync(filePath)) return null;\n\n let raw: unknown;\n try {\n raw = JSON.parse(fs.readFileSync(filePath, \"utf8\"));\n } catch (error) {\n throw new Error(\n `${type.id}: failed to parse ${TYPE_REDIRECTS_FILENAME}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n const parsed = typeRedirectsFileSchema.safeParse(raw);\n if (!parsed.success) {\n const details = parsed.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"root\"}: ${issue.message}`)\n .join(\"; \");\n throw new Error(`${type.id}: invalid ${TYPE_REDIRECTS_FILENAME}: ${details}`);\n }\n\n return {\n contentTypeId: type.id,\n contentDir: type.contentDir,\n filePath,\n entries: parsed.data.redirects.map(parseRedirectEntry),\n };\n}\n\nexport function loadAllTypeRedirects(config: ScribeConfig): LoadedTypeRedirects[] {\n const out: LoadedTypeRedirects[] = [];\n for (const type of config.types) {\n const loaded = loadTypeRedirectsFile(config, type);\n if (loaded) out.push(loaded);\n }\n return out;\n}\n\nexport function collectRedirectSourceSlugs(loaded: LoadedTypeRedirects[]): Set<string> {\n const slugs = new Set<string>();\n for (const file of loaded) {\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n slugs.add(from);\n }\n }\n }\n return slugs;\n}\n\nexport function collectOutboundRedirectSourcesByType(\n loaded: LoadedTypeRedirects[],\n): Map<string, Set<string>> {\n const out = new Map<string, Set<string>>();\n for (const file of loaded) {\n const set = out.get(file.contentTypeId) ?? new Set<string>();\n for (const entry of file.entries) {\n for (const from of entry.fromSlugs) {\n set.add(from);\n }\n }\n out.set(file.contentTypeId, set);\n }\n return out;\n}\n","import type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport { loadTypeRedirectsFile } from \"./load-type-redirects.js\";\nimport type { ParsedRedirectEntry } from \"./redirect-schema.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nfunction localizedSlug(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n locale: string,\n defaultLocale: string,\n): string {\n if (locale === defaultLocale) return enSlug;\n const row = listTranslationsForEnSlug(db, contentTypeId, enSlug).find(\n (translation) => translation.locale === locale,\n );\n return row?.slug ?? enSlug;\n}\n\nfunction resolveSlugTargetDestination(\n project: ScribeProject,\n db: Database.Database,\n targetType: ContentTypeConfig,\n toSlug: string,\n locale: string,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): string {\n const targetSlug = localizedSlug(\n db,\n targetType.id,\n toSlug,\n locale,\n project.config.defaultLocale,\n );\n return urlBuilder.resolvePath(targetType.path!, targetSlug, locale);\n}\n\nfunction buildEntryRules(\n project: ScribeProject,\n sourceType: ContentTypeConfig,\n entry: ParsedRedirectEntry,\n db: Database.Database,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): NextRedirectRule[] {\n if (!isRoutableType(sourceType)) return [];\n\n const out: NextRedirectRule[] = [];\n const { defaultLocale } = project.config;\n\n let targetType: ContentTypeConfig = sourceType;\n if (entry.kind === \"cross-type\") {\n const resolvedTarget = project.config.types.find((type) => type.id === entry.toType);\n if (!resolvedTarget?.path) return out;\n targetType = resolvedTarget;\n }\n\n for (const fromEnSlug of entry.fromSlugs) {\n const locales = project.config.locales;\n for (const locale of locales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n const source = urlBuilder.resolvePath(sourceType.path!, fromSlug, locale);\n\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n if (source === destination) continue;\n\n out.push({\n source,\n destination,\n permanent: entry.permanent,\n });\n }\n\n if (sourceType.id === \"blog\") {\n let destinationEn: string;\n if (entry.kind === \"anywhere\") {\n destinationEn = entry.toUrl!;\n } else {\n destinationEn = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n defaultLocale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${fromEnSlug}`,\n destination: destinationEn,\n permanent: entry.permanent,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${locale}/${fromSlug}`,\n destination,\n permanent: entry.permanent,\n });\n\n out.push({\n source: `/${locale}/${fromEnSlug}`,\n destination,\n permanent: entry.permanent,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function buildJsonRedirects(project: ScribeProject): NextRedirectRule[] {\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n\n for (const entry of loaded.entries) {\n out.push(...buildEntryRules(project, type, entry, db, urlBuilder));\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n\nexport function buildRedirectSourceSlugSet(project: ScribeProject): Set<string> {\n const out = new Set<string>();\n for (const type of project.config.types) {\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n out.add(`${type.id}:${from}`);\n }\n }\n }\n return out;\n}\n\nexport function buildLegacyNoBlogPathRedirects(\n project: ScribeProject,\n redirectSourceKeys: Set<string>,\n): NextRedirectRule[] {\n const blogType = project.config.types.find((type) => type.id === \"blog\" && type.path);\n if (!blogType?.path) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const enSlug of listEnSlugs(project.config.rootDir, blogType.contentDir)) {\n if (redirectSourceKeys.has(`blog:${enSlug}`)) continue;\n\n out.push({\n source: `/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, enSlug, project.config.defaultLocale),\n permanent: true,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const translatedSlug = localizedSlug(\n db,\n blogType.id,\n enSlug,\n locale,\n project.config.defaultLocale,\n );\n out.push({\n source: `/${locale}/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport {\n buildJsonRedirects,\n buildLegacyNoBlogPathRedirects,\n buildRedirectSourceSlugSet,\n} from \"./build-json-redirects.js\";\nimport {\n collectOutboundRedirectSourcesByType,\n collectRedirectSourceSlugs,\n loadAllTypeRedirects,\n} from \"./load-type-redirects.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). Deprecated: derived from localeRouting when omitted. */\n prefixedLocales?: string[];\n}\n\nfunction buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): Map<string, Map<string, string>> {\n const runtime = project.getType(typeId);\n const { config } = project;\n const merged = buildTranslationIndex(\n runtime.load(),\n config.locales,\n config.defaultLocale,\n );\n\n const db = openStore(project.config, \"readonly\");\n try {\n for (const alias of redirectSourceSlugs) {\n for (const row of listTranslationsForEnSlug(db, typeId, alias)) {\n const localeMap = merged.get(row.locale) ?? new Map<string, string>();\n if (!localeMap.has(alias)) {\n localeMap.set(alias, row.slug);\n }\n merged.set(row.locale, localeMap);\n }\n }\n } finally {\n db.close();\n }\n\n return merged;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const translationIndex = buildRedirectTranslationIndex(project, typeId, redirectSourceSlugs);\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const [locale, localeMap] of translationIndex) {\n for (const [enSlug, translatedSlug] of localeMap) {\n if (enSlug === translatedSlug) continue;\n if (redirectSourceSlugs.has(enSlug)) continue;\n out.push({\n source: urlBuilder.resolvePath(pathTemplate, enSlug, locale),\n destination: urlBuilder.resolvePath(pathTemplate, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(project: ScribeProject, typeId: string): NextRedirectRule[] {\n const loaded = loadAllTypeRedirects(project.config).find((file) => file.contentTypeId === typeId);\n const redirectSourceSlugs = new Set<string>();\n if (loaded) {\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n redirectSourceSlugs.add(from);\n }\n }\n }\n\n return [\n ...buildCrossLocaleSlugRedirects(project, typeId, redirectSourceSlugs),\n ];\n}\n\n/** Build Next.js redirect rules from `_redirects.json`, locale slug fixes, and legacy blog paths. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n _options: BuildRedirectsOptions = {},\n): NextRedirectRule[] {\n const redirectSourceKeys = buildRedirectSourceSlugSet(project);\n const out: NextRedirectRule[] = [\n ...buildJsonRedirects(project),\n ...buildLegacyNoBlogPathRedirects(project, redirectSourceKeys),\n ];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All inbound redirect source slugs — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirects — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (redirect sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const loaded = loadAllTypeRedirects(project.config);\n const aliasSlugs = collectRedirectSourceSlugs(loaded);\n const outboundByType = collectOutboundRedirectSourcesByType(loaded);\n\n for (const type of project.config.types) {\n if (!outboundByType.has(type.id)) {\n outboundByType.set(type.id, new Set());\n }\n }\n\n return {\n aliasSlugs,\n outboundByType,\n };\n}\n\nexport { listEnSlugs };\n","/** Join site origin and pathname without double slashes. */\nexport function joinBaseUrl(baseUrl: string, pathname: string): string {\n const origin = baseUrl.replace(/\\/$/, \"\");\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${origin}${path}`;\n}\n","import { documentLastModified, resolveCanonicalPathname } from \"../core/builtin-fields.js\";\nimport type { AllDocuments, ContentTypeConfig, ScribeConfig, ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { getRedirectSourceSlugs } from \"../redirects/build-redirects.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { joinBaseUrl } from \"./join-base-url.js\";\nimport type { GenerateSitemapOptions, SitemapEntry } from \"./types.js\";\n\nfunction shouldIncludeEnDoc(\n enDoc: ScribeDocument,\n enSlug: string,\n redirectSources: ReturnType<typeof getRedirectSourceSlugs>,\n contentTypeId: string,\n excludeNoindex: boolean,\n): boolean {\n if (redirectSources.aliasSlugs.has(enSlug)) return false;\n const outbound = redirectSources.outboundByType.get(contentTypeId);\n if (outbound?.has(enSlug)) return false;\n if (excludeNoindex && enDoc.noindex) return false;\n return true;\n}\n\ntype ResolvedSitemapOptions = GenerateSitemapOptions & {\n resolveUrl: (locale: string, pathname: string) => string | Promise<string>;\n};\n\nfunction resolveSitemapOptions(options: GenerateSitemapOptions): ResolvedSitemapOptions {\n return {\n ...options,\n resolveUrl:\n options.resolveUrl ??\n ((_locale, pathname) => joinBaseUrl(options.baseUrl, pathname)),\n };\n}\n\nasync function buildClusterEntry(\n type: ContentTypeConfig,\n enSlug: string,\n enDoc: ScribeDocument,\n allDocs: AllDocuments,\n config: ScribeConfig,\n options: ResolvedSitemapOptions,\n): Promise<SitemapEntry | null> {\n const { defaultLocale, locales } = config;\n const excludeNoindex = options.excludeNoindex !== false;\n const includeXDefault = options.includeXDefault !== false;\n const typeDefaults = options.typeDefaults?.[type.id];\n\n const pathnameFor = (doc: ScribeDocument): string =>\n options.resolvePathname?.(type, doc, defaultLocale) ??\n resolveCanonicalPathname(type, doc, defaultLocale);\n\n const alternates: Record<string, string> = {};\n\n for (const locale of locales) {\n const idx = allDocs.get(locale);\n if (!idx) continue;\n\n const doc =\n locale === defaultLocale\n ? idx.bySlug.get(enSlug)\n : idx.byEnSlug.get(enSlug);\n\n if (!doc) continue;\n if (excludeNoindex && doc.noindex) continue;\n\n const pathname = pathnameFor(doc);\n alternates[locale] = await options.resolveUrl(locale, pathname);\n }\n\n if (Object.keys(alternates).length === 0) return null;\n\n const mainUrl =\n alternates[defaultLocale] ?? alternates[Object.keys(alternates)[0]!]!;\n\n if (includeXDefault && alternates[defaultLocale]) {\n alternates[\"x-default\"] = alternates[defaultLocale];\n }\n\n const lastModified = documentLastModified(enDoc);\n\n return {\n url: mainUrl,\n ...(lastModified ? { lastModified } : {}),\n ...(typeDefaults?.changeFrequency\n ? { changeFrequency: typeDefaults.changeFrequency }\n : {}),\n ...(typeDefaults?.priority !== undefined ? { priority: typeDefaults.priority } : {}),\n alternates: { languages: alternates },\n };\n}\n\n/** Build sitemap entries with hreflang alternates for routable content types. */\nexport async function generateSitemap(\n project: ScribeProject,\n options: GenerateSitemapOptions,\n): Promise<SitemapEntry[]> {\n const resolvedOptions = resolveSitemapOptions(options);\n const { config } = project;\n const redirectSources = getRedirectSourceSlugs(project);\n const excludeNoindex = options.excludeNoindex !== false;\n\n const typeIds =\n options.contentTypes ??\n config.types.filter(isRoutableType).map((t) => t.id);\n\n const entries: SitemapEntry[] = [];\n\n for (const typeId of typeIds) {\n const runtime = project.getType(typeId);\n const type = runtime.config;\n if (!isRoutableType(type)) continue;\n\n const allDocs = runtime.load();\n const enIndex = allDocs.get(config.defaultLocale);\n if (!enIndex) continue;\n\n const processed = new Set<string>();\n\n for (const [enSlug, enDoc] of enIndex.bySlug) {\n if (processed.has(enSlug)) continue;\n processed.add(enSlug);\n\n if (\n !shouldIncludeEnDoc(enDoc, enSlug, redirectSources, typeId, excludeNoindex)\n ) {\n continue;\n }\n\n const entry = await buildClusterEntry(\n type,\n enSlug,\n enDoc,\n allDocs,\n config,\n resolvedOptions,\n );\n if (entry) entries.push(entry);\n }\n }\n\n return entries;\n}\n","import type {\n AssetUrlOptions,\n ContentTypeInput,\n ContentTypeRuntime,\n Scribe,\n ScribeConfigInput,\n} from \"./core/types.js\";\nimport { resolveConfig } from \"./config/resolve-config.js\";\nimport { createProject } from \"./create-project.js\";\nimport { joinPublicPath } from \"./loader/resolve-assets.js\";\nimport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nimport type { GenerateSitemapOptions } from \"./sitemap/types.js\";\n\n/**\n * Create the typed Scribe client. Each content type id becomes a typed\n * accessor (`scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …),\n * plus `scribe.sitemap()`.\n *\n * Pass the object returned by `defineConfig()`; defaults and path resolution\n * are applied here.\n */\nexport function createScribe<const TTypes extends readonly ContentTypeInput<any>[]>(\n input: ScribeConfigInput<TTypes>,\n): Scribe<TTypes> {\n const config = resolveConfig(input);\n const project = createProject(config, {\n resolveAssets: true,\n resolveInlineTokens: true,\n inlineLinkStyle: \"app\",\n });\n const scribe = {\n config,\n project,\n getType: project.getType,\n listTypes: project.listTypes,\n listRoutableTypes: project.listRoutableTypes,\n sitemap(options: GenerateSitemapOptions) {\n return generateSitemap(project, options);\n },\n assets: {\n url(ref: string, opts?: AssetUrlOptions) {\n if (opts && Object.keys(opts).length > 0) {\n throw new Error(\n `scribe.assets.url: options are reserved for a future pipeline; got ${Object.keys(opts).join(\", \")}`,\n );\n }\n const assetsConfig = config.assets;\n return assetsConfig ? joinPublicPath(assetsConfig.publicPath, ref) : ref;\n },\n },\n } as unknown as Scribe<TTypes>;\n\n for (const type of config.types) {\n (scribe as unknown as Record<string, ContentTypeRuntime>)[type.id] =\n project.getType(type.id);\n }\n\n return scribe;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ScribeConfig, ScribeConfigInput } from \"../core/types.js\";\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\n/** Find scribe.config.ts/mts/js in a directory. */\nexport function findConfigPath(cwd: string): string | null {\n const candidates = [\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.ts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.mts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.js\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate;\n }\n }\n return null;\n}\n\n/** Load and resolve scribe.config.ts synchronously (CLI). */\nexport function loadConfigSync(options: LoadConfigOptions = {}): ScribeConfig {\n const cwd = options.cwd ?? /* turbopackIgnore: true */ process.cwd();\n const configPath = options.configPath ?? findConfigPath(cwd);\n if (!configPath) {\n throw new Error(`No scribe.config.ts found in ${cwd} (pass --config)`);\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const loaded = jiti(configPath) as ScribeConfigInput | { default: ScribeConfigInput };\n const config = \"default\" in loaded ? loaded.default : loaded;\n if (!config?.rootDir) {\n throw new Error(`Invalid scribe config at ${configPath}: missing rootDir`);\n }\n return resolveConfig(config, path.dirname(configPath));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig, ScribeProject } from \"../core/types.js\";\nimport { enFileExists, listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport {\n loadAllTypeRedirects,\n loadTypeRedirectsFile,\n TYPE_REDIRECTS_FILENAME,\n} from \"../redirects/load-type-redirects.js\";\nimport type { ParsedRedirectEntry } from \"../redirects/redirect-schema.js\";\nimport type { ValidateIssue } from \"../validate/validate-project.js\";\n\nfunction liveDocExists(config: ScribeConfig, typeId: string, enSlug: string): boolean {\n const type = config.types.find((entry) => entry.id === typeId);\n if (!type) return false;\n return enFileExists(config, type, enSlug);\n}\n\nfunction resolveRedirectTarget(\n project: ScribeProject,\n sourceTypeId: string,\n entry: ParsedRedirectEntry,\n): { typeId: string; enSlug: string } | null {\n if (entry.kind === \"anywhere\") return null;\n if (entry.kind === \"cross-type\") {\n return { typeId: entry.toType!, enSlug: entry.toSlug! };\n }\n return { typeId: sourceTypeId, enSlug: entry.toSlug! };\n}\n\nfunction matchRoutableTarget(\n project: ScribeProject,\n toUrl: string,\n): { typeId: string; enSlug: string } | null {\n const urlBuilder = createUrlBuilder(project.config);\n for (const type of project.config.types) {\n if (!type.path) continue;\n const enSlug = urlBuilder.extractSlugFromResolvedPath(type.path, toUrl);\n if (enSlug && liveDocExists(project.config, type.id, enSlug)) {\n return { typeId: type.id, enSlug };\n }\n }\n return null;\n}\n\nexport function validateTypeRedirects(project: ScribeProject): ValidateIssue[] {\n const issues: ValidateIssue[] = [];\n const globalFrom = new Map<string, { typeId: string; filePath: string }>();\n\n for (const type of project.config.types) {\n const filePath = path.join(project.config.rootDir, type.contentDir, TYPE_REDIRECTS_FILENAME);\n if (!fs.existsSync(filePath)) continue;\n\n let loaded;\n try {\n loaded = loadTypeRedirectsFile(project.config, type);\n } catch (error) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: error instanceof Error ? error.message : String(error),\n });\n continue;\n }\n if (!loaded) continue;\n\n if (!isRoutableType(type)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirects are only supported on routable content types (missing path)`,\n });\n continue;\n }\n\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n if (entry.kind === \"same-type\" && from === entry.toSlug) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect source \"${from}\" must not equal its target slug`,\n });\n }\n\n if (liveDocExists(project.config, type.id, from)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect source \"${from}\" still has a live EN file — delete or rename the MDX first`,\n });\n }\n\n const existing = globalFrom.get(from);\n if (existing && existing.typeId !== type.id) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect source \"${from}\" is already claimed by ${existing.typeId}`,\n });\n } else if (existing) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Duplicate redirect source \"${from}\" in ${TYPE_REDIRECTS_FILENAME}`,\n });\n } else {\n globalFrom.set(from, { typeId: type.id, filePath: loaded.filePath });\n }\n }\n\n if (entry.kind === \"cross-type\") {\n const targetType = project.config.types.find((candidate) => candidate.id === entry.toType);\n if (!targetType) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Unknown redirect target type \"${entry.toType}\"`,\n });\n continue;\n }\n if (!isRoutableType(targetType)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect target type \"${entry.toType}\" is not routable (missing path)`,\n });\n continue;\n }\n }\n\n const target = resolveRedirectTarget(project, type.id, entry);\n if (target) {\n if (!liveDocExists(project.config, target.typeId, target.enSlug)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect target ${target.typeId}/${target.enSlug} does not exist`,\n });\n }\n continue;\n }\n\n if (entry.kind === \"anywhere\" && entry.toUrl?.startsWith(\"/\")) {\n const matched = matchRoutableTarget(project, entry.toUrl);\n if (matched && !liveDocExists(project.config, matched.typeId, matched.enSlug)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect toUrl \"${entry.toUrl}\" does not resolve to a live document`,\n });\n }\n }\n }\n }\n\n const allLoaded = loadAllTypeRedirects(project.config);\n for (const file of allLoaded) {\n for (const entry of file.entries) {\n if (entry.kind === \"anywhere\" || !entry.toSlug) continue;\n const targetTypeId = entry.kind === \"cross-type\" ? entry.toType! : file.contentTypeId;\n const targetType = project.config.types.find((type) => type.id === targetTypeId);\n if (!targetType?.path) continue;\n\n for (const from of entry.fromSlugs) {\n if (globalFrom.get(from)?.typeId !== file.contentTypeId) continue;\n\n const targetAsSource = globalFrom.get(entry.toSlug!);\n if (!targetAsSource) continue;\n\n const sameSlugCrossType =\n entry.kind === \"cross-type\" &&\n entry.fromSlugs.includes(entry.toSlug!) &&\n targetAsSource.typeId === file.contentTypeId;\n\n if (sameSlugCrossType) continue;\n\n issues.push({\n level: \"error\",\n contentType: file.contentTypeId,\n enSlug: from,\n field: TYPE_REDIRECTS_FILENAME,\n message: `Redirect chain detected: \"${from}\" → \"${entry.toSlug}\" → existing redirect source`,\n });\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { listRelationFields } from \"../core/introspect-schema.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\n\nexport interface RelationValidateIssue {\n contentTypeId: string;\n enSlug: string;\n locale?: string;\n field: string;\n message: string;\n /**\n * Dangling required single relations are errors (`related()` would throw at\n * render); dangling optional/multiple relations degrade gracefully to\n * null/dropped items, so they only warn.\n */\n level: \"error\" | \"warning\";\n}\n\nfunction getAtPath(obj: Record<string, unknown>, fieldPath: string[]): unknown {\n let current: unknown = obj;\n for (const segment of fieldPath) {\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\nexport function buildEnSlugIndex(config: ScribeConfig): Map<string, Set<string>> {\n const index = new Map<string, Set<string>>();\n for (const type of config.types) {\n const slugs = new Set(listEnSlugs(config.rootDir, type.contentDir));\n index.set(type.id, slugs);\n }\n return index;\n}\n\nfunction listEnSlugsForType(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/**\n * Warn when a relation field references a slug that does not exist in the target type.\n */\nexport function validateRelations(project: ScribeProject): RelationValidateIssue[] {\n const { config } = project;\n const slugIndex = buildEnSlugIndex(config);\n const issues: RelationValidateIssue[] = [];\n\n const typeIds = new Set(config.types.map((t) => t.id));\n\n for (const type of config.types) {\n const relationFields = listRelationFields(type.schema);\n if (relationFields.length === 0) continue;\n\n for (const enSlug of listEnSlugsForType(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n for (const fieldMeta of relationFields) {\n const targetTypeId = fieldMeta.relationTarget!;\n const danglingLevel =\n fieldMeta.relationOptional || fieldMeta.relationMultiple ? \"warning\" : \"error\";\n if (!typeIds.has(targetTypeId)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldMeta.path.join(\".\"),\n message: `Relation target type \"${targetTypeId}\" is not registered`,\n level: \"error\",\n });\n continue;\n }\n\n const value = getAtPath(doc.frontmatter as Record<string, unknown>, fieldMeta.path);\n if (value === undefined || value === null || value === \"\") continue;\n\n const targetSlugs = slugIndex.get(targetTypeId) ?? new Set<string>();\n const fieldLabel = fieldMeta.path.join(\".\");\n\n if (fieldMeta.relationMultiple) {\n if (!Array.isArray(value)) continue;\n for (const slug of value) {\n if (typeof slug !== \"string\" || !slug) continue;\n if (!targetSlugs.has(slug)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${slug}\" — no ${targetTypeId} doc with that slug`,\n level: danglingLevel,\n });\n }\n }\n } else if (typeof value === \"string\") {\n if (!targetSlugs.has(value)) {\n issues.push({\n contentTypeId: type.id,\n enSlug,\n field: fieldLabel,\n message: `${fieldLabel} references \"${value}\" — no ${targetTypeId} doc with slug \"${value}\"`,\n level: danglingLevel,\n });\n }\n }\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { z } from \"zod\";\nimport { listAssetFields, type SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ScribeConfig } from \"../core/types.js\";\n\nconst IMAGE_EXT = String.raw`(?:png|jpe?g|webp|gif|svg)`;\nconst IMAGE_WEB_PATH = String.raw`\\/[\\w\\-./]+\\.${IMAGE_EXT}`;\nconst MARKDOWN_IMAGE_RE = new RegExp(\n String.raw`!\\[[^\\]]*\\]\\((${IMAGE_WEB_PATH})\\)`,\n \"gi\",\n);\nconst HTML_SRC_RE = new RegExp(String.raw`src=[\"'](${IMAGE_WEB_PATH})[\"']`, \"gi\");\n\nfunction isImageWebPath(value: string): boolean {\n return new RegExp(String.raw`^${IMAGE_WEB_PATH}$`, \"i\").test(value);\n}\n\nfunction isSiteAssetPath(webPath: string): boolean {\n const segment = webPath.split(\"/\")[1];\n return Boolean(segment && !segment.includes(\".\"));\n}\n\nfunction addImagePath(webPath: string, out: Set<string>): void {\n if (isSiteAssetPath(webPath)) out.add(webPath);\n}\n\nfunction collectBodyImagePaths(body: string, out: Set<string>): void {\n for (const re of [MARKDOWN_IMAGE_RE, HTML_SRC_RE]) {\n for (const match of body.matchAll(re)) {\n addImagePath(match[1]!, out);\n }\n }\n}\n\nfunction collectFrontmatterImagePaths(value: unknown, out: Set<string>): void {\n if (typeof value === \"string\") {\n if (isImageWebPath(value)) addImagePath(value, out);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) collectFrontmatterImagePaths(item, out);\n return;\n }\n if (value && typeof value === \"object\") {\n for (const nested of Object.values(value as Record<string, unknown>)) {\n collectFrontmatterImagePaths(nested, out);\n }\n }\n}\n\n/** Collect absolute web paths to image assets from frontmatter values and MDX body. */\nexport function collectImagePaths(frontmatter: unknown, body: string): string[] {\n const paths = new Set<string>();\n collectFrontmatterImagePaths(frontmatter, paths);\n collectBodyImagePaths(body, paths);\n return [...paths].sort();\n}\n\nfunction assetFilePath(assetsPath: string, webPath: string): string {\n return path.join(assetsPath, webPath.replace(/^\\//, \"\"));\n}\n\nexport interface AssetValidateIssue {\n level: \"error\" | \"warning\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\n/**\n * Warn when referenced image paths are missing from the configured assets\n * folder. Heuristic pass over frontmatter strings and MDX body images.\n *\n * @param skipPaths web paths already covered by declared-asset validation\n * (`validateDeclaredAssetFields`), skipped here to avoid duplicate reporting.\n */\nexport function validateDocumentAssets(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n locale?: string;\n frontmatter: unknown;\n body: string;\n },\n skipPaths?: Set<string>,\n): AssetValidateIssue[] {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return [];\n\n const issues: AssetValidateIssue[] = [];\n for (const webPath of collectImagePaths(input.frontmatter, input.body)) {\n if (skipPaths?.has(webPath)) continue;\n const filePath = assetFilePath(assetsPath, webPath);\n if (fs.existsSync(filePath)) continue;\n issues.push({\n level: \"warning\",\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n field: \"asset\",\n message: `Missing image asset ${webPath} (expected ${filePath})`,\n });\n }\n return issues;\n}\n\n/** Collect each concrete asset-field location value from frontmatter (arrays at `*`). */\nfunction collectAssetValues(\n container: unknown,\n path: string[],\n out: Array<{ fieldPath: string; value: string | undefined }>,\n fieldPathSoFar: string[] = [],\n): void {\n const [head, ...rest] = path;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n\n if (rest.length === 0) {\n const value = record[head];\n out.push({\n fieldPath: [...fieldPathSoFar, head].join(\".\"),\n value: typeof value === \"string\" ? value : undefined,\n });\n return;\n }\n\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (!Array.isArray(arr)) {\n // No array present: report a single absent location for attribution.\n out.push({ fieldPath: [...fieldPathSoFar, head, \"*\", ...rest.slice(1)].join(\".\"), value: undefined });\n return;\n }\n arr.forEach((item) => {\n collectAssetValues(item, rest.slice(1), out, [...fieldPathSoFar, head, \"*\"]);\n });\n return;\n }\n\n collectAssetValues(record[head], rest, out, [...fieldPathSoFar, head]);\n}\n\nfunction normalizeDir(dir: string): string {\n return `/${dir.replace(/^\\/+|\\/+$/g, \"\")}`;\n}\n\n/**\n * Validate declared `field.asset()` fields against the assets folder: required\n * fields present, files exist, values inside `dir`, extensions in `formats`,\n * sizes within `maxKB`, and templated paths materialized. Missing required or\n * present-but-absent files are errors; format/size violations are warnings.\n * Source frontmatter (unresolved) is expected. EN-sourced (structural) only.\n */\nexport function validateDeclaredAssetFields(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n locale?: string;\n frontmatter: Record<string, unknown>;\n schema: z.ZodTypeAny;\n },\n): AssetValidateIssue[] {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return [];\n\n const issues: AssetValidateIssue[] = [];\n const attrib = (fieldPath: string, level: \"error\" | \"warning\", message: string) =>\n issues.push({\n level,\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n field: fieldPath,\n message,\n });\n\n for (const f of listAssetFields(input.schema)) {\n const locations: Array<{ fieldPath: string; value: string | undefined }> = [];\n collectAssetValues(input.frontmatter, f.path, locations);\n\n for (const { fieldPath, value } of locations) {\n let effective = value;\n // Templated field with no explicit value: materialize the derived path.\n if (effective === undefined && f.assetTemplate) {\n effective = f.assetTemplate.split(\"{slug}\").join(input.enSlug);\n }\n\n if (effective === undefined) {\n if (!f.assetOptional) {\n attrib(fieldPath, \"error\", `${input.contentType}/${input.enSlug}: ${fieldPath} is required but missing`);\n }\n continue;\n }\n\n if (f.assetDir) {\n const dir = normalizeDir(f.assetDir);\n if (!(effective === dir || effective.startsWith(`${dir}/`))) {\n attrib(\n fieldPath,\n \"error\",\n `${input.contentType}/${input.enSlug}: ${fieldPath} value ${effective} is outside declared dir ${dir}`,\n );\n }\n }\n\n const filePath = assetFilePath(assetsPath, effective);\n if (!fs.existsSync(filePath)) {\n attrib(fieldPath, \"error\", `${input.contentType}/${input.enSlug}: ${fieldPath} → ${effective} not found`);\n continue;\n }\n\n if (f.assetFormats && f.assetFormats.length > 0) {\n const ext = path.extname(effective).slice(1).toLowerCase();\n if (!f.assetFormats.includes(ext)) {\n attrib(\n fieldPath,\n \"warning\",\n `${input.contentType}/${input.enSlug}: ${fieldPath} → ${effective} extension .${ext} not in formats [${f.assetFormats.join(\", \")}]`,\n );\n }\n }\n\n if (f.assetMaxKB !== undefined) {\n try {\n const sizeKB = fs.statSync(filePath).size / 1024;\n if (sizeKB > f.assetMaxKB) {\n attrib(\n fieldPath,\n \"warning\",\n `${input.contentType}/${input.enSlug}: ${fieldPath} → ${effective} is ${Math.round(sizeKB)}KB, over the ${f.assetMaxKB}KB budget`,\n );\n }\n } catch {\n /* stat failure already implies a missing file, handled above */\n }\n }\n }\n }\n\n return issues;\n}\n\n/** Source (unresolved) web paths of every declared asset field, for heuristic skip. */\nexport function collectDeclaredAssetPaths(\n frontmatter: Record<string, unknown>,\n enSlug: string,\n schema: z.ZodTypeAny,\n fields?: SchemaFieldMeta[],\n): Set<string> {\n const out = new Set<string>();\n for (const f of fields ?? listAssetFields(schema)) {\n const locations: Array<{ fieldPath: string; value: string | undefined }> = [];\n collectAssetValues(frontmatter, f.path, locations);\n for (const { value } of locations) {\n if (value !== undefined) out.add(value);\n else if (f.assetTemplate) out.add(f.assetTemplate.split(\"{slug}\").join(enSlug));\n }\n }\n return out;\n}\n","/** GEN-241: translated slugs must not end with a locale code suffix. */\n\nexport function findLocaleSuffixInSlug(\n slug: string,\n localeCodes: readonly string[],\n): string | undefined {\n const sorted = [...localeCodes].sort((a, b) => b.length - a.length);\n for (const code of sorted) {\n if (slug.endsWith(`-${code}`)) {\n return code;\n }\n }\n return undefined;\n}\n\nexport function stripLocaleSuffixFromSlug(\n slug: string,\n localeCodes: readonly string[],\n): { slug: string; stripped: boolean; matchedCode?: string } {\n const matchedCode = findLocaleSuffixInSlug(slug, localeCodes);\n if (!matchedCode) {\n return { slug, stripped: false };\n }\n return {\n slug: slug.slice(0, -(matchedCode.length + 1)),\n stripped: true,\n matchedCode,\n };\n}\n","import type Database from \"better-sqlite3\";\nimport { findLocaleSuffixInSlug } from \"../core/localized-slug.js\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\n\nexport interface SlugSuffixIssue {\n contentTypeId: string;\n enSlug: string;\n locale: string;\n slug: string;\n message: string;\n}\n\n/** GEN-241: translated slugs must not end with a locale code suffix. */\nexport function validateTranslationSlugSuffixes(\n config: ScribeConfig,\n db: Database.Database,\n): SlugSuffixIssue[] {\n const issues: SlugSuffixIssue[] = [];\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n\n for (const row of bulkLoadTranslations(db)) {\n if (row.locale === config.defaultLocale) continue;\n\n const matchedCode = findLocaleSuffixInSlug(row.slug, localeCodes);\n if (matchedCode) {\n issues.push({\n contentTypeId: row.content_type,\n enSlug: row.en_slug,\n locale: row.locale,\n slug: row.slug,\n message: `Translation slug \"${row.slug}\" ends with locale code \"-${matchedCode}\"`,\n });\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { extractInlineTokens } from \"../inline/tokens.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { buildEnSlugIndex } from \"./validate-relations.js\";\nimport type { ValidateIssue } from \"./validate-project.js\";\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every((v) => typeof v === \"string\");\n}\n\nfunction assetFileExists(config: ScribeConfig, webPath: string): boolean {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return true; // no asset system configured: cannot check\n return fs.existsSync(path.join(assetsPath, webPath.replace(/^\\//, \"\")));\n}\n\n/**\n * Validate `${{...}}` inline tokens in EN document bodies. Entry-level issues so\n * the studio badges pick them up automatically. Covers malformed syntax and each\n * token kind's referential integrity (relation target/slug, asset file, var\n * key). Static tokens are always valid.\n */\nexport function validateInlineTokens(config: ScribeConfig): ValidateIssue[] {\n const issues: ValidateIssue[] = [];\n const slugIndex = buildEnSlugIndex(config);\n const typeIds = new Set(config.types.map((t) => t.id));\n const typeById = new Map(config.types.map((t) => [t.id, t]));\n\n for (const type of config.types) {\n for (const enSlug of listEnSlugs(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n const { tokens, malformed } = extractInlineTokens(doc.content);\n\n for (const bad of malformed) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Malformed inline token (${bad.reason}): ${bad.raw}`,\n });\n }\n\n let varsReported = false;\n const vars = (doc.frontmatter as Record<string, unknown>).vars;\n\n for (const token of tokens) {\n switch (token.kind) {\n case \"static\":\n break;\n\n case \"relation\": {\n if (!typeIds.has(token.targetTypeId)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token targets unknown type \"${token.targetTypeId}\"`,\n });\n break;\n }\n const targetSlugs = slugIndex.get(token.targetTypeId) ?? new Set<string>();\n if (!targetSlugs.has(token.enSlug)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token references \"${token.enSlug}\", but no ${token.targetTypeId} doc has that slug`,\n });\n break;\n }\n if (token.mode === \"href\") {\n const targetType = typeById.get(token.targetTypeId)!;\n if (!isRoutableType(targetType)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token resolves a URL for \"${token.targetTypeId}\", which has no path template (not routable)`,\n });\n }\n }\n break;\n }\n\n case \"asset\": {\n if (!assetFileExists(config, token.webPath)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline asset token references ${token.webPath}, which is missing on disk`,\n });\n }\n break;\n }\n\n case \"var\": {\n if (vars !== undefined && !isStringRecord(vars)) {\n if (!varsReported) {\n varsReported = true;\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"vars\",\n message: `Frontmatter \"vars\" must be a string-to-string map`,\n });\n }\n break;\n }\n if (!isStringRecord(vars) || !(token.key in vars)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline var token references \"${token.key}\", absent from this document's vars map`,\n });\n }\n break;\n }\n }\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport { createProject } from \"../create-project.js\";\nimport { validateTypeRedirects } from \"./validate-redirects.js\";\nimport { validateLocaleBuiltinFields } from \"../core/builtin-fields.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { getTranslation } from \"../storage/translations.js\";\nimport { validateRelations } from \"./validate-relations.js\";\nimport {\n collectDeclaredAssetPaths,\n validateDeclaredAssetFields,\n validateDocumentAssets,\n} from \"./validate-assets.js\";\nimport { validateTranslationSlugSuffixes } from \"./validate-slug-suffix.js\";\nimport { validateInlineTokens } from \"./validate-inline-tokens.js\";\nimport { maskInlineTokensForMdx } from \"../inline/tokens.js\";\nimport { prepareTranslatedMdxBody, validateMdxBody } from \"../translate/validate-mdx-body.js\";\n\nexport interface ValidateIssue {\n level: \"error\" | \"warning\" | \"info\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\nexport interface ValidateResult {\n ok: boolean;\n issues: ValidateIssue[];\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/**\n * Read the raw MDX body of a bodyless-type EN entry (the loader zeroes it, so we\n * re-read the source) and report an error when it holds anything but whitespace.\n */\nfunction validateBodylessEntry(\n issues: ValidateIssue[],\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): void {\n const contentDir = path.join(config.rootDir, type.contentDir);\n for (const ext of [\".mdx\", \".md\"]) {\n const filePath = path.join(contentDir, `${enSlug}${ext}`);\n if (!fs.existsSync(filePath)) continue;\n const body = matter(fs.readFileSync(filePath, \"utf8\")).content;\n if (body.trim().length > 0) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `type \"${type.id}\" is frontmatter-only (body: false) but the entry has body content`,\n });\n }\n return;\n }\n}\n\nfunction validateDocumentMdxBody(\n issues: ValidateIssue[],\n input: {\n contentType: string;\n enSlug: string;\n locale: string;\n body: string;\n },\n): void {\n // Mask inline tokens (and escapes) to inert text first so their `${{`/`{{`\n // braces never register as MDX parse errors. Well-formed and malformed tokens\n // alike are neutralized here; malformed ones are reported by the dedicated\n // inline-token validation pass instead.\n const preparedBody = prepareTranslatedMdxBody(maskInlineTokensForMdx(input.body)).body;\n const mdxValidation = validateMdxBody(preparedBody);\n if (!mdxValidation.ok) {\n issues.push({\n level: \"error\",\n contentType: input.contentType,\n enSlug: input.enSlug,\n locale: input.locale,\n field: \"body\",\n message: `Invalid MDX: ${mdxValidation.error}`,\n });\n }\n}\n\n/** Validate EN files, SQLite consistency, relations, aliases, slug rules, and assets. */\nexport function validateProject(config: ScribeConfig): ValidateResult {\n const issues: ValidateIssue[] = [];\n const project = createProject(config);\n const storePath = project.storePath;\n\n if (!fs.existsSync(storePath)) {\n issues.push({\n level: \"error\",\n message: `Missing store.sqlite at ${storePath}`,\n });\n return { ok: false, issues };\n }\n\n const db = openStore(config, \"readonly\");\n\n for (const type of config.types) {\n const enSlugs = listEnSlugs(config.rootDir, type.contentDir);\n const englishSlugs = new Set(enSlugs);\n\n if (!type.translate && isRoutableType(type)) {\n issues.push({\n level: \"warning\",\n contentType: type.id,\n message: `No translate config on content type \"${type.id}\" — using Scribe defaults`,\n });\n }\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n message: \"Failed to parse EN document\",\n });\n continue;\n }\n\n const crossIssues =\n type.crossValidate?.(enDoc.frontmatter as never, {\n locale: config.defaultLocale,\n defaultLocale: config.defaultLocale,\n slug: enSlug,\n enSlug,\n knownLocales: config.locales,\n englishSlugs,\n }) ?? [];\n for (const issue of crossIssues) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n // Declared asset fields are EN-sourced structural: validate on EN only.\n // Locale docs never store them, so they'd otherwise read as \"required missing\".\n for (const issue of validateDeclaredAssetFields(config, {\n contentType: type.id,\n enSlug,\n frontmatter: enDoc.frontmatter as Record<string, unknown>,\n schema: type.schema,\n })) {\n issues.push(issue);\n }\n\n // Skip declared-asset web paths in the heuristic pass (EN + locales) to\n // avoid double reporting the same missing file at different levels.\n const declaredAssetPaths = collectDeclaredAssetPaths(\n enDoc.frontmatter as Record<string, unknown>,\n enSlug,\n type.schema,\n );\n\n for (const issue of validateDocumentAssets(\n config,\n {\n contentType: type.id,\n enSlug,\n frontmatter: enDoc.frontmatter,\n body: enDoc.content,\n },\n declaredAssetPaths,\n )) {\n issues.push(issue);\n }\n\n if (type.body === false) {\n // Frontmatter-only type: no MDX body work; instead flag a stray body.\n validateBodylessEntry(issues, config, type, enSlug);\n } else {\n validateDocumentMdxBody(issues, {\n contentType: type.id,\n enSlug,\n locale: config.defaultLocale,\n body: enDoc.content,\n });\n }\n\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const row = getTranslation(db, type.id, enSlug, locale);\n if (!row) continue;\n\n const localeFm = JSON.parse(row.frontmatter_json) as Record<string, unknown>;\n for (const issue of validateLocaleBuiltinFields(localeFm)) {\n issues.push({\n level: issue.level,\n contentType: type.id,\n enSlug,\n locale,\n field: issue.field,\n message: issue.message,\n });\n }\n\n const preparedBody = prepareTranslatedMdxBody(row.body).body;\n for (const issue of validateDocumentAssets(\n config,\n {\n contentType: type.id,\n enSlug,\n locale,\n frontmatter: localeFm,\n body: preparedBody,\n },\n declaredAssetPaths,\n )) {\n issues.push(issue);\n }\n\n if (type.body !== false) {\n validateDocumentMdxBody(issues, {\n contentType: type.id,\n enSlug,\n locale,\n body: row.body,\n });\n }\n }\n }\n\n try {\n project.getType(type.id).load();\n } catch (error) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n message: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n db.close();\n\n for (const issue of validateTypeRedirects(project)) {\n issues.push(issue);\n }\n\n for (const issue of validateRelations(project)) {\n issues.push({\n level: issue.level,\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n field: issue.field,\n message: issue.message,\n });\n }\n\n for (const issue of validateInlineTokens(config)) {\n issues.push(issue);\n }\n\n const dbForSuffix = openStore(config, \"readonly\");\n try {\n for (const issue of validateTranslationSlugSuffixes(config, dbForSuffix)) {\n issues.push({\n level: \"warning\",\n contentType: issue.contentTypeId,\n enSlug: issue.enSlug,\n locale: issue.locale,\n field: \"slug\",\n message: issue.message,\n });\n }\n } finally {\n dbForSuffix.close();\n }\n\n return { ok: issues.every((i) => i.level !== \"error\"), issues };\n}\n","import { createHash } from \"node:crypto\";\n// tokens.js is dependency-light (it imports nothing back into hashing), so this\n// import introduces no cycle.\nimport { extractInlineTokens } from \"../inline/tokens.js\";\n\n/** SHA-256 hex digest of a UTF-8 string. */\nexport function sha256(input: string): string {\n return createHash(\"sha256\").update(input, \"utf8\").digest(\"hex\");\n}\n\n/** Hash translatable frontmatter + body for translation staleness detection. */\nexport function computePageEnHash(\n translatableFrontmatter: Record<string, unknown>,\n body: string,\n): string {\n const payload = JSON.stringify({ frontmatter: translatableFrontmatter, body });\n return sha256(payload);\n}\n\n/**\n * Canonical EN hash for translation staleness. Extracts inline tokens first and\n * hashes the PLACEHOLDER body, so a token's value never restales a locale while\n * adding/removing/moving tokens does. Every staleness-relevant site (translation\n * prepare, worklist, studio badges) MUST route through this so the two ends of a\n * comparison cannot diverge. A tokenless body hashes identically to\n * `computePageEnHash(frontmatter, body)`.\n */\nexport function computeTranslationEnHash(\n translatableFrontmatter: Record<string, unknown>,\n body: string,\n): string {\n const { placeholderBody } = extractInlineTokens(body);\n return computePageEnHash(translatableFrontmatter, placeholderBody);\n}\n\n/** Hash MDX body content for revision tracking. */\nexport function computeBodyHash(body: string): string {\n return sha256(body);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ContentTypeConfig, ScribeConfig } from \"../core/types.js\";\nimport { isTypeTranslatable } from \"../core/introspect-schema.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { computeTranslationEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation } from \"../storage/translations.js\";\n\nexport interface TranslationWorkItem {\n contentType: string;\n enSlug: string;\n locale: string;\n reason: \"missing\" | \"stale\" | \"forced\";\n currentEnHash: string;\n storedEnHash?: string;\n /**\n * Verbatim validation error from a prior attempt in the same run. Set only for\n * the one-shot retry round; appended to the prompt's locale-specific suffix so\n * the model can correct the exact issues.\n */\n previousError?: string;\n}\n\nexport type TranslationWorklistStrategy = \"all\" | \"missing-only\";\n\nexport interface WorklistOptions {\n /** Single id or comma-separated ids (e.g. `vertical,platform`). */\n contentType?: string;\n locales?: string[];\n enSlug?: string;\n /** Which pages to include: all stale/missing (default) or missing only. */\n strategy?: TranslationWorklistStrategy;\n /** Include fresh translations so prepareTranslation re-runs despite matching hashes. */\n force?: boolean;\n /**\n * Called once for each content type skipped because it is not translatable\n * (bodyless with no translatable fields). The CLI uses it to emit the\n * per-type \"skipped\" log line; other callers (studio) leave it unset for a\n * silent skip.\n */\n onSkipType?: (type: ContentTypeConfig) => void;\n}\n\nfunction parseContentTypeFilter(contentType?: string): Set<string> | undefined {\n if (!contentType) return undefined;\n const ids = contentType\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n return ids.length > 0 ? new Set(ids) : undefined;\n}\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\n/** List locale pages that are missing or stale vs current EN content. */\nexport function buildWorklist(config: ScribeConfig, options: WorklistOptions = {}): TranslationWorkItem[] {\n const db = openStore(config, \"readonly\");\n const items: TranslationWorkItem[] = [];\n const locales =\n options.locales ??\n config.locales.filter((locale) => locale !== config.defaultLocale);\n const contentTypes = parseContentTypeFilter(options.contentType);\n\n for (const type of config.types) {\n if (contentTypes && !contentTypes.has(type.id)) continue;\n // A type with nothing to translate (bodyless, no translatable fields) never\n // produces work items — it stays out of the worklist, staleness totals, and\n // the store. This is the single predicate every translation workflow shares.\n if (!isTypeTranslatable(type)) {\n options.onSkipType?.(type);\n continue;\n }\n const enSlugs = options.enSlug ? [options.enSlug] : listEnSlugs(config.rootDir, type.contentDir);\n\n for (const enSlug of enSlugs) {\n const enDoc = readEnDocument(config, type, enSlug);\n if (!enDoc) continue;\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computeTranslationEnHash(payload.frontmatter, payload.body);\n\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n const existing = getTranslation(db, type.id, enSlug, locale);\n if (!existing) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: \"missing\",\n currentEnHash,\n });\n continue;\n }\n const stale = existing.en_hash !== currentEnHash;\n if (stale || options.force) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: stale ? \"stale\" : \"forced\",\n currentEnHash,\n storedEnHash: existing.en_hash,\n });\n }\n }\n }\n }\n\n db.close();\n const strategy = options.strategy ?? \"all\";\n if (strategy === \"missing-only\") {\n return items.filter((item) => item.reason === \"missing\");\n }\n return items;\n}\n\n/** Resolve target locales from CLI flags or a named preset. */\nexport function resolveLocalesFromPreset(\n config: ScribeConfig,\n preset?: string,\n explicitLocales?: string[],\n): string[] {\n if (explicitLocales?.length) return explicitLocales;\n if (preset && config.localePresets?.[preset]) {\n return config.localePresets[preset]!.filter((l) => l !== config.defaultLocale);\n }\n return config.locales.filter((l) => l !== config.defaultLocale);\n}\n","import type Database from \"better-sqlite3\";\n\nexport type BatchItemStatus = \"pending\" | \"done\" | \"failed\" | \"stale-skipped\";\n\nexport interface BatchJobRow {\n id: number;\n job_name: string;\n model: string;\n display_model: string;\n created_at: string;\n state: string;\n completed_at: string | null;\n}\n\nexport interface BatchItemRow {\n job_id: number;\n request_index: number;\n content_type: string;\n en_slug: string;\n locale: string;\n en_hash: string;\n snapshot_id: number;\n status: BatchItemStatus;\n error: string | null;\n}\n\nexport interface BatchJobInput {\n jobName: string;\n model: string;\n displayModel: string;\n state: string;\n createdAt: string;\n}\n\nexport interface BatchItemInput {\n requestIndex: number;\n contentType: string;\n enSlug: string;\n locale: string;\n enHash: string;\n snapshotId: number;\n}\n\nexport function insertBatchJob(db: Database.Database, input: BatchJobInput): number {\n const info = db\n .prepare(\n `INSERT INTO translation_batch_jobs (job_name, model, display_model, created_at, state)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(input.jobName, input.model, input.displayModel, input.createdAt, input.state);\n return Number(info.lastInsertRowid);\n}\n\nexport function insertBatchItems(\n db: Database.Database,\n jobId: number,\n items: BatchItemInput[],\n): void {\n const stmt = db.prepare(\n `INSERT INTO translation_batch_items (\n job_id, request_index, content_type, en_slug, locale, en_hash, snapshot_id, status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')`,\n );\n for (const item of items) {\n stmt.run(\n jobId,\n item.requestIndex,\n item.contentType,\n item.enSlug,\n item.locale,\n item.enHash,\n item.snapshotId,\n );\n }\n}\n\n/** Jobs not yet fully ingested (no completed_at), oldest first. */\nexport function listPendingBatchJobs(db: Database.Database): BatchJobRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_jobs WHERE completed_at IS NULL ORDER BY id`)\n .all() as BatchJobRow[];\n}\n\nexport function listBatchItems(db: Database.Database, jobId: number): BatchItemRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_items WHERE job_id = ? ORDER BY request_index`)\n .all(jobId) as BatchItemRow[];\n}\n\n/** Pending items across all non-completed jobs (i.e. requests still in flight). */\nexport function listPendingBatchItems(db: Database.Database): BatchItemRow[] {\n return db\n .prepare(\n `SELECT i.* FROM translation_batch_items i\n JOIN translation_batch_jobs j ON j.id = i.job_id\n WHERE j.completed_at IS NULL AND i.status = 'pending'\n ORDER BY i.job_id, i.request_index`,\n )\n .all() as BatchItemRow[];\n}\n\n/**\n * Atomically claim a terminal job for ingestion by stamping completed_at.\n * Returns false when another process already completed it — concurrent scribe\n * runs adopt each other's pending jobs, so two pollers can reach the same\n * terminal job; only the one whose claim succeeds may ingest its results.\n */\nexport function claimBatchJobCompletion(\n db: Database.Database,\n jobId: number,\n state: string,\n completedAt: string,\n): boolean {\n const info = db\n .prepare(\n `UPDATE translation_batch_jobs SET state = ?, completed_at = ?\n WHERE id = ? AND completed_at IS NULL`,\n )\n .run(state, completedAt, jobId);\n return info.changes > 0;\n}\n\nexport function updateBatchItemStatus(\n db: Database.Database,\n jobId: number,\n requestIndex: number,\n status: BatchItemStatus,\n error?: string,\n): void {\n db.prepare(\n `UPDATE translation_batch_items SET status = ?, error = ? WHERE job_id = ? AND request_index = ?`,\n ).run(status, error ?? null, jobId, requestIndex);\n}\n","import type Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getOrCreateEnSnapshot } from \"../storage/translations.js\";\n\n/** Record (or reuse) a deduplicated EN-source snapshot for a translation run. */\nexport function recordEnSnapshot(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n },\n db?: Database.Database,\n): number {\n const ownDb = db ?? openStore(config, \"readwrite\");\n const id = getOrCreateEnSnapshot(ownDb, {\n contentType: input.contentType,\n enSlug: input.enSlug,\n enHash: input.enHash,\n frontmatter: input.frontmatter,\n body: input.body,\n createdAt: new Date().toISOString(),\n });\n if (!db) ownDb.close();\n return id;\n}\n","import { ApiError } from \"@google/genai\";\n\n/** HTTP status codes worth retrying: rate limiting + transient server errors. */\nconst TRANSIENT_STATUS = new Set([429, 500, 502, 503, 504]);\n\nfunction statusFromError(error: unknown): number | undefined {\n if (error instanceof ApiError && typeof error.status === \"number\") {\n return error.status;\n }\n // Some SDK paths surface a plain object/error with a numeric `status`.\n if (error && typeof error === \"object\" && \"status\" in error) {\n const status = (error as { status?: unknown }).status;\n if (typeof status === \"number\") return status;\n }\n // Fall back to matching a status code embedded in the message.\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/\\b(429|500|502|503|504)\\b/);\n if (match) return Number(match[1]);\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n const err = error as { code?: unknown; name?: unknown } | null;\n const code = typeof err?.code === \"string\" ? err.code : \"\";\n if (\n code === \"ECONNRESET\" ||\n code === \"ETIMEDOUT\" ||\n code === \"ECONNREFUSED\" ||\n code === \"ENOTFOUND\" ||\n code === \"EAI_AGAIN\" ||\n code === \"EPIPE\" ||\n code === \"UND_ERR_SOCKET\"\n ) {\n return true;\n }\n const message = error instanceof Error ? error.message.toLowerCase() : \"\";\n return (\n message.includes(\"network\") ||\n message.includes(\"fetch failed\") ||\n message.includes(\"socket hang up\") ||\n message.includes(\"terminated\")\n );\n}\n\n/** Classify whether an error is transient and safe to retry. */\nexport function isTransientError(error: unknown): boolean {\n const status = statusFromError(error);\n if (status !== undefined) return TRANSIENT_STATUS.has(status);\n return isNetworkError(error);\n}\n\nexport interface RetryOptions {\n attempts?: number;\n baseDelayMs?: number;\n /** Injectable sleep for tests; defaults to real setTimeout. */\n sleep?: (ms: number) => Promise<void>;\n /** Injectable jitter in [0, 1); defaults to Math.random. */\n random?: () => number;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/**\n * Run `fn` with exponential backoff + jitter, retrying only transient failures\n * (HTTP 429/5xx and network errors). Non-transient errors throw immediately.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const attempts = Math.max(1, options.attempts ?? 3);\n const baseDelayMs = options.baseDelayMs ?? 1000;\n const sleep = options.sleep ?? defaultSleep;\n const random = options.random ?? Math.random;\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (attempt >= attempts || !isTransientError(error)) throw error;\n // Exponential backoff with full jitter: attempt 1 -> ~1s, attempt 2 -> ~2-4s.\n const backoff = baseDelayMs * 2 ** (attempt - 1);\n const delay = backoff + random() * backoff;\n await sleep(delay);\n }\n }\n throw lastError;\n}\n","import {\n type BatchJob,\n GoogleGenAI,\n type JobState,\n type GenerateContentResponse,\n type InlinedRequest,\n} from \"@google/genai\";\nimport { withRetry } from \"./retry.js\";\n\n// The SDK documents JOB_STATE_* names but the live API reports BATCH_STATE_*;\n// the SDK maps only the states it knows to JOB_STATE_* and passes the rest\n// through, so both families (and states persisted in either form) must be\n// tolerated. Compare on the bare state name.\nconst STATE_FAMILY_PREFIX = /^(JOB_STATE_|BATCH_STATE_)/;\n\nconst TERMINAL_STATES = new Set([\n \"SUCCEEDED\",\n \"FAILED\",\n \"CANCELLED\",\n \"EXPIRED\",\n \"PARTIALLY_SUCCEEDED\",\n]);\n\nconst SUCCESSFUL_STATES = new Set([\"SUCCEEDED\", \"PARTIALLY_SUCCEEDED\"]);\n\n/** Strip the JOB_STATE_/BATCH_STATE_ family prefix: \"BATCH_STATE_RUNNING\" -> \"RUNNING\". */\nexport function normalizeBatchState(state: JobState | string | undefined): string {\n return String(state ?? \"UNKNOWN\").replace(STATE_FAMILY_PREFIX, \"\");\n}\n\nexport function isTerminalBatchState(state: JobState | string | undefined): boolean {\n return TERMINAL_STATES.has(normalizeBatchState(state));\n}\n\nexport function isSuccessfulBatchState(state: JobState | string | undefined): boolean {\n return SUCCESSFUL_STATES.has(normalizeBatchState(state));\n}\n\nfunction makeClient(apiKey?: string): GoogleGenAI {\n const key = apiKey ?? process.env.GEMINI_API_KEY;\n if (!key) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n return new GoogleGenAI({ apiKey: key });\n}\n\n/**\n * Extract the text payload from a batch GenerateContentResponse. Batch inlined\n * responses are plain JSON objects (the SDK does not rebuild the class), so the\n * `.text` getter is unavailable — read candidates/parts directly and skip\n * thought parts.\n */\nexport function textFromBatchResponse(response: GenerateContentResponse): string {\n if (typeof response.text === \"string\") return response.text;\n const parts = response.candidates?.[0]?.content?.parts ?? [];\n return parts\n .filter((part) => !part.thought && typeof part.text === \"string\")\n .map((part) => part.text)\n .join(\"\");\n}\n\n/** Submit one Gemini Batch API job with inlined requests. */\nexport async function createGeminiBatchJob(input: {\n /** API model id (already resolved from the display name). */\n model: string;\n requests: InlinedRequest[];\n apiKey?: string;\n displayName?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n const job = await withRetry(() =>\n ai.batches.create({\n model: input.model,\n src: input.requests,\n config: { displayName: input.displayName ?? `scribe-translate-${Date.now()}` },\n }),\n );\n if (!job.name) throw new Error(\"Gemini batch job was created without a name\");\n return job;\n}\n\n/** Fetch the current state (and, when terminal, results) of a batch job. */\nexport async function getGeminiBatchJob(input: {\n name: string;\n apiKey?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n return withRetry(() => ai.batches.get({ name: input.name }));\n}\n","import { ThinkingLevel, type ThinkingConfig } from \"@google/genai\";\n\n/** Display name -> Gemini API model id. Pricing and logs use the display name. */\nexport const GEMINI_MODEL_IDS: Record<string, string> = {\n \"gemini-2.5-pro\": \"gemini-2.5-pro\",\n \"gemini-3.1-pro\": \"gemini-3.1-pro-preview\",\n};\n\nexport const DEFAULT_GEMINI_MODEL = \"gemini-3.1-pro\";\n\nfunction stripModelsPrefix(model: string): string {\n return model.replace(/^models\\//, \"\");\n}\n\n/** Map a display name (or passthrough id) to the API model id. */\nexport function resolveGeminiModelId(model: string): string {\n const name = stripModelsPrefix(model);\n return GEMINI_MODEL_IDS[name] ?? name;\n}\n\n/** Normalize any model id/alias to the display name used for pricing. */\nexport function normalizeGeminiDisplayName(model: string): string {\n const name = stripModelsPrefix(model);\n if (name in GEMINI_MODEL_IDS) return name;\n\n const alias = Object.entries(GEMINI_MODEL_IDS).find(([, apiId]) => apiId === name);\n if (alias) return alias[0];\n\n return name;\n}\n\n/**\n * Resolve the thinking config to keep translation cheap and predictable.\n * - Gemini 3.x: `thinkingLevel: LOW` (the 2.5-style `thinkingBudget` is unsupported).\n * - Gemini 2.5-pro: cannot fully disable thinking; use the minimum budget of 128.\n * - Unknown/passthrough ids: LOW for \"gemini-3*\", budget 128 for ids containing \"2.5\",\n * otherwise no thinking config (let the model default).\n */\nexport function resolveThinkingConfig(apiModelId: string): ThinkingConfig | undefined {\n const id = stripModelsPrefix(apiModelId).toLowerCase();\n if (id.startsWith(\"gemini-3\")) return { thinkingLevel: ThinkingLevel.LOW };\n if (id.includes(\"2.5\")) return { thinkingBudget: 128 };\n return undefined;\n}\n","import { GoogleGenAI, type GenerateContentConfig, type GenerateContentResponse } from \"@google/genai\";\nimport {\n DEFAULT_GEMINI_MODEL,\n normalizeGeminiDisplayName,\n resolveGeminiModelId,\n resolveThinkingConfig,\n} from \"./gemini-models.js\";\nimport { withRetry } from \"./retry.js\";\n\nconst DEFAULT_MODEL = DEFAULT_GEMINI_MODEL;\n\nexport interface GeminiTokenUsage {\n inputTokens: number;\n /** Billed output tokens; INCLUDES thoughts tokens. */\n outputTokens: number;\n /** Thoughts (reasoning) tokens, billed as output. */\n thoughtsTokens: number;\n totalTokens: number;\n}\n\nexport interface GeminiTranslationResult {\n model: string;\n raw: string;\n parsed: {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n usage: GeminiTokenUsage;\n}\n\nfunction extractJson(text: string): string {\n const trimmed = text.trim();\n // Only strip a fence that wraps the entire payload, so fences inside string\n // values (e.g. a translated MDX body with ```ts blocks) are left untouched.\n const fenced = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```$/);\n if (fenced?.[1]) return fenced[1].trim();\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n return trimmed;\n}\n\nexport function parseGeminiResponse(text: string): {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n} {\n // With responseMimeType \"application/json\" the payload is already pure JSON.\n // Parse it directly first; only fall back to extraction when the model wraps\n // or pads the JSON (extraction is fragile when the body contains code fences).\n let parsed: { frontmatter?: Record<string, unknown>; body: string; slug?: string };\n try {\n parsed = JSON.parse(text.trim());\n } catch {\n parsed = JSON.parse(extractJson(text));\n }\n // Types without translatable frontmatter use a body-only response schema;\n // default the frontmatter so downstream merge/validation sees an object.\n if (parsed !== null && typeof parsed === \"object\" && parsed.frontmatter === undefined) {\n parsed.frontmatter = {};\n }\n return parsed as { frontmatter: Record<string, unknown>; body: string; slug?: string };\n}\n\n/**\n * Build the per-request generation config shared by the direct and batch paths.\n * The same shape is passed to `generateContent` and to each inlined batch request.\n */\nexport function buildGeminiRequestConfig(input: {\n apiModelId: string;\n responseSchema?: Record<string, unknown>;\n}): GenerateContentConfig {\n const thinkingConfig = resolveThinkingConfig(input.apiModelId);\n return {\n responseMimeType: \"application/json\",\n ...(input.responseSchema ? { responseSchema: input.responseSchema } : {}),\n ...(thinkingConfig ? { thinkingConfig } : {}),\n };\n}\n\ninterface WireUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n thoughtsTokenCount?: number;\n totalTokenCount?: number;\n prompt_token_count?: number;\n candidates_token_count?: number;\n thoughts_token_count?: number;\n total_token_count?: number;\n}\n\n/**\n * Extract token usage from a Gemini response; thoughts are folded into output.\n * Batch inlined responses arrive as raw JSON rather than SDK class instances,\n * so tolerate both camelCase and snake_case field names.\n */\nexport function usageFromResponse(response: GenerateContentResponse): GeminiTokenUsage {\n const meta = (response.usageMetadata ??\n (response as unknown as { usage_metadata?: WireUsageMetadata }).usage_metadata ??\n {}) as WireUsageMetadata;\n const thoughtsTokens = meta.thoughtsTokenCount ?? meta.thoughts_token_count ?? 0;\n return {\n inputTokens: meta.promptTokenCount ?? meta.prompt_token_count ?? 0,\n // candidatesTokenCount does not include thoughts, but thoughts are billed as\n // output tokens, so fold them in here for accurate cost accounting.\n outputTokens: (meta.candidatesTokenCount ?? meta.candidates_token_count ?? 0) + thoughtsTokens,\n thoughtsTokens,\n totalTokens: meta.totalTokenCount ?? meta.total_token_count ?? 0,\n };\n}\n\nexport async function translatePageWithGemini(input: {\n prompt: string;\n model?: string;\n apiKey?: string;\n responseSchema?: Record<string, unknown>;\n}): Promise<GeminiTranslationResult> {\n const apiKey = input.apiKey ?? process.env.GEMINI_API_KEY;\n if (!apiKey) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n\n const displayModel = normalizeGeminiDisplayName(\n input.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_MODEL,\n );\n const apiModel = resolveGeminiModelId(displayModel);\n const ai = new GoogleGenAI({ apiKey });\n const response = await withRetry(() =>\n ai.models.generateContent({\n model: apiModel,\n contents: input.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: apiModel,\n responseSchema: input.responseSchema,\n }),\n }),\n );\n\n const raw = response.text ?? \"\";\n const parsed = parseGeminiResponse(raw);\n\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n\n return { model: displayModel, raw, parsed, usage: usageFromResponse(response) };\n}\n","const CONTEXT_TIER_TOKENS = 200_000;\n\nexport interface TieredModelPricing {\n input: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n output: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n}\n\n/** display_name -> { input: (le_200k, gt_200k), output: (le_200k, gt_200k) } in USD per 1M tokens */\nexport const GEMINI_PRICING_USD: Record<string, TieredModelPricing> = {\n \"gemini-3.1-pro\": { input: [2.0, 4.0], output: [12.0, 18.0] },\n};\n\nfunction normalizeModelId(model: string): string {\n return model.replace(/^models\\//, \"\").toLowerCase();\n}\n\nfunction tierRate(tokens: number, tiers: readonly [number, number]): number {\n return tokens <= CONTEXT_TIER_TOKENS ? tiers[0] : tiers[1];\n}\n\nexport function resolveModelPricing(model: string): TieredModelPricing | undefined {\n const id = normalizeModelId(model);\n if (GEMINI_PRICING_USD[id]) return GEMINI_PRICING_USD[id];\n\n const match = Object.entries(GEMINI_PRICING_USD).find(([key]) => id.includes(key));\n return match?.[1];\n}\n\nexport type TranslationCostMode = \"interactive\" | \"batch\";\n\n/** Batch API tokens are billed at 50% of interactive rates. */\nconst BATCH_DISCOUNT = 0.5;\n\nexport function estimateTranslationCostUsd(\n model: string,\n inputTokens: number,\n outputTokens: number,\n mode: TranslationCostMode = \"interactive\",\n): number | undefined {\n const pricing = resolveModelPricing(model);\n if (!pricing) return undefined;\n\n const inputRate = tierRate(inputTokens, pricing.input);\n const outputRate = tierRate(outputTokens, pricing.output);\n const multiplier = mode === \"batch\" ? BATCH_DISCOUNT : 1;\n\n return (\n ((inputTokens / 1_000_000) * inputRate +\n (outputTokens / 1_000_000) * outputRate) *\n multiplier\n );\n}\n\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1_000_000) return `${(tokens / 1_000_000).toFixed(2)}M`;\n if (tokens >= 1_000) return `${(tokens / 1_000).toFixed(1)}k`;\n return String(tokens);\n}\n\nexport function formatUsd(amount: number | undefined): string {\n if (amount === undefined) return \"n/a\";\n if (amount >= 1) return `$${amount.toFixed(2)}`;\n if (amount >= 0.01) return `$${amount.toFixed(3)}`;\n return `$${amount.toFixed(4)}`;\n}\n","import type { ResolvedTranslateConfig } from \"../resolve-translate-config.js\";\nimport type { SlugStrategy } from \"../../core/types.js\";\n\nexport const LOCALE_NAMES: Record<string, string> = {\n fr: \"French\",\n es: \"Spanish\",\n de: \"German\",\n nl: \"Dutch\",\n uk: \"Ukrainian\",\n tr: \"Turkish\",\n da: \"Danish\",\n he: \"Hebrew\",\n \"zh-CN\": \"Simplified Chinese\",\n \"zh-TW\": \"Traditional Chinese\",\n pt: \"Portuguese\",\n \"pt-BR\": \"Brazilian Portuguese\",\n ja: \"Japanese\",\n ru: \"Russian\",\n it: \"Italian\",\n ar: \"Arabic\",\n};\n\nexport function defaultLocalizationPrompt(localeName: string, locale: string): string {\n return [\n `Write the content above in natural ${localeName} (${locale}), as if it had been originally authored by a native ${localeName} copywriter for that market.`,\n `Preserve the source tone and brand voice, but express every idea the way ${localeName} copy actually reads — never word-for-word.`,\n `Use native ${localeName} typographic conventions for quotation marks, apostrophes, and spacing around punctuation — not the source language's.`,\n `Before returning, re-read each ${localeName} sentence on its own: if it is ambiguous, unidiomatic, or reads like a translation, rewrite it.`,\n ].join(\" \");\n}\n\n/** Type/project `translate.prompt` extras are appended before the locale directive. */\nexport function buildLocalizationPrompt(\n promptOverride: string | undefined,\n localeName: string,\n locale: string,\n): string {\n const localeDirective = defaultLocalizationPrompt(localeName, locale);\n if (!promptOverride) return localeDirective;\n return `${promptOverride}\\n\\n${localeDirective}`;\n}\n\n/**\n * Static, locale-independent framing. Kept first so the whole prompt PREFIX\n * (framing + context + rules + EN payload) is byte-identical across every locale\n * of a given page, enabling Gemini implicit prefix caching. The locale-specific\n * localization directive lives in the SUFFIX, after the EN body.\n */\nconst TASK_FRAMING = [\n \"You are a native-speaker marketing copywriter producing the localized edition of the content below. The target language is specified at the end of this prompt.\",\n \"You are NOT translating a document. Each sentence in the source tells you the INTENT — what it must make the reader feel or understand. Write copy that accomplishes the same thing, the way a native copywriter would have written it from scratch.\",\n \"Never mirror the source sentence structure when the target language would naturally phrase the idea differently. Calqued syntax is the #1 failure mode.\",\n \"When the source uses wordplay, an idiom, or a punchy rhetorical device, recreate the effect rather than the words. If no natural equivalent exists, write a plain, confident line that carries the same message — never a literal rendering that sounds odd or ambiguous in the target language.\",\n].join(\"\\n\");\n\n/**\n * Describe the expected JSON keys. Mirrors buildGeminiResponseSchema: types\n * without translatable frontmatter get a body-only response (their structural\n * frontmatter is carried over from EN, not translated).\n */\nfunction buildOutputFormatLine(hasFrontmatter: boolean, slugStrategy: SlugStrategy): string {\n if (!hasFrontmatter) {\n return slugStrategy === \"localized\"\n ? \"`body` (string, full MDX body), `slug` (string).\"\n : \"`body` (string, full MDX body).\";\n }\n return slugStrategy === \"localized\"\n ? \"`frontmatter` (object with translated frontmatter fields), `body` (string, full MDX body), `slug` (string).\"\n : \"`frontmatter` (object), `body` (string).\";\n}\n\n/**\n * Build a page translation prompt whose prefix (everything up to and including\n * the EN body) does not vary with locale, and whose suffix carries all\n * locale-specific instructions. This lets Gemini reuse the cached prefix when the\n * same page is translated into multiple locales.\n */\n/**\n * Compose the retry-context section appended (locale-specific suffix only, never\n * the cached prefix) when a previous attempt was rejected by validation. The\n * validation errors are included verbatim so the model can fix the exact issues.\n */\nfunction buildRetryContextSection(previousError: string): string[] {\n return [\n \"\",\n \"## Previous attempt\",\n `A previous attempt at this translation was rejected with the following validation errors: ${previousError}. Produce a corrected translation that fixes these issues while re-checking every schema constraint (required fields, array minimums, maximum lengths).`,\n ];\n}\n\nexport function buildPageTranslationPrompt(input: {\n resolved: ResolvedTranslateConfig;\n targetLocale: string;\n contextLabel?: string;\n translatableFrontmatter: Record<string, unknown>;\n enBody: string;\n slugStrategy: SlugStrategy;\n /** Verbatim validation errors from a prior rejected attempt (retry round). */\n previousError?: string;\n}): string {\n const localeName = LOCALE_NAMES[input.targetLocale] ?? input.targetLocale;\n const localizationPrompt = buildLocalizationPrompt(\n input.resolved.promptOverride,\n localeName,\n input.targetLocale,\n );\n\n // PREFIX — locale-independent. Identical for every locale of a given page.\n const prefix = [\n TASK_FRAMING,\n \"\",\n ...(input.resolved.context ? [\"## Context\", input.resolved.context, \"\"] : []),\n ...(input.contextLabel ? [`Document: ${input.contextLabel}`, \"\"] : []),\n \"## Rules\",\n ...input.resolved.rules.map((rule) => `- ${rule}`),\n \"\",\n \"## EN translatable frontmatter (JSON)\",\n JSON.stringify(input.translatableFrontmatter, null, 2),\n \"\",\n \"## EN body (MDX)\",\n input.enBody,\n ];\n\n // SUFFIX — locale-specific. Everything that depends on the target locale must\n // come after the EN body so it never changes the cacheable prefix.\n const suffix = [\n \"\",\n \"## Target language\",\n localizationPrompt,\n ...(input.slugStrategy === \"localized\"\n ? [\n `The slug MUST be written in ${localeName}, derived from the ${localeName} title and its meaning — never the English slug.`,\n ]\n : []),\n \"\",\n \"## Output format\",\n \"Return ONLY valid JSON with keys:\",\n buildOutputFormatLine(\n Object.keys(input.translatableFrontmatter).length > 0,\n input.slugStrategy,\n ),\n // Retry context is locale-specific suffix material: it MUST stay after the\n // EN body so the cacheable prefix is byte-identical with and without it.\n ...(input.previousError ? buildRetryContextSection(input.previousError) : []),\n ];\n\n return [...prefix, ...suffix].join(\"\\n\");\n}\n","import { z } from \"zod\";\nimport { getFieldKind, peelOptionalWrappers } from \"../core/field.js\";\nimport type { SlugStrategy } from \"../core/types.js\";\n\nfunction getObjectShape(schema: z.ZodTypeAny): z.ZodRawShape | null {\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n return (base as z.ZodObject<z.ZodRawShape>).shape;\n }\n return null;\n}\n\nfunction getArraySchema(schema: z.ZodTypeAny): z.ZodArray | null {\n const base = peelOptionalWrappers(schema);\n if (\n base instanceof Object &&\n \"element\" in base &&\n (base as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return base as z.ZodArray;\n }\n return null;\n}\n\nfunction extractTranslatableFromStructural(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n const arraySchema = getArraySchema(schema);\n if (arraySchema) {\n const inner = buildTranslatableSubschema(arraySchema.element as z.ZodTypeAny);\n if (inner) return z.array(inner);\n return null;\n }\n if (getObjectShape(schema)) {\n return buildTranslatableSubschema(schema);\n }\n return null;\n}\n\n/** Build a Zod object schema containing only translatable fields (including nested in structural arrays). */\nexport function buildTranslatableSubschema(schema: z.ZodTypeAny): z.ZodObject | null {\n const shape = getObjectShape(schema);\n if (!shape) return null;\n\n const out: Record<string, z.ZodTypeAny> = {};\n for (const [key, child] of Object.entries(shape)) {\n const childSchema = child as z.ZodTypeAny;\n const kind = getFieldKind(childSchema);\n if (kind === \"translatable\") {\n out[key] = peelOptionalWrappers(childSchema);\n } else if (kind === \"structural\") {\n const nested = extractTranslatableFromStructural(childSchema);\n if (nested) out[key] = nested;\n }\n }\n\n if (Object.keys(out).length === 0) return null;\n return z.object(out);\n}\n\n/**\n * Like `buildTranslatableSubschema`, but only includes keys present in the EN\n * translatable payload. Prevents the model from hallucinating nested structural\n * arrays (e.g. blog `itemList`) when the source document has none.\n */\nexport function buildTranslatableSubschemaForPayload(\n schema: z.ZodTypeAny,\n translatableFrontmatter: Record<string, unknown>,\n): z.ZodObject | null {\n const full = buildTranslatableSubschema(schema);\n if (!full) return null;\n\n const filtered: Record<string, z.ZodTypeAny> = {};\n for (const [key, childSchema] of Object.entries(full.shape)) {\n if (!(key in translatableFrontmatter)) continue;\n const value = translatableFrontmatter[key];\n if (value === undefined || value === null) continue;\n filtered[key] = childSchema as z.ZodTypeAny;\n }\n\n if (Object.keys(filtered).length === 0) return null;\n return z.object(filtered);\n}\n\n/**\n * JSON Schema for Gemini structured output: `{ frontmatter, body, slug? }`.\n * Types without translatable frontmatter get a body-only schema (Gemini\n * rejects OBJECT schemas with empty `properties`); parsing then defaults the\n * missing frontmatter to `{}`. Skipping the schema entirely instead would\n * leave the model free-handing JSON, which fails often on MDX bodies\n * (unescaped newlines, trailing prose after the JSON).\n */\nexport function buildGeminiResponseSchema(\n schema: z.ZodTypeAny,\n slugStrategy: SlugStrategy,\n translatableFrontmatter?: Record<string, unknown>,\n): Record<string, unknown> | null {\n try {\n const translatable =\n translatableFrontmatter !== undefined\n ? buildTranslatableSubschemaForPayload(schema, translatableFrontmatter)\n : buildTranslatableSubschema(schema);\n\n const responseShape: Record<string, z.ZodTypeAny> = {\n ...(translatable ? { frontmatter: translatable } : {}),\n body: z.string(),\n };\n if (slugStrategy === \"localized\") {\n responseShape.slug = z.string();\n }\n\n const jsonSchema = z.toJSONSchema(z.object(responseShape), {\n target: \"draft-2020-12\",\n unrepresentable: \"any\",\n io: \"output\",\n }) as Record<string, unknown>;\n delete jsonSchema.$schema;\n return jsonSchema;\n } catch {\n return null;\n }\n}\n","import type {\n ContentTypeConfig,\n ScribeConfig,\n ScribeTranslateDefaults,\n SlugStrategy,\n TranslateConfig,\n} from \"../core/types.js\";\n\nexport interface ResolvedTranslateConfig {\n promptOverride?: string;\n context?: string;\n rules: string[];\n model?: string;\n}\n\nconst BUILTIN_TRANSLATE_RULES = [\n \"Placeholders written as %%1%%, %%2%%, %%3%% (double percent signs around a number) are immutable. Reproduce each placeholder that appears in the source EXACTLY as-is, exactly once, and never translate, edit, renumber, or add spaces inside it. You may move a placeholder to a different position within its sentence when the target grammar requires it.\",\n \"Do not translate brand or product names unless the brand has a well-known localized name in the target market (rare). Keep the original spelling and capitalization.\",\n \"Return the MDX body with real line breaks; do not use JSON escape sequences like \\\\n or \\\\t in the body string.\",\n 'In JSX attributes (e.g. FaqItem question=\"...\"), use single quotes when the value contains double-quote characters (e.g. Hebrew דוא\"ל), or escape them as \\\\\".',\n \"Match the EN source format: when the EN body uses Markdown/MDX (headings, paragraphs, GFM tables, links), keep that structure in the translation. Do not convert markdown elements into raw HTML (<p>, <h2>, <table>, etc.).\",\n \"Otherwise match the format and components used in the EN source.\",\n];\n\nfunction slugStrategyRules(slugStrategy: SlugStrategy): string[] {\n if (slugStrategy === \"localized\") {\n return [\n \"Provide a URL slug in JSON field `slug` that is Localized into the target language.\",\n \"Base the slug on the meaning of the translated title — do NOT reuse the English slug words.\",\n \"Slug MUST be ASCII only: a-z, 0-9, hyphens. No uppercase, accents, underscores, or spaces.\",\n \"For non-Latin languages, write the words in the target language and transliterate them into Latin script (e.g. Russian -> romanized Russian, not English).\",\n \"Do NOT append locale codes to the slug (e.g. -fr, -he, -zh-cn). Locale routing is handled by the URL prefix, not the slug.\",\n \"Preserve 4-digit years and proper nouns in slugs.\",\n ];\n }\n return [\"Do NOT output a slug — slugStrategy is fixed.\"];\n}\n\nfunction mergeContext(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n): string | undefined {\n const parts = [project?.context, type?.context].filter(Boolean);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : undefined;\n}\n\nfunction mergeTranslateConfig(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n slugStrategy: SlugStrategy,\n): ResolvedTranslateConfig {\n return {\n promptOverride: type?.prompt ?? project?.prompt,\n context: mergeContext(project, type),\n rules: [\n ...BUILTIN_TRANSLATE_RULES,\n ...(project?.rules ?? []),\n ...(type?.rules ?? []),\n ...slugStrategyRules(slugStrategy),\n ],\n model: type?.model ?? project?.defaultModel,\n };\n}\n\n/** Merge project and content-type translation settings. */\nexport function resolveTranslateConfig(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ResolvedTranslateConfig {\n return mergeTranslateConfig(config.translate, type.translate, type.slugStrategy);\n}\n","import type { z } from \"zod\";\nimport type { ScribeDocument } from \"../core/types.js\";\nimport { mergeStructuralOntoLocale, pickTranslatable, pruneOrphanNestedTranslations } from \"../core/introspect-schema.js\";\n\nexport function formatZodIssues(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n}\n\n/** Strip non-translatable keys from Gemini frontmatter output. */\nexport function sanitizeTranslatedFrontmatter(\n rawFrontmatter: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n return pickTranslatable(rawFrontmatter, schema);\n}\n\n/** Validate locale frontmatter against the full content schema (merged with EN structural fields). */\nexport function validateTranslatedFrontmatter(\n enDoc: ScribeDocument,\n localeFrontmatter: Record<string, unknown>,\n typeSchema: z.ZodTypeAny,\n): { ok: true; frontmatter: Record<string, unknown> } | { ok: false; error: string } {\n const enFrontmatter = enDoc.frontmatter as Record<string, unknown>;\n const frontmatter = pruneOrphanNestedTranslations(\n sanitizeTranslatedFrontmatter(localeFrontmatter, typeSchema),\n enFrontmatter,\n typeSchema,\n );\n const merged = mergeStructuralOntoLocale(frontmatter, enFrontmatter, typeSchema);\n const parsed = typeSchema.safeParse(merged);\n if (!parsed.success) {\n return { ok: false, error: formatZodIssues(parsed.error) };\n }\n return { ok: true, frontmatter };\n}\n","import { stripLocaleSuffixFromSlug } from \"../core/localized-slug.js\";\nimport type { ContentTypeConfig, ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { computeTranslationEnHash } from \"../hash/page-hash.js\";\nimport { countMarkerOccurrences, extractInlineTokens, placeholderMarker } from \"../inline/tokens.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation, upsertTranslation } from \"../storage/translations.js\";\nimport type { GeminiTokenUsage } from \"./gemini-client.js\";\nimport { estimateTranslationCostUsd, type TranslationCostMode } from \"./gemini-pricing.js\";\nimport { DEFAULT_GEMINI_MODEL, normalizeGeminiDisplayName } from \"./gemini-models.js\";\nimport { buildPageTranslationPrompt } from \"./prompts/translation-prompt.js\";\nimport { buildGeminiResponseSchema } from \"./response-schema.js\";\nimport { resolveTranslateConfig } from \"./resolve-translate-config.js\";\nimport { assertValidTranslatedMdxBody } from \"./validate-mdx-body.js\";\nimport { validateTranslatedFrontmatter } from \"./validate-translation.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport type TranslateMode = \"batch\" | \"direct\";\n\nexport interface TranslatePageResult {\n contentType: string;\n enSlug: string;\n locale: string;\n skipped: boolean;\n failed?: boolean;\n reason?: \"fresh\" | \"in-flight\";\n model?: string;\n usage?: GeminiTokenUsage;\n estimatedCostUsd?: number;\n durationMs?: number;\n error?: string;\n slugAdjusted?: { from: string; to: string; matchedCode: string };\n mdxAdjusted?: boolean;\n}\n\nexport interface TranslateWorklistTotals {\n translated: number;\n skipped: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n durationMs: number;\n}\n\nexport type TranslateProgressEvent =\n | {\n type: \"start\";\n total: number;\n concurrency: number;\n dryRun: boolean;\n model?: string;\n mode?: TranslateMode;\n }\n | { type: \"item-start\"; item: TranslationWorkItem; active: string[] }\n | { type: \"item-done\"; result: TranslatePageResult }\n | {\n type: \"batch-submitted\";\n name: string;\n count: number;\n model?: string;\n jobIndex: number;\n jobCount: number;\n resumed?: boolean;\n /** ISO timestamp of the job's actual submission (persisted created_at). */\n createdAt?: string;\n }\n | {\n type: \"batch-polling\";\n name: string;\n state: string;\n /** Elapsed since the job was submitted (not since the CLI started). */\n elapsedMs: number;\n jobIndex: number;\n jobCount: number;\n }\n | {\n type: \"batch-done\";\n name: string;\n state: string;\n model?: string;\n count: number;\n jobIndex: number;\n jobCount: number;\n translated: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n /** Elapsed since the job was submitted. */\n elapsedMs: number;\n /**\n * True when a concurrent scribe process won the ingestion claim: the\n * job's results were saved by that process, this one has nothing to add.\n */\n alreadyIngested?: boolean;\n }\n | {\n /**\n * Emitted once, after the main pass, when validation failures will be\n * retried. Carries the failed items so reporters can print the recap.\n */\n type: \"retry-start\";\n failed: TranslatePageResult[];\n }\n | {\n type: \"done\";\n results: TranslatePageResult[];\n totals: TranslateWorklistTotals;\n /** How many results in `results` succeeded only on the retry round. */\n retriedTranslated?: number;\n };\n\n/** Stable identity for a worklist item / batch item row. */\nexport function translationItemKey(item: {\n contentType?: string;\n content_type?: string;\n enSlug?: string;\n en_slug?: string;\n locale: string;\n}): string {\n const contentType = item.contentType ?? item.content_type ?? \"\";\n const enSlug = item.enSlug ?? item.en_slug ?? \"\";\n return `${contentType}\\u0000${enSlug}\\u0000${item.locale}`;\n}\n\nexport function summarizeResults(\n results: TranslatePageResult[],\n durationMs: number,\n): TranslateWorklistTotals {\n return results.reduce<TranslateWorklistTotals>(\n (totals, result) => {\n if (result.failed) totals.failed += 1;\n else if (result.skipped) totals.skipped += 1;\n else totals.translated += 1;\n\n totals.inputTokens += result.usage?.inputTokens ?? 0;\n totals.outputTokens += result.usage?.outputTokens ?? 0;\n totals.estimatedCostUsd += result.estimatedCostUsd ?? 0;\n return totals;\n },\n {\n translated: 0,\n skipped: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n durationMs,\n },\n );\n}\n\nexport function formatTranslateError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n try {\n const parsed = JSON.parse(message) as { error?: { message?: string } };\n if (parsed.error?.message) return parsed.error.message;\n } catch {\n // not JSON\n }\n const embedded = message.match(/\"message\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)\"/);\n if (embedded?.[1]) {\n return embedded[1].replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n return message.length > 160 ? `${message.slice(0, 157)}…` : message;\n}\n\n/**\n * Post-receive verification: a translated body must reproduce every inline-token\n * marker `%%1%%..%%N%%` (N = tokens in the current EN body) exactly once. A model\n * that drops, duplicates, or mangles a marker fails the row so it retries.\n */\nexport function verifyInlineMarkers(enRawBody: string, translatedBody: string): void {\n const { tokens } = extractInlineTokens(enRawBody);\n if (tokens.length === 0) return;\n const missing: string[] = [];\n const duplicated: string[] = [];\n for (let i = 1; i <= tokens.length; i++) {\n const count = countMarkerOccurrences(translatedBody, i);\n if (count === 0) missing.push(placeholderMarker(i));\n else if (count > 1) duplicated.push(placeholderMarker(i));\n }\n if (missing.length === 0 && duplicated.length === 0) return;\n const parts: string[] = [];\n if (missing.length > 0) parts.push(`missing ${missing.join(\", \")}`);\n if (duplicated.length > 0) parts.push(`duplicated ${duplicated.join(\", \")}`);\n throw new Error(`Inline token markers mismatch: ${parts.join(\"; \")}`);\n}\n\nfunction resolveContextLabel(enDoc: ScribeDocument, enSlug: string): string {\n const fm = enDoc.frontmatter as Record<string, unknown>;\n for (const key of [\"title\", \"name\", \"h1\"]) {\n const value = fm[key];\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return enSlug;\n}\n\nexport function baseForItem(\n item: TranslationWorkItem,\n): Pick<TranslatePageResult, \"contentType\" | \"enSlug\" | \"locale\"> {\n return {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n };\n}\n\n/** Everything needed to submit and finalize one translation request. */\nexport interface PreparedTranslation {\n item: TranslationWorkItem;\n type: ContentTypeConfig;\n enDoc: ScribeDocument;\n payload: { frontmatter: Record<string, unknown>; body: string };\n currentEnHash: string;\n existingSlug?: string;\n /** Configured model (may be undefined; env/default applies downstream). */\n model?: string;\n prompt: string;\n responseSchema?: Record<string, unknown>;\n}\n\nexport type PrepareOutcome =\n | { status: \"ready\"; prepared: PreparedTranslation }\n | { status: \"done\"; result: TranslatePageResult };\n\n/**\n * Shared pre-flight for the direct and batch paths: read the EN doc, skip when\n * the stored translation is fresh, and build the prompt + response schema.\n * Throws on unrecoverable item errors (unknown type, missing EN doc).\n */\nexport function prepareTranslation(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; force?: boolean },\n startedAt: number,\n): PrepareOutcome {\n const type = config.types.find((t) => t.id === item.contentType);\n if (!type) throw new Error(`Unknown content type ${item.contentType}`);\n\n const enDoc = readEnDocument(config, type, item.enSlug);\n if (!enDoc) throw new Error(`EN document not found: ${item.enSlug}`);\n\n const payload = getTranslatablePayload(enDoc, type);\n // Hash and translate the PLACEHOLDER body (tokens swapped for inert `%%n%%`\n // markers): a token's VALUE never affects the hash, so changing a relation\n // target / asset path / var value never staleness-flags a locale, while\n // adding/removing/moving tokens does. The hash goes through the shared helper\n // so it can never diverge from the worklist's staleness check.\n const { placeholderBody } = extractInlineTokens(payload.body);\n const currentEnHash = computeTranslationEnHash(payload.frontmatter, payload.body);\n\n const db = openStore(config, \"readonly\");\n const existing = getTranslation(db, type.id, item.enSlug, item.locale);\n db.close();\n\n if (!options.force && existing && existing.en_hash === currentEnHash) {\n return {\n status: \"done\",\n result: {\n ...baseForItem(item),\n skipped: true,\n reason: \"fresh\",\n durationMs: Date.now() - startedAt,\n },\n };\n }\n\n const resolvedTranslate = resolveTranslateConfig(config, type);\n const model = options.model ?? resolvedTranslate.model;\n\n const prompt = buildPageTranslationPrompt({\n resolved: resolvedTranslate,\n targetLocale: item.locale,\n contextLabel: resolveContextLabel(enDoc, item.enSlug),\n translatableFrontmatter: payload.frontmatter,\n enBody: placeholderBody,\n slugStrategy: type.slugStrategy,\n previousError: item.previousError,\n });\n\n const responseSchema = buildGeminiResponseSchema(\n type.schema,\n type.slugStrategy,\n payload.frontmatter,\n );\n\n return {\n status: \"ready\",\n prepared: {\n item,\n type,\n enDoc,\n payload,\n currentEnHash,\n existingSlug: existing?.slug,\n model,\n prompt,\n responseSchema: responseSchema ?? undefined,\n },\n };\n}\n\n/**\n * Shared post-processing for the direct and batch paths: strip locale suffixes\n * from the slug, validate frontmatter + MDX body, snapshot the EN source and\n * upsert the translation. Never throws — failures come back as a failed result.\n * Pass `snapshotId` when the EN snapshot was already recorded (batch submission\n * time) so ingestion does not depend on the current EN files.\n */\nexport function finalizeTranslation(\n config: ScribeConfig,\n prepared: PreparedTranslation,\n output: {\n model: string;\n parsed: { frontmatter: Record<string, unknown>; body: string; slug?: string };\n usage: GeminiTokenUsage;\n },\n options: { costMode: TranslationCostMode; startedAt: number; snapshotId?: number },\n): TranslatePageResult {\n const { item, type, enDoc, payload } = prepared;\n const base = baseForItem(item);\n\n try {\n const rawSlug =\n type.slugStrategy === \"localized\"\n ? (output.parsed.slug ?? prepared.existingSlug ?? item.enSlug)\n : item.enSlug;\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n const { slug, stripped, matchedCode } = stripLocaleSuffixFromSlug(rawSlug, localeCodes);\n const slugAdjusted =\n stripped && matchedCode ? { from: rawSlug, to: slug, matchedCode } : undefined;\n\n const validated = validateTranslatedFrontmatter(enDoc, output.parsed.frontmatter, type.schema);\n if (!validated.ok) {\n throw new Error(`Translation validation failed: ${validated.error}`);\n }\n\n // Bodyless types (`body: false`) never persist a body: the translatable\n // payload excluded it, so any body the model echoed back is dropped and the\n // MDX validation pass is skipped.\n const { body: translatedBody, adjusted: mdxAdjusted } =\n type.body === false\n ? { body: \"\", adjusted: false }\n : assertValidTranslatedMdxBody(output.parsed.body);\n\n // Placeholder markers must survive translation intact (choke point shared by\n // the direct and batch paths). `payload.body` is the raw EN body used to\n // build this translation, so its token count matches the markers the model\n // was asked to reproduce.\n verifyInlineMarkers(payload.body, translatedBody);\n\n const writeDb = openStore(config, \"readwrite\");\n const snapshotId =\n options.snapshotId ??\n recordEnSnapshot(\n config,\n {\n contentType: type.id,\n enSlug: item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: payload.frontmatter,\n body: payload.body,\n },\n writeDb,\n );\n upsertTranslation(writeDb, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n slug,\n frontmatter: validated.frontmatter,\n body: translatedBody,\n enHash: prepared.currentEnHash,\n translatedAt: new Date().toISOString(),\n model: output.model,\n snapshotId,\n });\n writeDb.close();\n\n const estimatedCostUsd = estimateTranslationCostUsd(\n normalizeGeminiDisplayName(output.model),\n output.usage.inputTokens,\n output.usage.outputTokens,\n options.costMode,\n );\n\n return {\n ...base,\n skipped: false,\n model: output.model,\n usage: output.usage,\n estimatedCostUsd,\n durationMs: Date.now() - options.startedAt,\n slugAdjusted,\n mdxAdjusted: mdxAdjusted || undefined,\n };\n } catch (error) {\n return {\n ...base,\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - options.startedAt,\n };\n }\n}\n\nexport function displayModelFor(prepared: PreparedTranslation): string {\n return normalizeGeminiDisplayName(\n prepared.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_GEMINI_MODEL,\n );\n}\n","import type { BatchJob } from \"@google/genai\";\nimport type { ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport {\n claimBatchJobCompletion,\n insertBatchItems,\n insertBatchJob,\n listBatchItems,\n listPendingBatchItems,\n listPendingBatchJobs,\n updateBatchItemStatus,\n type BatchItemRow,\n type BatchJobRow,\n} from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getEnSnapshot, getTranslation } from \"../storage/translations.js\";\nimport {\n createGeminiBatchJob,\n getGeminiBatchJob,\n isSuccessfulBatchState,\n isTerminalBatchState,\n normalizeBatchState,\n textFromBatchResponse,\n} from \"./gemini-batch.js\";\nimport { buildGeminiRequestConfig, parseGeminiResponse, usageFromResponse } from \"./gemini-client.js\";\nimport {\n baseForItem,\n finalizeTranslation,\n formatTranslateError,\n translationItemKey,\n type PreparedTranslation,\n type TranslatePageResult,\n type TranslateProgressEvent,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\n// The Gemini Batch API caps inline (non-file) submissions at 20MB of request\n// payload per job; the SDK types expose no explicit request-count limit. Stay\n// conservative: chunk at 100 requests or ~15MB of prompt text per job,\n// whichever comes first, leaving headroom for JSON envelope + schemas.\nexport const MAX_REQUESTS_PER_JOB = 100;\nexport const MAX_PROMPT_BYTES_PER_JOB = 15 * 1024 * 1024;\n\nconst INITIAL_POLL_MS = 5_000;\nconst MAX_POLL_MS = 30_000;\nconst POLL_BACKOFF_FACTOR = 1.5;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface BatchPlanEntry {\n apiModel: string;\n prompt: string;\n}\n\nexport interface BatchJobPlan<T extends BatchPlanEntry> {\n apiModel: string;\n entries: T[];\n}\n\n/**\n * Group entries by API model, then chunk each group by request count and total\n * prompt bytes so every plan fits in one inline batch job.\n */\nexport function planBatchJobs<T extends BatchPlanEntry>(entries: T[]): BatchJobPlan<T>[] {\n const byModel = new Map<string, T[]>();\n for (const entry of entries) {\n const group = byModel.get(entry.apiModel);\n if (group) group.push(entry);\n else byModel.set(entry.apiModel, [entry]);\n }\n\n const plans: BatchJobPlan<T>[] = [];\n for (const [apiModel, group] of byModel) {\n let current: T[] = [];\n let currentBytes = 0;\n for (const entry of group) {\n const size = Buffer.byteLength(entry.prompt, \"utf8\");\n if (\n current.length > 0 &&\n (current.length >= MAX_REQUESTS_PER_JOB || currentBytes + size > MAX_PROMPT_BYTES_PER_JOB)\n ) {\n plans.push({ apiModel, entries: current });\n current = [];\n currentBytes = 0;\n }\n current.push(entry);\n currentBytes += size;\n }\n if (current.length > 0) plans.push({ apiModel, entries: current });\n }\n return plans;\n}\n\nexport interface PendingBatchWork {\n jobs: BatchJobRow[];\n /** translationItemKey() of every request still in flight. */\n inFlightKeys: Set<string>;\n pendingItems: BatchItemRow[];\n}\n\n/**\n * Load non-completed batch jobs and their in-flight items from the store.\n * Opens the store readwrite so migrations run before the new tables are read.\n */\nexport function readPendingBatchWork(config: ScribeConfig): PendingBatchWork {\n const db = openStore(config, \"readwrite\");\n const jobs = listPendingBatchJobs(db);\n const pendingItems = listPendingBatchItems(db);\n db.close();\n const inFlightKeys = new Set(pendingItems.map((item) => translationItemKey(item)));\n return { jobs, inFlightKeys, pendingItems };\n}\n\nexport interface SubmitPlanInput<T extends BatchPlanEntry & { prepared: PreparedTranslation }> {\n plan: BatchJobPlan<T>;\n displayModel: string;\n jobIndex: number;\n jobCount: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n}\n\n/**\n * Submit one planned job and persist it (job row + item rows + EN snapshots)\n * immediately, before any polling starts, so an interrupt loses nothing.\n */\nexport async function submitBatchJobPlan<\n T extends BatchPlanEntry & { prepared: PreparedTranslation },\n>(config: ScribeConfig, input: SubmitPlanInput<T>): Promise<BatchJobRow> {\n const { plan, displayModel, jobIndex, jobCount } = input;\n const job = await createGeminiBatchJob({\n model: plan.apiModel,\n requests: plan.entries.map(({ prepared }) => ({\n contents: prepared.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: plan.apiModel,\n responseSchema: prepared.responseSchema,\n }),\n })),\n displayName: `scribe-translate-${new Date().toISOString().replace(/[:.]/g, \"-\")}-${jobIndex + 1}`,\n });\n\n const createdAt = new Date().toISOString();\n const db = openStore(config, \"readwrite\");\n const jobId = insertBatchJob(db, {\n jobName: job.name!,\n model: plan.apiModel,\n displayModel,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n createdAt,\n });\n insertBatchItems(\n db,\n jobId,\n plan.entries.map(({ prepared }, requestIndex) => ({\n requestIndex,\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n locale: prepared.item.locale,\n enHash: prepared.currentEnHash,\n // Snapshot the EN source now so ingestion after a resume does not depend\n // on the EN files still matching (or existing) on disk.\n snapshotId: recordEnSnapshot(\n config,\n {\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: prepared.payload.frontmatter,\n body: prepared.payload.body,\n },\n db,\n ),\n })),\n );\n const row: BatchJobRow = {\n id: jobId,\n job_name: job.name!,\n model: plan.apiModel,\n display_model: displayModel,\n created_at: createdAt,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n completed_at: null,\n };\n db.close();\n\n input.onProgress?.({\n type: \"batch-submitted\",\n name: job.name!,\n count: plan.entries.length,\n model: displayModel,\n jobIndex,\n jobCount,\n createdAt,\n });\n return row;\n}\n\n/** The subset of a Gemini BatchJob that ingestion needs (test-friendly). */\nexport interface BatchJobResultLike {\n state?: string;\n error?: { message?: string };\n dest?: { inlinedResponses?: Array<{ response?: unknown; error?: { message?: string } }> };\n}\n\n/**\n * Reconstruct a finalize-ready context from a persisted batch item. Prefers the\n * EN doc on disk (for structural frontmatter merging); falls back to the stored\n * EN snapshot when the file is gone.\n */\nfunction buildIngestContext(\n config: ScribeConfig,\n db: ReturnType<typeof openStore>,\n jobRow: BatchJobRow,\n itemRow: BatchItemRow,\n): PreparedTranslation {\n const type = config.types.find((t) => t.id === itemRow.content_type);\n if (!type) throw new Error(`Unknown content type ${itemRow.content_type}`);\n\n let enDoc: ScribeDocument | null = readEnDocument(config, type, itemRow.en_slug);\n if (!enDoc) {\n const snapshot = getEnSnapshot(db, itemRow.snapshot_id);\n if (!snapshot) {\n throw new Error(\n `EN document and snapshot #${itemRow.snapshot_id} not found for ${itemRow.en_slug}`,\n );\n }\n enDoc = {\n slug: itemRow.en_slug,\n enSlug: itemRow.en_slug,\n locale: config.defaultLocale,\n noindex: false,\n frontmatter: JSON.parse(snapshot.frontmatter_json) as Record<string, unknown>,\n content: snapshot.body,\n };\n }\n\n const item: TranslationWorkItem = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n reason: \"missing\",\n currentEnHash: itemRow.en_hash,\n };\n return {\n item,\n type,\n enDoc,\n // Unused on ingest: finalizeTranslation receives the pre-recorded snapshotId.\n payload: { frontmatter: enDoc.frontmatter as Record<string, unknown>, body: enDoc.content },\n currentEnHash: itemRow.en_hash,\n existingSlug: getTranslation(db, type.id, itemRow.en_slug, itemRow.locale)?.slug,\n model: jobRow.display_model,\n prompt: \"\",\n responseSchema: undefined,\n };\n}\n\n/**\n * Ingest a terminal batch job: run every pending item through the shared\n * finalize path (or mark it failed), update item statuses, and mark the job\n * completed. Returns one result per pending item, or null when a concurrent\n * scribe process already claimed and ingested the job (runs adopt each\n * other's pending jobs, so two pollers can reach the same terminal job).\n *\n * The completion claim is stamped before items are processed so exactly one\n * process ingests. Ingestion is synchronous end-to-end; should a hard kill\n * still land mid-way, the leftover items are no longer counted in-flight and\n * the next run simply resubmits them.\n */\nexport function ingestBatchJob(\n config: ScribeConfig,\n jobRow: BatchJobRow,\n batchJob: BatchJobResultLike,\n onResult?: (result: TranslatePageResult) => void,\n): TranslatePageResult[] | null {\n const state = String(batchJob.state ?? \"UNKNOWN\");\n const db = openStore(config, \"readwrite\");\n if (!claimBatchJobCompletion(db, jobRow.id, state, new Date().toISOString())) {\n db.close();\n return null;\n }\n const pendingItems = listBatchItems(db, jobRow.id).filter((item) => item.status === \"pending\");\n const results: TranslatePageResult[] = [];\n\n const failItem = (itemRow: BatchItemRow, message: string, startedAt: number): void => {\n const result: TranslatePageResult = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n skipped: false,\n failed: true,\n error: formatTranslateError(new Error(message)),\n durationMs: Date.now() - startedAt,\n };\n updateBatchItemStatus(db, jobRow.id, itemRow.request_index, \"failed\", result.error);\n results.push(result);\n onResult?.(result);\n };\n\n if (isSuccessfulBatchState(state)) {\n const responses = batchJob.dest?.inlinedResponses ?? [];\n for (const itemRow of pendingItems) {\n const startedAt = Date.now();\n const inlined = responses[itemRow.request_index];\n if (!inlined || inlined.error || !inlined.response) {\n failItem(\n itemRow,\n inlined?.error?.message ??\n (inlined ? \"Batch response missing content\" : \"Batch response missing\"),\n startedAt,\n );\n continue;\n }\n let result: TranslatePageResult;\n try {\n const response = inlined.response as Parameters<typeof usageFromResponse>[0];\n const raw = textFromBatchResponse(response);\n const parsed = parseGeminiResponse(raw);\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n const prepared = buildIngestContext(config, db, jobRow, itemRow);\n result = finalizeTranslation(\n config,\n prepared,\n { model: jobRow.display_model, parsed, usage: usageFromResponse(response) },\n { costMode: \"batch\", startedAt, snapshotId: itemRow.snapshot_id },\n );\n } catch (error) {\n failItem(itemRow, error instanceof Error ? error.message : String(error), startedAt);\n continue;\n }\n updateBatchItemStatus(\n db,\n jobRow.id,\n itemRow.request_index,\n result.failed ? \"failed\" : \"done\",\n result.error,\n );\n results.push(result);\n onResult?.(result);\n }\n } else {\n // FAILED / CANCELLED / EXPIRED: every in-flight item fails with the job error.\n const message =\n batchJob.error?.message ?? `Batch job ended in state ${normalizeBatchState(state)}`;\n const startedAt = Date.now();\n for (const itemRow of pendingItems) {\n failItem(itemRow, message, startedAt);\n }\n }\n\n db.close();\n return results;\n}\n\n/**\n * Poll every tracked job together and ingest each one the moment it reaches a\n * terminal state — no job waits for another. The first status check happens\n * immediately so already-finished jobs (resume) ingest without delay.\n */\nexport async function pollAndIngestBatchJobs(\n config: ScribeConfig,\n jobs: BatchJobRow[],\n options: {\n jobCount?: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n onResult?: (result: TranslatePageResult) => void;\n } = {},\n): Promise<void> {\n const jobCount = options.jobCount ?? jobs.length;\n const active = jobs.map((row, jobIndex) => ({ row, jobIndex }));\n const loopStartedAt = Date.now();\n let delay = INITIAL_POLL_MS;\n let firstRound = true;\n\n // Elapsed anchors to the job's actual submission time, so resumed jobs show\n // their true age rather than time since this CLI started.\n const elapsedFor = (row: BatchJobRow): number => {\n const createdAtMs = Date.parse(row.created_at);\n return Number.isNaN(createdAtMs) ? Date.now() - loopStartedAt : Date.now() - createdAtMs;\n };\n\n while (active.length > 0) {\n if (!firstRound) {\n await sleep(delay);\n delay = Math.min(delay * POLL_BACKOFF_FACTOR, MAX_POLL_MS);\n }\n firstRound = false;\n\n for (const tracked of [...active]) {\n const batchJob: BatchJob = await getGeminiBatchJob({ name: tracked.row.job_name });\n const state = normalizeBatchState(batchJob.state);\n options.onProgress?.({\n type: \"batch-polling\",\n name: tracked.row.job_name,\n state,\n elapsedMs: elapsedFor(tracked.row),\n jobIndex: tracked.jobIndex,\n jobCount,\n });\n if (isTerminalBatchState(batchJob.state)) {\n active.splice(active.indexOf(tracked), 1);\n const results = ingestBatchJob(\n config,\n tracked.row,\n batchJob as BatchJobResultLike,\n options.onResult,\n );\n if (results === null) {\n // A concurrent scribe process claimed the job first; its results\n // are already in the store. Report that instead of zero counts.\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: 0,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n elapsedMs: elapsedFor(tracked.row),\n alreadyIngested: true,\n });\n continue;\n }\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: results.length,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: results.filter((r) => !r.failed && !r.skipped).length,\n failed: results.filter((r) => r.failed).length,\n inputTokens: results.reduce((sum, r) => sum + (r.usage?.inputTokens ?? 0), 0),\n outputTokens: results.reduce((sum, r) => sum + (r.usage?.outputTokens ?? 0), 0),\n estimatedCostUsd: results.reduce((sum, r) => sum + (r.estimatedCostUsd ?? 0), 0),\n elapsedMs: elapsedFor(tracked.row),\n });\n }\n }\n }\n}\n\n/** Result shape helper for items that never reached submission. */\nexport function failedResultForItem(\n item: TranslationWorkItem,\n error: unknown,\n startedAt: number,\n): TranslatePageResult {\n return {\n ...baseForItem(item),\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - startedAt,\n };\n}\n","import type { ScribeConfig } from \"../core/types.js\";\nimport { listBatchItems, type BatchJobRow } from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n failedResultForItem,\n planBatchJobs,\n pollAndIngestBatchJobs,\n readPendingBatchWork,\n submitBatchJobPlan,\n} from \"./batch-worklist.js\";\nimport { translatePageWithGemini } from \"./gemini-client.js\";\nimport { normalizeGeminiDisplayName, resolveGeminiModelId } from \"./gemini-models.js\";\nimport {\n baseForItem,\n displayModelFor,\n finalizeTranslation,\n prepareTranslation,\n summarizeResults,\n translationItemKey,\n type PreparedTranslation,\n type PrepareOutcome,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport {\n finalizeTranslation,\n type PreparedTranslation,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n};\n\nasync function runPool<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) return;\n let nextIndex = 0;\n const runners = Array.from({ length: Math.min(concurrency, items.length) }, async () => {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n await worker(items[index]!, index);\n }\n });\n await Promise.all(runners);\n}\n\nfunction labelForItem(item: TranslationWorkItem): string {\n return `${item.contentType}/${item.enSlug}@${item.locale}`;\n}\n\n/**\n * Build the retry worklist from the failed results of a completed pass. Each\n * retry item carries the original item's EN hash plus the verbatim error from\n * the failed attempt, so the retry prompt can ask the model to fix exactly those\n * validation issues. Items whose failure has no original work item (e.g. resumed\n * batch items from a prior run) are rebuilt from the result alone; `force` is set\n * so a freshly-upserted-then-rejected slot is not treated as up to date.\n */\nexport function buildRetryWorklist(\n failed: TranslatePageResult[],\n originalByKey: Map<string, TranslationWorkItem>,\n): TranslationWorkItem[] {\n return failed.map((result) => {\n const key = translationItemKey(result);\n const original = originalByKey.get(key);\n return {\n contentType: result.contentType,\n enSlug: result.enSlug,\n locale: result.locale,\n reason: original?.reason ?? \"missing\",\n currentEnHash: original?.currentEnHash ?? \"\",\n storedEnHash: original?.storedEnHash,\n previousError: result.error ?? \"Translation failed\",\n };\n });\n}\n\n/**\n * Re-translate a set of already-failed items exactly once, appending each item's\n * verbatim validation error to the prompt suffix. Batch runs submit the retry\n * items as one additional batch job (batch-priced); direct runs retry with a\n * direct pool honoring `concurrency`. Pending jobs from prior runs are NOT\n * touched here — this only covers the items that failed in the just-finished\n * pass. Returns one result per retry item (translated or newly failed); these\n * items are never retried a second time within the run.\n */\nexport async function runRetryRound(\n config: ScribeConfig,\n retryItems: TranslationWorkItem[],\n options: {\n model?: string;\n force?: boolean;\n concurrency: number;\n mode: TranslateMode;\n onResult: (result: TranslatePageResult) => void;\n onProgress?: (event: TranslateProgressEvent) => void;\n /** Injectable single-item translator (tests); defaults to translatePage. */\n translateOne?: (\n item: TranslationWorkItem,\n ) => Promise<TranslatePageResult>;\n },\n): Promise<void> {\n const startedAt = Date.now();\n // force: the failed pass may have left nothing stored, but if a stale row\n // exists we must still re-translate rather than skip as fresh.\n const translateOne =\n options.translateOne ??\n ((item: TranslationWorkItem) =>\n translatePage(config, item, { model: options.model, force: true }));\n\n if (options.mode === \"direct\") {\n const active = new Set<string>();\n await runPool(retryItems, options.concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translateOne(item);\n active.delete(label);\n options.onResult(result);\n });\n return;\n }\n\n // Batch retry: prepare, plan one job group, submit, poll+ingest — the same\n // machinery as the main batch pass but scoped to just the retry items and\n // without adopting any pending jobs.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of retryItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, { model: options.model, force: true }, itemStartedAt);\n if (outcome.status === \"done\") {\n options.onResult(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n options.onResult(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: planIndex,\n jobCount: plans.length,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n options.onResult(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll = submitted.filter((row): row is BatchJobRow => row !== undefined);\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount: jobsToPoll.length,\n onProgress: options.onProgress,\n onResult: options.onResult,\n });\n }\n}\n\n/**\n * Translate one locale page via a direct (interactive) Gemini call and upsert\n * into SQLite. Used by the studio server and other single-page callers; the\n * worklist path defaults to the Batch API instead.\n */\nexport async function translatePage(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<TranslatePageResult> {\n const startedAt = Date.now();\n\n let outcome: PrepareOutcome;\n try {\n outcome = prepareTranslation(config, item, options, startedAt);\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n if (outcome.status === \"done\") return outcome.result;\n const prepared = outcome.prepared;\n\n if (options.dryRun) {\n return {\n ...baseForItem(item),\n skipped: false,\n model: prepared.model,\n durationMs: Date.now() - startedAt,\n };\n }\n\n try {\n const result = await translatePageWithGemini({\n prompt: prepared.prompt,\n model: prepared.model,\n responseSchema: prepared.responseSchema,\n });\n return finalizeTranslation(\n config,\n prepared,\n { model: result.model, parsed: result.parsed, usage: result.usage },\n { costMode: \"interactive\", startedAt },\n );\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n}\n\ninterface ResultCollector {\n emit: (result: TranslatePageResult) => void;\n assemble: () => TranslatePageResult[];\n}\n\n/**\n * Route results into their input worklist slot (by item identity) so output\n * order matches input; results with no matching input item (resumed jobs from\n * a previous run) are appended after.\n */\nfunction createResultCollector(\n items: TranslationWorkItem[],\n onProgress?: (event: TranslateProgressEvent) => void,\n): ResultCollector {\n const slotByKey = new Map<string, number>();\n items.forEach((item, index) => slotByKey.set(translationItemKey(item), index));\n const slots: (TranslatePageResult | undefined)[] = new Array(items.length);\n const extras: TranslatePageResult[] = [];\n\n return {\n emit(result) {\n const slot = slotByKey.get(translationItemKey(result));\n if (slot !== undefined && slots[slot] === undefined) slots[slot] = result;\n else extras.push(result);\n onProgress?.({ type: \"item-done\", result });\n },\n assemble() {\n return [\n ...slots.filter((result): result is TranslatePageResult => result !== undefined),\n ...extras,\n ];\n },\n };\n}\n\n/**\n * Translate a batch of worklist items. By default the whole worklist goes\n * through the Gemini Batch API (50% token pricing): jobs are planned upfront\n * (grouped by model, chunked by size), submitted together, persisted for\n * resumability, then polled until every job lands. `mode: \"direct\"` restores\n * the interactive per-page pool (where `concurrency` applies). Any pending\n * jobs from a previous interrupted run are polled and ingested alongside the\n * new work, and their in-flight items are excluded from resubmission.\n */\nexport async function translateWorklist(\n config: ScribeConfig,\n items: TranslationWorkItem[],\n options: {\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n concurrency?: number;\n mode?: TranslateMode;\n onProgress?: (event: TranslateProgressEvent) => void;\n } = {},\n): Promise<TranslatePageResult[]> {\n const mode: TranslateMode = options.mode ?? \"batch\";\n const concurrency = Math.max(1, options.concurrency ?? 3);\n const startedAt = Date.now();\n\n // Dry run: report per-item work without touching the API or pending jobs.\n if (options.dryRun) {\n options.onProgress?.({\n type: \"start\",\n total: items.length,\n concurrency,\n dryRun: true,\n model: options.model,\n mode,\n });\n const results = items.map((item) => {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n return outcome.status === \"done\"\n ? outcome.result\n : {\n ...baseForItem(item),\n skipped: false,\n model: outcome.prepared.model,\n durationMs: Date.now() - itemStartedAt,\n };\n } catch (error) {\n return failedResultForItem(item, error, itemStartedAt);\n }\n });\n for (const result of results) options.onProgress?.({ type: \"item-done\", result });\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n }\n\n // Pending jobs from a previous run are polled alongside the new work; their\n // in-flight items are excluded from resubmission (their results arrive when\n // the pending job is ingested).\n const pending = readPendingBatchWork(config);\n const inputKeys = new Set(items.map((item) => translationItemKey(item)));\n const resumedExtraCount = pending.pendingItems.filter(\n (item) => !inputKeys.has(translationItemKey(item)),\n ).length;\n\n options.onProgress?.({\n type: \"start\",\n total: items.length + resumedExtraCount,\n concurrency,\n dryRun: false,\n model: options.model,\n mode,\n });\n\n const collector = createResultCollector(items, options.onProgress);\n const workItems = items.filter((item) => !pending.inFlightKeys.has(translationItemKey(item)));\n\n if (mode === \"direct\") {\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, pending.jobs.length, options.onProgress);\n const active = new Set<string>();\n await Promise.all([\n runPool(workItems, concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translatePage(config, item, options);\n active.delete(label);\n collector.emit(result);\n }),\n pending.jobs.length > 0\n ? pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: collector.emit,\n })\n : Promise.resolve(),\n ]);\n } else {\n // Prepare every remaining item; fresh pages skip, broken items fail.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of workItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n if (outcome.status === \"done\") {\n collector.emit(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n collector.emit(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const jobCount = pending.jobs.length + plans.length;\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, jobCount, options.onProgress);\n\n // Submit every job upfront (concurrently), persisting each as soon as its\n // create call returns — Ctrl+C during polling loses nothing.\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: pending.jobs.length + planIndex,\n jobCount,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n collector.emit(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll: BatchJobRow[] = [\n ...pending.jobs,\n ...submitted.filter((row): row is BatchJobRow => row !== undefined),\n ];\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount,\n onProgress: options.onProgress,\n onResult: collector.emit,\n });\n }\n }\n\n const mainResults = collector.assemble();\n\n // One-shot retry round: re-translate every validation failure once, feeding\n // the verbatim error back into the prompt suffix. Items still failing after\n // this are not retried again in the same run.\n const failed = mainResults.filter((result) => result.failed);\n if (failed.length === 0) {\n const totals = summarizeResults(mainResults, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results: mainResults, totals });\n return mainResults;\n }\n\n options.onProgress?.({ type: \"retry-start\", failed });\n\n const originalByKey = new Map<string, TranslationWorkItem>(\n items.map((item) => [translationItemKey(item), item]),\n );\n const retryItems = buildRetryWorklist(failed, originalByKey);\n const retryByKey = new Map<string, TranslatePageResult>();\n await runRetryRound(config, retryItems, {\n model: options.model,\n force: options.force,\n concurrency,\n mode,\n onProgress: options.onProgress,\n onResult: (result) => {\n retryByKey.set(translationItemKey(result), result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n // Merge: replace each failed slot with its retry outcome (translated or newly\n // failed). Results with no retry outcome (should not happen) keep the original.\n const results = mainResults.map((result) => {\n if (!result.failed) return result;\n return retryByKey.get(translationItemKey(result)) ?? result;\n });\n const retriedTranslated = failed.filter((original) => {\n const retried = retryByKey.get(translationItemKey(original));\n return retried !== undefined && !retried.failed && !retried.skipped;\n }).length;\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals, retriedTranslated });\n return results;\n}\n\nfunction countPendingItems(config: ScribeConfig, jobs: BatchJobRow[]): Map<number, number> {\n if (jobs.length === 0) return new Map();\n const db = openStore(config, \"readonly\");\n const counts = new Map<number, number>();\n for (const job of jobs) {\n counts.set(job.id, listBatchItems(db, job.id).filter((i) => i.status === \"pending\").length);\n }\n db.close();\n return counts;\n}\n\nfunction emitResumedJobs(\n jobs: BatchJobRow[],\n counts: Map<number, number>,\n jobCount: number,\n onProgress?: (event: TranslateProgressEvent) => void,\n): void {\n jobs.forEach((job, jobIndex) => {\n onProgress?.({\n type: \"batch-submitted\",\n name: job.job_name,\n count: counts.get(job.id) ?? 0,\n model: job.display_model,\n jobIndex,\n jobCount,\n resumed: true,\n createdAt: job.created_at,\n });\n });\n}\n\n/**\n * Poll and ingest pending batch jobs from a previous run without submitting\n * anything new (`scribe translate --resume`). Returns null when there is\n * nothing to resume.\n */\nexport async function resumeTranslationJobs(\n config: ScribeConfig,\n options: { onProgress?: (event: TranslateProgressEvent) => void } = {},\n): Promise<TranslatePageResult[] | null> {\n const startedAt = Date.now();\n const pending = readPendingBatchWork(config);\n if (pending.jobs.length === 0) return null;\n\n options.onProgress?.({\n type: \"start\",\n total: pending.pendingItems.length,\n concurrency: 1,\n dryRun: false,\n mode: \"batch\",\n });\n const counts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, counts, pending.jobs.length, options.onProgress);\n\n const results: TranslatePageResult[] = [];\n await pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: (result) => {\n results.push(result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n}\n","import matter from \"gray-matter\";\n\nexport interface ParsedMdx {\n frontmatter: Record<string, unknown>;\n content: string;\n}\n\nexport function parseMdx(raw: string): ParsedMdx {\n const parsed = matter(raw);\n return {\n frontmatter: parsed.data as Record<string, unknown>,\n content: parsed.content,\n };\n}\n\nexport function serializeMdx(frontmatter: Record<string, unknown>, content: string): string {\n return matter.stringify(content, frontmatter);\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { isRoutableType, pathPrefix, createUrlBuilder } from \"../i18n/build-url.js\";\nimport { serializeMdx } from \"../loader/parse-mdx.js\";\n\nexport interface StaticRawExport {\n /** Path relative to the output root (e.g. `blog/foo.mdx`, `fr/glossary/bar.mdx`). */\n relativePath: string;\n /** Public URL pathname (e.g. `/blog/foo.mdx`, `/fr/glossary/bar.mdx`). */\n urlPath: string;\n locale: string;\n typeId: string;\n enSlug: string;\n /** Full MDX source (YAML frontmatter + body). */\n source: string;\n}\n\nexport interface BuildStaticRawExportsOptions {\n /** File extension including the dot. Default `.mdx`. */\n extension?: `.${string}`;\n /** Content type ids to export. Default: all routable types. */\n types?: string[];\n /** Locales to export. Default: `config.locales`. */\n locales?: readonly string[];\n /** Skip documents where `resolve()` sets `shouldRedirectTo`. Default `true`. */\n excludeRedirected?: boolean;\n /** Skip documents with `noindex: true`. Default `false`. */\n excludeNoindex?: boolean;\n}\n\nfunction normalizeExtension(ext: string): `.${string}` {\n return (ext.startsWith(\".\") ? ext : `.${ext}`) as `.${string}`;\n}\n\n/** Segment name for export directories, e.g. `blog` from `/blog/{slug}`. */\nexport function exportDirSegment(pathTemplate: string): string {\n const prefix = pathPrefix(pathTemplate);\n return prefix.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Relative directory roots to clean before writing static exports.\n * EN: `{segment}/` (e.g. `blog/`). Prefixed locales: `{locale}/{segment}/`.\n */\nexport function getStaticExportRoots(\n project: ScribeProject,\n options: { types?: string[]; locales?: readonly string[] } = {},\n): string[] {\n const { config } = project;\n const locales = options.locales ?? config.locales;\n const typeFilter = options.types ? new Set(options.types) : null;\n const roots = new Set<string>();\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n const segment = exportDirSegment(type.config.path!);\n roots.add(`${segment}/`);\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n roots.add(`${locale}/${segment}/`);\n }\n }\n\n return [...roots].sort();\n}\n\n/** Build static raw MDX exports for all routable content types. */\nexport function buildStaticRawExports(\n project: ScribeProject,\n options: BuildStaticRawExportsOptions = {},\n): StaticRawExport[] {\n const { config } = project;\n const extension = normalizeExtension(options.extension ?? \".mdx\");\n const locales = options.locales ?? config.locales;\n const excludeRedirected = options.excludeRedirected ?? true;\n const excludeNoindex = options.excludeNoindex ?? false;\n const typeFilter = options.types ? new Set(options.types) : null;\n\n const out: StaticRawExport[] = [];\n const urlBuilder = createUrlBuilder(config);\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n\n const pathTemplate = type.config.path!;\n const all = type.load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) continue;\n\n for (const locale of locales) {\n for (const enDoc of enIdx.bySlug.values()) {\n const resolved = type.resolve(enDoc.slug, locale);\n if (!resolved.document) continue;\n if (excludeRedirected && resolved.shouldRedirectTo) continue;\n if (excludeNoindex && resolved.document.noindex) continue;\n\n const doc = resolved.document;\n const slugWithExt = `${doc.slug}${extension}`;\n const urlPath = urlBuilder.resolvePath(pathTemplate, slugWithExt, locale);\n\n out.push({\n relativePath: urlPath.slice(1),\n urlPath,\n locale,\n typeId: type.id,\n enSlug: doc.enSlug,\n source: serializeMdx(doc.frontmatter, doc.content),\n });\n }\n }\n }\n\n return out;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport {\n buildStaticRawExports,\n getStaticExportRoots,\n type BuildStaticRawExportsOptions,\n} from \"./build-static-raw-exports.js\";\n\nexport interface WriteStaticRawExportsOptions extends BuildStaticRawExportsOptions {\n /** Output directory (typically `public`). Default `public`. */\n outDir?: string;\n}\n\nfunction rmDirIfExists(dir: string): void {\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/** Remove managed export roots, write fresh static raw MDX files, return exports written. */\nexport function writeStaticRawExports(\n project: ScribeProject,\n options: WriteStaticRawExportsOptions = {},\n): { exports: ReturnType<typeof buildStaticRawExports>; written: number } {\n const outDir = path.resolve(options.outDir ?? \"public\");\n const typeFilter = options.types;\n\n for (const root of getStaticExportRoots(project, {\n types: typeFilter,\n locales: options.locales,\n })) {\n rmDirIfExists(path.join(outDir, root));\n }\n\n const exports = buildStaticRawExports(project, options);\n const counts = new Map<string, number>();\n\n for (const item of exports) {\n const filePath = path.join(outDir, item.relativePath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, item.source, \"utf8\");\n const key = `${item.typeId}/${item.locale}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n for (const [key, count] of [...counts.entries()].sort()) {\n console.log(` ${key}: ${count}`);\n }\n\n return { exports, written: exports.length };\n}\n","import type { OnTargetDelete } from \"../core/field.js\";\nimport {\n listAssetFields,\n listRelationFields,\n type SchemaFieldMeta,\n} from \"../core/introspect-schema.js\";\nimport type { ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { extractInlineTokens } from \"../inline/tokens.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n countEnSnapshotsForEnSlug,\n countTranslationsForEnSlug,\n} from \"../storage/translations.js\";\n\n/**\n * Deletion planning for `scribe delete` (CLI + studio). One module computes the\n * full impact of deleting an entry — transitive cascades, reference detaches,\n * blockers, asset files, and store rows — so both surfaces render and execute\n * exactly the same plan. See `docs/deletion.md`.\n */\n\n/** The requested deletion (and any title for display). */\nexport interface DeletionRoot {\n typeId: string;\n enSlug: string;\n title?: string;\n}\n\n/** A document deleted transitively because it cascaded from a deleted target. */\nexport interface DeletionCascade {\n typeId: string;\n enSlug: string;\n /** Human-readable edge that pulled it in, e.g. `model=alice`. */\n via: string;\n}\n\n/** A surviving document whose reference to a deleted target is removed. */\nexport interface DeletionDetach {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n removedSlug: string;\n}\n\n/** A document that prevents the deletion (restrict, or a required single relation). */\nexport interface DeletionBlocker {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n reason: \"restrict\" | \"required-single\";\n}\n\n/** An asset file owned by a deleted document. */\nexport interface DeletionAsset {\n path: string;\n ownerTypeId: string;\n ownerEnSlug: string;\n action: \"delete\" | \"keep\";\n /** Why an asset is kept: config `onDelete: \"keep\"`, or a shared path referenced elsewhere. */\n reason?: \"config-keep\" | \"shared\";\n}\n\n/** Per-document store row counts removed by the deletion. */\nexport interface DeletionStoreCounts {\n typeId: string;\n enSlug: string;\n translations: number;\n snapshots: number;\n}\n\n/**\n * A surviving document whose MDX body references (via `${{relation:...}}`) a doc\n * in the deletion set. Body relation tokens never cascade, detach, or block —\n * they will simply dangle and become validation errors after the deletion.\n */\nexport interface BodyRefWarning {\n typeId: string;\n enSlug: string;\n targetTypeId: string;\n targetEnSlug: string;\n}\n\nexport interface DeletionPlan {\n roots: DeletionRoot[];\n cascades: DeletionCascade[];\n detaches: DeletionDetach[];\n blocked: DeletionBlocker[];\n assets: DeletionAsset[];\n store: DeletionStoreCounts[];\n /** Warn-only: surviving body references that will dangle after deletion. */\n bodyRefWarnings: BodyRefWarning[];\n}\n\n/** Whether a plan can be executed (no blockers). */\nexport function isPlanBlocked(plan: DeletionPlan): boolean {\n return plan.blocked.length > 0;\n}\n\n/** Every document the plan removes (roots first, then transitive cascades). */\nexport function deletedDocs(plan: DeletionPlan): Array<{ typeId: string; enSlug: string }> {\n return [\n ...plan.roots.map((r) => ({ typeId: r.typeId, enSlug: r.enSlug })),\n ...plan.cascades.map((c) => ({ typeId: c.typeId, enSlug: c.enSlug })),\n ];\n}\n\nfunction docKey(typeId: string, enSlug: string): string {\n return `${typeId}\\u0000${enSlug}`;\n}\n\n/** Collect the EN slugs a relation field points at (handles arrays and `*` paths). */\nfunction relationSlugsAt(frontmatter: Record<string, unknown>, path: string[]): string[] {\n const out: string[] = [];\n const walk = (container: unknown, remaining: string[]): void => {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n const value = record[head];\n if (Array.isArray(value)) {\n for (const slug of value) if (typeof slug === \"string\" && slug) out.push(slug);\n } else if (typeof value === \"string\" && value) {\n out.push(value);\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) for (const item of arr) walk(item, rest.slice(1));\n return;\n }\n walk(record[head], rest);\n };\n walk(frontmatter, path);\n return out;\n}\n\n/** Collect the source web paths a declared asset field resolves to (materializing templates). */\nfunction assetValuesAt(\n frontmatter: Record<string, unknown>,\n field: SchemaFieldMeta,\n enSlug: string,\n): string[] {\n const out: string[] = [];\n const walk = (container: unknown, remaining: string[]): void => {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n const value = record[head];\n if (typeof value === \"string\" && value) out.push(value);\n else if (value === undefined && field.assetTemplate) {\n out.push(field.assetTemplate.split(\"{slug}\").join(enSlug));\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) for (const item of arr) walk(item, rest.slice(1));\n return;\n }\n walk(record[head], rest);\n };\n walk(frontmatter, field.path);\n return out;\n}\n\ninterface Referrer {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n multiple: boolean;\n optional: boolean;\n onTargetDelete: OnTargetDelete;\n}\n\ninterface DocRecord {\n typeId: string;\n enSlug: string;\n frontmatter: Record<string, unknown>;\n}\n\n/**\n * Compute the full deletion plan for one entry. Reads source (unresolved)\n * frontmatter from the project's cached document lists — no side effects. Store\n * row counts are read from the (read-only) SQLite store when it exists.\n */\nexport function buildDeletionPlan(\n project: ScribeProject,\n typeId: string,\n enSlug: string,\n): DeletionPlan {\n const rootType = (() => {\n try {\n return project.getType(typeId);\n } catch {\n return null;\n }\n })();\n if (!rootType) {\n throw new Error(`Unknown content type \"${typeId}\"`);\n }\n const rootDoc = rootType.get(enSlug);\n if (!rootDoc) {\n throw new Error(`No ${typeId} entry \"${enSlug}\"`);\n }\n\n // Snapshot every document's source frontmatter, plus per-type field metadata.\n const docByKey = new Map<string, DocRecord>();\n const relationFieldsByType = new Map<string, SchemaFieldMeta[]>();\n const assetFieldsByType = new Map<string, SchemaFieldMeta[]>();\n const referrers = new Map<string, Referrer[]>();\n const assetRefs = new Map<string, Set<string>>();\n // Every `${{relation:...}}` body reference, collected up front; filtered\n // against the deletion set once it is known.\n const bodyRelationRefs: BodyRefWarning[] = [];\n\n for (const type of project.listTypes()) {\n const relFields = listRelationFields(type.config.schema);\n const assetFields = listAssetFields(type.config.schema);\n relationFieldsByType.set(type.id, relFields);\n assetFieldsByType.set(type.id, assetFields);\n for (const doc of type.list() as ScribeDocument[]) {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n docByKey.set(docKey(type.id, doc.enSlug), {\n typeId: type.id,\n enSlug: doc.enSlug,\n frontmatter,\n });\n // Reverse relation index: (targetType, targetSlug) -> referrers.\n for (const field of relFields) {\n const target = field.relationTarget;\n if (!target) continue;\n for (const slug of relationSlugsAt(frontmatter, field.path)) {\n const list = referrers.get(docKey(target, slug)) ?? [];\n list.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n fieldPath: field.path.join(\".\"),\n multiple: Boolean(field.relationMultiple),\n optional: Boolean(field.relationOptional),\n onTargetDelete: field.relationOnTargetDelete ?? \"restrict\",\n });\n referrers.set(docKey(target, slug), list);\n }\n }\n // Asset reference graph (declared fields only), keyed by source web path.\n for (const field of assetFields) {\n for (const webPath of assetValuesAt(frontmatter, field, doc.enSlug)) {\n const set = assetRefs.get(webPath) ?? new Set<string>();\n set.add(docKey(type.id, doc.enSlug));\n assetRefs.set(webPath, set);\n }\n }\n // Body relation tokens: recorded now, filtered against the deletion set later.\n for (const token of extractInlineTokens(doc.content).tokens) {\n if (token.kind === \"relation\") {\n bodyRelationRefs.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n targetTypeId: token.targetTypeId,\n targetEnSlug: token.enSlug,\n });\n }\n }\n }\n }\n\n // ---- Transitive cascade (cycle-safe: visited keyed by type + enSlug). ----\n const deleted = new Map<string, { typeId: string; enSlug: string; via?: string }>();\n deleted.set(docKey(typeId, enSlug), { typeId, enSlug });\n const queue: Array<{ typeId: string; enSlug: string }> = [{ typeId, enSlug }];\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const ref of referrers.get(docKey(current.typeId, current.enSlug)) ?? []) {\n if (ref.onTargetDelete !== \"cascade\") continue;\n const refKey = docKey(ref.typeId, ref.enSlug);\n if (deleted.has(refKey)) continue;\n deleted.set(refKey, {\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n via: `${ref.fieldPath}=${current.enSlug}`,\n });\n queue.push({ typeId: ref.typeId, enSlug: ref.enSlug });\n }\n }\n\n // ---- Detaches + blockers over surviving referrers of every deleted doc. ----\n const detaches: DeletionDetach[] = [];\n const blocked: DeletionBlocker[] = [];\n const seenDetach = new Set<string>();\n const seenBlock = new Set<string>();\n for (const del of deleted.values()) {\n for (const ref of referrers.get(docKey(del.typeId, del.enSlug)) ?? []) {\n // A referrer that is itself deleted loses the reference with its own file.\n if (deleted.has(docKey(ref.typeId, ref.enSlug))) continue;\n if (ref.onTargetDelete === \"restrict\") {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000restrict`;\n if (!seenBlock.has(k)) {\n seenBlock.add(k);\n blocked.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n reason: \"restrict\",\n });\n }\n } else if (ref.onTargetDelete === \"detach\") {\n const requiredSingle = !ref.multiple && !ref.optional;\n if (requiredSingle) {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000required-single`;\n if (!seenBlock.has(k)) {\n seenBlock.add(k);\n blocked.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n reason: \"required-single\",\n });\n }\n } else {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000${del.enSlug}`;\n if (!seenDetach.has(k)) {\n seenDetach.add(k);\n detaches.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n removedSlug: del.enSlug,\n });\n }\n }\n }\n // cascade referrers are already in `deleted` and handled above.\n }\n }\n\n // ---- Assets owned by deleted docs. ----\n const assets: DeletionAsset[] = [];\n const seenAsset = new Set<string>();\n for (const del of deleted.values()) {\n const record = docByKey.get(docKey(del.typeId, del.enSlug));\n if (!record) continue;\n for (const field of assetFieldsByType.get(del.typeId) ?? []) {\n for (const webPath of assetValuesAt(record.frontmatter, field, del.enSlug)) {\n const dedupeKey = `${del.typeId}\\u0000${del.enSlug}\\u0000${webPath}`;\n if (seenAsset.has(dedupeKey)) continue;\n seenAsset.add(dedupeKey);\n if (field.assetOnDelete === \"keep\") {\n assets.push({\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"keep\",\n reason: \"config-keep\",\n });\n continue;\n }\n // Delete only when no surviving doc references the same path.\n const refs = assetRefs.get(webPath) ?? new Set<string>();\n let sharedOutside = false;\n for (const owner of refs) {\n if (!deleted.has(owner)) {\n sharedOutside = true;\n break;\n }\n }\n assets.push(\n sharedOutside\n ? {\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"keep\",\n reason: \"shared\",\n }\n : {\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"delete\",\n },\n );\n }\n }\n }\n\n // ---- Store row counts (best-effort; store may not exist yet). ----\n const store: DeletionStoreCounts[] = [];\n try {\n const db = openStore(project.config, \"readonly\");\n try {\n for (const del of deleted.values()) {\n store.push({\n typeId: del.typeId,\n enSlug: del.enSlug,\n translations: countTranslationsForEnSlug(db, del.typeId, del.enSlug),\n snapshots: countEnSnapshotsForEnSlug(db, del.typeId, del.enSlug),\n });\n }\n } finally {\n db.close();\n }\n } catch {\n for (const del of deleted.values()) {\n store.push({ typeId: del.typeId, enSlug: del.enSlug, translations: 0, snapshots: 0 });\n }\n }\n\n const rootTitle = (() => {\n const title = (rootDoc.frontmatter as Record<string, unknown>).title;\n return typeof title === \"string\" && title.trim() ? title : undefined;\n })();\n\n const cascades: DeletionCascade[] = [];\n for (const del of deleted.values()) {\n if (del.typeId === typeId && del.enSlug === enSlug) continue;\n cascades.push({ typeId: del.typeId, enSlug: del.enSlug, via: del.via ?? \"\" });\n }\n\n // Body references that point INTO the deletion set from a SURVIVING document\n // will dangle. Never block or mutate execution — warn only.\n const bodyRefWarnings = bodyRelationRefs.filter(\n (ref) =>\n deleted.has(docKey(ref.targetTypeId, ref.targetEnSlug)) &&\n !deleted.has(docKey(ref.typeId, ref.enSlug)),\n );\n\n return {\n roots: [{ typeId, enSlug, title: rootTitle }],\n cascades,\n detaches,\n blocked,\n assets,\n store,\n bodyRefWarnings,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport { listRelationFields, type SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport { bumpContentVersion } from \"../loader/create-loader.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n deleteEnSnapshotsForEnSlug,\n deleteTranslationsForEnSlug,\n} from \"../storage/translations.js\";\nimport { deletedDocs, isPlanBlocked, type DeletionPlan } from \"./plan.js\";\n\nexport interface ExecuteDeletionResult {\n /** EN files removed from disk. */\n deletedFiles: string[];\n /** Asset files removed from disk. */\n deletedAssets: string[];\n /** EN files rewritten to drop a detached reference. */\n detachedFiles: string[];\n /** Translation rows removed from the store. */\n translationsDeleted: number;\n /** EN snapshot rows removed from the store. */\n snapshotsDeleted: number;\n}\n\n/** Locate the on-disk EN file for a document, trying `.mdx` then `.md`. */\nfunction enFilePath(rootDir: string, contentDir: string, enSlug: string): string | null {\n for (const ext of [\".mdx\", \".md\"]) {\n const candidate = path.join(rootDir, contentDir, `${enSlug}${ext}`);\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Rewrite the frontmatter block of a raw MDX string, leaving the body bytes\n * exactly as they were. The YAML is re-serialized (minor reformatting is\n * acceptable); everything after the closing `---` line is preserved verbatim.\n */\nfunction rewriteFrontmatter(raw: string, data: Record<string, unknown>): string {\n const match = raw.match(/^()?---[ \\t]*\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*(\\r?\\n|$)/);\n if (!match) {\n throw new Error(\"Cannot rewrite frontmatter: no leading YAML block found\");\n }\n const bom = match[1] ?? \"\";\n const body = raw.slice(match[0].length);\n const serialized = matter.stringify(\"\", data);\n const blockMatch = serialized.match(/^---[ \\t]*\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*\\r?\\n/);\n const block = blockMatch ? blockMatch[0] : serialized;\n return `${bom}${block}${body}`;\n}\n\n/** Remove a detached slug at a relation field path (handles arrays and `*` paths). */\nfunction removeSlugAtPath(\n container: unknown,\n remaining: string[],\n removedSlug: string,\n multiple: boolean,\n): void {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n if (multiple) {\n const value = record[head];\n if (Array.isArray(value)) {\n record[head] = value.filter((slug) => slug !== removedSlug);\n }\n } else if (record[head] === removedSlug) {\n // Optional single relation: clear it only when it points at the deleted target.\n delete record[head];\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) {\n for (const item of arr) removeSlugAtPath(item, rest.slice(1), removedSlug, multiple);\n }\n return;\n }\n removeSlugAtPath(record[head], rest, removedSlug, multiple);\n}\n\n/**\n * Execute a deletion plan: remove EN files, delete asset files, rewrite detach\n * references, and clean up store rows. Refuses to run while the plan is blocked.\n * Performs exactly the plan and nothing else.\n */\nexport function executeDeletionPlan(\n project: ScribeProject,\n plan: DeletionPlan,\n): ExecuteDeletionResult {\n if (isPlanBlocked(plan)) {\n throw new Error(\"Refusing to execute a blocked deletion plan\");\n }\n\n const config = project.config;\n const result: ExecuteDeletionResult = {\n deletedFiles: [],\n deletedAssets: [],\n detachedFiles: [],\n translationsDeleted: 0,\n snapshotsDeleted: 0,\n };\n\n // 1. Detach rewrites first (grouped by referring file), before the referenced\n // files vanish. Body bytes are preserved.\n const detachesByFile = new Map<string, typeof plan.detaches>();\n for (const detach of plan.detaches) {\n const key = `${detach.typeId} ${detach.enSlug}`;\n const list = detachesByFile.get(key) ?? [];\n list.push(detach);\n detachesByFile.set(key, list);\n }\n for (const [, detaches] of detachesByFile) {\n const { typeId, enSlug } = detaches[0]!;\n const type = project.getType(typeId);\n const file = enFilePath(config.rootDir, type.config.contentDir, enSlug);\n if (!file) continue;\n const fieldByPath = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.config.schema).map((f) => [f.path.join(\".\"), f]),\n );\n const raw = fs.readFileSync(file, \"utf8\");\n // gray-matter caches its parse result per input string; clone before mutating\n // so we never corrupt that shared object.\n const data = structuredClone(matter(raw).data) as Record<string, unknown>;\n for (const detach of detaches) {\n const field = fieldByPath.get(detach.fieldPath);\n if (!field) continue;\n removeSlugAtPath(\n data,\n detach.fieldPath.split(\".\"),\n detach.removedSlug,\n Boolean(field.relationMultiple),\n );\n }\n fs.writeFileSync(file, rewriteFrontmatter(raw, data), \"utf8\");\n result.detachedFiles.push(file);\n }\n\n // 2. Delete asset files (only those the plan marks for deletion).\n const assetsDir = config.assets?.assetsPath ?? config.assetsPath;\n for (const asset of plan.assets) {\n if (asset.action !== \"delete\") continue;\n if (!assetsDir) continue;\n const root = path.resolve(assetsDir);\n const relative = asset.path.replace(/^\\/+/, \"\");\n const abs = path.resolve(root, relative);\n const rootWithSep = root.endsWith(path.sep) ? root : root + path.sep;\n if (abs !== root && !abs.startsWith(rootWithSep)) continue;\n if (fs.existsSync(abs)) {\n fs.rmSync(abs, { force: true });\n result.deletedAssets.push(abs);\n }\n }\n\n // 3. Delete EN files.\n for (const doc of deletedDocs(plan)) {\n const type = project.getType(doc.typeId);\n const file = enFilePath(config.rootDir, type.config.contentDir, doc.enSlug);\n if (file && fs.existsSync(file)) {\n fs.rmSync(file, { force: true });\n result.deletedFiles.push(file);\n }\n }\n\n // 4. Store cleanup: translation rows + EN snapshots for every deleted doc.\n const db = openStore(config, \"readwrite\");\n try {\n for (const doc of deletedDocs(plan)) {\n result.translationsDeleted += deleteTranslationsForEnSlug(db, doc.typeId, doc.enSlug);\n result.snapshotsDeleted += deleteEnSnapshotsForEnSlug(db, doc.typeId, doc.enSlug);\n }\n } finally {\n db.close();\n }\n\n // Force every in-process content loader to rebuild on next read so the deleted\n // (and detached) docs disappear immediately, bypassing the dev revalidation\n // window and the studio's fingerprint-keyed derived cache.\n bumpContentVersion();\n\n return result;\n}\n"]}