scribe-cms 0.0.17 → 0.0.21

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.
Files changed (88) hide show
  1. package/README.md +10 -0
  2. package/dist/cli/index.cjs +4021 -555
  3. package/dist/cli/index.cjs.map +1 -1
  4. package/dist/cli/index.js +4019 -553
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/index.cjs +1514 -229
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +1499 -228
  9. package/dist/index.js.map +1 -1
  10. package/dist/runtime.cjs +447 -33
  11. package/dist/runtime.cjs.map +1 -1
  12. package/dist/runtime.js +446 -32
  13. package/dist/runtime.js.map +1 -1
  14. package/dist/src/config/resolve-config.d.ts.map +1 -1
  15. package/dist/src/core/builtin-fields.d.ts +10 -1
  16. package/dist/src/core/builtin-fields.d.ts.map +1 -1
  17. package/dist/src/core/field.d.ts +70 -0
  18. package/dist/src/core/field.d.ts.map +1 -1
  19. package/dist/src/core/introspect-schema.d.ts +31 -1
  20. package/dist/src/core/introspect-schema.d.ts.map +1 -1
  21. package/dist/src/core/managed-roots.d.ts +15 -0
  22. package/dist/src/core/managed-roots.d.ts.map +1 -0
  23. package/dist/src/core/types.d.ts +56 -4
  24. package/dist/src/core/types.d.ts.map +1 -1
  25. package/dist/src/create-project.d.ts +17 -1
  26. package/dist/src/create-project.d.ts.map +1 -1
  27. package/dist/src/create-scribe.d.ts.map +1 -1
  28. package/dist/src/delete/execute.d.ts +21 -0
  29. package/dist/src/delete/execute.d.ts.map +1 -0
  30. package/dist/src/delete/plan.d.ts +85 -0
  31. package/dist/src/delete/plan.d.ts.map +1 -0
  32. package/dist/src/delete/render-text.d.ts +7 -0
  33. package/dist/src/delete/render-text.d.ts.map +1 -0
  34. package/dist/src/hash/page-hash.d.ts +9 -0
  35. package/dist/src/hash/page-hash.d.ts.map +1 -1
  36. package/dist/src/index.d.ts +12 -3
  37. package/dist/src/index.d.ts.map +1 -1
  38. package/dist/src/inline/resolve-tokens.d.ts +39 -0
  39. package/dist/src/inline/resolve-tokens.d.ts.map +1 -0
  40. package/dist/src/inline/tokens.d.ts +95 -0
  41. package/dist/src/inline/tokens.d.ts.map +1 -0
  42. package/dist/src/loader/create-loader.d.ts +7 -1
  43. package/dist/src/loader/create-loader.d.ts.map +1 -1
  44. package/dist/src/loader/resolve-assets.d.ts +16 -0
  45. package/dist/src/loader/resolve-assets.d.ts.map +1 -0
  46. package/dist/src/runtime.d.ts +1 -1
  47. package/dist/src/runtime.d.ts.map +1 -1
  48. package/dist/src/storage/translations.d.ts +8 -0
  49. package/dist/src/storage/translations.d.ts.map +1 -1
  50. package/dist/src/translate/resolve-translate-config.d.ts.map +1 -1
  51. package/dist/src/translate/response-schema.d.ts +7 -1
  52. package/dist/src/translate/response-schema.d.ts.map +1 -1
  53. package/dist/src/translate/translate-core.d.ts +6 -0
  54. package/dist/src/translate/translate-core.d.ts.map +1 -1
  55. package/dist/src/translate/validate-translation.d.ts.map +1 -1
  56. package/dist/src/translate/worklist.d.ts +8 -1
  57. package/dist/src/translate/worklist.d.ts.map +1 -1
  58. package/dist/src/validate/validate-assets.d.ts +26 -2
  59. package/dist/src/validate/validate-assets.d.ts.map +1 -1
  60. package/dist/src/validate/validate-inline-tokens.d.ts +10 -0
  61. package/dist/src/validate/validate-inline-tokens.d.ts.map +1 -0
  62. package/dist/src/validate/validate-project.d.ts.map +1 -1
  63. package/dist/src/validate/validate-relations.d.ts +2 -1
  64. package/dist/src/validate/validate-relations.d.ts.map +1 -1
  65. package/dist/studio/asset-serve.d.ts +39 -0
  66. package/dist/studio/asset-serve.d.ts.map +1 -0
  67. package/dist/studio/asset-views.d.ts +4 -0
  68. package/dist/studio/asset-views.d.ts.map +1 -0
  69. package/dist/studio/content-views.d.ts +85 -0
  70. package/dist/studio/content-views.d.ts.map +1 -0
  71. package/dist/studio/introspect-fields.d.ts +111 -0
  72. package/dist/studio/introspect-fields.d.ts.map +1 -0
  73. package/dist/studio/mdx-preview.d.ts +3 -0
  74. package/dist/studio/mdx-preview.d.ts.map +1 -0
  75. package/dist/studio/preview-tokens.d.ts +16 -0
  76. package/dist/studio/preview-tokens.d.ts.map +1 -0
  77. package/dist/studio/search.d.ts +34 -0
  78. package/dist/studio/search.d.ts.map +1 -0
  79. package/dist/studio/server.cjs +4699 -304
  80. package/dist/studio/server.cjs.map +1 -1
  81. package/dist/studio/server.d.ts.map +1 -1
  82. package/dist/studio/server.js +4697 -302
  83. package/dist/studio/server.js.map +1 -1
  84. package/dist/studio/shared.d.ts +20 -0
  85. package/dist/studio/shared.d.ts.map +1 -0
  86. package/dist/studio/studio-cache.d.ts +93 -0
  87. package/dist/studio/studio-cache.d.ts.map +1 -0
  88. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/field.ts","../../src/core/introspect-schema.ts","../../src/hash/page-hash.ts","../../src/i18n/build-url.ts","../../src/core/builtin-fields.ts","../../src/storage/sqlite.ts","../../src/storage/translations.ts","../../src/translate/validate-mdx-body.ts","../../src/loader/normalize-en.ts","../../src/loader/create-loader.ts","../../src/translate/worklist.ts","../../studio/server.ts"],"names":["path","prefix","z","fs"],"mappings":"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","file":"server.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\");\n\nexport type FieldKind = \"translatable\" | \"structural\";\n\nexport interface RelationMeta {\n typeId: string;\n multiple: boolean;\n optional: boolean;\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\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\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\ntype Bool<T> = [T] extends [true] ? true : false;\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 */\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 markRelation(inner, { typeId, multiple, optional });\n const schema = optional ? inner.optional() : inner;\n return schema as RelationFieldFor<TTarget, 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 { getFieldKind, getRelationTarget, peelOptionalWrappers } from \"./field.js\";\n\nexport interface SchemaFieldMeta {\n path: string[];\n kind: \"translatable\" | \"structural\" | \"relation\";\n relationTarget?: string;\n relationMultiple?: boolean;\n relationOptional?: boolean;\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 },\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/** 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\")\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 {\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 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","import { createHash } from \"node:crypto\";\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/** Hash MDX body content for revision tracking. */\nexport function computeBodyHash(body: string): string {\n return sha256(body);\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 { 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\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 return {\n builtin: {\n publishedAt,\n updatedAt,\n noindex,\n canonicalPathOverride,\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 >,\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 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\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","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","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 { mergeStructuralOntoLocale, pickTranslatable } 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 { isPublishableContentFile, normalizeEnFrontmatter } from \"./normalize-en.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 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 content: 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): 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 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: prepareTranslatedMdxBody(row.body).body,\n };\n}\n\nconst DEV_REVALIDATE_MS = 1500;\n\nexport function createContentLoader(config: ScribeConfig, type: ContentTypeConfig): () => AllDocuments {\n let cached: AllDocuments | null = null;\n let signature = \"\";\n let lastCheck = 0;\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 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 const doc = buildDocumentFromTranslation(row, enDoc, type, config);\n bySlug.set(doc.slug, doc);\n byEnSlug.set(row.en_slug, doc);\n }\n out.set(locale, { bySlug, byEnSlug });\n }\n\n return out;\n }\n\n return () => {\n if (cached) {\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 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 body: doc.content,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { computePageEnHash } 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\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 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 = computePageEnHash(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 { serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport type { ContentTypeRuntime, ScribeConfig, ScribeProject } from \"../src/core/types.js\";\nimport { introspectSchema, mergeStructuralOntoLocale } from \"../src/core/introspect-schema.js\";\nimport { computePageEnHash } from \"../src/hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../src/loader/create-loader.js\";\nimport { openStore } from \"../src/storage/sqlite.js\";\nimport {\n countTranslations,\n getEnSnapshot,\n getTranslation,\n latestTranslationAtByLocale,\n listTranslationsForLocale,\n type EnSnapshotRow,\n} from \"../src/storage/translations.js\";\nimport { buildWorklist } from \"../src/translate/worklist.js\";\n\ntype DocStatus = \"source\" | \"up-to-date\" | \"stale\" | \"missing\";\n\ninterface DocumentStatusResult {\n status: DocStatus;\n currentEnHash?: string;\n storedEnHash?: string;\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nfunction encodePathSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\nfunction statusDot(status: DocStatus): string {\n const labels: Record<DocStatus, string> = {\n source: \"en\",\n \"up-to-date\": \"ok\",\n stale: \"stale\",\n missing: \"—\",\n };\n return `<span class=\"status\" title=\"${status}\"><span class=\"dot dot-${status}\"></span>${labels[status]}</span>`;\n}\n\nfunction documentStatus(\n config: ScribeConfig,\n db: ReturnType<typeof openStore>,\n type: ContentTypeRuntime,\n enSlug: string,\n locale: string,\n): DocumentStatusResult {\n if (locale === config.defaultLocale) {\n return { status: \"source\" };\n }\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) {\n return { status: \"missing\" };\n }\n const payload = getTranslatablePayload(enDoc, type.config);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n const row = getTranslation(db, type.id, enSlug, locale);\n if (!row) {\n return { status: \"missing\", currentEnHash };\n }\n if (row.en_hash !== currentEnHash) {\n return { status: \"stale\", currentEnHash, storedEnHash: row.en_hash };\n }\n return { status: \"up-to-date\", currentEnHash, storedEnHash: row.en_hash };\n}\n\nfunction flattenFrontmatter(\n data: Record<string, unknown>,\n prefix = \"\",\n): Array<{ key: string; value: string }> {\n const rows: Array<{ key: string; value: string }> = [];\n for (const [key, value] of Object.entries(data)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n rows.push(...flattenFrontmatter(value as Record<string, unknown>, fullKey));\n } else {\n const display =\n typeof value === \"string\"\n ? value\n : value === undefined\n ? \"\"\n : JSON.stringify(value, null, 2);\n rows.push({ key: fullKey, value: display });\n }\n }\n return rows;\n}\n\nfunction translatableKeySet(schema: ContentTypeRuntime[\"config\"][\"schema\"]): Set<string> {\n return new Set(\n introspectSchema(schema)\n .filter((field) => field.kind === \"translatable\")\n .map((field) => field.path.join(\".\")),\n );\n}\n\nfunction renderFrontmatterTable(\n frontmatter: Record<string, unknown>,\n schema: ContentTypeRuntime[\"config\"][\"schema\"],\n): string {\n const translatable = translatableKeySet(schema);\n const rows = flattenFrontmatter(frontmatter)\n .map((row) => {\n const flag = translatable.has(row.key)\n ? `<span class=\"flag t\" title=\"Translatable\">T</span>`\n : `<span class=\"flag s\" title=\"Structural\">S</span>`;\n return `<tr>\n <td class=\"k\">${flag}${escapeHtml(row.key)}</td>\n <td class=\"v\">${escapeHtml(row.value)}</td>\n </tr>`;\n })\n .join(\"\");\n return `<table class=\"kv\">\n <tbody>${rows || `<tr><td colspan=\"2\" class=\"dim\">—</td></tr>`}</tbody>\n </table>`;\n}\n\nfunction renderEnSnapshotPreview(snapshot: EnSnapshotRow): string {\n let frontmatter: Record<string, unknown> = {};\n try {\n frontmatter = JSON.parse(snapshot.frontmatter_json) as Record<string, unknown>;\n } catch {\n frontmatter = {};\n }\n const fmRows = flattenFrontmatter(frontmatter)\n .map(\n (row) =>\n `<tr><td class=\"k\">${escapeHtml(row.key)}</td><td class=\"v\">${escapeHtml(row.value)}</td></tr>`,\n )\n .join(\"\");\n return `<table class=\"kv\"><tbody>${fmRows}</tbody></table>\n <pre class=\"code\">${escapeHtml(snapshot.body)}</pre>`;\n}\n\nfunction renderTranslationSnapshotPanel(\n snapshot: EnSnapshotRow | undefined,\n currentEnHash?: string,\n): string {\n if (!snapshot) {\n return `<p class=\"dim\">No EN snapshot linked to this translation.</p>`;\n }\n const staleNote =\n currentEnHash && currentEnHash !== snapshot.en_hash\n ? `<p class=\"dim\">Current EN hash differs from snapshot (${escapeHtml(currentEnHash.slice(0, 12))} vs ${escapeHtml(snapshot.en_hash.slice(0, 12))}).</p>`\n : \"\";\n return `<dl class=\"meta\">\n <dt>snapshot</dt><dd>#${snapshot.id}</dd>\n <dt>captured</dt><dd>${escapeHtml(snapshot.created_at.slice(0, 19))}</dd>\n <dt>en_hash</dt><dd class=\"mono\">${escapeHtml(snapshot.en_hash.slice(0, 12))}</dd>\n </dl>\n ${staleNote}\n <details><summary>EN source at translation time</summary>${renderEnSnapshotPreview(snapshot)}</details>`;\n}\n\nfunction renderLayout(\n title: string,\n body: string,\n project: ScribeProject,\n options: { activeTypeId?: string } = {},\n): string {\n const typeLinks = project\n .listTypes()\n .map((type) => {\n const active = type.id === options.activeTypeId ? \" active\" : \"\";\n return `<a class=\"tree-item${active}\" href=\"/type/${encodePathSegment(type.id)}\">\n <span class=\"tree-label\">${escapeHtml(type.config.label)}</span>\n <span class=\"tree-meta\">${escapeHtml(type.id)}</span>\n </a>`;\n })\n .join(\"\");\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)} — Scribe</title>\n <style>\n :root {\n --bg: #1e1e1e;\n --sidebar: #252526;\n --bar: #333333;\n --panel: #1e1e1e;\n --border: #3c3c3c;\n --text: #cccccc;\n --dim: #858585;\n --accent: #3794ff;\n --hover: #2a2d2e;\n --active: #37373d;\n --ok: #89d185;\n --stale: #cca700;\n --missing: #f48771;\n --source: #75beff;\n --mono: ui-monospace, \"Cascadia Code\", \"SF Mono\", Menlo, monospace;\n --ui: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --fs: 13px;\n --fs-sm: 11px;\n }\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { font: var(--fs)/1.4 var(--ui); background: var(--bg); color: var(--text); }\n a { color: var(--accent); text-decoration: none; }\n a:hover { text-decoration: underline; }\n .app { display: flex; height: 100vh; overflow: hidden; }\n\n /* activity bar */\n .actbar {\n width: 48px; flex-shrink: 0; background: var(--bar);\n display: flex; flex-direction: column; align-items: center;\n padding: 8px 0; gap: 4px; border-right: 1px solid var(--border);\n }\n .actbar a {\n width: 48px; height: 48px; display: flex; align-items: center; justify-content: center;\n color: var(--dim); font-size: 18px; text-decoration: none; position: relative;\n }\n .actbar a:hover { color: var(--text); }\n .actbar a.active { color: var(--text); }\n .actbar a.active::before {\n content: \"\"; position: absolute; left: 0; top: 8px; bottom: 8px;\n width: 2px; background: var(--accent);\n }\n\n /* sidebar */\n .sidebar {\n width: 200px; flex-shrink: 0; background: var(--sidebar);\n border-right: 1px solid var(--border); display: flex; flex-direction: column;\n overflow: hidden;\n }\n .sidebar-head {\n padding: 8px 12px; font-size: var(--fs-sm); font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.04em; color: var(--dim);\n }\n .sidebar-body { flex: 1; overflow-y: auto; padding: 2px 0; }\n .tree-item {\n display: flex; flex-direction: column; padding: 3px 12px 3px 20px;\n color: var(--text); text-decoration: none; line-height: 1.3;\n }\n .tree-item:hover { background: var(--hover); text-decoration: none; }\n .tree-item.active { background: var(--active); }\n .tree-label { font-size: var(--fs); }\n .tree-meta { font-size: var(--fs-sm); color: var(--dim); }\n\n /* main */\n .main { flex: 1; display: flex; flex-direction: column; overflow: hidden; }\n .toolbar {\n display: flex; align-items: center; gap: 6px; padding: 0 12px;\n height: 35px; background: var(--sidebar); border-bottom: 1px solid var(--border);\n font-size: var(--fs-sm); color: var(--dim); flex-shrink: 0; overflow: hidden;\n }\n .toolbar a { color: var(--dim); }\n .toolbar a:hover { color: var(--text); }\n .toolbar .sep { color: var(--border); }\n .content { flex: 1; overflow-y: auto; padding: 0; }\n\n /* tabs (locale switcher) */\n .tabs {\n display: flex; background: var(--sidebar); border-bottom: 1px solid var(--border);\n overflow-x: auto; flex-shrink: 0;\n }\n .tab {\n display: flex; align-items: center; gap: 6px; padding: 6px 12px;\n font-size: var(--fs-sm); color: var(--dim); border-right: 1px solid var(--border);\n text-decoration: none; white-space: nowrap;\n }\n .tab:hover { background: var(--hover); color: var(--text); text-decoration: none; }\n .tab.active {\n background: var(--bg); color: var(--text);\n border-bottom: 1px solid var(--bg); margin-bottom: -1px;\n }\n\n /* status dots */\n .status { display: inline-flex; align-items: center; gap: 4px; font-size: var(--fs-sm); color: var(--dim); }\n .dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }\n .dot-source { background: var(--source); }\n .dot-up-to-date { background: var(--ok); }\n .dot-stale { background: var(--stale); }\n .dot-missing { background: var(--missing); opacity: 0.7; }\n\n /* sections */\n .section { border-bottom: 1px solid var(--border); }\n .section-head {\n padding: 4px 12px; font-size: var(--fs-sm); font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.04em; color: var(--dim);\n background: var(--sidebar);\n }\n .section-body { padding: 0; }\n\n /* tables */\n table { border-collapse: collapse; width: 100%; font-size: var(--fs); }\n .data th, .data td { padding: 2px 12px; text-align: left; border-bottom: 1px solid var(--border); vertical-align: top; }\n .data th { font-size: var(--fs-sm); font-weight: 600; color: var(--dim); background: var(--sidebar); height: 22px; }\n .data tr:hover td { background: var(--hover); }\n .data .mono { font-family: var(--mono); font-size: var(--fs-sm); }\n\n /* key-value (frontmatter) */\n .kv td { padding: 1px 12px; font-family: var(--mono); font-size: var(--fs-sm); vertical-align: top; border-bottom: 1px solid var(--border); }\n .kv .k { width: 160px; color: #9cdcfe; white-space: nowrap; }\n .kv .v { color: #ce9178; white-space: pre-wrap; word-break: break-word; }\n .flag { font-size: 9px; font-weight: 700; margin-right: 4px; opacity: 0.5; }\n .flag.t { color: var(--ok); }\n .flag.s { color: var(--dim); }\n\n /* code block */\n .code {\n margin: 0; padding: 8px 12px; font: var(--fs-sm)/1.5 var(--mono);\n white-space: pre-wrap; word-break: break-word; color: var(--text);\n background: var(--bg); border: none;\n }\n\n /* meta row */\n .meta { display: flex; flex-wrap: wrap; font-size: var(--fs-sm); border-bottom: 1px solid var(--border); padding: 4px 0; }\n .meta dt { padding: 0 4px 0 12px; color: var(--dim); }\n .meta dt::after { content: \":\"; }\n .meta dd { padding: 0 12px 0 0; font-family: var(--mono); }\n\n /* misc */\n .dim { color: var(--dim); }\n .page-title { padding: 8px 12px 4px; font-size: 14px; font-weight: 400; }\n .page-sub { padding: 0 12px 8px; font-size: var(--fs-sm); color: var(--dim); }\n details summary { cursor: pointer; color: var(--accent); font-size: var(--fs-sm); }\n details[open] summary { margin-bottom: 4px; }\n .tag { font-size: var(--fs-sm); color: var(--dim); margin-left: 6px; }\n .tag-warn { color: var(--stale); }\n .tag-err { color: var(--missing); }\n\n /* dashboard */\n .cards { display: flex; flex-wrap: wrap; gap: 1px; background: var(--border); border-bottom: 1px solid var(--border); }\n .card { flex: 1 1 120px; background: var(--bg); padding: 12px; min-width: 120px; }\n .card-value { font-size: 22px; font-weight: 300; line-height: 1.2; }\n .card-label { font-size: var(--fs-sm); color: var(--dim); margin-top: 2px; }\n .bar { display: inline-block; width: 120px; height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; vertical-align: middle; margin-right: 8px; }\n .bar-fill { display: block; height: 100%; }\n </style>\n</head>\n<body>\n <div class=\"app\">\n <nav class=\"actbar\">\n <a href=\"/\" title=\"Overview\">⌂</a>\n <a href=\"/dashboard\" title=\"Dashboard\">▦</a>\n <a href=\"/staleness\" title=\"Staleness\">⚠</a>\n </nav>\n <aside class=\"sidebar\">\n <div class=\"sidebar-head\">Types</div>\n <div class=\"sidebar-body\">${typeLinks || `<span class=\"dim\" style=\"padding:8px 12px\">—</span>`}</div>\n </aside>\n <div class=\"main\">\n <div class=\"content\">${body}</div>\n </div>\n </div>\n</body>\n</html>`;\n}\n\nfunction docTitleFromFrontmatter(frontmatter: Record<string, unknown>, enSlug: string): string {\n const title = frontmatter.title;\n if (typeof title === \"string\" && title.trim()) return title;\n return enSlug;\n}\n\n/** Start a local read-only Scribe studio (browser, staleness, document detail). */\nexport async function startStudio(\n project: ScribeProject,\n options: { port?: number; host?: string } = {},\n): Promise<void> {\n const app = new Hono();\n const config = project.config;\n\n app.get(\"/\", (c) => {\n const db = openStore(config, \"readonly\");\n const worklist = buildWorklist(config);\n const rows = project.listTypes().map((type) => {\n const enCount = type.list().length;\n const localeCells = config.locales\n .filter((locale) => locale !== config.defaultLocale)\n .map((locale) => {\n const translated = listTranslationsForLocale(db, type.id, locale).length;\n const stale = worklist.filter(\n (item) =>\n item.contentType === type.id && item.locale === locale && item.reason === \"stale\",\n ).length;\n const missing = worklist.filter(\n (item) =>\n item.contentType === type.id && item.locale === locale && item.reason === \"missing\",\n ).length;\n const tags = [\n stale ? `<span class=\"tag tag-warn\">${stale}s</span>` : \"\",\n missing ? `<span class=\"tag tag-err\">${missing}m</span>` : \"\",\n ].join(\"\");\n return `<td>${translated}${tags}</td>`;\n })\n .join(\"\");\n return `<tr>\n <td><a href=\"/type/${encodePathSegment(type.id)}\">${escapeHtml(type.config.label)}</a></td>\n <td class=\"dim\">${escapeHtml(type.id)}</td>\n <td>${enCount}</td>\n ${localeCells}\n </tr>`;\n });\n db.close();\n const localeHeaders = config.locales\n .filter((l) => l !== config.defaultLocale)\n .map((l) => `<th>${escapeHtml(l)}</th>`)\n .join(\"\");\n const html = `<div class=\"toolbar\">Overview</div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>ID</th><th>EN</th>${localeHeaders}</tr></thead>\n <tbody>${rows.join(\"\")}</tbody>\n </table>`;\n return c.html(renderLayout(\"Overview\", html, project));\n });\n\n app.get(\"/dashboard\", (c) => {\n const db = openStore(config, \"readonly\");\n const types = project.listTypes();\n const targetLocales = config.locales.filter((l) => l !== config.defaultLocale);\n\n // EN doc counts per type + total.\n const docCountByType = new Map<string, number>();\n let totalEnDocs = 0;\n for (const type of types) {\n const n = type.list().length;\n docCountByType.set(type.id, n);\n totalEnDocs += n;\n }\n\n // Single pass over the worklist for per-locale and per-type tallies.\n const worklist = buildWorklist(config);\n const missingByLocale = new Map<string, number>();\n const staleByLocale = new Map<string, number>();\n const missingByType = new Map<string, number>();\n const staleByType = new Map<string, number>();\n let missingTotal = 0;\n let staleTotal = 0;\n for (const item of worklist) {\n if (item.reason === \"missing\") {\n missingByLocale.set(item.locale, (missingByLocale.get(item.locale) ?? 0) + 1);\n missingByType.set(item.contentType, (missingByType.get(item.contentType) ?? 0) + 1);\n missingTotal++;\n } else if (item.reason === \"stale\") {\n staleByLocale.set(item.locale, (staleByLocale.get(item.locale) ?? 0) + 1);\n staleByType.set(item.contentType, (staleByType.get(item.contentType) ?? 0) + 1);\n staleTotal++;\n }\n }\n\n const storedTranslations = countTranslations(db);\n const latestByLocale = new Map<string, string>();\n for (const row of latestTranslationAtByLocale(db)) {\n if (row.latest) latestByLocale.set(row.locale, row.latest);\n }\n db.close();\n\n // Overall coverage.\n const expectedTotal = totalEnDocs * targetLocales.length;\n const coverageTotal = expectedTotal > 0 ? (expectedTotal - missingTotal) / expectedTotal : 0;\n const coveragePct = expectedTotal > 0 ? Math.round(coverageTotal * 100) : 0;\n\n const pct = (fraction: number) => Math.round(fraction * 100);\n const num = (n: number, warnClass: string) =>\n n > 0 ? `<span class=\"${warnClass}\">${n}</span>` : `<span class=\"dim\">0</span>`;\n\n // KPI cards.\n const coverageColor = expectedTotal > 0 && coveragePct === 100 ? ` style=\"color:var(--ok)\"` : \"\";\n const coverageValue = expectedTotal > 0 ? `${coveragePct}%` : `<span class=\"dim\">—</span>`;\n const staleColor = staleTotal > 0 ? ` style=\"color:var(--stale)\"` : \"\";\n const missingColor = missingTotal > 0 ? ` style=\"color:var(--missing)\"` : \"\";\n const cards = `<div class=\"cards\">\n <div class=\"card\"><div class=\"card-value\">${totalEnDocs}</div><div class=\"card-label\">Documents (EN)</div></div>\n <div class=\"card\"><div class=\"card-value\">${targetLocales.length}</div><div class=\"card-label\">Target locales</div></div>\n <div class=\"card\"><div class=\"card-value\">${storedTranslations}</div><div class=\"card-label\">Stored translations</div></div>\n <div class=\"card\"><div class=\"card-value\"${coverageColor}>${coverageValue}</div><div class=\"card-label\">Coverage</div></div>\n <div class=\"card\"><div class=\"card-value\"${staleColor}>${staleTotal}</div><div class=\"card-label\">Stale</div></div>\n <div class=\"card\"><div class=\"card-value\"${missingColor}>${missingTotal}</div><div class=\"card-label\">Missing</div></div>\n </div>`;\n\n // Locales section.\n let localeRows: string;\n if (totalEnDocs === 0 || targetLocales.length === 0) {\n localeRows = `<tr><td colspan=\"7\" class=\"dim\">No target locales or documents</td></tr>`;\n } else {\n localeRows = targetLocales\n .map((locale) => {\n const expected = totalEnDocs;\n const missing = missingByLocale.get(locale) ?? 0;\n const stale = staleByLocale.get(locale) ?? 0;\n const translated = expected - missing;\n const upToDate = translated - stale;\n const coverage = expected > 0 ? translated / expected : 0;\n const covPct = pct(coverage);\n const fillColor = covPct === 100 ? \"var(--ok)\" : \"var(--stale)\";\n const fallbacks = config.localeFallbacks[locale]?.length\n ? escapeHtml(config.localeFallbacks[locale]!.join(\" → \"))\n : `<span class=\"dim\">—</span>`;\n const latest = latestByLocale.get(locale);\n const last = latest ? escapeHtml(latest.slice(0, 10)) : `<span class=\"dim\">—</span>`;\n return `<tr>\n <td>${escapeHtml(locale)}</td>\n <td><span class=\"bar\"><span class=\"bar-fill\" style=\"width:${covPct}%;background:${fillColor}\"></span></span>${covPct}%</td>\n <td>${upToDate}</td>\n <td>${num(stale, \"tag-warn\")}</td>\n <td>${num(missing, \"tag-err\")}</td>\n <td>${fallbacks}</td>\n <td>${last}</td>\n </tr>`;\n })\n .join(\"\");\n }\n\n // Types section.\n let typeRows: string;\n if (types.length === 0 || targetLocales.length === 0) {\n typeRows = `<tr><td colspan=\"5\" class=\"dim\">No types or target locales</td></tr>`;\n } else {\n typeRows = types\n .map((type) => {\n const stale = staleByType.get(type.id) ?? 0;\n const missing = missingByType.get(type.id) ?? 0;\n return `<tr>\n <td><a href=\"/type/${encodePathSegment(type.id)}\">${escapeHtml(type.config.label)}</a></td>\n <td class=\"dim\">${escapeHtml(type.id)}</td>\n <td>${docCountByType.get(type.id) ?? 0}</td>\n <td>${num(stale, \"tag-warn\")}</td>\n <td>${num(missing, \"tag-err\")}</td>\n </tr>`;\n })\n .join(\"\");\n }\n\n const html = `<div class=\"toolbar\">Dashboard</div>\n ${cards}\n <div class=\"section\">\n <div class=\"section-head\">Locales</div>\n <table class=\"data\">\n <thead><tr><th>Locale</th><th>Coverage</th><th>Up to date</th><th>Stale</th><th>Missing</th><th>Fallbacks</th><th>Last translated</th></tr></thead>\n <tbody>${localeRows}</tbody>\n </table>\n </div>\n <div class=\"section\">\n <div class=\"section-head\">Types</div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>ID</th><th>EN docs</th><th>Stale</th><th>Missing</th></tr></thead>\n <tbody>${typeRows}</tbody>\n </table>\n </div>`;\n return c.html(renderLayout(\"Dashboard\", html, project));\n });\n\n app.get(\"/type/:id\", (c) => {\n const typeId = c.req.param(\"id\");\n const type = project.getType(typeId);\n if (!type) {\n return c.html(renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project), 404);\n }\n\n const db = openStore(config, \"readonly\");\n const locales = config.locales;\n const headerCells = locales\n .map((locale) => `<th>${escapeHtml(locale)}</th>`)\n .join(\"\");\n const rows = type\n .list()\n .map((doc) => {\n const title = docTitleFromFrontmatter(doc.frontmatter as Record<string, unknown>, doc.slug);\n const statusCells = locales\n .map((locale) => {\n const { status } = documentStatus(config, db, type, doc.slug, locale);\n return `<td>${statusDot(status)}</td>`;\n })\n .join(\"\");\n return `<tr>\n <td class=\"mono\"><a href=\"/type/${encodePathSegment(typeId)}/doc/${encodePathSegment(doc.slug)}\">${escapeHtml(doc.slug)}</a></td>\n <td>${escapeHtml(title)}</td>\n ${statusCells}\n </tr>`;\n })\n .join(\"\");\n db.close();\n\n const html = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>${escapeHtml(type.config.label)}\n </div>\n <table class=\"data\">\n <thead><tr><th>Slug</th><th>Title</th>${headerCells}</tr></thead>\n <tbody>${rows || `<tr><td colspan=\"${2 + locales.length}\" class=\"dim\">No documents</td></tr>`}</tbody>\n </table>`;\n return c.html(renderLayout(type.config.label, html, project, { activeTypeId: typeId }));\n });\n\n app.get(\"/type/:id/doc/:enSlug\", (c) => {\n const typeId = c.req.param(\"id\");\n const enSlug = c.req.param(\"enSlug\");\n const locale = c.req.query(\"locale\") ?? config.defaultLocale;\n const showRaw = c.req.query(\"raw\") === \"1\";\n const type = project.getType(typeId);\n if (!type) {\n return c.html(renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project), 404);\n }\n\n const db = openStore(config, \"readonly\");\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) {\n db.close();\n return c.html(\n renderLayout(\"Not found\", `<div class=\"toolbar\">Not found</div><p class=\"dim\" style=\"padding:12px\">${escapeHtml(enSlug)}</p>`, project, {\n activeTypeId: typeId,\n }),\n 404,\n );\n }\n\n const localeTabs = config.locales\n .map((loc) => {\n const { status } = documentStatus(config, db, type, enSlug, loc);\n const active = loc === locale ? \" active\" : \"\";\n const href = `/type/${encodePathSegment(typeId)}/doc/${encodePathSegment(enSlug)}?locale=${encodePathSegment(loc)}`;\n return `<a class=\"tab${active}\" href=\"${href}\">${escapeHtml(loc)} ${statusDot(status)}</a>`;\n })\n .join(\"\");\n\n let contentPanel = \"\";\n let metaPanel = \"\";\n let historyPanel = \"\";\n\n if (locale === config.defaultLocale) {\n contentPanel = `<div class=\"section\">\n <div class=\"section-head\">Frontmatter</div>\n <div class=\"section-body\">${renderFrontmatterTable(enDoc.frontmatter as Record<string, unknown>, type.config.schema)}</div>\n <div class=\"section-head\">Body</div>\n <pre class=\"code\">${escapeHtml(enDoc.content)}</pre>\n </div>`;\n } else {\n const translation = getTranslation(db, typeId, enSlug, locale);\n const { status, currentEnHash, storedEnHash } = documentStatus(config, db, type, enSlug, locale);\n\n if (translation) {\n const rawFrontmatter = JSON.parse(translation.frontmatter_json) as Record<string, unknown>;\n const displayFrontmatter = showRaw\n ? rawFrontmatter\n : mergeStructuralOntoLocale(rawFrontmatter, enDoc.frontmatter as Record<string, unknown>, type.config.schema);\n const rawToggle = showRaw\n ? `<span class=\"dim\"> · <a href=\"?locale=${encodePathSegment(locale)}\">merged</a></span>`\n : `<span class=\"dim\"> · <a href=\"?locale=${encodePathSegment(locale)}&raw=1\">raw</a></span>`;\n contentPanel = `<div class=\"section\">\n <div class=\"section-head\">Frontmatter${rawToggle}</div>\n <div class=\"section-body\">${renderFrontmatterTable(displayFrontmatter, type.config.schema)}</div>\n <div class=\"section-head\">Body</div>\n <pre class=\"code\">${escapeHtml(translation.body)}</pre>\n </div>`;\n metaPanel = `<dl class=\"meta\">\n <dt>status</dt><dd>${statusDot(status)}</dd>\n <dt>model</dt><dd>${escapeHtml(translation.model)}</dd>\n <dt>translated</dt><dd>${escapeHtml(translation.translated_at.slice(0, 19))}</dd>\n <dt>slug</dt><dd>${escapeHtml(translation.slug)}</dd>\n <dt>en_hash</dt><dd>${escapeHtml(currentEnHash?.slice(0, 12) ?? \"—\")} / ${escapeHtml(storedEnHash?.slice(0, 12) ?? \"—\")}</dd>\n </dl>`;\n const snapshot =\n translation.snapshot_id != null\n ? getEnSnapshot(db, translation.snapshot_id)\n : undefined;\n historyPanel = `<div class=\"section\">\n <div class=\"section-head\">EN snapshot</div>\n <div class=\"section-body\">${renderTranslationSnapshotPanel(snapshot, currentEnHash)}</div>\n </div>`;\n } else {\n contentPanel = `<p class=\"dim\" style=\"padding:12px\">No translation for ${escapeHtml(locale)}.</p>`;\n metaPanel = `<dl class=\"meta\"><dt>status</dt><dd>${statusDot(status)}</dd></dl>`;\n }\n }\n\n db.close();\n\n const title = docTitleFromFrontmatter(enDoc.frontmatter as Record<string, unknown>, enSlug);\n const html = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>\n <a href=\"/type/${encodePathSegment(typeId)}\">${escapeHtml(type.config.label)}</a><span class=\"sep\">›</span>\n <span>${escapeHtml(enSlug)}</span>\n </div>\n <div class=\"tabs\">${localeTabs}</div>\n ${metaPanel}\n ${contentPanel}\n ${historyPanel}`;\n\n return c.html(renderLayout(title, html, project, { activeTypeId: typeId }));\n });\n\n app.get(\"/staleness\", (c) => {\n const worklist = buildWorklist(config);\n const rows = worklist\n .slice(0, 500)\n .map((item) => {\n const href = `/type/${encodePathSegment(item.contentType)}/doc/${encodePathSegment(item.enSlug)}?locale=${encodePathSegment(item.locale)}`;\n return `<tr>\n <td>${escapeHtml(item.contentType)}</td>\n <td class=\"mono\"><a href=\"${href}\">${escapeHtml(item.enSlug)}</a></td>\n <td>${escapeHtml(item.locale)}</td>\n <td>${statusDot(item.reason === \"stale\" ? \"stale\" : \"missing\")}</td>\n </tr>`;\n })\n .join(\"\");\n const html = `<div class=\"toolbar\">Staleness <span class=\"dim\">· ${worklist.length} entries</span></div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>Slug</th><th>Locale</th><th>Status</th></tr></thead>\n <tbody>${rows || `<tr><td colspan=\"4\" class=\"dim\">All up to date</td></tr>`}</tbody>\n </table>`;\n return c.html(renderLayout(\"Staleness\", html, project));\n });\n\n app.get(\"/api/staleness-matrix\", (c) => {\n const worklist = buildWorklist(config);\n const matrix: Record<string, Record<string, number>> = {};\n for (const type of project.listTypes()) {\n matrix[type.id] = {};\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n matrix[type.id]![locale] = worklist.filter(\n (item) => item.contentType === type.id && item.locale === locale,\n ).length;\n }\n }\n return c.json(matrix);\n });\n\n const port = options.port ?? 3600;\n const host = options.host ?? \"127.0.0.1\";\n serve({ fetch: app.fetch, port, hostname: host }, () => {\n console.log(`Scribe studio listening on http://${host}:${port}`);\n });\n}\n"]}
1
+ {"version":3,"sources":["../../src/core/field.ts","../../src/core/introspect-schema.ts","../../src/inline/tokens.ts","../../src/hash/page-hash.ts","../../src/i18n/build-url.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/resolve-tokens.ts","../../src/loader/normalize-en.ts","../../src/loader/create-loader.ts","../../src/translate/worklist.ts","../../src/i18n/resolve-document.ts","../../src/create-project.ts","../../src/core/alias-helpers.ts","../../src/redirects/redirect-schema.ts","../../src/redirects/load-type-redirects.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/core/managed-roots.ts","../../studio/shared.ts","../../studio/introspect-fields.ts","../../studio/asset-serve.ts","../../studio/mdx-preview.ts","../../studio/preview-tokens.ts","../../studio/content-views.ts","../../studio/asset-views.ts","../../src/delete/plan.ts","../../src/delete/execute.ts","../../studio/search.ts","../../studio/studio-cache.ts","../../studio/server.ts"],"names":["path","prefix","z","fs","valStart","matter","options","listEnSlugs","isStringRecord","buf","text","renderTable","IMAGE_EXT","escapeHtml","encodePathSegment","renderLayout"],"mappings":"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","file":"server.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","/**\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 { 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 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 { 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","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 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 { 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 { 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 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 { 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 { ScribeProject } from \"../src/core/types.js\";\nimport { getManagedRoots } from \"../src/core/managed-roots.js\";\nimport { isTypeTranslatable } from \"../src/core/introspect-schema.js\";\n\nexport function escapeHtml(value: string): string {\n return value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n\nexport function encodePathSegment(value: string): string {\n return encodeURIComponent(value);\n}\n\n/** URL for the studio asset-preview route (source file off disk, not publicPath). */\nexport function assetPreviewUrl(webPath: string): string {\n return `/asset?p=${encodeURIComponent(webPath)}`;\n}\n\nexport interface LayoutOptions {\n /** Highlighted content type in the sidebar. */\n activeTypeId?: string;\n /** Highlighted top-level nav entry (\"dashboard\" | \"assets\" | typeId). */\n activeNav?: string;\n /** Current query to prefill the sidebar search box. */\n searchQuery?: string;\n}\n\n/** The shared studio CSS. Extends the original stylesheet with content-management additions. */\nexport const STUDIO_CSS = `\n:root {\n --bg: #1e1e1e;\n --sidebar: #252526;\n --bar: #333333;\n --panel: #1e1e1e;\n --border: #3c3c3c;\n --text: #cccccc;\n --dim: #858585;\n --accent: #3794ff;\n --hover: #2a2d2e;\n --active: #37373d;\n --ok: #89d185;\n --stale: #cca700;\n --missing: #f48771;\n --source: #75beff;\n --mono: ui-monospace, \"Cascadia Code\", \"SF Mono\", Menlo, monospace;\n --ui: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --fs: 13px;\n --fs-sm: 11px;\n}\n* { box-sizing: border-box; margin: 0; padding: 0; }\nbody { font: var(--fs)/1.4 var(--ui); background: var(--bg); color: var(--text); }\na { color: var(--accent); text-decoration: none; }\na:hover { text-decoration: underline; }\n.app { display: flex; height: 100vh; overflow: hidden; }\n\n/* activity bar */\n.actbar {\n width: 48px; flex-shrink: 0; background: var(--bar);\n display: flex; flex-direction: column; align-items: center;\n padding: 8px 0; gap: 4px; border-right: 1px solid var(--border);\n}\n.actbar a {\n width: 48px; height: 48px; display: flex; align-items: center; justify-content: center;\n color: var(--dim); font-size: 18px; text-decoration: none; position: relative;\n}\n.actbar a:hover { color: var(--text); }\n.actbar a.active { color: var(--text); }\n.actbar a.active::before {\n content: \"\"; position: absolute; left: 0; top: 8px; bottom: 8px;\n width: 2px; background: var(--accent);\n}\n\n/* sidebar */\n.sidebar {\n width: 200px; flex-shrink: 0; background: var(--sidebar);\n border-right: 1px solid var(--border); display: flex; flex-direction: column;\n overflow: hidden;\n}\n.sidebar-head {\n padding: 8px 12px; font-size: var(--fs-sm); font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.04em; color: var(--dim);\n}\n.sidebar-body { flex: 1; overflow-y: auto; padding: 2px 0; }\n.tree-item {\n display: flex; flex-direction: column; padding: 3px 12px 3px 20px;\n color: var(--text); text-decoration: none; line-height: 1.3;\n}\n.tree-item:hover { background: var(--hover); text-decoration: none; }\n.tree-item.active { background: var(--active); }\n.tree-label { font-size: var(--fs); }\n.tree-meta { font-size: var(--fs-sm); color: var(--dim); }\n.tree-item .tree-label .badge { float: right; }\n\n/* main */\n.main { flex: 1; display: flex; flex-direction: column; overflow: hidden; }\n.toolbar {\n display: flex; align-items: center; gap: 6px; padding: 0 12px;\n height: 35px; background: var(--sidebar); border-bottom: 1px solid var(--border);\n font-size: var(--fs-sm); color: var(--dim); flex-shrink: 0; overflow: hidden;\n}\n.toolbar a { color: var(--dim); }\n.toolbar a:hover { color: var(--text); }\n.toolbar .sep { color: var(--border); }\n.toolbar .spacer { flex: 1; }\n.content { flex: 1; overflow-y: auto; padding: 0; }\n\n/* tabs (locale switcher) */\n.tabs {\n display: flex; background: var(--sidebar); border-bottom: 1px solid var(--border);\n overflow-x: auto; flex-shrink: 0;\n}\n.tab {\n display: flex; align-items: center; gap: 6px; padding: 6px 12px;\n font-size: var(--fs-sm); color: var(--dim); border-right: 1px solid var(--border);\n text-decoration: none; white-space: nowrap;\n}\n.tab:hover { background: var(--hover); color: var(--text); text-decoration: none; }\n.tab.active {\n background: var(--bg); color: var(--text);\n border-bottom: 1px solid var(--bg); margin-bottom: -1px;\n}\n\n/* status dots */\n.status { display: inline-flex; align-items: center; gap: 4px; font-size: var(--fs-sm); color: var(--dim); }\n.dot { width: 6px; height: 6px; border-radius: 50%; flex-shrink: 0; }\n.dot-source { background: var(--source); }\n.dot-up-to-date { background: var(--ok); }\n.dot-stale { background: var(--stale); }\n.dot-missing { background: var(--missing); opacity: 0.7; }\n.dot-not-translatable { background: var(--dim); opacity: 0.6; }\n.dots { display: inline-flex; gap: 3px; align-items: center; }\n\n/* sections */\n.section { border-bottom: 1px solid var(--border); }\n.section-head {\n padding: 4px 12px; font-size: var(--fs-sm); font-weight: 600;\n text-transform: uppercase; letter-spacing: 0.04em; color: var(--dim);\n background: var(--sidebar);\n}\n.section-body { padding: 0; }\n\n/* tables */\ntable { border-collapse: collapse; width: 100%; font-size: var(--fs); }\n.data th, .data td { padding: 2px 12px; text-align: left; border-bottom: 1px solid var(--border); vertical-align: top; }\n.data th { font-size: var(--fs-sm); font-weight: 600; color: var(--dim); background: var(--sidebar); height: 22px; }\n.data tr:hover td { background: var(--hover); }\n.data .mono { font-family: var(--mono); font-size: var(--fs-sm); }\n\n/* key-value (frontmatter) */\n.kv td { padding: 1px 12px; font-family: var(--mono); font-size: var(--fs-sm); vertical-align: top; border-bottom: 1px solid var(--border); }\n.kv .k { width: 160px; color: #9cdcfe; white-space: nowrap; }\n.kv .v { color: #ce9178; white-space: pre-wrap; word-break: break-word; }\n.flag { font-size: 9px; font-weight: 700; margin-right: 4px; opacity: 0.5; }\n.flag.t { color: var(--ok); }\n.flag.s { color: var(--dim); }\n\n/* code block */\n.code {\n margin: 0; padding: 8px 12px; font: var(--fs-sm)/1.5 var(--mono);\n white-space: pre-wrap; word-break: break-word; color: var(--text);\n background: var(--bg); border: none;\n}\n\n/* meta row */\n.meta { display: flex; flex-wrap: wrap; font-size: var(--fs-sm); border-bottom: 1px solid var(--border); padding: 4px 0; }\n.meta dt { padding: 0 4px 0 12px; color: var(--dim); }\n.meta dt::after { content: \":\"; }\n.meta dd { padding: 0 12px 0 0; font-family: var(--mono); }\n\n/* misc */\n.dim { color: var(--dim); }\n.page-title { padding: 8px 12px 4px; font-size: 14px; font-weight: 400; }\n.page-sub { padding: 0 12px 8px; font-size: var(--fs-sm); color: var(--dim); }\ndetails summary { cursor: pointer; color: var(--accent); font-size: var(--fs-sm); }\ndetails[open] summary { margin-bottom: 4px; }\n.tag { font-size: var(--fs-sm); color: var(--dim); margin-left: 6px; }\n.tag-warn { color: var(--stale); }\n.tag-err { color: var(--missing); }\n\n/* dashboard */\n.cards { display: flex; flex-wrap: wrap; gap: 1px; background: var(--border); border-bottom: 1px solid var(--border); }\n.card { flex: 1 1 120px; background: var(--bg); padding: 12px; min-width: 120px; }\n.card-value { font-size: 22px; font-weight: 300; line-height: 1.2; }\n.card-label { font-size: var(--fs-sm); color: var(--dim); margin-top: 2px; }\n.bar { display: inline-flex; width: 120px; height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; vertical-align: middle; margin-right: 8px; }\n.bar-fill { display: block; height: 100%; }\n\n/* ---- content management additions ---- */\n\n/* chips (enum / relation values) */\n.chip {\n display: inline-flex; align-items: center; gap: 3px; padding: 0 6px;\n height: 16px; border-radius: 8px; font-size: 10px; line-height: 16px;\n background: var(--active); color: var(--text); margin: 1px 2px 1px 0; white-space: nowrap;\n}\n.chip.rel { background: #22343f; color: var(--source); }\n.chip.rel-bad { background: #3f2222; color: var(--missing); }\n.chip.nt { background: var(--bar); color: var(--dim); }\n.chip a { color: inherit; }\n\n/* validation badges */\n.vbadge {\n display: inline-flex; align-items: center; padding: 0 6px; height: 15px;\n border-radius: 3px; font-size: 10px; font-weight: 600; line-height: 15px; margin: 0 2px;\n}\n.vbadge.err { background: #3f2222; color: var(--missing); }\n.vbadge.warn { background: #3a3320; color: var(--stale); }\n.vbadge.info { background: #22343f; color: var(--source); }\n.vbadge.ok { background: #22331f; color: var(--ok); }\n\n/* filter bar */\n.filters {\n display: flex; flex-wrap: wrap; gap: 8px; align-items: center;\n padding: 6px 12px; background: var(--sidebar); border-bottom: 1px solid var(--border);\n font-size: var(--fs-sm);\n}\n.filters label { display: inline-flex; align-items: center; gap: 4px; color: var(--dim); }\n.filters select, .filters input[type=text] {\n background: var(--bg); color: var(--text); border: 1px solid var(--border);\n border-radius: 3px; font: var(--fs-sm) var(--ui); padding: 2px 4px;\n}\n.filters .reset { margin-left: auto; }\n.viewtoggle { display: inline-flex; border: 1px solid var(--border); border-radius: 3px; overflow: hidden; }\n.viewtoggle a { padding: 2px 8px; color: var(--dim); border-right: 1px solid var(--border); }\n.viewtoggle a:last-child { border-right: none; }\n.viewtoggle a.active { background: var(--active); color: var(--text); text-decoration: none; }\n\n/* gallery */\n.gallery {\n display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));\n gap: 10px; padding: 12px;\n}\n.gcard { background: var(--sidebar); border: 1px solid var(--border); border-radius: 4px; overflow: hidden; }\n.gcard .thumb {\n aspect-ratio: 1 / 1; background: #111 repeating-linear-gradient(45deg, #1a1a1a 0 8px, #161616 8px 16px);\n display: flex; align-items: center; justify-content: center; overflow: hidden;\n}\n.gcard .thumb img { width: 100%; height: 100%; object-fit: contain; display: block; }\n.gcard .thumb .noimg { color: var(--dim); font-size: var(--fs-sm); }\n.gcard .body { padding: 6px 8px; }\n.gcard .gslug { font-family: var(--mono); font-size: var(--fs-sm); display: block; margin-bottom: 3px; }\n.gcard .gkey { font-size: 10px; color: var(--dim); }\n\n/* asset preview panel (inspector) */\n.asset-preview { display: flex; gap: 12px; padding: 8px 12px; align-items: flex-start; }\n.asset-preview .frame {\n width: 160px; height: 160px; flex-shrink: 0; border: 1px solid var(--border); border-radius: 4px;\n background: #111 repeating-linear-gradient(45deg, #1a1a1a 0 8px, #161616 8px 16px);\n display: flex; align-items: center; justify-content: center; overflow: hidden;\n}\n.asset-preview .frame img { max-width: 100%; max-height: 100%; object-fit: contain; }\n.asset-preview .info { font-size: var(--fs-sm); }\n.asset-preview .info .mono { font-family: var(--mono); color: #ce9178; }\n\n/* asset browser grid */\n.asset-grid {\n display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n gap: 10px; padding: 12px;\n}\n.acard { background: var(--sidebar); border: 1px solid var(--border); border-radius: 4px; overflow: hidden; }\n.acard .athumb {\n aspect-ratio: 1 / 1;\n background: #111 repeating-linear-gradient(45deg, #1a1a1a 0 8px, #161616 8px 16px);\n display: flex; align-items: center; justify-content: center; overflow: hidden;\n}\n.acard .athumb img { width: 100%; height: 100%; object-fit: contain; }\n.acard .abody { padding: 6px 8px; font-size: 10px; }\n.acard .apath { font-family: var(--mono); font-size: 10px; color: var(--dim); word-break: break-all; display: block; margin-bottom: 3px; }\n\n/* ---- global search ---- */\n.sidebar-search { padding: 8px; border-bottom: 1px solid var(--border); }\n.sidebar-search input {\n width: 100%; background: var(--bg); color: var(--text); border: 1px solid var(--border);\n border-radius: 3px; font: var(--fs-sm) var(--ui); padding: 4px 6px;\n}\n.search-group { border-bottom: 1px solid var(--border); }\n.search-hit { padding: 6px 12px; border-bottom: 1px solid var(--border); }\n.search-hit:last-child { border-bottom: none; }\n.search-where { font-size: var(--fs-sm); color: var(--dim); margin-left: 8px; }\n.search-snip { display: block; margin-top: 3px; font-size: var(--fs-sm); color: var(--text); font-family: var(--mono); word-break: break-word; }\n.search-more { padding: 4px 12px; font-size: var(--fs-sm); color: var(--dim); }\nmark { background: #3a3320; color: var(--stale); border-radius: 3px; padding: 0 2px; }\n\n/* ---- validation tooltip ---- */\n.vtip { position: relative; display: inline-block; }\n.vtip-panel {\n position: absolute; right: 0; top: 100%; margin-top: 4px; z-index: 60;\n min-width: 280px; max-width: 420px; background: var(--panel, #1c1c1e);\n border: 1px solid var(--border); border-radius: 6px; padding: 8px 10px;\n box-shadow: 0 8px 24px rgba(0,0,0,.5); text-align: left; white-space: normal; display: none;\n}\n.vtip:hover .vtip-panel, .vtip:focus-within .vtip-panel { display: block; }\n.vrow { display: flex; align-items: baseline; gap: 6px; padding: 3px 0; font-size: var(--fs-sm); line-height: 1.4; }\n.vrow .vbadge { flex-shrink: 0; }\n.vrow .vmeta { font-family: var(--mono); font-size: 10px; color: var(--dim); flex-shrink: 0; }\n.vrow .vmsg { color: var(--text); word-break: break-word; }\n.vrow.more { color: var(--dim); }\n/* The sidebar tree scrolls (overflow clips its children); pin the panel to the\n viewport so the type-badge tooltip escapes that clip. */\n.tree-item .vtip-panel { position: fixed; top: auto; right: auto; }\n\n/* ---- inspector toolbar: prev/next nav + delete ---- */\n.navgroup { display: inline-flex; gap: 2px; margin-left: 6px; }\n.navbtn {\n display: inline-flex; align-items: center; justify-content: center;\n min-width: 20px; height: 20px; padding: 0 5px; border: 1px solid var(--border);\n border-radius: 4px; color: var(--dim); font-size: 14px; line-height: 1; text-decoration: none;\n}\n.navbtn:hover { color: var(--text); background: var(--hover); text-decoration: none; }\n.navbtn.disabled { opacity: 0.35; pointer-events: none; }\n.btn-danger {\n color: var(--missing); border: 1px solid currentColor; border-radius: 4px; padding: 2px 8px;\n background: transparent; font: var(--fs-sm) var(--ui); text-decoration: none; cursor: pointer;\n margin-left: 6px;\n}\n.btn-danger:hover { background: rgba(244,135,113,0.12); text-decoration: none; }\n.btn {\n color: var(--text); border: 1px solid var(--border); border-radius: 4px; padding: 4px 12px;\n background: transparent; font: var(--fs) var(--ui); text-decoration: none; cursor: pointer;\n}\n.btn:hover { background: var(--hover); text-decoration: none; }\n.btn-lg { padding: 6px 16px; font-size: var(--fs); }\n\n/* ---- delete confirmation page ---- */\n.del-page { padding: 0 0 24px; }\n.del-banner { padding: 12px; margin: 12px; border: 1px solid var(--border); border-radius: 4px; background: var(--sidebar); font-size: var(--fs); }\n.del-banner.del-blocked { border-color: var(--missing); color: var(--missing); }\n.del-actions { display: flex; align-items: center; gap: 10px; padding: 16px 12px; }\n.del-actions form { margin: 0; }\n\n/* ---- body raw/preview tabs ---- */\n.bodytabs { margin-left: 8px; font-weight: 400; text-transform: none; }\n.bodytabs a { color: var(--dim); padding: 0 4px; }\n.bodytabs a.active { color: var(--text); }\n\n/* ---- rendered MDX approximation ---- */\n.mdx-preview { padding: 10px 14px; font-size: var(--fs); line-height: 1.6; }\n.mdx-preview .mdx-h { margin: 12px 0 6px; line-height: 1.3; font-weight: 600; }\n.mdx-preview h1.mdx-h { font-size: 20px; }\n.mdx-preview h2.mdx-h { font-size: 17px; }\n.mdx-preview h3.mdx-h { font-size: 15px; }\n.mdx-preview h4.mdx-h, .mdx-preview h5.mdx-h, .mdx-preview h6.mdx-h { font-size: 13px; }\n.mdx-preview .mdx-p { margin: 6px 0; }\n.mdx-preview .mdx-list { margin: 6px 0 6px 20px; }\n.mdx-preview .mdx-list li { margin: 2px 0; }\n.mdx-preview .mdx-quote { border-left: 3px solid var(--border); margin: 8px 0; padding: 2px 0 2px 12px; color: var(--dim); }\n.mdx-preview .mdx-hr { border: none; border-top: 1px solid var(--border); margin: 12px 0; }\n.mdx-preview .mdx-code { background: var(--bg); border: 1px solid var(--border); border-radius: 4px; padding: 8px 12px; overflow-x: auto; margin: 8px 0; }\n.mdx-preview .mdx-code code { font: var(--fs-sm)/1.5 var(--mono); color: var(--text); }\n.mdx-preview .mdx-inline-code { font-family: var(--mono); font-size: 12px; background: var(--active); border-radius: 3px; padding: 0 4px; }\n.mdx-preview .mdx-link { color: var(--accent); text-decoration: underline; text-decoration-style: dotted; cursor: help; }\n.mdx-preview .mdx-table { width: auto; margin: 8px 0; border: 1px solid var(--border); }\n.mdx-preview .mdx-table th, .mdx-preview .mdx-table td { border: 1px solid var(--border); padding: 3px 8px; text-align: left; }\n.mdx-preview .mdx-table th { background: var(--sidebar); color: var(--text); }\n.mdx-preview .mdx-fallback, pre.mdx-fallback { margin: 8px 0; padding: 8px 12px; font: var(--fs-sm)/1.5 var(--mono); white-space: pre-wrap; word-break: break-word; color: var(--dim); background: var(--bg); border: 1px dashed var(--border); }\n.mdx-preview .mdx-jsx { border: 1px solid var(--border); border-radius: 4px; margin: 8px 0; background: var(--sidebar); }\n.mdx-preview .mdx-jsx-head { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--source); padding: 3px 8px; border-bottom: 1px solid var(--border); background: var(--bar); }\n.mdx-preview .mdx-jsx-props { display: flex; flex-wrap: wrap; gap: 4px 10px; padding: 6px 8px; font-family: var(--mono); font-size: 10px; }\n.mdx-preview .mdx-jsx-props .k { color: #9cdcfe; }\n.mdx-preview .mdx-jsx-props .v { color: #ce9178; }\n.mdx-preview .mdx-jsx-children { padding: 4px 8px; }\n.mdx-preview .mdx-jsx-raw { background: var(--sidebar); border: 1px solid var(--border); border-radius: 4px; margin: 8px 0; padding: 8px 12px; overflow-x: auto; }\n.mdx-preview .mdx-jsx-raw code { font: var(--fs-sm)/1.5 var(--mono); color: var(--dim); white-space: pre; }\n.mdx-preview .mdx-img { max-width: 100%; height: auto; display: block; border-radius: 4px; margin: 8px 0; }\n.mdx-preview .mdx-relation-link { color: var(--accent); text-decoration: none; }\n.mdx-preview .mdx-relation-link:hover { text-decoration: underline; }\n.mdx-preview .mdx-relation-chip { display: inline-block; padding: 0 6px; border-radius: 3px; background: var(--active); color: var(--accent); text-decoration: none; font-size: var(--fs-sm); }\n.mdx-preview .mdx-relation-chip:hover { text-decoration: underline; }\n.mdx-preview .mdx-relation-broken { display: inline-block; padding: 0 6px; border-radius: 3px; background: rgba(244,135,113,0.12); color: var(--missing); text-decoration: line-through; font-size: var(--fs-sm); }\n`;\n\n/** Render the shared studio chrome (activity bar + type sidebar + content). */\nexport function renderLayout(\n title: string,\n body: string,\n project: ScribeProject,\n options: LayoutOptions & { typeBadges?: Map<string, string> } = {},\n): string {\n const typeLinks = project\n .listTypes()\n .map((type) => {\n const active = type.id === options.activeTypeId ? \" active\" : \"\";\n const badge = options.typeBadges?.get(type.id) ?? \"\";\n // Neutral marker (not a red/warning badge): this type has nothing to\n // translate, so it carries no per-locale status anywhere in the studio.\n const ntChip = isTypeTranslatable(type.config)\n ? \"\"\n : ` <span class=\"chip nt\" title=\"No translatable fields and no body\">not translatable</span>`;\n return `<a class=\"tree-item${active}\" href=\"/types/${encodePathSegment(type.id)}\">\n <span class=\"tree-label\">${escapeHtml(type.config.label)}${badge}${ntChip}</span>\n <span class=\"tree-meta\">${escapeHtml(type.id)}</span>\n </a>`;\n })\n .join(\"\");\n\n const assetsEnabled = getManagedRoots(project.config).length > 0 || Boolean(project.config.assets);\n const assetsNav = assetsEnabled\n ? `<a href=\"/assets\" title=\"Assets\"${options.activeNav === \"assets\" ? ' class=\"active\"' : \"\"}>▤</a>`\n : \"\";\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)} — Scribe</title>\n <style>${STUDIO_CSS}</style>\n</head>\n<body>\n <div class=\"app\">\n <nav class=\"actbar\">\n <a href=\"/\" title=\"Overview\">⌂</a>\n <a href=\"/dashboard\" title=\"Dashboard\"${options.activeNav === \"dashboard\" ? ' class=\"active\"' : \"\"}>▦</a>\n <a href=\"/staleness\" title=\"Staleness\">⚠</a>\n ${assetsNav}\n </nav>\n <aside class=\"sidebar\">\n <form class=\"sidebar-search\" method=\"get\" action=\"/search\">\n <input type=\"search\" name=\"q\" value=\"${escapeHtml(options.searchQuery ?? \"\")}\" placeholder=\"Search content…\" aria-label=\"Search content\" />\n </form>\n <div class=\"sidebar-head\">Types</div>\n <div class=\"sidebar-body\">${typeLinks || `<span class=\"dim\" style=\"padding:8px 12px\">—</span>`}</div>\n </aside>\n <div class=\"main\">\n <div class=\"content\">${body}</div>\n </div>\n </div>\n</body>\n</html>`;\n}\n","import type { z } from \"zod\";\nimport { peelOptionalWrappers } from \"../src/core/field.js\";\nimport {\n introspectSchema,\n listAssetFields,\n listRelationFields,\n type SchemaFieldMeta,\n} from \"../src/core/introspect-schema.js\";\nimport { collectImagePaths } from \"../src/validate/validate-assets.js\";\nimport { extractInlineTokens } from \"../src/inline/tokens.js\";\nimport type { ContentTypeRuntime, ScribeDocument } from \"../src/core/types.js\";\n\n/**\n * Studio-only schema introspection: extends the core `SchemaFieldMeta` with the\n * bits the read-only browser needs — enum options and a scalar/filterable\n * classification — none of which the loader/validator require. Kept generic:\n * everything is derived from the zod schema, never from a content-type id.\n */\n\nexport type FilterKind = \"enum\" | \"relation\" | \"boolean\" | \"string\";\n\nexport interface StudioFieldMeta extends SchemaFieldMeta {\n /** Enum options, when the peeled leaf schema is a `z.enum`. */\n enumOptions?: string[];\n /** True when the peeled leaf schema is a boolean. */\n isBoolean?: boolean;\n /** True when the field is a single-value scalar (string/number/enum/boolean, not array/object). */\n isScalar?: boolean;\n}\n\n/** Walk a schema path to its leaf zod node so we can read enum options / boolean-ness. */\nfunction leafSchemaAtPath(schema: z.ZodTypeAny, path: string[]): z.ZodTypeAny | null {\n let current: z.ZodTypeAny | null = peelOptionalWrappers(schema);\n for (const segment of path) {\n if (!current) return null;\n if (segment === \"*\") {\n const def = (current as z.ZodTypeAny & { _def?: { type?: string } })._def;\n if (def?.type === \"array\") {\n current = peelOptionalWrappers((current as z.ZodArray<z.ZodTypeAny>).element);\n continue;\n }\n return null;\n }\n if (current instanceof Object && \"shape\" in current) {\n const shape = (current as z.ZodObject<z.ZodRawShape>).shape;\n const child = shape[segment] as z.ZodTypeAny | undefined;\n if (!child) return null;\n current = peelOptionalWrappers(child);\n continue;\n }\n return null;\n }\n return current;\n}\n\nfunction enumOptionsOf(leaf: z.ZodTypeAny): string[] | undefined {\n const withOptions = leaf as z.ZodTypeAny & { options?: unknown; _def?: { type?: string } };\n if (withOptions._def?.type !== \"enum\") return undefined;\n const options = withOptions.options;\n if (Array.isArray(options) && options.every((o) => typeof o === \"string\")) {\n return options as string[];\n }\n return undefined;\n}\n\nfunction leafTypeName(leaf: z.ZodTypeAny): string | undefined {\n return (leaf as z.ZodTypeAny & { _def?: { type?: string } })._def?.type;\n}\n\n/** Introspect a content schema for the studio: field kinds plus enum/boolean/scalar hints. */\nexport function introspectStudioFields(schema: z.ZodTypeAny): StudioFieldMeta[] {\n return introspectSchema(schema).map((field) => {\n const leaf = leafSchemaAtPath(schema, field.path);\n const meta: StudioFieldMeta = { ...field };\n if (leaf) {\n const enumOptions = enumOptionsOf(leaf);\n if (enumOptions) meta.enumOptions = enumOptions;\n const typeName = leafTypeName(leaf);\n meta.isBoolean = typeName === \"boolean\";\n meta.isScalar =\n typeName === \"string\" ||\n typeName === \"number\" ||\n typeName === \"enum\" ||\n typeName === \"boolean\";\n }\n return meta;\n });\n}\n\nexport interface FilterFieldMeta {\n /** Dotted field path (top-level only; no `*` segments). */\n key: string;\n kind: FilterKind;\n /** Enum options for `kind === \"enum\"`. */\n enumOptions?: string[];\n /** Relation target type id for `kind === \"relation\"`. */\n relationTarget?: string;\n}\n\n/**\n * Filterable fields for a type's collection browser: top-level enum, relation,\n * boolean and string fields (no nested `*` array fields — those don't map onto a\n * single query param cleanly). Order follows schema declaration order.\n */\nexport function filterFieldsFor(schema: z.ZodTypeAny): FilterFieldMeta[] {\n const out: FilterFieldMeta[] = [];\n for (const field of introspectStudioFields(schema)) {\n if (field.path.length !== 1 || field.path.includes(\"*\")) continue;\n const key = field.path[0]!;\n if (field.kind === \"relation\") {\n out.push({ key, kind: \"relation\", relationTarget: field.relationTarget });\n } else if (field.enumOptions) {\n out.push({ key, kind: \"enum\", enumOptions: field.enumOptions });\n } else if (field.isBoolean) {\n out.push({ key, kind: \"boolean\" });\n } else if (field.kind !== \"asset\" && field.isScalar) {\n out.push({ key, kind: \"string\" });\n }\n }\n return out;\n}\n\n/**\n * Key fields to preview in the entry table (first few scalar/enum/relation\n * top-level fields, excluding assets which get their own gallery treatment).\n * Generic: picks by kind, never by field name.\n */\nexport function keyFieldsFor(schema: z.ZodTypeAny, limit = 4): StudioFieldMeta[] {\n const out: StudioFieldMeta[] = [];\n for (const field of introspectStudioFields(schema)) {\n if (field.path.length !== 1 || field.path.includes(\"*\")) continue;\n if (field.kind === \"asset\") continue;\n const isEnumOrRelation = field.kind === \"relation\" || Boolean(field.enumOptions);\n if (isEnumOrRelation || field.isScalar || field.kind === \"translatable\") {\n out.push(field);\n }\n if (out.length >= limit) break;\n }\n return out;\n}\n\n/** First top-level asset field of a type, if any (the gallery's primary image). */\nexport function primaryAssetField(schema: z.ZodTypeAny): SchemaFieldMeta | undefined {\n return listAssetFields(schema).find((f) => !f.path.includes(\"*\")) ?? listAssetFields(schema)[0];\n}\n\n/** Read a frontmatter value at a dotted/`*` path (top-level flat use only). */\nexport function valueAtPath(\n frontmatter: Record<string, unknown>,\n path: string[],\n): unknown {\n let current: unknown = frontmatter;\n for (const segment of path) {\n if (segment === \"*\") return current; // arrays: return the array itself\n if (typeof current !== \"object\" || current === null || Array.isArray(current)) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\n// ---------------------------------------------------------------------------\n// Back-reference index (relations)\n// ---------------------------------------------------------------------------\n\nexport interface BackRef {\n /** Type id of the referring entry. */\n typeId: string;\n /** EN slug of the referring entry. */\n enSlug: string;\n /** Dotted relation field path on the referring entry. */\n field: string;\n}\n\n/** `targetTypeId` → `targetEnSlug` → list of entries referencing it. */\nexport type BackRefIndex = Map<string, Map<string, BackRef[]>>;\n\nfunction pushBackRef(index: BackRefIndex, targetType: string, targetSlug: string, ref: BackRef): void {\n let byType = index.get(targetType);\n if (!byType) {\n byType = new Map();\n index.set(targetType, byType);\n }\n const list = byType.get(targetSlug) ?? [];\n list.push(ref);\n byType.set(targetSlug, list);\n}\n\ninterface RelationScanInput {\n typeId: string;\n enSlug: string;\n frontmatter: Record<string, unknown>;\n relationFields: SchemaFieldMeta[];\n /** MDX body, scanned for `${{relation:...}}` inline tokens. */\n body?: string;\n}\n\n/**\n * Build a reverse-reference index over every relation field of every EN entry:\n * \"which entries point at (targetType, targetSlug)?\". Pure over the provided\n * document snapshots — no filesystem access — so it's unit-testable.\n */\nexport function buildBackRefIndex(inputs: RelationScanInput[]): BackRefIndex {\n const index: BackRefIndex = new Map();\n for (const input of inputs) {\n for (const field of input.relationFields) {\n const target = field.relationTarget;\n if (!target) continue;\n const value = valueAtPath(input.frontmatter, field.path);\n const ref: BackRef = { typeId: input.typeId, enSlug: input.enSlug, field: field.path.join(\".\") };\n if (field.relationMultiple) {\n if (!Array.isArray(value)) continue;\n for (const slug of value) {\n if (typeof slug === \"string\" && slug) pushBackRef(index, target, slug, ref);\n }\n } else if (typeof value === \"string\" && value) {\n pushBackRef(index, target, value, ref);\n }\n }\n\n // Body relation tokens (`${{relation:type:slug}}`, both URL and slug modes)\n // register as back-refs with a `body` field label.\n if (input.body) {\n for (const token of extractInlineTokens(input.body).tokens) {\n if (token.kind !== \"relation\") continue;\n pushBackRef(index, token.targetTypeId, token.enSlug, {\n typeId: input.typeId,\n enSlug: input.enSlug,\n field: \"body\",\n });\n }\n }\n }\n return index;\n}\n\n/** Look up entries referencing a target entry via any relation field. */\nexport function backRefsFor(index: BackRefIndex, targetType: string, targetSlug: string): BackRef[] {\n return index.get(targetType)?.get(targetSlug) ?? [];\n}\n\n// ---------------------------------------------------------------------------\n// Asset reference graph\n// ---------------------------------------------------------------------------\n\nexport interface AssetRef {\n typeId: string;\n enSlug: string;\n /** Dotted field path, or `\"body\"`/`\"frontmatter\"` for heuristic matches. */\n field: string;\n /** True when the reference comes from a declared `field.asset()` (carries constraints). */\n declared: boolean;\n /** Declared field's `maxKB`, when known. */\n maxKB?: number;\n /** Declared field's allowed `formats`, when known. */\n formats?: string[];\n}\n\n/** web path (source, unresolved) → list of references. */\nexport type AssetRefIndex = Map<string, AssetRef[]>;\n\ninterface AssetScanInput {\n typeId: string;\n enSlug: string;\n /** SOURCE (unresolved) frontmatter — declared asset values are raw web paths. */\n frontmatter: Record<string, unknown>;\n body: string;\n assetFields: SchemaFieldMeta[];\n}\n\nfunction pushAssetRef(index: AssetRefIndex, webPath: string, ref: AssetRef): void {\n const list = index.get(webPath) ?? [];\n list.push(ref);\n index.set(webPath, list);\n}\n\n/** Collect each concrete declared-asset value (materializing templates) from source frontmatter. */\nfunction collectDeclaredValues(\n frontmatter: Record<string, unknown>,\n enSlug: string,\n field: SchemaFieldMeta,\n): Array<{ value: string; fieldPath: string }> {\n const out: Array<{ value: string; fieldPath: string }> = [];\n const walk = (container: unknown, path: string[], soFar: string[]): 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 if (rest.length === 0) {\n const value = record[head];\n const fieldPath = [...soFar, head].join(\".\");\n if (typeof value === \"string\" && value) out.push({ value, fieldPath });\n else if (value === undefined && field.assetTemplate) {\n out.push({ value: field.assetTemplate.split(\"{slug}\").join(enSlug), fieldPath });\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (!Array.isArray(arr)) return;\n arr.forEach((item) => walk(item, rest.slice(1), [...soFar, head, \"*\"]));\n return;\n }\n walk(record[head], rest, [...soFar, head]);\n };\n walk(frontmatter, field.path, []);\n return out;\n}\n\n/**\n * Build the asset reference graph: every declared asset-field value (all types)\n * plus the heuristic `collectImagePaths` over frontmatter + MDX bodies. Keyed by\n * source web path. Pure over the provided snapshots — unit-testable.\n */\nexport function buildAssetRefIndex(inputs: AssetScanInput[]): AssetRefIndex {\n const index: AssetRefIndex = new Map();\n for (const input of inputs) {\n const declaredPaths = new Set<string>();\n for (const field of input.assetFields) {\n for (const { value, fieldPath } of collectDeclaredValues(input.frontmatter, input.enSlug, field)) {\n declaredPaths.add(value);\n pushAssetRef(index, value, {\n typeId: input.typeId,\n enSlug: input.enSlug,\n field: fieldPath,\n declared: true,\n maxKB: field.assetMaxKB,\n formats: field.assetFormats,\n });\n }\n }\n // Body asset tokens (`${{asset:/path}}`) are declared references — they name\n // an exact web path, unlike the heuristic image-path scan below.\n for (const token of extractInlineTokens(input.body).tokens) {\n if (token.kind !== \"asset\") continue;\n declaredPaths.add(token.webPath);\n pushAssetRef(index, token.webPath, {\n typeId: input.typeId,\n enSlug: input.enSlug,\n field: \"body\",\n declared: true,\n });\n }\n // Heuristic pass (body + frontmatter image-looking strings). Skip paths\n // already captured as declared to avoid double reporting the same file.\n for (const webPath of collectImagePaths(input.frontmatter, input.body)) {\n if (declaredPaths.has(webPath)) continue;\n pushAssetRef(index, webPath, {\n typeId: input.typeId,\n enSlug: input.enSlug,\n field: \"body/frontmatter\",\n declared: false,\n });\n }\n }\n return index;\n}\n\n// ---------------------------------------------------------------------------\n// Snapshot builders (filesystem-backed) — thin adapters over runtimes\n// ---------------------------------------------------------------------------\n\n/**\n * Read EN docs of every type and build both indexes. Uses the *source*\n * (unresolved) frontmatter — the studio builds its own preview URLs and never\n * relies on site-resolved asset URLs. Runtimes here come from `createProject()`\n * WITHOUT `resolveAssets`, so `frontmatter` already holds source values.\n */\nexport function buildIndexes(types: ContentTypeRuntime[]): {\n backRefs: BackRefIndex;\n assetRefs: AssetRefIndex;\n} {\n const relationInputs: RelationScanInput[] = [];\n const assetInputs: AssetScanInput[] = [];\n for (const type of types) {\n const relationFields = listRelationFields(type.config.schema);\n const assetFields = listAssetFields(type.config.schema);\n const docs = type.list() as ScribeDocument[];\n for (const doc of docs) {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n // Push for every doc (not only those with relation fields): a body may\n // hold `${{relation:...}}` tokens even when the schema declares none.\n relationInputs.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n frontmatter,\n relationFields,\n body: doc.content,\n });\n assetInputs.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n frontmatter,\n body: doc.content,\n assetFields,\n });\n }\n }\n return {\n backRefs: buildBackRefIndex(relationInputs),\n assetRefs: buildAssetRefIndex(assetInputs),\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../src/core/types.js\";\n\n/**\n * Read-only asset serving for the studio. The studio previews SOURCE files off\n * disk (never the site's resolved/publicPath URLs), so every surface points its\n * <img> at `/asset?p=<web-path>` and this module maps that web path back onto\n * the configured assets dir — traversal-safe.\n */\n\nconst CONTENT_TYPES: Record<string, string> = {\n \".webp\": \"image/webp\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".avif\": \"image/avif\",\n \".ico\": \"image/x-icon\",\n \".mp4\": \"video/mp4\",\n};\n\nexport function contentTypeForPath(webPath: string): string {\n return CONTENT_TYPES[path.extname(webPath).toLowerCase()] ?? \"application/octet-stream\";\n}\n\n/** The absolute assets directory the studio serves from, or null when disabled. */\nexport function assetsDirOf(config: ScribeConfig): string | null {\n return config.assets?.assetsPath ?? config.assetsPath ?? null;\n}\n\nexport interface ResolvedAssetPath {\n /** Absolute path on disk, guaranteed to be inside the assets dir. */\n absPath: string;\n}\n\n/**\n * Map a root-relative web path onto the assets dir, refusing anything that\n * escapes it. Returns null when the asset system is disabled or the resolved\n * path would land outside the assets root (path traversal, absolute paths,\n * symlink-free string check). Pure: no filesystem access — safe to unit-test.\n */\nexport function resolveAssetWebPath(\n config: ScribeConfig,\n webPath: string,\n): ResolvedAssetPath | null {\n const assetsDir = assetsDirOf(config);\n if (!assetsDir) return null;\n if (typeof webPath !== \"string\" || webPath.length === 0) return null;\n\n // Reject NUL and normalize to a root-relative path. Decode is the caller's job\n // (query params arrive decoded); we still guard against embedded traversal.\n if (webPath.includes(\"\\0\")) return null;\n\n const root = path.resolve(assetsDir);\n // Strip any leading slashes so path.join can't treat it as absolute, then\n // resolve and verify containment. `path.resolve` collapses `..` segments.\n const relative = webPath.replace(/^\\/+/, \"\");\n const absPath = path.resolve(root, relative);\n\n // Containment check: absPath must equal root or sit strictly beneath it.\n const rootWithSep = root.endsWith(path.sep) ? root : root + path.sep;\n if (absPath !== root && !absPath.startsWith(rootWithSep)) return null;\n\n return { absPath };\n}\n\nexport interface AssetFileInfo {\n exists: boolean;\n sizeBytes?: number;\n contentType: string;\n}\n\nexport interface StudioAssetResponse {\n /** Backed by a plain ArrayBuffer (not SharedArrayBuffer) so Hono's `c.body` accepts it. */\n body: Uint8Array<ArrayBuffer>;\n contentType: string;\n}\n\n/** Read and return a traversal-safe asset file for studio preview serving. */\nexport function serveStudioAsset(\n config: ScribeConfig,\n rawWebPath: string,\n): StudioAssetResponse | null {\n let webPath: string;\n try {\n webPath = decodeURIComponent(rawWebPath);\n } catch {\n return null;\n }\n const resolved = resolveAssetWebPath(config, webPath);\n if (!resolved) return null;\n const info = statAsset(resolved.absPath, webPath);\n if (!info.exists) return null;\n try {\n const buf = fs.readFileSync(resolved.absPath);\n // Copy into a fresh ArrayBuffer-backed view so the type is Uint8Array<ArrayBuffer>.\n const body = new Uint8Array(buf.byteLength);\n body.set(buf);\n return { body, contentType: contentTypeForPath(webPath) };\n } catch {\n return null;\n }\n}\n\n/** Stat a resolved asset (existence + size). */\nexport function statAsset(absPath: string, webPath: string): AssetFileInfo {\n const contentType = contentTypeForPath(webPath);\n try {\n const stat = fs.statSync(absPath);\n if (!stat.isFile()) return { exists: false, contentType };\n return { exists: true, sizeBytes: stat.size, contentType };\n } catch {\n return { exists: false, contentType };\n }\n}\n\nexport interface ImageDimensions {\n width: number;\n height: number;\n}\n\n/**\n * Read image dimensions from the file header when cheap (PNG, JPEG, WEBP, GIF);\n * returns null otherwise. Reads only the leading bytes needed. Never throws.\n */\nexport function readImageDimensions(absPath: string): ImageDimensions | null {\n let fd: number | undefined;\n try {\n fd = fs.openSync(absPath, \"r\");\n const head = Buffer.alloc(64);\n const read = fs.readSync(fd, head, 0, 64, 0);\n if (read < 24) return null;\n return dimensionsFromHeader(head, fd);\n } catch {\n return null;\n } finally {\n if (fd !== undefined) {\n try {\n fs.closeSync(fd);\n } catch {\n /* ignore */\n }\n }\n }\n}\n\nfunction dimensionsFromHeader(head: Buffer, fd: number): ImageDimensions | null {\n // PNG: 8-byte signature, then IHDR (width/height as big-endian u32 at 16/20).\n if (head.readUInt32BE(0) === 0x89504e47) {\n return { width: head.readUInt32BE(16), height: head.readUInt32BE(20) };\n }\n // GIF: \"GIF8\", width/height little-endian u16 at offset 6/8.\n if (head.toString(\"ascii\", 0, 4) === \"GIF8\") {\n return { width: head.readUInt16LE(6), height: head.readUInt16LE(8) };\n }\n // WEBP: RIFF....WEBP — VP8/VP8L/VP8X variants.\n if (head.toString(\"ascii\", 0, 4) === \"RIFF\" && head.toString(\"ascii\", 8, 12) === \"WEBP\") {\n return webpDimensions(head);\n }\n // JPEG: scan SOFn markers for dimensions (needs streaming past the header).\n if (head[0] === 0xff && head[1] === 0xd8) {\n return jpegDimensions(fd);\n }\n return null;\n}\n\nfunction webpDimensions(head: Buffer): ImageDimensions | null {\n const format = head.toString(\"ascii\", 12, 16);\n if (format === \"VP8 \") {\n // Lossy: 16-bit width/height at bytes 26/28 (14-bit, low bits).\n const width = head.readUInt16LE(26) & 0x3fff;\n const height = head.readUInt16LE(28) & 0x3fff;\n return { width, height };\n }\n if (format === \"VP8L\") {\n // Lossless: 14-bit dimensions packed after the 0x2f signature byte at 21.\n const b0 = head[21]!;\n const b1 = head[22]!;\n const b2 = head[23]!;\n const b3 = head[24]!;\n const width = 1 + (((b1 & 0x3f) << 8) | b0);\n const height = 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 & 0xc0) >> 6));\n return { width, height };\n }\n if (format === \"VP8X\") {\n // Extended: 24-bit canvas width/height minus one at bytes 24/27.\n const width = 1 + ((head[24]! | (head[25]! << 8) | (head[26]! << 16)) & 0xffffff);\n const height = 1 + ((head[27]! | (head[28]! << 8) | (head[29]! << 16)) & 0xffffff);\n return { width, height };\n }\n return null;\n}\n\nfunction jpegDimensions(fd: number): ImageDimensions | null {\n // Walk JPEG segments looking for a Start-Of-Frame marker (0xFFC0..0xFFCF,\n // excluding 0xC4/0xC8/0xCC). Read incrementally in small chunks.\n const buf = Buffer.alloc(2);\n let offset = 2; // skip SOI (FFD8)\n try {\n for (let guard = 0; guard < 4096; guard++) {\n if (fs.readSync(fd, buf, 0, 2, offset) < 2) return null;\n if (buf[0] !== 0xff) return null;\n const marker = buf[1]!;\n offset += 2;\n // Standalone markers without a length payload.\n if (marker === 0xd8 || marker === 0xd9 || (marker >= 0xd0 && marker <= 0xd7)) continue;\n if (fs.readSync(fd, buf, 0, 2, offset) < 2) return null;\n const segLen = buf.readUInt16BE(0);\n const isSof =\n marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;\n if (isSof) {\n const sof = Buffer.alloc(5);\n if (fs.readSync(fd, sof, 0, 5, offset + 2) < 5) return null;\n return { height: sof.readUInt16BE(1), width: sof.readUInt16BE(3) };\n }\n offset += segLen;\n }\n } catch {\n return null;\n }\n return null;\n}\n","import { escapeHtml } from \"./shared.js\";\nimport type { PreviewToken } from \"./preview-tokens.js\";\nimport { unescapeInlineTokens } from \"../src/inline/tokens.js\";\n\n/**\n * Rendered MDX *approximation* for the read-only studio (step 5 of the content\n * management spec). This is a sanity-check preview for humans, NOT a real MDX\n * pipeline: it never executes JSX, never resolves imports, and never emits real\n * site anchors for plain paths (hrefs are site paths that would 404 inside the\n * studio). It renders common Markdown + GFM constructs, shows JSX blocks as raw\n * escaped source, and resolves inline-token markers when preview metadata is\n * supplied.\n *\n * Safety: everything that ends up as text is escaped. Structural markers (JSX\n * tags, code fences, table pipes) are parsed from the raw source, but their text\n * content is escaped before it reaches the output. The whole render is wrapped in\n * a try/catch that falls back to a preformatted escaped block, so malformed input\n * degrades gracefully instead of throwing.\n */\n\nlet activeTokens: PreviewToken[] = [];\n\nconst TOKEN_SENTINEL_RE = /\\u0000T(\\d+)\\u0000/g;\n\nfunction tokenSentinel(n: number): string {\n return `\\u0000T${n}\\u0000`;\n}\n\nexport function renderMdxApprox(markerBody: string, tokens: PreviewToken[] = []): string {\n activeTokens = tokens;\n try {\n const unescaped = unescapeInlineTokens(markerBody);\n const withSentinels = unescaped.replace(/%%(\\d+)%%/g, (m, n: string) => {\n const idx = Number(n);\n return idx >= 1 && idx <= tokens.length ? tokenSentinel(idx) : m;\n });\n const rendered = renderBlocks(withSentinels).trim();\n return rendered.replace(TOKEN_SENTINEL_RE, (_m, n: string) => standaloneToken(tokens[Number(n) - 1]));\n } catch {\n return `<pre class=\"mdx-fallback\">${escapeHtml(markerBody)}</pre>`;\n }\n}\n\nfunction countNewlines(s: string): number {\n const m = s.match(/\\n/g);\n return m ? m.length : 0;\n}\n\n// ---------------------------------------------------------------------------\n// Block-level parser (line based)\n// ---------------------------------------------------------------------------\n\nfunction renderBlocks(src: string): string {\n const lines = src.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const out: string[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i]!;\n\n if (line.trim() === \"\") {\n i++;\n continue;\n }\n\n // Fenced code block (``` or ~~~).\n const fence = /^(\\s*)(`{3,}|~{3,})(.*)$/.exec(line);\n if (fence) {\n const marker = fence[2]!;\n const lang = fence[3]!.trim();\n const closeRe = new RegExp(\"^\\\\s*\" + marker[0] + \"{\" + marker.length + \",}\\\\s*$\");\n const buf: string[] = [];\n i++;\n while (i < lines.length && !closeRe.test(lines[i]!)) {\n buf.push(lines[i]!);\n i++;\n }\n i++; // consume the closing fence (no-op past EOF)\n const langAttr = lang ? ` data-lang=\"${escapeHtml(lang)}\"` : \"\";\n out.push(`<pre class=\"mdx-code\"${langAttr}><code>${escapeHtml(buf.join(\"\\n\"))}</code></pre>`);\n continue;\n }\n\n // JSX component block (capitalized tag name).\n if (/^\\s*<[A-Z]/.test(line)) {\n const jsx = findJsxBlock(lines, i);\n if (jsx) {\n out.push(renderJsxRaw(jsx.raw));\n i = jsx.next;\n } else {\n out.push(`<pre class=\"mdx-fallback\">${escapeHtml(line)}</pre>`);\n i++;\n }\n continue;\n }\n\n // ATX heading.\n const h = /^(#{1,6})\\s+(.*)$/.exec(line);\n if (h) {\n const level = h[1]!.length;\n out.push(`<h${level} class=\"mdx-h\">${renderInline(h[2]!.trim())}</h${level}>`);\n i++;\n continue;\n }\n\n // Horizontal rule.\n if (/^\\s*(-{3,}|\\*{3,}|_{3,})\\s*$/.test(line)) {\n out.push(`<hr class=\"mdx-hr\" />`);\n i++;\n continue;\n }\n\n // GFM pipe table (header row followed by a separator row).\n if (line.includes(\"|\") && i + 1 < lines.length && isTableSeparator(lines[i + 1]!)) {\n const header = splitTableRow(line);\n i += 2;\n const rows: string[][] = [];\n while (i < lines.length && lines[i]!.trim() !== \"\" && lines[i]!.includes(\"|\")) {\n rows.push(splitTableRow(lines[i]!));\n i++;\n }\n out.push(renderTable(header, rows));\n continue;\n }\n\n // Blockquote.\n if (/^\\s*>/.test(line)) {\n const buf: string[] = [];\n while (i < lines.length && /^\\s*>/.test(lines[i]!)) {\n buf.push(lines[i]!.replace(/^\\s*>\\s?/, \"\"));\n i++;\n }\n out.push(`<blockquote class=\"mdx-quote\">${renderBlocks(buf.join(\"\\n\"))}</blockquote>`);\n continue;\n }\n\n // Unordered list.\n if (/^\\s*[-*+]\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*[-*+]\\s+/.test(lines[i]!)) {\n items.push(`<li>${renderInline(lines[i]!.replace(/^\\s*[-*+]\\s+/, \"\"))}</li>`);\n i++;\n }\n out.push(`<ul class=\"mdx-list\">${items.join(\"\")}</ul>`);\n continue;\n }\n\n // Ordered list.\n if (/^\\s*\\d+\\.\\s+/.test(line)) {\n const items: string[] = [];\n while (i < lines.length && /^\\s*\\d+\\.\\s+/.test(lines[i]!)) {\n items.push(`<li>${renderInline(lines[i]!.replace(/^\\s*\\d+\\.\\s+/, \"\"))}</li>`);\n i++;\n }\n out.push(`<ol class=\"mdx-list\">${items.join(\"\")}</ol>`);\n continue;\n }\n\n // Paragraph: gather consecutive lines until a blank line or a new block start.\n const buf: string[] = [line];\n i++;\n while (i < lines.length && lines[i]!.trim() !== \"\" && !isBlockStart(lines[i]!, lines[i + 1])) {\n buf.push(lines[i]!);\n i++;\n }\n out.push(`<p class=\"mdx-p\">${renderInline(buf.join(\" \"))}</p>`);\n }\n\n return out.join(\"\\n\");\n}\n\n/** Does a line begin a new block (so paragraph accumulation must stop)? */\nfunction isBlockStart(line: string, next: string | undefined): boolean {\n if (/^\\s*(`{3,}|~{3,})/.test(line)) return true;\n if (/^\\s*<[A-Z]/.test(line)) return true;\n if (/^#{1,6}\\s+/.test(line)) return true;\n if (/^\\s*(-{3,}|\\*{3,}|_{3,})\\s*$/.test(line)) return true;\n if (/^\\s*>/.test(line)) return true;\n if (/^\\s*[-*+]\\s+/.test(line)) return true;\n if (/^\\s*\\d+\\.\\s+/.test(line)) return true;\n if (line.includes(\"|\") && next !== undefined && isTableSeparator(next)) return true;\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Tables\n// ---------------------------------------------------------------------------\n\nfunction splitTableRow(line: string): string[] {\n let s = line.trim();\n if (s.startsWith(\"|\")) s = s.slice(1);\n if (s.endsWith(\"|\")) s = s.slice(0, -1);\n return s.split(\"|\").map((c) => c.trim());\n}\n\nfunction isTableSeparator(line: string): boolean {\n if (!line.includes(\"-\")) return false;\n const cells = splitTableRow(line);\n return cells.length > 0 && cells.every((c) => /^:?-+:?$/.test(c));\n}\n\nfunction renderTable(header: string[], rows: string[][]): string {\n const th = header.map((c) => `<th>${renderInline(c)}</th>`).join(\"\");\n const trs = rows\n .map((r) => `<tr>${r.map((c) => `<td>${renderInline(c)}</td>`).join(\"\")}</tr>`)\n .join(\"\");\n return `<table class=\"mdx-table\"><thead><tr>${th}</tr></thead><tbody>${trs}</tbody></table>`;\n}\n\n// ---------------------------------------------------------------------------\n// JSX component blocks (raw source)\n// ---------------------------------------------------------------------------\n\nfunction findJsxBlock(lines: string[], start: number): { raw: string; next: number } | null {\n const rest = lines.slice(start).join(\"\\n\");\n const open = /^\\s*<([A-Z][A-Za-z0-9]*)((?:\\{[^}]*\\}|\"[^\"]*\"|'[^']*'|[^>])*?)(\\/?)>/.exec(rest);\n if (!open) return null;\n\n const name = open[1]!;\n const selfClose = open[3] === \"/\";\n if (selfClose) {\n const consumed = open[0]!;\n return { raw: consumed.replace(/^\\s+/, \"\"), next: start + countNewlines(consumed) + 1 };\n }\n\n const afterOpen = open[0]!.length;\n const tokenRe = new RegExp(`<${name}\\\\b|</${name}>`, \"g\");\n tokenRe.lastIndex = afterOpen;\n let depth = 1;\n let closeEnd = -1;\n let m: RegExpExecArray | null;\n while ((m = tokenRe.exec(rest)) !== null) {\n if (m[0].startsWith(\"</\")) {\n depth--;\n if (depth === 0) {\n closeEnd = m.index + m[0].length;\n break;\n }\n } else {\n depth++;\n }\n }\n if (closeEnd === -1) return null;\n\n const raw = rest.slice(0, closeEnd).replace(/^\\s+/, \"\");\n return { raw, next: start + countNewlines(rest.slice(0, closeEnd)) + 1 };\n}\n\nfunction renderJsxRaw(raw: string): string {\n const escaped = escapeHtml(raw).replace(TOKEN_SENTINEL_RE, (_m, n: string) => {\n const pt = activeTokens[Number(n) - 1];\n if (!pt) return \"\";\n const rawLabel = escapeHtml(pt.raw);\n if (pt.kind === \"relation\") {\n if (pt.dangling) return `<span class=\"mdx-relation-broken\">${rawLabel}</span>`;\n return `<a class=\"mdx-relation-link\" href=\"${escapeHtml(pt.studioUrl ?? \"\")}\">${rawLabel}</a>`;\n }\n return rawLabel;\n });\n return `<pre class=\"mdx-jsx-raw\"><code>${escaped}</code></pre>`;\n}\n\n// ---------------------------------------------------------------------------\n// Token resolution helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveSentinelDest(dest: string): string {\n const m = /^\\u0000T(\\d+)\\u0000$/.exec(dest);\n if (!m) return dest;\n const pt = activeTokens[Number(m[1]) - 1];\n if (!pt) return dest;\n if (pt.kind === \"relation\") return pt.studioUrl ?? \"\";\n return pt.value ?? \"\";\n}\n\nfunction standaloneToken(pt: PreviewToken | undefined): string {\n if (!pt) return \"\";\n if (pt.kind === \"relation\") {\n if (pt.dangling) {\n return `<span class=\"mdx-relation-broken\" title=\"missing target\">${escapeHtml(pt.label ?? \"\")}</span>`;\n }\n return `<a class=\"mdx-relation-chip\" href=\"${escapeHtml(pt.studioUrl ?? \"\")}\">${escapeHtml(pt.label ?? \"\")}</a>`;\n }\n return escapeHtml(pt.value ?? \"\");\n}\n\n// ---------------------------------------------------------------------------\n// Inline formatting\n// ---------------------------------------------------------------------------\n\n/**\n * Render inline Markdown on a run of text. Escape FIRST, then apply the inline\n * transforms on the escaped string — the markers (`*`, `_`, backtick, brackets)\n * survive escaping, and any HTML-special characters in the content are already\n * neutralized, so nothing can inject markup.\n */\nfunction renderInline(text: string): string {\n let s = escapeHtml(text);\n\n // Pull inline code spans out first so their contents are not further transformed.\n const codes: string[] = [];\n s = s.replace(/`([^`]+)`/g, (_all, c: string) => {\n codes.push(c);\n return `\\u0000${codes.length - 1}\\u0000`;\n });\n\n s = s.replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)/g, (_all, alt: string, dest: string) => {\n const src = resolveSentinelDest(dest);\n return `<img class=\"mdx-img\" src=\"${escapeHtml(src)}\" alt=\"${alt}\" loading=\"lazy\" />`;\n });\n\n s = s.replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)(?:\\s+\"[^\"]*\")?\\)/g, (_all, label: string, dest: string) => {\n const sm = /^\\u0000T(\\d+)\\u0000$/.exec(dest);\n if (sm) {\n const pt = activeTokens[Number(sm[1]) - 1];\n if (pt && pt.kind === \"relation\") {\n if (pt.dangling) return `<span class=\"mdx-relation-broken\" title=\"missing target\">${label}</span>`;\n return `<a class=\"mdx-relation-link\" href=\"${escapeHtml(pt.studioUrl ?? \"\")}\">${label}</a>`;\n }\n if (pt) return `<span class=\"mdx-link\" title=\"${escapeHtml(pt.value ?? \"\")}\">${label}</span>`;\n }\n return `<span class=\"mdx-link\" title=\"${escapeHtml(dest)}\">${label}</span>`;\n });\n\n // Bold, then italic.\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\");\n s = s.replace(/__([^_]+)__/g, \"<strong>$1</strong>\");\n s = s.replace(/\\*([^*]+)\\*/g, \"<em>$1</em>\");\n s = s.replace(/(^|[^\\w])_([^_]+)_(?=[^\\w]|$)/g, \"$1<em>$2</em>\");\n\n // Restore code spans.\n s = s.replace(/\\u0000(\\d+)\\u0000/g, (_all, idx: string) => {\n return `<code class=\"mdx-inline-code\">${codes[Number(idx)]}</code>`;\n });\n\n return s;\n}\n","import type { InlineToken } from \"../src/inline/tokens.js\";\nimport { enFileExists } from \"../src/core/alias-helpers.js\";\nimport type { ScribeConfig, ScribeProject } from \"../src/core/types.js\";\nimport { encodePathSegment } from \"./shared.js\";\n\nexport interface PreviewToken {\n kind: \"static\" | \"relation\" | \"asset\" | \"var\";\n raw: string;\n studioUrl?: string;\n label?: string;\n dangling?: boolean;\n value?: string;\n}\n\nfunction isStringRecord(v: unknown): v is Record<string, string> {\n if (!v || typeof v !== \"object\" || Array.isArray(v)) return false;\n return Object.values(v as Record<string, unknown>).every((x) => typeof x === \"string\");\n}\n\nexport function buildPreviewTokens(\n tokens: InlineToken[],\n opts: { enFrontmatter: Record<string, unknown>; docExists: (typeId: string, enSlug: string) => boolean },\n): PreviewToken[] {\n return tokens.map((t): PreviewToken => {\n switch (t.kind) {\n case \"static\":\n return { kind: \"static\", raw: t.raw, value: t.text };\n case \"var\": {\n const vars = opts.enFrontmatter.vars;\n const value = isStringRecord(vars) && typeof vars[t.key] === \"string\" ? vars[t.key]! : \"\";\n return { kind: \"var\", raw: t.raw, value };\n }\n case \"asset\":\n return { kind: \"asset\", raw: t.raw, value: t.webPath };\n case \"relation\": {\n const studioUrl = `/type/${encodePathSegment(t.targetTypeId)}/doc/${encodePathSegment(t.enSlug)}`;\n return {\n kind: \"relation\",\n raw: t.raw,\n studioUrl,\n label: t.enSlug,\n dangling: !opts.docExists(t.targetTypeId, t.enSlug),\n };\n }\n }\n });\n}\n\nexport function makeDocExists(\n project: ScribeProject,\n config: ScribeConfig,\n): (typeId: string, enSlug: string) => boolean {\n return (typeId, enSlug) => {\n const t = project.getType(typeId);\n return t ? enFileExists(config, t.config, enSlug) : false;\n };\n}\n","import type { z } from \"zod\";\nimport type {\n ContentTypeRuntime,\n ScribeConfig,\n ScribeDocument,\n ScribeProject,\n} from \"../src/core/types.js\";\nimport { isRoutableType } from \"../src/i18n/build-url.js\";\nimport { isTypeTranslatable } from \"../src/core/introspect-schema.js\";\nimport type { ValidateIssue } from \"../src/validate/validate-project.js\";\nimport { assetPreviewUrl, encodePathSegment, escapeHtml } from \"./shared.js\";\nimport {\n backRefsFor,\n filterFieldsFor,\n introspectStudioFields,\n keyFieldsFor,\n primaryAssetField,\n valueAtPath,\n type BackRefIndex,\n type FilterFieldMeta,\n type StudioFieldMeta,\n} from \"./introspect-fields.js\";\nimport { readImageDimensions, resolveAssetWebPath, statAsset } from \"./asset-serve.js\";\nimport { renderMdxApprox } from \"./mdx-preview.js\";\nimport { extractInlineTokens } from \"../src/inline/tokens.js\";\nimport { buildPreviewTokens, makeDocExists } from \"./preview-tokens.js\";\nimport type { DeletionPlan } from \"../src/delete/plan.js\";\n\n// ---------------------------------------------------------------------------\n// Validation buckets\n// ---------------------------------------------------------------------------\n\nexport interface ValidationBuckets {\n /** `typeId` → `enSlug` → issues touching that entry (any locale). */\n byEntry: Map<string, Map<string, ValidateIssue[]>>;\n /** `typeId` → issues for that type (aggregate). */\n byType: Map<string, ValidateIssue[]>;\n}\n\nexport function bucketValidation(issues: ValidateIssue[]): ValidationBuckets {\n const byEntry = new Map<string, Map<string, ValidateIssue[]>>();\n const byType = new Map<string, ValidateIssue[]>();\n for (const issue of issues) {\n if (!issue.contentType) continue;\n const typeList = byType.get(issue.contentType) ?? [];\n typeList.push(issue);\n byType.set(issue.contentType, typeList);\n if (!issue.enSlug) continue;\n let entryMap = byEntry.get(issue.contentType);\n if (!entryMap) {\n entryMap = new Map();\n byEntry.set(issue.contentType, entryMap);\n }\n const list = entryMap.get(issue.enSlug) ?? [];\n list.push(issue);\n entryMap.set(issue.enSlug, list);\n }\n return { byEntry, byType };\n}\n\nfunction countLevels(issues: ValidateIssue[]): { errors: number; warnings: number } {\n let errors = 0;\n let warnings = 0;\n for (const issue of issues) {\n if (issue.level === \"error\") errors++;\n else if (issue.level === \"warning\") warnings++;\n }\n return { errors, warnings };\n}\n\nconst LEVEL_RANK: Record<string, number> = { error: 0, warning: 1, info: 2 };\n\n/** Level mark for a tooltip row (styled like the count chips). */\nfunction levelMark(level: string): string {\n if (level === \"error\") return `<span class=\"vbadge err\">✕</span>`;\n if (level === \"warning\") return `<span class=\"vbadge warn\">!</span>`;\n return `<span class=\"vbadge info\">i</span>`;\n}\n\n/** Hover/focus tooltip panel: up to 10 issues (errors first), then a \"+N more\" row. */\nfunction renderVtipPanel(issues: ValidateIssue[]): string {\n const sorted = [...issues].sort(\n (a, b) => (LEVEL_RANK[a.level] ?? 3) - (LEVEL_RANK[b.level] ?? 3),\n );\n const rows = sorted.slice(0, 10).map((i) => {\n const meta: string[] = [];\n if (i.enSlug) meta.push(`<span class=\"vmeta\">${escapeHtml(i.enSlug)}</span>`);\n if (i.locale) meta.push(`<span class=\"vmeta\">${escapeHtml(i.locale)}</span>`);\n if (i.field) meta.push(`<span class=\"vmeta\">${escapeHtml(i.field)}</span>`);\n const msg = i.message.length > 140 ? i.message.slice(0, 140) + \"…\" : i.message;\n return `<div class=\"vrow\">${levelMark(i.level)}${meta.join(\"\")}<span class=\"vmsg\">${escapeHtml(msg)}</span></div>`;\n });\n if (issues.length > 10) {\n rows.push(`<div class=\"vrow more\">+${issues.length - 10} more issues</div>`);\n }\n return `<div class=\"vtip-panel\">${rows.join(\"\")}</div>`;\n}\n\n/**\n * Error/warning count chips for a bag of issues, wrapped in a CSS-only hover\n * tooltip that lists the individual issues. Empty string when there is nothing\n * error/warning-level to show. Same signature as before, so every call site\n * (sidebar type badges, collection rows, gallery cards, inspector) inherits the\n * tooltip.\n */\nexport function validationBadge(issues: ValidateIssue[] | undefined): string {\n if (!issues || issues.length === 0) return \"\";\n const { errors, warnings } = countLevels(issues);\n const chips: string[] = [];\n if (errors > 0) chips.push(`<span class=\"vbadge err\">${errors}✕</span>`);\n if (warnings > 0) chips.push(`<span class=\"vbadge warn\">${warnings}!</span>`);\n if (chips.length === 0) return \"\";\n return `<span class=\"vtip\" tabindex=\"0\">${chips.join(\"\")}${renderVtipPanel(issues)}</span>`;\n}\n\n/** Sidebar aggregate badge (compact) for each type. */\nexport function typeBadges(buckets: ValidationBuckets): Map<string, string> {\n const out = new Map<string, string>();\n for (const [typeId, issues] of buckets.byType) {\n const badge = validationBadge(issues);\n if (badge) out.set(typeId, ` ${badge}`);\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Value rendering\n// ---------------------------------------------------------------------------\n\nfunction scalarText(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\";\n if (typeof value === \"number\") return String(value);\n return JSON.stringify(value);\n}\n\nfunction chip(text: string, cls = \"\"): string {\n return `<span class=\"chip${cls ? \" \" + cls : \"\"}\">${escapeHtml(text)}</span>`;\n}\n\n/** Neutral chip for a type with nothing to translate (bodyless + no translatable fields). */\nexport function notTranslatableChip(): string {\n return `<span class=\"chip nt\" title=\"No translatable fields and no body\">not translatable</span>`;\n}\n\n/** Neutral chip shown instead of a body section for `body: false` types. */\nexport function frontmatterOnlyChip(): string {\n return `<span class=\"chip nt\" title=\"body: false — this type has no MDX body\">frontmatter-only</span>`;\n}\n\n/** Render a relation value as chips linking to the target entry (red when dangling). */\nfunction relationChips(\n project: ScribeProject,\n field: StudioFieldMeta,\n value: unknown,\n): string {\n const target = field.relationTarget;\n if (!target) return \"\";\n const slugs = Array.isArray(value)\n ? value.filter((s): s is string => typeof s === \"string\" && s.length > 0)\n : typeof value === \"string\" && value\n ? [value]\n : [];\n if (slugs.length === 0) return `<span class=\"dim\">—</span>`;\n const targetRuntime = safeGetType(project, target);\n return slugs\n .map((slug) => {\n const exists = targetRuntime ? targetRuntime.get(slug) !== null : false;\n if (!exists) {\n return `<span class=\"chip rel-bad\" title=\"dangling: no ${escapeHtml(target)} '${escapeHtml(slug)}'\">${escapeHtml(slug)} ✕</span>`;\n }\n const href = `/types/${encodePathSegment(target)}/${encodePathSegment(slug)}`;\n return `<span class=\"chip rel\"><a href=\"${href}\">${escapeHtml(slug)}</a></span>`;\n })\n .join(\"\");\n}\n\nfunction safeGetType(project: ScribeProject, id: string): ContentTypeRuntime | null {\n try {\n return project.getType(id);\n } catch {\n return null;\n }\n}\n\n/** Compact cell rendering for a key field in the entry table. */\nfunction keyFieldCell(project: ScribeProject, field: StudioFieldMeta, frontmatter: Record<string, unknown>): string {\n const value = valueAtPath(frontmatter, field.path);\n if (field.kind === \"relation\") return relationChips(project, field, value);\n if (field.enumOptions) {\n const text = scalarText(value);\n return text ? chip(text) : `<span class=\"dim\">—</span>`;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) return `<span class=\"dim\">—</span>`;\n return value.slice(0, 4).map((v) => chip(scalarText(v))).join(\"\") + (value.length > 4 ? \" …\" : \"\");\n }\n const text = scalarText(value);\n if (!text) return `<span class=\"dim\">—</span>`;\n return escapeHtml(text.length > 60 ? text.slice(0, 60) + \"…\" : text);\n}\n\n// ---------------------------------------------------------------------------\n// Filters\n// ---------------------------------------------------------------------------\n\nexport interface ActiveFilters {\n [key: string]: string;\n}\n\n/** Read active filter values from query params (only for the type's filterable fields). */\nexport function readFilters(\n filterFields: FilterFieldMeta[],\n query: (key: string) => string | undefined,\n): ActiveFilters {\n const out: ActiveFilters = {};\n for (const f of filterFields) {\n const raw = query(f.key);\n if (raw !== undefined && raw !== \"\") out[f.key] = raw;\n }\n return out;\n}\n\n/** Apply active filters to a document list. Generic per filter kind. */\nexport function applyFilters(\n docs: ScribeDocument[],\n filterFields: FilterFieldMeta[],\n active: ActiveFilters,\n): ScribeDocument[] {\n const byKey = new Map(filterFields.map((f) => [f.key, f]));\n return docs.filter((doc) => {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n for (const [key, wanted] of Object.entries(active)) {\n const field = byKey.get(key);\n if (!field) continue;\n const value = valueAtPath(frontmatter, [key]);\n if (field.kind === \"boolean\") {\n const actual = value === true ? \"true\" : \"false\";\n if (actual !== wanted) return false;\n } else if (field.kind === \"relation\") {\n if (Array.isArray(value)) {\n if (!value.includes(wanted)) return false;\n } else if (value !== wanted) {\n return false;\n }\n } else if (field.kind === \"string\") {\n if (typeof value !== \"string\" || !value.toLowerCase().includes(wanted.toLowerCase())) {\n return false;\n }\n } else {\n // enum\n if (scalarText(value) !== wanted) return false;\n }\n }\n return true;\n });\n}\n\nfunction renderFilterBar(\n project: ScribeProject,\n typeId: string,\n filterFields: FilterFieldMeta[],\n active: ActiveFilters,\n view: \"table\" | \"gallery\",\n hasGallery: boolean,\n): string {\n if (filterFields.length === 0 && !hasGallery) return \"\";\n const controls = filterFields\n .map((f) => {\n const current = active[f.key] ?? \"\";\n if (f.kind === \"enum\") {\n const opts = [\"\", ...(f.enumOptions ?? [])]\n .map(\n (o) =>\n `<option value=\"${escapeHtml(o)}\"${o === current ? \" selected\" : \"\"}>${o === \"\" ? \"any\" : escapeHtml(o)}</option>`,\n )\n .join(\"\");\n return `<label>${escapeHtml(f.key)} <select name=\"${escapeHtml(f.key)}\">${opts}</select></label>`;\n }\n if (f.kind === \"relation\" && f.relationTarget) {\n const targetRuntime = safeGetType(project, f.relationTarget);\n const slugs = targetRuntime ? targetRuntime.list().map((d) => d.slug) : [];\n const opts = [\"\", ...slugs]\n .map(\n (o) =>\n `<option value=\"${escapeHtml(o)}\"${o === current ? \" selected\" : \"\"}>${o === \"\" ? \"any\" : escapeHtml(o)}</option>`,\n )\n .join(\"\");\n return `<label>${escapeHtml(f.key)} <select name=\"${escapeHtml(f.key)}\">${opts}</select></label>`;\n }\n if (f.kind === \"boolean\") {\n const opts = [\n [\"\", \"any\"],\n [\"true\", \"true\"],\n [\"false\", \"false\"],\n ]\n .map(\n ([val, label]) =>\n `<option value=\"${val}\"${val === current ? \" selected\" : \"\"}>${label}</option>`,\n )\n .join(\"\");\n return `<label>${escapeHtml(f.key)} <select name=\"${escapeHtml(f.key)}\">${opts}</select></label>`;\n }\n // string\n return `<label>${escapeHtml(f.key)} <input type=\"text\" name=\"${escapeHtml(f.key)}\" value=\"${escapeHtml(current)}\" placeholder=\"contains…\" /></label>`;\n })\n .join(\"\");\n\n const viewToggle = hasGallery\n ? `<span class=\"viewtoggle\">\n <a href=\"${buildTypeUrl(typeId, active, \"table\")}\" class=\"${view === \"table\" ? \"active\" : \"\"}\">table</a>\n <a href=\"${buildTypeUrl(typeId, active, \"gallery\")}\" class=\"${view === \"gallery\" ? \"active\" : \"\"}\">gallery</a>\n </span>`\n : \"\";\n\n // The view field is carried in a hidden input so it survives filter submits.\n const viewHidden = hasGallery ? `<input type=\"hidden\" name=\"view\" value=\"${view}\" />` : \"\";\n\n return `<form class=\"filters\" method=\"get\" onchange=\"this.submit()\">\n ${controls}\n ${viewHidden}\n ${viewToggle}\n <a class=\"reset\" href=\"/types/${encodePathSegment(typeId)}${view === \"gallery\" ? \"?view=gallery\" : \"\"}\">reset</a>\n </form>`;\n}\n\nfunction buildTypeUrl(typeId: string, active: ActiveFilters, view: \"table\" | \"gallery\"): string {\n const params = new URLSearchParams(active);\n if (view === \"gallery\") params.set(\"view\", \"gallery\");\n const qs = params.toString();\n return `/types/${encodePathSegment(typeId)}${qs ? \"?\" + qs : \"\"}`;\n}\n\n// ---------------------------------------------------------------------------\n// Collection browser\n// ---------------------------------------------------------------------------\n\nexport interface CollectionContext {\n project: ScribeProject;\n config: ScribeConfig;\n type: ContentTypeRuntime;\n buckets: ValidationBuckets;\n /** Per (type,slug,locale) status dots renderer supplied by the server. */\n statusDots: (typeId: string, enSlug: string) => string;\n}\n\nexport function renderCollectionBrowser(\n ctx: CollectionContext,\n query: (key: string) => string | undefined,\n): string {\n const { project, type, buckets } = ctx;\n const schema = type.config.schema as z.ZodTypeAny;\n const filterFields = filterFieldsFor(schema);\n const keyFields = keyFieldsFor(schema);\n const primaryAsset = primaryAssetField(schema);\n const hasGallery = Boolean(primaryAsset);\n const view: \"table\" | \"gallery\" = query(\"view\") === \"gallery\" && hasGallery ? \"gallery\" : \"table\";\n const active = readFilters(filterFields, query);\n\n const allDocs = type.list() as ScribeDocument[];\n const docs = applyFilters(allDocs, filterFields, active);\n const entryBucket = buckets.byEntry.get(type.id);\n\n const filterBar = renderFilterBar(project, type.id, filterFields, active, view, hasGallery);\n\n const ntMarker = isTypeTranslatable(type.config) ? \"\" : ` ${notTranslatableChip()}`;\n const toolbar = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>${escapeHtml(type.config.label)}${ntMarker}\n <span class=\"dim\"> · ${docs.length}${docs.length !== allDocs.length ? ` / ${allDocs.length}` : \"\"} entries</span>\n </div>`;\n\n const body =\n view === \"gallery\"\n ? renderGallery(ctx, docs, keyFields, primaryAsset!, entryBucket)\n : renderTable(ctx, docs, keyFields, entryBucket);\n\n return `${toolbar}${filterBar}${body}`;\n}\n\nfunction renderTable(\n ctx: CollectionContext,\n docs: ScribeDocument[],\n keyFields: StudioFieldMeta[],\n entryBucket: Map<string, ValidateIssue[]> | undefined,\n): string {\n const { project, type, statusDots } = ctx;\n // Non-translatable types (bodyless, no translatable fields) carry no per-locale\n // status: suppress the \"Locales\" column of status dots entirely.\n const showStatus = isTypeTranslatable(type.config);\n const keyHeaders = keyFields.map((f) => `<th>${escapeHtml(f.path.join(\".\"))}</th>`).join(\"\");\n const rows = docs\n .map((doc) => {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n const href = `/types/${encodePathSegment(type.id)}/${encodePathSegment(doc.enSlug)}`;\n const keyCells = keyFields\n .map((f) => `<td>${keyFieldCell(project, f, frontmatter)}</td>`)\n .join(\"\");\n const badge = validationBadge(entryBucket?.get(doc.enSlug));\n const statusCell = showStatus\n ? `<td><span class=\"dots\">${statusDots(type.id, doc.enSlug)}</span></td>`\n : \"\";\n return `<tr>\n <td class=\"mono\"><a href=\"${href}\">${escapeHtml(doc.slug)}</a>${badge}</td>\n ${keyCells}\n ${statusCell}\n </tr>`;\n })\n .join(\"\");\n const colspan = 1 + keyFields.length + (showStatus ? 1 : 0);\n const statusHeader = showStatus ? \"<th>Locales</th>\" : \"\";\n return `<table class=\"data\">\n <thead><tr><th>Slug</th>${keyHeaders}${statusHeader}</tr></thead>\n <tbody>${rows || `<tr><td colspan=\"${colspan}\" class=\"dim\">No matching entries</td></tr>`}</tbody>\n </table>`;\n}\n\nfunction renderGallery(\n ctx: CollectionContext,\n docs: ScribeDocument[],\n keyFields: StudioFieldMeta[],\n primaryAsset: { path: string[]; assetTemplate?: string },\n entryBucket: Map<string, ValidateIssue[]> | undefined,\n): string {\n const { project, config, type } = ctx;\n const cards = docs\n .map((doc) => {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n const href = `/types/${encodePathSegment(type.id)}/${encodePathSegment(doc.enSlug)}`;\n const webPath = sourceAssetValue(frontmatter, primaryAsset, doc.enSlug);\n let thumb = `<div class=\"thumb\"><span class=\"noimg\">no image</span></div>`;\n if (webPath) {\n const resolved = resolveAssetWebPath(config, webPath);\n if (resolved && statAsset(resolved.absPath, webPath).exists) {\n thumb = `<div class=\"thumb\"><img loading=\"lazy\" src=\"${assetPreviewUrl(webPath)}\" alt=\"${escapeHtml(doc.slug)}\" /></div>`;\n } else {\n thumb = `<div class=\"thumb\"><span class=\"noimg\">missing file</span></div>`;\n }\n }\n const keyLine = keyFields\n .filter((f) => f.kind === \"relation\" || f.enumOptions)\n .slice(0, 3)\n .map((f) => keyFieldCell(project, f, frontmatter))\n .join(\" \");\n const badge = validationBadge(entryBucket?.get(doc.enSlug));\n return `<a class=\"gcard\" href=\"${href}\">\n ${thumb}\n <div class=\"body\">\n <span class=\"gslug\">${escapeHtml(doc.slug)}${badge}</span>\n <span class=\"gkey\">${keyLine}</span>\n </div>\n </a>`;\n })\n .join(\"\");\n return `<div class=\"gallery\">${cards || `<span class=\"dim\" style=\"padding:12px\">No matching entries</span>`}</div>`;\n}\n\n/** SOURCE (unresolved) asset value for a field on an entry, materializing templates. */\nfunction sourceAssetValue(\n frontmatter: Record<string, unknown>,\n field: { path: string[]; assetTemplate?: string },\n enSlug: string,\n): string | undefined {\n // Only handle top-level (non-`*`) asset fields for the primary thumbnail.\n if (field.path.includes(\"*\")) return undefined;\n const value = valueAtPath(frontmatter, field.path);\n if (typeof value === \"string\" && value) return value;\n if (value === undefined && field.assetTemplate) {\n return field.assetTemplate.split(\"{slug}\").join(enSlug);\n }\n return undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Entry inspector\n// ---------------------------------------------------------------------------\n\nexport interface InspectorContext {\n project: ScribeProject;\n config: ScribeConfig;\n type: ContentTypeRuntime;\n enSlug: string;\n locale: string;\n enDoc: ScribeDocument;\n /** Locale frontmatter (already merged for display) or null when EN / untranslated. */\n localeFrontmatter: Record<string, unknown> | null;\n /** True when the requested locale has no stored translation (EN fallback shown). */\n isFallback: boolean;\n backRefs: BackRefIndex;\n buckets: ValidationBuckets;\n /** Locale tabs HTML from the server (reusing existing status dots). */\n localeTabs: string;\n /** Which body tab to show: raw MDX source (default) or the rendered approximation. */\n bodyView?: \"raw\" | \"preview\";\n /** Previous entry in the collection's default order (null at the start). */\n prev?: { href: string; slug: string } | null;\n /** Next entry in the collection's default order (null at the end). */\n next?: { href: string; slug: string } | null;\n /** URL of the delete confirmation page for this entry. */\n deleteHref: string;\n}\n\nexport function renderEntryInspector(ctx: InspectorContext): string {\n const { project, config, type, enSlug, locale, enDoc } = ctx;\n const schema = type.config.schema as z.ZodTypeAny;\n const fields = introspectStudioFields(schema);\n\n const displayFm =\n locale === config.defaultLocale || !ctx.localeFrontmatter\n ? (enDoc.frontmatter as Record<string, unknown>)\n : ctx.localeFrontmatter;\n const enFm = enDoc.frontmatter as Record<string, unknown>;\n\n const fieldRows = fields\n .filter((f) => !f.path.includes(\"*\")) // flat top-level + nested-object leaves; skip array item fields in the summary\n .map((f) => renderFieldRow(ctx, f, displayFm, enFm))\n .join(\"\");\n\n const entryIssues = ctx.buckets.byEntry.get(type.id)?.get(enSlug) ?? [];\n const issuesPanel = renderIssuesPanel(entryIssues);\n const usedByPanel = renderUsedBy(project, type.id, enSlug, ctx.backRefs);\n\n // Body: two tabs — Raw MDX (default) and a rendered approximation (Preview).\n // The translation store body isn't surfaced here; the EN source body is shown\n // for every locale tab (the existing translation dashboard covers per-locale\n // bodies at /type/:id/doc/:enSlug). Bodyless types (`body: false`) have no MDX\n // body at all — show a \"frontmatter-only\" chip instead.\n const bodyPanel =\n type.config.body === false\n ? `<div class=\"section\">\n <div class=\"section-head\">Body</div>\n <p class=\"dim\" style=\"padding:6px 12px\">${frontmatterOnlyChip()}</p>\n </div>`\n : renderBodyPanel(ctx);\n\n const viewOnSite = renderViewOnSite(type, enSlug, locale);\n\n const prev = ctx.prev ?? null;\n const next = ctx.next ?? null;\n const prevBtn = prev\n ? `<a class=\"navbtn\" id=\"nav-prev\" href=\"${prev.href}\" title=\"Previous: ${escapeHtml(prev.slug)}\">‹</a>`\n : `<span class=\"navbtn disabled\" title=\"No previous entry\">‹</span>`;\n const nextBtn = next\n ? `<a class=\"navbtn\" id=\"nav-next\" href=\"${next.href}\" title=\"Next: ${escapeHtml(next.slug)}\">›</a>`\n : `<span class=\"navbtn disabled\" title=\"No next entry\">›</span>`;\n const deleteBtn = `<a class=\"btn-danger\" href=\"${ctx.deleteHref}\">Delete</a>`;\n\n // The studio's only client-side JS: bind Left/Right arrows to prev/next,\n // ignoring keystrokes while focus is in a form control.\n const navScript = `<script>(function(){var p=${JSON.stringify(\n prev ? prev.href : null,\n )},n=${JSON.stringify(\n next ? next.href : null,\n )};document.addEventListener(\"keydown\",function(e){var a=document.activeElement;if(a){var t=a.tagName;if(t===\"INPUT\"||t===\"TEXTAREA\"||t===\"SELECT\"||a.isContentEditable)return;}if(e.key===\"ArrowLeft\"&&p){window.location.href=p;}else if(e.key===\"ArrowRight\"&&n){window.location.href=n;}});})();</script>`;\n\n const toolbar = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>\n <a href=\"/types/${encodePathSegment(type.id)}\">${escapeHtml(type.config.label)}</a><span class=\"sep\">›</span>\n <span>${escapeHtml(enSlug)}</span>\n <span class=\"spacer\"></span>\n ${viewOnSite}\n <span class=\"navgroup\">${prevBtn}${nextBtn}</span>\n ${deleteBtn}\n </div>`;\n\n return `${toolbar}${navScript}\n <div class=\"tabs\">${ctx.localeTabs}</div>\n ${issuesPanel}\n <div class=\"section\">\n <div class=\"section-head\">Fields</div>\n <div class=\"section-body\"><table class=\"kv\"><tbody>${fieldRows}</tbody></table></div>\n </div>\n ${usedByPanel}\n ${bodyPanel}`;\n}\n\n/** Body section with Raw / Preview tabs. Raw is the default (query param `body=preview`). */\nfunction renderBodyPanel(ctx: InspectorContext): string {\n const preview = ctx.bodyView === \"preview\";\n const base = `/types/${encodePathSegment(ctx.type.id)}/${encodePathSegment(ctx.enSlug)}`;\n const locPart = `locale=${encodePathSegment(ctx.locale)}`;\n const rawHref = `${base}?${locPart}`;\n const previewHref = `${base}?${locPart}&body=preview`;\n const tabs = `<span class=\"bodytabs\">\n <a href=\"${rawHref}\" class=\"${preview ? \"\" : \"active\"}\">Raw</a>\n <a href=\"${previewHref}\" class=\"${preview ? \"active\" : \"\"}\">Preview</a>\n </span>`;\n let content: string;\n if (preview) {\n const { placeholderBody, tokens } = extractInlineTokens(ctx.enDoc.content);\n const pv = buildPreviewTokens(tokens, {\n enFrontmatter: ctx.enDoc.frontmatter as Record<string, unknown>,\n docExists: makeDocExists(ctx.project, ctx.config),\n });\n content = `<div class=\"mdx-preview\">${renderMdxApprox(placeholderBody, pv)}</div>`;\n } else {\n content = `<pre class=\"code\">${escapeHtml(ctx.enDoc.content)}</pre>`;\n }\n return `<div class=\"section\">\n <div class=\"section-head\">Body ${tabs}</div>\n ${content}\n </div>`;\n}\n\nfunction fieldFlag(kind: StudioFieldMeta[\"kind\"]): string {\n if (kind === \"translatable\") return `<span class=\"flag t\" title=\"Translatable\">T</span>`;\n if (kind === \"relation\") return `<span class=\"flag s\" title=\"Relation\">R</span>`;\n if (kind === \"asset\") return `<span class=\"flag s\" title=\"Asset\">A</span>`;\n return `<span class=\"flag s\" title=\"Structural\">S</span>`;\n}\n\nfunction renderFieldRow(\n ctx: InspectorContext,\n field: StudioFieldMeta,\n displayFm: Record<string, unknown>,\n enFm: Record<string, unknown>,\n): string {\n const { project, config } = ctx;\n const key = field.path.join(\".\");\n // Relations/assets are structural — always read from EN (merged) source.\n const structural = field.kind === \"relation\" || field.kind === \"asset\";\n const value = valueAtPath(structural ? enFm : displayFm, field.path);\n\n let cell: string;\n if (field.kind === \"relation\") {\n cell = relationChips(project, field, value);\n } else if (field.kind === \"asset\") {\n cell = renderAssetCell(config, field, valueAtPath(enFm, field.path), ctx.enSlug);\n } else if (field.kind === \"translatable\") {\n const enValue = valueAtPath(enFm, field.path);\n const localeMissing =\n ctx.locale !== config.defaultLocale &&\n (value === undefined || value === null || JSON.stringify(value) === JSON.stringify(enValue));\n const text = scalarText(value);\n const shown = Array.isArray(value)\n ? value.length\n ? value.map((v) => chip(scalarText(v))).join(\"\")\n : `<span class=\"dim\">—</span>`\n : text\n ? escapeHtml(text)\n : `<span class=\"dim\">—</span>`;\n const fallbackTag =\n ctx.locale !== config.defaultLocale && localeMissing\n ? ` <span class=\"tag\">EN fallback</span>`\n : \"\";\n cell = `${shown}${fallbackTag}`;\n } else {\n const shown = Array.isArray(value)\n ? value.length\n ? value.map((v) => chip(scalarText(v))).join(\"\")\n : `<span class=\"dim\">—</span>`\n : value !== undefined && value !== null && value !== \"\"\n ? escapeHtml(scalarText(value))\n : `<span class=\"dim\">—</span>`;\n cell = shown;\n }\n\n return `<tr>\n <td class=\"k\">${fieldFlag(field.kind)}${escapeHtml(key)}</td>\n <td class=\"v\">${cell}</td>\n </tr>`;\n}\n\nfunction renderAssetCell(\n config: ScribeConfig,\n field: StudioFieldMeta,\n rawValue: unknown,\n enSlug: string,\n): string {\n let webPath: string | undefined;\n if (typeof rawValue === \"string\" && rawValue) webPath = rawValue;\n else if (rawValue === undefined && field.assetTemplate) {\n webPath = field.assetTemplate.split(\"{slug}\").join(enSlug);\n }\n if (!webPath) {\n if (field.assetOptional) return `<span class=\"dim\">—</span>`;\n return `<span class=\"vbadge err\">missing value</span>`;\n }\n\n const resolved = resolveAssetWebPath(config, webPath);\n const info = resolved ? statAsset(resolved.absPath, webPath) : null;\n const previewSrc = assetPreviewUrl(webPath);\n\n if (!resolved || !info?.exists) {\n return `<div class=\"asset-preview\">\n <div class=\"frame\"><span class=\"noimg\">missing</span></div>\n <div class=\"info\">\n <div class=\"mono\">${escapeHtml(webPath)}</div>\n <span class=\"vbadge err\">file not found</span>\n </div>\n </div>`;\n }\n\n const dims = resolved ? readImageDimensions(resolved.absPath) : null;\n const sizeKB = info.sizeBytes !== undefined ? Math.round(info.sizeBytes / 1024) : undefined;\n const oversized =\n field.assetMaxKB !== undefined && sizeKB !== undefined && sizeKB > field.assetMaxKB;\n const ext = webPath.split(\".\").pop()?.toLowerCase();\n const drift =\n field.assetFormats && field.assetFormats.length > 0 && ext && !field.assetFormats.includes(ext);\n\n const badges = [\n oversized\n ? `<span class=\"vbadge warn\">over ${field.assetMaxKB}KB</span>`\n : \"\",\n drift ? `<span class=\"vbadge warn\">format .${escapeHtml(ext!)}</span>` : \"\",\n ].join(\"\");\n\n return `<div class=\"asset-preview\">\n <div class=\"frame\"><img loading=\"lazy\" src=\"${previewSrc}\" alt=\"asset\" /></div>\n <div class=\"info\">\n <div class=\"mono\">${escapeHtml(webPath)}</div>\n <div class=\"dim\">${sizeKB !== undefined ? `${sizeKB} KB` : \"size ?\"}${dims ? ` · ${dims.width}×${dims.height}` : \"\"}</div>\n ${badges}\n </div>\n </div>`;\n}\n\nfunction renderIssuesPanel(issues: ValidateIssue[]): string {\n if (issues.length === 0) return \"\";\n const rows = issues\n .map(\n (i) =>\n `<tr>\n <td>${validationBadge([i])}</td>\n <td class=\"mono\">${escapeHtml(i.locale ?? \"en\")}</td>\n <td class=\"mono\">${escapeHtml(i.field ?? \"\")}</td>\n <td>${escapeHtml(i.message)}</td>\n </tr>`,\n )\n .join(\"\");\n return `<div class=\"section\">\n <div class=\"section-head\">Validation</div>\n <table class=\"data\"><tbody>${rows}</tbody></table>\n </div>`;\n}\n\nexport function renderUsedBy(\n project: ScribeProject,\n typeId: string,\n enSlug: string,\n backRefs: BackRefIndex,\n): string {\n const refs = backRefsFor(backRefs, typeId, enSlug);\n if (refs.length === 0) {\n return `<div class=\"section\">\n <div class=\"section-head\">Used by</div>\n <p class=\"dim\" style=\"padding:6px 12px\">Nothing references this entry.</p>\n </div>`;\n }\n const rows = refs\n .map((ref) => {\n const refType = safeGetType(project, ref.typeId);\n const label = refType ? refType.config.label : ref.typeId;\n const href = `/types/${encodePathSegment(ref.typeId)}/${encodePathSegment(ref.enSlug)}`;\n return `<tr>\n <td>${escapeHtml(label)}</td>\n <td class=\"mono\"><a href=\"${href}\">${escapeHtml(ref.enSlug)}</a></td>\n <td class=\"mono dim\">${escapeHtml(ref.field)}</td>\n </tr>`;\n })\n .join(\"\");\n return `<div class=\"section\">\n <div class=\"section-head\">Used by <span class=\"dim\">· ${refs.length}</span></div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>Entry</th><th>Field</th></tr></thead>\n <tbody>${rows}</tbody>\n </table>\n </div>`;\n}\n\n// ---------------------------------------------------------------------------\n// Deletion confirmation page\n// ---------------------------------------------------------------------------\n\nfunction entryLink(project: ScribeProject, typeId: string, enSlug: string): string {\n const href = `/types/${encodePathSegment(typeId)}/${encodePathSegment(enSlug)}`;\n const label = safeGetType(project, typeId)?.config.label ?? typeId;\n return `<a href=\"${href}\">${escapeHtml(enSlug)}</a> <span class=\"dim\">${escapeHtml(label)}</span>`;\n}\n\n/**\n * Render the delete confirmation page: the full plan in sections with counts.\n * A blocked plan shows the blockers and no confirm button; an executable plan\n * shows a danger confirm button (POST) plus a cancel link back to the inspector.\n */\nexport function renderDeletionPlanPage(\n project: ScribeProject,\n plan: DeletionPlan,\n options: { typeId: string; enSlug: string; cancelHref: string; postHref: string },\n): string {\n const root = plan.roots[0];\n const rootLabel = root\n ? `${escapeHtml(root.enSlug)}${root.title ? ` <span class=\"dim\">${escapeHtml(root.title)}</span>` : \"\"}`\n : escapeHtml(options.enSlug);\n const blocked = plan.blocked.length > 0;\n\n const toolbar = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>\n <a href=\"/types/${encodePathSegment(options.typeId)}\">${escapeHtml(\n safeGetType(project, options.typeId)?.config.label ?? options.typeId,\n )}</a><span class=\"sep\">›</span>\n <a href=\"${options.cancelHref}\">${escapeHtml(options.enSlug)}</a><span class=\"sep\">›</span>\n <span>delete</span>\n </div>`;\n\n const section = (title: string, count: number, body: string): string =>\n `<div class=\"section\">\n <div class=\"section-head\">${escapeHtml(title)} <span class=\"dim\">· ${count}</span></div>\n <div class=\"section-body\">${body}</div>\n </div>`;\n\n const emptyRow = (text: string): string => `<p class=\"dim\" style=\"padding:6px 12px\">${escapeHtml(text)}</p>`;\n\n // Blockers (shown first when present).\n const blockersBody =\n plan.blocked.length === 0\n ? emptyRow(\"No blockers.\")\n : `<table class=\"data\"><thead><tr><th>Entry</th><th>Field</th><th>Reason</th></tr></thead><tbody>${plan.blocked\n .map(\n (b) => `<tr>\n <td class=\"mono\">${entryLink(project, b.typeId, b.enSlug)}</td>\n <td class=\"mono dim\">${escapeHtml(b.fieldPath)}</td>\n <td>${\n b.reason === \"required-single\"\n ? `<span class=\"vbadge err\">required single relation</span>`\n : `<span class=\"vbadge err\">restrict</span>`\n }</td>\n </tr>`,\n )\n .join(\"\")}</tbody></table>`;\n\n // Cascades (roots + transitive deletes shown together for clarity).\n const rootRow = `<tr>\n <td class=\"mono\">${entryLink(project, root?.typeId ?? options.typeId, root?.enSlug ?? options.enSlug)}</td>\n <td class=\"dim\">requested</td>\n </tr>`;\n const cascadeRows = plan.cascades\n .map(\n (c) => `<tr>\n <td class=\"mono\">${entryLink(project, c.typeId, c.enSlug)}</td>\n <td class=\"mono dim\">${escapeHtml(c.via)}</td>\n </tr>`,\n )\n .join(\"\");\n const deletesBody = `<table class=\"data\"><thead><tr><th>Entry</th><th>Via</th></tr></thead><tbody>${rootRow}${cascadeRows}</tbody></table>`;\n\n const detachesBody =\n plan.detaches.length === 0\n ? emptyRow(\"Nothing to detach.\")\n : `<table class=\"data\"><thead><tr><th>Entry</th><th>Field</th><th>Drops</th></tr></thead><tbody>${plan.detaches\n .map(\n (d) => `<tr>\n <td class=\"mono\">${entryLink(project, d.typeId, d.enSlug)}</td>\n <td class=\"mono dim\">${escapeHtml(d.fieldPath)}</td>\n <td class=\"mono\">${escapeHtml(d.removedSlug)}</td>\n </tr>`,\n )\n .join(\"\")}</tbody></table>`;\n\n const assetsBody =\n plan.assets.length === 0\n ? emptyRow(\"No asset files.\")\n : `<table class=\"data\"><thead><tr><th>Action</th><th>Path</th></tr></thead><tbody>${plan.assets\n .map((a) => {\n const badge =\n a.action === \"delete\"\n ? `<span class=\"vbadge err\">delete</span>`\n : `<span class=\"chip nt\">keep${a.reason === \"shared\" ? \" (shared)\" : \"\"}</span>`;\n return `<tr><td>${badge}</td><td class=\"mono\">${escapeHtml(a.path)}</td></tr>`;\n })\n .join(\"\")}</tbody></table>`;\n\n const totalTranslations = plan.store.reduce((sum, s) => sum + s.translations, 0);\n const totalSnapshots = plan.store.reduce((sum, s) => sum + s.snapshots, 0);\n const storeBody = `<p style=\"padding:6px 12px\">${totalTranslations} translation row(s) and ${totalSnapshots} EN snapshot(s) across ${plan.store.length} document(s) will be removed from the store.</p>`;\n\n const bodyRefsBody =\n plan.bodyRefWarnings.length === 0\n ? emptyRow(\"No body references will dangle.\")\n : `<p style=\"padding:6px 12px\" class=\"dim\">${plan.bodyRefWarnings.length} body reference(s) will dangle and become validation errors.</p>\n <table class=\"data\"><thead><tr><th>Entry</th><th>References</th></tr></thead><tbody>${plan.bodyRefWarnings\n .map(\n (w) => `<tr>\n <td class=\"mono\">${entryLink(project, w.typeId, w.enSlug)}</td>\n <td class=\"mono\">${entryLink(project, w.targetTypeId, w.targetEnSlug)}</td>\n </tr>`,\n )\n .join(\"\")}</tbody></table>`;\n\n const deleteCount = plan.roots.length + plan.cascades.length;\n const assetDeleteCount = plan.assets.filter((a) => a.action === \"delete\").length;\n\n const banner = blocked\n ? `<div class=\"del-banner del-blocked\">This entry cannot be deleted: ${plan.blocked.length} blocker(s) below must be resolved first.</div>`\n : `<div class=\"del-banner\">Deleting <strong class=\"mono\">${rootLabel}</strong> removes ${deleteCount} document(s) and ${assetDeleteCount} asset file(s). This cannot be undone (git is the safety net).</div>`;\n\n const actions = blocked\n ? `<div class=\"del-actions\"><a class=\"btn\" href=\"${options.cancelHref}\">Back to entry</a></div>`\n : `<div class=\"del-actions\">\n <form method=\"post\" action=\"${options.postHref}\">\n <button type=\"submit\" class=\"btn-danger btn-lg\">Delete permanently</button>\n </form>\n <a class=\"btn\" href=\"${options.cancelHref}\">Cancel</a>\n </div>`;\n\n const sections = [\n blocked ? section(\"Blockers\", plan.blocked.length, blockersBody) : \"\",\n section(\"Documents deleted\", deleteCount, deletesBody),\n section(\"References detached\", plan.detaches.length, detachesBody),\n section(\"Body references\", plan.bodyRefWarnings.length, bodyRefsBody),\n section(\"Asset files\", plan.assets.length, assetsBody),\n section(\"Store rows\", plan.store.length, storeBody),\n ].join(\"\");\n\n return `${toolbar}\n <div class=\"del-page\">\n ${banner}\n ${sections}\n ${actions}\n </div>`;\n}\n\nfunction renderViewOnSite(\n type: ContentTypeRuntime,\n enSlug: string,\n locale: string,\n): string {\n if (!isRoutableType(type.config)) return \"\";\n try {\n const path = type.url(enSlug, locale);\n return `<a href=\"${escapeHtml(path)}\" title=\"Path on site\" class=\"dim\">${escapeHtml(path)} ↗</a>`;\n } catch {\n return \"\";\n }\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../src/core/types.js\";\nimport { getManagedRoots } from \"../src/core/managed-roots.js\";\nimport { assetPreviewUrl, encodePathSegment, escapeHtml } from \"./shared.js\";\nimport {\n assetsDirOf,\n readImageDimensions,\n resolveAssetWebPath,\n statAsset,\n} from \"./asset-serve.js\";\nimport type { AssetRef, AssetRefIndex } from \"./introspect-fields.js\";\n\nconst IMAGE_EXT = new Set([\".webp\", \".png\", \".jpg\", \".jpeg\", \".gif\", \".svg\", \".avif\"]);\n\n/** Recursively list image files under a managed root, returning web paths. */\nfunction listFilesUnderRoot(assetsDir: string, root: string): string[] {\n const abs = path.join(assetsDir, root.replace(/^\\/+/, \"\"));\n const out: string[] = [];\n const walk = (dir: string): void => {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (entry.isFile() && IMAGE_EXT.has(path.extname(entry.name).toLowerCase())) {\n const rel = path.relative(assetsDir, full).split(path.sep).join(\"/\");\n out.push(`/${rel}`);\n }\n }\n };\n walk(abs);\n return out.sort();\n}\n\ninterface AssetEntry {\n webPath: string;\n refs: AssetRef[];\n exists: boolean;\n sizeKB?: number;\n width?: number;\n height?: number;\n}\n\ninterface AssetBadge {\n cls: string;\n label: string;\n title: string;\n}\n\n/** Compute live badges for an asset (orphan, oversized, format drift). Missing-but-referenced is handled per-ref. */\nfunction badgesFor(entry: AssetEntry): AssetBadge[] {\n const badges: AssetBadge[] = [];\n if (entry.exists && entry.refs.length === 0) {\n badges.push({ cls: \"warn\", label: \"unreferenced\", title: \"No entry/field references this file\" });\n }\n if (!entry.exists && entry.refs.length > 0) {\n badges.push({ cls: \"err\", label: \"missing\", title: \"Referenced but no file on disk\" });\n }\n const declaredRefs = entry.refs.filter((r) => r.declared);\n const ext = entry.webPath.split(\".\").pop()?.toLowerCase();\n for (const ref of declaredRefs) {\n if (\n ref.maxKB !== undefined &&\n entry.sizeKB !== undefined &&\n entry.sizeKB > ref.maxKB &&\n !badges.some((b) => b.label.startsWith(\"over\"))\n ) {\n badges.push({ cls: \"warn\", label: `over ${ref.maxKB}KB`, title: `${entry.sizeKB}KB exceeds ${ref.maxKB}KB budget` });\n }\n if (\n ref.formats &&\n ref.formats.length > 0 &&\n ext &&\n !ref.formats.includes(ext) &&\n !badges.some((b) => b.label.startsWith(\"format\"))\n ) {\n badges.push({ cls: \"warn\", label: `format .${ext}`, title: `.${ext} not in [${ref.formats.join(\", \")}]` });\n }\n }\n return badges;\n}\n\nfunction renderAssetCard(entry: AssetEntry): string {\n const badges = badgesFor(entry);\n const badgeHtml = badges\n .map((b) => `<span class=\"vbadge ${b.cls}\" title=\"${escapeHtml(b.title)}\">${escapeHtml(b.label)}</span>`)\n .join(\"\");\n\n const thumb = entry.exists\n ? `<div class=\"athumb\"><img loading=\"lazy\" src=\"${assetPreviewUrl(entry.webPath)}\" alt=\"asset\" /></div>`\n : `<div class=\"athumb\"><span class=\"noimg\" style=\"color:var(--dim);font-size:11px\">missing</span></div>`;\n\n const refList =\n entry.refs.length > 0\n ? entry.refs\n .slice(0, 6)\n .map((ref) => {\n const href = `/types/${encodePathSegment(ref.typeId)}/${encodePathSegment(ref.enSlug)}`;\n return `<a href=\"${href}\" title=\"${escapeHtml(ref.typeId + \" · \" + ref.field)}\">${escapeHtml(ref.enSlug)}</a>`;\n })\n .join(\", \")\n : `<span class=\"dim\">unreferenced</span>`;\n const extraRefs = entry.refs.length > 6 ? ` +${entry.refs.length - 6}` : \"\";\n\n const meta = entry.exists\n ? `${entry.sizeKB !== undefined ? `${entry.sizeKB} KB` : \"\"}${entry.width ? ` · ${entry.width}×${entry.height}` : \"\"}`\n : \"\";\n\n return `<div class=\"acard\">\n ${thumb}\n <div class=\"abody\">\n <span class=\"apath\">${escapeHtml(entry.webPath)}</span>\n <div class=\"dim\" style=\"margin-bottom:3px\">${meta}</div>\n <div>${badgeHtml || `<span class=\"vbadge ok\">ok</span>`}</div>\n <div style=\"margin-top:4px\">${refList}${extraRefs}</div>\n </div>\n </div>`;\n}\n\nexport function renderAssetBrowser(\n config: ScribeConfig,\n assetRefs: AssetRefIndex,\n): string {\n const assetsDir = assetsDirOf(config);\n const roots = getManagedRoots(config);\n\n if (!assetsDir || roots.length === 0) {\n return `<div class=\"toolbar\">Assets</div>\n <p class=\"dim\" style=\"padding:12px\">No managed asset roots configured. Add <code>assets.managedDirs</code> or <code>field.asset({ dir })</code> to enable the asset browser.</p>`;\n }\n\n const sections = roots\n .map((root) => {\n // Roots can nest (`/try-on-examples` from managedDirs plus\n // `/try-on-examples/models` from a field template). Each file belongs to\n // its most specific root only, so nothing renders twice.\n const childRoots = roots.filter((r) => r !== root && r.startsWith(root + \"/\"));\n const underChildRoot = (p: string): boolean =>\n childRoots.some((r) => p === r || p.startsWith(r + \"/\"));\n const files = listFilesUnderRoot(assetsDir, root).filter((p) => !underChildRoot(p));\n // Referenced-but-missing files under this root that don't exist on disk.\n const referencedUnderRoot = [...assetRefs.keys()].filter(\n (p) => (p === root || p.startsWith(root + \"/\")) && !underChildRoot(p),\n );\n const allPaths = new Set<string>([...files, ...referencedUnderRoot]);\n\n const entries: AssetEntry[] = [...allPaths].sort().map((webPath) => {\n const refs = assetRefs.get(webPath) ?? [];\n const resolved = resolveAssetWebPath(config, webPath);\n const info = resolved ? statAsset(resolved.absPath, webPath) : null;\n const dims = resolved && info?.exists ? readImageDimensions(resolved.absPath) : null;\n return {\n webPath,\n refs,\n exists: Boolean(info?.exists),\n sizeKB: info?.sizeBytes !== undefined ? Math.round(info.sizeBytes / 1024) : undefined,\n width: dims?.width,\n height: dims?.height,\n };\n });\n\n const orphans = entries.filter((e) => e.exists && e.refs.length === 0).length;\n const missing = entries.filter((e) => !e.exists && e.refs.length > 0).length;\n const summary = [\n `${entries.length} files`,\n orphans ? `<span class=\"tag-warn\">${orphans} unreferenced</span>` : \"\",\n missing ? `<span class=\"tag-err\">${missing} missing</span>` : \"\",\n ]\n .filter(Boolean)\n .join(\" · \");\n\n // A parent root fully covered by nested roots has nothing of its own to\n // show; skip it rather than render an empty \"No files\" section.\n if (entries.length === 0 && childRoots.length > 0) return \"\";\n\n const cards = entries.map((e) => renderAssetCard(e)).join(\"\");\n return `<div class=\"section\">\n <div class=\"section-head\">${escapeHtml(root)} <span class=\"dim\">· ${summary}</span></div>\n <div class=\"asset-grid\">${cards || `<span class=\"dim\" style=\"padding:12px\">No files</span>`}</div>\n </div>`;\n })\n .join(\"\");\n\n return `<div class=\"toolbar\">Assets <span class=\"dim\">· ${roots.length} managed root(s)</span></div>${sections}`;\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","import type { ScribeDocument } from \"../src/core/types.js\";\nimport { encodePathSegment, escapeHtml } from \"./shared.js\";\n\n/**\n * Global full-text search over EN content (step 4 of the content management\n * spec). Scans, for every type's EN documents: the slug, every frontmatter value\n * (non-strings stringified), and the raw MDX body. Case-insensitive substring\n * match. No index beyond the already-loaded documents — the studio cache warms\n * `type.list()` for every type, so this is a cheap in-memory scan.\n */\n\nconst MAX_HITS_PER_TYPE = 20;\nconst SNIPPET_CONTEXT = 70;\n\n/** Minimal structural view of the project so the search is unit-testable with fakes. */\ninterface SearchableType {\n id: string;\n config: { label: string };\n list: (locale?: string) => ScribeDocument[];\n}\ninterface SearchableProject {\n listTypes: () => SearchableType[];\n}\n\nexport interface SearchHit {\n enSlug: string;\n slug: string;\n /** Where the first match landed: a frontmatter field path, `\"slug\"`, or `\"body\"`. */\n field: string;\n /** Escaped snippet (~160 chars) with the first match wrapped in `<mark>`. */\n snippet: string;\n}\n\nexport interface SearchGroup {\n typeId: string;\n label: string;\n /** Up to `MAX_HITS_PER_TYPE` hits. */\n hits: SearchHit[];\n /** Total matching documents in this type (may exceed `hits.length`). */\n total: number;\n}\n\nfunction valueToText(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value === null || value === undefined) return \"\";\n return JSON.stringify(value);\n}\n\n/** Flatten frontmatter into `{ key, text }` pairs. Nested objects recurse; arrays stringify whole. */\nfunction frontmatterFields(\n data: Record<string, unknown>,\n prefix = \"\",\n): Array<{ key: string; text: string }> {\n const out: Array<{ key: string; text: string }> = [];\n for (const [k, v] of Object.entries(data)) {\n const key = prefix ? `${prefix}.${k}` : k;\n if (v !== null && typeof v === \"object\" && !Array.isArray(v)) {\n out.push(...frontmatterFields(v as Record<string, unknown>, key));\n } else {\n out.push({ key, text: valueToText(v) });\n }\n }\n return out;\n}\n\n/** Build an escaped ~160-char snippet with the first match wrapped in `<mark>`. Escape-before-mark. */\nfunction makeSnippet(text: string, lowerQuery: string): string {\n const idx = text.toLowerCase().indexOf(lowerQuery);\n if (idx === -1) return escapeHtml(text.slice(0, 2 * SNIPPET_CONTEXT).replace(/\\s+/g, \" \").trim());\n const start = Math.max(0, idx - SNIPPET_CONTEXT);\n const end = Math.min(text.length, idx + lowerQuery.length + SNIPPET_CONTEXT);\n const before = text.slice(start, idx).replace(/\\s+/g, \" \");\n const match = text.slice(idx, idx + lowerQuery.length);\n const after = text.slice(idx + lowerQuery.length, end).replace(/\\s+/g, \" \");\n const prefix = start > 0 ? \"…\" : \"\";\n const suffix = end < text.length ? \"…\" : \"\";\n return `${prefix}${escapeHtml(before)}<mark>${escapeHtml(match)}</mark>${escapeHtml(after)}${suffix}`;\n}\n\n/** First match location for a document, in order: slug, frontmatter fields, body. */\nfunction matchDoc(doc: ScribeDocument, lowerQuery: string): SearchHit | null {\n if (doc.slug.toLowerCase().includes(lowerQuery)) {\n return { enSlug: doc.enSlug, slug: doc.slug, field: \"slug\", snippet: makeSnippet(doc.slug, lowerQuery) };\n }\n const fm = doc.frontmatter as Record<string, unknown>;\n for (const f of frontmatterFields(fm)) {\n if (f.text.toLowerCase().includes(lowerQuery)) {\n return { enSlug: doc.enSlug, slug: doc.slug, field: f.key, snippet: makeSnippet(f.text, lowerQuery) };\n }\n }\n if (doc.content.toLowerCase().includes(lowerQuery)) {\n return { enSlug: doc.enSlug, slug: doc.slug, field: \"body\", snippet: makeSnippet(doc.content, lowerQuery) };\n }\n return null;\n}\n\n/** Run the search across every type's EN documents. Returns only types with at least one hit. */\nexport function searchProject(project: SearchableProject, rawQuery: string): SearchGroup[] {\n const lowerQuery = rawQuery.trim().toLowerCase();\n if (!lowerQuery) return [];\n const groups: SearchGroup[] = [];\n for (const type of project.listTypes()) {\n const hits: SearchHit[] = [];\n let total = 0;\n for (const doc of type.list()) {\n const hit = matchDoc(doc, lowerQuery);\n if (!hit) continue;\n total++;\n if (hits.length < MAX_HITS_PER_TYPE) hits.push(hit);\n }\n if (total > 0) groups.push({ typeId: type.id, label: type.config.label, hits, total });\n }\n return groups;\n}\n\nfunction renderGroup(group: SearchGroup): string {\n const hitRows = group.hits\n .map((h) => {\n const href = `/types/${encodePathSegment(group.typeId)}/${encodePathSegment(h.enSlug)}`;\n return `<div class=\"search-hit\">\n <a class=\"mono\" href=\"${href}\">${escapeHtml(h.slug)}</a>\n <span class=\"search-where\">${escapeHtml(h.field)}</span>\n <span class=\"search-snip\">${h.snippet}</span>\n </div>`;\n })\n .join(\"\");\n const more =\n group.total > group.hits.length\n ? `<div class=\"search-more\">+${group.total - group.hits.length} more matches</div>`\n : \"\";\n return `<div class=\"search-group\">\n <div class=\"section-head\">${escapeHtml(group.label)} <span class=\"dim\">· ${group.total}</span></div>\n ${hitRows}${more}\n </div>`;\n}\n\n/** Render the full search results page body (the sidebar form lives in the layout). */\nexport function renderSearchPage(project: SearchableProject, rawQuery: string): string {\n const q = rawQuery.trim();\n const toolbar = `<div class=\"toolbar\">Search${q ? ` <span class=\"dim\">· ${escapeHtml(q)}</span>` : \"\"}</div>`;\n if (!q) {\n return `${toolbar}<p class=\"dim\" style=\"padding:12px\">Type a query in the sidebar to search across all EN content.</p>`;\n }\n const groups = searchProject(project, rawQuery);\n if (groups.length === 0) {\n return `${toolbar}<p class=\"dim\" style=\"padding:12px\">No matches for \"${escapeHtml(q)}\".</p>`;\n }\n const totalHits = groups.reduce((n, g) => n + g.total, 0);\n const summary = `<p class=\"dim\" style=\"padding:6px 12px\">${totalHits} match${totalHits === 1 ? \"\" : \"es\"} in ${groups.length} type${groups.length === 1 ? \"\" : \"s\"}</p>`;\n return `${toolbar}${summary}${groups.map(renderGroup).join(\"\")}`;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig, ScribeProject } from \"../src/core/types.js\";\n\n/**\n * Content-fingerprint driven cache for the read-only studio.\n *\n * The studio derives three things from content that are far too expensive to\n * recompute on every request against a real project (hundreds of docs × a dozen\n * locales):\n *\n * - the back-reference index (relations)\n * - the asset-reference graph\n * - the validation report (drives the advisory badges)\n *\n * The validation report in particular parses every EN + translated MDX body\n * through remark/unified, which is multiple seconds on a large project. Doing\n * that synchronously inside the request that happened to arrive right after a\n * content change made `/types/:id` block for ~5s — the reported slowness.\n *\n * This module rebuilds the derived data ONCE per content-change tick (a cheap\n * `count:newestMtime:storeMtime` fingerprint) and serves it *stale-while-\n * revalidate*: a request never blocks on a rebuild once a cache exists. When the\n * fingerprint changes the current (stale) value is returned immediately and a\n * single background rebuild is kicked off; the next request after it lands sees\n * the fresh data. Only the very first build (no cache yet) runs synchronously so\n * there is always something to render.\n *\n * The badges are advisory, so a few hundred ms of staleness after an edit is an\n * acceptable trade for never blocking the browser. Edits are still reflected\n * without a restart — the fingerprint invalidation drives the refresh.\n *\n * Everything is injectable (clock + builder) so the invalidation/refresh logic\n * is unit-testable without a filesystem or a real remark parse.\n */\n\nexport interface StudioCacheData<T> {\n fingerprint: string;\n value: T;\n}\n\nexport interface StudioCacheOptions<T> {\n /** Compute the current content fingerprint (file counts + newest mtime + store mtime). */\n fingerprint: () => string;\n /** Build the derived value for the current content. Expensive; run off the hot path. */\n build: () => T;\n /**\n * Cheap placeholder served on the very first request while the first real\n * build runs in the background. When provided, no request ever blocks on a\n * build; when omitted, the first `get()` builds synchronously so callers that\n * need a fully-populated value on first paint still work.\n */\n initial?: () => T;\n /** Injectable error sink (defaults to console.error). */\n onError?: (err: unknown) => void;\n /** Schedule a background job (defaults to `queueMicrotask` → `setImmediate` fallback). */\n schedule?: (job: () => void) => void;\n}\n\nfunction defaultSchedule(job: () => void): void {\n // Run after the current response has been handed off. `setImmediate` yields to\n // the event loop first (so the in-flight request flushes), falling back to\n // `queueMicrotask` where it is unavailable.\n if (typeof setImmediate === \"function\") setImmediate(job);\n else queueMicrotask(job);\n}\n\n/**\n * A fingerprint-keyed value that is rebuilt lazily and refreshed in the\n * background. `get()` is non-blocking whenever a value already exists.\n */\nexport class StudioCache<T> {\n private current: StudioCacheData<T> | null = null;\n private building = false;\n /** Fingerprint of the in-flight background build, to avoid redundant rebuilds. */\n private pendingFingerprint: string | null = null;\n\n constructor(private readonly opts: StudioCacheOptions<T>) {}\n\n /**\n * Return the freshest cached value without blocking (once a value exists).\n *\n * - No cache yet → build synchronously once (blocking, unavoidable).\n * - Fingerprint unchanged → return cached value.\n * - Fingerprint changed → return the stale value now, schedule a background\n * rebuild (deduped by fingerprint) so the next request sees fresh data.\n */\n get(): T {\n const fingerprint = this.opts.fingerprint();\n\n if (!this.current) {\n if (this.opts.initial) {\n // Cold, but a cheap placeholder is available: serve it and build for\n // real in the background. Tag it with a sentinel fingerprint so the\n // scheduled build (and any future change) is always seen as newer.\n this.current = { fingerprint: \"\\u0000uninitialized\", value: this.opts.initial() };\n this.scheduleRefresh(fingerprint);\n return this.current.value;\n }\n // No placeholder: build once on the request thread so first paint is complete.\n this.current = { fingerprint, value: this.runBuild() };\n return this.current.value;\n }\n\n if (this.current.fingerprint !== fingerprint) {\n this.scheduleRefresh(fingerprint);\n }\n return this.current.value;\n }\n\n /** True when a background rebuild is currently in flight (for tests/introspection). */\n get isRefreshing(): boolean {\n return this.building;\n }\n\n /**\n * Drop the cached value so the next `get()` rebuilds synchronously. Used after\n * a mutation (e.g. an entry deletion) so derived data — back-refs, badges,\n * validation — reflects the change on the very next request rather than after\n * the next background tick.\n */\n invalidate(): void {\n this.current = null;\n this.pendingFingerprint = null;\n }\n\n private scheduleRefresh(fingerprint: string): void {\n // Dedupe: one in-flight rebuild per target fingerprint.\n if (this.building && this.pendingFingerprint === fingerprint) return;\n if (this.building) {\n // A build for an older fingerprint is running; remember the newest target\n // so we rebuild again once it settles.\n this.pendingFingerprint = fingerprint;\n return;\n }\n this.building = true;\n this.pendingFingerprint = fingerprint;\n const schedule = this.opts.schedule ?? defaultSchedule;\n schedule(() => this.refreshNow());\n }\n\n private refreshNow(): void {\n // Recompute the fingerprint at build time so we tag the value with the state\n // we actually observed, and can detect further changes that landed meanwhile.\n const fingerprint = this.opts.fingerprint();\n try {\n this.current = { fingerprint, value: this.runBuild() };\n } catch (err) {\n (this.opts.onError ?? ((e) => console.error(e)))(err);\n } finally {\n this.building = false;\n const target = this.pendingFingerprint;\n this.pendingFingerprint = null;\n // Content changed again while we were building — chase it.\n if (target !== null && target !== fingerprint) {\n this.scheduleRefresh(target);\n }\n }\n }\n\n private runBuild(): T {\n return this.opts.build();\n }\n}\n\n/**\n * Cheap content fingerprint: total file count across all type content dirs, the\n * newest file mtime, and the store mtime. A change to any of these triggers a\n * rebuild. Pure read of `fs.stat` — never throws.\n */\nexport function computeContentFingerprint(project: ScribeProject, config: ScribeConfig): string {\n let newest = 0;\n let count = 0;\n for (const type of project.listTypes()) {\n try {\n const dir = path.join(config.rootDir, type.config.contentDir);\n for (const name of fs.readdirSync(dir)) {\n try {\n newest = Math.max(newest, fs.statSync(path.join(dir, name)).mtimeMs);\n count++;\n } catch {\n /* ignore unreadable entry */\n }\n }\n } catch {\n /* ignore missing dir */\n }\n }\n let store = 0;\n try {\n store = fs.statSync(config.storePath).mtimeMs;\n } catch {\n /* ignore missing store */\n }\n return `${count}:${newest}:${store}`;\n}\n","import fs from \"node:fs\";\nimport { serve } from \"@hono/node-server\";\nimport { Hono } from \"hono\";\nimport type {\n ContentTypeRuntime,\n ScribeConfig,\n ScribeDocument,\n ScribeProject,\n} from \"../src/core/types.js\";\nimport {\n introspectSchema,\n isTypeTranslatable,\n mergeStructuralOntoLocale,\n} from \"../src/core/introspect-schema.js\";\nimport { computeTranslationEnHash } from \"../src/hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../src/loader/create-loader.js\";\nimport { openStore } from \"../src/storage/sqlite.js\";\nimport {\n countTranslations,\n getEnSnapshot,\n getTranslation,\n latestTranslationAtByLocale,\n listTranslationsForLocale,\n listTranslationsForType,\n type EnSnapshotRow,\n} from \"../src/storage/translations.js\";\nimport { buildWorklist } from \"../src/translate/worklist.js\";\nimport { validateProject } from \"../src/validate/validate-project.js\";\nimport {\n encodePathSegment as sharedEncodePathSegment,\n escapeHtml as sharedEscapeHtml,\n renderLayout as sharedRenderLayout,\n} from \"./shared.js\";\nimport { buildIndexes } from \"./introspect-fields.js\";\nimport {\n bucketValidation,\n frontmatterOnlyChip,\n notTranslatableChip,\n renderCollectionBrowser,\n renderDeletionPlanPage,\n renderEntryInspector,\n renderUsedBy,\n typeBadges,\n type InspectorContext,\n type ValidationBuckets,\n} from \"./content-views.js\";\nimport { renderAssetBrowser } from \"./asset-views.js\";\nimport { buildDeletionPlan, isPlanBlocked, type DeletionPlan } from \"../src/delete/plan.js\";\nimport { executeDeletionPlan } from \"../src/delete/execute.js\";\nimport { renderSearchPage } from \"./search.js\";\nimport { contentTypeForPath, resolveAssetWebPath, serveStudioAsset, statAsset } from \"./asset-serve.js\";\nimport { extractInlineTokens } from \"../src/inline/tokens.js\";\nimport { buildPreviewTokens, makeDocExists } from \"./preview-tokens.js\";\nimport { renderMdxApprox } from \"./mdx-preview.js\";\nimport { StudioCache, computeContentFingerprint } from \"./studio-cache.js\";\n\ntype DocStatus = \"source\" | \"up-to-date\" | \"stale\" | \"missing\" | \"not-translatable\";\n\ninterface DocumentStatusResult {\n status: DocStatus;\n currentEnHash?: string;\n storedEnHash?: string;\n}\n\nconst escapeHtml = sharedEscapeHtml;\nconst encodePathSegment = sharedEncodePathSegment;\n\nfunction statusDot(status: DocStatus): string {\n const labels: Record<DocStatus, string> = {\n source: \"en\",\n \"up-to-date\": \"ok\",\n stale: \"stale\",\n missing: \"—\",\n \"not-translatable\": \"n/a\",\n };\n return `<span class=\"status\" title=\"${status}\"><span class=\"dot dot-${status}\"></span>${labels[status]}</span>`;\n}\n\nfunction bodyToggleFor(locale: string, showRaw: boolean, preview: boolean): string {\n const q = (withPreview: boolean) => {\n const parts = [`locale=${encodePathSegment(locale)}`];\n if (showRaw) parts.push(\"raw=1\");\n if (withPreview) parts.push(\"body=preview\");\n return \"?\" + parts.join(\"&\");\n };\n return `<span class=\"bodytabs\">\n <a href=\"${q(false)}\" class=\"${preview ? \"\" : \"active\"}\">Raw</a>\n <a href=\"${q(true)}\" class=\"${preview ? \"active\" : \"\"}\">Preview</a>\n </span>`;\n}\n\nfunction documentStatus(\n config: ScribeConfig,\n db: ReturnType<typeof openStore>,\n type: ContentTypeRuntime,\n enSlug: string,\n locale: string,\n): DocumentStatusResult {\n if (locale === config.defaultLocale) {\n return { status: \"source\" };\n }\n // Non-translatable types have no per-locale translation state: report a\n // neutral \"n/a\" rather than a red \"missing\" for every locale.\n if (!isTypeTranslatable(type.config)) {\n return { status: \"not-translatable\" };\n }\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) {\n return { status: \"missing\" };\n }\n const payload = getTranslatablePayload(enDoc, type.config);\n const currentEnHash = computeTranslationEnHash(payload.frontmatter, payload.body);\n const row = getTranslation(db, type.id, enSlug, locale);\n if (!row) {\n return { status: \"missing\", currentEnHash };\n }\n if (row.en_hash !== currentEnHash) {\n return { status: \"stale\", currentEnHash, storedEnHash: row.en_hash };\n }\n return { status: \"up-to-date\", currentEnHash, storedEnHash: row.en_hash };\n}\n\nfunction flattenFrontmatter(\n data: Record<string, unknown>,\n prefix = \"\",\n): Array<{ key: string; value: string }> {\n const rows: Array<{ key: string; value: string }> = [];\n for (const [key, value] of Object.entries(data)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n rows.push(...flattenFrontmatter(value as Record<string, unknown>, fullKey));\n } else {\n const display =\n typeof value === \"string\"\n ? value\n : value === undefined\n ? \"\"\n : JSON.stringify(value, null, 2);\n rows.push({ key: fullKey, value: display });\n }\n }\n return rows;\n}\n\nfunction translatableKeySet(schema: ContentTypeRuntime[\"config\"][\"schema\"]): Set<string> {\n return new Set(\n introspectSchema(schema)\n .filter((field) => field.kind === \"translatable\")\n .map((field) => field.path.join(\".\")),\n );\n}\n\nfunction renderFrontmatterTable(\n frontmatter: Record<string, unknown>,\n schema: ContentTypeRuntime[\"config\"][\"schema\"],\n): string {\n const translatable = translatableKeySet(schema);\n const rows = flattenFrontmatter(frontmatter)\n .map((row) => {\n const flag = translatable.has(row.key)\n ? `<span class=\"flag t\" title=\"Translatable\">T</span>`\n : `<span class=\"flag s\" title=\"Structural\">S</span>`;\n return `<tr>\n <td class=\"k\">${flag}${escapeHtml(row.key)}</td>\n <td class=\"v\">${escapeHtml(row.value)}</td>\n </tr>`;\n })\n .join(\"\");\n return `<table class=\"kv\">\n <tbody>${rows || `<tr><td colspan=\"2\" class=\"dim\">—</td></tr>`}</tbody>\n </table>`;\n}\n\nfunction renderEnSnapshotPreview(snapshot: EnSnapshotRow): string {\n let frontmatter: Record<string, unknown> = {};\n try {\n frontmatter = JSON.parse(snapshot.frontmatter_json) as Record<string, unknown>;\n } catch {\n frontmatter = {};\n }\n const fmRows = flattenFrontmatter(frontmatter)\n .map(\n (row) =>\n `<tr><td class=\"k\">${escapeHtml(row.key)}</td><td class=\"v\">${escapeHtml(row.value)}</td></tr>`,\n )\n .join(\"\");\n return `<table class=\"kv\"><tbody>${fmRows}</tbody></table>\n <pre class=\"code\">${escapeHtml(snapshot.body)}</pre>`;\n}\n\nfunction renderTranslationSnapshotPanel(\n snapshot: EnSnapshotRow | undefined,\n currentEnHash?: string,\n): string {\n if (!snapshot) {\n return `<p class=\"dim\">No EN snapshot linked to this translation.</p>`;\n }\n const staleNote =\n currentEnHash && currentEnHash !== snapshot.en_hash\n ? `<p class=\"dim\">Current EN hash differs from snapshot (${escapeHtml(currentEnHash.slice(0, 12))} vs ${escapeHtml(snapshot.en_hash.slice(0, 12))}).</p>`\n : \"\";\n return `<dl class=\"meta\">\n <dt>snapshot</dt><dd>#${snapshot.id}</dd>\n <dt>captured</dt><dd>${escapeHtml(snapshot.created_at.slice(0, 19))}</dd>\n <dt>en_hash</dt><dd class=\"mono\">${escapeHtml(snapshot.en_hash.slice(0, 12))}</dd>\n </dl>\n ${staleNote}\n <details><summary>EN source at translation time</summary>${renderEnSnapshotPreview(snapshot)}</details>`;\n}\n\n/** Thin wrapper over the shared studio layout (adds the Assets nav + type badges). */\nfunction renderLayout(\n title: string,\n body: string,\n project: ScribeProject,\n options: {\n activeTypeId?: string;\n activeNav?: string;\n typeBadges?: Map<string, string>;\n searchQuery?: string;\n } = {},\n): string {\n return sharedRenderLayout(title, body, project, options);\n}\n\nfunction docTitleFromFrontmatter(frontmatter: Record<string, unknown>, enSlug: string): string {\n const title = frontmatter.title;\n if (typeof title === \"string\" && title.trim()) return title;\n return enSlug;\n}\n\n/** Start a local read-only Scribe studio (browser, staleness, document detail). */\nexport async function startStudio(\n project: ScribeProject,\n options: { port?: number; host?: string } = {},\n): Promise<void> {\n const app = new Hono();\n const config = project.config;\n\n // Back-ref + asset-reference indexes and the validation report are derived\n // once per content-change tick (a cheap file-count/mtime/store fingerprint)\n // and served stale-while-revalidate: only the first build blocks a request;\n // after that a fingerprint change returns the current value immediately and\n // refreshes in the background. See studio-cache.ts. The validation report\n // parses every EN + translated MDX body, which is multiple seconds on a large\n // project — doing it inline made `/types/:id` block for ~5s after any edit.\n interface StudioCacheValue {\n backRefs: ReturnType<typeof buildIndexes>[\"backRefs\"];\n assetRefs: ReturnType<typeof buildIndexes>[\"assetRefs\"];\n buckets: ValidationBuckets;\n typeBadges: Map<string, string>;\n }\n\n const studioCache = new StudioCache<StudioCacheValue>({\n fingerprint: () => computeContentFingerprint(project, config),\n build: () => {\n const { backRefs, assetRefs } = buildIndexes(project.listTypes());\n let buckets: ValidationBuckets;\n try {\n buckets = bucketValidation(validateProject(config).issues);\n } catch {\n buckets = bucketValidation([]);\n }\n return { backRefs, assetRefs, buckets, typeBadges: typeBadges(buckets) };\n },\n // First-paint placeholder so even the very first request doesn't block on the\n // multi-second MDX validation pass. Back-refs/badges fill in a moment later.\n initial: () => {\n const empty = bucketValidation([]);\n return {\n backRefs: new Map(),\n assetRefs: new Map(),\n buckets: empty,\n typeBadges: typeBadges(empty),\n };\n },\n onError: (err) => console.error(\"[scribe:studio] cache rebuild failed:\", err),\n });\n\n function getStudioCache(): StudioCacheValue {\n return studioCache.get();\n }\n\n function getTypeSafe(id: string): ContentTypeRuntime | null {\n try {\n return project.getType(id);\n } catch {\n return null;\n }\n }\n\n /**\n * Batched status-dots renderer for a whole collection page. The per-entry\n * `documentStatus` re-reads the EN file from disk, re-parses it, re-hashes it,\n * and issues one point query — per locale (×15 here). For a 600-doc type\n * that is ~9k disk reads + ~9k queries + ~9k hashes on a single page.\n *\n * Instead we do it once per type: pull every translation row for the type in a\n * single query and index it by (enSlug, locale), and compute each entry's\n * current EN hash once from the already-cached `type.list()` document (no disk\n * read). The returned closure is then a pure in-memory lookup per entry.\n */\n function batchedStatusDots(\n db: ReturnType<typeof openStore>,\n type: ContentTypeRuntime,\n ): (enSlug: string) => string {\n // Non-translatable types have no per-locale status; the collection browser\n // suppresses the status column, so never compute dots for them.\n if (!isTypeTranslatable(type.config)) return () => \"\";\n const targetLocales = config.locales.filter((l) => l !== config.defaultLocale);\n\n // One query for the whole type; index rows by \"enSlug\\x00locale\".\n const rowByKey = new Map<string, { en_hash: string }>();\n for (const row of listTranslationsForType(db, type.id)) {\n rowByKey.set(`${row.en_slug}\\u0000${row.locale}`, { en_hash: row.en_hash });\n }\n\n // Current EN hash per entry, computed once from cached docs (no disk read).\n const enHashBySlug = new Map<string, string>();\n for (const doc of type.list() as ScribeDocument[]) {\n const payload = getTranslatablePayload(doc, type.config);\n enHashBySlug.set(doc.enSlug, computeTranslationEnHash(payload.frontmatter, payload.body));\n }\n\n return (enSlug: string): string => {\n const currentEnHash = enHashBySlug.get(enSlug);\n return targetLocales\n .map((locale) => {\n let status: DocStatus;\n if (currentEnHash === undefined) {\n // EN doc not in the cached list (shouldn't happen for a listed entry).\n status = \"missing\";\n } else {\n const row = rowByKey.get(`${enSlug}\\u0000${locale}`);\n if (!row) status = \"missing\";\n else if (row.en_hash !== currentEnHash) status = \"stale\";\n else status = \"up-to-date\";\n }\n return statusDot(status);\n })\n .join(\"\");\n };\n }\n\n app.get(\"/\", (c) => {\n const db = openStore(config, \"readonly\");\n const worklist = buildWorklist(config);\n const targetLocaleCount = config.locales.filter((l) => l !== config.defaultLocale).length;\n const rows = project.listTypes().map((type) => {\n const enCount = type.list().length;\n const localeCells = !isTypeTranslatable(type.config)\n ? `<td colspan=\"${targetLocaleCount}\" class=\"dim\">${notTranslatableChip()}</td>`\n : config.locales\n .filter((locale) => locale !== config.defaultLocale)\n .map((locale) => {\n const translated = listTranslationsForLocale(db, type.id, locale).length;\n const stale = worklist.filter(\n (item) =>\n item.contentType === type.id && item.locale === locale && item.reason === \"stale\",\n ).length;\n const missing = worklist.filter(\n (item) =>\n item.contentType === type.id && item.locale === locale && item.reason === \"missing\",\n ).length;\n const tags = [\n stale ? `<span class=\"tag tag-warn\">${stale}s</span>` : \"\",\n missing ? `<span class=\"tag tag-err\">${missing}m</span>` : \"\",\n ].join(\"\");\n return `<td>${translated}${tags}</td>`;\n })\n .join(\"\");\n return `<tr>\n <td><a href=\"/type/${encodePathSegment(type.id)}\">${escapeHtml(type.config.label)}</a></td>\n <td class=\"dim\">${escapeHtml(type.id)}</td>\n <td>${enCount}</td>\n ${localeCells}\n </tr>`;\n });\n db.close();\n const localeHeaders = config.locales\n .filter((l) => l !== config.defaultLocale)\n .map((l) => `<th>${escapeHtml(l)}</th>`)\n .join(\"\");\n const html = `<div class=\"toolbar\">Overview</div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>ID</th><th>EN</th>${localeHeaders}</tr></thead>\n <tbody>${rows.join(\"\")}</tbody>\n </table>`;\n return c.html(renderLayout(\"Overview\", html, project));\n });\n\n app.get(\"/dashboard\", (c) => {\n const db = openStore(config, \"readonly\");\n const types = project.listTypes();\n const targetLocales = config.locales.filter((l) => l !== config.defaultLocale);\n\n // EN doc counts per type + total.\n const docCountByType = new Map<string, number>();\n let totalEnDocs = 0;\n for (const type of types) {\n const n = type.list().length;\n docCountByType.set(type.id, n);\n totalEnDocs += n;\n }\n\n // Single pass over the worklist for per-locale and per-type tallies.\n const worklist = buildWorklist(config);\n const missingByLocale = new Map<string, number>();\n const staleByLocale = new Map<string, number>();\n const missingByType = new Map<string, number>();\n const staleByType = new Map<string, number>();\n let missingTotal = 0;\n let staleTotal = 0;\n for (const item of worklist) {\n if (item.reason === \"missing\") {\n missingByLocale.set(item.locale, (missingByLocale.get(item.locale) ?? 0) + 1);\n missingByType.set(item.contentType, (missingByType.get(item.contentType) ?? 0) + 1);\n missingTotal++;\n } else if (item.reason === \"stale\") {\n staleByLocale.set(item.locale, (staleByLocale.get(item.locale) ?? 0) + 1);\n staleByType.set(item.contentType, (staleByType.get(item.contentType) ?? 0) + 1);\n staleTotal++;\n }\n }\n\n const storedTranslations = countTranslations(db);\n const latestByLocale = new Map<string, string>();\n for (const row of latestTranslationAtByLocale(db)) {\n if (row.latest) latestByLocale.set(row.locale, row.latest);\n }\n db.close();\n\n // Overall coverage.\n const expectedTotal = totalEnDocs * targetLocales.length;\n const coverageTotal =\n expectedTotal > 0 ? (expectedTotal - missingTotal - staleTotal) / expectedTotal : 0;\n const coveragePct = expectedTotal > 0 ? Math.round(coverageTotal * 100) : 0;\n\n const pct = (fraction: number) => Math.round(fraction * 100);\n const num = (n: number, warnClass: string) =>\n n > 0 ? `<span class=\"${warnClass}\">${n}</span>` : `<span class=\"dim\">0</span>`;\n\n // KPI cards.\n const coverageColor = expectedTotal > 0 && coveragePct === 100 ? ` style=\"color:var(--ok)\"` : \"\";\n const coverageValue = expectedTotal > 0 ? `${coveragePct}%` : `<span class=\"dim\">—</span>`;\n const staleColor = staleTotal > 0 ? ` style=\"color:var(--stale)\"` : \"\";\n const missingColor = missingTotal > 0 ? ` style=\"color:var(--missing)\"` : \"\";\n const cards = `<div class=\"cards\">\n <div class=\"card\"><div class=\"card-value\">${totalEnDocs}</div><div class=\"card-label\">Documents (EN)</div></div>\n <div class=\"card\"><div class=\"card-value\">${targetLocales.length}</div><div class=\"card-label\">Target locales</div></div>\n <div class=\"card\"><div class=\"card-value\">${storedTranslations}</div><div class=\"card-label\">Stored translations</div></div>\n <div class=\"card\"><div class=\"card-value\"${coverageColor}>${coverageValue}</div><div class=\"card-label\">Coverage</div></div>\n <div class=\"card\"><div class=\"card-value\"${staleColor}>${staleTotal}</div><div class=\"card-label\">Stale</div></div>\n <div class=\"card\"><div class=\"card-value\"${missingColor}>${missingTotal}</div><div class=\"card-label\">Missing</div></div>\n </div>`;\n\n // Locales section.\n let localeRows: string;\n if (totalEnDocs === 0 || targetLocales.length === 0) {\n localeRows = `<tr><td colspan=\"7\" class=\"dim\">No target locales or documents</td></tr>`;\n } else {\n localeRows = targetLocales\n .map((locale) => {\n const expected = totalEnDocs;\n const missing = missingByLocale.get(locale) ?? 0;\n const stale = staleByLocale.get(locale) ?? 0;\n const translated = expected - missing;\n const upToDate = translated - stale;\n const upToDatePct = pct(expected > 0 ? upToDate / expected : 0);\n const stalePct = pct(expected > 0 ? stale / expected : 0);\n const fallbacks = config.localeFallbacks?.[locale]?.length\n ? escapeHtml(config.localeFallbacks[locale]!.join(\" → \"))\n : `<span class=\"dim\">—</span>`;\n const latest = latestByLocale.get(locale);\n const last = latest ? escapeHtml(latest.slice(0, 10)) : `<span class=\"dim\">—</span>`;\n return `<tr>\n <td>${escapeHtml(locale)}</td>\n <td><span class=\"bar\"><span class=\"bar-fill\" style=\"width:${upToDatePct}%;background:var(--ok)\"></span><span class=\"bar-fill\" style=\"width:${stalePct}%;background:var(--stale)\"></span></span>${upToDatePct}%</td>\n <td>${upToDate}</td>\n <td>${num(stale, \"tag-warn\")}</td>\n <td>${num(missing, \"tag-err\")}</td>\n <td>${fallbacks}</td>\n <td>${last}</td>\n </tr>`;\n })\n .join(\"\");\n }\n\n // Types section.\n let typeRows: string;\n if (types.length === 0 || targetLocales.length === 0) {\n typeRows = `<tr><td colspan=\"5\" class=\"dim\">No types or target locales</td></tr>`;\n } else {\n typeRows = types\n .map((type) => {\n const docs = docCountByType.get(type.id) ?? 0;\n if (!isTypeTranslatable(type.config)) {\n return `<tr>\n <td><a href=\"/type/${encodePathSegment(type.id)}\">${escapeHtml(type.config.label)}</a></td>\n <td class=\"dim\">${escapeHtml(type.id)}</td>\n <td>${docs}</td>\n <td colspan=\"2\">${notTranslatableChip()}</td>\n </tr>`;\n }\n const stale = staleByType.get(type.id) ?? 0;\n const missing = missingByType.get(type.id) ?? 0;\n return `<tr>\n <td><a href=\"/type/${encodePathSegment(type.id)}\">${escapeHtml(type.config.label)}</a></td>\n <td class=\"dim\">${escapeHtml(type.id)}</td>\n <td>${docs}</td>\n <td>${num(stale, \"tag-warn\")}</td>\n <td>${num(missing, \"tag-err\")}</td>\n </tr>`;\n })\n .join(\"\");\n }\n\n const html = `<div class=\"toolbar\">Dashboard</div>\n ${cards}\n <div class=\"section\">\n <div class=\"section-head\">Locales</div>\n <table class=\"data\">\n <thead><tr><th>Locale</th><th>Coverage</th><th>Up to date</th><th>Stale</th><th>Missing</th><th>Fallbacks</th><th>Last translated</th></tr></thead>\n <tbody>${localeRows}</tbody>\n </table>\n </div>\n <div class=\"section\">\n <div class=\"section-head\">Types</div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>ID</th><th>EN docs</th><th>Stale</th><th>Missing</th></tr></thead>\n <tbody>${typeRows}</tbody>\n </table>\n </div>`;\n return c.html(renderLayout(\"Dashboard\", html, project));\n });\n\n app.get(\"/type/:id\", (c) => {\n const typeId = c.req.param(\"id\");\n const type = project.getType(typeId);\n if (!type) {\n return c.html(renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project), 404);\n }\n\n const db = openStore(config, \"readonly\");\n const locales = config.locales;\n const headerCells = locales\n .map((locale) => `<th>${escapeHtml(locale)}</th>`)\n .join(\"\");\n const rows = type\n .list()\n .map((doc) => {\n const title = docTitleFromFrontmatter(doc.frontmatter as Record<string, unknown>, doc.slug);\n const statusCells = locales\n .map((locale) => {\n const { status } = documentStatus(config, db, type, doc.slug, locale);\n return `<td>${statusDot(status)}</td>`;\n })\n .join(\"\");\n return `<tr>\n <td class=\"mono\"><a href=\"/type/${encodePathSegment(typeId)}/doc/${encodePathSegment(doc.slug)}\">${escapeHtml(doc.slug)}</a></td>\n <td>${escapeHtml(title)}</td>\n ${statusCells}\n </tr>`;\n })\n .join(\"\");\n db.close();\n\n const html = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>${escapeHtml(type.config.label)}\n </div>\n <table class=\"data\">\n <thead><tr><th>Slug</th><th>Title</th>${headerCells}</tr></thead>\n <tbody>${rows || `<tr><td colspan=\"${2 + locales.length}\" class=\"dim\">No documents</td></tr>`}</tbody>\n </table>`;\n return c.html(renderLayout(type.config.label, html, project, { activeTypeId: typeId }));\n });\n\n app.get(\"/type/:id/doc/:enSlug\", (c) => {\n const typeId = c.req.param(\"id\");\n const enSlug = c.req.param(\"enSlug\");\n const locale = c.req.query(\"locale\") ?? config.defaultLocale;\n const showRaw = c.req.query(\"raw\") === \"1\";\n const bodyView = c.req.query(\"body\") === \"preview\" ? \"preview\" : \"raw\";\n const docExists = makeDocExists(project, config);\n const type = project.getType(typeId);\n if (!type) {\n return c.html(renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project), 404);\n }\n\n const db = openStore(config, \"readonly\");\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) {\n db.close();\n return c.html(\n renderLayout(\"Not found\", `<div class=\"toolbar\">Not found</div><p class=\"dim\" style=\"padding:12px\">${escapeHtml(enSlug)}</p>`, project, {\n activeTypeId: typeId,\n }),\n 404,\n );\n }\n\n // Non-translatable types have only an EN source — no locale switcher noise.\n const tabLocales = isTypeTranslatable(type.config) ? config.locales : [config.defaultLocale];\n const localeTabs = tabLocales\n .map((loc) => {\n const { status } = documentStatus(config, db, type, enSlug, loc);\n const active = loc === locale ? \" active\" : \"\";\n const href = `/type/${encodePathSegment(typeId)}/doc/${encodePathSegment(enSlug)}?locale=${encodePathSegment(loc)}`;\n return `<a class=\"tab${active}\" href=\"${href}\">${escapeHtml(loc)} ${statusDot(status)}</a>`;\n })\n .join(\"\");\n\n let contentPanel = \"\";\n let metaPanel = \"\";\n let historyPanel = \"\";\n\n const enTokens = extractInlineTokens(enDoc.content);\n const enPv = buildPreviewTokens(enTokens.tokens, {\n enFrontmatter: enDoc.frontmatter as Record<string, unknown>,\n docExists,\n });\n const enBodyInner =\n bodyView === \"preview\"\n ? `<div class=\"mdx-preview\">${renderMdxApprox(enTokens.placeholderBody, enPv)}</div>`\n : `<pre class=\"code\">${escapeHtml(enDoc.content)}</pre>`;\n const bodySection =\n type.config.body === false\n ? `<div class=\"section-head\">Body</div>\n <p class=\"dim\" style=\"padding:6px 12px\">${frontmatterOnlyChip()}</p>`\n : `<div class=\"section-head\">Body ${bodyToggleFor(locale, false, bodyView === \"preview\")}</div>${enBodyInner}`;\n\n if (locale === config.defaultLocale) {\n contentPanel = `<div class=\"section\">\n <div class=\"section-head\">Frontmatter</div>\n <div class=\"section-body\">${renderFrontmatterTable(enDoc.frontmatter as Record<string, unknown>, type.config.schema)}</div>\n ${bodySection}\n </div>`;\n } else {\n const translation = getTranslation(db, typeId, enSlug, locale);\n const { status, currentEnHash, storedEnHash } = documentStatus(config, db, type, enSlug, locale);\n\n if (translation) {\n const rawFrontmatter = JSON.parse(translation.frontmatter_json) as Record<string, unknown>;\n const displayFrontmatter = showRaw\n ? rawFrontmatter\n : mergeStructuralOntoLocale(rawFrontmatter, enDoc.frontmatter as Record<string, unknown>, type.config.schema);\n const rawToggle = showRaw\n ? `<span class=\"dim\"> · <a href=\"?locale=${encodePathSegment(locale)}\">merged</a></span>`\n : `<span class=\"dim\"> · <a href=\"?locale=${encodePathSegment(locale)}&raw=1\">raw</a></span>`;\n const trTokens = extractInlineTokens(enDoc.content).tokens;\n const trPv = buildPreviewTokens(trTokens, {\n enFrontmatter: enDoc.frontmatter as Record<string, unknown>,\n docExists,\n });\n const trBodyInner =\n bodyView === \"preview\"\n ? `<div class=\"mdx-preview\">${renderMdxApprox(translation.body, trPv)}</div>`\n : `<pre class=\"code\">${escapeHtml(translation.body)}</pre>`;\n const translationBodySection =\n type.config.body === false\n ? `<div class=\"section-head\">Body</div>\n <p class=\"dim\" style=\"padding:6px 12px\">${frontmatterOnlyChip()}</p>`\n : `<div class=\"section-head\">Body ${bodyToggleFor(locale, showRaw, bodyView === \"preview\")}</div>${trBodyInner}`;\n contentPanel = `<div class=\"section\">\n <div class=\"section-head\">Frontmatter${rawToggle}</div>\n <div class=\"section-body\">${renderFrontmatterTable(displayFrontmatter, type.config.schema)}</div>\n ${translationBodySection}\n </div>`;\n metaPanel = `<dl class=\"meta\">\n <dt>status</dt><dd>${statusDot(status)}</dd>\n <dt>model</dt><dd>${escapeHtml(translation.model)}</dd>\n <dt>translated</dt><dd>${escapeHtml(translation.translated_at.slice(0, 19))}</dd>\n <dt>slug</dt><dd>${escapeHtml(translation.slug)}</dd>\n <dt>en_hash</dt><dd>${escapeHtml(currentEnHash?.slice(0, 12) ?? \"—\")} / ${escapeHtml(storedEnHash?.slice(0, 12) ?? \"—\")}</dd>\n </dl>`;\n const snapshot =\n translation.snapshot_id != null\n ? getEnSnapshot(db, translation.snapshot_id)\n : undefined;\n historyPanel = `<div class=\"section\">\n <div class=\"section-head\">EN snapshot</div>\n <div class=\"section-body\">${renderTranslationSnapshotPanel(snapshot, currentEnHash)}</div>\n </div>`;\n } else {\n contentPanel = `<p class=\"dim\" style=\"padding:12px\">No translation for ${escapeHtml(locale)}.</p>`;\n metaPanel = `<dl class=\"meta\"><dt>status</dt><dd>${statusDot(status)}</dd></dl>`;\n }\n }\n\n db.close();\n\n const title = docTitleFromFrontmatter(enDoc.frontmatter as Record<string, unknown>, enSlug);\n // Back-refs (frontmatter relations + body ${{relation:...}} tokens) are\n // locale-independent, so the panel shows on every tab.\n const usedByPanel = renderUsedBy(project, typeId, enSlug, getStudioCache().backRefs);\n const html = `<div class=\"toolbar\">\n <a href=\"/\">Overview</a><span class=\"sep\">›</span>\n <a href=\"/type/${encodePathSegment(typeId)}\">${escapeHtml(type.config.label)}</a><span class=\"sep\">›</span>\n <span>${escapeHtml(enSlug)}</span>\n </div>\n <div class=\"tabs\">${localeTabs}</div>\n ${metaPanel}\n ${contentPanel}\n ${usedByPanel}\n ${historyPanel}`;\n\n return c.html(renderLayout(title, html, project, { activeTypeId: typeId }));\n });\n\n app.get(\"/staleness\", (c) => {\n const worklist = buildWorklist(config);\n const rows = worklist\n .slice(0, 500)\n .map((item) => {\n const href = `/type/${encodePathSegment(item.contentType)}/doc/${encodePathSegment(item.enSlug)}?locale=${encodePathSegment(item.locale)}`;\n return `<tr>\n <td>${escapeHtml(item.contentType)}</td>\n <td class=\"mono\"><a href=\"${href}\">${escapeHtml(item.enSlug)}</a></td>\n <td>${escapeHtml(item.locale)}</td>\n <td>${statusDot(item.reason === \"stale\" ? \"stale\" : \"missing\")}</td>\n </tr>`;\n })\n .join(\"\");\n const html = `<div class=\"toolbar\">Staleness <span class=\"dim\">· ${worklist.length} entries</span></div>\n <table class=\"data\">\n <thead><tr><th>Type</th><th>Slug</th><th>Locale</th><th>Status</th></tr></thead>\n <tbody>${rows || `<tr><td colspan=\"4\" class=\"dim\">All up to date</td></tr>`}</tbody>\n </table>`;\n return c.html(renderLayout(\"Staleness\", html, project));\n });\n\n app.get(\"/api/staleness-matrix\", (c) => {\n const worklist = buildWorklist(config);\n const matrix: Record<string, Record<string, number>> = {};\n for (const type of project.listTypes()) {\n matrix[type.id] = {};\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n matrix[type.id]![locale] = worklist.filter(\n (item) => item.contentType === type.id && item.locale === locale,\n ).length;\n }\n }\n return c.json(matrix);\n });\n\n // ------------------------------------------------------------------\n // Content management surfaces (read-only)\n // ------------------------------------------------------------------\n\n // Traversal-safe asset preview: maps a web path onto the configured assets\n // dir and streams the SOURCE file (never the site's publicPath URL).\n app.get(\"/asset\", (c) => {\n const webPath = c.req.query(\"p\");\n if (!webPath) return c.text(\"missing p\", 400);\n const resolved = resolveAssetWebPath(config, webPath);\n if (!resolved) return c.text(\"not found\", 404);\n const info = statAsset(resolved.absPath, webPath);\n if (!info.exists) return c.text(\"not found\", 404);\n try {\n const buf = fs.readFileSync(resolved.absPath);\n const body = new Uint8Array(buf);\n return c.body(body, 200, {\n \"Content-Type\": contentTypeForPath(webPath),\n \"Cache-Control\": \"no-cache\",\n });\n } catch {\n return c.text(\"not found\", 404);\n }\n });\n\n // Collection browser (table / gallery + field filters).\n app.get(\"/types/:typeId\", (c) => {\n const typeId = c.req.param(\"typeId\");\n const type = getTypeSafe(typeId);\n const cache = getStudioCache();\n if (!type) {\n return c.html(\n renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project, {\n typeBadges: cache.typeBadges,\n }),\n 404,\n );\n }\n const db = openStore(config, \"readonly\");\n // Precompute status dots for the whole page in one query + one hash pass,\n // then hand the renderer a pure in-memory lookup per entry.\n const statusDotsFor = batchedStatusDots(db, type);\n const html = renderCollectionBrowser(\n {\n project,\n config,\n type,\n buckets: cache.buckets,\n statusDots: (_tid, enSlug) => statusDotsFor(enSlug),\n },\n (key) => c.req.query(key),\n );\n db.close();\n return c.html(\n renderLayout(type.config.label, html, project, {\n activeTypeId: typeId,\n typeBadges: cache.typeBadges,\n }),\n );\n });\n\n // Entry inspector.\n app.get(\"/types/:typeId/:enSlug\", (c) => {\n const typeId = c.req.param(\"typeId\");\n const enSlug = c.req.param(\"enSlug\");\n const locale = c.req.query(\"locale\") ?? config.defaultLocale;\n const type = getTypeSafe(typeId);\n const cache = getStudioCache();\n if (!type) {\n return c.html(\n renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project, {\n typeBadges: cache.typeBadges,\n }),\n 404,\n );\n }\n const enDoc = readEnDocument(config, type.config, enSlug);\n if (!enDoc) {\n return c.html(\n renderLayout(\n \"Not found\",\n `<div class=\"toolbar\">Not found</div><p class=\"dim\" style=\"padding:12px\">${escapeHtml(enSlug)}</p>`,\n project,\n { activeTypeId: typeId, typeBadges: cache.typeBadges },\n ),\n 404,\n );\n }\n\n const db = openStore(config, \"readonly\");\n\n // Locale tabs reuse the existing status-dot component. Non-translatable types\n // have only an EN source, so we skip the per-locale tabs entirely.\n const tabLocales = isTypeTranslatable(type.config) ? config.locales : [config.defaultLocale];\n const localeTabs = tabLocales\n .map((loc) => {\n const { status } = documentStatus(config, db, type, enSlug, loc);\n const active = loc === locale ? \" active\" : \"\";\n const href = `/types/${encodePathSegment(typeId)}/${encodePathSegment(enSlug)}?locale=${encodePathSegment(loc)}`;\n return `<a class=\"tab${active}\" href=\"${href}\">${escapeHtml(loc)} ${statusDot(status)}</a>`;\n })\n .join(\"\");\n\n // Merged locale frontmatter (structural from EN + translatable from store).\n let localeFrontmatter: Record<string, unknown> | null = null;\n let isFallback = false;\n if (locale !== config.defaultLocale) {\n const translation = getTranslation(db, typeId, enSlug, locale);\n if (translation) {\n const rawFm = JSON.parse(translation.frontmatter_json) as Record<string, unknown>;\n localeFrontmatter = mergeStructuralOntoLocale(\n rawFm,\n enDoc.frontmatter as Record<string, unknown>,\n type.config.schema,\n );\n } else {\n isFallback = true;\n }\n }\n db.close();\n\n const bodyView = c.req.query(\"body\") === \"preview\" ? \"preview\" : \"raw\";\n\n // Prev/next in the collection's default order (same order the table uses).\n // Preserve the current locale + body query params on the target hrefs.\n const carry = new URLSearchParams();\n if (locale !== config.defaultLocale) carry.set(\"locale\", locale);\n if (bodyView === \"preview\") carry.set(\"body\", \"preview\");\n const qs = carry.toString();\n const suffix = qs ? `?${qs}` : \"\";\n const orderedSlugs = type.list().map((d) => d.enSlug);\n const currentIndex = orderedSlugs.indexOf(enSlug);\n const linkFor = (slug: string) =>\n `/types/${encodePathSegment(typeId)}/${encodePathSegment(slug)}${suffix}`;\n const prev =\n currentIndex > 0\n ? { href: linkFor(orderedSlugs[currentIndex - 1]!), slug: orderedSlugs[currentIndex - 1]! }\n : null;\n const next =\n currentIndex >= 0 && currentIndex < orderedSlugs.length - 1\n ? { href: linkFor(orderedSlugs[currentIndex + 1]!), slug: orderedSlugs[currentIndex + 1]! }\n : null;\n const deleteHref = `/types/${encodePathSegment(typeId)}/${encodePathSegment(enSlug)}/delete`;\n\n const ctx: InspectorContext = {\n project,\n config,\n type,\n enSlug,\n locale,\n enDoc,\n localeFrontmatter,\n isFallback,\n backRefs: cache.backRefs,\n buckets: cache.buckets,\n localeTabs,\n bodyView,\n prev,\n next,\n deleteHref,\n };\n const title = docTitleFromFrontmatter(enDoc.frontmatter as Record<string, unknown>, enSlug);\n return c.html(\n renderLayout(title, renderEntryInspector(ctx), project, {\n activeTypeId: typeId,\n typeBadges: cache.typeBadges,\n }),\n );\n });\n\n // Entry deletion: confirmation page (GET) + execution (POST). The studio's\n // first mutating route; it stays a localhost dev tool (POST-only, no CSRF).\n app.get(\"/types/:typeId/:enSlug/delete\", (c) => {\n const typeId = c.req.param(\"typeId\");\n const enSlug = c.req.param(\"enSlug\");\n const cache = getStudioCache();\n const type = getTypeSafe(typeId);\n if (!type) {\n return c.html(\n renderLayout(\"Not found\", `<div class=\"toolbar\">Unknown type</div>`, project, {\n typeBadges: cache.typeBadges,\n }),\n 404,\n );\n }\n let plan: DeletionPlan;\n try {\n plan = buildDeletionPlan(project, typeId, enSlug);\n } catch {\n return c.html(\n renderLayout(\n \"Not found\",\n `<div class=\"toolbar\">Not found</div><p class=\"dim\" style=\"padding:12px\">${escapeHtml(enSlug)}</p>`,\n project,\n { activeTypeId: typeId, typeBadges: cache.typeBadges },\n ),\n 404,\n );\n }\n const cancelHref = `/types/${encodePathSegment(typeId)}/${encodePathSegment(enSlug)}`;\n const postHref = `/types/${encodePathSegment(typeId)}/${encodePathSegment(enSlug)}/delete`;\n const html = renderDeletionPlanPage(project, plan, { typeId, enSlug, cancelHref, postHref });\n return c.html(\n renderLayout(`Delete ${enSlug}`, html, project, {\n activeTypeId: typeId,\n typeBadges: cache.typeBadges,\n }),\n );\n });\n\n app.post(\"/types/:typeId/:enSlug/delete\", async (c) => {\n const typeId = c.req.param(\"typeId\");\n const enSlug = c.req.param(\"enSlug\");\n const type = getTypeSafe(typeId);\n if (!type) return c.text(\"Unknown type\", 404);\n let plan: DeletionPlan;\n try {\n plan = buildDeletionPlan(project, typeId, enSlug);\n } catch {\n return c.text(\"Not found\", 404);\n }\n if (isPlanBlocked(plan)) {\n // A blocked plan can never be executed; bounce back to the confirmation page.\n return c.redirect(\n `/types/${encodePathSegment(typeId)}/${encodePathSegment(enSlug)}/delete`,\n 303,\n );\n }\n try {\n executeDeletionPlan(project, plan);\n } catch (err) {\n console.error(\"[scribe:studio] deletion failed:\", err);\n return c.text(\"Deletion failed\", 500);\n }\n // Refresh derived data so the collection view reflects the deletion at once.\n studioCache.invalidate();\n studioCache.get();\n return c.redirect(`/types/${encodePathSegment(typeId)}`, 303);\n });\n\n // Global full-text search (EN content).\n app.get(\"/search\", (c) => {\n const q = c.req.query(\"q\") ?? \"\";\n const cache = getStudioCache();\n const html = renderSearchPage(project, q);\n return c.html(\n renderLayout(\"Search\", html, project, {\n activeNav: \"search\",\n typeBadges: cache.typeBadges,\n searchQuery: q,\n }),\n );\n });\n\n // Asset browser.\n app.get(\"/assets\", (c) => {\n const cache = getStudioCache();\n const html = renderAssetBrowser(config, cache.assetRefs);\n return c.html(\n renderLayout(\"Assets\", html, project, {\n activeNav: \"assets\",\n typeBadges: cache.typeBadges,\n }),\n );\n });\n\n app.get(\"/*\", (c) => {\n const asset = serveStudioAsset(config, c.req.path);\n if (!asset) {\n return c.html(renderLayout(\"Not found\", `<div class=\"toolbar\">Not found</div>`, project), 404);\n }\n return c.body(asset.body, 200, {\n \"Content-Type\": asset.contentType,\n \"Cache-Control\": \"no-cache\",\n });\n });\n\n const port = options.port ?? 3600;\n const host = options.host ?? \"127.0.0.1\";\n serve({ fetch: app.fetch, port, hostname: host }, () => {\n console.log(`Scribe studio listening on http://${host}:${port}`);\n // Warm the derived-data cache (back-refs, asset graph, validation report)\n // and every content loader at boot, off the request path. The full build\n // parses ~all EN docs and validates every MDX body — multiple seconds on a\n // large project. Without this, that cost is scheduled by the *first* request\n // and, running synchronously on the event loop, blocks whichever request\n // arrives next (observed: a ~4s stall on the second navigation). Priming it\n // here means the build has usually finished before the first click, so\n // navigations are warm. Fire-and-forget: `studioCache.get()` returns the\n // placeholder immediately and schedules the real build via its own\n // scheduler, which also calls `type.list()` for every type and so warms all\n // loaders. Errors surface through the cache's `onError`.\n try {\n studioCache.get();\n } catch (err) {\n console.error(\"[scribe:studio] boot warm-up failed:\", err);\n }\n });\n}\n"]}