scribe-cms 0.0.16 → 0.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/dist/cli/index.cjs +4139 -542
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +4137 -540
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +1512 -232
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1497 -231
- package/dist/index.js.map +1 -1
- package/dist/runtime.cjs +435 -33
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +434 -32
- package/dist/runtime.js.map +1 -1
- package/dist/src/config/resolve-config.d.ts.map +1 -1
- package/dist/src/core/builtin-fields.d.ts +10 -1
- package/dist/src/core/builtin-fields.d.ts.map +1 -1
- package/dist/src/core/field.d.ts +70 -0
- package/dist/src/core/field.d.ts.map +1 -1
- package/dist/src/core/introspect-schema.d.ts +31 -1
- package/dist/src/core/introspect-schema.d.ts.map +1 -1
- package/dist/src/core/managed-roots.d.ts +15 -0
- package/dist/src/core/managed-roots.d.ts.map +1 -0
- package/dist/src/core/types.d.ts +56 -4
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/create-project.d.ts +11 -1
- package/dist/src/create-project.d.ts.map +1 -1
- package/dist/src/create-scribe.d.ts.map +1 -1
- package/dist/src/delete/execute.d.ts +21 -0
- package/dist/src/delete/execute.d.ts.map +1 -0
- package/dist/src/delete/plan.d.ts +85 -0
- package/dist/src/delete/plan.d.ts.map +1 -0
- package/dist/src/delete/render-text.d.ts +7 -0
- package/dist/src/delete/render-text.d.ts.map +1 -0
- package/dist/src/hash/page-hash.d.ts +9 -0
- package/dist/src/hash/page-hash.d.ts.map +1 -1
- package/dist/src/index.d.ts +12 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/inline/resolve-tokens.d.ts +31 -0
- package/dist/src/inline/resolve-tokens.d.ts.map +1 -0
- package/dist/src/inline/tokens.d.ts +95 -0
- package/dist/src/inline/tokens.d.ts.map +1 -0
- package/dist/src/loader/create-loader.d.ts +7 -1
- package/dist/src/loader/create-loader.d.ts.map +1 -1
- package/dist/src/loader/resolve-assets.d.ts +16 -0
- package/dist/src/loader/resolve-assets.d.ts.map +1 -0
- package/dist/src/runtime.d.ts +1 -1
- package/dist/src/runtime.d.ts.map +1 -1
- package/dist/src/storage/translations.d.ts +16 -0
- package/dist/src/storage/translations.d.ts.map +1 -1
- package/dist/src/translate/resolve-translate-config.d.ts.map +1 -1
- package/dist/src/translate/response-schema.d.ts +7 -1
- package/dist/src/translate/response-schema.d.ts.map +1 -1
- package/dist/src/translate/translate-core.d.ts +6 -0
- package/dist/src/translate/translate-core.d.ts.map +1 -1
- package/dist/src/translate/validate-translation.d.ts.map +1 -1
- package/dist/src/translate/worklist.d.ts +12 -2
- package/dist/src/translate/worklist.d.ts.map +1 -1
- package/dist/src/validate/validate-assets.d.ts +26 -2
- package/dist/src/validate/validate-assets.d.ts.map +1 -1
- package/dist/src/validate/validate-inline-tokens.d.ts +10 -0
- package/dist/src/validate/validate-inline-tokens.d.ts.map +1 -0
- package/dist/src/validate/validate-project.d.ts.map +1 -1
- package/dist/src/validate/validate-relations.d.ts +2 -1
- package/dist/src/validate/validate-relations.d.ts.map +1 -1
- package/dist/studio/asset-serve.d.ts +39 -0
- package/dist/studio/asset-serve.d.ts.map +1 -0
- package/dist/studio/asset-views.d.ts +4 -0
- package/dist/studio/asset-views.d.ts.map +1 -0
- package/dist/studio/content-views.d.ts +85 -0
- package/dist/studio/content-views.d.ts.map +1 -0
- package/dist/studio/introspect-fields.d.ts +111 -0
- package/dist/studio/introspect-fields.d.ts.map +1 -0
- package/dist/studio/mdx-preview.d.ts +3 -0
- package/dist/studio/mdx-preview.d.ts.map +1 -0
- package/dist/studio/preview-tokens.d.ts +16 -0
- package/dist/studio/preview-tokens.d.ts.map +1 -0
- package/dist/studio/search.d.ts +34 -0
- package/dist/studio/search.d.ts.map +1 -0
- package/dist/studio/server.cjs +4806 -281
- package/dist/studio/server.cjs.map +1 -1
- package/dist/studio/server.d.ts.map +1 -1
- package/dist/studio/server.js +4804 -279
- package/dist/studio/server.js.map +1 -1
- package/dist/studio/shared.d.ts +20 -0
- package/dist/studio/shared.d.ts.map +1 -0
- package/dist/studio/studio-cache.d.ts +93 -0
- package/dist/studio/studio-cache.d.ts.map +1 -0
- package/package.json +2 -2
package/dist/cli/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../node_modules/tsup/assets/cjs_shims.js","../../src/storage/sqlite.ts","../../cli/index.ts","../../src/index.ts","../../src/core/field.ts","../../src/core/types.ts","../../src/create-scribe.ts","../../src/config/resolve-config.ts","../../src/i18n/build-url.ts","../../src/create-project.ts","../../src/core/introspect-schema.ts","../../src/loader/create-loader.ts","../../src/core/builtin-fields.ts","../../src/storage/translations.ts","../../src/translate/validate-mdx-body.ts","../../src/translate/normalize-mdx-body.ts","../../src/translate/sanitize-mdx-jsx.ts","../../src/loader/normalize-en.ts","../../src/i18n/resolve-document.ts","../../src/sitemap/generate-sitemap.ts","../../src/redirects/build-redirects.ts","../../src/core/alias-helpers.ts","../../src/i18n/translation-index.ts","../../src/redirects/build-json-redirects.ts","../../src/redirects/load-type-redirects.ts","../../src/redirects/redirect-schema.ts","../../src/sitemap/join-base-url.ts","../../src/config/load-config.ts","../../src/validate/validate-project.ts","../../src/validate/validate-redirects.ts","../../src/validate/validate-relations.ts","../../src/validate/validate-assets.ts","../../src/validate/validate-slug-suffix.ts","../../src/core/localized-slug.ts","../../src/translate/worklist.ts","../../src/hash/page-hash.ts","../../src/translate/page-translator.ts","../../src/storage/batch-jobs.ts","../../src/translate/batch-worklist.ts","../../src/history/record-snapshot.ts","../../src/translate/gemini-batch.ts","../../src/translate/retry.ts","../../src/translate/gemini-client.ts","../../src/translate/gemini-models.ts","../../src/translate/translate-core.ts","../../src/translate/gemini-pricing.ts","../../src/translate/prompts/translation-prompt.ts","../../src/translate/response-schema.ts","../../src/translate/resolve-translate-config.ts","../../src/translate/validate-translation.ts","../../src/export/build-static-raw-exports.ts","../../src/loader/parse-mdx.ts","../../src/export/write-static-raw-exports.ts","../../src/config/load-env.ts","../../studio/server.ts","../../cli/prompt-translate.ts","../../cli/translate-progress.ts","../../src/version.ts"],"names":["fs","path","Database","prefix","z","field","valStart","unified","remarkParse","remarkMdx","matter","document","jiti","createJiti","listEnSlugs","createHash","ApiError","sleep","GoogleGenAI","ThinkingLevel","results","totals","dotenv","Hono","serve","CancelPromptError","select","checkbox","isInteractive","fileURLToPath","reporter","openStore"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAKM,gBAAA,EAOO,aAAA;AAZb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6CAAA,GAAA;AAKA,IAAM,gBAAA,GAAmB,MACvB,OAAO,QAAA,KAAa,WAAA,GAChB,IAAI,GAAA,CAAI,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAE,CAAA,CAAE,IAAA,GAC7B,QAAA,CAAS,aAAA,IAAiB,QAAA,CAAS,aAAA,CAAc,OAAA,CAAQ,WAAA,EAAY,KAAM,QAAA,GAC1E,QAAA,CAAS,aAAA,CAAc,GAAA,GACvB,IAAI,GAAA,CAAI,SAAA,EAAW,QAAA,CAAS,OAAO,CAAA,CAAE,IAAA;AAEtC,IAAM,gCAAgC,gBAAA,EAAiB;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACZ9D,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAmFO,SAAS,iBAAiB,MAAA,EAA8B;AAC7D,EAAA,OAAO,MAAA,CAAO,SAAA;AAChB;AAGO,SAAS,SAAA,CAAU,MAAA,EAAsB,IAAA,GAAmB,WAAA,EAAgC;AACjG,EAAA,MAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AACzC,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAAA,oBAAA,CAAG,SAAA,CAAUC,uBAAK,OAAA,CAAQ,SAAS,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,EAAA,GAAK,IAAIC,yBAAA,CAAS,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,KAAS,YAAY,CAAA;AACpE,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,kBAAA,CACP,EAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACM;AACN,EAAA,MAAM,UAAU,EAAA,CAAG,OAAA,CAAQ,qBAAqB,KAAK,CAAA,CAAA,CAAG,EAAE,GAAA,EAAI;AAC9D,EAAA,IAAI,CAAC,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,EAAG;AAC3C,IAAA,EAAA,CAAG,KAAK,CAAA,YAAA,EAAe,KAAK,eAAe,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE,CAAA;AAAA,EAChE;AACF;AAEA,SAAS,kBAAkB,EAAA,EAA+B;AACxD,EAAA,MAAM,SAAA,GAAY,EAAA,CACf,OAAA,CAAQ,CAAA,qEAAA,CAAuE,EAC/E,GAAA,EAAI;AACP,EAAA,IAAI,CAAC,WAAW,OAAO,CAAA;AACvB,EAAA,MAAM,GAAA,GAAM,EAAA,CAAG,OAAA,CAAQ,CAAA,mDAAA,CAAqD,EAAE,GAAA,EAAI;AAGlF,EAAA,OAAO,MAAM,MAAA,CAAO,QAAA,CAAS,IAAI,KAAA,EAAO,EAAE,KAAK,CAAA,GAAI,CAAA;AACrD;AAEA,SAAS,QAAQ,EAAA,EAA6B;AAC5C,EAAA,MAAM,eAAA,GAAkB,kBAAkB,EAAE,CAAA;AAE5C,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,EAAA,CAAG,KAAK,GAAG,CAAA;AAAA,EACb;AAEA,EAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,IAAA,EAAA,CAAG,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAAA,EAC1C;AAEA,EAAA,kBAAA,CAAmB,EAAA,EAAI,cAAA,EAAgB,aAAA,EAAe,SAAS,CAAA;AAE/D,EAAA,EAAA,CAAG,OAAA;AAAA,IACD,CAAA;AAAA,0DAAA;AAAA,GAEF,CAAE,GAAA,CAAI,MAAA,CAAO,cAAc,CAAC,CAAA;AAC9B;AAEO,SAAS,WAAW,EAAA,EAA6B;AACtD,EAAA,EAAA,CAAG,KAAA,EAAM;AACX;AAhJA,IAKM,cAAA,EAEA,UAAA;AAPN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAAA,IAAA,cAAA,EAAA;AAKA,IAAM,cAAA,GAAiB,CAAA;AAEvB,IAAM,UAAA,GAAuB;AAAA,MAC3B,CAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAAA,MAIA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAAA,MAYA,CAAA;AAAA,yCAAA,CAAA;AAAA,MAEA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAAA,MAOA,CAAA;AAAA,oDAAA,CAAA;AAAA,MAEA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAAA,MAQA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAAA,MAUA,CAAA;AAAA,2DAAA,CAAA;AAAA,MAEA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAAA,MASA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAAA;AAAA,MAYA,CAAA;AAAA,sCAAA;AAAA,KAEF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9EA,cAAA,EAAA;;;ACAA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAGA,IAAM,UAAA,mBAAa,MAAA,CAAO,GAAA,CAAI,2BAA2B,CAAA;AACzD,IAAM,aAAA,mBAAgB,MAAA,CAAO,GAAA,CAAI,8BAA8B,CAAA;AAkCxD,SAAS,aAAa,MAAA,EAAmC;AAC9D,EAAA,MAAM,MAAA,GAAS,MAAA;AACf,EAAA,OAAO,MAAA,CAAO,UAAU,CAAA,IAAK,YAAA;AAC/B;AAGO,SAAS,kBAAkB,MAAA,EAA6C;AAC7E,EAAA,IAAI,OAAA,GAA0B,MAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,MAAA,GAAS,OAAA;AAMf,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAA,OAAO,OAAO,aAAa,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,OAAO,MAAA,CAAO,MAAA,KAAW,UAAA,EAAY;AACvC,MAAA,OAAA,GAAU,OAAO,MAAA,EAAO;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,MAAA,CAAO,aAAA,KAAkB,UAAA,EAAY;AAC9C,MAAA,OAAA,GAAU,OAAO,aAAA,EAAc;AAC/B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,MAAM,SAAA,EAAW;AAC1B,MAAA,OAAA,GAAU,OAAO,IAAA,CAAK,SAAA;AACtB,MAAA;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAsHO,SAAS,qBAAqB,MAAA,EAAwC;AAC3E,EAAA,IAAI,OAAA,GAA0B,MAAA;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,IAAA,GAAQ,QAA0D,IAAA,EAAM,IAAA;AAC9E,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,UAAA,EAAY;AAC9C,MAAA,OAAA,GAAW,QAA4C,MAAA,EAAO;AAC9D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,OAAA,GAAW,QAA2C,aAAA,EAAc;AACpE,MAAA;AAAA,IACF;AACA,IAAA;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;AC5MA,cAAA,EAAA;;;ACAA,cAAA,EAAA;;;ACAA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAEA,IAAM,gBAAA,GAAmB,QAAA;AAGlB,SAAS,eAAe,IAAA,EAAgD;AAC7E,EAAA,OAAO,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,KAAK,MAAA,GAAS,CAAA;AAC7D;AAGO,SAAS,uBAAA,CAAwBD,QAAc,MAAA,EAAsB;AAC1E,EAAA,IAAI,CAACA,MAAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAM,CAAA,gCAAA,EAAmCA,MAAI,CAAA,EAAA,CAAI,CAAA;AAAA,EACpF;AACA,EAAA,MAAM,SAASA,MAAAA,CAAK,KAAA,CAAM,WAAW,CAAA,IAAK,EAAC,EAAG,MAAA;AAC9C,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,cAAA,EAAiB,MAAM,CAAA,8CAAA,EAAiDA,MAAI,CAAA,EAAA;AAAA,KAC9E;AAAA,EACF;AACF;AAGO,SAAS,WAAW,QAAA,EAA0B;AACnD,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,gBAAgB,CAAA;AAC7C,EAAA,IAAI,QAAQ,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,QAAQ,CAAA,CAAE,CAAA;AACrF,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAC9B;AAGO,SAAS,WAAW,QAAA,EAA0B;AACnD,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,OAAA,CAAQ,gBAAgB,CAAA;AAC7C,EAAA,IAAI,QAAQ,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,QAAQ,CAAA,CAAE,CAAA;AACrF,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,GAAA,GAAM,gBAAA,CAAiB,MAAM,CAAA;AACrD;AAEA,SAAS,2BAAA,GAAmD;AAC1D,EAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,mBAAA,EAAqB,KAAA,EAAM;AAC/D;AAEA,SAAS,mBAAmB,QAAA,EAAwD;AAClF,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA;AAC9B,EAAA,IAAI,MAAM,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,QAAQ,EAAA,EAAG;AAC5C,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,MAAA,EAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAE;AACrE;AAeO,SAAS,iBAAiB,MAAA,EAAuF;AACtH,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,2BAAA,EAA4B;AAC1E,EAAA,MAAM,gBAAgB,MAAA,CAAO,aAAA;AAC7B,EAAA,MAAM,eAAA,GACJ,aAAA,CAAc,QAAA,KAAa,aAAA,GACvB,aAAA,CAAc,sBACZ,CAAC,GAAG,MAAA,CAAO,OAAO,CAAA,GAClB,MAAA,CAAO,QAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,KAAW,aAAa,CAAA,GAC5D,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,KAAW,aAAa,CAAA;AAEhE,EAAA,SAAS,iBAAA,CAAkB,UAAkB,MAAA,EAAwB;AACnE,IAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,MAAA,IAAI,aAAA,CAAc,QAAA,KAAa,aAAA,IAAiB,aAAA,CAAc,mBAAA,EAAqB;AACjF,QAAA,OAAO,CAAA,CAAA,EAAI,aAAa,CAAA,EAAG,QAAQ,CAAA,CAAA;AAAA,MACrC;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,aAAA,CAAc,aAAa,cAAA,EAAgB;AAC7C,MAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO,GAAI,mBAAmB,QAAQ,CAAA;AAC9D,MAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAgB,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,MAAM,CAAA;AACpF,MAAA,MAAA,CAAO,GAAA,CAAI,aAAA,CAAc,KAAA,EAAO,MAAM,CAAA;AACtC,MAAA,MAAM,EAAA,GAAK,OAAO,QAAA,EAAS;AAC3B,MAAA,OAAO,EAAA,GAAK,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,IAAA;AAAA,IAChC;AAEA,IAAA,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,EAAG,QAAQ,CAAA,CAAA;AAAA,EAC9B;AAEA,EAAA,SAAS,WAAA,CAAY,QAAA,EAAkB,IAAA,EAAc,MAAA,EAAwB;AAC3E,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,gBAAA,EAAkB,IAAI,CAAA;AACxD,IAAA,OAAO,iBAAA,CAAkB,UAAU,MAAM,CAAA;AAAA,EAC3C;AAEA,EAAA,SAAS,2BAAA,CAA4B,UAAkB,YAAA,EAAqC;AAC1F,IAAA,IAAI,QAAA,GAAW,YAAA;AACf,IAAA,IAAI,aAAA,CAAc,aAAa,cAAA,EAAgB;AAC7C,MAAA,QAAA,GAAW,kBAAA,CAAmB,YAAY,CAAA,CAAE,QAAA;AAAA,IAC9C,CAAA,MAAA,IAAW,aAAA,CAAc,QAAA,KAAa,aAAA,EAAe;AACnD,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,QAAA,IAAI,MAAA,KAAW,aAAA,IAAiB,CAAC,aAAA,CAAc,mBAAA,EAAqB;AACpE,QAAA,MAAME,OAAAA,GAAS,IAAI,MAAM,CAAA,CAAA;AACzB,QAAA,IAAI,aAAaA,OAAAA,IAAU,QAAA,CAAS,WAAW,CAAA,EAAGA,OAAM,GAAG,CAAA,EAAG;AAC5D,UAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAMA,OAAAA,CAAO,MAAM,CAAA,IAAK,GAAA;AAC5C,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA;AAClC,IAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,MAAM,GAAG,OAAO,IAAA;AACzC,IAAA,IAAI,UAAU,CAAC,QAAA,CAAS,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AACjD,IAAA,MAAM,UAAU,MAAA,GAAS,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,SAAS,QAAA,CAAS,MAAA;AACpE,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,QAAQ,OAAO,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,IAAA,GAAO,IAAA;AAAA,EAClC;AAEA,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,aAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,2BAAA;AAAA,IACA;AAAA,GACF;AACF;;;ADrHA,IAAM,QAAA,mBAAW,MAAA,CAAO,GAAA,CAAI,gCAAgC,CAAA;AAGrD,SAAS,iBAAiB,MAAA,EAAyC;AACxE,EAAA,OACE,OAAO,MAAA,KAAW,QAAA,IAClB,WAAW,IAAA,IACV,MAAA,CAAmC,QAAQ,CAAA,KAAM,IAAA;AAEtD;AAUO,SAAS,aAAA,CACd,OACA,OAAA,EACc;AACd,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG,OAAO,KAAA;AACpC,EAAA,MAAM,GAAA,GAAM,KAAA;AAEZ,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,EACtD;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC5C,IAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,EACpE;AACA,EAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,IAAiB,IAAA;AAC3C,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AACxC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,iCAAiC,aAAa,CAAA,qBAAA,EAAwB,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,KAC9F;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAI,aAAA,IAAiB;AAAA,IACzC,QAAA,EAAU,aAAA;AAAA,IACV,mBAAA,EAAqB;AAAA,GACvB;AACA,EAAA,IAAI,aAAA,CAAc,QAAA,KAAa,cAAA,IAAkB,CAAC,cAAc,KAAA,EAAO;AACrE,IAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,EACrF;AAEA,EAAA,MAAM,eAAA,GACJ,IAAI,eAAA,KAAoB,KAAA,GACpB,EAAC,GACD,qBAAA,CAAsB,GAAA,CAAI,OAAA,EAAS,aAAa,CAAA;AAEtD,EAAA,MAAM,WAAA,GAAcF,uBAAK,OAAA,CAAQ,OAAA,IAAW,QAAQ,GAAA,EAAI,EAAG,IAAI,OAAO,CAAA;AACtE,EAAA,MAAM,cAAcA,sBAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,GAAA,CAAI,cAAc,SAAS,CAAA;AACzE,EAAA,MAAM,YAAYA,sBAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,GAAA,CAAI,SAAS,sBAAsB,CAAA;AAC/E,EAAA,MAAM,UAAA,GAAa,IAAI,SAAA,GAAYA,sBAAA,CAAK,QAAQ,WAAA,EAAa,GAAA,CAAI,SAAS,CAAA,GAAI,MAAA;AAE9E,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,KAAA,GAA6B,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACzD,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0CAAA,EAA6C,IAAA,CAAK,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IACzE;AACA,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,EAAE,CAAA;AACnB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,uBAAA,CAAwB,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,EAAE,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,EAAA;AAAA,MACpC,KAAA,EAAO,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,EAAA,CAAG,MAAM,CAAC,CAAA;AAAA,MACtE,YAAA,EAAc,KAAK,YAAA,IAAgB,OAAA;AAAA,MACnC,aAAA,EAAe,IAAA,CAAK,aAAA,KAAkB,IAAA,CAAK,OAAO,IAAA,GAAO,MAAA;AAAA,KAC3D;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,MAAA,GAAuB;AAAA,IAC3B,OAAA,EAAS,WAAA;AAAA,IACT,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,EAAS,CAAC,GAAG,GAAA,CAAI,OAAO,CAAA;AAAA,IACxB,aAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAe,GAAA,CAAI,aAAA;AAAA,IACnB,eAAA;AAAA,IACA,WAAW,GAAA,CAAI,SAAA;AAAA,IACf;AAAA,GACF;AACA,EAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,QAAA,EAAU;AAAA,IACtC,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY;AAAA,GACb,CAAA;AACD,EAAA,OAAO,MAAA;AACT;AAUA,SAAS,qBAAA,CACP,SACA,aAAA,EACiB;AACjB,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,WAAA,EAAY,EAAG,CAAC,CAAC,CAAC,CAAA;AACpE,EAAA,MAAM,YAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACxB,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,IAAS,MAAM,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,GAAA,IAAO,GAAG,GAAA,EAAA,EAAO;AAClD,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,WAAA,EAAa,CAAA;AAC5E,MAAA,IAAI,MAAA,IAAU,MAAA,KAAW,MAAA,IAAU,MAAA,KAAW,aAAA,EAAe;AAC3D,QAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,MACnB;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,SAAA,CAAU,MAAM,CAAA,GAAI,KAAA;AAAA,IACtB;AAAA,EACF;AACA,EAAA,OAAO,SAAA;AACT;;;AEpIA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAWA,SAAS,gBAAgB,MAAA,EAA2C;AAClE,EAAA,IACE,kBAAkB,MAAA,IAClB,SAAA,IAAa,UACZ,MAAA,CAAuD,IAAA,EAAM,SAAS,OAAA,EACvE;AACA,IAAA,OAAQ,MAAA,CAAoC,OAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,gBAAA,CAAiB,MAAA,EAAsB,MAAA,GAAmB,EAAC,EAAsB;AAC/F,EAAA,MAAM,QAAA,GAAW,kBAAkB,MAAM,CAAA;AACzC,EAAA,IAAI,QAAA,IAAY,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,gBAAgB,QAAA,CAAS,MAAA;AAAA,QACzB,kBAAkB,QAAA,CAAS,QAAA;AAAA,QAC3B,kBAAkB,QAAA,CAAS;AAAA;AAC7B,KACF;AAAA,EACF;AAIA,EAAA,IAAI,OAAO,MAAA,GAAS,CAAA,IAAK,YAAA,CAAa,MAAM,MAAM,cAAA,EAAgB;AAChE,IAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,gBAAgB,CAAA;AAAA,EAChD;AAEA,EAAA,MAAM,IAAA,GAAO,qBAAqB,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,YAAgB,MAAA,IAAU,OAAA,IAAW,IAAA,EAAM;AAC7C,IAAA,MAAM,QAAS,IAAA,CAAoC,KAAA;AACnD,IAAA,MAAM,SAA4B,EAAC;AACnC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,gBAAA,CAAiB,KAAA,EAAuB,CAAC,GAAG,MAAA,EAAQ,GAAG,CAAC,CAAC,CAAA;AAAA,IAC1E;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,gBAAgB,IAAI,CAAA;AACpC,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,WAAA,GAAc,qBAAqB,OAAO,CAAA;AAChD,IAAA,IAAI,WAAA,YAAuB,MAAA,IAAU,OAAA,IAAW,WAAA,EAAa;AAC3D,MAAA,MAAM,QAAS,WAAA,CAA2C,KAAA;AAC1D,MAAA,MAAM,SAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,gBAAA,CAAiB,KAAA,EAAuB,CAAC,GAAG,MAAA,EAAQ,GAAA,EAAK,GAAG,CAAC,CAAC,CAAA;AAAA,MAC/E;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAM,YAAA,CAAa,MAAM,GAAG,CAAA;AACtD;AAOA,SAAS,cAAc,KAAA,EAA6B;AAClD,EAAA,MAAM,OAAiB,EAAE,IAAA,EAAM,OAAO,QAAA,kBAAU,IAAI,KAAI,EAAE;AAC1D,EAAA,KAAA,MAAWA,UAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,GAAO,IAAA;AACX,IAAA,KAAA,MAAW,WAAWA,MAAAA,EAAM;AAC1B,MAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACrC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,KAAA,GAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA,kBAAU,IAAI,KAAI,EAAE;AAC3C,QAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAAA,MAClC;AACA,MAAA,IAAA,GAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,MAAe,IAAA,EAAyB;AAC3D,EAAA,IAAI,IAAA,CAAK,MAAM,OAAO,IAAA;AAEtB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAClC,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,GAAG,OAAO,MAAA;AAEjC,IAAA,OAAO,IAAA,CAAK,GAAA;AAAA,MAAI,CAAC,IAAA,KACf,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,IAAA,GAAQ,WAAA,CAAY,IAAA,EAAM,IAAI,CAAA,IAAK,KAAM;AAAC,KACjF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,KAAS,QAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAO,MAAA;AAC7E,EAAA,MAAM,MAAA,GAAS,IAAA;AACf,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,GAAA,GAAM,KAAA;AACV,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,KAAK,QAAA,EAAU;AACxC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,MAAA,CAAO,GAAG,GAAG,KAAK,CAAA;AAC5C,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AACX,MAAA,GAAA,GAAM,IAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,OAAO,MAAM,GAAA,GAAM,MAAA;AACrB;AAEO,SAAS,cAAA,CACd,MACA,KAAA,EACyB;AACzB,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAChC,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,IAAA,EAAM,aAAA,CAAc,KAAK,CAAC,CAAA;AACxD,EAAA,OAAO,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,SAAS,CAAA,GACxE,SAAA,GACD,EAAC;AACP;AAGO,SAAS,gBAAA,CAAiB,MAA+B,MAAA,EAA+C;AAC7G,EAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,MAAM,CAAA,CAC9C,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,cAAc,CAAA,CACvC,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpB,EAAA,OAAO,cAAA,CAAe,MAAM,iBAAiB,CAAA;AAC/C;AAGO,SAAS,cAAA,CAAe,MAA+B,MAAA,EAA+C;AAC3G,EAAA,MAAM,kBAAkB,gBAAA,CAAiB,MAAM,EAC5C,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,SAAS,UAAU,CAAA,CAC9D,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AACpB,EAAA,OAAO,cAAA,CAAe,MAAM,eAAe,CAAA;AAC7C;AAGO,SAAS,yBAAA,CACd,UAAA,EACA,MAAA,EACA,MAAA,EACyB;AACzB,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,MAAA,EAAQ,MAAM,CAAA;AAChD,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,UAAA,EAAY,MAAM,CAAA;AACxD,EAAA,OAAO,SAAA,CAAU,YAAY,YAAY,CAAA;AAC3C;AAEA,SAAS,SAAA,CAAU,MAA+B,OAAA,EAA2D;AAC3G,EAAA,MAAM,GAAA,GAA+B,EAAE,GAAG,IAAA,EAAK;AAC/C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,IACE,KAAA,IACA,OAAO,KAAA,KAAU,QAAA,IACjB,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IACpB,GAAA,CAAI,GAAG,KACP,OAAO,GAAA,CAAI,GAAG,CAAA,KAAM,QAAA,IACpB,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAC,CAAA,EACvB;AACA,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,GAAG,GAA8B,KAAgC,CAAA;AAAA,IAC5F,CAAA,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,MAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG;AAC1D,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,iBAAA,CAAkB,GAAA,CAAI,GAAG,GAAgB,KAAkB,CAAA;AAAA,IACxE,CAAA,MAAO;AACL,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,MAAiB,OAAA,EAA+B;AACzE,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AAC/B,IAAA,MAAM,WAAA,GAAc,QAAQ,KAAK,CAAA;AACjC,IAAA,IACE,QACA,OAAO,IAAA,KAAS,QAAA,IAChB,CAAC,MAAM,OAAA,CAAQ,IAAI,CAAA,IACnB,WAAA,IACA,OAAO,WAAA,KAAgB,QAAA,IACvB,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAC1B;AACA,MAAA,OAAO,SAAA,CAAU,MAAiC,WAAsC,CAAA;AAAA,IAC1F;AACA,IAAA,OAAO,WAAA,IAAe,IAAA;AAAA,EACxB,CAAC,CAAA;AACH;AAGO,SAAS,mBAAmB,MAAA,EAAyC;AAC1E,EAAA,OAAO,gBAAA,CAAiB,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AACrE;;;AC1MA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAIO,IAAM,YAAA,GAAe,4BAAA;AAErB,IAAM,oBAAoBG,KAAAA,CAC9B,MAAA,EAAO,CACP,KAAA,CAAM,cAAc,mCAAmC,CAAA;AAEnD,IAAM,gBAAgBA,KAAAA,CAC1B,MAAA,EAAO,CACP,KAAA,CAAM,qCAAqC,0CAA0C,CAAA;AAExF,IAAM,sBAAsBA,KAAAA,CAAE,MAAA,EAAO,CAAE,KAAA,CAAM,OAAO,iCAAiC,CAAA;AAgBrF,IAAM,mBAAA,GAA+C;AAAA,EACnD,CAAC,eAAe,mEAAmE,CAAA;AAAA,EACnF,CAAC,aAAa,iEAAiE,CAAA;AAAA,EAC/E,CAAC,WAAW,+DAA+D,CAAA;AAAA,EAC3E,CAAC,iBAAiB,qEAAqE,CAAA;AAAA,EACvF,CAAC,WAAW,oDAAoD,CAAA;AAAA,EAChE,CAAC,eAAe,wDAAwD,CAAA;AAAA,EACxE,CAAC,iBAAiB,2DAA2D,CAAA;AAAA,EAC7E,CAAC,UAAU,oDAAoD;AACjE,CAAA;AAEA,IAAM,0BAAA,GAAsD;AAAA,EAC1D;AAAA,IACE,SAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,aAAA;AAAA,IACA;AAAA;AAEJ,CAAA;AAGO,SAAS,sBAAA,CACd,IAAA,EACA,aAAA,EACA,OAAA,EACA,cAAA,EAKA;AACA,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,IAAA,EAAK;AAEvB,EAAA,KAAA,MAAW,CAACC,MAAAA,EAAO,OAAO,CAAA,IAAK,0BAAA,EAA4B;AACzD,IAAA,IAAI,IAAA,CAAKA,MAAK,CAAA,KAAM,MAAA,EAAW;AAC7B,MAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAAA,QAAO,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAC9C,MAAA,OAAO,KAAKA,MAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,IAAA,CAAK,gBAAgB,MAAA,IAAa,IAAA,CAAK,gBAAgB,IAAA,IAAQ,IAAA,CAAK,gBAAgB,EAAA,EAAI;AAC1F,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,SAAA,CAAU,IAAA,CAAK,WAAW,CAAA;AACvD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,WAAA,GAAc,MAAA,CAAO,IAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ;AACvC,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,aAAA,EAAe,SAAS,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,MAC9E;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAEA,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,IAAA,CAAK,cAAc,MAAA,IAAa,IAAA,CAAK,cAAc,IAAA,IAAQ,IAAA,CAAK,cAAc,EAAA,EAAI;AACpF,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AACrD,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,SAAA,GAAY,MAAA,CAAO,IAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ;AACvC,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,WAAA,EAAa,SAAS,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,MAC5E;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd,WAAW,WAAA,EAAa;AACtB,IAAA,SAAA,GAAY,WAAA;AAAA,EACd;AAEA,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,IAAA,CAAK,YAAY,MAAA,IAAa,IAAA,CAAK,YAAY,IAAA,IAAQ,IAAA,CAAK,YAAY,EAAA,EAAI;AAC9E,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,SAAA,EAAW;AACrC,MAAA,OAAA,GAAU,IAAA,CAAK,OAAA;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,2BAAA,EAA6B,KAAA,EAAO,SAAS,CAAA;AAAA,IACxF;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAEA,EAAA,IAAI,qBAAA;AACJ,EAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,IAAa,IAAA,CAAK,kBAAkB,IAAA,IAAQ,IAAA,CAAK,kBAAkB,EAAA,EAAI;AAChG,IAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,IAAA,CAAK,aAAa,CAAA;AAC/D,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,qBAAA,GAAwB,MAAA,CAAO,IAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ;AACvC,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,KAAA,EAAO,eAAA,EAAiB,SAAS,KAAA,CAAM,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,MAChF;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAEA,EAAA,KAAA,MAAW,WAAA,IAAe,CAAC,eAAA,EAAiB,QAAQ,CAAA,EAAY;AAC9D,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,KAAM,MAAA,EAAW;AACnC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,WAAA;AAAA,QACP,OAAA,EAAS,GAAG,WAAW,CAAA,yDAAA,CAAA;AAAA,QACvB,KAAA,EAAO;AAAA,OACR,CAAA;AACD,MAAA,OAAO,KAAK,WAAW,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,WAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,IAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,4BAA4B,IAAA,EAAoD;AAC9F,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,mBAAA,EAAqB;AAChD,IAAA,IAAI,IAAA,CAAK,GAAG,CAAA,KAAM,MAAA,EAAW;AAC3B,MAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,KAAK,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAAA,IACrD;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAcO,SAAS,wBAAA,CACd,IAAA,EACA,GAAA,EACA,aAAA,EACA,aAAA,EACQ;AACR,EAAA,MAAM,aAAa,gBAAA,CAAiB;AAAA,IAClC,OAAA,EAAS,CAAC,aAAA,EAAe,GAAI,GAAA,CAAI,MAAA,KAAW,aAAA,GAAgB,CAAC,GAAA,CAAI,MAAM,CAAA,GAAI,EAAG,CAAA;AAAA,IAC9E,aAAA;AAAA,IACA,eAAe,aAAA,IAAiB,EAAE,QAAA,EAAU,aAAA,EAAe,qBAAqB,KAAA;AAAM,GACvF,CAAA;AAED,EAAA,IAAI,IAAI,qBAAA,EAAuB;AAC7B,IAAA,OAAO,UAAA,CAAW,iBAAA,CAAkB,GAAA,CAAI,qBAAA,EAAuB,IAAI,MAAM,CAAA;AAAA,EAC3E;AACA,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,CAAA;AACnC,EAAA,OAAO,WAAW,WAAA,CAAY,IAAA,CAAK,MAAM,GAAA,CAAI,IAAA,EAAM,IAAI,MAAM,CAAA;AAC/D;AAGO,SAAS,4BAAA,CACd,WAAA,EACA,GAAA,EAIA,IAAA,EACA,eACA,aAAA,EACyB;AACzB,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,WAAA,EAAY;AAC7B,EAAA,IAAI,GAAA,CAAI,WAAA,KAAgB,MAAA,EAAW,GAAA,CAAI,cAAc,GAAA,CAAI,WAAA;AACzD,EAAA,IAAI,GAAA,CAAI,SAAA,KAAc,MAAA,EAAW,GAAA,CAAI,YAAY,GAAA,CAAI,SAAA;AACrD,EAAA,GAAA,CAAI,UAAU,GAAA,CAAI,OAAA;AAClB,EAAA,GAAA,CAAI,aAAA,GAAgB,wBAAA,CAAyB,IAAA,EAAM,GAAA,EAAK,eAAe,aAAa,CAAA;AACpF,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,gBAAgB,KAAA,EAG9B;AACA,EAAA,OAAO;AAAA,IACL,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,uBAAuB,KAAA,CAAM;AAAA,GAC/B;AACF;;;ADzMA,WAAA,EAAA;;;AEjBA,cAAA,EAAA;AAmDO,SAAS,qBAAA,CAAsB,IAAuB,KAAA,EAAgC;AAC3F,EAAA,EAAA,CAAG,OAAA;AAAA,IACD,CAAA;AAAA;AAAA,+BAAA;AAAA,GAGF,CAAE,GAAA;AAAA,IACA,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM,MAAA;AAAA,IACN,KAAA,CAAM,MAAA;AAAA,IACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA;AAAA,IAChC,KAAA,CAAM,IAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AAEA,EAAA,MAAM,MAAM,EAAA,CACT,OAAA;AAAA,IACC,CAAA;AAAA,6DAAA;AAAA,IAGD,GAAA,CAAI,KAAA,CAAM,aAAa,KAAA,CAAM,MAAA,EAAQ,MAAM,MAAM,CAAA;AAEpD,EAAA,OAAO,GAAA,CAAI,EAAA;AACb;AAEO,SAAS,aAAA,CACd,IACA,UAAA,EAC2B;AAC3B,EAAA,OAAO,EAAA,CACJ,OAAA,CAAQ,CAAA,uCAAA,CAAyC,CAAA,CACjD,IAAI,UAAU,CAAA;AACnB;AAEO,SAAS,wBAAA,CACd,EAAA,EACA,WAAA,EACA,MAAA,EACyB;AACzB,EAAA,OAAO,EAAA,CACJ,OAAA;AAAA,IACC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA;AAAA,GAMF,CACC,GAAA,CAAI,WAAA,EAAa,MAAM,CAAA;AAC5B;AAEO,SAAS,iBAAA,CAAkB,IAAuB,KAAA,EAA+B;AACtF,EAAA,EAAA,CAAG,OAAA;AAAA,IACD,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAA;AAAA,GAWF,CAAE,GAAA;AAAA,IACA,KAAA,CAAM,WAAA;AAAA,IACN,KAAA,CAAM,MAAA;AAAA,IACN,KAAA,CAAM,MAAA;AAAA,IACN,KAAA,CAAM,IAAA;AAAA,IACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA;AAAA,IAChC,KAAA,CAAM,IAAA;AAAA,IACN,KAAA,CAAM,MAAA;AAAA,IACN,KAAA,CAAM,YAAA;AAAA,IACN,KAAA,CAAM,KAAA;AAAA,IACN,KAAA,CAAM;AAAA,GACR;AACF;AAEO,SAAS,cAAA,CACd,EAAA,EACA,WAAA,EACA,MAAA,EACA,MAAA,EAC4B;AAC5B,EAAA,OAAO,EAAA,CACJ,OAAA;AAAA,IACC,CAAA,gFAAA;AAAA,GACF,CACC,GAAA,CAAI,WAAA,EAAa,MAAA,EAAQ,MAAM,CAAA;AACpC;AAEO,SAAS,uBAAA,CACd,IACA,WAAA,EACkB;AAClB,EAAA,OAAO,EAAA,CACJ,OAAA,CAAQ,CAAA,0EAAA,CAA4E,CAAA,CACpF,IAAI,WAAW,CAAA;AACpB;AAcO,SAAS,yBAAA,CACd,EAAA,EACA,WAAA,EACA,MAAA,EACkB;AAClB,EAAA,OAAO,GACJ,OAAA,CAAQ,CAAA,iFAAA,CAAmF,CAAA,CAC3F,GAAA,CAAI,aAAa,MAAM,CAAA;AAC5B;AAEO,SAAS,qBAAqB,EAAA,EAAyC;AAC5E,EAAA,OAAO,EAAA,CAAG,OAAA,CAAQ,CAAA,iEAAA,CAAmE,CAAA,CAAE,GAAA,EAAI;AAC7F;;;AC9KA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AACA,SAAS,4BAA4B,IAAA,EAAuB;AAC1D,EAAA,OAAO,4BAAA,CAA6B,KAAK,IAAI,CAAA;AAC/C;AAMO,SAAS,2BAA2B,IAAA,EAGzC;AACA,EAAA,IAAI,CAAC,2BAAA,CAA4B,IAAI,CAAA,EAAG;AACtC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA,EACjC;AAEA,EAAA,MAAM,UAAA,GAAa,KAChB,OAAA,CAAQ,SAAA,EAAW,IAAI,CAAA,CACvB,OAAA,CAAQ,QAAQ,IAAI,CAAA,CACpB,QAAQ,MAAA,EAAQ,GAAI,EACpB,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,OAAA,CAAQ,SAAS,IAAI,CAAA;AAExB,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,QAAA,EAAU,eAAe,IAAA,EAAK;AAC3D;;;ACzBA,cAAA,EAAA;AAIO,SAAS,8BAA8B,IAAA,EAG5C;AACA,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,CAAA,GAAI,CAAA;AAER,EAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,IAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,IAAO,CAAC,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AACvD,MAAA,GAAA,IAAO,KAAK,CAAC,CAAA;AACb,MAAA,CAAA,IAAK,CAAA;AACL,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,CAAA;AACjB,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,IAAK,CAAA;AAC7D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,GAAG,CAAC,CAAA;AAE1C,IAAA,IAAI,MAAA,GAAS,IAAI,OAAO,CAAA,CAAA;AACxB,IAAA,IAAI,WAAA,GAAc,KAAA;AAElB,IAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,CAAC,MAAM,GAAA,IAAO,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AAC5D,MAAA,OAAO,CAAA,GAAI,KAAK,MAAA,IAAU,IAAA,CAAK,KAAK,IAAA,CAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAClD,QAAA,MAAA,IAAU,KAAK,CAAC,CAAA;AAChB,QAAA,CAAA,IAAK,CAAA;AAAA,MACP;AACA,MAAA,IAAI,CAAA,IAAK,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,CAAC,MAAM,GAAA,IAAO,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AAE5D,MAAA,MAAM,SAAA,GAAY,CAAA;AAClB,MAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,SAAA,CAAU,IAAA,CAAK,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,IAAK,CAAA;AAC9D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,CAAC,CAAA;AAGxC,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,IAAK,CAAA;AACzD,MAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACnB,QAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,CAAC,CAAA;AACjC,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,CAAC,CAAA;AACjC,MAAA,MAAA,IAAU,GAAA;AACV,MAAA,CAAA,IAAK,CAAA;AAGL,MAAA,MAAM,OAAA,GAAU,CAAA;AAChB,MAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,IAAK,CAAA;AACzD,MAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAC,CAAA;AAE/B,MAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,MAAA,IAAI,KAAA,KAAU,GAAA,IAAO,KAAA,KAAU,GAAA,EAAK;AAGlC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,UAAU,GAAA,EAAK;AACjB,QAAA,MAAMC,YAAW,CAAA,GAAI,CAAA;AACrB,QAAA,CAAA,IAAK,CAAA;AACL,QAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,EAAM;AACpB,YAAA,CAAA,IAAK,CAAA;AACL,YAAA;AAAA,UACF;AACA,UAAA,IAAI,IAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK;AACrB,UAAA,CAAA,IAAK,CAAA;AAAA,QACP;AACA,QAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAMA,SAAAA,GAAW,CAAA,EAAG,IAAI,CAAC,CAAA;AACxC,QAAA,CAAA,IAAK,CAAA;AACL,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,CAAA,GAAI,CAAA;AACrB,MAAA,CAAA,IAAK,CAAA;AAEL,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,KAAA,IAAS,OAAO,QAAA,EAAU,IAAA,GAAO,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA,EAAG;AACvD,QAAA,IAAI,IAAA,CAAK,IAAI,CAAA,KAAM,GAAA,EAAK;AACxB,QAAA,IAAI,IAAI,IAAA,GAAO,CAAA;AACf,QAAA,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,IAAA,CAAK,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG,CAAA,IAAK,CAAA;AACzD,QAAA,IACE,IAAI,IAAA,CAAK,MAAA,KACR,IAAA,CAAK,CAAC,MAAM,GAAA,IAAO,IAAA,CAAK,CAAC,CAAA,KAAM,OAAO,UAAA,CAAW,IAAA,CAAK,KAAK,CAAC,CAAA,IAAK,EAAE,CAAA,CAAA,EACpE;AACA,UAAA,QAAA,GAAW,IAAA;AACX,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,EAAA,EAAI;AACnB,QAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAA,EAAG,CAAC,CAAA;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,QAAA,EAAU,QAAQ,CAAA;AAC3C,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AAE3C,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,KAAK,CAAA;AAChE,QAAA,MAAA,IAAU,IAAI,OAAO,CAAA,CAAA,CAAA;AACrB,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,MAAA,IAAU,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,MACrB;AAEA,MAAA,CAAA,GAAI,QAAA,GAAW,CAAA;AAAA,IACjB;AAEA,IAAA,IAAI,aAAa,QAAA,GAAW,IAAA;AAC5B,IAAA,MAAA,IAAU,IAAA,CAAK,CAAC,CAAA,IAAK,EAAA;AACrB,IAAA,GAAA,IAAO,MAAA;AACP,IAAA,CAAA,IAAK,CAAA;AAAA,EACP;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,EAAK,QAAA,EAAS;AAC/B;;;AFnHA,IAAM,SAASC,eAAA,EAAQ,CAAE,IAAIC,4BAAW,CAAA,CAAE,IAAIC,0BAAS,CAAA;AAEhD,SAAS,yBAAyB,IAAA,EAGvC;AACA,EAAA,MAAM,UAAA,GAAa,2BAA2B,IAAI,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY,6BAAA,CAA8B,UAAA,CAAW,IAAI,CAAA;AAC/D,EAAA,OAAO;AAAA,IACL,MAAM,SAAA,CAAU,IAAA;AAAA,IAChB,QAAA,EAAU,UAAA,CAAW,QAAA,IAAY,SAAA,CAAU;AAAA,GAC7C;AACF;AAEO,SAAS,gBAAgB,IAAA,EAA2D;AACzF,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,MAAM,IAAI,CAAA;AACjB,IAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AAAA,EACpB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,OAAA,EAAQ;AAAA,EACrC;AACF;AAGO,SAAS,6BAA6B,IAAA,EAG3C;AACA,EAAA,MAAM,QAAA,GAAW,yBAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,SAAA,CAAU,KAAK,CAAA,CAAE,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,QAAA;AACT;;;AGzCA,cAAA,EAAA;AAAO,SAAS,uBAAuB,IAAA,EAAwD;AAC7F,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,IAAA,EAAK;AACtB,EAAA,IAAI,CAAC,GAAA,CAAI,WAAA,IAAe,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AACpD,IAAA,GAAA,CAAI,cAAc,GAAA,CAAI,IAAA;AAAA,EACxB;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,IAAa,OAAO,GAAA,CAAI,KAAA,KAAU,QAAA,IAAY,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AAChF,IAAA,GAAA,CAAI,YAAY,GAAA,CAAI,KAAA;AAAA,EACtB;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,IAAa,OAAO,GAAA,CAAI,gBAAgB,QAAA,EAAU;AACzD,IAAA,GAAA,CAAI,YAAY,GAAA,CAAI,WAAA;AAAA,EACtB;AACA,EAAA,OAAO,GAAA;AACT;AAEO,SAAS,yBAAyB,IAAA,EAAuB;AAC9D,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,CAAC,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,KAAA;AAC5D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AAC3B,EAAA,OAAO,KAAA,KAAU,KAAA,CAAM,WAAA,EAAY,IAAK,KAAA,KAAU,GAAA;AACpD;;;ANIA,SAAS,WAAW,IAAA,EAAuB;AACzC,EAAA,OAAO,yBAAyB,IAAI,CAAA;AACtC;AAEA,SAAS,YAAY,UAAA,EAA8B;AACjD,EAAA,IAAI,CAACT,oBAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,SAAU,EAAC;AACxC,EAAA,OAAOA,oBAAAA,CACJ,WAAA,CAAY,UAAU,CAAA,CACtB,OAAO,UAAU,CAAA,CACjB,GAAA,CAAI,CAAC,CAAA,KAAMC,sBAAAA,CAAK,IAAA,CAAK,UAAA,EAAY,CAAC,CAAC,CAAA;AACxC;AAEA,SAAS,aAAa,QAAA,EAA0B;AAC9C,EAAA,OAAOA,uBAAK,QAAA,CAAS,QAAQ,CAAA,CAAE,OAAA,CAAQ,eAAe,EAAE,CAAA;AAC1D;AAOO,SAAS,UAAA,CACd,QAAA,EACA,MAAA,EACA,IAAA,EACe;AACf,EAAA,MAAM,GAAA,GAAMD,oBAAAA,CAAG,YAAA,CAAa,QAAA,EAAU,MAAM,CAAA;AAC5C,EAAA,MAAM,MAAA,GAASU,wBAAO,GAAG,CAAA;AACzB,EAAA,MAAM,IAAA,GAAO,aAAa,QAAQ,CAAA;AAClC,EAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,MAAA,CAAO,IAA+B,CAAA;AAChF,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,eAAc,GAAI,sBAAA;AAAA,IAC/C,UAAA;AAAA,IACA,IAAA,CAAK,IAAA;AAAA,IACL,IAAA;AAAA,IACA,MAAA,CAAO;AAAA,GACT;AACA,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,IAC3C,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,SAAS,KAAA,CAAM,OAAA;AAAA,IACf,OAAO,KAAA,CAAM;AAAA,GACf,CAAE,CAAA;AAEF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AACzC,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ;AAAA,QACN,GAAG,MAAA;AAAA,QACH,GAAG,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,UACrC,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,UAC1B,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,KAAA,EAAO;AAAA,SACT,CAAE;AAAA;AACJ,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,EAAG;AAC3C,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO;AAAA,EAClC;AAEA,EAAA,MAAM,WAAA,GAAc,4BAAA;AAAA,IAClB,MAAA,CAAO,IAAA;AAAA,IACP;AAAA,MACE,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,MAC/B,IAAA;AAAA,MACA,QAAQ,MAAA,CAAO;AAAA,KACjB;AAAA,IACA,IAAA;AAAA,IACA,MAAA,CAAO,aAAA;AAAA,IACP,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,IAAA,EAAqC;AAAA,IACnF,QAAQ,MAAA,CAAO,aAAA;AAAA,IACf,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,IAAA;AAAA,IACA,MAAA,EAAQ,IAAA;AAAA,IACR,cAAc,MAAA,CAAO;AAAA,GACtB,KAAK,EAAC;AACP,EAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAW,CAAA;AAE1B,EAAA,MAAMC,SAAAA,GAA2B;AAAA,IAC/B,IAAA;AAAA,IACA,MAAA,EAAQ,IAAA;AAAA,IACR,QAAQ,MAAA,CAAO,aAAA;AAAA,IACf,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,uBAAuB,OAAA,CAAQ,qBAAA;AAAA,IAC/B,WAAA;AAAA,IACA,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAAA,SAAAA,EAAU,MAAA,EAAO;AAC5B;AAEA,SAAS,4BAAA,CACP,GAAA,EAOA,KAAA,EACA,IAAA,EACA,MAAA,EACgB;AAChB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,gBAAgB,CAAA;AAChD,EAAA,MAAM,SAAS,yBAAA,CAA0B,QAAA,EAAU,KAAA,CAAM,WAAA,EAAa,KAAK,MAAM,CAAA;AACjF,EAAA,MAAM,GAAA,GAAM,gBAAgB,KAAK,CAAA;AACjC,EAAA,MAAM,WAAA,GAAc,4BAAA;AAAA,IAClB,MAAA;AAAA,IACA,EAAE,GAAG,GAAA,EAAK,IAAA,EAAM,IAAI,IAAA,EAAM,MAAA,EAAQ,IAAI,MAAA,EAAO;AAAA,IAC7C,IAAA;AAAA,IACA,MAAA,CAAO,aAAA;AAAA,IACP,MAAA,CAAO;AAAA,GACT;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,QAAQ,GAAA,CAAI,OAAA;AAAA,IACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,aAAa,GAAA,CAAI,WAAA;AAAA,IACjB,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,uBAAuB,GAAA,CAAI,qBAAA;AAAA,IAC3B,WAAA;AAAA,IACA,OAAA,EAAS,wBAAA,CAAyB,GAAA,CAAI,IAAI,CAAA,CAAE;AAAA,GAC9C;AACF;AAEA,IAAM,iBAAA,GAAoB,IAAA;AAEnB,SAAS,mBAAA,CAAoB,QAAsB,IAAA,EAA6C;AACrG,EAAA,IAAI,MAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,SAAA,GAAY,EAAA;AAChB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,MAAM,aAAaV,sBAAAA,CAAK,IAAA;AAAA;AAAA,IAAiC,MAAA,CAAO,OAAA;AAAA,IAAS,IAAA,CAAK;AAAA,GAAU;AACxF,EAAA,MAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA;AAExC,EAAA,SAAS,gBAAA,GAA2B;AAClC,IAAA,MAAM,KAAA,GAAQ,YAAY,UAAU,CAAA;AACpC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,KAAK,GAAA,CAAI,MAAA,EAAQD,qBAAG,QAAA,CAAS,CAAC,EAAE,OAAO,CAAA;AAAA,MAClD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQA,oBAAAA,CAAG,QAAA,CAAS,SAAS,CAAA,CAAE,OAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,GAAG,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,MAAM,IAAI,KAAK,CAAA,CAAA;AAAA,EAC3C;AAEA,EAAA,SAAS,KAAA,GAAsB;AAC7B,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAyB;AACzC,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAA4B;AAEtD,IAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,UAAU,CAAA,EAAG;AAC1C,MAAA,MAAM,EAAE,UAAAW,SAAAA,EAAU,MAAA,KAAW,UAAA,CAAW,IAAA,EAAM,QAAQ,IAAI,CAAA;AAC1D,MAAA,IAAIA,SAAAA,EAAU;AACZ,QAAA,aAAA,CAAc,GAAA,CAAIA,SAAAA,CAAS,IAAA,EAAMA,SAAQ,CAAA;AACzC,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,YAAA,OAAA,CAAQ,IAAA;AAAA,cACN,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA;AAAA,aAC9E;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,CAAA,QAAA,EAAW,IAAA,CAAK,EAAE,CAAA,WAAA,EAAc,IAAI,CAAA;AAAA,CAAA,GAClC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI;AAAA,SAC/D;AAAA,MACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,GAAA,CAAI,OAAO,aAAA,EAAe;AAAA,MAC5B,MAAA,EAAQ,aAAA;AAAA,MACR,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,IAAA,MAAM,IAAA,GAAO,uBAAA,CAAwB,EAAA,EAAI,IAAA,CAAK,EAAE,CAAA;AAChD,IAAA,EAAA,CAAG,KAAA,EAAM;AAET,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAyB;AAClD,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,MAAM,OAAO,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,MAAM,KAAK,EAAC;AAC9C,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAA,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAAA,IACnC;AAEA,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,MAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACrC,MAAA,MAAM,MAAA,uBAAa,GAAA,EAA4B;AAC/C,MAAA,MAAM,QAAA,uBAAe,GAAA,EAA4B;AACjD,MAAA,KAAA,MAAW,OAAO,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,IAAK,EAAC,EAAG;AAChD,QAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,OAAO,CAAA;AAC3C,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,GAAA,GAAM,4BAAA,CAA6B,GAAA,EAAK,KAAA,EAAO,MAAM,MAAM,CAAA;AACjE,QAAA,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AACxB,QAAA,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAAA,MAC/B;AACA,MAAA,GAAA,CAAI,GAAA,CAAI,MAAA,EAAQ,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,GAAA,GAAM,SAAA,GAAY,iBAAA,EAAmB,OAAO,MAAA;AAChD,MAAA,SAAA,GAAY,GAAA;AACZ,MAAA,MAAM,MAAM,gBAAA,EAAiB;AAC7B,MAAA,IAAI,GAAA,KAAQ,WAAW,OAAO,MAAA;AAC9B,MAAA,MAAA,GAAS,KAAA,EAAM;AACf,MAAA,SAAA,GAAY,GAAA;AACZ,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,SAAA,GAAY,KAAK,GAAA,EAAI;AACrB,IAAA,MAAA,GAAS,KAAA,EAAM;AACf,IAAA,SAAA,GAAY,MAAA,GAAS,KAAK,gBAAA,EAAiB;AAC3C,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,cAAA,CACd,MAAA,EACA,IAAA,EACA,MAAA,EACuB;AACvB,EAAA,MAAM,aAAaV,sBAAAA,CAAK,IAAA;AAAA;AAAA,IAAiC,MAAA,CAAO,OAAA;AAAA,IAAS,IAAA,CAAK;AAAA,GAAU;AACxF,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,MAAA,EAAQ,KAAK,CAAA,EAAG;AACjC,IAAA,MAAM,QAAA,GAAWA,uBAAK,IAAA,CAAK,UAAA,EAAY,GAAG,MAAM,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AACxD,IAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,IAAA,MAAM,EAAE,QAAA,EAAAW,SAAAA,KAAa,UAAA,CAAW,QAAA,EAAU,QAAQ,IAAI,CAAA;AACtD,IAAA,OAAOA,SAAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sBAAA,CACd,KACA,IAAA,EACwD;AACxD,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,gBAAA,CAAiB,GAAA,CAAI,WAAA,EAAa,KAAK,MAAM,CAAA;AAAA,IAC1D,MAAM,GAAA,CAAI;AAAA,GACZ;AACF;;;AO9RA,cAAA,EAAA;AAKO,SAAS,wBAAA,CACd,MACA,MAAA,EACA,aAAA,EACA,SACA,IAAA,EACA,aAAA,EACA,eAAA,GAAqC,EAAC,EACd;AACxB,EAAA,MAAM,aAAa,gBAAA,CAAiB;AAAA,IAClC,OAAA,EAAS,CAAC,aAAA,EAAe,MAAM,CAAA;AAAA,IAC/B,aAAA;AAAA,IACA,eAAe,aAAA,IAAiB,EAAE,QAAA,EAAU,aAAA,EAAe,qBAAqB,KAAA;AAAM,GACvF,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACnC,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAO;AAAA,EAClD;AAEA,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,MAAM,CAAA,IAAK,OAAA,EAAS;AACzC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,MAAA,GAAS,SAAA,KAAc,aAAA,GAAgB,KAAA,CAAM,OAAO,KAAA,CAAM,MAAA;AAIhE,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,YAAA,GAAe,MAAA;AACnB,IAAA,KAAA,MAAW,eAAA,IAAmB,CAAC,MAAA,EAAQ,GAAG,eAAe,CAAA,EAAG;AAC1D,MAAA,MAAM,OACJ,eAAA,KAAoB,aAAA,GAChB,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,MAAM,IAC/C,OAAA,CAAQ,GAAA,CAAI,eAAe,CAAA,EAAG,QAAA,CAAS,IAAI,MAAM,CAAA;AACvD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAA,GAAS,IAAA;AACT,QAAA,YAAA,GAAe,eAAA;AACf,QAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI,MAAA,CAAO,SAAS,IAAA,EAAM;AACxB,QAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAA,EAAc,YAAA,EAAa;AAAA,MACxD;AACA,MAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,QAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,YAAA,EAAc,MAAA,EAAO;AAAA,MAChD;AACA,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,IAAA;AAAA,QACV,YAAA,EAAc,MAAA;AAAA,QACd,kBAAkB,UAAA,CAAW,WAAA,CAAY,KAAK,IAAA,EAAM,MAAA,CAAO,MAAM,MAAM;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,IAAI,cAAc,aAAA,EAAe;AAC/B,MAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAe,YAAA,EAAc,aAAA,EAAc;AAAA,IAChE;AAEA,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,YAAA,EAAc,MAAA,EAAO;AAAA,IAChD;AACA,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,IAAA;AAAA,MACV,YAAA,EAAc,MAAA;AAAA,MACd,kBAAkB,UAAA,CAAW,WAAA,CAAY,KAAK,IAAA,EAAM,KAAA,CAAM,QAAQ,MAAM;AAAA,KAC1E;AAAA,EACF;AAEA,EAAA,IAAI,WAAW,aAAA,EAAe;AAC5B,IAAA,MAAM,QAAQ,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,EAAG,MAAA,CAAO,IAAI,IAAI,CAAA;AACzD,IAAA,IAAI,KAAA,IAAS,IAAA,CAAK,aAAA,KAAkB,IAAA,EAAM;AACxC,MAAA,OAAO,EAAE,QAAA,EAAU,KAAA,EAAe,YAAA,EAAc,aAAA,EAAc;AAAA,IAChE;AACA,IAAA,MAAM,IAAA,GAAO,GAAA,EAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAc,YAAA,EAAc,MAAA,EAAO;AAAA,IACxD;AACA,IAAA,MAAM,WAAW,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,EAAG,MAAA,CAAO,IAAI,IAAI,CAAA;AAC5D,IAAA,IAAI,QAAA,IAAY,IAAA,CAAK,aAAA,KAAkB,IAAA,EAAM;AAC3C,MAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAkB,YAAA,EAAc,aAAA,EAAc;AAAA,IACnE;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,YAAA,EAAc,MAAA,EAAO;AAChD;;;AT7EA,SAAS,cAAc,OAAA,EAAoE;AACzF,EAAA,IAAI,OAAO,OAAA,KAAY,UAAA,EAAY,OAAO,OAAA;AAC1C,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,aAAA;AACH,MAAA,OAAO,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,eAAe,EAAA,EAAI,aAAA,CAAc,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,IAC1E,KAAK,cAAA;AACH,MAAA,OAAO,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,eAAe,EAAA,EAAI,aAAA,CAAc,CAAA,CAAE,WAAA,IAAe,EAAE,CAAA;AAAA,IAC1E,KAAK,WAAA;AACH,MAAA,OAAO,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,aAAa,EAAA,EAAI,aAAA,CAAc,CAAA,CAAE,SAAA,IAAa,EAAE,CAAA;AAAA,IACtE,KAAK,YAAA;AACH,MAAA,OAAO,CAAC,GAAG,CAAA,KAAA,CAAO,CAAA,CAAE,aAAa,EAAA,EAAI,aAAA,CAAc,CAAA,CAAE,SAAA,IAAa,EAAE,CAAA;AAAA,IACtE;AACE,MAAA,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI,CAAA;AAAA;AAElD;AAEA,SAAS,YAAA,CACP,MAAA,EACA,IAAA,EACA,UAAA,EACoB;AACpB,EAAA,MAAM,IAAA,GAAO,mBAAA,CAAoB,MAAA,EAAQ,IAAI,CAAA;AAC7C,EAAA,MAAM,iBAAiB,IAAI,GAAA;AAAA,IACzB,kBAAA,CAAmB,KAAK,MAAM,CAAA,CAC3B,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,EAAE,IAAA,CAAK,CAAC,CAAA,EAAI,CAAC,CAAC;AAAA,GAC/B;AAEA,EAAA,SAAS,eAAe,MAAA,EAAwB;AAC9C,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AACd,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,cAAA,EAAiB,IAAA,CAAK,EAAE,CAAA,8BAAA,EAA4B,MAAM,CAAA,eAAA;AAAA,OAC5D;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAEA,EAAA,MAAM,UAAA,GAAa,iBAAiB,MAAM,CAAA;AAE1C,EAAA,MAAM,OAAA,GAA8B;AAAA,IAClC,IAAI,IAAA,CAAK,EAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,IAAA;AAAA,IAEA,KAAK,MAAA,GAAS,MAAA,CAAO,aAAA,EAAe,OAAA,GAAuB,EAAC,EAAG;AAC7D,MAAA,MAAM,GAAA,GAAM,IAAA,EAAK,CAAE,GAAA,CAAI,MAAM,CAAA;AAC7B,MAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA;AAC3C,MAAA,IAAA,CAAK,KAAK,aAAA,CAAc,OAAA,CAAQ,WAAW,IAAA,CAAK,OAAA,IAAW,MAAM,CAAC,CAAA;AAClE,MAAA,OAAO,OAAA,CAAQ,UAAU,MAAA,GAAY,IAAA,CAAK,MAAM,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAAA,IACtE,CAAA;AAAA,IAEA,GAAA,CAAI,IAAA,EAAc,MAAA,GAAS,MAAA,CAAO,aAAA,EAAe;AAC/C,MAAA,OAAO,IAAA,GAAO,GAAA,CAAI,MAAM,GAAG,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,IACjD,CAAA;AAAA,IAEA,OAAA,CAAQ,MAAc,MAAA,EAAgB;AACpC,MAAA,MAAM,MAAA,GAAS,wBAAA;AAAA,QACb,IAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA,CAAO,aAAA;AAAA,QACP,IAAA,EAAK;AAAA,QACL,IAAA;AAAA,QACA,MAAA,CAAO,aAAA;AAAA,QACP,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA,IAAK;AAAC,OACrC;AACA,MAAA,IAAI,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,IAAA,EAAM;AAChC,QAAA,OAAO;AAAA,UACL,GAAG,MAAA;AAAA,UACH,eAAe,UAAA,CAAW,WAAA;AAAA,YACxB,IAAA,CAAK,IAAA;AAAA,YACL,OAAO,QAAA,CAAS,IAAA;AAAA,YAChB,MAAA,CAAO;AAAA;AACT,SACF;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,YAAA,CAAa,OAAA,GAAU,EAAC,EAAG;AACzB,MAAA,cAAA,CAAe,cAAc,CAAA;AAC7B,MAAA,MAAM,MAAM,IAAA,EAAK;AACjB,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA;AAC1C,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,MAAA,MAAM,SAAwB,EAAC;AAC/B,MAAA,KAAA,MAAW,MAAA,IAAU,OAAA,CAAQ,OAAA,IAAW,MAAA,CAAO,OAAA,EAAS;AACtD,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA;AAChC,QAAA,MAAM,SAAA,GAAY,MAAA,CAAO,eAAA,CAAgB,MAAM,KAAK,EAAC;AACrD,QAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,MAAA,CAAO,MAAA,EAAO,EAAG;AACvC,UAAA,IAAI,IAAA;AACJ,UAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACnC,YAAA,IAAA,GAAO,GAAA,CAAI,IAAA;AAAA,UACb,CAAA,MAAO;AAGL,YAAA,IAAA,GACE,SAAA,EAAW,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG,IAAA,IACnC,SAAA,CACG,GAAA,CAAI,CAAC,EAAA,KAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA,EAAG,IAAI,CAAA,CACrD,IAAA,CAAK,CAAC,CAAA,KAAmB,CAAA,KAAM,MAAS,CAAA,IAC3C,GAAA,CAAI,IAAA;AAAA,UACR;AACA,UAAA,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,QAC9B;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,WAAW,GAAA,EAAqB;AAC9B,MAAA,MAAM,YAAA,GAAe,eAAe,YAAY,CAAA;AAChD,MAAA,MAAM,GAAA,GAA8B;AAAA,QAClC,CAAC,MAAA,CAAO,aAAa,GAAG,UAAA,CAAW,WAAA;AAAA,UACjC,YAAA;AAAA,UACA,GAAA,CAAI,MAAA;AAAA,UACJ,MAAA,CAAO;AAAA;AACT,OACF;AACA,MAAA,MAAM,MAAM,IAAA,EAAK;AACjB,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,QAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACrC,QAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,MAAM,GAAG,QAAA,CAAS,GAAA,CAAI,IAAI,MAAM,CAAA;AAC3D,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,GAAA,CAAI,MAAM,CAAA,GAAI,UAAA,CAAW,YAAY,YAAA,EAAc,UAAA,CAAW,MAAM,MAAM,CAAA;AAAA,QAC5E;AAAA,MACF;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IAEA,WAAA,CAAY,KAAqB,YAAA,EAAsB;AACrD,MAAA,IAAI,YAAA,KAAiB,GAAA,CAAI,MAAA,EAAQ,OAAO,GAAA;AACxC,MAAA,MAAM,MAAM,IAAA,EAAK;AACjB,MAAA,IAAI,YAAA,KAAiB,OAAO,aAAA,EAAe;AACzC,QAAA,OAAO,GAAA,CAAI,IAAI,MAAA,CAAO,aAAa,GAAG,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,MAClE;AACA,MAAA,OAAO,GAAA,CAAI,IAAI,YAAY,CAAA,EAAG,SAAS,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,IAAK,IAAA;AAAA,IAC5D,CAAA;AAAA,IAEA,GAAA,CAAI,MAAc,MAAA,EAAgB;AAChC,MAAA,MAAM,YAAA,GAAe,eAAe,KAAK,CAAA;AACzC,MAAA,OAAO,UAAA,CAAW,WAAA,CAAY,YAAA,EAAc,IAAA,EAAM,MAAM,CAAA;AAAA,IAC1D,CAAA;AAAA,IAEA,OAAA,CAAQ,GAAA,EAAqB,SAAA,EAAmB,MAAA,EAAiB;AAC/D,MAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACzC,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,cAAA,EAAiB,IAAA,CAAK,EAAE,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAA;AAAA,SACzE;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,CAAK,cAAe,CAAA;AAC9C,MAAA,MAAM,YAAA,GAAe,UAAU,GAAA,CAAI,MAAA;AACnC,MAAA,MAAM,KAAA,GAAS,GAAA,CAAI,WAAA,CAAwC,SAAS,CAAA;AAIpE,MAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAA0C;AACvD,QAAA,MAAM,GAAA,GAAM,OAAO,IAAA,EAAK;AACxB,QAAA,OACE,IAAI,GAAA,CAAI,YAAY,CAAA,EAAG,QAAA,CAAS,IAAI,MAAM,CAAA,IAC1C,GAAA,CAAI,GAAA,CAAI,OAAO,aAAa,CAAA,EAAG,MAAA,CAAO,GAAA,CAAI,MAAM,CAAA,IAChD,IAAA;AAAA,MAEJ,CAAA;AAEA,MAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,QAAA,OAAO,MACJ,MAAA,CAAO,CAAC,SAAyB,OAAO,IAAA,KAAS,YAAY,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAC5E,IAAI,KAAK,CAAA,CACT,OAAO,CAAC,CAAA,KAA2B,MAAM,IAAI,CAAA;AAAA,MAClD;AAEA,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,WAAW,CAAA,EAAG;AACnD,QAAA,IAAI,IAAA,CAAK,kBAAkB,OAAO,IAAA;AAClC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,GAAG,IAAA,CAAK,EAAE,KAAK,GAAA,CAAI,MAAM,yBAAyB,SAAS,CAAA,YAAA;AAAA,SAC7D;AAAA,MACF;AACA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAK,CAAA;AAC5B,MAAA,IAAI,CAAC,QAAA,IAAY,CAAC,IAAA,CAAK,gBAAA,EAAkB;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAA,EAAK,GAAA,CAAI,MAAM,CAAA,aAAA,EAAgB,SAAS,CAAA,qBAAA,EAC7C,IAAA,CAAK,cAAc,CAAA,EAAA,EAAK,KAAK,CAAA,gCAAA;AAAA,SACpC;AAAA,MACF;AACA,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT;AASO,SAAS,cAAc,MAAA,EAAqC;AACjE,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAgC;AACrD,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAmC;AACrD,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,EAAE,CAAA,CAAA,CAAG,CAAA;AAAA,IAChD;AACA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,QAAA,CAAS,IAAI,IAAA,CAAK,EAAA,EAAI,aAAa,MAAA,EAAQ,IAAA,EAAM,UAAU,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,GAAY;AACV,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,iBAAA,GAAoB;AAClB,MAAA,OAAO,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,IACzF;AAAA,GACF;AACF;;;AUhPA,cAAA,EAAA;;;ACAA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAOO,SAAS,YAAA,CACd,MAAA,EACA,IAAA,EACA,MAAA,EACS;AACT,EAAA,MAAM,MAAMV,sBAAAA,CAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,KAAK,UAAU,CAAA;AACrD,EAAA,OACED,qBAAG,UAAA,CAAWC,sBAAAA,CAAK,KAAK,GAAA,EAAK,CAAA,EAAG,MAAM,CAAA,IAAA,CAAM,CAAC,CAAA,IAC7CD,oBAAAA,CAAG,WAAWC,sBAAAA,CAAK,IAAA,CAAK,KAAK,CAAA,EAAG,MAAM,KAAK,CAAC,CAAA;AAEhD;AAmBO,SAAS,WAAA,CAAY,SAAiB,UAAA,EAA8B;AACzE,EAAA,MAAM,GAAA,GAAMA,sBAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AACzC,EAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,SAAU,EAAC;AACjC,EAAA,OAAOA,oBAAAA,CACJ,WAAA,CAAY,GAAG,CAAA,CACf,OAAO,wBAAwB,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA;AAC5C;;;AC3CA,cAAA,EAAA;;;AFIA,WAAA,EAAA;;;AGJA,cAAA,EAAA;AAIA,WAAA,EAAA;;;ACJA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAGA,IAAM,kBAAA,GAAqBI,MAAE,KAAA,CAAM;AAAA,EACjC,iBAAA;AAAA,EACAA,KAAAA,CAAE,MAAM,iBAAiB,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,IAAI,EAAE;AAC1C,CAAC,CAAA;AAEM,IAAM,uBAAA,GAA0BA,MACpC,MAAA,CAAO;AAAA,EACN,IAAA,EAAM,kBAAA;AAAA,EACN,MAAA,EAAQ,kBAAkB,QAAA,EAAS;AAAA,EACnC,QAAQA,KAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EACnC,OAAOA,KAAAA,CAAE,MAAA,GAAS,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS;AAAA,EAClC,SAAA,EAAWA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACzB,CAAC,CAAA,CACA,WAAA,CAAY,CAAC,KAAA,EAAO,GAAA,KAAQ;AAC3B,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,KAAW,MAAA;AACnC,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,KAAU,MAAA;AACjC,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,KAAW,MAAA;AACnC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,SAAS,CAAA,GAAI,OAAO,QAAQ,CAAA;AAEvD,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,yEAAA;AAAA,MACT,IAAA,EAAM,CAAC,QAAQ;AAAA,KAChB,CAAA;AACD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,sCAAA;AAAA,MACT,IAAA,EAAM,CAAC,OAAO;AAAA,KACf,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,SAAA,IAAa,CAAC,SAAA,EAAW;AAC3B,IAAA,GAAA,CAAI,QAAA,CAAS;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS,qDAAA;AAAA,MACT,IAAA,EAAM,CAAC,QAAQ;AAAA,KAChB,CAAA;AAAA,EACH;AACF,CAAC,CAAA;AAEI,IAAM,uBAAA,GAA0BA,MAAE,MAAA,CAAO;AAAA,EAC9C,WAAWA,KAAAA,CAAE,KAAA,CAAM,uBAAuB,CAAA,CAAE,IAAI,GAAG;AACrD,CAAC,CAAA;AAgBM,SAAS,sBAAsB,IAAA,EAAmC;AACvE,EAAA,OAAO,MAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,GAAO,CAAC,IAAI,CAAA;AAC3C;AAEO,SAAS,mBAAmB,KAAA,EAA+C;AAChF,EAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,KAAA,CAAM,IAAI,CAAA;AAClD,EAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,IAAA,EAAM,UAAA;AAAA,MACN,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,IAAA,EAAM,YAAA;AAAA,MACN,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,KAChC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,IAAA,EAAM,WAAA;AAAA,IACN,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,SAAA,EAAW,MAAM,SAAA,IAAa;AAAA,GAChC;AACF;;;ADtFO,IAAM,uBAAA,GAA0B,iBAAA;AASvC,SAAS,iBAAA,CAAkB,QAAsB,IAAA,EAAiC;AAChF,EAAA,OAAOH,uBAAK,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,YAAY,uBAAuB,CAAA;AAC3E;AAEO,SAAS,qBAAA,CACd,QACA,IAAA,EAC4B;AAC5B,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAA,EAAQ,IAAI,CAAA;AAC/C,EAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,QAAQ,GAAG,OAAO,IAAA;AAErC,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,KAAK,KAAA,CAAMA,oBAAAA,CAAG,YAAA,CAAa,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EACpD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,kBAAA,EAAqB,uBAAuB,CAAA,EAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KACnH;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,uBAAA,CAAwB,SAAA,CAAU,GAAG,CAAA;AACpD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,MAAA,CAC1B,IAAI,CAAC,KAAA,KAAU,GAAG,KAAA,CAAM,IAAA,CAAK,KAAK,GAAG,CAAA,IAAK,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACpE,KAAK,IAAI,CAAA;AACZ,IAAA,MAAM,IAAI,MAAM,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,UAAA,EAAa,uBAAuB,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO;AAAA,IACL,eAAe,IAAA,CAAK,EAAA;AAAA,IACpB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,QAAA;AAAA,IACA,OAAA,EAAS,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,IAAI,kBAAkB;AAAA,GACvD;AACF;AAEO,SAAS,qBAAqB,MAAA,EAA6C;AAChF,EAAA,MAAM,MAA6B,EAAC;AACpC,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,MAAA,EAAQ,IAAI,CAAA;AACjD,IAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,GAAA;AACT;;;AE7DA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAYO,SAAS,eAAe,GAAA,EAA4B;AACzD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjBC,sBAAAA,CAAK,IAAA;AAAA;AAAA,MAAiC,GAAA;AAAA,MAAK;AAAA,KAAkB;AAAA,IAC7DA,sBAAAA,CAAK,IAAA;AAAA;AAAA,MAAiC,GAAA;AAAA,MAAK;AAAA,KAAmB;AAAA,IAC9DA,sBAAAA,CAAK,IAAA;AAAA;AAAA,MAAiC,GAAA;AAAA,MAAK;AAAA;AAAkB,GAC/D;AACA,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAID,oBAAAA,CAAG,WAAW,SAAS,CAAA,IAAKA,qBAAG,QAAA,CAAS,SAAS,CAAA,CAAE,MAAA,EAAO,EAAG;AAC/D,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,cAAA,CAAe,OAAA,GAA6B,EAAC,EAAiB;AAC5E,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AAAA,EAAmC,QAAQ,GAAA,EAAI;AACnE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,cAAA,CAAe,GAAG,CAAA;AAC3D,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,EACvE;AAEA,EAAA,MAAMY,MAAA,GAAOC,gBAAW,aAAA,EAAiB;AAAA,IACvC,cAAA,EAAgB,IAAA;AAAA,IAChB,WAAA,EAAa;AAAA,GACd,CAAA;AAED,EAAA,MAAM,MAAA,GAASD,OAAK,UAAU,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,SAAA,IAAa,MAAA,GAAS,MAAA,CAAO,OAAA,GAAU,MAAA;AACtD,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,UAAU,CAAA,iBAAA,CAAmB,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,aAAA,CAAc,MAAA,EAAQX,sBAAAA,CAAK,OAAA,CAAQ,UAAU,CAAC,CAAA;AACvD;;;AC7CA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAaA,SAAS,aAAA,CAAc,MAAA,EAAsB,MAAA,EAAgB,MAAA,EAAyB;AACpF,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,MAAM,CAAA;AAC7D,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAClB,EAAA,OAAO,YAAA,CAAa,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAC1C;AAEA,SAAS,qBAAA,CACP,OAAA,EACA,YAAA,EACA,KAAA,EAC2C;AAC3C,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY,OAAO,IAAA;AACtC,EAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAS,MAAA,EAAQ,MAAM,MAAA,EAAQ;AAAA,EACxD;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,MAAA,EAAQ,MAAM,MAAA,EAAQ;AACvD;AAEA,SAAS,mBAAA,CACP,SACA,KAAA,EAC2C;AAC3C,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,OAAA,CAAQ,MAAM,CAAA;AAClD,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO;AACvC,IAAA,IAAI,CAAC,KAAK,IAAA,EAAM;AAChB,IAAA,MAAM,MAAA,GAAS,UAAA,CAAW,2BAAA,CAA4B,IAAA,CAAK,MAAM,KAAK,CAAA;AACtE,IAAA,IAAI,UAAU,aAAA,CAAc,OAAA,CAAQ,QAAQ,IAAA,CAAK,EAAA,EAAI,MAAM,CAAA,EAAG;AAC5D,MAAA,OAAO,EAAE,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,MAAA,EAAO;AAAA,IACnC;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,sBAAsB,OAAA,EAAyC;AAC7E,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAkD;AAEzE,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,KAAA,EAAO;AACvC,IAAA,MAAM,QAAA,GAAWA,uBAAK,IAAA,CAAK,OAAA,CAAQ,OAAO,OAAA,EAAS,IAAA,CAAK,YAAY,uBAAuB,CAAA;AAC3F,IAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAE9B,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,qBAAA,CAAsB,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,IACrD,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,aAAa,IAAA,CAAK,EAAA;AAAA,QAClB,KAAA,EAAO,uBAAA;AAAA,QACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC/D,CAAA;AACD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,CAAC,cAAA,CAAe,IAAI,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,aAAa,IAAA,CAAK,EAAA;AAAA,QAClB,KAAA,EAAO,uBAAA;AAAA,QACP,OAAA,EAAS,CAAA,qEAAA;AAAA,OACV,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,OAAA,EAAS;AAClC,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,SAAA,EAAW;AAClC,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,IAAe,IAAA,KAAS,MAAM,MAAA,EAAQ;AACvD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,MAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,uBAAA;AAAA,YACP,OAAA,EAAS,oBAAoB,IAAI,CAAA,gCAAA;AAAA,WAClC,CAAA;AAAA,QACH;AAEA,QAAA,IAAI,cAAc,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,EAAA,EAAI,IAAI,CAAA,EAAG;AAChD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,MAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,uBAAA;AAAA,YACP,OAAA,EAAS,oBAAoB,IAAI,CAAA,gEAAA;AAAA,WAClC,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AACpC,QAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,IAAA,CAAK,EAAA,EAAI;AAC3C,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,MAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,uBAAA;AAAA,YACP,OAAA,EAAS,CAAA,iBAAA,EAAoB,IAAI,CAAA,wBAAA,EAA2B,SAAS,MAAM,CAAA;AAAA,WAC5E,CAAA;AAAA,QACH,WAAW,QAAA,EAAU;AACnB,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,MAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,uBAAA;AAAA,YACP,OAAA,EAAS,CAAA,2BAAA,EAA8B,IAAI,CAAA,KAAA,EAAQ,uBAAuB,CAAA;AAAA,WAC3E,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,MAAA,EAAQ,KAAK,EAAA,EAAI,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,CAAA;AAAA,QACrE;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,QAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,CAAC,SAAA,KAAc,SAAA,CAAU,EAAA,KAAO,KAAA,CAAM,MAAM,CAAA;AACzF,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,KAAA,EAAO,uBAAA;AAAA,YACP,OAAA,EAAS,CAAA,8BAAA,EAAiC,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,WACvD,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,cAAA,CAAe,UAAU,CAAA,EAAG;AAC/B,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,KAAA,EAAO,uBAAA;AAAA,YACP,OAAA,EAAS,CAAA,sBAAA,EAAyB,KAAA,CAAM,MAAM,CAAA,gCAAA;AAAA,WAC/C,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,OAAA,EAAS,IAAA,CAAK,IAAI,KAAK,CAAA;AAC5D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,CAAC,cAAc,OAAA,CAAQ,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AAChE,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,KAAA,EAAO,uBAAA;AAAA,YACP,SAAS,CAAA,gBAAA,EAAmB,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,eAAA;AAAA,WAC3D,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,IAAA,KAAS,UAAA,IAAc,MAAM,KAAA,EAAO,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7D,QAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AACxD,QAAA,IAAI,OAAA,IAAW,CAAC,aAAA,CAAc,OAAA,CAAQ,QAAQ,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC7E,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA,EAAO,OAAA;AAAA,YACP,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,KAAA,EAAO,uBAAA;AAAA,YACP,OAAA,EAAS,CAAA,gBAAA,EAAmB,KAAA,CAAM,KAAK,CAAA,qCAAA;AAAA,WACxC,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,OAAA,CAAQ,MAAM,CAAA;AACrD,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,CAAC,MAAM,MAAA,EAAQ;AAChD,MAAA,MAAM,eAAe,KAAA,CAAM,IAAA,KAAS,YAAA,GAAe,KAAA,CAAM,SAAU,IAAA,CAAK,aAAA;AACxE,MAAA,MAAM,UAAA,GAAa,QAAQ,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,YAAY,CAAA;AAC/E,MAAA,IAAI,CAAC,YAAY,IAAA,EAAM;AAEvB,MAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,SAAA,EAAW;AAClC,QAAA,IAAI,WAAW,GAAA,CAAI,IAAI,CAAA,EAAG,MAAA,KAAW,KAAK,aAAA,EAAe;AAEzD,QAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,MAAO,CAAA;AACnD,QAAA,IAAI,CAAC,cAAA,EAAgB;AAErB,QAAA,MAAM,iBAAA,GACJ,KAAA,CAAM,IAAA,KAAS,YAAA,IACf,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,MAAO,CAAA,IACtC,cAAA,CAAe,MAAA,KAAW,IAAA,CAAK,aAAA;AAEjC,QAAA,IAAI,iBAAA,EAAmB;AAEvB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA,EAAO,OAAA;AAAA,UACP,aAAa,IAAA,CAAK,aAAA;AAAA,UAClB,MAAA,EAAQ,IAAA;AAAA,UACR,KAAA,EAAO,uBAAA;AAAA,UACP,OAAA,EAAS,CAAA,0BAAA,EAA6B,IAAI,CAAA,UAAA,EAAQ,MAAM,MAAM,CAAA,iCAAA;AAAA,SAC/D,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ADpMA,WAAA,EAAA;;;AERA,cAAA,EAAA;AAsBA,SAAS,SAAA,CAAU,KAA8B,SAAA,EAA8B;AAC7E,EAAA,IAAI,OAAA,GAAmB,GAAA;AACvB,EAAA,KAAA,MAAW,WAAW,SAAA,EAAW;AAC/B,IAAA,IAAI,OAAO,YAAY,QAAA,IAAY,OAAA,KAAY,QAAQ,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG,OAAO,MAAA;AACtF,IAAA,OAAA,GAAW,QAAoC,OAAO,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,iBAAiB,MAAA,EAAgD;AACxE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAyB;AAC3C,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,WAAA,CAAY,OAAO,OAAA,EAAS,IAAA,CAAK,UAAU,CAAC,CAAA;AAClE,IAAA,KAAA,CAAM,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,SAAiB,UAAA,EAA8B;AACzE,EAAA,MAAM,GAAA,GAAMC,sBAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AACzC,EAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,SAAU,EAAC;AACjC,EAAA,OAAOA,oBAAAA,CACJ,WAAA,CAAY,GAAG,CAAA,CACf,OAAO,wBAAwB,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA;AAC5C;AAKO,SAAS,kBAAkB,OAAA,EAAiD;AACjF,EAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,EAAA,MAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AACzC,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAC,CAAA;AAErD,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,MAAM,cAAA,GAAiB,kBAAA,CAAmB,IAAA,CAAK,MAAM,CAAA;AACrD,IAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAEjC,IAAA,KAAA,MAAW,UAAU,kBAAA,CAAmB,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA,EAAG;AACxE,MAAA,MAAM,GAAA,GAAM,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AAC/C,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,KAAA,MAAW,aAAa,cAAA,EAAgB;AACtC,QAAA,MAAM,eAAe,SAAA,CAAU,cAAA;AAC/B,QAAA,MAAM,aAAA,GACJ,SAAA,CAAU,gBAAA,IAAoB,SAAA,CAAU,mBAAmB,SAAA,GAAY,OAAA;AACzE,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAG;AAC9B,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,eAAe,IAAA,CAAK,EAAA;AAAA,YACpB,MAAA;AAAA,YACA,KAAA,EAAO,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,YAC9B,OAAA,EAAS,yBAAyB,YAAY,CAAA,mBAAA,CAAA;AAAA,YAC9C,KAAA,EAAO;AAAA,WACR,CAAA;AACD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,WAAA,EAAwC,UAAU,IAAI,CAAA;AAClF,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,EAAI;AAE3D,QAAA,MAAM,cAAc,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA,wBAAS,GAAA,EAAY;AACnE,QAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAE1C,QAAA,IAAI,UAAU,gBAAA,EAAkB;AAC9B,UAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC3B,UAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,YAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,IAAA,EAAM;AACvC,YAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,cAAA,MAAA,CAAO,IAAA,CAAK;AAAA,gBACV,eAAe,IAAA,CAAK,EAAA;AAAA,gBACpB,MAAA;AAAA,gBACA,KAAA,EAAO,UAAA;AAAA,gBACP,SAAS,CAAA,EAAG,UAAU,CAAA,aAAA,EAAgB,IAAI,eAAU,YAAY,CAAA,mBAAA,CAAA;AAAA,gBAChE,KAAA,EAAO;AAAA,eACR,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,EAAU;AACpC,UAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAC3B,YAAA,MAAA,CAAO,IAAA,CAAK;AAAA,cACV,eAAe,IAAA,CAAK,EAAA;AAAA,cACpB,MAAA;AAAA,cACA,KAAA,EAAO,UAAA;AAAA,cACP,OAAA,EAAS,GAAG,UAAU,CAAA,aAAA,EAAgB,KAAK,CAAA,YAAA,EAAU,YAAY,mBAAmB,KAAK,CAAA,CAAA,CAAA;AAAA,cACzF,KAAA,EAAO;AAAA,aACR,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;ACtHA,cAAA,EAAA;AAIA,IAAM,YAAY,MAAA,CAAO,GAAA,CAAA,0BAAA,CAAA;AACzB,IAAM,cAAA,GAAiB,MAAA,CAAO,GAAA,CAAA,aAAA,EAAmB,SAAS,CAAA,CAAA;AAC1D,IAAM,oBAAoB,IAAI,MAAA;AAAA,EAC5B,MAAA,CAAO,oBAAoB,cAAc,CAAA,GAAA,CAAA;AAAA,EACzC;AACF,CAAA;AACA,IAAM,cAAc,IAAI,MAAA,CAAO,OAAO,GAAA,CAAA,SAAA,EAAe,cAAc,SAAS,IAAI,CAAA;AAEhF,SAAS,eAAe,KAAA,EAAwB;AAC9C,EAAA,OAAO,IAAI,OAAO,MAAA,CAAO,GAAA,CAAA,CAAA,EAAO,cAAc,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA,CAAE,IAAA,CAAK,KAAK,CAAA;AACpE;AAEA,SAAS,gBAAgB,OAAA,EAA0B;AACjD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACpC,EAAA,OAAO,QAAQ,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAC,CAAA;AAClD;AAEA,SAAS,YAAA,CAAa,SAAiB,GAAA,EAAwB;AAC7D,EAAA,IAAI,eAAA,CAAgB,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,OAAO,CAAA;AAC/C;AAEA,SAAS,qBAAA,CAAsB,MAAc,GAAA,EAAwB;AACnE,EAAA,KAAA,MAAW,EAAA,IAAM,CAAC,iBAAA,EAAmB,WAAW,CAAA,EAAG;AACjD,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,EAAE,CAAA,EAAG;AACrC,MAAA,YAAA,CAAa,KAAA,CAAM,CAAC,CAAA,EAAI,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF;AACF;AAEA,SAAS,4BAAA,CAA6B,OAAgB,GAAA,EAAwB;AAC5E,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG,YAAA,CAAa,OAAO,GAAG,CAAA;AAClD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,4BAAA,CAA6B,IAAA,EAAM,GAAG,CAAA;AAChE,IAAA;AAAA,EACF;AACA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,KAAA,MAAW,MAAA,IAAU,MAAA,CAAO,MAAA,CAAO,KAAgC,CAAA,EAAG;AACpE,MAAA,4BAAA,CAA6B,QAAQ,GAAG,CAAA;AAAA,IAC1C;AAAA,EACF;AACF;AAGO,SAAS,iBAAA,CAAkB,aAAsB,IAAA,EAAwB;AAC9E,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,4BAAA,CAA6B,aAAa,KAAK,CAAA;AAC/C,EAAA,qBAAA,CAAsB,MAAM,KAAK,CAAA;AACjC,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,EAAK;AACzB;AAEA,SAAS,aAAA,CAAc,YAAoB,OAAA,EAAyB;AAClE,EAAA,OAAOC,uBAAK,IAAA,CAAK,UAAA,EAAY,QAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AACzD;AAYO,SAAS,sBAAA,CACd,QACA,KAAA,EAOsB;AACtB,EAAA,MAAM,aAAa,MAAA,CAAO,UAAA;AAC1B,EAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AAEzB,EAAA,MAAM,SAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,WAAW,iBAAA,CAAkB,KAAA,CAAM,WAAA,EAAa,KAAA,CAAM,IAAI,CAAA,EAAG;AACtE,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAClD,IAAA,IAAID,oBAAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,SAAA;AAAA,MACP,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,CAAA,oBAAA,EAAuB,OAAO,CAAA,WAAA,EAAc,QAAQ,CAAA,CAAA;AAAA,KAC9D,CAAA;AAAA,EACH;AACA,EAAA,OAAO,MAAA;AACT;;;AClGA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAEO,SAAS,sBAAA,CACd,MACA,WAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA;AAClE,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,EAAG;AAC7B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,yBAAA,CACd,MACA,WAAA,EAC2D;AAC3D,EAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,IAAA,EAAM,WAAW,CAAA;AAC5D,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAM;AAAA,EACjC;AACA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,WAAA,CAAY,SAAS,CAAA,CAAE,CAAA;AAAA,IAC7C,QAAA,EAAU,IAAA;AAAA,IACV;AAAA,GACF;AACF;;;ADdO,SAAS,+BAAA,CACd,QACA,EAAA,EACmB;AACnB,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAAA,GAAc,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,aAAa,CAAA;AAE3E,EAAA,KAAA,MAAW,GAAA,IAAO,oBAAA,CAAqB,EAAE,CAAA,EAAG;AAC1C,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,CAAO,aAAA,EAAe;AAEzC,IAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,GAAA,CAAI,IAAA,EAAM,WAAW,CAAA;AAChE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,eAAe,GAAA,CAAI,YAAA;AAAA,QACnB,QAAQ,GAAA,CAAI,OAAA;AAAA,QACZ,QAAQ,GAAA,CAAI,MAAA;AAAA,QACZ,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,OAAA,EAAS,CAAA,kBAAA,EAAqB,GAAA,CAAI,IAAI,6BAA6B,WAAW,CAAA,CAAA;AAAA,OAC/E,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AJPA,SAASc,YAAAA,CAAY,SAAiB,UAAA,EAA8B;AAClE,EAAA,MAAM,GAAA,GAAMb,sBAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AACzC,EAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,SAAU,EAAC;AACjC,EAAA,OAAOA,oBAAAA,CACJ,WAAA,CAAY,GAAG,CAAA,CACf,OAAO,wBAAwB,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA;AAC5C;AAEA,SAAS,uBAAA,CACP,QACA,KAAA,EAMM;AACN,EAAA,MAAM,YAAA,GAAe,wBAAA,CAAyB,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA;AAC1D,EAAA,MAAM,aAAA,GAAgB,gBAAgB,YAAY,CAAA;AAClD,EAAA,IAAI,CAAC,cAAc,EAAA,EAAI;AACrB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAA,EAAO,MAAA;AAAA,MACP,OAAA,EAAS,CAAA,aAAA,EAAgB,aAAA,CAAc,KAAK,CAAA;AAAA,KAC7C,CAAA;AAAA,EACH;AACF;AAGO,SAAS,gBAAgB,MAAA,EAAsC;AACpE,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,MAAM,OAAA,GAAU,cAAc,MAAM,CAAA;AACpC,EAAA,MAAM,YAAY,OAAA,CAAQ,SAAA;AAE1B,EAAA,IAAI,CAACA,oBAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,OAAA;AAAA,MACP,OAAA,EAAS,2BAA2B,SAAS,CAAA;AAAA,KAC9C,CAAA;AACD,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO;AAAA,EAC7B;AAEA,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AAEvC,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,MAAM,OAAA,GAAUc,YAAAA,CAAY,MAAA,CAAO,OAAA,EAAS,KAAK,UAAU,CAAA;AAC3D,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,OAAO,CAAA;AAEpC,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,cAAA,CAAe,IAAI,CAAA,EAAG;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,aAAa,IAAA,CAAK,EAAA;AAAA,QAClB,OAAA,EAAS,CAAA,qCAAA,EAAwC,IAAA,CAAK,EAAE,CAAA,8BAAA;AAAA,OACzD,CAAA;AAAA,IACH;AAEA,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AACjD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA,EAAO,OAAA;AAAA,UACP,aAAa,IAAA,CAAK,EAAA;AAAA,UAClB,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GACJ,IAAA,CAAK,aAAA,GAAgB,KAAA,CAAM,WAAA,EAAsB;AAAA,QAC/C,QAAQ,MAAA,CAAO,aAAA;AAAA,QACf,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,IAAA,EAAM,MAAA;AAAA,QACN,MAAA;AAAA,QACA,cAAc,MAAA,CAAO,OAAA;AAAA,QACrB;AAAA,OACD,KAAK,EAAC;AACT,MAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,aAAa,IAAA,CAAK,EAAA;AAAA,UAClB,MAAA;AAAA,UACA,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,SAAS,KAAA,CAAM;AAAA,SAChB,CAAA;AAAA,MACH;AAEA,MAAA,KAAA,MAAW,KAAA,IAAS,uBAAuB,MAAA,EAAQ;AAAA,QACjD,aAAa,IAAA,CAAK,EAAA;AAAA,QAClB,MAAA;AAAA,QACA,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,MAAM,KAAA,CAAM;AAAA,OACb,CAAA,EAAG;AACF,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAEA,MAAA,uBAAA,CAAwB,MAAA,EAAQ;AAAA,QAC9B,aAAa,IAAA,CAAK,EAAA;AAAA,QAClB,MAAA;AAAA,QACA,QAAQ,MAAA,CAAO,aAAA;AAAA,QACf,MAAM,KAAA,CAAM;AAAA,OACb,CAAA;AAED,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,QAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACrC,QAAA,MAAM,MAAM,cAAA,CAAe,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,MAAM,CAAA;AACtD,QAAA,IAAI,CAAC,GAAA,EAAK;AAEV,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,gBAAgB,CAAA;AAChD,QAAA,KAAA,MAAW,KAAA,IAAS,2BAAA,CAA4B,QAAQ,CAAA,EAAG;AACzD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,MAAA;AAAA,YACA,MAAA;AAAA,YACA,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,SAAS,KAAA,CAAM;AAAA,WAChB,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,YAAA,GAAe,wBAAA,CAAyB,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA;AACxD,QAAA,KAAA,MAAW,KAAA,IAAS,uBAAuB,MAAA,EAAQ;AAAA,UACjD,aAAa,IAAA,CAAK,EAAA;AAAA,UAClB,MAAA;AAAA,UACA,MAAA;AAAA,UACA,WAAA,EAAa,QAAA;AAAA,UACb,IAAA,EAAM;AAAA,SACP,CAAA,EAAG;AACF,UAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,QACnB;AAEA,QAAA,uBAAA,CAAwB,MAAA,EAAQ;AAAA,UAC9B,aAAa,IAAA,CAAK,EAAA;AAAA,UAClB,MAAA;AAAA,UACA,MAAA;AAAA,UACA,MAAM,GAAA,CAAI;AAAA,SACX,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,CAAE,IAAA,EAAK;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,OAAA;AAAA,QACP,aAAa,IAAA,CAAK,EAAA;AAAA,QAClB,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC/D,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,EAAA,CAAG,KAAA,EAAM;AAET,EAAA,KAAA,MAAW,KAAA,IAAS,qBAAA,CAAsB,OAAO,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAC9C,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,aAAa,KAAA,CAAM,aAAA;AAAA,MACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,SAAS,KAAA,CAAM;AAAA,KAChB,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AAChD,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,KAAA,IAAS,+BAAA,CAAgC,MAAA,EAAQ,WAAW,CAAA,EAAG;AACxE,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,SAAA;AAAA,QACP,aAAa,KAAA,CAAM,aAAA;AAAA,QACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,KAAA,EAAO,MAAA;AAAA,QACP,SAAS,KAAA,CAAM;AAAA,OAChB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,SAAE;AACA,IAAA,WAAA,CAAY,KAAA,EAAM;AAAA,EACpB;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,EAAG,MAAA,EAAO;AAChE;;;AM1NA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAGO,SAAS,OAAO,KAAA,EAAuB;AAC5C,EAAA,OAAOC,iBAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,OAAO,MAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAChE;AAGO,SAAS,iBAAA,CACd,yBACA,IAAA,EACQ;AACR,EAAA,MAAM,UAAU,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAa,uBAAA,EAAyB,MAAM,CAAA;AAC7E,EAAA,OAAO,OAAO,OAAO,CAAA;AACvB;;;ADRA,WAAA,EAAA;AA4BA,SAASD,YAAAA,CAAY,SAAiB,UAAA,EAA8B;AAClE,EAAA,MAAM,GAAA,GAAMb,sBAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AACzC,EAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,SAAU,EAAC;AACjC,EAAA,OAAOA,oBAAAA,CACJ,WAAA,CAAY,GAAG,CAAA,CACf,OAAO,wBAAwB,CAAA,CAC/B,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA;AAC5C;AAGO,SAAS,aAAA,CAAc,MAAA,EAAsB,OAAA,GAA2B,EAAC,EAA0B;AACxG,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,EAAA,MAAM,QAA+B,EAAC;AACtC,EAAA,MAAM,OAAA,GACJ,OAAA,CAAQ,OAAA,IACR,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAC,MAAA,KAAW,MAAA,KAAW,MAAA,CAAO,aAAa,CAAA;AAEnE,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,IAAA,IAAI,OAAA,CAAQ,WAAA,IAAe,IAAA,CAAK,EAAA,KAAO,QAAQ,WAAA,EAAa;AAC5D,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAC,OAAA,CAAQ,MAAM,CAAA,GAAIc,YAAAA,CAAY,MAAA,CAAO,OAAA,EAAS,IAAA,CAAK,UAAU,CAAA;AAE/F,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,MAAM,CAAA;AACjD,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAClD,MAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,OAAA,CAAQ,WAAA,EAAa,QAAQ,IAAI,CAAA;AAEzE,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACrC,QAAA,MAAM,WAAW,cAAA,CAAe,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,MAAM,CAAA;AAC3D,QAAA,IAAI,CAAC,QAAA,EAAU;AACb,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,MAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA,EAAQ,SAAA;AAAA,YACR;AAAA,WACD,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,IAAI,QAAA,CAAS,YAAY,aAAA,EAAe;AACtC,UAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YACT,aAAa,IAAA,CAAK,EAAA;AAAA,YAClB,MAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA,EAAQ,OAAA;AAAA,YACR,aAAA;AAAA,YACA,cAAc,QAAA,CAAS;AAAA,WACxB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,EAAA,CAAG,KAAA,EAAM;AACT,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,KAAA;AACrC,EAAA,IAAI,aAAa,cAAA,EAAgB;AAC/B,IAAA,OAAO,MAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,wBAAA,CACd,MAAA,EACA,MAAA,EACA,eAAA,EACU;AACV,EAAA,IAAI,eAAA,EAAiB,QAAQ,OAAO,eAAA;AACpC,EAAA,IAAI,MAAA,IAAU,MAAA,CAAO,aAAA,GAAgB,MAAM,CAAA,EAAG;AAC5C,IAAA,OAAO,MAAA,CAAO,cAAc,MAAM,CAAA,CAAG,OAAO,CAAC,CAAA,KAAM,CAAA,KAAM,MAAA,CAAO,aAAa,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,aAAa,CAAA;AAChE;;;AE3GA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AA2CO,SAAS,cAAA,CAAe,IAAuB,KAAA,EAA8B;AAClF,EAAA,MAAM,OAAO,EAAA,CACV,OAAA;AAAA,IACC,CAAA;AAAA,6BAAA;AAAA,GAEF,CACC,GAAA,CAAI,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,YAAA,EAAc,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,KAAK,CAAA;AACnF,EAAA,OAAO,MAAA,CAAO,KAAK,eAAe,CAAA;AACpC;AAEO,SAAS,gBAAA,CACd,EAAA,EACA,KAAA,EACA,KAAA,EACM;AACN,EAAA,MAAM,OAAO,EAAA,CAAG,OAAA;AAAA,IACd,CAAA;AAAA;AAAA,6CAAA;AAAA,GAGF;AACA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,KAAA;AAAA,MACA,IAAA,CAAK,YAAA;AAAA,MACL,IAAA,CAAK,WAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK,MAAA;AAAA,MACL,IAAA,CAAK;AAAA,KACP;AAAA,EACF;AACF;AAGO,SAAS,qBAAqB,EAAA,EAAsC;AACzE,EAAA,OAAO,EAAA,CACJ,OAAA,CAAQ,CAAA,2EAAA,CAA6E,CAAA,CACrF,GAAA,EAAI;AACT;AAEO,SAAS,cAAA,CAAe,IAAuB,KAAA,EAA+B;AACnF,EAAA,OAAO,EAAA,CACJ,OAAA,CAAQ,CAAA,6EAAA,CAA+E,CAAA,CACvF,IAAI,KAAK,CAAA;AACd;AAGO,SAAS,sBAAsB,EAAA,EAAuC;AAC3E,EAAA,OAAO,EAAA,CACJ,OAAA;AAAA,IACC,CAAA;AAAA;AAAA;AAAA,yCAAA;AAAA,IAKD,GAAA,EAAI;AACT;AAQO,SAAS,uBAAA,CACd,EAAA,EACA,KAAA,EACA,KAAA,EACA,WAAA,EACS;AACT,EAAA,MAAM,OAAO,EAAA,CACV,OAAA;AAAA,IACC,CAAA;AAAA,4CAAA;AAAA,GAEF,CACC,GAAA,CAAI,KAAA,EAAO,WAAA,EAAa,KAAK,CAAA;AAChC,EAAA,OAAO,KAAK,OAAA,GAAU,CAAA;AACxB;AAEO,SAAS,qBAAA,CACd,EAAA,EACA,KAAA,EACA,YAAA,EACA,QACA,KAAA,EACM;AACN,EAAA,EAAA,CAAG,OAAA;AAAA,IACD,CAAA,+FAAA;AAAA,IACA,GAAA,CAAI,MAAA,EAAQ,KAAA,IAAS,IAAA,EAAM,OAAO,YAAY,CAAA;AAClD;;;ADlIA,WAAA,EAAA;;;AEFA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAEA,WAAA,EAAA;AAIO,SAAS,gBAAA,CACd,MAAA,EACA,KAAA,EAOA,EAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,EAAA,IAAM,SAAA,CAAU,MAAA,EAAQ,WAAW,CAAA;AACjD,EAAA,MAAM,EAAA,GAAK,sBAAsB,KAAA,EAAO;AAAA,IACtC,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,aAAa,KAAA,CAAM,WAAA;AAAA,IACnB,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AACD,EAAA,IAAI,CAAC,EAAA,EAAI,KAAA,CAAM,KAAA,EAAM;AACrB,EAAA,OAAO,EAAA;AACT;;;ADbA,WAAA,EAAA;;;AEfA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAGA,IAAM,gBAAA,uBAAuB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AAE1D,SAAS,gBAAgB,KAAA,EAAoC;AAC3D,EAAA,IAAI,KAAA,YAAiBE,cAAA,IAAY,OAAO,KAAA,CAAM,WAAW,QAAA,EAAU;AACjE,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf;AAEA,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,YAAY,KAAA,EAAO;AAC3D,IAAA,MAAM,SAAU,KAAA,CAA+B,MAAA;AAC/C,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,EAAU,OAAO,MAAA;AAAA,EACzC;AAEA,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,2BAA2B,CAAA;AACvD,EAAA,IAAI,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAyB;AAC/C,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,OAAO,OAAO,GAAA,EAAK,IAAA,KAAS,QAAA,GAAW,IAAI,IAAA,GAAO,EAAA;AACxD,EAAA,IACE,IAAA,KAAS,YAAA,IACT,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,cAAA,IACT,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,WAAA,IACT,IAAA,KAAS,OAAA,IACT,SAAS,gBAAA,EACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,aAAY,GAAI,EAAA;AACvE,EAAA,OACE,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,IAC1B,QAAQ,QAAA,CAAS,cAAc,CAAA,IAC/B,OAAA,CAAQ,QAAA,CAAS,gBAAgB,CAAA,IACjC,OAAA,CAAQ,SAAS,YAAY,CAAA;AAEjC;AAGO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,MAAM,MAAA,GAAS,gBAAgB,KAAK,CAAA;AACpC,EAAA,IAAI,MAAA,KAAW,MAAA,EAAW,OAAO,gBAAA,CAAiB,IAAI,MAAM,CAAA;AAC5D,EAAA,OAAO,eAAe,KAAK,CAAA;AAC7B;AAWA,IAAM,YAAA,GAAe,CAAC,EAAA,KAAe,IAAI,OAAA,CAAc,CAAC,OAAA,KAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAM3F,eAAsB,SAAA,CAAa,EAAA,EAAsB,OAAA,GAAwB,EAAC,EAAe;AAC/F,EAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,YAAY,CAAC,CAAA;AAClD,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,GAAA;AAC3C,EAAA,MAAMC,MAAAA,GAAQ,QAAQ,KAAA,IAAS,YAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,IAAA,CAAK,MAAA;AAEtC,EAAA,IAAI,SAAA;AACJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,QAAA,EAAU,OAAA,EAAA,EAAW;AACpD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AACZ,MAAA,IAAI,WAAW,QAAA,IAAY,CAAC,gBAAA,CAAiB,KAAK,GAAG,MAAM,KAAA;AAE3D,MAAA,MAAM,OAAA,GAAU,WAAA,GAAc,CAAA,KAAM,OAAA,GAAU,CAAA,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,OAAA,GAAU,MAAA,EAAO,GAAI,OAAA;AACnC,MAAA,MAAMA,OAAM,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AACA,EAAA,MAAM,SAAA;AACR;;;ADzEA,IAAM,mBAAA,GAAsB,4BAAA;AAE5B,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,WAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,oCAAoB,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,qBAAqB,CAAC,CAAA;AAG/D,SAAS,oBAAoB,KAAA,EAA8C;AAChF,EAAA,OAAO,OAAO,KAAA,IAAS,SAAS,CAAA,CAAE,OAAA,CAAQ,qBAAqB,EAAE,CAAA;AACnE;AAEO,SAAS,qBAAqB,KAAA,EAA+C;AAClF,EAAA,OAAO,eAAA,CAAgB,GAAA,CAAI,mBAAA,CAAoB,KAAK,CAAC,CAAA;AACvD;AAEO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,OAAO,iBAAA,CAAkB,GAAA,CAAI,mBAAA,CAAoB,KAAK,CAAC,CAAA;AACzD;AAEA,SAAS,WAAW,MAAA,EAA8B;AAChD,EAAA,MAAM,GAAA,GAAM,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,cAAA;AAClC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,IAAIC,iBAAA,CAAY,EAAE,MAAA,EAAQ,KAAK,CAAA;AACxC;AAQO,SAAS,sBAAsB,QAAA,EAA2C;AAC/E,EAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,SAAiB,QAAA,CAAS,IAAA;AACvD,EAAA,MAAM,QAAQ,QAAA,CAAS,UAAA,GAAa,CAAC,CAAA,EAAG,OAAA,EAAS,SAAS,EAAC;AAC3D,EAAA,OAAO,MACJ,MAAA,CAAO,CAAC,SAAS,CAAC,IAAA,CAAK,WAAW,OAAO,IAAA,CAAK,SAAS,QAAQ,CAAA,CAC/D,IAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA,CACvB,KAAK,EAAE,CAAA;AACZ;AAGA,eAAsB,qBAAqB,KAAA,EAMrB;AACpB,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AAClC,EAAA,MAAM,MAAM,MAAM,SAAA;AAAA,IAAU,MAC1B,EAAA,CAAG,OAAA,CAAQ,MAAA,CAAO;AAAA,MAChB,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,KAAK,KAAA,CAAM,QAAA;AAAA,MACX,MAAA,EAAQ,EAAE,WAAA,EAAa,KAAA,CAAM,eAAe,CAAA,iBAAA,EAAoB,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAG,KAC9E;AAAA,GACH;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,EAAM,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAC5E,EAAA,OAAO,GAAA;AACT;AAGA,eAAsB,kBAAkB,KAAA,EAGlB;AACpB,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AAClC,EAAA,OAAO,SAAA,CAAU,MAAM,EAAA,CAAG,OAAA,CAAQ,GAAA,CAAI,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAC,CAAA;AAC7D;;;AExFA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAGO,IAAM,gBAAA,GAA2C;AAAA,EACtD,gBAAA,EAAkB,gBAAA;AAAA,EAClB,gBAAA,EAAkB;AACpB,CAAA;AAEO,IAAM,oBAAA,GAAuB,gBAAA;AAEpC,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA;AACtC;AAGO,SAAS,qBAAqB,KAAA,EAAuB;AAC1D,EAAA,MAAM,IAAA,GAAO,kBAAkB,KAAK,CAAA;AACpC,EAAA,OAAO,gBAAA,CAAiB,IAAI,CAAA,IAAK,IAAA;AACnC;AAGO,SAAS,2BAA2B,KAAA,EAAuB;AAChE,EAAA,MAAM,IAAA,GAAO,kBAAkB,KAAK,CAAA;AACpC,EAAA,IAAI,IAAA,IAAQ,kBAAkB,OAAO,IAAA;AAErC,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,KAAK,CAAA,KAAM,KAAA,KAAU,IAAI,CAAA;AACjF,EAAA,IAAI,KAAA,EAAO,OAAO,KAAA,CAAM,CAAC,CAAA;AAEzB,EAAA,OAAO,IAAA;AACT;AASO,SAAS,sBAAsB,UAAA,EAAgD;AACpF,EAAA,MAAM,EAAA,GAAK,iBAAA,CAAkB,UAAU,CAAA,CAAE,WAAA,EAAY;AACrD,EAAA,IAAI,EAAA,CAAG,WAAW,UAAU,CAAA,SAAU,EAAE,aAAA,EAAeC,oBAAc,GAAA,EAAI;AACzE,EAAA,IAAI,GAAG,QAAA,CAAS,KAAK,GAAG,OAAO,EAAE,gBAAgB,GAAA,EAAI;AACrD,EAAA,OAAO,MAAA;AACT;;;ADlCA,IAAM,aAAA,GAAgB,oBAAA;AAsBtB,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,sCAAsC,CAAA;AACnE,EAAA,IAAI,SAAS,CAAC,CAAA,SAAU,MAAA,CAAO,CAAC,EAAE,IAAA,EAAK;AACvC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACjC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AACnC,EAAA,IAAI,KAAA,IAAS,KAAK,GAAA,GAAM,KAAA,SAAc,OAAA,CAAQ,KAAA,CAAM,KAAA,EAAO,GAAA,GAAM,CAAC,CAAA;AAClE,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,oBAAoB,IAAA,EAIlC;AAIA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,EACvC;AAGA,EAAA,IAAI,WAAW,IAAA,IAAQ,OAAO,WAAW,QAAA,IAAY,MAAA,CAAO,gBAAgB,MAAA,EAAW;AACrF,IAAA,MAAA,CAAO,cAAc,EAAC;AAAA,EACxB;AACA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,yBAAyB,KAAA,EAGf;AACxB,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,KAAA,CAAM,UAAU,CAAA;AAC7D,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,kBAAA;AAAA,IAClB,GAAI,MAAM,cAAA,GAAiB,EAAE,gBAAgB,KAAA,CAAM,cAAA,KAAmB,EAAC;AAAA,IACvE,GAAI,cAAA,GAAiB,EAAE,cAAA,KAAmB;AAAC,GAC7C;AACF;AAkBO,SAAS,kBAAkB,QAAA,EAAqD;AACrF,EAAA,MAAM,IAAA,GAAQ,QAAA,CAAS,aAAA,IACpB,QAAA,CAA+D,kBAChE,EAAC;AACH,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,oBAAA,IAAwB,CAAA;AAC/E,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,kBAAA,IAAsB,CAAA;AAAA;AAAA;AAAA,IAGjE,YAAA,EAAA,CAAe,IAAA,CAAK,oBAAA,IAAwB,IAAA,CAAK,0BAA0B,CAAA,IAAK,cAAA;AAAA,IAChF,cAAA;AAAA,IACA,WAAA,EAAa,IAAA,CAAK,eAAA,IAAmB,IAAA,CAAK,iBAAA,IAAqB;AAAA,GACjE;AACF;AAEA,eAAsB,wBAAwB,KAAA,EAKT;AACnC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,cAAA;AAC3C,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,YAAA,GAAe,0BAAA;AAAA,IACnB,KAAA,CAAM,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB;AAAA,GACnD;AACA,EAAA,MAAM,QAAA,GAAW,qBAAqB,YAAY,CAAA;AAClD,EAAA,MAAM,EAAA,GAAK,IAAID,iBAAAA,CAAY,EAAE,QAAQ,CAAA;AACrC,EAAA,MAAM,WAAW,MAAM,SAAA;AAAA,IAAU,MAC/B,EAAA,CAAG,MAAA,CAAO,eAAA,CAAgB;AAAA,MACxB,KAAA,EAAO,QAAA;AAAA,MACP,UAAU,KAAA,CAAM,MAAA;AAAA,MAChB,QAAQ,wBAAA,CAAyB;AAAA,QAC/B,UAAA,EAAY,QAAA;AAAA,QACZ,gBAAgB,KAAA,CAAM;AAAA,OACvB;AAAA,KACF;AAAA,GACH;AAEA,EAAA,MAAM,GAAA,GAAM,SAAS,IAAA,IAAQ,EAAA;AAC7B,EAAA,MAAM,MAAA,GAAS,oBAAoB,GAAG,CAAA;AAEtC,EAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC1D,IAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,EAAE,OAAO,YAAA,EAAc,GAAA,EAAK,QAAQ,KAAA,EAAO,iBAAA,CAAkB,QAAQ,CAAA,EAAE;AAChF;;;AEnJA,cAAA,EAAA;AAKA,WAAA,EAAA;;;ACLA,cAAA,EAAA;AAAA,IAAM,mBAAA,GAAsB,GAAA;AAQrB,IAAM,kBAAA,GAAyD;AAAA,EACpE,gBAAA,EAAkB,EAAE,KAAA,EAAO,CAAC,CAAA,EAAK,CAAG,CAAA,EAAG,MAAA,EAAQ,CAAC,EAAA,EAAM,EAAI,CAAA;AAC5D,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,WAAA,EAAa,EAAE,EAAE,WAAA,EAAY;AACpD;AAEA,SAAS,QAAA,CAAS,QAAgB,KAAA,EAA0C;AAC1E,EAAA,OAAO,UAAU,mBAAA,GAAsB,KAAA,CAAM,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AAC3D;AAEO,SAAS,oBAAoB,KAAA,EAA+C;AACjF,EAAA,MAAM,EAAA,GAAK,iBAAiB,KAAK,CAAA;AACjC,EAAA,IAAI,kBAAA,CAAmB,EAAE,CAAA,EAAG,OAAO,mBAAmB,EAAE,CAAA;AAExD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,GAAG,CAAA,KAAM,EAAA,CAAG,QAAA,CAAS,GAAG,CAAC,CAAA;AACjF,EAAA,OAAO,QAAQ,CAAC,CAAA;AAClB;AAKA,IAAM,cAAA,GAAiB,GAAA;AAEhB,SAAS,0BAAA,CACd,KAAA,EACA,WAAA,EACA,YAAA,EACA,OAA4B,aAAA,EACR;AACpB,EAAA,MAAM,OAAA,GAAU,oBAAoB,KAAK,CAAA;AACzC,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AAErB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,WAAA,EAAa,OAAA,CAAQ,KAAK,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,YAAA,EAAc,OAAA,CAAQ,MAAM,CAAA;AACxD,EAAA,MAAM,UAAA,GAAa,IAAA,KAAS,OAAA,GAAU,cAAA,GAAiB,CAAA;AAEvD,EAAA,OAAA,CACI,WAAA,GAAc,GAAA,GAAa,SAAA,GAC1B,YAAA,GAAe,MAAa,UAAA,IAC/B,UAAA;AAEJ;AAEO,SAAS,iBAAiB,MAAA,EAAwB;AACvD,EAAA,IAAI,MAAA,IAAU,KAAW,OAAO,CAAA,EAAA,CAAI,SAAS,GAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClE,EAAA,IAAI,MAAA,IAAU,KAAO,OAAO,CAAA,EAAA,CAAI,SAAS,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAC1D,EAAA,OAAO,OAAO,MAAM,CAAA;AACtB;AAEO,SAAS,UAAU,MAAA,EAAoC;AAC5D,EAAA,IAAI,MAAA,KAAW,QAAW,OAAO,KAAA;AACjC,EAAA,IAAI,UAAU,CAAA,EAAG,OAAO,IAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAC7C,EAAA,IAAI,UAAU,IAAA,EAAM,OAAO,IAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAChD,EAAA,OAAO,CAAA,CAAA,EAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAC9B;;;AChEA,cAAA,EAAA;AAGO,IAAM,YAAA,GAAuC;AAAA,EAClD,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,OAAA;AAAA,EACJ,EAAA,EAAI,WAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,OAAA,EAAS,oBAAA;AAAA,EACT,OAAA,EAAS,qBAAA;AAAA,EACT,EAAA,EAAI,YAAA;AAAA,EACJ,OAAA,EAAS,sBAAA;AAAA,EACT,EAAA,EAAI,UAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAEO,SAAS,yBAAA,CAA0B,YAAoB,MAAA,EAAwB;AACpF,EAAA,OAAO;AAAA,IACL,CAAA,wCAAA,EAA2C,UAAU,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,CAAA;AAAA,IAChE,iCAAA;AAAA,IACA,2CAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,GAAG,CAAA;AACZ;AAGO,SAAS,uBAAA,CACd,cAAA,EACA,UAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,eAAA,GAAkB,yBAAA,CAA0B,UAAA,EAAY,MAAM,CAAA;AACpE,EAAA,IAAI,CAAC,gBAAgB,OAAO,eAAA;AAC5B,EAAA,OAAO,GAAG,cAAc;;AAAA,EAAO,eAAe,CAAA,CAAA;AAChD;AAQA,IAAM,YAAA,GACJ,kGAAA;AAOF,SAAS,qBAAA,CAAsB,gBAAyB,YAAA,EAAoC;AAC1F,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,YAAA,KAAiB,cACpB,kDAAA,GACA,iCAAA;AAAA,EACN;AACA,EAAA,OAAO,YAAA,KAAiB,cACpB,6GAAA,GACA,0CAAA;AACN;AAaA,SAAS,yBAAyB,aAAA,EAAiC;AACjE,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,qBAAA;AAAA,IACA,6FAA6F,aAAa,CAAA,uJAAA;AAAA,GAC5G;AACF;AAEO,SAAS,2BAA2B,KAAA,EAShC;AACT,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,KAAA,CAAM,YAAY,KAAK,KAAA,CAAM,YAAA;AAC7D,EAAA,MAAM,kBAAA,GAAqB,uBAAA;AAAA,IACzB,MAAM,QAAA,CAAS,cAAA;AAAA,IACf,UAAA;AAAA,IACA,KAAA,CAAM;AAAA,GACR;AAGA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,YAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAI,KAAA,CAAM,QAAA,CAAS,OAAA,GAAU,CAAC,YAAA,EAAc,KAAA,CAAM,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA,GAAI,EAAC;AAAA,IAC3E,GAAI,KAAA,CAAM,YAAA,GAAe,CAAC,CAAA,UAAA,EAAa,MAAM,YAAY,CAAA,CAAA,EAAI,EAAE,CAAA,GAAI,EAAC;AAAA,IACpE,UAAA;AAAA,IACA,GAAG,MAAM,QAAA,CAAS,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IACjD,EAAA;AAAA,IACA,uCAAA;AAAA,IACA,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,uBAAA,EAAyB,MAAM,CAAC,CAAA;AAAA,IACrD,EAAA;AAAA,IACA,kBAAA;AAAA,IACA,KAAA,CAAM;AAAA,GACR;AAIA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,EAAA;AAAA,IACA,oBAAA;AAAA,IACA,kBAAA;AAAA,IACA,GAAI,KAAA,CAAM,YAAA,KAAiB,WAAA,GACvB;AAAA,MACE,CAAA,4BAAA,EAA+B,UAAU,CAAA,mBAAA,EAAsB,UAAU,CAAA,qDAAA;AAAA,QAE3E,EAAC;AAAA,IACL,EAAA;AAAA,IACA,kBAAA;AAAA,IACA,mCAAA;AAAA,IACA,qBAAA;AAAA,MACE,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,uBAAuB,EAAE,MAAA,GAAS,CAAA;AAAA,MACpD,KAAA,CAAM;AAAA,KACR;AAAA;AAAA;AAAA,IAGA,GAAI,KAAA,CAAM,aAAA,GAAgB,yBAAyB,KAAA,CAAM,aAAa,IAAI;AAAC,GAC7E;AAEA,EAAA,OAAO,CAAC,GAAG,MAAA,EAAQ,GAAG,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA;AACzC;;;AC/IA,cAAA,EAAA;AAIA,SAAS,eAAe,MAAA,EAA4C;AAClE,EAAA,MAAM,IAAA,GAAO,qBAAqB,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,YAAgB,MAAA,IAAU,OAAA,IAAW,IAAA,EAAM;AAC7C,IAAA,OAAQ,IAAA,CAAoC,KAAA;AAAA,EAC9C;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAAyC;AAC/D,EAAA,MAAM,IAAA,GAAO,qBAAqB,MAAM,CAAA;AACxC,EAAA,IACE,gBAAgB,MAAA,IAChB,SAAA,IAAa,QACZ,IAAA,CAAqD,IAAA,EAAM,SAAS,OAAA,EACrE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,kCAAkC,MAAA,EAA2C;AACpF,EAAA,MAAM,WAAA,GAAc,eAAe,MAAM,CAAA;AACzC,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,KAAA,GAAQ,0BAAA,CAA2B,WAAA,CAAY,OAAuB,CAAA;AAC5E,IAAA,IAAI,KAAA,EAAO,OAAOd,KAAAA,CAAE,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,cAAA,CAAe,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAO,2BAA2B,MAAM,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,IAAA;AACT;AAGO,SAAS,2BAA2B,MAAA,EAA0C;AACnF,EAAA,MAAM,KAAA,GAAQ,eAAe,MAAM,CAAA;AACnC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,MAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAChD,IAAA,MAAM,WAAA,GAAc,KAAA;AACpB,IAAA,MAAM,IAAA,GAAO,aAAa,WAAW,CAAA;AACrC,IAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,MAAA,GAAA,CAAI,GAAG,CAAA,GAAI,oBAAA,CAAqB,WAAW,CAAA;AAAA,IAC7C,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,MAAA,GAAS,kCAAkC,WAAW,CAAA;AAC5D,MAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,IAAA;AAC1C,EAAA,OAAOA,KAAAA,CAAE,OAAO,GAAG,CAAA;AACrB;AAUO,SAAS,yBAAA,CACd,QACA,YAAA,EACgC;AAChC,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,2BAA2B,MAAM,CAAA;AAEtD,IAAA,MAAM,aAAA,GAA8C;AAAA,MAClD,GAAI,YAAA,GAAe,EAAE,WAAA,EAAa,YAAA,KAAiB,EAAC;AAAA,MACpD,IAAA,EAAMA,MAAE,MAAA;AAAO,KACjB;AACA,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,aAAA,CAAc,IAAA,GAAOA,MAAE,MAAA,EAAO;AAAA,IAChC;AAEA,IAAA,MAAM,aAAaA,KAAAA,CAAE,YAAA,CAAaA,KAAAA,CAAE,MAAA,CAAO,aAAa,CAAA,EAAG;AAAA,MACzD,MAAA,EAAQ,eAAA;AAAA,MACR,eAAA,EAAiB,KAAA;AAAA,MACjB,EAAA,EAAI;AAAA,KACL,CAAA;AACD,IAAA,OAAO,UAAA,CAAW,OAAA;AAClB,IAAA,OAAO,UAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC3FA,cAAA,EAAA;AAeA,IAAM,uBAAA,GAA0B;AAAA,EAC9B,sKAAA;AAAA,EACA,iHAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,kBAAkB,YAAA,EAAsC;AAC/D,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,IAAA,OAAO;AAAA,MACL,qFAAA;AAAA,MACA,kGAAA;AAAA,MACA,4FAAA;AAAA,MACA,4JAAA;AAAA,MACA,4HAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,oDAA+C,CAAA;AACzD;AAEA,SAAS,YAAA,CACP,SACA,IAAA,EACoB;AACpB,EAAA,MAAM,KAAA,GAAQ,CAAC,OAAA,EAAS,OAAA,EAAS,MAAM,OAAO,CAAA,CAAE,OAAO,OAAO,CAAA;AAC9D,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,oBAAA,CACP,OAAA,EACA,IAAA,EACA,YAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,IAAA,EAAM,MAAA,IAAU,OAAA,EAAS,MAAA;AAAA,IACzC,OAAA,EAAS,YAAA,CAAa,OAAA,EAAS,IAAI,CAAA;AAAA,IACnC,KAAA,EAAO;AAAA,MACL,GAAG,uBAAA;AAAA,MACH,GAAI,OAAA,EAAS,KAAA,IAAS,EAAC;AAAA,MACvB,GAAI,IAAA,EAAM,KAAA,IAAS,EAAC;AAAA,MACpB,GAAG,kBAAkB,YAAY;AAAA,KACnC;AAAA,IACA,KAAA,EAAO,IAAA,EAAM,KAAA,IAAS,OAAA,EAAS;AAAA,GACjC;AACF;AAGO,SAAS,sBAAA,CACd,QACA,IAAA,EACyB;AACzB,EAAA,OAAO,qBAAqB,MAAA,CAAO,SAAA,EAAW,IAAA,CAAK,SAAA,EAAW,KAAK,YAAY,CAAA;AACjF;;;ACnEA,cAAA,EAAA;AAIO,SAAS,gBAAgB,KAAA,EAA2B;AACzD,EAAA,OAAO,MAAM,MAAA,CACV,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAG,MAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,IAAK,QAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CACtE,KAAK,IAAI,CAAA;AACd;AAGO,SAAS,6BAAA,CACd,gBACA,MAAA,EACyB;AACzB,EAAA,OAAO,gBAAA,CAAiB,gBAAgB,MAAM,CAAA;AAChD;AAGO,SAAS,6BAAA,CACd,KAAA,EACA,iBAAA,EACA,UAAA,EACmF;AACnF,EAAA,MAAM,WAAA,GAAc,6BAAA,CAA8B,iBAAA,EAAmB,UAAU,CAAA;AAC/E,EAAA,MAAM,MAAA,GAAS,yBAAA;AAAA,IACb,WAAA;AAAA,IACA,KAAA,CAAM,WAAA;AAAA,IACN;AAAA,GACF;AACA,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,SAAA,CAAU,MAAM,CAAA;AAC1C,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EAC3D;AACA,EAAA,OAAO,EAAE,EAAA,EAAI,IAAA,EAAM,WAAA,EAAY;AACjC;;;AL+EO,SAAS,mBAAmB,IAAA,EAMxB;AACT,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAA,IAAgB,EAAA;AAC7D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,IAAW,EAAA;AAC9C,EAAA,OAAO,GAAG,WAAW,CAAA,EAAA,EAAS,MAAM,CAAA,EAAA,EAAS,KAAK,MAAM,CAAA,CAAA;AAC1D;AAEO,SAAS,gBAAA,CACd,SACA,UAAA,EACyB;AACzB,EAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IACb,CAAC,QAAQ,MAAA,KAAW;AAClB,MAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,CAAA;AAAA,WAAA,IAC3B,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAA,IAAW,CAAA;AAAA,kBAC/B,UAAA,IAAc,CAAA;AAE1B,MAAA,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,KAAA,EAAO,WAAA,IAAe,CAAA;AACnD,MAAA,MAAA,CAAO,YAAA,IAAgB,MAAA,CAAO,KAAA,EAAO,YAAA,IAAgB,CAAA;AACrD,MAAA,MAAA,CAAO,gBAAA,IAAoB,OAAO,gBAAA,IAAoB,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IACA;AAAA,MACE,UAAA,EAAY,CAAA;AAAA,MACZ,OAAA,EAAS,CAAA;AAAA,MACT,MAAA,EAAQ,CAAA;AAAA,MACR,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,gBAAA,EAAkB,CAAA;AAAA,MAClB;AAAA;AACF,GACF;AACF;AAEO,SAAS,qBAAqB,KAAA,EAAwB;AAC3D,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,IAAA,IAAI,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,OAAO,OAAO,KAAA,CAAM,OAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,qCAAqC,CAAA;AACpE,EAAA,IAAI,QAAA,GAAW,CAAC,CAAA,EAAG;AACjB,IAAA,OAAO,QAAA,CAAS,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAQ,GAAG,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,OAAA,CAAQ,SAAS,GAAA,GAAM,CAAA,EAAG,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,MAAA,CAAA,GAAM,OAAA;AAC9D;AAEA,SAAS,mBAAA,CAAoB,OAAuB,MAAA,EAAwB;AAC1E,EAAA,MAAM,KAAK,KAAA,CAAM,WAAA;AACjB,EAAA,KAAA,MAAW,GAAA,IAAO,CAAC,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,GAAG,GAAG,CAAA;AACpB,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,IAAQ,OAAO,KAAA;AAAA,EACxD;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,YACd,IAAA,EACgE;AAChE,EAAA,OAAO;AAAA,IACL,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK;AAAA,GACf;AACF;AAyBO,SAAS,kBAAA,CACd,MAAA,EACA,IAAA,EACA,OAAA,EACA,SAAA,EACgB;AAChB,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,IAAA,CAAK,WAAW,CAAA;AAC/D,EAAA,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB,IAAA,CAAK,WAAW,CAAA,CAAE,CAAA;AAErE,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,KAAK,MAAM,CAAA;AACtD,EAAA,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,CAAA,uBAAA,EAA0B,IAAA,CAAK,MAAM,CAAA,CAAE,CAAA;AAEnE,EAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,OAAA,CAAQ,WAAA,EAAa,QAAQ,IAAI,CAAA;AAEzE,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,eAAe,EAAA,EAAI,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AACrE,EAAA,EAAA,CAAG,KAAA,EAAM;AAET,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,QAAA,IAAY,QAAA,CAAS,YAAY,aAAA,EAAe;AACpE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,GAAG,YAAY,IAAI,CAAA;AAAA,QACnB,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,OAAA;AAAA,QACR,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA;AAC3B,KACF;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,GAAoB,sBAAA,CAAuB,MAAA,EAAQ,IAAI,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,iBAAA,CAAkB,KAAA;AAEjD,EAAA,MAAM,SAAS,0BAAA,CAA2B;AAAA,IACxC,QAAA,EAAU,iBAAA;AAAA,IACV,cAAc,IAAA,CAAK,MAAA;AAAA,IACnB,YAAA,EAAc,mBAAA,CAAoB,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,IACpD,yBAAyB,OAAA,CAAQ,WAAA;AAAA,IACjC,QAAQ,OAAA,CAAQ,IAAA;AAAA,IAChB,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,eAAe,IAAA,CAAK;AAAA,GACrB,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,yBAAA,CAA0B,IAAA,CAAK,MAAA,EAAQ,KAAK,YAAY,CAAA;AAE/E,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,QAAA,EAAU;AAAA,MACR,IAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAc,QAAA,EAAU,IAAA;AAAA,MACxB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,gBAAgB,cAAA,IAAkB;AAAA;AACpC,GACF;AACF;AASO,SAAS,mBAAA,CACd,MAAA,EACA,QAAA,EACA,MAAA,EAKA,OAAA,EACqB;AACrB,EAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,SAAQ,GAAI,QAAA;AACvC,EAAA,MAAM,IAAA,GAAO,YAAY,IAAI,CAAA;AAE7B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GACJ,IAAA,CAAK,YAAA,KAAiB,WAAA,GACjB,MAAA,CAAO,MAAA,CAAO,IAAA,IAAQ,QAAA,CAAS,YAAA,IAAgB,IAAA,CAAK,MAAA,GACrD,IAAA,CAAK,MAAA;AACX,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,aAAa,CAAA;AAC3E,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAU,aAAY,GAAI,yBAAA,CAA0B,SAAS,WAAW,CAAA;AACtF,IAAA,MAAM,YAAA,GACJ,YAAY,WAAA,GAAc,EAAE,MAAM,OAAA,EAAS,EAAA,EAAI,IAAA,EAAM,WAAA,EAAY,GAAI,KAAA,CAAA;AAEvE,IAAA,MAAM,YAAY,6BAAA,CAA8B,KAAA,EAAO,OAAO,MAAA,CAAO,WAAA,EAAa,KAAK,MAAM,CAAA;AAC7F,IAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAA,CAAU,KAAK,CAAA,CAAE,CAAA;AAAA,IACrE;AAEA,IAAA,MAAM,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,aAAY,GAAI,4BAAA;AAAA,MACtD,OAAO,MAAA,CAAO;AAAA,KAChB;AAEA,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,EAAQ,WAAW,CAAA;AAC7C,IAAA,MAAM,UAAA,GACJ,QAAQ,UAAA,IACR,gBAAA;AAAA,MACE,MAAA;AAAA,MACA;AAAA,QACE,aAAa,IAAA,CAAK,EAAA;AAAA,QAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAQ,QAAA,CAAS,aAAA;AAAA,QACjB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,MAAM,OAAA,CAAQ;AAAA,OAChB;AAAA,MACA;AAAA,KACF;AACF,IAAA,iBAAA,CAAkB,OAAA,EAAS;AAAA,MACzB,aAAa,IAAA,CAAK,EAAA;AAAA,MAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,IAAA;AAAA,MACA,aAAa,SAAA,CAAU,WAAA;AAAA,MACvB,IAAA,EAAM,cAAA;AAAA,MACN,QAAQ,QAAA,CAAS,aAAA;AAAA,MACjB,YAAA,EAAA,iBAAc,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MACrC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd;AAAA,KACD,CAAA;AACD,IAAA,OAAA,CAAQ,KAAA,EAAM;AAEd,IAAA,MAAM,gBAAA,GAAmB,0BAAA;AAAA,MACvB,0BAAA,CAA2B,OAAO,KAAK,CAAA;AAAA,MACvC,OAAO,KAAA,CAAM,WAAA;AAAA,MACb,OAAO,KAAA,CAAM,YAAA;AAAA,MACb,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,gBAAA;AAAA,MACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,SAAA;AAAA,MACjC,YAAA;AAAA,MACA,aAAa,WAAA,IAAe,KAAA;AAAA,KAC9B;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,KAAA,EAAO,qBAAqB,KAAK,CAAA;AAAA,MACjC,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ;AAAA,KACnC;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,QAAA,EAAuC;AACrE,EAAA,OAAO,0BAAA;AAAA,IACL,QAAA,CAAS,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,kBAAA,IAAsB;AAAA,GACtD;AACF;;;AN1UO,IAAM,oBAAA,GAAuB,GAAA;AAC7B,IAAM,wBAAA,GAA2B,KAAK,IAAA,GAAO,IAAA;AAEpD,IAAM,eAAA,GAAkB,GAAA;AACxB,IAAM,WAAA,GAAc,GAAA;AACpB,IAAM,mBAAA,GAAsB,GAAA;AAE5B,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACzD;AAgBO,SAAS,cAAwC,OAAA,EAAiC;AACvF,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAiB;AACrC,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AACxC,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAAA,iBACd,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,CAAC,KAAK,CAAC,CAAA;AAAA,EAC1C;AAEA,EAAA,MAAM,QAA2B,EAAC;AAClC,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,OAAA,EAAS;AACvC,IAAA,IAAI,UAAe,EAAC;AACpB,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,UAAA,CAAW,KAAA,CAAM,QAAQ,MAAM,CAAA;AACnD,MAAA,IACE,OAAA,CAAQ,SAAS,CAAA,KAChB,OAAA,CAAQ,UAAU,oBAAA,IAAwB,YAAA,GAAe,OAAO,wBAAA,CAAA,EACjE;AACA,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,QAAA,EAAU,OAAA,EAAS,SAAS,CAAA;AACzC,QAAA,OAAA,GAAU,EAAC;AACX,QAAA,YAAA,GAAe,CAAA;AAAA,MACjB;AACA,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAClB,MAAA,YAAA,IAAgB,IAAA;AAAA,IAClB;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,CAAA;AAAA,EACnE;AACA,EAAA,OAAO,KAAA;AACT;AAaO,SAAS,qBAAqB,MAAA,EAAwC;AAC3E,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,WAAW,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,qBAAqB,EAAE,CAAA;AACpC,EAAA,MAAM,YAAA,GAAe,sBAAsB,EAAE,CAAA;AAC7C,EAAA,EAAA,CAAG,KAAA,EAAM;AACT,EAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,KAAS,kBAAA,CAAmB,IAAI,CAAC,CAAC,CAAA;AACjF,EAAA,OAAO,EAAE,IAAA,EAAM,YAAA,EAAc,YAAA,EAAa;AAC5C;AAcA,eAAsB,kBAAA,CAEpB,QAAsB,KAAA,EAAiD;AACvE,EAAA,MAAM,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,UAAS,GAAI,KAAA;AACnD,EAAA,MAAM,GAAA,GAAM,MAAM,oBAAA,CAAqB;AAAA,IACrC,OAAO,IAAA,CAAK,QAAA;AAAA,IACZ,UAAU,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAC,EAAE,UAAS,MAAO;AAAA,MAC5C,UAAU,QAAA,CAAS,MAAA;AAAA,MACnB,QAAQ,wBAAA,CAAyB;AAAA,QAC/B,YAAY,IAAA,CAAK,QAAA;AAAA,QACjB,gBAAgB,QAAA,CAAS;AAAA,OAC1B;AAAA,KACH,CAAE,CAAA;AAAA,IACF,WAAA,EAAa,CAAA,iBAAA,EAAA,iBAAoB,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA,EAAI,WAAW,CAAC,CAAA;AAAA,GAChG,CAAA;AAED,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,WAAW,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,eAAe,EAAA,EAAI;AAAA,IAC/B,SAAS,GAAA,CAAI,IAAA;AAAA,IACb,OAAO,IAAA,CAAK,QAAA;AAAA,IACZ,YAAA;AAAA,IACA,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,mBAAmB,CAAA;AAAA,IAC9C;AAAA,GACD,CAAA;AACD,EAAA,gBAAA;AAAA,IACE,EAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAE,QAAA,IAAY,YAAA,MAAkB;AAAA,MAChD,YAAA;AAAA,MACA,WAAA,EAAa,SAAS,IAAA,CAAK,WAAA;AAAA,MAC3B,MAAA,EAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,MACtB,MAAA,EAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,MACtB,QAAQ,QAAA,CAAS,aAAA;AAAA;AAAA;AAAA,MAGjB,UAAA,EAAY,gBAAA;AAAA,QACV,MAAA;AAAA,QACA;AAAA,UACE,WAAA,EAAa,SAAS,IAAA,CAAK,WAAA;AAAA,UAC3B,MAAA,EAAQ,SAAS,IAAA,CAAK,MAAA;AAAA,UACtB,QAAQ,QAAA,CAAS,aAAA;AAAA,UACjB,WAAA,EAAa,SAAS,OAAA,CAAQ,WAAA;AAAA,UAC9B,IAAA,EAAM,SAAS,OAAA,CAAQ;AAAA,SACzB;AAAA,QACA;AAAA;AACF,KACF,CAAE;AAAA,GACJ;AACA,EAAA,MAAM,GAAA,GAAmB;AAAA,IACvB,EAAA,EAAI,KAAA;AAAA,IACJ,UAAU,GAAA,CAAI,IAAA;AAAA,IACd,OAAO,IAAA,CAAK,QAAA;AAAA,IACZ,aAAA,EAAe,YAAA;AAAA,IACf,UAAA,EAAY,SAAA;AAAA,IACZ,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,KAAA,IAAS,mBAAmB,CAAA;AAAA,IAC9C,YAAA,EAAc;AAAA,GAChB;AACA,EAAA,EAAA,CAAG,KAAA,EAAM;AAET,EAAA,KAAA,CAAM,UAAA,GAAa;AAAA,IACjB,IAAA,EAAM,iBAAA;AAAA,IACN,MAAM,GAAA,CAAI,IAAA;AAAA,IACV,KAAA,EAAO,KAAK,OAAA,CAAQ,MAAA;AAAA,IACpB,KAAA,EAAO,YAAA;AAAA,IACP,QAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAcA,SAAS,kBAAA,CACP,MAAA,EACA,EAAA,EACA,MAAA,EACA,OAAA,EACqB;AACrB,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,OAAA,CAAQ,YAAY,CAAA;AACnE,EAAA,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAA,qBAAA,EAAwB,OAAA,CAAQ,YAAY,CAAA,CAAE,CAAA;AAEzE,EAAA,IAAI,KAAA,GAA+B,cAAA,CAAe,MAAA,EAAQ,IAAA,EAAM,QAAQ,OAAO,CAAA;AAC/E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,EAAA,EAAI,OAAA,CAAQ,WAAW,CAAA;AACtD,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,0BAAA,EAA6B,OAAA,CAAQ,WAAW,CAAA,eAAA,EAAkB,QAAQ,OAAO,CAAA;AAAA,OACnF;AAAA,IACF;AACA,IAAA,KAAA,GAAQ;AAAA,MACN,MAAM,OAAA,CAAQ,OAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,OAAA;AAAA,MAChB,QAAQ,MAAA,CAAO,aAAA;AAAA,MACf,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA;AAAA,MACjD,SAAS,QAAA,CAAS;AAAA,KACpB;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAA4B;AAAA,IAChC,aAAa,OAAA,CAAQ,YAAA;AAAA,IACrB,QAAQ,OAAA,CAAQ,OAAA;AAAA,IAChB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,MAAA,EAAQ,SAAA;AAAA,IACR,eAAe,OAAA,CAAQ;AAAA,GACzB;AACA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA;AAAA,IAEA,SAAS,EAAE,WAAA,EAAa,MAAM,WAAA,EAAwC,IAAA,EAAM,MAAM,OAAA,EAAQ;AAAA,IAC1F,eAAe,OAAA,CAAQ,OAAA;AAAA,IACvB,YAAA,EAAc,eAAe,EAAA,EAAI,IAAA,CAAK,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,MAAM,CAAA,EAAG,IAAA;AAAA,IAC5E,OAAO,MAAA,CAAO,aAAA;AAAA,IACd,MAAA,EAAQ,EAAA;AAAA,IACR,cAAA,EAAgB;AAAA,GAClB;AACF;AAcO,SAAS,cAAA,CACd,MAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,EAC8B;AAC9B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,KAAA,IAAS,SAAS,CAAA;AAChD,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,WAAW,CAAA;AACxC,EAAA,IAAI,CAAC,uBAAA,CAAwB,EAAA,EAAI,MAAA,CAAO,EAAA,EAAI,KAAA,EAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAa,CAAA,EAAG;AAC5E,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,EAAA,EAAI,MAAA,CAAO,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,SAAS,CAAA;AAC7F,EAAA,MAAM,UAAiC,EAAC;AAExC,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,EAAuB,OAAA,EAAiB,SAAA,KAA4B;AACpF,IAAA,MAAM,MAAA,GAA8B;AAAA,MAClC,aAAa,OAAA,CAAQ,YAAA;AAAA,MACrB,QAAQ,OAAA,CAAQ,OAAA;AAAA,MAChB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,IAAA;AAAA,MACR,KAAA,EAAO,oBAAA,CAAqB,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MAC9C,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KAC3B;AACA,IAAA,qBAAA,CAAsB,IAAI,MAAA,CAAO,EAAA,EAAI,QAAQ,aAAA,EAAe,QAAA,EAAU,OAAO,KAAK,CAAA;AAClF,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,IAAA,QAAA,GAAW,MAAM,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,IAAI,sBAAA,CAAuB,KAAK,CAAA,EAAG;AACjC,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,IAAA,EAAM,gBAAA,IAAoB,EAAC;AACtD,IAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,aAAa,CAAA;AAC/C,MAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,KAAA,IAAS,CAAC,QAAQ,QAAA,EAAU;AAClD,QAAA,QAAA;AAAA,UACE,OAAA;AAAA,UACA,OAAA,EAAS,KAAA,EAAO,OAAA,KACb,OAAA,GAAU,gCAAA,GAAmC,wBAAA,CAAA;AAAA,UAChD;AAAA,SACF;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,QAAA,MAAM,GAAA,GAAM,sBAAsB,QAAQ,CAAA;AAC1C,QAAA,MAAM,MAAA,GAAS,oBAAoB,GAAG,CAAA;AACtC,QAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AAC1D,UAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,QAC5D;AACA,QAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,MAAA,EAAQ,EAAA,EAAI,QAAQ,OAAO,CAAA;AAC/D,QAAA,MAAA,GAAS,mBAAA;AAAA,UACP,MAAA;AAAA,UACA,QAAA;AAAA,UACA,EAAE,OAAO,MAAA,CAAO,aAAA,EAAe,QAAQ,KAAA,EAAO,iBAAA,CAAkB,QAAQ,CAAA,EAAE;AAAA,UAC1E,EAAE,QAAA,EAAU,OAAA,EAAS,SAAA,EAAW,UAAA,EAAY,QAAQ,WAAA;AAAY,SAClE;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,QAAA,CAAS,OAAA,EAAS,iBAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,MAAA,CAAO,KAAK,GAAG,SAAS,CAAA;AACnF,QAAA;AAAA,MACF;AACA,MAAA,qBAAA;AAAA,QACE,EAAA;AAAA,QACA,MAAA,CAAO,EAAA;AAAA,QACP,OAAA,CAAQ,aAAA;AAAA,QACR,MAAA,CAAO,SAAS,QAAA,GAAW,MAAA;AAAA,QAC3B,MAAA,CAAO;AAAA,OACT;AACA,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,MAAA,QAAA,GAAW,MAAM,CAAA;AAAA,IACnB;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,UACJ,QAAA,CAAS,KAAA,EAAO,WAAW,CAAA,yBAAA,EAA4B,mBAAA,CAAoB,KAAK,CAAC,CAAA,CAAA;AACnF,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,KAAA,MAAW,WAAW,YAAA,EAAc;AAClC,MAAA,QAAA,CAAS,OAAA,EAAS,SAAS,SAAS,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,EAAA,CAAG,KAAA,EAAM;AACT,EAAA,OAAO,OAAA;AACT;AAOA,eAAsB,sBAAA,CACpB,MAAA,EACA,IAAA,EACA,OAAA,GAII,EAAC,EACU;AACf,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,MAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,CAAC,KAAK,QAAA,MAAc,EAAE,GAAA,EAAK,QAAA,EAAS,CAAE,CAAA;AAC9D,EAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC/B,EAAA,IAAI,KAAA,GAAQ,eAAA;AACZ,EAAA,IAAI,UAAA,GAAa,IAAA;AAIjB,EAAA,MAAM,UAAA,GAAa,CAAC,GAAA,KAA6B;AAC/C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAC7C,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,GAAI,IAAA,CAAK,KAAI,GAAI,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,WAAA;AAAA,EAC/E,CAAA;AAEA,EAAA,OAAO,MAAA,CAAO,SAAS,CAAA,EAAG;AACxB,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,MAAM,KAAK,CAAA;AACjB,MAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,mBAAA,EAAqB,WAAW,CAAA;AAAA,IAC3D;AACA,IAAA,UAAA,GAAa,KAAA;AAEb,IAAA,KAAA,MAAW,OAAA,IAAW,CAAC,GAAG,MAAM,CAAA,EAAG;AACjC,MAAA,MAAM,QAAA,GAAqB,MAAM,iBAAA,CAAkB,EAAE,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA;AACjF,MAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,QAAA,CAAS,KAAK,CAAA;AAChD,MAAA,OAAA,CAAQ,UAAA,GAAa;AAAA,QACnB,IAAA,EAAM,eAAA;AAAA,QACN,IAAA,EAAM,QAAQ,GAAA,CAAI,QAAA;AAAA,QAClB,KAAA;AAAA,QACA,SAAA,EAAW,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAAA,QACjC,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB;AAAA,OACD,CAAA;AACD,MAAA,IAAI,oBAAA,CAAqB,QAAA,CAAS,KAAK,CAAA,EAAG;AACxC,QAAA,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,OAAO,GAAG,CAAC,CAAA;AACxC,QAAA,MAAM,OAAA,GAAU,cAAA;AAAA,UACd,MAAA;AAAA,UACA,OAAA,CAAQ,GAAA;AAAA,UACR,QAAA;AAAA,UACA,OAAA,CAAQ;AAAA,SACV;AACA,QAAA,IAAI,YAAY,IAAA,EAAM;AAGpB,UAAA,OAAA,CAAQ,UAAA,GAAa;AAAA,YACnB,IAAA,EAAM,YAAA;AAAA,YACN,IAAA,EAAM,QAAQ,GAAA,CAAI,QAAA;AAAA,YAClB,KAAA;AAAA,YACA,KAAA,EAAO,QAAQ,GAAA,CAAI,aAAA;AAAA,YACnB,KAAA,EAAO,CAAA;AAAA,YACP,UAAU,OAAA,CAAQ,QAAA;AAAA,YAClB,QAAA;AAAA,YACA,UAAA,EAAY,CAAA;AAAA,YACZ,MAAA,EAAQ,CAAA;AAAA,YACR,WAAA,EAAa,CAAA;AAAA,YACb,YAAA,EAAc,CAAA;AAAA,YACd,gBAAA,EAAkB,CAAA;AAAA,YAClB,SAAA,EAAW,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAAA,YACjC,eAAA,EAAiB;AAAA,WAClB,CAAA;AACD,UAAA;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,UAAA,GAAa;AAAA,UACnB,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM,QAAQ,GAAA,CAAI,QAAA;AAAA,UAClB,KAAA;AAAA,UACA,KAAA,EAAO,QAAQ,GAAA,CAAI,aAAA;AAAA,UACnB,OAAO,OAAA,CAAQ,MAAA;AAAA,UACf,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,QAAA;AAAA,UACA,UAAA,EAAY,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAAA,UAC3D,QAAQ,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA;AAAA,UACxC,WAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,KAAA,EAAO,WAAA,IAAe,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,UAC5E,YAAA,EAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,KAAA,EAAO,YAAA,IAAgB,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,UAC9E,gBAAA,EAAkB,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,IAAO,CAAA,CAAE,gBAAA,IAAoB,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,UAC/E,SAAA,EAAW,UAAA,CAAW,OAAA,CAAQ,GAAG;AAAA,SAClC,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAGO,SAAS,mBAAA,CACd,IAAA,EACA,KAAA,EACA,SAAA,EACqB;AACrB,EAAA,OAAO;AAAA,IACL,GAAG,YAAY,IAAI,CAAA;AAAA,IACnB,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,qBAAqB,KAAK,CAAA;AAAA,IACjC,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,GAC3B;AACF;;;AF7aA,eAAe,OAAA,CACb,KAAA,EACA,WAAA,EACA,MAAA,EACe;AACf,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAA,CAAM,MAAM,CAAA,EAAE,EAAG,YAAY;AACtF,IAAA,OAAO,SAAA,GAAY,MAAM,MAAA,EAAQ;AAC/B,MAAA,MAAM,KAAA,GAAQ,SAAA,EAAA;AACd,MAAA,MAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,EAAI,KAAK,CAAA;AAAA,IACnC;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAM,OAAA,CAAQ,IAAI,OAAO,CAAA;AAC3B;AAEA,SAAS,aAAa,IAAA,EAAmC;AACvD,EAAA,OAAO,CAAA,EAAG,KAAK,WAAW,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA;AAC1D;AAUO,SAAS,kBAAA,CACd,QACA,aAAA,EACuB;AACvB,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,MAAA,KAAW;AAC5B,IAAA,MAAM,GAAA,GAAM,mBAAmB,MAAM,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,GAAA,CAAI,GAAG,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,MAAA,EAAQ,UAAU,MAAA,IAAU,SAAA;AAAA,MAC5B,aAAA,EAAe,UAAU,aAAA,IAAiB,EAAA;AAAA,MAC1C,cAAc,QAAA,EAAU,YAAA;AAAA,MACxB,aAAA,EAAe,OAAO,KAAA,IAAS;AAAA,KACjC;AAAA,EACF,CAAC,CAAA;AACH;AAWA,eAAsB,aAAA,CACpB,MAAA,EACA,UAAA,EACA,OAAA,EAYe;AACf,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,MAAM,YAAA,GACJ,OAAA,CAAQ,YAAA,KACP,CAAC,SACA,aAAA,CAAc,MAAA,EAAQ,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA,CAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,IAAA,MAAM,OAAA,CAAQ,UAAA,EAAY,OAAA,CAAQ,WAAA,EAAa,OAAO,IAAA,KAAS;AAC7D,MAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,MAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAChB,MAAA,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,QAAQ,CAAC,GAAG,MAAM,CAAA,EAAG,CAAA;AACtE,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AACtC,MAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,MAAA,OAAA,CAAQ,SAAS,MAAM,CAAA;AAAA,IACzB,CAAC,CAAA;AACD,IAAA;AAAA,EACF;AAKA,EAAA,MAAM,UAAsF,EAAC;AAC7F,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,EAAQ,IAAA,EAAM,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,KAAA,EAAO,IAAA,EAAK,EAAG,aAAa,CAAA;AACrG,MAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,QAAA,OAAA,CAAQ,QAAA,CAAS,QAAQ,MAAM,CAAA;AAAA,MACjC,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,QAAA,EAAU,oBAAA,CAAqB,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,UAChE,MAAA,EAAQ,QAAQ,QAAA,CAAS,MAAA;AAAA,UACzB,UAAU,OAAA,CAAQ;AAAA,SACnB,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,QAAA,CAAS,mBAAA,CAAoB,IAAA,EAAM,KAAA,EAAO,aAAa,CAAC,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,cAAc,OAAO,CAAA;AACnC,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC9B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,EAAM,SAAA,KAAc;AACnC,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,mBAAmB,MAAA,EAAQ;AAAA,UACtC,IAAA;AAAA,UACA,YAAA,EAAc,0BAAA,CAA2B,IAAA,CAAK,QAAQ,CAAA;AAAA,UACtD,QAAA,EAAU,SAAA;AAAA,UACV,UAAU,KAAA,CAAM,MAAA;AAAA,UAChB,YAAY,OAAA,CAAQ;AAAA,SACrB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,UAAA,OAAA,CAAQ,SAAS,mBAAA,CAAoB,KAAA,CAAM,SAAS,IAAA,EAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,QAC7E;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,MAAM,aAAa,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,KAA4B,QAAQ,MAAS,CAAA;AAClF,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,sBAAA,CAAuB,QAAQ,UAAA,EAAY;AAAA,MAC/C,UAAU,UAAA,CAAW,MAAA;AAAA,MACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,UAAU,OAAA,CAAQ;AAAA,KACnB,CAAA;AAAA,EACH;AACF;AAOA,eAAsB,aAAA,CACpB,MAAA,EACA,IAAA,EACA,OAAA,GAAiE,EAAC,EACpC;AAC9B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,kBAAA,CAAmB,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,SAAS,CAAA;AAAA,EAC/D,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,mBAAA,CAAoB,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAQ,OAAO,OAAA,CAAQ,MAAA;AAC9C,EAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AAEzB,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAO;AAAA,MACL,GAAG,YAAY,IAAI,CAAA;AAAA,MACnB,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,uBAAA,CAAwB;AAAA,MAC3C,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,gBAAgB,QAAA,CAAS;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO,mBAAA;AAAA,MACL,MAAA;AAAA,MACA,QAAA;AAAA,MACA,EAAE,OAAO,MAAA,CAAO,KAAA,EAAO,QAAQ,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAA,EAAM;AAAA,MAClE,EAAE,QAAA,EAAU,aAAA,EAAe,SAAA;AAAU,KACvC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,mBAAA,CAAoB,IAAA,EAAM,KAAA,EAAO,SAAS,CAAA;AAAA,EACnD;AACF;AAYA,SAAS,qBAAA,CACP,OACA,UAAA,EACiB;AACjB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAoB;AAC1C,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU,SAAA,CAAU,IAAI,kBAAA,CAAmB,IAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC7E,EAAA,MAAM,KAAA,GAA6C,IAAI,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AACzE,EAAA,MAAM,SAAgC,EAAC;AAEvC,EAAA,OAAO;AAAA,IACL,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA;AACrD,MAAA,IAAI,IAAA,KAAS,UAAa,KAAA,CAAM,IAAI,MAAM,MAAA,EAAW,KAAA,CAAM,IAAI,CAAA,GAAI,MAAA;AAAA,WAC9D,MAAA,CAAO,KAAK,MAAM,CAAA;AACvB,MAAA,UAAA,GAAa,EAAE,IAAA,EAAM,WAAA,EAAa,MAAA,EAAQ,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,OAAO;AAAA,QACL,GAAG,KAAA,CAAM,MAAA,CAAO,CAAC,MAAA,KAA0C,WAAW,MAAS,CAAA;AAAA,QAC/E,GAAG;AAAA,OACL;AAAA,IACF;AAAA,GACF;AACF;AAWA,eAAsB,iBAAA,CACpB,MAAA,EACA,KAAA,EACA,OAAA,GAOI,EAAC,EAC2B;AAChC,EAAA,MAAM,IAAA,GAAsB,QAAQ,IAAA,IAAQ,OAAA;AAC5C,EAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAG3B,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,UAAA,GAAa;AAAA,MACnB,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,WAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf;AAAA,KACD,CAAA;AACD,IAAA,MAAMgB,QAAAA,GAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAClC,MAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,EAAQ,IAAA,EAAM,SAAS,aAAa,CAAA;AACvE,QAAA,OAAO,OAAA,CAAQ,MAAA,KAAW,MAAA,GACtB,OAAA,CAAQ,MAAA,GACR;AAAA,UACE,GAAG,YAAY,IAAI,CAAA;AAAA,UACnB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,QAAQ,QAAA,CAAS,KAAA;AAAA,UACxB,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SAC3B;AAAA,MACN,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,mBAAA,CAAoB,IAAA,EAAM,KAAA,EAAO,aAAa,CAAA;AAAA,MACvD;AAAA,IACF,CAAC,CAAA;AACD,IAAA,KAAA,MAAW,MAAA,IAAUA,UAAS,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,WAAA,EAAa,QAAQ,CAAA;AAChF,IAAA,MAAMC,UAAS,gBAAA,CAAiBD,QAAAA,EAAS,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AAC/D,IAAA,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAAA,QAAAA,EAAS,MAAA,EAAAC,SAAQ,CAAA;AACtD,IAAA,OAAOD,QAAAA;AAAA,EACT;AAKA,EAAA,MAAM,OAAA,GAAU,qBAAqB,MAAM,CAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,IAAI,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,kBAAA,CAAmB,IAAI,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,iBAAA,GAAoB,QAAQ,YAAA,CAAa,MAAA;AAAA,IAC7C,CAAC,IAAA,KAAS,CAAC,UAAU,GAAA,CAAI,kBAAA,CAAmB,IAAI,CAAC;AAAA,GACnD,CAAE,MAAA;AAEF,EAAA,OAAA,CAAQ,UAAA,GAAa;AAAA,IACnB,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,MAAM,MAAA,GAAS,iBAAA;AAAA,IACtB,WAAA;AAAA,IACA,MAAA,EAAQ,KAAA;AAAA,IACR,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf;AAAA,GACD,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,KAAA,EAAO,OAAA,CAAQ,UAAU,CAAA;AACjE,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,OAAA,CAAQ,YAAA,CAAa,GAAA,CAAI,kBAAA,CAAmB,IAAI,CAAC,CAAC,CAAA;AAE5F,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAC5D,IAAA,eAAA,CAAgB,QAAQ,IAAA,EAAM,aAAA,EAAe,QAAQ,IAAA,CAAK,MAAA,EAAQ,QAAQ,UAAU,CAAA;AACpF,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,IAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,MAChB,OAAA,CAAQ,SAAA,EAAW,WAAA,EAAa,OAAO,IAAA,KAAS;AAC9C,QAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,QAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAChB,QAAA,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,QAAQ,CAAC,GAAG,MAAM,CAAA,EAAG,CAAA;AACtE,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,MAAA,EAAQ,MAAM,OAAO,CAAA;AACxD,QAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AACnB,QAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,MACvB,CAAC,CAAA;AAAA,MACD,QAAQ,IAAA,CAAK,MAAA,GAAS,IAClB,sBAAA,CAAuB,MAAA,EAAQ,QAAQ,IAAA,EAAM;AAAA,QAC3C,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,UAAU,SAAA,CAAU;AAAA,OACrB,CAAA,GACD,OAAA,CAAQ,OAAA;AAAQ,KACrB,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,MAAM,UAAsF,EAAC;AAC7F,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,aAAA,GAAgB,KAAK,GAAA,EAAI;AAC/B,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,EAAQ,IAAA,EAAM,SAAS,aAAa,CAAA;AACvE,QAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,UAAA,SAAA,CAAU,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,QAC/B,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,QAAA,EAAU,oBAAA,CAAqB,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,YAChE,MAAA,EAAQ,QAAQ,QAAA,CAAS,MAAA;AAAA,YACzB,UAAU,OAAA,CAAQ;AAAA,WACnB,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,CAAU,IAAA,CAAK,mBAAA,CAAoB,IAAA,EAAM,KAAA,EAAO,aAAa,CAAC,CAAA;AAAA,MAChE;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,cAAc,OAAO,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,CAAK,MAAA,GAAS,KAAA,CAAM,MAAA;AAC7C,IAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AAC5D,IAAA,eAAA,CAAgB,OAAA,CAAQ,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,QAAQ,UAAU,CAAA;AAIzE,IAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,MAC9B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,EAAM,SAAA,KAAc;AACnC,QAAA,IAAI;AACF,UAAA,OAAO,MAAM,mBAAmB,MAAA,EAAQ;AAAA,YACtC,IAAA;AAAA,YACA,YAAA,EAAc,0BAAA,CAA2B,IAAA,CAAK,QAAQ,CAAA;AAAA,YACtD,QAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,MAAA,GAAS,SAAA;AAAA,YAChC,QAAA;AAAA,YACA,YAAY,OAAA,CAAQ;AAAA,WACrB,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,KAAA,MAAW,KAAA,IAAS,KAAK,OAAA,EAAS;AAChC,YAAA,SAAA,CAAU,KAAK,mBAAA,CAAoB,KAAA,CAAM,SAAS,IAAA,EAAM,KAAA,EAAO,SAAS,CAAC,CAAA;AAAA,UAC3E;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF,CAAC;AAAA,KACH;AAEA,IAAA,MAAM,UAAA,GAA4B;AAAA,MAChC,GAAG,OAAA,CAAQ,IAAA;AAAA,MACX,GAAG,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,KAA4B,QAAQ,MAAS;AAAA,KACpE;AACA,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,sBAAA,CAAuB,QAAQ,UAAA,EAAY;AAAA,QAC/C,QAAA;AAAA,QACA,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,UAAU,SAAA,CAAU;AAAA,OACrB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,UAAU,QAAA,EAAS;AAKvC,EAAA,MAAM,SAAS,WAAA,CAAY,MAAA,CAAO,CAAC,MAAA,KAAW,OAAO,MAAM,CAAA;AAC3D,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAMC,UAAS,gBAAA,CAAiB,WAAA,EAAa,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AACnE,IAAA,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,WAAA,EAAa,MAAA,EAAAA,SAAQ,CAAA;AACnE,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,aAAA,EAAe,QAAQ,CAAA;AAEpD,EAAA,MAAM,gBAAgB,IAAI,GAAA;AAAA,IACxB,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,CAAC,kBAAA,CAAmB,IAAI,CAAA,EAAG,IAAI,CAAC;AAAA,GACtD;AACA,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,MAAA,EAAQ,aAAa,CAAA;AAC3D,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAiC;AACxD,EAAA,MAAM,aAAA,CAAc,QAAQ,UAAA,EAAY;AAAA,IACtC,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,WAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,MAAA,UAAA,CAAW,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAA,EAAG,MAAM,CAAA;AACjD,MAAA,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,WAAA,EAAa,QAAQ,CAAA;AAAA,IACpD;AAAA,GACD,CAAA;AAID,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,KAAW;AAC1C,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAO,MAAA;AAC3B,IAAA,OAAO,UAAA,CAAW,GAAA,CAAI,kBAAA,CAAmB,MAAM,CAAC,CAAA,IAAK,MAAA;AAAA,EACvD,CAAC,CAAA;AACD,EAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,MAAA,CAAO,CAAC,QAAA,KAAa;AACpD,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,kBAAA,CAAmB,QAAQ,CAAC,CAAA;AAC3D,IAAA,OAAO,YAAY,MAAA,IAAa,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,OAAA,CAAQ,OAAA;AAAA,EAC9D,CAAC,CAAA,CAAE,MAAA;AAEH,EAAA,MAAM,SAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AAC/D,EAAA,OAAA,CAAQ,aAAa,EAAE,IAAA,EAAM,QAAQ,OAAA,EAAS,MAAA,EAAQ,mBAAmB,CAAA;AACzE,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,QAAsB,IAAA,EAA0C;AACzF,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,2BAAW,GAAA,EAAI;AACtC,EAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AACvC,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,cAAA,CAAe,IAAI,GAAA,CAAI,EAAE,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,SAAS,EAAE,MAAM,CAAA;AAAA,EAC5F;AACA,EAAA,EAAA,CAAG,KAAA,EAAM;AACT,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,IAAA,EACA,MAAA,EACA,QAAA,EACA,UAAA,EACM;AACN,EAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,GAAA,EAAK,QAAA,KAAa;AAC9B,IAAA,UAAA,GAAa;AAAA,MACX,IAAA,EAAM,iBAAA;AAAA,MACN,MAAM,GAAA,CAAI,QAAA;AAAA,MACV,KAAA,EAAO,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,CAAA;AAAA,MAC7B,OAAO,GAAA,CAAI,aAAA;AAAA,MACX,QAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS,IAAA;AAAA,MACT,WAAW,GAAA,CAAI;AAAA,KAChB,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAOA,eAAsB,qBAAA,CACpB,MAAA,EACA,OAAA,GAAoE,EAAC,EAC9B;AACvC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,OAAA,GAAU,qBAAqB,MAAM,CAAA;AAC3C,EAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEtC,EAAA,OAAA,CAAQ,UAAA,GAAa;AAAA,IACnB,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,QAAQ,YAAA,CAAa,MAAA;AAAA,IAC5B,WAAA,EAAa,CAAA;AAAA,IACb,MAAA,EAAQ,KAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACP,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,IAAI,CAAA;AACrD,EAAA,eAAA,CAAgB,QAAQ,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAA,CAAK,MAAA,EAAQ,QAAQ,UAAU,CAAA;AAE7E,EAAA,MAAM,UAAiC,EAAC;AACxC,EAAA,MAAM,sBAAA,CAAuB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM;AAAA,IACjD,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,MAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnB,MAAA,OAAA,CAAQ,UAAA,GAAa,EAAE,IAAA,EAAM,WAAA,EAAa,QAAQ,CAAA;AAAA,IACpD;AAAA,GACD,CAAA;AAED,EAAA,MAAM,SAAS,gBAAA,CAAiB,OAAA,EAAS,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AAC/D,EAAA,OAAA,CAAQ,aAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,QAAQ,CAAA;AACtD,EAAA,OAAO,OAAA;AACT;;;AcvhBA,cAAA,EAAA;;;ACAA,cAAA,EAAA;AAeO,SAAS,YAAA,CAAa,aAAsC,OAAA,EAAyB;AAC1F,EAAA,OAAOX,uBAAAA,CAAO,SAAA,CAAU,OAAA,EAAS,WAAW,CAAA;AAC9C;;;ADYA,SAAS,mBAAmB,GAAA,EAA2B;AACrD,EAAA,OAAQ,IAAI,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAG,CAAA,CAAA;AAC7C;AAGO,SAAS,iBAAiB,YAAA,EAA8B;AAC7D,EAAA,MAAM,MAAA,GAAS,WAAW,YAAY,CAAA;AACtC,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AACxC;AAMO,SAAS,oBAAA,CACd,OAAA,EACA,OAAA,GAA6D,EAAC,EACpD;AACV,EAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,EAAA,MAAM,aAAa,OAAA,CAAQ,KAAA,GAAQ,IAAI,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAC5D,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAE9B,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,SAAA,EAAU,EAAG;AACtC,IAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA,EAAG;AAClC,IAAA,IAAI,cAAc,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAC5C,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,IAAA,CAAK,MAAA,CAAO,IAAK,CAAA;AAClD,IAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,CAAA,CAAG,CAAA;AACvB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACrC,MAAA,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,EAAK;AACzB;AAGO,SAAS,qBAAA,CACd,OAAA,EACA,OAAA,GAAwC,EAAC,EACtB;AACnB,EAAA,MAAM,EAAE,QAAO,GAAI,OAAA;AACnB,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,OAAA,CAAQ,SAAA,IAAa,MAAM,CAAA;AAChE,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,MAAA,CAAO,OAAA;AAC1C,EAAA,MAAM,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,IAAA;AACvD,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,KAAA;AACjD,EAAA,MAAM,aAAa,OAAA,CAAQ,KAAA,GAAQ,IAAI,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,GAAI,IAAA;AAE5D,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,MAAM,UAAA,GAAa,iBAAiB,MAAM,CAAA;AAE1C,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,SAAA,EAAU,EAAG;AACtC,IAAA,IAAI,CAAC,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA,EAAG;AAClC,IAAA,IAAI,cAAc,CAAC,UAAA,CAAW,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG;AAE5C,IAAA,MAAM,YAAA,GAAe,KAAK,MAAA,CAAO,IAAA;AACjC,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,EAAK;AACtB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,aAAa,CAAA;AAC1C,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,KAAA,MAAW,KAAA,IAAS,KAAA,CAAM,MAAA,CAAO,MAAA,EAAO,EAAG;AACzC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,MAAM,MAAM,CAAA;AAChD,QAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACxB,QAAA,IAAI,iBAAA,IAAqB,SAAS,gBAAA,EAAkB;AACpD,QAAA,IAAI,cAAA,IAAkB,QAAA,CAAS,QAAA,CAAS,OAAA,EAAS;AAEjD,QAAA,MAAM,MAAM,QAAA,CAAS,QAAA;AACrB,QAAA,MAAM,WAAA,GAAc,CAAA,EAAG,GAAA,CAAI,IAAI,GAAG,SAAS,CAAA,CAAA;AAC3C,QAAA,MAAM,OAAA,GAAU,UAAA,CAAW,WAAA,CAAY,YAAA,EAAc,aAAa,MAAM,CAAA;AAExE,QAAA,GAAA,CAAI,IAAA,CAAK;AAAA,UACP,YAAA,EAAc,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA;AAAA,UAC7B,OAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,QAAQ,GAAA,CAAI,MAAA;AAAA,UACZ,MAAA,EAAQ,YAAA,CAAa,GAAA,CAAI,WAAA,EAAa,IAAI,OAAO;AAAA,SAClD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA;AACT;;;AElHA,cAAA,EAAA;AAcA,SAAS,cAAc,GAAA,EAAmB;AACxC,EAAA,IAAIV,oBAAAA,CAAG,UAAA,CAAW,GAAG,CAAA,EAAG;AACtB,IAAAA,oBAAAA,CAAG,OAAO,GAAA,EAAK,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,EACjD;AACF;AAGO,SAAS,qBAAA,CACd,OAAA,EACA,OAAA,GAAwC,EAAC,EAC+B;AACxE,EAAA,MAAM,MAAA,GAASC,sBAAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,UAAU,QAAQ,CAAA;AACtD,EAAA,MAAM,aAAa,OAAA,CAAQ,KAAA;AAE3B,EAAA,KAAA,MAAW,IAAA,IAAQ,qBAAqB,OAAA,EAAS;AAAA,IAC/C,KAAA,EAAO,UAAA;AAAA,IACP,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA,EAAG;AACF,IAAA,aAAA,CAAcA,sBAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,EACvC;AAEA,EAAA,MAAM,OAAA,GAAU,qBAAA,CAAsB,OAAA,EAAS,OAAO,CAAA;AACtD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,IAAA,MAAM,QAAA,GAAWA,sBAAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,KAAK,YAAY,CAAA;AACpD,IAAAD,oBAAAA,CAAG,UAAUC,sBAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxD,IAAAD,oBAAAA,CAAG,aAAA,CAAc,QAAA,EAAU,IAAA,CAAK,QAAQ,MAAM,CAAA;AAC9C,IAAA,MAAM,MAAM,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,KAAK,MAAM,CAAA,CAAA;AACzC,IAAA,MAAA,CAAO,IAAI,GAAA,EAAA,CAAM,MAAA,CAAO,IAAI,GAAG,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,EAC5C;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,IAAA,EAAK,EAAG;AACvD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EAClC;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,MAAA,EAAO;AAC5C;;;ACnDA,cAAA,EAAA;AAIA,IAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,YAAY,CAAA;AAGhC,SAAS,eAAe,GAAA,EAAmB;AAChD,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,MAAM,UAAUC,sBAAAA,CAAK,IAAA;AAAA;AAAA,MAAiC,GAAA;AAAA,MAAK;AAAA,KAAI;AAC/D,IAAA,IAAI,CAACD,oBAAAA,CAAG,UAAA,CAAW,OAAO,CAAA,EAAG;AAC7B,IAAAsB,uBAAA,CAAO,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,OAAO,CAAA;AAAA,EAClD;AACF;;;ACbA,cAAA,EAAA;AAMA,WAAA,EAAA;AAiBA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,MAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,MAAM,OAAO,CAAA;AAC1B;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,OAAO,mBAAmB,KAAK,CAAA;AACjC;AAEA,SAAS,UAAU,MAAA,EAA2B;AAC5C,EAAA,MAAM,MAAA,GAAoC;AAAA,IACxC,MAAA,EAAQ,IAAA;AAAA,IACR,YAAA,EAAc,IAAA;AAAA,IACd,KAAA,EAAO,OAAA;AAAA,IACP,OAAA,EAAS;AAAA,GACX;AACA,EAAA,OAAO,+BAA+B,MAAM,CAAA,uBAAA,EAA0B,MAAM,CAAA,SAAA,EAAY,MAAA,CAAO,MAAM,CAAC,CAAA,OAAA,CAAA;AACxG;AAEA,SAAS,cAAA,CACP,MAAA,EACA,EAAA,EACA,IAAA,EACA,QACA,MAAA,EACsB;AACtB,EAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACnC,IAAA,OAAO,EAAE,QAAQ,QAAA,EAAS;AAAA,EAC5B;AACA,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AACxD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AACA,EAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,KAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AACzD,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,OAAA,CAAQ,WAAA,EAAa,QAAQ,IAAI,CAAA;AACzE,EAAA,MAAM,MAAM,cAAA,CAAe,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,MAAM,CAAA;AACtD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,aAAA,EAAc;AAAA,EAC5C;AACA,EAAA,IAAI,GAAA,CAAI,YAAY,aAAA,EAAe;AACjC,IAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,YAAA,EAAc,IAAI,OAAA,EAAQ;AAAA,EACrE;AACA,EAAA,OAAO,EAAE,MAAA,EAAQ,YAAA,EAAc,aAAA,EAAe,YAAA,EAAc,IAAI,OAAA,EAAQ;AAC1E;AAEA,SAAS,kBAAA,CACP,IAAA,EACA,MAAA,GAAS,EAAA,EAC8B;AACvC,EAAA,MAAM,OAA8C,EAAC;AACrD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,MAAM,UAAU,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAC9C,IAAA,IAAI,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxE,MAAA,IAAA,CAAK,IAAA,CAAK,GAAG,kBAAA,CAAmB,KAAA,EAAkC,OAAO,CAAC,CAAA;AAAA,IAC5E,CAAA,MAAO;AACL,MAAA,MAAM,OAAA,GACJ,OAAO,KAAA,KAAU,QAAA,GACb,KAAA,GACA,KAAA,KAAU,MAAA,GACR,EAAA,GACA,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA;AACrC,MAAA,IAAA,CAAK,KAAK,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,SAAS,CAAA;AAAA,IAC5C;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,mBAAmB,MAAA,EAA6D;AACvF,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,iBAAiB,MAAM,CAAA,CACpB,MAAA,CAAO,CAACjB,WAAUA,MAAAA,CAAM,IAAA,KAAS,cAAc,CAAA,CAC/C,IAAI,CAACA,MAAAA,KAAUA,OAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC;AAAA,GACxC;AACF;AAEA,SAAS,sBAAA,CACP,aACA,MAAA,EACQ;AACR,EAAA,MAAM,YAAA,GAAe,mBAAmB,MAAM,CAAA;AAC9C,EAAA,MAAM,OAAO,kBAAA,CAAmB,WAAW,CAAA,CACxC,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,IAAA,MAAM,OAAO,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,GAAG,IACjC,CAAA,kDAAA,CAAA,GACA,CAAA,gDAAA,CAAA;AACJ,IAAA,OAAO,CAAA;AAAA,sBAAA,EACW,IAAI,CAAA,EAAG,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,sBAAA,EAC1B,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,WAAA,CAAA;AAAA,EAEzC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,EAAA,OAAO,CAAA;AAAA,WAAA,EACI,QAAQ,CAAA,gDAAA,CAA6C,CAAA;AAAA,UAAA,CAAA;AAElE;AAEA,SAAS,wBAAwB,QAAA,EAAiC;AAChE,EAAA,IAAI,cAAuC,EAAC;AAC5C,EAAA,IAAI;AACF,IAAA,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AACN,IAAA,WAAA,GAAc,EAAC;AAAA,EACjB;AACA,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,WAAW,CAAA,CAC1C,GAAA;AAAA,IACC,CAAC,GAAA,KACC,CAAA,kBAAA,EAAqB,UAAA,CAAW,GAAA,CAAI,GAAG,CAAC,CAAA,mBAAA,EAAsB,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA,UAAA;AAAA,GACvF,CACC,KAAK,EAAE,CAAA;AACV,EAAA,OAAO,4BAA4B,MAAM,CAAA;AAAA,sBAAA,EACnB,UAAA,CAAW,QAAA,CAAS,IAAI,CAAC,CAAA,MAAA,CAAA;AACjD;AAEA,SAAS,8BAAA,CACP,UACA,aAAA,EACQ;AACR,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,CAAA,6DAAA,CAAA;AAAA,EACT;AACA,EAAA,MAAM,SAAA,GACJ,iBAAiB,aAAA,KAAkB,QAAA,CAAS,UACxC,CAAA,sDAAA,EAAyD,UAAA,CAAW,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA,IAAA,EAAO,WAAW,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA,MAAA,CAAA,GAC/I,EAAA;AACN,EAAA,OAAO,CAAA;AAAA,0BAAA,EACmB,SAAS,EAAE,CAAA;AAAA,yBAAA,EACZ,WAAW,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,qCAAA,EAChC,WAAW,QAAA,CAAS,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA;AAAA,EAAA,EAE5E,SAAS;AAAA,2DAAA,EACgD,uBAAA,CAAwB,QAAQ,CAAC,CAAA,UAAA,CAAA;AAC9F;AAEA,SAAS,aACP,KAAA,EACA,IAAA,EACA,OAAA,EACA,OAAA,GAAqC,EAAC,EAC9B;AACR,EAAA,MAAM,YAAY,OAAA,CACf,SAAA,EAAU,CACV,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,EAAA,KAAO,OAAA,CAAQ,eAAe,SAAA,GAAY,EAAA;AAC9D,IAAA,OAAO,sBAAsB,MAAM,CAAA,cAAA,EAAiB,iBAAA,CAAkB,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,iCAAA,EACjD,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gCAAA,EAC9B,UAAA,CAAW,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,UAAA,CAAA;AAAA,EAEjD,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAKE,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EA6JM,aAAa,CAAA,wDAAA,CAAqD,CAAA;AAAA;AAAA;AAAA,2BAAA,EAGvE,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AAKjC;AAEA,SAAS,uBAAA,CAAwB,aAAsC,MAAA,EAAwB;AAC7F,EAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,IAAA,IAAQ,OAAO,KAAA;AACtD,EAAA,OAAO,MAAA;AACT;AAGA,eAAsB,WAAA,CACpB,OAAA,EACA,OAAA,GAA4C,EAAC,EAC9B;AACf,EAAA,MAAM,GAAA,GAAM,IAAIkB,SAAA,EAAK;AACrB,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AAEvB,EAAA,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,CAAC,CAAA,KAAM;AAClB,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,IAAA,MAAM,OAAO,OAAA,CAAQ,SAAA,EAAU,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS;AAC7C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA;AAC5B,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,CACxB,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,KAAW,MAAA,CAAO,aAAa,CAAA,CAClD,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,QAAA,MAAM,aAAa,yBAAA,CAA0B,EAAA,EAAI,IAAA,CAAK,EAAA,EAAI,MAAM,CAAA,CAAE,MAAA;AAClE,QAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AAAA,UACrB,CAAC,IAAA,KACC,IAAA,CAAK,WAAA,KAAgB,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW;AAAA,SAC9E,CAAE,MAAA;AACF,QAAA,MAAM,UAAU,QAAA,CAAS,MAAA;AAAA,UACvB,CAAC,IAAA,KACC,IAAA,CAAK,WAAA,KAAgB,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,KAAW,MAAA,IAAU,IAAA,CAAK,MAAA,KAAW;AAAA,SAC9E,CAAE,MAAA;AACF,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,KAAA,GAAQ,CAAA,2BAAA,EAA8B,KAAK,CAAA,QAAA,CAAA,GAAa,EAAA;AAAA,UACxD,OAAA,GAAU,CAAA,0BAAA,EAA6B,OAAO,CAAA,QAAA,CAAA,GAAa;AAAA,SAC7D,CAAE,KAAK,EAAE,CAAA;AACT,QAAA,OAAO,CAAA,IAAA,EAAO,UAAU,CAAA,EAAG,IAAI,CAAA,KAAA,CAAA;AAAA,MACjC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,MAAA,OAAO,CAAA;AAAA,2BAAA,EACgB,iBAAA,CAAkB,KAAK,EAAE,CAAC,KAAK,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,wBAAA,EAC/D,UAAA,CAAW,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,YAAA,EAC/B,OAAO,CAAA;AAAA,QAAA,EACX,WAAW;AAAA,WAAA,CAAA;AAAA,IAEjB,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,CAC1B,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,OAAO,aAAa,CAAA,CACxC,IAAI,CAAC,CAAA,KAAM,OAAO,UAAA,CAAW,CAAC,CAAC,CAAA,KAAA,CAAO,CAAA,CACtC,KAAK,EAAE,CAAA;AACV,IAAA,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA,sDAAA,EAEuC,aAAa,CAAA;AAAA,eAAA,EACpD,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,cAAA,CAAA;AAE1B,IAAA,OAAO,EAAE,IAAA,CAAK,YAAA,CAAa,UAAA,EAAY,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACvD,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,WAAA,EAAa,CAAC,CAAA,KAAM;AAC1B,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,uCAAA,CAAA,EAA2C,OAAO,GAAG,GAAG,CAAA;AAAA,IAClG;AAEA,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,IAAA,MAAM,WAAA,GAAc,OAAA,CACjB,GAAA,CAAI,CAAC,MAAA,KAAW,CAAA,IAAA,EAAO,UAAA,CAAW,MAAM,CAAC,CAAA,KAAA,CAAO,CAAA,CAChD,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,MAAM,OAAO,IAAA,CACV,IAAA,EAAK,CACL,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,KAAA,GAAQ,uBAAA,CAAwB,GAAA,CAAI,WAAA,EAAwC,IAAI,IAAI,CAAA;AAC1F,MAAA,MAAM,WAAA,GAAc,OAAA,CACjB,GAAA,CAAI,CAAC,MAAA,KAAW;AACf,QAAA,MAAM,EAAE,QAAO,GAAI,cAAA,CAAe,QAAQ,EAAA,EAAI,IAAA,EAAM,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AACpE,QAAA,OAAO,CAAA,IAAA,EAAO,SAAA,CAAU,MAAM,CAAC,CAAA,KAAA,CAAA;AAAA,MACjC,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,MAAA,OAAO,CAAA;AAAA,0CAAA,EAC6B,iBAAA,CAAkB,MAAM,CAAC,CAAA,KAAA,EAAQ,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,cAAA,EACjH,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,UAAA,EACrB,WAAW;AAAA,aAAA,CAAA;AAAA,IAEjB,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,EAAA,CAAG,KAAA,EAAM;AAET,IAAA,MAAM,IAAA,GAAO,CAAA;AAAA,+DAAA,EAC2C,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC;AAAA;AAAA;AAAA,8CAAA,EAGzC,WAAW,CAAA;AAAA,eAAA,EAC1C,IAAA,IAAQ,CAAA,iBAAA,EAAoB,CAAA,GAAI,OAAA,CAAQ,MAAM,CAAA,oCAAA,CAAsC,CAAA;AAAA,cAAA,CAAA;AAEjG,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,EAAE,YAAA,EAAc,MAAA,EAAQ,CAAC,CAAA;AAAA,EACxF,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,uBAAA,EAAyB,CAAC,CAAA,KAAM;AACtC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,CAAA;AACnC,IAAA,MAAM,SAAS,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,QAAQ,KAAK,MAAA,CAAO,aAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,KAAM,GAAA;AACvC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,OAAO,EAAE,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA,uCAAA,CAAA,EAA2C,OAAO,GAAG,GAAG,CAAA;AAAA,IAClG;AAEA,IAAA,MAAM,EAAA,GAAK,SAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,EAAQ,IAAA,CAAK,QAAQ,MAAM,CAAA;AACxD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,OAAO,CAAA,CAAE,IAAA;AAAA,QACP,aAAa,WAAA,EAAa,CAAA,wEAAA,EAA2E,WAAW,MAAM,CAAC,QAAQ,OAAA,EAAS;AAAA,UACtI,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,QACD;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CACvB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,MAAA,MAAM,EAAE,QAAO,GAAI,cAAA,CAAe,QAAQ,EAAA,EAAI,IAAA,EAAM,QAAQ,GAAG,CAAA;AAC/D,MAAA,MAAM,MAAA,GAAS,GAAA,KAAQ,MAAA,GAAS,SAAA,GAAY,EAAA;AAC5C,MAAA,MAAM,IAAA,GAAO,CAAA,MAAA,EAAS,iBAAA,CAAkB,MAAM,CAAC,CAAA,KAAA,EAAQ,iBAAA,CAAkB,MAAM,CAAC,CAAA,QAAA,EAAW,iBAAA,CAAkB,GAAG,CAAC,CAAA,CAAA;AACjH,MAAA,OAAO,CAAA,aAAA,EAAgB,MAAM,CAAA,QAAA,EAAW,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,GAAG,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,MAAM,CAAC,CAAA,IAAA,CAAA;AAAA,IACvF,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,IAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACnC,MAAA,YAAA,GAAe,CAAA;AAAA;AAAA,kCAAA,EAEe,uBAAuB,KAAA,CAAM,WAAA,EAAwC,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA;AAAA,0BAAA,EAEhG,UAAA,CAAW,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,YAAA,CAAA;AAAA,IAEjD,CAAA,MAAO;AACL,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,EAAA,EAAI,MAAA,EAAQ,QAAQ,MAAM,CAAA;AAC7D,MAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,YAAA,EAAa,GAAI,eAAe,MAAA,EAAQ,EAAA,EAAI,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAE/F,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,gBAAgB,CAAA;AAC9D,QAAA,MAAM,kBAAA,GAAqB,UACvB,cAAA,GACA,yBAAA,CAA0B,gBAAgB,KAAA,CAAM,WAAA,EAAwC,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAC9G,QAAA,MAAM,SAAA,GAAY,OAAA,GACd,CAAA,yCAAA,EAAyC,iBAAA,CAAkB,MAAM,CAAC,CAAA,mBAAA,CAAA,GAClE,CAAA,yCAAA,EAAyC,iBAAA,CAAkB,MAAM,CAAC,CAAA,sBAAA,CAAA;AACtE,QAAA,YAAA,GAAe,CAAA;AAAA,+CAAA,EAC0B,SAAS,CAAA;AAAA,oCAAA,EACpB,sBAAA,CAAuB,kBAAA,EAAoB,IAAA,CAAK,MAAA,CAAO,MAAM,CAAC,CAAA;AAAA;AAAA,4BAAA,EAEtE,UAAA,CAAW,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,cAAA,CAAA;AAElD,QAAA,SAAA,GAAY,CAAA;AAAA,6BAAA,EACW,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA,4BAAA,EAClB,UAAA,CAAW,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,iCAAA,EACxB,WAAW,WAAA,CAAY,aAAA,CAAc,MAAM,CAAA,EAAG,EAAE,CAAC,CAAC,CAAA;AAAA,2BAAA,EACxD,UAAA,CAAW,WAAA,CAAY,IAAI,CAAC,CAAA;AAAA,8BAAA,EACzB,WAAW,aAAA,EAAe,KAAA,CAAM,CAAA,EAAG,EAAE,KAAK,QAAG,CAAC,CAAA,GAAA,EAAM,UAAA,CAAW,cAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,IAAK,QAAG,CAAC,CAAA;AAAA,aAAA,CAAA;AAEzH,QAAA,MAAM,QAAA,GACJ,YAAY,WAAA,IAAe,IAAA,GACvB,cAAc,EAAA,EAAI,WAAA,CAAY,WAAW,CAAA,GACzC,MAAA;AACN,QAAA,YAAA,GAAe,CAAA;AAAA;AAAA,oCAAA,EAEe,8BAAA,CAA+B,QAAA,EAAU,aAAa,CAAC,CAAA;AAAA,cAAA,CAAA;AAAA,MAEvF,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,CAAA,uDAAA,EAA0D,UAAA,CAAW,MAAM,CAAC,CAAA,KAAA,CAAA;AAC3F,QAAA,SAAA,GAAY,CAAA,oCAAA,EAAuC,SAAA,CAAU,MAAM,CAAC,CAAA,UAAA,CAAA;AAAA,MACtE;AAAA,IACF;AAEA,IAAA,EAAA,CAAG,KAAA,EAAM;AAET,IAAA,MAAM,KAAA,GAAQ,uBAAA,CAAwB,KAAA,CAAM,WAAA,EAAwC,MAAM,CAAA;AAC1F,IAAA,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA,uBAAA,EAEQ,iBAAA,CAAkB,MAAM,CAAC,CAAA,EAAA,EAAK,WAAW,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,cAAA,EACpE,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA;AAAA,wBAAA,EAER,UAAU,CAAA;AAAA,MAAA,EAC5B,SAAS;AAAA,MAAA,EACT,YAAY;AAAA,MAAA,EACZ,YAAY,CAAA,CAAA;AAEhB,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,IAAA,EAAM,SAAS,EAAE,YAAA,EAAc,MAAA,EAAQ,CAAC,CAAA;AAAA,EAC5E,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,YAAA,EAAc,CAAC,CAAA,KAAM;AAC3B,IAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,SACV,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,CACZ,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,IAAA,GAAO,CAAA,MAAA,EAAS,iBAAA,CAAkB,IAAA,CAAK,WAAW,CAAC,CAAA,KAAA,EAAQ,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAC,CAAA,QAAA,EAAW,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAC,CAAA,CAAA;AACxI,MAAA,OAAO,CAAA;AAAA,cAAA,EACC,UAAA,CAAW,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,oCAAA,EACN,IAAI,CAAA,EAAA,EAAK,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,cAAA,EACtD,UAAA,CAAW,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,cAAA,EACvB,UAAU,IAAA,CAAK,MAAA,KAAW,OAAA,GAAU,OAAA,GAAU,SAAS,CAAC,CAAA;AAAA,aAAA,CAAA;AAAA,IAElE,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,MAAM,IAAA,GAAO,CAAA,sDAAA,EAAsD,QAAA,CAAS,MAAM,CAAA;AAAA;AAAA;AAAA,eAAA,EAGrE,QAAQ,CAAA,wDAAA,CAA0D,CAAA;AAAA,cAAA,CAAA;AAE/E,IAAA,OAAO,EAAE,IAAA,CAAK,YAAA,CAAa,WAAA,EAAa,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,EACxD,CAAC,CAAA;AAED,EAAA,GAAA,CAAI,GAAA,CAAI,uBAAA,EAAyB,CAAC,CAAA,KAAM;AACtC,IAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,IAAA,MAAM,SAAiD,EAAC;AACxD,IAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,SAAA,EAAU,EAAG;AACtC,MAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,GAAI,EAAC;AACnB,MAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,QAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACrC,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,CAAG,MAAM,IAAI,QAAA,CAAS,MAAA;AAAA,UAClC,CAAC,IAAA,KAAS,IAAA,CAAK,gBAAgB,IAAA,CAAK,EAAA,IAAM,KAAK,MAAA,KAAW;AAAA,SAC5D,CAAE,MAAA;AAAA,MACJ;AAAA,IACF;AACA,IAAA,OAAO,CAAA,CAAE,KAAK,MAAM,CAAA;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,IAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,WAAA;AAC7B,EAAAC,gBAAA,CAAM,EAAE,OAAO,GAAA,CAAI,KAAA,EAAO,MAAM,QAAA,EAAU,IAAA,IAAQ,MAAM;AACtD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kCAAA,EAAqC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EACjE,CAAC,CAAA;AACH;;;AC3kBA,cAAA,EAAA;AAeA,SAAS,aAAA,GAAyB;AAChC,EAAA,OAAO,QAAQ,KAAA,CAAM,KAAA,KAAU,IAAA,IAAQ,OAAA,CAAQ,OAAO,KAAA,KAAU,IAAA;AAClE;AAEA,SAAS,kBAAkB,MAAA,EAAgC;AACzD,EAAA,OAAO,OAAO,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,MAAA,KAAW,OAAO,aAAa,CAAA;AAC1E;AAEA,eAAe,UAAa,MAAA,EAAgC;AAC1D,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,MAAA;AAAA,EACf,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBC,sBAAA,EAAmB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AACtD,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAEA,eAAe,kBAAkB,MAAA,EAAmD;AAClF,EAAA,OAAO,SAAA;AAAA,IACLC,cAAA,CAA2B;AAAA,MACzB,OAAA,EAAS,2BAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,mBAAA,EAAqB,KAAA,EAAO,MAAA,EAAU;AAAA,QAC9C,GAAG,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,IAAA,EAAM,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,IAAG,CAAE;AAAA;AACnE,KACD;AAAA,GACH;AACF;AAGA,IAAM,WAAA,0BAAqB,aAAa,CAAA;AACxC,IAAM,YAAA,0BAAsB,cAAc,CAAA;AAE1C,eAAe,oBAAoB,MAAA,EAAmE;AACpG,EAAA,MAAM,OAAA,GAAU,kBAAkB,MAAM,CAAA;AACxC,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,CAAA,EAAG,OAAO,EAAC;AAEjC,EAAA,MAAM,SAAS,MAAM,SAAA;AAAA,IACnBC,gBAAA,CAAS;AAAA,MACP,OAAA,EAAS,sBAAA;AAAA,MACT,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK,CAAE,CAAA;AAAA,MACjF,QAAA,EAAU,CAAC,MAAA,KAAW,MAAA,CAAO,SAAS,CAAA,IAAK;AAAA,KAC5C;AAAA,GACH;AACA,EAAA,OAAO,MAAA,CAAO,WAAW,OAAA,CAAQ,MAAA,GAAS,EAAC,GAAI,EAAE,QAAQ,MAAA,EAAO;AAClE;AAEA,eAAe,mBAAmB,MAAA,EAA8E;AAC9G,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,OAAO,aAAA,IAAiB,EAAE,CAAA,CAAE,MAAA;AAAA,IACzD,CAAC,KAAA,KAAuC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC;AAAA,GAChE;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO,oBAAoB,MAAM,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,SAAS,MAAM,SAAA;AAAA,IACnBD,cAAA,CAA0D;AAAA,MACxD,OAAA,EAAS,eAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,aAAA,EAAe,KAAA,EAAO,WAAA,EAAY;AAAA,QAC1C,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,OAAO,CAAA,MAAO;AAAA,UACnC,MAAM,CAAA,EAAG,IAAI,KAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,UACpC,KAAA,EAAO;AAAA,SACT,CAAE,CAAA;AAAA,QACF,EAAE,IAAA,EAAM,+BAAA,EAA4B,KAAA,EAAO,YAAA;AAAa;AAC1D,KACD;AAAA,GACH;AAEA,EAAA,IAAI,MAAA,KAAW,YAAA,EAAc,OAAO,mBAAA,CAAoB,MAAM,CAAA;AAC9D,EAAA,IAAI,MAAA,KAAW,WAAA,EAAa,OAAO,EAAC;AACpC,EAAA,OAAO,EAAE,QAAQ,MAAA,EAAO;AAC1B;AAEA,eAAe,cAAA,GAAuD;AACpE,EAAA,OAAO,SAAA;AAAA,IACLA,cAAA,CAAoC;AAAA,MAClC,OAAA,EAAS,sBAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,mBAAA,EAAqB,KAAA,EAAO,KAAA,EAAM;AAAA,QAC1C,EAAE,IAAA,EAAM,2BAAA,EAA6B,KAAA,EAAO,cAAA;AAAe,OAC7D;AAAA,MACA,OAAA,EAAS;AAAA,KACV;AAAA,GACH;AACF;AAEA,eAAe,UAAA,GAAqC;AAClD,EAAA,OAAO,SAAA;AAAA,IACLA,cAAA,CAAsB;AAAA,MACpB,OAAA,EAAS,kBAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,0DAAA,EAAuD,KAAA,EAAO,OAAA,EAAQ;AAAA,QAC9E,EAAE,IAAA,EAAM,6CAAA,EAA0C,KAAA,EAAO,QAAA;AAAS,OACpE;AAAA,MACA,OAAA,EAAS;AAAA,KACV;AAAA,GACH;AACF;AAGA,eAAsB,wBAAA,CACpB,QACA,KAAA,EAO6B;AAC7B,EAAA,MAAM,SAAA,GAAgC;AAAA,IACpC,aAAa,KAAA,CAAM,IAAA;AAAA,IACnB,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,QAAQ,KAAA,CAAM,MAAA;AAAA,IACd,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB,MAAM,KAAA,CAAM;AAAA,GACd;AAEA,EAAA,IAAI,CAAC,aAAA,EAAc,EAAG,OAAO,SAAA;AAE7B,EAAA,IAAI,CAAC,UAAU,WAAA,EAAa;AAC1B,IAAA,SAAA,CAAU,WAAA,GAAc,MAAM,iBAAA,CAAkB,MAAM,CAAA;AAAA,EACxD;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,MAAA,IAAU,CAAC,SAAA,CAAU,QAAQ,MAAA,EAAQ;AAClD,IAAA,MAAA,CAAO,MAAA,CAAO,SAAA,EAAW,MAAM,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,CAAC,UAAU,QAAA,EAAU;AACvB,IAAA,SAAA,CAAU,QAAA,GAAW,MAAM,cAAA,EAAe;AAAA,EAC5C;AAEA,EAAA,IAAI,CAAC,UAAU,IAAA,EAAM;AACnB,IAAA,SAAA,CAAU,IAAA,GAAO,MAAM,UAAA,EAAW;AAAA,EACpC;AAEA,EAAA,OAAO,SAAA;AACT;;;AC1JA,cAAA,EAAA;AAOA,IAAM,GAAA,GAAM,CAAC,IAAA,KAAiB,CAAA,OAAA,EAAU,IAAI,CAAA,OAAA,CAAA;AAC5C,IAAM,KAAA,GAAQ,CAAC,IAAA,KAAiB,CAAA,QAAA,EAAW,IAAI,CAAA,OAAA,CAAA;AAC/C,IAAM,MAAA,GAAS,CAAC,IAAA,KAAiB,CAAA,QAAA,EAAW,IAAI,CAAA,OAAA,CAAA;AAChD,IAAM,GAAA,GAAM,CAAC,IAAA,KAAiB,CAAA,QAAA,EAAW,IAAI,CAAA,OAAA,CAAA;AAC7C,IAAM,IAAA,GAAO,CAAC,IAAA,KAAiB,CAAA,QAAA,EAAW,IAAI,CAAA,OAAA,CAAA;AAE9C,SAASE,cAAAA,GAAyB;AAChC,EAAA,OAAO,QAAQ,KAAA,CAAM,KAAA,KAAU,IAAA,IAAQ,OAAA,CAAQ,OAAO,KAAA,KAAU,IAAA;AAClE;AAEA,SAAS,WAAA,CAAY,KAAA,EAAe,KAAA,GAAQ,EAAA,EAAY;AACtD,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,KAAK,CAAA;AACzC,EAAA,OAAO,CAAA,EAAG,QAAA,CAAI,MAAA,CAAO,MAAM,CAAC,GAAG,QAAA,CAAI,MAAA,CAAO,KAAA,GAAQ,MAAM,CAAC,CAAA,CAAA;AAC3D;AAEA,SAAS,eAAe,MAAA,EAAqC;AAC3D,EAAA,OAAO,CAAA,EAAG,OAAO,WAAW,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA,EAAI,OAAO,MAAM,CAAA,CAAA;AAChE;AAGA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,EAAA,OAAO,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA,IAAK,IAAA;AAC1C;AAEA,SAAS,cAAc,SAAA,EAA2B;AAChD,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,GAAI,CAAC,CAAA,CAAA,CAAA;AACxC;AAMA,SAAS,eAAe,KAAA,EAAwE;AAC9F,EAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,IAAA,OAAO;AAAA,MACL,CAAA,IAAA,EAAO,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA;AAAA,MAC7B,MAAM,KAAA,IAAS,GAAA;AAAA,MACf,8DAAA;AAAA,MACA,aAAA,CAAc,MAAM,SAAS;AAAA,KAC/B,CAAE,KAAK,QAAK,CAAA;AAAA,EACd;AACA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,IAAA,EAAO,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA,CAAA;AAAA,IAC7B,MAAM,KAAA,IAAS,GAAA;AAAA,IACf,CAAA,EAAG,MAAM,KAAK,CAAA,QAAA,EAAW,MAAM,KAAA,KAAU,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AAAA,IACrD,CAAA,EAAG,MAAM,UAAU,CAAA,WAAA;AAAA,GACrB;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,OAAA,CAAS,CAAA;AACzD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,gBAAA,CAAiB,KAAA,CAAM,WAAW,CAAC,CAAA,MAAA,EAAS,gBAAA,CAAiB,KAAA,CAAM,YAAY,CAAC,CAAA,IAAA,CAAM,CAAA;AACpG,EAAA,KAAA,CAAM,KAAK,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,gBAAgB,CAAC,CAAA,KAAA,CAAO,CAAA;AACtD,EAAA,KAAA,CAAM,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,SAAS,CAAC,CAAA;AACzC,EAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AACzB;AAEA,SAAS,eAAA,CAAgB,QAA6B,MAAA,EAAyB;AAC7E,EAAA,IAAI,MAAA,CAAO,MAAA,EAAQ,OAAO,GAAA,CAAI,QAAQ,CAAA;AACtC,EAAA,IAAI,MAAA,CAAO,OAAA,EAAS,OAAO,GAAA,CAAI,SAAS,CAAA;AACxC,EAAA,IAAI,MAAA,EAAQ,OAAO,MAAA,CAAO,iBAAiB,CAAA;AAC3C,EAAA,OAAO,MAAM,YAAY,CAAA;AAC3B;AAEA,SAAS,oBAAoB,MAAA,EAAiD;AAC5E,EAAA,IAAI,CAAC,MAAA,CAAO,YAAA,EAAc,OAAO,MAAA;AACjC,EAAA,MAAM,EAAE,IAAA,EAAM,EAAA,EAAI,WAAA,KAAgB,MAAA,CAAO,YAAA;AACzC,EAAA,OAAO,MAAA;AAAA,IACL,CAAA,gBAAA,EAAmB,IAAI,CAAA,UAAA,EAAQ,EAAE,gBAAgB,WAAW,CAAA,CAAA;AAAA,GAC9D;AACF;AAEA,SAAS,gBAAgB,MAAA,EAAqC;AAC5D,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,CAAA;AAC1C,EAAA,IAAI,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAC/B,EAAA,IAAI,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,CAAI,MAAA,CAAO,UAAA,GAAa,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAC3F,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,gBAAA,CAAiB,OAAO,KAAA,CAAM,WAAW,CAAC,CAAA,GAAA,CAAK,CAAA;AAC7D,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,gBAAA,CAAiB,OAAO,KAAA,CAAM,YAAY,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EACjE;AACA,EAAA,IAAI,MAAA,CAAO,qBAAqB,MAAA,EAAW,KAAA,CAAM,KAAK,SAAA,CAAU,MAAA,CAAO,gBAAgB,CAAC,CAAA;AACxF,EAAA,IAAI,OAAO,KAAA,EAAO,KAAA,CAAM,KAAK,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA;AAC9C,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,GAAA,CAAI,MAAM,IAAA,CAAK,QAAK,CAAC,CAAA,GAAI,EAAA;AACrD;AAEA,SAAS,iBAAA,CACP,MAAA,EACA,MAAA,EACA,iBAAA,GAAoB,CAAA,EACZ;AACR,EAAA,MAAM,MAAA,GAAS,SAAS,iBAAA,GAAoB,YAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,OAAO,UAAA,GAAa,iBAAA;AACjC,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,iBAAA,GAAoB,CAAA,GAChB,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,iBAAiB,CAAA,SAAA,CAAA,GACvC,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,OAAO,UAAU,CAAA,CAAA;AAAA,IAClC,CAAA,QAAA,EAAW,OAAO,OAAO,CAAA;AAAA,GAC3B;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,CAAE,CAAC,CAAA;AAChE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,gBAAA,CAAiB,MAAA,CAAO,WAAW,CAAC,CAAA,MAAA,EAAS,gBAAA,CAAiB,MAAA,CAAO,YAAY,CAAC,CAAA,IAAA,CAAM,CAAA;AACtG,EAAA,KAAA,CAAM,KAAK,CAAA,EAAG,SAAA,CAAU,MAAA,CAAO,gBAAgB,CAAC,CAAA,KAAA,CAAO,CAAA;AACvD,EAAA,KAAA,CAAM,IAAA,CAAK,IAAI,MAAA,CAAO,UAAA,GAAa,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACtD,EAAA,OAAO,KAAA,CAAM,KAAK,QAAK,CAAA;AACzB;AAOO,SAAS,+BAAA,CAAgC,OAAA,GAI5C,EAAC,EAA8B;AACjC,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAWA,cAAAA,EAAc;AACjD,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO;AAAA,MACL,QAAQ,KAAA,EAAO;AACb,QAAA,IAAI,KAAA,CAAM,SAAS,iBAAA,EAAmB;AACpC,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,GAAU,UAAA,GAAa,WAAA;AAC1C,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,EAAG,IAAI,CAAA,WAAA,EAAc,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,MAAA,EAAS,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,KAAA,CAAM,KAAA,KAAU,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAG,KAAA,CAAM,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AAAA,WAC9K;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,SAAS,eAAA,EAAiB;AAClC,UAAA,OAAA,CAAQ,GAAA;AAAA,YACN,CAAA,MAAA,EAAS,MAAM,QAAA,GAAW,CAAC,IAAI,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA,EAAA,EAAK,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAC,CAAA,EAAA,EAAK,aAAA,CAAc,KAAA,CAAM,SAAS,CAAC,CAAA,SAAA;AAAA,WACvJ;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC/B,UAAA,MAAM,IAAA,GAAO,CAAA,MAAA,EAAS,KAAA,CAAM,QAAA,GAAW,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAA,MAAA,EAAM,cAAA,CAAe,KAAK,CAAC,CAAA,CAAA;AACpG,UAAA,IAAI,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA,CAAM,eAAe,CAAA,EAAG,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,eAC7D,OAAA,CAAQ,IAAI,IAAI,CAAA;AACrB,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,UAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,MAAM,CAAA;AACzC,UAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAA;AACnD,UAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,KAAA,CAAM,MAAM,CAAA;AAC3C,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,EAAG,MAAA,GAAS,CAAA,EAAA,EAAK,MAAA,CAAO,QAAQ,iBAAA,EAAmB,EAAE,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAC/F,UAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,KAAA,CAAM,MAAM,CAAA;AAChD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,UAAA,EAAa,cAAA,CAAe,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,UACnG;AACA,UAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,IAAU,KAAA,CAAM,OAAO,KAAA,EAAO;AAC7C,YAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,UAClC;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAChC,UAAA,KAAA,MAAW,MAAA,IAAU,MAAM,MAAA,EAAQ;AACjC,YAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,IAAS,QAAQ,CAAA,CAAE,CAAA;AAAA,UACtE;AACA,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,wCAAA,CAA0C,CAAA;AACrF,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,UAAA,OAAA,CAAQ,IAAI,iBAAA,CAAkB,KAAA,CAAM,QAAQ,MAAA,EAAQ,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAC5E,UAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA,EAAG;AAClE,YAAA,OAAA,CAAQ,KAAA,CAAM,GAAG,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,IAAS,QAAQ,CAAA,CAAE,CAAA;AAAA,UACxE;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,MAAA,GAAS;AAAA,MAAC;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,IAAI,SAAmB,EAAC;AACxB,EAAA,IAAI,IAAA;AACJ,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAGpB;AACF,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,MAAM,SAAgC,EAAC;AACvC,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,SAAS,UAAA,GAAmB;AAC1B,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAChC,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,GAAmB;AAC1B,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,WAAW,CAAA;AAChC,MAAA,YAAA,GAAe,KAAA;AAAA,IACjB;AAAA,EACF;AAOA,EAAA,SAAS,gBAAgB,KAAA,EAAuB;AAC9C,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,aAAa,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AACA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,SAAA,GAAY,IAAA,GAAO,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,aAAA,GAAgB,CAAA;AAAA,EAClB;AAEA,EAAA,SAAS,MAAA,GAAe;AACtB,IAAA,UAAA,EAAW;AACX,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,aAAa,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,KAAA,GAAQ,SAAS,SAAA,GAAY,aAAA;AACnC,IAAA,MAAM,OAAA,GAAU,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,IAAA,GAAO,CAAA;AACrD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA,CAAK,GAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,KAAK,EAAE,CAAA,GAC9B,GAAA,CAAI,UAAU,aAAA,GAAa,CAAA,MAAA,EAAM,WAAW,CAAA,SAAA,CAAW,CAAA,IACtD,QAAQ,GAAA,CAAI,CAAA,MAAA,EAAM,KAAK,CAAA,CAAE,CAAA,GAAI,EAAA;AAAA,KAClC;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,YAAY,KAAA,KAAU,CAAA,GAAI,IAAI,IAAA,GAAO,KAAK,IAAI,GAAA,CAAI,CAAA,EAAA,EAAK,KAAK,KAAA,CAAM,KAAA,KAAU,IAAI,CAAA,GAAK,IAAA,GAAO,QAAS,GAAG,CAAC,GAAG,CAAC,CAAA;AACxH,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAI,SAAS,CAAA,GACX,GAAG,gBAAA,CAAiB,WAAW,CAAC,CAAA,SAAA,EAAS,gBAAA,CAAiB,YAAY,CAAC,CAAA,IAAA,CAAA,GACvE,IAAI,aAAU,CAAA,GACd,UAAU,gBAAgB,CAAA,GAC1B,IAAI,OAAO;AAAA,KACf;AAEA,IAAA,IAAI,SAAA,CAAU,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,KAAA,EAAO;AACtC,MAAA,MAAM,QAAA,GAAW,4DAAA;AACjB,MAAA,IAAI,OAAA,GAAU,CAAA;AACd,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,IAAI,QAAA,GAAW,CAAA;AACf,MAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,EAAG;AACpC,QAAA,IAAI,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,KAAK,GAAG,QAAA,IAAY,CAAA;AAAA,aACrC,OAAA,IAAW,CAAA;AAChB,QAAA,QAAA,IAAY,GAAA,CAAI,KAAA;AAAA,MAClB;AACA,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,GAAA,CAAI,UAAU,CAAA,GACZ,CAAA,EAAG,OAAO,CAAA,cAAA,EAAc,QAAQ,CAAA,KAAA,CAAA,GAChC,GAAA,CAAI,CAAA,MAAA,EAAM,QAAQ,WAAW,QAAA,KAAa,CAAA,GAAI,KAAK,GAAG,CAAA,MAAA,EAAM,KAAK,KAAA,CAAM,cAAA,GAAiB,GAAI,CAAC,CAAA,SAAA,CAAW;AAAA,OAC5G;AAGA,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,SAAA,EAAW;AACnC,QAAA,IAAI,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,GAAA,CAAI,IAAI,CAAA,GACN,UAAA,CAAW,IAAI,IACf,GAAA,CAAI,CAAA,MAAA,EAAM,GAAA,CAAI,KAAA,IAAS,GAAG,CAAA,MAAA,EAAM,IAAI,KAAK,CAAA,UAAA,CAAS,CAAA,GAClD,GAAA,CAAI,KAAA,GACJ,GAAA,CAAI,SAAM,aAAA,CAAc,GAAA,CAAI,SAAS,CAAC,CAAA,CAAE;AAAA,SAC5C;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC5B,MAAA,KAAA,CAAM,IAAA,CAAK,IAAI,SAAS,CAAA,GAAI,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,KAAK,MAAA,CAAO,MAAA,GAAS,IAAI,GAAA,CAAI,CAAA,EAAA,EAAK,OAAO,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA,GAAI,EAAA,CAAG,CAAA;AAAA,IACtH,CAAA,MAAA,IAAW,OAAO,KAAA,EAAO;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,gBAAW,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,8BAAyB,CAAC,CAAA;AAAA,IAC3C,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAC3B,QAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,QAAA,KAAA,CAAM,KAAK,CAAA,EAAG,eAAA,CAAgB,MAAA,EAAQ,MAAM,CAAC,CAAA,CAAA,EAAI,cAAA,CAAe,MAAM,CAAC,GAAG,MAAA,GAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,MACxG;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,SAAA,GAAY,IAAA,GAAO,IAAI,CAAA;AAAA,IAC9C;AACA,IAAA,aAAA,GAAgB,KAAA,CAAM,MAAA;AAAA,EACxB;AAEA,EAAA,OAAO;AAAA,IACL,QAAQ,KAAA,EAAO;AACb,MAAA,QAAQ,MAAM,IAAA;AAAM,QAClB,KAAK,OAAA;AACH,UAAA,KAAA,GAAQ,KAAA,CAAM,KAAA;AACd,UAAA,WAAA,GAAc,KAAA,CAAM,WAAA;AACpB,UAAA,KAAA,GAAQ,KAAA,CAAM,KAAA;AACd,UAAA,IAAA,GAAO,KAAA,CAAM,IAAA;AACb,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,MAAA,GAAS,KAAA,CAAM,MAAA;AACf,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF,KAAK,iBAAA,EAAmB;AACtB,UAAA,MAAM,cAAc,KAAA,CAAM,SAAA,GAAY,KAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,GAAI,MAAA;AACpE,UAAA,MAAM,SAAA,GACJ,WAAA,IAAe,CAAC,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,GAAI,IAAA,CAAK,GAAA,EAAI,GAAI,WAAA,GAAc,CAAA;AACzE,UAAA,SAAA,CAAU,GAAA,CAAI,MAAM,IAAA,EAAM;AAAA,YACxB,KAAA,EAAO,KAAA,CAAM,OAAA,GAAU,SAAA,GAAY,WAAA;AAAA,YACnC,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,OAAO,KAAA,CAAM,KAAA;AAAA,YACb,WAAA,EAAa,MAAA,CAAO,KAAA,CAAM,WAAW,IAAI,MAAA,GAAY,WAAA;AAAA,YACrD;AAAA,WACD,CAAA;AAID,UAAA,MAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,KAAK,IAAI,KAAA,CAAM,OAAA,GAAU,UAAA,GAAa,EAAE,CAAA,OAAA,EAAU,KAAA,CAAM,KAAA,KAAU,CAAA,GAAI,KAAK,GAAG,CAAA,CAAA;AACxG,UAAA,MAAM,SAAS,KAAA,CAAM,OAAA,GACjB,0BAA0B,aAAA,CAAc,SAAS,CAAC,CAAA,KAAA,CAAA,GAClD,eAAA;AACJ,UAAA,eAAA,CAAgB;AAAA,YACd,IAAI,CAAA,EAAG,KAAA,CAAM,UAAU,QAAA,GAAM,QAAG,IAAI,MAAM,CAAA,CAAA,EAAI,WAAW,KAAA,CAAM,IAAI,CAAC,CAAA,MAAA,EAAM,KAAA,CAAM,SAAS,GAAG,CAAA,MAAA,EAAM,QAAQ,CAAA,CAAE;AAAA,WAC7G,CAAA;AACD,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AAAA,QACA,KAAK,eAAA,EAAiB;AACpB,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACpC,UAAA,SAAA,CAAU,GAAA,CAAI,MAAM,IAAA,EAAM;AAAA,YACxB,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA,YAC5C,KAAA,EAAO,KAAK,KAAA,IAAS,CAAA;AAAA,YACrB,OAAO,GAAA,EAAK,KAAA;AAAA,YACZ,aAAa,GAAA,EAAK,WAAA;AAAA,YAClB,WAAW,KAAA,CAAM;AAAA,WAClB,CAAA;AACD,UAAA,cAAA,GAAiB,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,KAAA,CAAM,SAAS,CAAA;AACzD,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AAAA,QACA,KAAK,YAAA,EAAc;AACjB,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA;AACpC,UAAA,SAAA,CAAU,GAAA,CAAI,MAAM,IAAA,EAAM;AAAA,YACxB,KAAA,EAAO,KAAA,CAAM,KAAA,CAAM,OAAA,CAAQ,eAAe,EAAE,CAAA;AAAA,YAC5C,KAAA,EAAO,GAAA,EAAK,KAAA,IAAS,KAAA,CAAM,KAAA;AAAA,YAC3B,KAAA,EAAO,GAAA,EAAK,KAAA,IAAS,KAAA,CAAM,KAAA;AAAA,YAC3B,aAAa,GAAA,EAAK,WAAA;AAAA,YAClB,WAAW,KAAA,CAAM;AAAA,WAClB,CAAA;AACD,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,UAAA,KAAe,CAAA,GAAI,GAAA,CAAI,QAAG,CAAA,GAAI,KAAA,CAAM,QAAG,CAAA;AAChF,UAAA,eAAA,CAAgB,CAAC,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,eAAe,KAAK,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA;AAC3D,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AAAA,QACA,KAAK,WAAA,EAAa;AAChB,UAAA,IAAA,IAAQ,CAAA;AACR,UAAA,MAAA,GAAS,MAAA,CAAO,OAAO,CAAC,KAAA,KAAU,UAAU,cAAA,CAAe,KAAA,CAAM,MAAM,CAAC,CAAA;AACxE,UAAA,WAAA,IAAe,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,WAAA,IAAe,CAAA;AAClD,UAAA,YAAA,IAAgB,KAAA,CAAM,MAAA,CAAO,KAAA,EAAO,YAAA,IAAgB,CAAA;AACpD,UAAA,gBAAA,IAAoB,KAAA,CAAM,OAAO,gBAAA,IAAoB,CAAA;AACrD,UAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,MAAM,CAAA;AAC3B,UAAA,MAAA,CAAO,OAAO,WAAW,CAAA;AACzB,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AAAA,QACA,KAAK,aAAA,EAAe;AAGlB,UAAA,KAAA,IAAS,MAAM,MAAA,CAAO,MAAA;AAGtB,UAAA,eAAA,CAAgB;AAAA,YACd,GAAG,MAAM,MAAA,CAAO,GAAA;AAAA,cAAI,CAAC,MAAA,KACnB,GAAA,CAAI,CAAA,EAAG,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,IAAS,QAAQ,CAAA,CAAE;AAAA,aAC9D;AAAA,YACA,IAAA,CAAK,CAAA,SAAA,EAAY,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA,wCAAA,CAA0C;AAAA,WAC/E,CAAA;AACD,UAAA,MAAA,EAAO;AACP,UAAA;AAAA,QACF;AAAA,QACA,KAAK,MAAA;AACH,UAAA,UAAA,EAAW;AACX,UAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,YAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,CAAA,KAAA,EAAQ,aAAa,CAAA,CAAA,CAAG,CAAA;AAAA,UAC/C;AACA,UAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,YACb,SAAA,GACE,KAAA,CAAM,MAAM,CAAA,GACZ,QAAA,GACA,iBAAA,CAAkB,KAAA,CAAM,MAAA,EAAQ,MAAA,EAAQ,KAAA,CAAM,iBAAiB,CAAA,GAC/D;AAAA,WACJ;AACA,UAAA,aAAA,GAAgB,CAAA;AAChB,UAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,MAAM,CAAA,EAAG;AAClE,YAAA,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,SAAA,GAAY,GAAA,CAAI,GAAG,cAAA,CAAe,MAAM,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,KAAA,IAAS,QAAQ,CAAA,CAAE,IAAI,IAAI,CAAA;AAAA,UACvG;AACA,UAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,YAAY,CAAA,EAAG;AACxE,YAAA,MAAM,OAAA,GAAU,oBAAoB,MAAM,CAAA;AAC1C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,gBACb,SAAA,GAAY,MAAA,CAAO,CAAA,UAAA,EAAa,cAAA,CAAe,MAAM,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAC,EAAE,CAAA,GAAI;AAAA,eACxG;AAAA,YACF;AAAA,UACF;AACA,UAAA;AAAA;AACJ,IACF,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,UAAA,EAAW;AAAA,IACb;AAAA,GACF;AACF;;;ACvaA,cAAA,EAAA;AAKO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,IAAI,GAAA,GAAM3B,sBAAAA,CAAK,OAAA,CAAQ4B,iBAAA,CAAc,aAAe,CAAC,CAAA;AACrD,EAAA,WAAS;AACP,IAAA,MAAM,SAAA,GAAY5B,sBAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AAC/C,IAAA,IAAID,oBAAAA,CAAG,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAMA,qBAAG,YAAA,CAAa,SAAA,EAAW,MAAM,CAAC,CAAA;AAIzD,MAAA,IAAI,IAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,OAAA,SAAgB,GAAA,CAAI,OAAA;AAAA,IAC3D;AACA,IAAA,MAAM,MAAA,GAASC,sBAAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,WAAW,GAAA,EAAK;AACpB,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACA,EAAA,OAAO,SAAA;AACT;AAEO,IAAM,iBAAiB,iBAAA,EAAkB;;;AvDehD,SAAS,UAAU,IAAA,EAA0E;AAC3F,EAAA,MAAM,OAAA,GAAsB,EAAE,GAAA,EAAK,OAAA,CAAQ,KAAI,EAAE;AACjD,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AACzB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,OAAO,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,IAAK,CAAC,IAAA,CAAK,CAAA,GAAI,CAAC,CAAA,CAAG,UAAA,CAAW,IAAI,CAAA,EAAG;AACpD,QAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAE,CAAA;AAAA,MACzB;AACA,MAAA,OAAA,CAAQ,MAAA,GAAS,OAAA;AACjB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AACzB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AACvB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,CAAQ,IAAA,GAAO,IAAA,CAAK,EAAE,CAAC,CAAA;AACvB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACxB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,CAAQ,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AAC/B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAChB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,OAAA,CAAQ,WAAA,GAAc,MAAA,CAAO,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AACtC,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,OAAA,CAAQ,UAAA,GAAa,IAAA;AACrB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA;AAChB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AACtB,MAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,cAAA,EAAgB;AAC/C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAAA,MAC7E;AACA,MAAA,OAAA,CAAQ,QAAA,GAAW,KAAA;AACnB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,GAAA,GAAM,IAAA,CAAK,EAAE,CAAC,CAAA;AACtB,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,EAAE,CAAC,CAAA;AAC5B,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAE,CAAA;AAAA,IACxC;AACA,IAAA,UAAA,CAAW,KAAK,GAAG,CAAA;AACnB,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,MAAM,CAAC,OAAA,GAAU,MAAA,EAAQ,GAAG,IAAI,CAAA,GAAI,UAAA;AACpC,EAAA,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,IAAA,EAAK;AAClC;AAEA,SAAS,YAAY,OAAA,EAAqB;AACxC,EAAA,MAAM,SAAS,cAAA,CAAe;AAAA,IAC5B,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,YAAY,OAAA,CAAQ;AAAA,GACrB,CAAA;AACD,EAAA,OAAO,cAAc,MAAM,CAAA;AAC7B;AAEA,eAAe,IAAA,GAAsB;AACnC,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,KAAA,KAAU,WAAA,IAAe,KAAA,KAAU,IAAA,IAAQ,UAAU,SAAA,EAAW;AAClE,IAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAC1B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,IAAA,EAAK,GAAI,UAAU,IAAI,CAAA;AACjD,EAAA,cAAA,CAAe,QAAQ,GAAG,CAAA;AAE1B,EAAA,IAAI,OAAA,KAAY,MAAA,IAAU,OAAA,KAAY,QAAA,EAAU;AAC9C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAoCf,CAAA;AACG,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,YAAY,SAAA,EAAW;AACzB,IAAA,OAAA,CAAQ,IAAI,cAAc,CAAA;AAC1B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,YAAY,OAAO,CAAA;AACnC,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AAEvB,EAAA,QAAQ,OAAA;AAAS,IACf,KAAK,QAAA,EAAU;AACb,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,SAAA,EAAU,EAAG;AACtC,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,EAAK,CAAE,MAAA;AAC5B,QAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAA,CAAK,EAAE,CAAA,EAAA,EAAK,OAAO,CAAA,QAAA,CAAU,CAAA;AAC5C,QAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,UAAA,IAAI,MAAA,KAAW,OAAO,aAAA,EAAe;AACrC,UAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,IAAI,MAAM,CAAA,EAAG,OAAO,IAAA,IAAQ,CAAA;AACtD,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,QACrC;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AACzC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AACrC,MAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AACjC,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,IAAI,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,eAAe,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,MAAA,IAAU,EAAE,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,EAAE,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA;AAAA,SAC1G;AAAA,MACF;AACA,MAAA,IAAI,CAAC,MAAA,CAAO,EAAA,EAAI,OAAA,CAAQ,QAAA,GAAW,CAAA;AACnC,MAAA;AAAA,IACF;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,IAAA,EAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AAC1E,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,qBAAA,CAAsB,OAAA,EAAS;AAAA,QACjD,QAAQ,OAAA,CAAQ,GAAA;AAAA,QAChB,SAAA,EAAW,OAAA,CAAQ,SAAA,GAAa,CAAA,CAAA,EAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA,GAAsB,MAAA;AAAA,QAC9F,KAAA;AAAA,QACA,SAAS,OAAA,CAAQ;AAAA,OAClB,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI,CAAA,MAAA,EAAS,OAAO,0BAA0B,OAAA,CAAQ,GAAA,IAAO,QAAQ,CAAA,CAAE,CAAA;AAC/E,MAAA;AAAA,IACF;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,OAAA,CAAQ,MAAA,EAAQ;AACnC,QAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,MAC/D;AAEA,MAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,QAAA,MAAM6B,YAAW,+BAAA,CAAgC;AAAA,UAC/C,OAAA,EAAS,CAAC,OAAA,CAAQ,UAAA;AAAA,UAClB,MAAA,EAAQ;AAAA,SACT,CAAA;AACD,QAAA,MAAMV,QAAAA,GAAU,MAAM,qBAAA,CAAsB,MAAA,EAAQ,EAAE,UAAA,EAAYU,SAAAA,CAAS,SAAS,CAAA;AACpF,QAAAA,UAAS,MAAA,EAAO;AAChB,QAAA,IAAIV,aAAY,IAAA,EAAM;AACpB,UAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAChD,UAAA;AAAA,QACF;AACA,QAAA,IAAIA,QAAAA,CAAQ,KAAK,CAAC,MAAA,KAAW,OAAO,MAAM,CAAA,UAAW,QAAA,GAAW,CAAA;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,wBAAA,CAAyB,MAAA,EAAQ;AAAA,QACvD,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,MAAM,OAAA,CAAQ,KAAA,GAAQ,OAAA,GAAU,OAAA,CAAQ,SAAS,QAAA,GAAW;AAAA,OAC7D,CAAA;AACD,MAAA,MAAM,UAAU,wBAAA,CAAyB,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,UAAU,MAAM,CAAA;AACnF,MAAA,MAAM,QAAA,GAAW,cAAc,MAAA,EAAQ;AAAA,QACrC,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,OAAA;AAAA,QACA,QAAQ,OAAA,CAAQ,IAAA;AAAA,QAChB,QAAA,EAAU,UAAU,QAAA,IAAY;AAAA,OACjC,CAAA;AACD,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAEzB,QAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,UAAA,MAAMU,YAAW,+BAAA,CAAgC;AAAA,YAC/C,OAAA,EAAS,CAAC,OAAA,CAAQ,UAAA;AAAA,YAClB,MAAA,EAAQ;AAAA,WACT,CAAA;AACD,UAAA,MAAM,OAAA,GAAU,MAAM,qBAAA,CAAsB,MAAA,EAAQ,EAAE,UAAA,EAAYA,SAAAA,CAAS,SAAS,CAAA;AACpF,UAAAA,UAAS,MAAA,EAAO;AAChB,UAAA,IAAI,YAAY,IAAA,EAAM;AACpB,YAAA,IAAI,OAAA,CAAQ,KAAK,CAAC,MAAA,KAAW,OAAO,MAAM,CAAA,UAAW,QAAA,GAAW,CAAA;AAChE,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAA,CAAQ,IAAI,uBAAuB,CAAA;AACnC,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,WAAW,+BAAA,CAAgC;AAAA,QAC/C,OAAA,EAAS,CAAC,OAAA,CAAQ,UAAA;AAAA,QAClB,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,MAAA,EAAQ,QAAA,EAAU;AAAA,QACxD,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,MAAM,SAAA,CAAU,IAAA;AAAA,QAChB,YAAY,QAAA,CAAS;AAAA,OACtB,CAAA;AACD,MAAA,QAAA,CAAS,MAAA,EAAO;AAEhB,MAAA,MAAM,SAAS,OAAA,CAAQ,MAAA,CAAO,CAAC,MAAA,KAAW,OAAO,MAAM,CAAA;AACvD,MAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,QAAA,GAAW,CAAA;AAC1C,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA,GAAI,IAAA;AACjC,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,EAAQ;AACtB,QAAA,MAAM,IAAI,MAAM,iDAAiD,CAAA;AAAA,MACnE;AACA,MAAA,MAAM,EAAE,SAAA,EAAAC,UAAAA,EAAU,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAKA,UAAAA,CAAU,MAAA,EAAQ,UAAU,CAAA;AACvC,MAAA,MAAM,IAAA,GAAO,wBAAA,CAAyB,EAAA,EAAI,MAAA,EAAQ,MAAM,CAAA;AACxD,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,OAAA,GAAU,IAAI,OAAA,IAAW,EAAA;AAC/B,QAAA,IAAI,MAAA,IAAU,CAAC,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AACpD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,EAAG,GAAA,CAAI,UAAU,CAAA,WAAA,EAAc,IAAI,EAAE,CAAA,SAAA,EAAY,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,SAAA,EAAY,WAAW,QAAG,CAAA;AAAA,SACpG;AAAA,MACF;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,YAAY,OAAA,EAAS,EAAE,MAAM,OAAA,CAAQ,IAAA,IAAQ,MAAM,CAAA;AACzD,MAAA;AAAA,IACF;AAAA,IACA;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA;AAEnD;AAEA,IAAA,EAAK,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AACtB,EAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,KAAK,CAAA;AAC5D,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB,CAAC,CAAA","file":"index.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\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","#!/usr/bin/env node\nimport {\n createProject,\n loadConfigSync,\n resumeTranslationJobs,\n translateWorklist,\n validateProject,\n writeStaticRawExports,\n} from \"../src/index.js\";\nimport { listEnSnapshotsForEnSlug } from \"../src/storage/translations.js\";\nimport { loadEnvFromCwd } from \"../src/config/load-env.js\";\nimport { buildWorklist, resolveLocalesFromPreset, type TranslationWorklistStrategy } from \"../src/translate/worklist.js\";\nimport { startStudio } from \"../studio/server.js\";\nimport { promptTranslateSelection } from \"./prompt-translate.js\";\nimport { createTranslateProgressReporter } from \"./translate-progress.js\";\nimport { SCRIBE_VERSION } from \"../src/version.js\";\n\ninterface CliOptions {\n config?: string;\n cwd: string;\n locale?: string[];\n preset?: string;\n type?: string;\n slug?: string;\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n port?: number;\n concurrency?: number;\n noProgress?: boolean;\n strategy?: TranslationWorklistStrategy;\n batch?: boolean;\n direct?: boolean;\n resume?: boolean;\n out?: string;\n extension?: string;\n}\n\nfunction parseArgs(argv: string[]): { command: string; options: CliOptions; rest: string[] } {\n const options: CliOptions = { cwd: process.cwd() };\n const positional: string[] = [];\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i]!;\n if (arg === \"--config\") {\n options.config = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--locale\") {\n const locales: string[] = [];\n while (argv[i + 1] && !argv[i + 1]!.startsWith(\"--\")) {\n locales.push(argv[++i]!);\n }\n options.locale = locales;\n i++;\n continue;\n }\n if (arg === \"--preset\") {\n options.preset = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--type\") {\n options.type = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--slug\") {\n options.slug = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--model\") {\n options.model = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--port\") {\n options.port = Number(argv[++i]);\n i++;\n continue;\n }\n if (arg === \"--dry-run\") {\n options.dryRun = true;\n i++;\n continue;\n }\n if (arg === \"--force\") {\n options.force = true;\n i++;\n continue;\n }\n if (arg === \"--concurrency\") {\n options.concurrency = Number(argv[++i]);\n i++;\n continue;\n }\n if (arg === \"--no-progress\") {\n options.noProgress = true;\n i++;\n continue;\n }\n if (arg === \"--batch\") {\n options.batch = true;\n i++;\n continue;\n }\n if (arg === \"--direct\") {\n options.direct = true;\n i++;\n continue;\n }\n if (arg === \"--resume\") {\n options.resume = true;\n i++;\n continue;\n }\n if (arg === \"--strategy\") {\n const value = argv[++i];\n if (value !== \"all\" && value !== \"missing-only\") {\n throw new Error(`Unknown strategy: ${value} (expected all or missing-only)`);\n }\n options.strategy = value;\n i++;\n continue;\n }\n if (arg === \"--out\") {\n options.out = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--extension\") {\n options.extension = argv[++i];\n i++;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n positional.push(arg);\n i++;\n }\n const [command = \"help\", ...rest] = positional;\n return { command, options, rest };\n}\n\nfunction loadProject(options: CliOptions) {\n const config = loadConfigSync({\n cwd: options.cwd,\n configPath: options.config,\n });\n return createProject(config);\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const first = argv[0];\n if (first === \"--version\" || first === \"-V\" || first === \"version\") {\n console.log(SCRIBE_VERSION);\n return;\n }\n\n const { command, options, rest } = parseArgs(argv);\n loadEnvFromCwd(options.cwd);\n\n if (command === \"help\" || command === \"--help\") {\n console.log(`Usage: scribe <command>\n\nCommands:\n status Show EN docs + translation counts\n validate Validate EN files and sqlite consistency\n export-static Write raw MDX files for static hosting\n translate Translate stale/missing locale pages\n history <type> <slug> Show EN snapshot timeline\n studio Start read-only local studio\n version Print scribe-cms version\n\nExport-static flags:\n --out <dir> Output directory (default: public)\n --extension <ext> File extension (default: mdx)\n --type <id> Comma-separated content types (default: all routable)\n --locale <code>... Locales to export (default: all configured)\n\nTranslate flags:\n --type <id> Content type (interactive picker in a TTY when omitted)\n --preset <name> Locale preset from config (interactive picker in a TTY)\n --locale <code>... Target locale(s); overrides --preset\n --slug <en-slug> Single English document\n --model <id> Gemini model override\n --batch Force Gemini Batch API mode (50% token cost; default)\n --direct Force direct interactive calls (immediate, full price)\n --resume Only poll/ingest pending batch jobs; submit nothing new\n --concurrency <n> Parallel translations in --direct mode (default: 3)\n --dry-run List work without writing\n --force Re-translate even when hashes match\n --strategy <mode> all (default) or missing-only\n --no-progress Plain line logging instead of live progress\n\nBatch mode submits jobs upfront and persists them in the store, so Ctrl+C\nduring polling is safe: the next run (or --resume) picks the jobs back up and\ningests their results. In a TTY without --batch/--direct, a prompt asks which\nmode to use.\n`);\n return;\n }\n\n if (command === \"version\") {\n console.log(SCRIBE_VERSION);\n return;\n }\n\n const project = loadProject(options);\n const config = project.config;\n\n switch (command) {\n case \"status\": {\n for (const type of project.listTypes()) {\n const enCount = type.list().length;\n console.log(`${type.id}: ${enCount} EN docs`);\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const count = type.load().get(locale)?.bySlug.size ?? 0;\n console.log(` ${locale}: ${count}`);\n }\n }\n console.log(`store: ${project.storePath}`);\n break;\n }\n case \"validate\": {\n const result = validateProject(config);\n for (const issue of result.issues) {\n console.log(\n `[${issue.level}] ${issue.contentType ?? \"\"} ${issue.enSlug ?? \"\"} ${issue.locale ?? \"\"} ${issue.message}`,\n );\n }\n if (!result.ok) process.exitCode = 1;\n break;\n }\n case \"export-static\": {\n const types = options.type?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const { written } = writeStaticRawExports(project, {\n outDir: options.out,\n extension: options.extension ? (`.${options.extension.replace(/^\\./, \"\")}` as `.${string}`) : undefined,\n types,\n locales: options.locale,\n });\n console.log(`Wrote ${written} static raw exports to ${options.out ?? \"public\"}`);\n break;\n }\n case \"translate\": {\n if (options.batch && options.direct) {\n throw new Error(\"--batch and --direct are mutually exclusive\");\n }\n\n if (options.resume) {\n const reporter = createTranslateProgressReporter({\n enabled: !options.noProgress,\n dryRun: false,\n });\n const results = await resumeTranslationJobs(config, { onProgress: reporter.onEvent });\n reporter.finish();\n if (results === null) {\n console.log(\"No pending translation batch jobs.\");\n break;\n }\n if (results.some((result) => result.failed)) process.exitCode = 1;\n break;\n }\n\n const selection = await promptTranslateSelection(config, {\n type: options.type,\n preset: options.preset,\n locale: options.locale,\n strategy: options.strategy,\n mode: options.batch ? \"batch\" : options.direct ? \"direct\" : undefined,\n });\n const locales = resolveLocalesFromPreset(config, selection.preset, selection.locale);\n const worklist = buildWorklist(config, {\n contentType: selection.contentType,\n locales,\n enSlug: options.slug,\n strategy: selection.strategy ?? \"all\",\n });\n if (worklist.length === 0) {\n // Still pick up pending batch jobs from an interrupted previous run.\n if (!options.dryRun) {\n const reporter = createTranslateProgressReporter({\n enabled: !options.noProgress,\n dryRun: false,\n });\n const resumed = await resumeTranslationJobs(config, { onProgress: reporter.onEvent });\n reporter.finish();\n if (resumed !== null) {\n if (resumed.some((result) => result.failed)) process.exitCode = 1;\n break;\n }\n }\n console.log(\"Nothing to translate.\");\n break;\n }\n\n const reporter = createTranslateProgressReporter({\n enabled: !options.noProgress,\n dryRun: options.dryRun,\n });\n\n const results = await translateWorklist(config, worklist, {\n model: options.model,\n dryRun: options.dryRun,\n force: options.force,\n concurrency: options.concurrency,\n mode: selection.mode,\n onProgress: reporter.onEvent,\n });\n reporter.finish();\n\n const failed = results.filter((result) => result.failed);\n if (failed.length > 0) process.exitCode = 1;\n break;\n }\n case \"history\": {\n const [typeId, enSlug, locale] = rest;\n if (!typeId || !enSlug) {\n throw new Error(\"Usage: scribe history <type> <en-slug> [locale]\");\n }\n const { openStore } = await import(\"../src/storage/sqlite.js\");\n const db = openStore(config, \"readonly\");\n const rows = listEnSnapshotsForEnSlug(db, typeId, enSlug);\n db.close();\n for (const row of rows) {\n const locales = row.locales ?? \"\";\n if (locale && !locales.split(\",\").includes(locale)) continue;\n console.log(\n `${row.created_at} snapshot=#${row.id} en_hash=${row.en_hash.slice(0, 8)} locales=${locales || \"—\"}`,\n );\n }\n break;\n }\n case \"studio\": {\n await startStudio(project, { port: options.port ?? 3600 });\n break;\n }\n default:\n throw new Error(`Unknown command: ${command}`);\n }\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","export { field, getRelationTarget, getFieldKind, unwrapSchema } from \"./core/field.js\";\nexport type {\n RelationBrand,\n RelationField,\n RelationFieldOptions,\n RelationMeta,\n} from \"./core/field.js\";\nexport { defineConfig, defineContentType } from \"./core/types.js\";\nexport type {\n ScribeConfigInput,\n ScribeConfig,\n ScribeProject,\n ScribeDocument,\n ContentTypeInput,\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n StaticParam,\n LocaleIndex,\n AllDocuments,\n ResolvedDocument,\n CrossValidateContext,\n CrossValidateIssue,\n TranslateConfig,\n ScribeTranslateDefaults,\n LocalePresets,\n LocaleFallbacks,\n LocaleRoutingConfig,\n SlugStrategy,\n IndexFallback,\n Scribe,\n InferDocMap,\n InferDocFromTypeConfig,\n RelationFieldsOf,\n RelatedMapFor,\n ScribeClient,\n ScribeDocs,\n ScribeDocOf,\n} from \"./core/types.js\";\nexport { createScribe } from \"./create-scribe.js\";\nexport { createProject } from \"./create-project.js\";\nexport { isRoutableType, createUrlBuilder } from \"./i18n/build-url.js\";\nexport type { UrlBuilder } from \"./i18n/build-url.js\";\nexport { resolveConfig, isResolvedConfig } from \"./config/resolve-config.js\";\nexport { loadConfigSync, findConfigPath } from \"./config/load-config.js\";\nexport { validateProject } from \"./validate/validate-project.js\";\nexport type { ValidateIssue, ValidateResult } from \"./validate/validate-project.js\";\nexport {\n buildAllContentRedirects,\n getRedirectSourceSlugs,\n} from \"./redirects/build-redirects.js\";\nexport type { NextRedirectRule } from \"./redirects/types.js\";\nexport type { RedirectSourceSlugs } from \"./redirects/build-redirects.js\";\nexport { buildWorklist, resolveLocalesFromPreset } from \"./translate/worklist.js\";\nexport type { TranslationWorklistStrategy, TranslationWorkItem, WorklistOptions } from \"./translate/worklist.js\";\nexport { resumeTranslationJobs, translatePage, translateWorklist } from \"./translate/page-translator.js\";\nexport type {\n TranslateMode,\n TranslatePageResult,\n TranslateProgressEvent,\n TranslateWorklistTotals,\n} from \"./translate/page-translator.js\";\nexport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nexport type {\n GenerateSitemapOptions,\n SitemapAlternateLanguages,\n SitemapChangeFrequency,\n SitemapEntry,\n SitemapTypeDefaults,\n} from \"./sitemap/types.js\";\nexport {\n buildStaticRawExports,\n exportDirSegment,\n getStaticExportRoots,\n} from \"./export/build-static-raw-exports.js\";\nexport type {\n BuildStaticRawExportsOptions,\n StaticRawExport,\n} from \"./export/build-static-raw-exports.js\";\nexport { writeStaticRawExports } from \"./export/write-static-raw-exports.js\";\nexport type { WriteStaticRawExportsOptions } from \"./export/write-static-raw-exports.js\";\nexport { serializeMdx } from \"./loader/parse-mdx.js\";\n","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 type { RELATION_BRAND, RelationBrand } from \"./field.js\";\n\n/**\n * How document slugs behave across locales.\n * - `\"fixed\"` — the EN slug is used for every locale.\n * - `\"localized\"` — each locale gets its own translated slug.\n */\nexport type SlugStrategy = \"localized\" | \"fixed\";\n\n/**\n * What `resolve()` returns when a locale has no translation for a slug.\n * - `\"en\"` — fall back to the default-locale document.\n * - `\"none\"` — return no document.\n */\nexport type IndexFallback = \"en\" | \"none\";\n\n/** Sort order for `list()`. Built-in keys sort by document metadata; pass a comparator for anything else. */\nexport type OrderBy<TDoc = ScribeDocument> =\n | \"slug\"\n | \"publishedAt\"\n | \"-publishedAt\"\n | \"updatedAt\"\n | \"-updatedAt\"\n | ((a: TDoc, b: TDoc) => number);\n\nexport interface CrossValidateContext {\n locale: string;\n defaultLocale: string;\n slug: string;\n enSlug: string;\n knownLocales: readonly string[];\n englishSlugs?: ReadonlySet<string>;\n}\n\nexport interface CrossValidateIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\n/** Named locale groups usable with `scribe translate --preset <name>`. */\nexport interface LocalePresets {\n active?: string[];\n ultraLight?: string[];\n [name: string]: string[] | undefined;\n}\n\n/** Derived fallback chains: locale → ordered locales tried before the default locale when the locale has no translation. */\nexport type LocaleFallbacks = Record<string, string[]>;\n\n/** How non-default locales appear in generated URLs. */\nexport type LocaleRoutingConfig =\n | { strategy: \"path-prefix\"; prefixDefaultLocale?: boolean }\n | { strategy: \"search-param\"; param: string };\n\n/** Per-content-type translation settings (merged over the project-level defaults). */\nexport interface TranslateConfig {\n /** Replace the default system prompt entirely. */\n prompt?: string;\n /** Brand/domain context prepended to every translation request. */\n context?: string;\n /** Extra rules appended to the default rules. */\n rules?: string[];\n /** Model override for this content type. */\n model?: string;\n}\n\n/** Project-level translation defaults. */\nexport interface ScribeTranslateDefaults {\n defaultModel?: string;\n prompt?: string;\n context?: string;\n rules?: string[];\n}\n\n/**\n * A content type declaration as written in `scribe.config.ts`.\n * Most fields are optional with sensible defaults — see each field's doc.\n */\nexport interface ContentTypeInput<TSchema extends z.ZodTypeAny = z.ZodTypeAny> {\n /** Unique id. Becomes the typed accessor (`scribe.<id>`) and the default `contentDir`. */\n id: string;\n /** Zod schema for the EN frontmatter. Mark fields with `field.translatable()/structural()/relation()`. */\n schema: TSchema;\n /** Directory under the project content dir holding this type's `.mdx` files. Default: the type `id`. */\n contentDir?: string;\n /** URL template for routable types, e.g. `/blog/{slug}`. Must contain exactly one `{slug}`. Omit for reference-only types. */\n path?: string;\n /** Human label (studio UI). Default: capitalized `id`. */\n label?: string;\n /** Default: `\"fixed\"`. */\n slugStrategy?: SlugStrategy;\n /** Default: `\"en\"` when the type has a `path`, otherwise `\"none\"`. */\n indexFallback?: IndexFallback;\n /** Default sort for `list()`. Default: `\"slug\"`. */\n orderBy?: OrderBy<ScribeDocument<z.infer<TSchema>>>;\n /** Custom validation across fields, run by `scribe validate`. */\n crossValidate?: (\n data: z.infer<TSchema>,\n ctx: CrossValidateContext,\n ) => CrossValidateIssue[];\n translate?: TranslateConfig;\n}\n\n/** A content type with all defaults applied (what runtimes and the CLI consume). */\nexport interface ContentTypeConfig<TSchema extends z.ZodTypeAny = z.ZodTypeAny>\n extends ContentTypeInput<TSchema> {\n contentDir: string;\n label: string;\n slugStrategy: SlugStrategy;\n indexFallback: IndexFallback;\n}\n\n/**\n * The shape accepted by `defineConfig()` / `createScribe()`.\n * Relative paths (`contentDir`, `store`) resolve against `rootDir`.\n */\nexport interface ScribeConfigInput<\n TTypes extends readonly ContentTypeInput<any>[] = readonly ContentTypeInput[],\n> {\n /** Absolute project root (the directory holding `scribe.config.ts`). */\n rootDir: string;\n /** Directory containing the per-type content folders. Default: `\"content\"`. */\n contentDir?: string;\n /** Path to the SQLite translation store. Default: `\".scribe/store.sqlite\"`. Commit this file; do not gitignore `.scribe/`. */\n store?: string;\n /** Path to the static assets folder (e.g. Next.js `public`). Relative to project `rootDir`. When set, `scribe validate` warns on missing image files. */\n assetsDir?: string;\n /** All locales, including the default one. */\n locales: string[];\n /** Canonical source locale. Must be in `locales`. Default: `\"en\"`. */\n defaultLocale?: string;\n /** How locale markers are applied to generated URLs. Default: path-prefix without default locale. */\n localeRouting?: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Enable automatic locale fallback chains derived from locale tags — e.g. `\"pt-BR\"` is served from `\"pt\"` (before the default locale) when it has no translation. Default: `true`. */\n localeFallbacks?: boolean;\n translate?: ScribeTranslateDefaults;\n types: TTypes;\n}\n\n/**\n * A fully resolved Scribe config (all defaults applied, paths absolute).\n * Note: `rootDir` here is the absolute **content** root, not the project root.\n */\nexport interface ScribeConfig {\n /** Absolute content root (project `rootDir` + `contentDir`). */\n rootDir: string;\n /** Absolute path to the SQLite translation store. */\n storePath: string;\n /** Absolute path to the static assets folder, when `assetsDir` is configured. */\n assetsPath?: string;\n locales: string[];\n defaultLocale: string;\n localeRouting: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Fallback chains derived from locale tags (`{}` when the feature is disabled). */\n localeFallbacks: LocaleFallbacks;\n translate?: ScribeTranslateDefaults;\n types: ContentTypeConfig[];\n}\n\n/** A loaded document (EN file or stored translation). */\nexport interface ScribeDocument<TFrontmatter = Record<string, unknown>> {\n /** Slug in this document's locale (differs from `enSlug` for localized slugs). */\n slug: string;\n /** Slug of the EN (default-locale) parent. Equal to `slug` for EN documents. */\n enSlug: string;\n locale: string;\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Explicit EN frontmatter override for canonical URL path. */\n canonicalPathOverride?: string;\n frontmatter: TFrontmatter;\n content: string;\n filePath?: string;\n}\n\nexport interface LocaleIndex<TDoc = ScribeDocument> {\n bySlug: ReadonlyMap<string, TDoc>;\n byEnSlug: ReadonlyMap<string, TDoc>;\n}\n\nexport type AllDocuments<TDoc = ScribeDocument> = ReadonlyMap<string, LocaleIndex<TDoc>>;\n\n/** Result of `resolve()`: the document plus redirect/canonical routing data. */\nexport interface ResolvedDocument<TDoc = ScribeDocument> {\n document: TDoc | null;\n /** Locale actually served (differs from the requested locale on EN fallback). */\n actualLocale: string;\n /** 301 target when the slug is an alias or belongs to another locale. */\n shouldRedirectTo?: string;\n /** Locale-aware pathname when the type has `path` and a document was found. */\n canonicalPath?: string;\n}\n\n/** `{ locale, slug }` pairs for Next.js `generateStaticParams()`. */\nexport interface StaticParam {\n locale: string;\n slug: string;\n}\n\nexport interface ListOptions<TDoc = ScribeDocument> {\n /** Override the type's configured `orderBy` for this call. */\n orderBy?: OrderBy<TDoc>;\n limit?: number;\n}\n\n/** Untyped default for the `related()` field map. */\nexport type AnyRelatedMap = Record<string, ScribeDocument | ScribeDocument[] | null>;\n\n/**\n * Per-content-type runtime API.\n *\n * Reads: `list`, `get`, `resolve`. Routing: `staticParams`, `alternates`,\n * `translation`, `url`. Relations: `related`. Low-level escape hatch: `load`.\n */\nexport interface ContentTypeRuntime<\n TDoc extends ScribeDocument = ScribeDocument,\n TRelated extends Record<string, unknown> = AnyRelatedMap,\n> {\n id: string;\n config: ContentTypeConfig;\n\n /** All documents for a locale (default: the default locale), sorted by the type's `orderBy`. */\n list: (locale?: string, options?: ListOptions<TDoc>) => TDoc[];\n /** Exact slug lookup in one locale (default: the default locale). No fallback, no redirects. */\n get: (slug: string, locale?: string) => TDoc | null;\n /** Full resolution: aliases, cross-locale slug correction, EN fallback, redirects, canonical path. */\n resolve: (slug: string, locale: string) => ResolvedDocument<TDoc>;\n\n /** Every `{ locale, slug }` pair to prerender — one call in `generateStaticParams()`. */\n staticParams: (options?: { locales?: readonly string[] }) => StaticParam[];\n /** hreflang map: locale → relative path, for every locale with a translation (default locale always included). */\n alternates: (doc: TDoc) => Record<string, string>;\n /** The same document in another locale, or null when untranslated (callers typically do `?? doc`). */\n translation: (doc: TDoc, targetLocale: string) => TDoc | null;\n /** Pathname for a slug + locale from the type's `path` template. */\n url: (slug: string, locale: string) => string;\n\n /** Dereference a `field.relation()` frontmatter field into the target type's document(s). */\n related: <K extends keyof TRelated & string>(\n doc: TDoc,\n field: K,\n locale?: string,\n ) => TRelated[K];\n\n /** Low-level access to the full locale → index map. Prefer `list`/`get`/`resolve`. */\n load: () => AllDocuments<TDoc>;\n}\n\n/** Infer the document type from a content type declaration. */\nexport type InferDocFromTypeConfig<T extends ContentTypeInput<any>> = ScribeDocument<\n z.infer<T[\"schema\"]>\n>;\n\n/** Map content type id → document type from a config types tuple. */\nexport type InferDocMap<TTypes extends readonly ContentTypeInput<any>[]> = {\n [T in TTypes[number] as T[\"id\"]]: InferDocFromTypeConfig<T>;\n};\n\n/** Document map (id → ScribeDocument) from a config object type. */\nexport type ScribeDocs<C extends { types: readonly ContentTypeInput<any>[] }> = InferDocMap<\n C[\"types\"]\n>;\n\n/** Single doc type by content-type id. */\nexport type ScribeDocOf<\n C extends { types: readonly ContentTypeInput<any>[] },\n Id extends keyof ScribeDocs<C> & string,\n> = ScribeDocs<C>[Id];\n\ntype RelationBrandOf<TField> = TField extends {\n [RELATION_BRAND]: infer B extends RelationBrand<string, boolean, boolean>;\n}\n ? B\n : never;\n\n/** Top-level `field.relation()` fields of a schema, keyed by field name. */\nexport type RelationFieldsOf<TSchema extends z.ZodTypeAny> =\n TSchema extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape as [RelationBrandOf<Shape[K]>] extends [never]\n ? never\n : K]: RelationBrandOf<Shape[K]>;\n }\n : {};\n\ntype RelatedDoc<B, TDocMap> = B extends RelationBrand<\n infer TTarget,\n infer TMultiple,\n infer TOptional\n>\n ? TTarget extends keyof TDocMap\n ? TMultiple extends true\n ? Array<TDocMap[TTarget]>\n : TOptional extends true\n ? TDocMap[TTarget] | null\n : TDocMap[TTarget]\n : never\n : never;\n\n/** `related()` return types for a content type, derived from its schema's relation fields. */\nexport type RelatedMapFor<\n T extends ContentTypeInput<any>,\n TTypes extends readonly ContentTypeInput<any>[],\n> = {\n [K in keyof RelationFieldsOf<T[\"schema\"]> & string]: RelatedDoc<\n RelationFieldsOf<T[\"schema\"]>[K],\n InferDocMap<TTypes>\n >;\n};\n\n/**\n * The typed Scribe client returned by `createScribe()`.\n * Each content type id becomes a typed accessor: `scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …\n */\nexport type Scribe<TTypes extends readonly ContentTypeInput<any>[]> = {\n readonly [T in TTypes[number] as T[\"id\"]]: ContentTypeRuntime<\n InferDocFromTypeConfig<T>,\n RelatedMapFor<T, TTypes>\n >;\n} & {\n /** Sitemap entries (with hreflang alternates) for all routable types. */\n sitemap(\n options: import(\"../sitemap/types.js\").GenerateSitemapOptions,\n ): Promise<import(\"../sitemap/types.js\").SitemapEntry[]>;\n /** The resolved config (defaults applied, paths absolute). */\n config: ScribeConfig;\n project: ScribeProject;\n getType: ScribeProject[\"getType\"];\n listTypes: ScribeProject[\"listTypes\"];\n listRoutableTypes: ScribeProject[\"listRoutableTypes\"];\n};\n\n/** Typed client type from a config object type (for app-side type aliases). */\nexport type ScribeClient<C extends { types: readonly ContentTypeInput<any>[] }> = Scribe<\n C[\"types\"]\n>;\n\n/** Untyped project engine (CLI, validation, studio). Prefer `createScribe()` in apps. */\nexport interface ScribeProject {\n config: ScribeConfig;\n rootDir: string;\n storePath: string;\n getType: (id: string) => ContentTypeRuntime;\n listTypes: () => ContentTypeRuntime[];\n /** Content types with a `path` template (public URLs, hreflang, sitemap). */\n listRoutableTypes: () => ContentTypeRuntime[];\n}\n\n/** Identity helper that preserves content-type id and schema inference. */\nexport function defineConfig<const TTypes extends readonly ContentTypeInput<any>[]>(\n config: ScribeConfigInput<TTypes>,\n): ScribeConfigInput<TTypes> {\n return config;\n}\n\n/** Identity helper for a single content type entry. */\nexport function defineContentType<\n const TId extends string,\n TSchema extends z.ZodTypeAny,\n>(\n config: ContentTypeInput<TSchema> & { id: TId },\n): ContentTypeInput<TSchema> & { id: TId } {\n return config;\n}\n","import type {\n ContentTypeInput,\n ContentTypeRuntime,\n Scribe,\n ScribeConfigInput,\n} from \"./core/types.js\";\nimport { resolveConfig } from \"./config/resolve-config.js\";\nimport { createProject } from \"./create-project.js\";\nimport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nimport type { GenerateSitemapOptions } from \"./sitemap/types.js\";\n\n/**\n * Create the typed Scribe client. Each content type id becomes a typed\n * accessor (`scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …),\n * plus `scribe.sitemap()`.\n *\n * Pass the object returned by `defineConfig()`; defaults and path resolution\n * are applied here.\n */\nexport function createScribe<const TTypes extends readonly ContentTypeInput<any>[]>(\n input: ScribeConfigInput<TTypes>,\n): Scribe<TTypes> {\n const config = resolveConfig(input);\n const project = createProject(config);\n const scribe = {\n config,\n project,\n getType: project.getType,\n listTypes: project.listTypes,\n listRoutableTypes: project.listRoutableTypes,\n sitemap(options: GenerateSitemapOptions) {\n return generateSitemap(project, options);\n },\n } as unknown as Scribe<TTypes>;\n\n for (const type of config.types) {\n (scribe as unknown as Record<string, ContentTypeRuntime>)[type.id] =\n project.getType(type.id);\n }\n\n return scribe;\n}\n","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\n LocaleFallbacks,\n ScribeConfig,\n ScribeConfigInput,\n} from \"../core/types.js\";\nimport { assertValidPathTemplate } from \"../i18n/build-url.js\";\n\nconst RESOLVED = Symbol.for(\"@genlook/scribe/resolvedConfig\");\n\n/** Whether a config object has already been normalized by `resolveConfig()`. */\nexport function isResolvedConfig(config: unknown): config is ScribeConfig {\n return (\n typeof config === \"object\" &&\n config !== null &&\n (config as Record<symbol, unknown>)[RESOLVED] === true\n );\n}\n\n/**\n * Normalize a user config: apply defaults, make paths absolute, and validate\n * invariants. Every entry point (`createScribe`, the CLI's `loadConfigSync`)\n * must pass configs through here so runtimes never see partial configs.\n *\n * @param baseDir directory used to resolve a relative `rootDir`\n * (the config file's directory for the CLI; `process.cwd()` otherwise).\n */\nexport function resolveConfig(\n input: ScribeConfigInput<any> | ScribeConfig,\n baseDir?: string,\n): ScribeConfig {\n if (isResolvedConfig(input)) return input;\n const raw = input as ScribeConfigInput;\n\n if (!raw.rootDir) {\n throw new Error(\"scribe config: rootDir is required\");\n }\n if (!raw.locales || raw.locales.length === 0) {\n throw new Error(\"scribe config: locales must be a non-empty array\");\n }\n const defaultLocale = raw.defaultLocale ?? \"en\";\n if (!raw.locales.includes(defaultLocale)) {\n throw new Error(\n `scribe config: defaultLocale \"${defaultLocale}\" is not in locales [${raw.locales.join(\", \")}]`,\n );\n }\n\n const localeRouting = raw.localeRouting ?? {\n strategy: \"path-prefix\" as const,\n prefixDefaultLocale: false,\n };\n if (localeRouting.strategy === \"search-param\" && !localeRouting.param) {\n throw new Error('scribe config: localeRouting search-param requires a \"param\" name');\n }\n\n const localeFallbacks =\n raw.localeFallbacks === false\n ? {}\n : deriveLocaleFallbacks(raw.locales, defaultLocale);\n\n const projectRoot = path.resolve(baseDir ?? process.cwd(), raw.rootDir);\n const contentRoot = path.resolve(projectRoot, raw.contentDir ?? \"content\");\n const storePath = path.resolve(projectRoot, raw.store ?? \".scribe/store.sqlite\");\n const assetsPath = raw.assetsDir ? path.resolve(projectRoot, raw.assetsDir) : undefined;\n\n const seenIds = new Set<string>();\n const types: ContentTypeConfig[] = raw.types.map((type) => {\n if (seenIds.has(type.id)) {\n throw new Error(`scribe config: duplicate content type id \"${type.id}\"`);\n }\n seenIds.add(type.id);\n if (type.path) {\n assertValidPathTemplate(type.path, type.id);\n }\n return {\n ...type,\n contentDir: type.contentDir ?? type.id,\n label: type.label ?? type.id.charAt(0).toUpperCase() + type.id.slice(1),\n slugStrategy: type.slugStrategy ?? \"fixed\",\n indexFallback: type.indexFallback ?? (type.path ? \"en\" : \"none\"),\n };\n });\n\n const config: ScribeConfig = {\n rootDir: contentRoot,\n storePath,\n assetsPath,\n locales: [...raw.locales],\n defaultLocale,\n localeRouting,\n localePresets: raw.localePresets,\n localeFallbacks,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n\n/**\n * Derive fallback chains from locale tags: each locale falls back to its\n * successively shorter tag prefixes (longest first) that are themselves\n * configured, e.g. `\"zh-Hant-TW\"` → `[\"zh-Hant\", \"zh\"]`. Prefix matching is\n * case-insensitive (BCP-47 casing varies); chains store the configured\n * spelling. The default locale is excluded — it stays the implicit final\n * fallback so `indexFallback: \"none\"` keeps its meaning.\n */\nfunction deriveLocaleFallbacks(\n locales: readonly string[],\n defaultLocale: string,\n): LocaleFallbacks {\n const byLowercase = new Map(locales.map((l) => [l.toLowerCase(), l]));\n const fallbacks: LocaleFallbacks = {};\n for (const locale of locales) {\n const subtags = locale.split(\"-\");\n if (subtags.length < 2) continue;\n const chain: string[] = [];\n for (let end = subtags.length - 1; end >= 1; end--) {\n const prefix = byLowercase.get(subtags.slice(0, end).join(\"-\").toLowerCase());\n if (prefix && prefix !== locale && prefix !== defaultLocale) {\n chain.push(prefix);\n }\n }\n if (chain.length > 0) {\n fallbacks[locale] = chain;\n }\n }\n return fallbacks;\n}\n","import 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 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 { 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): ContentTypeRuntime {\n const load = createContentLoader(config, type);\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 * @internal\n */\nexport function createProject(config: ScribeConfig): 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 for (const type of config.types) {\n runtimes.set(type.id, buildRuntime(config, type, getRuntime));\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 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 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 { 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 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 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","/** 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","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 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 { documentLastModified, resolveCanonicalPathname } from \"../core/builtin-fields.js\";\nimport type { AllDocuments, ContentTypeConfig, ScribeConfig, ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { getRedirectSourceSlugs } from \"../redirects/build-redirects.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { joinBaseUrl } from \"./join-base-url.js\";\nimport type { GenerateSitemapOptions, SitemapEntry } from \"./types.js\";\n\nfunction shouldIncludeEnDoc(\n enDoc: ScribeDocument,\n enSlug: string,\n redirectSources: ReturnType<typeof getRedirectSourceSlugs>,\n contentTypeId: string,\n excludeNoindex: boolean,\n): boolean {\n if (redirectSources.aliasSlugs.has(enSlug)) return false;\n const outbound = redirectSources.outboundByType.get(contentTypeId);\n if (outbound?.has(enSlug)) return false;\n if (excludeNoindex && enDoc.noindex) return false;\n return true;\n}\n\ntype ResolvedSitemapOptions = GenerateSitemapOptions & {\n resolveUrl: (locale: string, pathname: string) => string | Promise<string>;\n};\n\nfunction resolveSitemapOptions(options: GenerateSitemapOptions): ResolvedSitemapOptions {\n return {\n ...options,\n resolveUrl:\n options.resolveUrl ??\n ((_locale, pathname) => joinBaseUrl(options.baseUrl, pathname)),\n };\n}\n\nasync function buildClusterEntry(\n type: ContentTypeConfig,\n enSlug: string,\n enDoc: ScribeDocument,\n allDocs: AllDocuments,\n config: ScribeConfig,\n options: ResolvedSitemapOptions,\n): Promise<SitemapEntry | null> {\n const { defaultLocale, locales } = config;\n const excludeNoindex = options.excludeNoindex !== false;\n const includeXDefault = options.includeXDefault !== false;\n const typeDefaults = options.typeDefaults?.[type.id];\n\n const pathnameFor = (doc: ScribeDocument): string =>\n options.resolvePathname?.(type, doc, defaultLocale) ??\n resolveCanonicalPathname(type, doc, defaultLocale);\n\n const alternates: Record<string, string> = {};\n\n for (const locale of locales) {\n const idx = allDocs.get(locale);\n if (!idx) continue;\n\n const doc =\n locale === defaultLocale\n ? idx.bySlug.get(enSlug)\n : idx.byEnSlug.get(enSlug);\n\n if (!doc) continue;\n if (excludeNoindex && doc.noindex) continue;\n\n const pathname = pathnameFor(doc);\n alternates[locale] = await options.resolveUrl(locale, pathname);\n }\n\n if (Object.keys(alternates).length === 0) return null;\n\n const mainUrl =\n alternates[defaultLocale] ?? alternates[Object.keys(alternates)[0]!]!;\n\n if (includeXDefault && alternates[defaultLocale]) {\n alternates[\"x-default\"] = alternates[defaultLocale];\n }\n\n const lastModified = documentLastModified(enDoc);\n\n return {\n url: mainUrl,\n ...(lastModified ? { lastModified } : {}),\n ...(typeDefaults?.changeFrequency\n ? { changeFrequency: typeDefaults.changeFrequency }\n : {}),\n ...(typeDefaults?.priority !== undefined ? { priority: typeDefaults.priority } : {}),\n alternates: { languages: alternates },\n };\n}\n\n/** Build sitemap entries with hreflang alternates for routable content types. */\nexport async function generateSitemap(\n project: ScribeProject,\n options: GenerateSitemapOptions,\n): Promise<SitemapEntry[]> {\n const resolvedOptions = resolveSitemapOptions(options);\n const { config } = project;\n const redirectSources = getRedirectSourceSlugs(project);\n const excludeNoindex = options.excludeNoindex !== false;\n\n const typeIds =\n options.contentTypes ??\n config.types.filter(isRoutableType).map((t) => t.id);\n\n const entries: SitemapEntry[] = [];\n\n for (const typeId of typeIds) {\n const runtime = project.getType(typeId);\n const type = runtime.config;\n if (!isRoutableType(type)) continue;\n\n const allDocs = runtime.load();\n const enIndex = allDocs.get(config.defaultLocale);\n if (!enIndex) continue;\n\n const processed = new Set<string>();\n\n for (const [enSlug, enDoc] of enIndex.bySlug) {\n if (processed.has(enSlug)) continue;\n processed.add(enSlug);\n\n if (\n !shouldIncludeEnDoc(enDoc, enSlug, redirectSources, typeId, excludeNoindex)\n ) {\n continue;\n }\n\n const entry = await buildClusterEntry(\n type,\n enSlug,\n enDoc,\n allDocs,\n config,\n resolvedOptions,\n );\n if (entry) entries.push(entry);\n }\n }\n\n return entries;\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport {\n buildJsonRedirects,\n buildLegacyNoBlogPathRedirects,\n buildRedirectSourceSlugSet,\n} from \"./build-json-redirects.js\";\nimport {\n collectOutboundRedirectSourcesByType,\n collectRedirectSourceSlugs,\n loadAllTypeRedirects,\n} from \"./load-type-redirects.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). Deprecated: derived from localeRouting when omitted. */\n prefixedLocales?: string[];\n}\n\nfunction buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): Map<string, Map<string, string>> {\n const runtime = project.getType(typeId);\n const { config } = project;\n const merged = buildTranslationIndex(\n runtime.load(),\n config.locales,\n config.defaultLocale,\n );\n\n const db = openStore(project.config, \"readonly\");\n try {\n for (const alias of redirectSourceSlugs) {\n for (const row of listTranslationsForEnSlug(db, typeId, alias)) {\n const localeMap = merged.get(row.locale) ?? new Map<string, string>();\n if (!localeMap.has(alias)) {\n localeMap.set(alias, row.slug);\n }\n merged.set(row.locale, localeMap);\n }\n }\n } finally {\n db.close();\n }\n\n return merged;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const translationIndex = buildRedirectTranslationIndex(project, typeId, redirectSourceSlugs);\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const [locale, localeMap] of translationIndex) {\n for (const [enSlug, translatedSlug] of localeMap) {\n if (enSlug === translatedSlug) continue;\n if (redirectSourceSlugs.has(enSlug)) continue;\n out.push({\n source: urlBuilder.resolvePath(pathTemplate, enSlug, locale),\n destination: urlBuilder.resolvePath(pathTemplate, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(project: ScribeProject, typeId: string): NextRedirectRule[] {\n const loaded = loadAllTypeRedirects(project.config).find((file) => file.contentTypeId === typeId);\n const redirectSourceSlugs = new Set<string>();\n if (loaded) {\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n redirectSourceSlugs.add(from);\n }\n }\n }\n\n return [\n ...buildCrossLocaleSlugRedirects(project, typeId, redirectSourceSlugs),\n ];\n}\n\n/** Build Next.js redirect rules from `_redirects.json`, locale slug fixes, and legacy blog paths. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n _options: BuildRedirectsOptions = {},\n): NextRedirectRule[] {\n const redirectSourceKeys = buildRedirectSourceSlugSet(project);\n const out: NextRedirectRule[] = [\n ...buildJsonRedirects(project),\n ...buildLegacyNoBlogPathRedirects(project, redirectSourceKeys),\n ];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All inbound redirect source slugs — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirects — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (redirect sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const loaded = loadAllTypeRedirects(project.config);\n const aliasSlugs = collectRedirectSourceSlugs(loaded);\n const outboundByType = collectOutboundRedirectSourcesByType(loaded);\n\n for (const type of project.config.types) {\n if (!outboundByType.has(type.id)) {\n outboundByType.set(type.id, new Set());\n }\n }\n\n return {\n aliasSlugs,\n outboundByType,\n };\n}\n\nexport { listEnSlugs };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeConfig } from \"./types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport function enFileExists(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): boolean {\n const dir = path.join(config.rootDir, type.contentDir);\n return (\n fs.existsSync(path.join(dir, `${enSlug}.mdx`)) ||\n fs.existsSync(path.join(dir, `${enSlug}.md`))\n );\n}\n\nexport function sqliteHasTranslations(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n): boolean {\n return listTranslationsForEnSlug(db, contentTypeId, enSlug).length > 0;\n}\n\nexport function isAliasKnown(\n config: ScribeConfig,\n type: ContentTypeConfig,\n aliasEnSlug: string,\n db: Database.Database,\n): boolean {\n return enFileExists(config, type, aliasEnSlug) || sqliteHasTranslations(db, type.id, aliasEnSlug);\n}\n\nexport function listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n","import type { AllDocuments } from \"../core/types.js\";\n\n/**\n * Internal: locale → (en_slug → locale slug) map for all non-default locales.\n * Consumed by `staticParams()`, `alternates()`, and redirect expansion.\n */\nexport function buildTranslationIndex(\n allDocs: AllDocuments,\n locales: readonly string[],\n defaultLocale: string,\n): Map<string, Map<string, string>> {\n const index = new Map<string, Map<string, string>>();\n for (const locale of locales) {\n if (locale === defaultLocale) continue;\n const idx = allDocs.get(locale);\n if (!idx) continue;\n const localeMap = new Map<string, string>();\n for (const [enSlug, doc] of idx.byEnSlug) {\n localeMap.set(enSlug, doc.slug);\n }\n index.set(locale, localeMap);\n }\n return index;\n}\n","import type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport { loadTypeRedirectsFile } from \"./load-type-redirects.js\";\nimport type { ParsedRedirectEntry } from \"./redirect-schema.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nfunction localizedSlug(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n locale: string,\n defaultLocale: string,\n): string {\n if (locale === defaultLocale) return enSlug;\n const row = listTranslationsForEnSlug(db, contentTypeId, enSlug).find(\n (translation) => translation.locale === locale,\n );\n return row?.slug ?? enSlug;\n}\n\nfunction resolveSlugTargetDestination(\n project: ScribeProject,\n db: Database.Database,\n targetType: ContentTypeConfig,\n toSlug: string,\n locale: string,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): string {\n const targetSlug = localizedSlug(\n db,\n targetType.id,\n toSlug,\n locale,\n project.config.defaultLocale,\n );\n return urlBuilder.resolvePath(targetType.path!, targetSlug, locale);\n}\n\nfunction buildEntryRules(\n project: ScribeProject,\n sourceType: ContentTypeConfig,\n entry: ParsedRedirectEntry,\n db: Database.Database,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): NextRedirectRule[] {\n if (!isRoutableType(sourceType)) return [];\n\n const out: NextRedirectRule[] = [];\n const { defaultLocale } = project.config;\n\n let targetType: ContentTypeConfig = sourceType;\n if (entry.kind === \"cross-type\") {\n const resolvedTarget = project.config.types.find((type) => type.id === entry.toType);\n if (!resolvedTarget?.path) return out;\n targetType = resolvedTarget;\n }\n\n for (const fromEnSlug of entry.fromSlugs) {\n const locales = project.config.locales;\n for (const locale of locales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n const source = urlBuilder.resolvePath(sourceType.path!, fromSlug, locale);\n\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n if (source === destination) continue;\n\n out.push({\n source,\n destination,\n permanent: entry.permanent,\n });\n }\n\n if (sourceType.id === \"blog\") {\n let destinationEn: string;\n if (entry.kind === \"anywhere\") {\n destinationEn = entry.toUrl!;\n } else {\n destinationEn = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n defaultLocale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${fromEnSlug}`,\n destination: destinationEn,\n permanent: entry.permanent,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${locale}/${fromSlug}`,\n destination,\n permanent: entry.permanent,\n });\n\n out.push({\n source: `/${locale}/${fromEnSlug}`,\n destination,\n permanent: entry.permanent,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function buildJsonRedirects(project: ScribeProject): NextRedirectRule[] {\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n\n for (const entry of loaded.entries) {\n out.push(...buildEntryRules(project, type, entry, db, urlBuilder));\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n\nexport function buildRedirectSourceSlugSet(project: ScribeProject): Set<string> {\n const out = new Set<string>();\n for (const type of project.config.types) {\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n out.add(`${type.id}:${from}`);\n }\n }\n }\n return out;\n}\n\nexport function buildLegacyNoBlogPathRedirects(\n project: ScribeProject,\n redirectSourceKeys: Set<string>,\n): NextRedirectRule[] {\n const blogType = project.config.types.find((type) => type.id === \"blog\" && type.path);\n if (!blogType?.path) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const enSlug of listEnSlugs(project.config.rootDir, blogType.contentDir)) {\n if (redirectSourceKeys.has(`blog:${enSlug}`)) continue;\n\n out.push({\n source: `/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, enSlug, project.config.defaultLocale),\n permanent: true,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const translatedSlug = localizedSlug(\n db,\n blogType.id,\n enSlug,\n locale,\n project.config.defaultLocale,\n );\n out.push({\n source: `/${locale}/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n","import 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 { 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","/** Join site origin and pathname without double slashes. */\nexport function joinBaseUrl(baseUrl: string, pathname: string): string {\n const origin = baseUrl.replace(/\\/$/, \"\");\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${origin}${path}`;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ScribeConfig, ScribeConfigInput } from \"../core/types.js\";\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\n/** Find scribe.config.ts/mts/js in a directory. */\nexport function findConfigPath(cwd: string): string | null {\n const candidates = [\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.ts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.mts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.js\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate;\n }\n }\n return null;\n}\n\n/** Load and resolve scribe.config.ts synchronously (CLI). */\nexport function loadConfigSync(options: LoadConfigOptions = {}): ScribeConfig {\n const cwd = options.cwd ?? /* turbopackIgnore: true */ process.cwd();\n const configPath = options.configPath ?? findConfigPath(cwd);\n if (!configPath) {\n throw new Error(`No scribe.config.ts found in ${cwd} (pass --config)`);\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const loaded = jiti(configPath) as ScribeConfigInput | { default: ScribeConfigInput };\n const config = \"default\" in loaded ? loaded.default : loaded;\n if (!config?.rootDir) {\n throw new Error(`Invalid scribe config at ${configPath}: missing rootDir`);\n }\n return resolveConfig(config, path.dirname(configPath));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } 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 { validateDocumentAssets } from \"./validate-assets.js\";\nimport { validateTranslationSlugSuffixes } from \"./validate-slug-suffix.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\nfunction validateDocumentMdxBody(\n issues: ValidateIssue[],\n input: {\n contentType: string;\n enSlug: string;\n locale: string;\n body: string;\n },\n): void {\n const preparedBody = prepareTranslatedMdxBody(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 for (const issue of validateDocumentAssets(config, {\n contentType: type.id,\n enSlug,\n frontmatter: enDoc.frontmatter,\n body: enDoc.content,\n })) {\n issues.push(issue);\n }\n\n validateDocumentMdxBody(issues, {\n contentType: type.id,\n enSlug,\n locale: config.defaultLocale,\n body: enDoc.content,\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(config, {\n contentType: type.id,\n enSlug,\n locale,\n frontmatter: localeFm,\n body: preparedBody,\n })) {\n issues.push(issue);\n }\n\n validateDocumentMdxBody(issues, {\n contentType: type.id,\n enSlug,\n locale,\n body: row.body,\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 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 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\nfunction 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 { 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: \"warning\";\n contentType?: string;\n enSlug?: string;\n locale?: string;\n field?: string;\n message: string;\n}\n\n/** Warn when referenced image paths are missing from the configured assets folder. */\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): 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 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","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","/** 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 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\";\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 contentType?: string;\n locales?: string[];\n enSlug?: string;\n /** Which pages to include: all stale/missing (default) or missing only. */\n strategy?: TranslationWorklistStrategy;\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\n for (const type of config.types) {\n if (options.contentType && type.id !== options.contentType) 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 if (existing.en_hash !== currentEnHash) {\n items.push({\n contentType: type.id,\n enSlug,\n locale,\n reason: \"stale\",\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 { 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 { ScribeConfig } from \"../core/types.js\";\nimport { listBatchItems, type BatchJobRow } from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n failedResultForItem,\n planBatchJobs,\n pollAndIngestBatchJobs,\n readPendingBatchWork,\n submitBatchJobPlan,\n} from \"./batch-worklist.js\";\nimport { translatePageWithGemini } from \"./gemini-client.js\";\nimport { normalizeGeminiDisplayName, resolveGeminiModelId } from \"./gemini-models.js\";\nimport {\n baseForItem,\n displayModelFor,\n finalizeTranslation,\n prepareTranslation,\n summarizeResults,\n translationItemKey,\n type PreparedTranslation,\n type PrepareOutcome,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport {\n finalizeTranslation,\n type PreparedTranslation,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n};\n\nasync function runPool<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) return;\n let nextIndex = 0;\n const runners = Array.from({ length: Math.min(concurrency, items.length) }, async () => {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n await worker(items[index]!, index);\n }\n });\n await Promise.all(runners);\n}\n\nfunction labelForItem(item: TranslationWorkItem): string {\n return `${item.contentType}/${item.enSlug}@${item.locale}`;\n}\n\n/**\n * Build the retry worklist from the failed results of a completed pass. Each\n * retry item carries the original item's EN hash plus the verbatim error from\n * the failed attempt, so the retry prompt can ask the model to fix exactly those\n * validation issues. Items whose failure has no original work item (e.g. resumed\n * batch items from a prior run) are rebuilt from the result alone; `force` is set\n * so a freshly-upserted-then-rejected slot is not treated as up to date.\n */\nexport function buildRetryWorklist(\n failed: TranslatePageResult[],\n originalByKey: Map<string, TranslationWorkItem>,\n): TranslationWorkItem[] {\n return failed.map((result) => {\n const key = translationItemKey(result);\n const original = originalByKey.get(key);\n return {\n contentType: result.contentType,\n enSlug: result.enSlug,\n locale: result.locale,\n reason: original?.reason ?? \"missing\",\n currentEnHash: original?.currentEnHash ?? \"\",\n storedEnHash: original?.storedEnHash,\n previousError: result.error ?? \"Translation failed\",\n };\n });\n}\n\n/**\n * Re-translate a set of already-failed items exactly once, appending each item's\n * verbatim validation error to the prompt suffix. Batch runs submit the retry\n * items as one additional batch job (batch-priced); direct runs retry with a\n * direct pool honoring `concurrency`. Pending jobs from prior runs are NOT\n * touched here — this only covers the items that failed in the just-finished\n * pass. Returns one result per retry item (translated or newly failed); these\n * items are never retried a second time within the run.\n */\nexport async function runRetryRound(\n config: ScribeConfig,\n retryItems: TranslationWorkItem[],\n options: {\n model?: string;\n force?: boolean;\n concurrency: number;\n mode: TranslateMode;\n onResult: (result: TranslatePageResult) => void;\n onProgress?: (event: TranslateProgressEvent) => void;\n /** Injectable single-item translator (tests); defaults to translatePage. */\n translateOne?: (\n item: TranslationWorkItem,\n ) => Promise<TranslatePageResult>;\n },\n): Promise<void> {\n const startedAt = Date.now();\n // force: the failed pass may have left nothing stored, but if a stale row\n // exists we must still re-translate rather than skip as fresh.\n const translateOne =\n options.translateOne ??\n ((item: TranslationWorkItem) =>\n translatePage(config, item, { model: options.model, force: true }));\n\n if (options.mode === \"direct\") {\n const active = new Set<string>();\n await runPool(retryItems, options.concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translateOne(item);\n active.delete(label);\n options.onResult(result);\n });\n return;\n }\n\n // Batch retry: prepare, plan one job group, submit, poll+ingest — the same\n // machinery as the main batch pass but scoped to just the retry items and\n // without adopting any pending jobs.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of retryItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, { model: options.model, force: true }, itemStartedAt);\n if (outcome.status === \"done\") {\n options.onResult(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n options.onResult(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: planIndex,\n jobCount: plans.length,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n options.onResult(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll = submitted.filter((row): row is BatchJobRow => row !== undefined);\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount: jobsToPoll.length,\n onProgress: options.onProgress,\n onResult: options.onResult,\n });\n }\n}\n\n/**\n * Translate one locale page via a direct (interactive) Gemini call and upsert\n * into SQLite. Used by the studio server and other single-page callers; the\n * worklist path defaults to the Batch API instead.\n */\nexport async function translatePage(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<TranslatePageResult> {\n const startedAt = Date.now();\n\n let outcome: PrepareOutcome;\n try {\n outcome = prepareTranslation(config, item, options, startedAt);\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n if (outcome.status === \"done\") return outcome.result;\n const prepared = outcome.prepared;\n\n if (options.dryRun) {\n return {\n ...baseForItem(item),\n skipped: false,\n model: prepared.model,\n durationMs: Date.now() - startedAt,\n };\n }\n\n try {\n const result = await translatePageWithGemini({\n prompt: prepared.prompt,\n model: prepared.model,\n responseSchema: prepared.responseSchema,\n });\n return finalizeTranslation(\n config,\n prepared,\n { model: result.model, parsed: result.parsed, usage: result.usage },\n { costMode: \"interactive\", startedAt },\n );\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n}\n\ninterface ResultCollector {\n emit: (result: TranslatePageResult) => void;\n assemble: () => TranslatePageResult[];\n}\n\n/**\n * Route results into their input worklist slot (by item identity) so output\n * order matches input; results with no matching input item (resumed jobs from\n * a previous run) are appended after.\n */\nfunction createResultCollector(\n items: TranslationWorkItem[],\n onProgress?: (event: TranslateProgressEvent) => void,\n): ResultCollector {\n const slotByKey = new Map<string, number>();\n items.forEach((item, index) => slotByKey.set(translationItemKey(item), index));\n const slots: (TranslatePageResult | undefined)[] = new Array(items.length);\n const extras: TranslatePageResult[] = [];\n\n return {\n emit(result) {\n const slot = slotByKey.get(translationItemKey(result));\n if (slot !== undefined && slots[slot] === undefined) slots[slot] = result;\n else extras.push(result);\n onProgress?.({ type: \"item-done\", result });\n },\n assemble() {\n return [\n ...slots.filter((result): result is TranslatePageResult => result !== undefined),\n ...extras,\n ];\n },\n };\n}\n\n/**\n * Translate a batch of worklist items. By default the whole worklist goes\n * through the Gemini Batch API (50% token pricing): jobs are planned upfront\n * (grouped by model, chunked by size), submitted together, persisted for\n * resumability, then polled until every job lands. `mode: \"direct\"` restores\n * the interactive per-page pool (where `concurrency` applies). Any pending\n * jobs from a previous interrupted run are polled and ingested alongside the\n * new work, and their in-flight items are excluded from resubmission.\n */\nexport async function translateWorklist(\n config: ScribeConfig,\n items: TranslationWorkItem[],\n options: {\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n concurrency?: number;\n mode?: TranslateMode;\n onProgress?: (event: TranslateProgressEvent) => void;\n } = {},\n): Promise<TranslatePageResult[]> {\n const mode: TranslateMode = options.mode ?? \"batch\";\n const concurrency = Math.max(1, options.concurrency ?? 3);\n const startedAt = Date.now();\n\n // Dry run: report per-item work without touching the API or pending jobs.\n if (options.dryRun) {\n options.onProgress?.({\n type: \"start\",\n total: items.length,\n concurrency,\n dryRun: true,\n model: options.model,\n mode,\n });\n const results = items.map((item) => {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n return outcome.status === \"done\"\n ? outcome.result\n : {\n ...baseForItem(item),\n skipped: false,\n model: outcome.prepared.model,\n durationMs: Date.now() - itemStartedAt,\n };\n } catch (error) {\n return failedResultForItem(item, error, itemStartedAt);\n }\n });\n for (const result of results) options.onProgress?.({ type: \"item-done\", result });\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n }\n\n // Pending jobs from a previous run are polled alongside the new work; their\n // in-flight items are excluded from resubmission (their results arrive when\n // the pending job is ingested).\n const pending = readPendingBatchWork(config);\n const inputKeys = new Set(items.map((item) => translationItemKey(item)));\n const resumedExtraCount = pending.pendingItems.filter(\n (item) => !inputKeys.has(translationItemKey(item)),\n ).length;\n\n options.onProgress?.({\n type: \"start\",\n total: items.length + resumedExtraCount,\n concurrency,\n dryRun: false,\n model: options.model,\n mode,\n });\n\n const collector = createResultCollector(items, options.onProgress);\n const workItems = items.filter((item) => !pending.inFlightKeys.has(translationItemKey(item)));\n\n if (mode === \"direct\") {\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, pending.jobs.length, options.onProgress);\n const active = new Set<string>();\n await Promise.all([\n runPool(workItems, concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translatePage(config, item, options);\n active.delete(label);\n collector.emit(result);\n }),\n pending.jobs.length > 0\n ? pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: collector.emit,\n })\n : Promise.resolve(),\n ]);\n } else {\n // Prepare every remaining item; fresh pages skip, broken items fail.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of workItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n if (outcome.status === \"done\") {\n collector.emit(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n collector.emit(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const jobCount = pending.jobs.length + plans.length;\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, jobCount, options.onProgress);\n\n // Submit every job upfront (concurrently), persisting each as soon as its\n // create call returns — Ctrl+C during polling loses nothing.\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: pending.jobs.length + planIndex,\n jobCount,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n collector.emit(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll: BatchJobRow[] = [\n ...pending.jobs,\n ...submitted.filter((row): row is BatchJobRow => row !== undefined),\n ];\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount,\n onProgress: options.onProgress,\n onResult: collector.emit,\n });\n }\n }\n\n const mainResults = collector.assemble();\n\n // One-shot retry round: re-translate every validation failure once, feeding\n // the verbatim error back into the prompt suffix. Items still failing after\n // this are not retried again in the same run.\n const failed = mainResults.filter((result) => result.failed);\n if (failed.length === 0) {\n const totals = summarizeResults(mainResults, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results: mainResults, totals });\n return mainResults;\n }\n\n options.onProgress?.({ type: \"retry-start\", failed });\n\n const originalByKey = new Map<string, TranslationWorkItem>(\n items.map((item) => [translationItemKey(item), item]),\n );\n const retryItems = buildRetryWorklist(failed, originalByKey);\n const retryByKey = new Map<string, TranslatePageResult>();\n await runRetryRound(config, retryItems, {\n model: options.model,\n force: options.force,\n concurrency,\n mode,\n onProgress: options.onProgress,\n onResult: (result) => {\n retryByKey.set(translationItemKey(result), result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n // Merge: replace each failed slot with its retry outcome (translated or newly\n // failed). Results with no retry outcome (should not happen) keep the original.\n const results = mainResults.map((result) => {\n if (!result.failed) return result;\n return retryByKey.get(translationItemKey(result)) ?? result;\n });\n const retriedTranslated = failed.filter((original) => {\n const retried = retryByKey.get(translationItemKey(original));\n return retried !== undefined && !retried.failed && !retried.skipped;\n }).length;\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals, retriedTranslated });\n return results;\n}\n\nfunction countPendingItems(config: ScribeConfig, jobs: BatchJobRow[]): Map<number, number> {\n if (jobs.length === 0) return new Map();\n const db = openStore(config, \"readonly\");\n const counts = new Map<number, number>();\n for (const job of jobs) {\n counts.set(job.id, listBatchItems(db, job.id).filter((i) => i.status === \"pending\").length);\n }\n db.close();\n return counts;\n}\n\nfunction emitResumedJobs(\n jobs: BatchJobRow[],\n counts: Map<number, number>,\n jobCount: number,\n onProgress?: (event: TranslateProgressEvent) => void,\n): void {\n jobs.forEach((job, jobIndex) => {\n onProgress?.({\n type: \"batch-submitted\",\n name: job.job_name,\n count: counts.get(job.id) ?? 0,\n model: job.display_model,\n jobIndex,\n jobCount,\n resumed: true,\n createdAt: job.created_at,\n });\n });\n}\n\n/**\n * Poll and ingest pending batch jobs from a previous run without submitting\n * anything new (`scribe translate --resume`). Returns null when there is\n * nothing to resume.\n */\nexport async function resumeTranslationJobs(\n config: ScribeConfig,\n options: { onProgress?: (event: TranslateProgressEvent) => void } = {},\n): Promise<TranslatePageResult[] | null> {\n const startedAt = Date.now();\n const pending = readPendingBatchWork(config);\n if (pending.jobs.length === 0) return null;\n\n options.onProgress?.({\n type: \"start\",\n total: pending.pendingItems.length,\n concurrency: 1,\n dryRun: false,\n mode: \"batch\",\n });\n const counts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, counts, pending.jobs.length, options.onProgress);\n\n const results: TranslatePageResult[] = [];\n await pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: (result) => {\n results.push(result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n}\n","import type Database from \"better-sqlite3\";\n\nexport type BatchItemStatus = \"pending\" | \"done\" | \"failed\" | \"stale-skipped\";\n\nexport interface BatchJobRow {\n id: number;\n job_name: string;\n model: string;\n display_model: string;\n created_at: string;\n state: string;\n completed_at: string | null;\n}\n\nexport interface BatchItemRow {\n job_id: number;\n request_index: number;\n content_type: string;\n en_slug: string;\n locale: string;\n en_hash: string;\n snapshot_id: number;\n status: BatchItemStatus;\n error: string | null;\n}\n\nexport interface BatchJobInput {\n jobName: string;\n model: string;\n displayModel: string;\n state: string;\n createdAt: string;\n}\n\nexport interface BatchItemInput {\n requestIndex: number;\n contentType: string;\n enSlug: string;\n locale: string;\n enHash: string;\n snapshotId: number;\n}\n\nexport function insertBatchJob(db: Database.Database, input: BatchJobInput): number {\n const info = db\n .prepare(\n `INSERT INTO translation_batch_jobs (job_name, model, display_model, created_at, state)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(input.jobName, input.model, input.displayModel, input.createdAt, input.state);\n return Number(info.lastInsertRowid);\n}\n\nexport function insertBatchItems(\n db: Database.Database,\n jobId: number,\n items: BatchItemInput[],\n): void {\n const stmt = db.prepare(\n `INSERT INTO translation_batch_items (\n job_id, request_index, content_type, en_slug, locale, en_hash, snapshot_id, status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')`,\n );\n for (const item of items) {\n stmt.run(\n jobId,\n item.requestIndex,\n item.contentType,\n item.enSlug,\n item.locale,\n item.enHash,\n item.snapshotId,\n );\n }\n}\n\n/** Jobs not yet fully ingested (no completed_at), oldest first. */\nexport function listPendingBatchJobs(db: Database.Database): BatchJobRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_jobs WHERE completed_at IS NULL ORDER BY id`)\n .all() as BatchJobRow[];\n}\n\nexport function listBatchItems(db: Database.Database, jobId: number): BatchItemRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_items WHERE job_id = ? ORDER BY request_index`)\n .all(jobId) as BatchItemRow[];\n}\n\n/** Pending items across all non-completed jobs (i.e. requests still in flight). */\nexport function listPendingBatchItems(db: Database.Database): BatchItemRow[] {\n return db\n .prepare(\n `SELECT i.* FROM translation_batch_items i\n JOIN translation_batch_jobs j ON j.id = i.job_id\n WHERE j.completed_at IS NULL AND i.status = 'pending'\n ORDER BY i.job_id, i.request_index`,\n )\n .all() as BatchItemRow[];\n}\n\n/**\n * Atomically claim a terminal job for ingestion by stamping completed_at.\n * Returns false when another process already completed it — concurrent scribe\n * runs adopt each other's pending jobs, so two pollers can reach the same\n * terminal job; only the one whose claim succeeds may ingest its results.\n */\nexport function claimBatchJobCompletion(\n db: Database.Database,\n jobId: number,\n state: string,\n completedAt: string,\n): boolean {\n const info = db\n .prepare(\n `UPDATE translation_batch_jobs SET state = ?, completed_at = ?\n WHERE id = ? AND completed_at IS NULL`,\n )\n .run(state, completedAt, jobId);\n return info.changes > 0;\n}\n\nexport function updateBatchItemStatus(\n db: Database.Database,\n jobId: number,\n requestIndex: number,\n status: BatchItemStatus,\n error?: string,\n): void {\n db.prepare(\n `UPDATE translation_batch_items SET status = ?, error = ? WHERE job_id = ? AND request_index = ?`,\n ).run(status, error ?? null, jobId, requestIndex);\n}\n","import type { BatchJob } from \"@google/genai\";\nimport type { ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport {\n claimBatchJobCompletion,\n insertBatchItems,\n insertBatchJob,\n listBatchItems,\n listPendingBatchItems,\n listPendingBatchJobs,\n updateBatchItemStatus,\n type BatchItemRow,\n type BatchJobRow,\n} from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getEnSnapshot, getTranslation } from \"../storage/translations.js\";\nimport {\n createGeminiBatchJob,\n getGeminiBatchJob,\n isSuccessfulBatchState,\n isTerminalBatchState,\n normalizeBatchState,\n textFromBatchResponse,\n} from \"./gemini-batch.js\";\nimport { buildGeminiRequestConfig, parseGeminiResponse, usageFromResponse } from \"./gemini-client.js\";\nimport {\n baseForItem,\n finalizeTranslation,\n formatTranslateError,\n translationItemKey,\n type PreparedTranslation,\n type TranslatePageResult,\n type TranslateProgressEvent,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\n// The Gemini Batch API caps inline (non-file) submissions at 20MB of request\n// payload per job; the SDK types expose no explicit request-count limit. Stay\n// conservative: chunk at 100 requests or ~15MB of prompt text per job,\n// whichever comes first, leaving headroom for JSON envelope + schemas.\nexport const MAX_REQUESTS_PER_JOB = 100;\nexport const MAX_PROMPT_BYTES_PER_JOB = 15 * 1024 * 1024;\n\nconst INITIAL_POLL_MS = 5_000;\nconst MAX_POLL_MS = 30_000;\nconst POLL_BACKOFF_FACTOR = 1.5;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface BatchPlanEntry {\n apiModel: string;\n prompt: string;\n}\n\nexport interface BatchJobPlan<T extends BatchPlanEntry> {\n apiModel: string;\n entries: T[];\n}\n\n/**\n * Group entries by API model, then chunk each group by request count and total\n * prompt bytes so every plan fits in one inline batch job.\n */\nexport function planBatchJobs<T extends BatchPlanEntry>(entries: T[]): BatchJobPlan<T>[] {\n const byModel = new Map<string, T[]>();\n for (const entry of entries) {\n const group = byModel.get(entry.apiModel);\n if (group) group.push(entry);\n else byModel.set(entry.apiModel, [entry]);\n }\n\n const plans: BatchJobPlan<T>[] = [];\n for (const [apiModel, group] of byModel) {\n let current: T[] = [];\n let currentBytes = 0;\n for (const entry of group) {\n const size = Buffer.byteLength(entry.prompt, \"utf8\");\n if (\n current.length > 0 &&\n (current.length >= MAX_REQUESTS_PER_JOB || currentBytes + size > MAX_PROMPT_BYTES_PER_JOB)\n ) {\n plans.push({ apiModel, entries: current });\n current = [];\n currentBytes = 0;\n }\n current.push(entry);\n currentBytes += size;\n }\n if (current.length > 0) plans.push({ apiModel, entries: current });\n }\n return plans;\n}\n\nexport interface PendingBatchWork {\n jobs: BatchJobRow[];\n /** translationItemKey() of every request still in flight. */\n inFlightKeys: Set<string>;\n pendingItems: BatchItemRow[];\n}\n\n/**\n * Load non-completed batch jobs and their in-flight items from the store.\n * Opens the store readwrite so migrations run before the new tables are read.\n */\nexport function readPendingBatchWork(config: ScribeConfig): PendingBatchWork {\n const db = openStore(config, \"readwrite\");\n const jobs = listPendingBatchJobs(db);\n const pendingItems = listPendingBatchItems(db);\n db.close();\n const inFlightKeys = new Set(pendingItems.map((item) => translationItemKey(item)));\n return { jobs, inFlightKeys, pendingItems };\n}\n\nexport interface SubmitPlanInput<T extends BatchPlanEntry & { prepared: PreparedTranslation }> {\n plan: BatchJobPlan<T>;\n displayModel: string;\n jobIndex: number;\n jobCount: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n}\n\n/**\n * Submit one planned job and persist it (job row + item rows + EN snapshots)\n * immediately, before any polling starts, so an interrupt loses nothing.\n */\nexport async function submitBatchJobPlan<\n T extends BatchPlanEntry & { prepared: PreparedTranslation },\n>(config: ScribeConfig, input: SubmitPlanInput<T>): Promise<BatchJobRow> {\n const { plan, displayModel, jobIndex, jobCount } = input;\n const job = await createGeminiBatchJob({\n model: plan.apiModel,\n requests: plan.entries.map(({ prepared }) => ({\n contents: prepared.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: plan.apiModel,\n responseSchema: prepared.responseSchema,\n }),\n })),\n displayName: `scribe-translate-${new Date().toISOString().replace(/[:.]/g, \"-\")}-${jobIndex + 1}`,\n });\n\n const createdAt = new Date().toISOString();\n const db = openStore(config, \"readwrite\");\n const jobId = insertBatchJob(db, {\n jobName: job.name!,\n model: plan.apiModel,\n displayModel,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n createdAt,\n });\n insertBatchItems(\n db,\n jobId,\n plan.entries.map(({ prepared }, requestIndex) => ({\n requestIndex,\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n locale: prepared.item.locale,\n enHash: prepared.currentEnHash,\n // Snapshot the EN source now so ingestion after a resume does not depend\n // on the EN files still matching (or existing) on disk.\n snapshotId: recordEnSnapshot(\n config,\n {\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: prepared.payload.frontmatter,\n body: prepared.payload.body,\n },\n db,\n ),\n })),\n );\n const row: BatchJobRow = {\n id: jobId,\n job_name: job.name!,\n model: plan.apiModel,\n display_model: displayModel,\n created_at: createdAt,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n completed_at: null,\n };\n db.close();\n\n input.onProgress?.({\n type: \"batch-submitted\",\n name: job.name!,\n count: plan.entries.length,\n model: displayModel,\n jobIndex,\n jobCount,\n createdAt,\n });\n return row;\n}\n\n/** The subset of a Gemini BatchJob that ingestion needs (test-friendly). */\nexport interface BatchJobResultLike {\n state?: string;\n error?: { message?: string };\n dest?: { inlinedResponses?: Array<{ response?: unknown; error?: { message?: string } }> };\n}\n\n/**\n * Reconstruct a finalize-ready context from a persisted batch item. Prefers the\n * EN doc on disk (for structural frontmatter merging); falls back to the stored\n * EN snapshot when the file is gone.\n */\nfunction buildIngestContext(\n config: ScribeConfig,\n db: ReturnType<typeof openStore>,\n jobRow: BatchJobRow,\n itemRow: BatchItemRow,\n): PreparedTranslation {\n const type = config.types.find((t) => t.id === itemRow.content_type);\n if (!type) throw new Error(`Unknown content type ${itemRow.content_type}`);\n\n let enDoc: ScribeDocument | null = readEnDocument(config, type, itemRow.en_slug);\n if (!enDoc) {\n const snapshot = getEnSnapshot(db, itemRow.snapshot_id);\n if (!snapshot) {\n throw new Error(\n `EN document and snapshot #${itemRow.snapshot_id} not found for ${itemRow.en_slug}`,\n );\n }\n enDoc = {\n slug: itemRow.en_slug,\n enSlug: itemRow.en_slug,\n locale: config.defaultLocale,\n noindex: false,\n frontmatter: JSON.parse(snapshot.frontmatter_json) as Record<string, unknown>,\n content: snapshot.body,\n };\n }\n\n const item: TranslationWorkItem = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n reason: \"missing\",\n currentEnHash: itemRow.en_hash,\n };\n return {\n item,\n type,\n enDoc,\n // Unused on ingest: finalizeTranslation receives the pre-recorded snapshotId.\n payload: { frontmatter: enDoc.frontmatter as Record<string, unknown>, body: enDoc.content },\n currentEnHash: itemRow.en_hash,\n existingSlug: getTranslation(db, type.id, itemRow.en_slug, itemRow.locale)?.slug,\n model: jobRow.display_model,\n prompt: \"\",\n responseSchema: undefined,\n };\n}\n\n/**\n * Ingest a terminal batch job: run every pending item through the shared\n * finalize path (or mark it failed), update item statuses, and mark the job\n * completed. Returns one result per pending item, or null when a concurrent\n * scribe process already claimed and ingested the job (runs adopt each\n * other's pending jobs, so two pollers can reach the same terminal job).\n *\n * The completion claim is stamped before items are processed so exactly one\n * process ingests. Ingestion is synchronous end-to-end; should a hard kill\n * still land mid-way, the leftover items are no longer counted in-flight and\n * the next run simply resubmits them.\n */\nexport function ingestBatchJob(\n config: ScribeConfig,\n jobRow: BatchJobRow,\n batchJob: BatchJobResultLike,\n onResult?: (result: TranslatePageResult) => void,\n): TranslatePageResult[] | null {\n const state = String(batchJob.state ?? \"UNKNOWN\");\n const db = openStore(config, \"readwrite\");\n if (!claimBatchJobCompletion(db, jobRow.id, state, new Date().toISOString())) {\n db.close();\n return null;\n }\n const pendingItems = listBatchItems(db, jobRow.id).filter((item) => item.status === \"pending\");\n const results: TranslatePageResult[] = [];\n\n const failItem = (itemRow: BatchItemRow, message: string, startedAt: number): void => {\n const result: TranslatePageResult = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n skipped: false,\n failed: true,\n error: formatTranslateError(new Error(message)),\n durationMs: Date.now() - startedAt,\n };\n updateBatchItemStatus(db, jobRow.id, itemRow.request_index, \"failed\", result.error);\n results.push(result);\n onResult?.(result);\n };\n\n if (isSuccessfulBatchState(state)) {\n const responses = batchJob.dest?.inlinedResponses ?? [];\n for (const itemRow of pendingItems) {\n const startedAt = Date.now();\n const inlined = responses[itemRow.request_index];\n if (!inlined || inlined.error || !inlined.response) {\n failItem(\n itemRow,\n inlined?.error?.message ??\n (inlined ? \"Batch response missing content\" : \"Batch response missing\"),\n startedAt,\n );\n continue;\n }\n let result: TranslatePageResult;\n try {\n const response = inlined.response as Parameters<typeof usageFromResponse>[0];\n const raw = textFromBatchResponse(response);\n const parsed = parseGeminiResponse(raw);\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n const prepared = buildIngestContext(config, db, jobRow, itemRow);\n result = finalizeTranslation(\n config,\n prepared,\n { model: jobRow.display_model, parsed, usage: usageFromResponse(response) },\n { costMode: \"batch\", startedAt, snapshotId: itemRow.snapshot_id },\n );\n } catch (error) {\n failItem(itemRow, error instanceof Error ? error.message : String(error), startedAt);\n continue;\n }\n updateBatchItemStatus(\n db,\n jobRow.id,\n itemRow.request_index,\n result.failed ? \"failed\" : \"done\",\n result.error,\n );\n results.push(result);\n onResult?.(result);\n }\n } else {\n // FAILED / CANCELLED / EXPIRED: every in-flight item fails with the job error.\n const message =\n batchJob.error?.message ?? `Batch job ended in state ${normalizeBatchState(state)}`;\n const startedAt = Date.now();\n for (const itemRow of pendingItems) {\n failItem(itemRow, message, startedAt);\n }\n }\n\n db.close();\n return results;\n}\n\n/**\n * Poll every tracked job together and ingest each one the moment it reaches a\n * terminal state — no job waits for another. The first status check happens\n * immediately so already-finished jobs (resume) ingest without delay.\n */\nexport async function pollAndIngestBatchJobs(\n config: ScribeConfig,\n jobs: BatchJobRow[],\n options: {\n jobCount?: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n onResult?: (result: TranslatePageResult) => void;\n } = {},\n): Promise<void> {\n const jobCount = options.jobCount ?? jobs.length;\n const active = jobs.map((row, jobIndex) => ({ row, jobIndex }));\n const loopStartedAt = Date.now();\n let delay = INITIAL_POLL_MS;\n let firstRound = true;\n\n // Elapsed anchors to the job's actual submission time, so resumed jobs show\n // their true age rather than time since this CLI started.\n const elapsedFor = (row: BatchJobRow): number => {\n const createdAtMs = Date.parse(row.created_at);\n return Number.isNaN(createdAtMs) ? Date.now() - loopStartedAt : Date.now() - createdAtMs;\n };\n\n while (active.length > 0) {\n if (!firstRound) {\n await sleep(delay);\n delay = Math.min(delay * POLL_BACKOFF_FACTOR, MAX_POLL_MS);\n }\n firstRound = false;\n\n for (const tracked of [...active]) {\n const batchJob: BatchJob = await getGeminiBatchJob({ name: tracked.row.job_name });\n const state = normalizeBatchState(batchJob.state);\n options.onProgress?.({\n type: \"batch-polling\",\n name: tracked.row.job_name,\n state,\n elapsedMs: elapsedFor(tracked.row),\n jobIndex: tracked.jobIndex,\n jobCount,\n });\n if (isTerminalBatchState(batchJob.state)) {\n active.splice(active.indexOf(tracked), 1);\n const results = ingestBatchJob(\n config,\n tracked.row,\n batchJob as BatchJobResultLike,\n options.onResult,\n );\n if (results === null) {\n // A concurrent scribe process claimed the job first; its results\n // are already in the store. Report that instead of zero counts.\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: 0,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n elapsedMs: elapsedFor(tracked.row),\n alreadyIngested: true,\n });\n continue;\n }\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: results.length,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: results.filter((r) => !r.failed && !r.skipped).length,\n failed: results.filter((r) => r.failed).length,\n inputTokens: results.reduce((sum, r) => sum + (r.usage?.inputTokens ?? 0), 0),\n outputTokens: results.reduce((sum, r) => sum + (r.usage?.outputTokens ?? 0), 0),\n estimatedCostUsd: results.reduce((sum, r) => sum + (r.estimatedCostUsd ?? 0), 0),\n elapsedMs: elapsedFor(tracked.row),\n });\n }\n }\n }\n}\n\n/** Result shape helper for items that never reached submission. */\nexport function failedResultForItem(\n item: TranslationWorkItem,\n error: unknown,\n startedAt: number,\n): TranslatePageResult {\n return {\n ...baseForItem(item),\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - startedAt,\n };\n}\n","import type Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getOrCreateEnSnapshot } from \"../storage/translations.js\";\n\n/** Record (or reuse) a deduplicated EN-source snapshot for a translation run. */\nexport function recordEnSnapshot(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n },\n db?: Database.Database,\n): number {\n const ownDb = db ?? openStore(config, \"readwrite\");\n const id = getOrCreateEnSnapshot(ownDb, {\n contentType: input.contentType,\n enSlug: input.enSlug,\n enHash: input.enHash,\n frontmatter: input.frontmatter,\n body: input.body,\n createdAt: new Date().toISOString(),\n });\n if (!db) ownDb.close();\n return id;\n}\n","import {\n type BatchJob,\n GoogleGenAI,\n type JobState,\n type GenerateContentResponse,\n type InlinedRequest,\n} from \"@google/genai\";\nimport { withRetry } from \"./retry.js\";\n\n// The SDK documents JOB_STATE_* names but the live API reports BATCH_STATE_*;\n// the SDK maps only the states it knows to JOB_STATE_* and passes the rest\n// through, so both families (and states persisted in either form) must be\n// tolerated. Compare on the bare state name.\nconst STATE_FAMILY_PREFIX = /^(JOB_STATE_|BATCH_STATE_)/;\n\nconst TERMINAL_STATES = new Set([\n \"SUCCEEDED\",\n \"FAILED\",\n \"CANCELLED\",\n \"EXPIRED\",\n \"PARTIALLY_SUCCEEDED\",\n]);\n\nconst SUCCESSFUL_STATES = new Set([\"SUCCEEDED\", \"PARTIALLY_SUCCEEDED\"]);\n\n/** Strip the JOB_STATE_/BATCH_STATE_ family prefix: \"BATCH_STATE_RUNNING\" -> \"RUNNING\". */\nexport function normalizeBatchState(state: JobState | string | undefined): string {\n return String(state ?? \"UNKNOWN\").replace(STATE_FAMILY_PREFIX, \"\");\n}\n\nexport function isTerminalBatchState(state: JobState | string | undefined): boolean {\n return TERMINAL_STATES.has(normalizeBatchState(state));\n}\n\nexport function isSuccessfulBatchState(state: JobState | string | undefined): boolean {\n return SUCCESSFUL_STATES.has(normalizeBatchState(state));\n}\n\nfunction makeClient(apiKey?: string): GoogleGenAI {\n const key = apiKey ?? process.env.GEMINI_API_KEY;\n if (!key) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n return new GoogleGenAI({ apiKey: key });\n}\n\n/**\n * Extract the text payload from a batch GenerateContentResponse. Batch inlined\n * responses are plain JSON objects (the SDK does not rebuild the class), so the\n * `.text` getter is unavailable — read candidates/parts directly and skip\n * thought parts.\n */\nexport function textFromBatchResponse(response: GenerateContentResponse): string {\n if (typeof response.text === \"string\") return response.text;\n const parts = response.candidates?.[0]?.content?.parts ?? [];\n return parts\n .filter((part) => !part.thought && typeof part.text === \"string\")\n .map((part) => part.text)\n .join(\"\");\n}\n\n/** Submit one Gemini Batch API job with inlined requests. */\nexport async function createGeminiBatchJob(input: {\n /** API model id (already resolved from the display name). */\n model: string;\n requests: InlinedRequest[];\n apiKey?: string;\n displayName?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n const job = await withRetry(() =>\n ai.batches.create({\n model: input.model,\n src: input.requests,\n config: { displayName: input.displayName ?? `scribe-translate-${Date.now()}` },\n }),\n );\n if (!job.name) throw new Error(\"Gemini batch job was created without a name\");\n return job;\n}\n\n/** Fetch the current state (and, when terminal, results) of a batch job. */\nexport async function getGeminiBatchJob(input: {\n name: string;\n apiKey?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n return withRetry(() => ai.batches.get({ name: input.name }));\n}\n","import { ApiError } from \"@google/genai\";\n\n/** HTTP status codes worth retrying: rate limiting + transient server errors. */\nconst TRANSIENT_STATUS = new Set([429, 500, 502, 503, 504]);\n\nfunction statusFromError(error: unknown): number | undefined {\n if (error instanceof ApiError && typeof error.status === \"number\") {\n return error.status;\n }\n // Some SDK paths surface a plain object/error with a numeric `status`.\n if (error && typeof error === \"object\" && \"status\" in error) {\n const status = (error as { status?: unknown }).status;\n if (typeof status === \"number\") return status;\n }\n // Fall back to matching a status code embedded in the message.\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/\\b(429|500|502|503|504)\\b/);\n if (match) return Number(match[1]);\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n const err = error as { code?: unknown; name?: unknown } | null;\n const code = typeof err?.code === \"string\" ? err.code : \"\";\n if (\n code === \"ECONNRESET\" ||\n code === \"ETIMEDOUT\" ||\n code === \"ECONNREFUSED\" ||\n code === \"ENOTFOUND\" ||\n code === \"EAI_AGAIN\" ||\n code === \"EPIPE\" ||\n code === \"UND_ERR_SOCKET\"\n ) {\n return true;\n }\n const message = error instanceof Error ? error.message.toLowerCase() : \"\";\n return (\n message.includes(\"network\") ||\n message.includes(\"fetch failed\") ||\n message.includes(\"socket hang up\") ||\n message.includes(\"terminated\")\n );\n}\n\n/** Classify whether an error is transient and safe to retry. */\nexport function isTransientError(error: unknown): boolean {\n const status = statusFromError(error);\n if (status !== undefined) return TRANSIENT_STATUS.has(status);\n return isNetworkError(error);\n}\n\nexport interface RetryOptions {\n attempts?: number;\n baseDelayMs?: number;\n /** Injectable sleep for tests; defaults to real setTimeout. */\n sleep?: (ms: number) => Promise<void>;\n /** Injectable jitter in [0, 1); defaults to Math.random. */\n random?: () => number;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/**\n * Run `fn` with exponential backoff + jitter, retrying only transient failures\n * (HTTP 429/5xx and network errors). Non-transient errors throw immediately.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const attempts = Math.max(1, options.attempts ?? 3);\n const baseDelayMs = options.baseDelayMs ?? 1000;\n const sleep = options.sleep ?? defaultSleep;\n const random = options.random ?? Math.random;\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (attempt >= attempts || !isTransientError(error)) throw error;\n // Exponential backoff with full jitter: attempt 1 -> ~1s, attempt 2 -> ~2-4s.\n const backoff = baseDelayMs * 2 ** (attempt - 1);\n const delay = backoff + random() * backoff;\n await sleep(delay);\n }\n }\n throw lastError;\n}\n","import { GoogleGenAI, type GenerateContentConfig, type GenerateContentResponse } from \"@google/genai\";\nimport {\n DEFAULT_GEMINI_MODEL,\n normalizeGeminiDisplayName,\n resolveGeminiModelId,\n resolveThinkingConfig,\n} from \"./gemini-models.js\";\nimport { withRetry } from \"./retry.js\";\n\nconst DEFAULT_MODEL = DEFAULT_GEMINI_MODEL;\n\nexport interface GeminiTokenUsage {\n inputTokens: number;\n /** Billed output tokens; INCLUDES thoughts tokens. */\n outputTokens: number;\n /** Thoughts (reasoning) tokens, billed as output. */\n thoughtsTokens: number;\n totalTokens: number;\n}\n\nexport interface GeminiTranslationResult {\n model: string;\n raw: string;\n parsed: {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n usage: GeminiTokenUsage;\n}\n\nfunction extractJson(text: string): string {\n const trimmed = text.trim();\n // Only strip a fence that wraps the entire payload, so fences inside string\n // values (e.g. a translated MDX body with ```ts blocks) are left untouched.\n const fenced = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```$/);\n if (fenced?.[1]) return fenced[1].trim();\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n return trimmed;\n}\n\nexport function parseGeminiResponse(text: string): {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n} {\n // With responseMimeType \"application/json\" the payload is already pure JSON.\n // Parse it directly first; only fall back to extraction when the model wraps\n // or pads the JSON (extraction is fragile when the body contains code fences).\n let parsed: { frontmatter?: Record<string, unknown>; body: string; slug?: string };\n try {\n parsed = JSON.parse(text.trim());\n } catch {\n parsed = JSON.parse(extractJson(text));\n }\n // Types without translatable frontmatter use a body-only response schema;\n // default the frontmatter so downstream merge/validation sees an object.\n if (parsed !== null && typeof parsed === \"object\" && parsed.frontmatter === undefined) {\n parsed.frontmatter = {};\n }\n return parsed as { frontmatter: Record<string, unknown>; body: string; slug?: string };\n}\n\n/**\n * Build the per-request generation config shared by the direct and batch paths.\n * The same shape is passed to `generateContent` and to each inlined batch request.\n */\nexport function buildGeminiRequestConfig(input: {\n apiModelId: string;\n responseSchema?: Record<string, unknown>;\n}): GenerateContentConfig {\n const thinkingConfig = resolveThinkingConfig(input.apiModelId);\n return {\n responseMimeType: \"application/json\",\n ...(input.responseSchema ? { responseSchema: input.responseSchema } : {}),\n ...(thinkingConfig ? { thinkingConfig } : {}),\n };\n}\n\ninterface WireUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n thoughtsTokenCount?: number;\n totalTokenCount?: number;\n prompt_token_count?: number;\n candidates_token_count?: number;\n thoughts_token_count?: number;\n total_token_count?: number;\n}\n\n/**\n * Extract token usage from a Gemini response; thoughts are folded into output.\n * Batch inlined responses arrive as raw JSON rather than SDK class instances,\n * so tolerate both camelCase and snake_case field names.\n */\nexport function usageFromResponse(response: GenerateContentResponse): GeminiTokenUsage {\n const meta = (response.usageMetadata ??\n (response as unknown as { usage_metadata?: WireUsageMetadata }).usage_metadata ??\n {}) as WireUsageMetadata;\n const thoughtsTokens = meta.thoughtsTokenCount ?? meta.thoughts_token_count ?? 0;\n return {\n inputTokens: meta.promptTokenCount ?? meta.prompt_token_count ?? 0,\n // candidatesTokenCount does not include thoughts, but thoughts are billed as\n // output tokens, so fold them in here for accurate cost accounting.\n outputTokens: (meta.candidatesTokenCount ?? meta.candidates_token_count ?? 0) + thoughtsTokens,\n thoughtsTokens,\n totalTokens: meta.totalTokenCount ?? meta.total_token_count ?? 0,\n };\n}\n\nexport async function translatePageWithGemini(input: {\n prompt: string;\n model?: string;\n apiKey?: string;\n responseSchema?: Record<string, unknown>;\n}): Promise<GeminiTranslationResult> {\n const apiKey = input.apiKey ?? process.env.GEMINI_API_KEY;\n if (!apiKey) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n\n const displayModel = normalizeGeminiDisplayName(\n input.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_MODEL,\n );\n const apiModel = resolveGeminiModelId(displayModel);\n const ai = new GoogleGenAI({ apiKey });\n const response = await withRetry(() =>\n ai.models.generateContent({\n model: apiModel,\n contents: input.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: apiModel,\n responseSchema: input.responseSchema,\n }),\n }),\n );\n\n const raw = response.text ?? \"\";\n const parsed = parseGeminiResponse(raw);\n\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n\n return { model: displayModel, raw, parsed, usage: usageFromResponse(response) };\n}\n","import { ThinkingLevel, type ThinkingConfig } from \"@google/genai\";\n\n/** Display name -> Gemini API model id. Pricing and logs use the display name. */\nexport const GEMINI_MODEL_IDS: Record<string, string> = {\n \"gemini-2.5-pro\": \"gemini-2.5-pro\",\n \"gemini-3.1-pro\": \"gemini-3.1-pro-preview\",\n};\n\nexport const DEFAULT_GEMINI_MODEL = \"gemini-3.1-pro\";\n\nfunction stripModelsPrefix(model: string): string {\n return model.replace(/^models\\//, \"\");\n}\n\n/** Map a display name (or passthrough id) to the API model id. */\nexport function resolveGeminiModelId(model: string): string {\n const name = stripModelsPrefix(model);\n return GEMINI_MODEL_IDS[name] ?? name;\n}\n\n/** Normalize any model id/alias to the display name used for pricing. */\nexport function normalizeGeminiDisplayName(model: string): string {\n const name = stripModelsPrefix(model);\n if (name in GEMINI_MODEL_IDS) return name;\n\n const alias = Object.entries(GEMINI_MODEL_IDS).find(([, apiId]) => apiId === name);\n if (alias) return alias[0];\n\n return name;\n}\n\n/**\n * Resolve the thinking config to keep translation cheap and predictable.\n * - Gemini 3.x: `thinkingLevel: LOW` (the 2.5-style `thinkingBudget` is unsupported).\n * - Gemini 2.5-pro: cannot fully disable thinking; use the minimum budget of 128.\n * - Unknown/passthrough ids: LOW for \"gemini-3*\", budget 128 for ids containing \"2.5\",\n * otherwise no thinking config (let the model default).\n */\nexport function resolveThinkingConfig(apiModelId: string): ThinkingConfig | undefined {\n const id = stripModelsPrefix(apiModelId).toLowerCase();\n if (id.startsWith(\"gemini-3\")) return { thinkingLevel: ThinkingLevel.LOW };\n if (id.includes(\"2.5\")) return { thinkingBudget: 128 };\n return undefined;\n}\n","import { stripLocaleSuffixFromSlug } from \"../core/localized-slug.js\";\nimport type { ContentTypeConfig, ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { computePageEnHash } from \"../hash/page-hash.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation, upsertTranslation } from \"../storage/translations.js\";\nimport type { GeminiTokenUsage } from \"./gemini-client.js\";\nimport { estimateTranslationCostUsd, type TranslationCostMode } from \"./gemini-pricing.js\";\nimport { DEFAULT_GEMINI_MODEL, normalizeGeminiDisplayName } from \"./gemini-models.js\";\nimport { buildPageTranslationPrompt } from \"./prompts/translation-prompt.js\";\nimport { buildGeminiResponseSchema } from \"./response-schema.js\";\nimport { resolveTranslateConfig } from \"./resolve-translate-config.js\";\nimport { assertValidTranslatedMdxBody } from \"./validate-mdx-body.js\";\nimport { validateTranslatedFrontmatter } from \"./validate-translation.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport type TranslateMode = \"batch\" | \"direct\";\n\nexport interface TranslatePageResult {\n contentType: string;\n enSlug: string;\n locale: string;\n skipped: boolean;\n failed?: boolean;\n reason?: \"fresh\" | \"in-flight\";\n model?: string;\n usage?: GeminiTokenUsage;\n estimatedCostUsd?: number;\n durationMs?: number;\n error?: string;\n slugAdjusted?: { from: string; to: string; matchedCode: string };\n mdxAdjusted?: boolean;\n}\n\nexport interface TranslateWorklistTotals {\n translated: number;\n skipped: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n durationMs: number;\n}\n\nexport type TranslateProgressEvent =\n | {\n type: \"start\";\n total: number;\n concurrency: number;\n dryRun: boolean;\n model?: string;\n mode?: TranslateMode;\n }\n | { type: \"item-start\"; item: TranslationWorkItem; active: string[] }\n | { type: \"item-done\"; result: TranslatePageResult }\n | {\n type: \"batch-submitted\";\n name: string;\n count: number;\n model?: string;\n jobIndex: number;\n jobCount: number;\n resumed?: boolean;\n /** ISO timestamp of the job's actual submission (persisted created_at). */\n createdAt?: string;\n }\n | {\n type: \"batch-polling\";\n name: string;\n state: string;\n /** Elapsed since the job was submitted (not since the CLI started). */\n elapsedMs: number;\n jobIndex: number;\n jobCount: number;\n }\n | {\n type: \"batch-done\";\n name: string;\n state: string;\n model?: string;\n count: number;\n jobIndex: number;\n jobCount: number;\n translated: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n /** Elapsed since the job was submitted. */\n elapsedMs: number;\n /**\n * True when a concurrent scribe process won the ingestion claim: the\n * job's results were saved by that process, this one has nothing to add.\n */\n alreadyIngested?: boolean;\n }\n | {\n /**\n * Emitted once, after the main pass, when validation failures will be\n * retried. Carries the failed items so reporters can print the recap.\n */\n type: \"retry-start\";\n failed: TranslatePageResult[];\n }\n | {\n type: \"done\";\n results: TranslatePageResult[];\n totals: TranslateWorklistTotals;\n /** How many results in `results` succeeded only on the retry round. */\n retriedTranslated?: number;\n };\n\n/** Stable identity for a worklist item / batch item row. */\nexport function translationItemKey(item: {\n contentType?: string;\n content_type?: string;\n enSlug?: string;\n en_slug?: string;\n locale: string;\n}): string {\n const contentType = item.contentType ?? item.content_type ?? \"\";\n const enSlug = item.enSlug ?? item.en_slug ?? \"\";\n return `${contentType}\\u0000${enSlug}\\u0000${item.locale}`;\n}\n\nexport function summarizeResults(\n results: TranslatePageResult[],\n durationMs: number,\n): TranslateWorklistTotals {\n return results.reduce<TranslateWorklistTotals>(\n (totals, result) => {\n if (result.failed) totals.failed += 1;\n else if (result.skipped) totals.skipped += 1;\n else totals.translated += 1;\n\n totals.inputTokens += result.usage?.inputTokens ?? 0;\n totals.outputTokens += result.usage?.outputTokens ?? 0;\n totals.estimatedCostUsd += result.estimatedCostUsd ?? 0;\n return totals;\n },\n {\n translated: 0,\n skipped: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n durationMs,\n },\n );\n}\n\nexport function formatTranslateError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n try {\n const parsed = JSON.parse(message) as { error?: { message?: string } };\n if (parsed.error?.message) return parsed.error.message;\n } catch {\n // not JSON\n }\n const embedded = message.match(/\"message\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)\"/);\n if (embedded?.[1]) {\n return embedded[1].replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n return message.length > 160 ? `${message.slice(0, 157)}…` : message;\n}\n\nfunction resolveContextLabel(enDoc: ScribeDocument, enSlug: string): string {\n const fm = enDoc.frontmatter as Record<string, unknown>;\n for (const key of [\"title\", \"name\", \"h1\"]) {\n const value = fm[key];\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return enSlug;\n}\n\nexport function baseForItem(\n item: TranslationWorkItem,\n): Pick<TranslatePageResult, \"contentType\" | \"enSlug\" | \"locale\"> {\n return {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n };\n}\n\n/** Everything needed to submit and finalize one translation request. */\nexport interface PreparedTranslation {\n item: TranslationWorkItem;\n type: ContentTypeConfig;\n enDoc: ScribeDocument;\n payload: { frontmatter: Record<string, unknown>; body: string };\n currentEnHash: string;\n existingSlug?: string;\n /** Configured model (may be undefined; env/default applies downstream). */\n model?: string;\n prompt: string;\n responseSchema?: Record<string, unknown>;\n}\n\nexport type PrepareOutcome =\n | { status: \"ready\"; prepared: PreparedTranslation }\n | { status: \"done\"; result: TranslatePageResult };\n\n/**\n * Shared pre-flight for the direct and batch paths: read the EN doc, skip when\n * the stored translation is fresh, and build the prompt + response schema.\n * Throws on unrecoverable item errors (unknown type, missing EN doc).\n */\nexport function prepareTranslation(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; force?: boolean },\n startedAt: number,\n): PrepareOutcome {\n const type = config.types.find((t) => t.id === item.contentType);\n if (!type) throw new Error(`Unknown content type ${item.contentType}`);\n\n const enDoc = readEnDocument(config, type, item.enSlug);\n if (!enDoc) throw new Error(`EN document not found: ${item.enSlug}`);\n\n const payload = getTranslatablePayload(enDoc, type);\n const currentEnHash = computePageEnHash(payload.frontmatter, payload.body);\n\n const db = openStore(config, \"readonly\");\n const existing = getTranslation(db, type.id, item.enSlug, item.locale);\n db.close();\n\n if (!options.force && existing && existing.en_hash === currentEnHash) {\n return {\n status: \"done\",\n result: {\n ...baseForItem(item),\n skipped: true,\n reason: \"fresh\",\n durationMs: Date.now() - startedAt,\n },\n };\n }\n\n const resolvedTranslate = resolveTranslateConfig(config, type);\n const model = options.model ?? resolvedTranslate.model;\n\n const prompt = buildPageTranslationPrompt({\n resolved: resolvedTranslate,\n targetLocale: item.locale,\n contextLabel: resolveContextLabel(enDoc, item.enSlug),\n translatableFrontmatter: payload.frontmatter,\n enBody: payload.body,\n slugStrategy: type.slugStrategy,\n previousError: item.previousError,\n });\n\n const responseSchema = buildGeminiResponseSchema(type.schema, type.slugStrategy);\n\n return {\n status: \"ready\",\n prepared: {\n item,\n type,\n enDoc,\n payload,\n currentEnHash,\n existingSlug: existing?.slug,\n model,\n prompt,\n responseSchema: responseSchema ?? undefined,\n },\n };\n}\n\n/**\n * Shared post-processing for the direct and batch paths: strip locale suffixes\n * from the slug, validate frontmatter + MDX body, snapshot the EN source and\n * upsert the translation. Never throws — failures come back as a failed result.\n * Pass `snapshotId` when the EN snapshot was already recorded (batch submission\n * time) so ingestion does not depend on the current EN files.\n */\nexport function finalizeTranslation(\n config: ScribeConfig,\n prepared: PreparedTranslation,\n output: {\n model: string;\n parsed: { frontmatter: Record<string, unknown>; body: string; slug?: string };\n usage: GeminiTokenUsage;\n },\n options: { costMode: TranslationCostMode; startedAt: number; snapshotId?: number },\n): TranslatePageResult {\n const { item, type, enDoc, payload } = prepared;\n const base = baseForItem(item);\n\n try {\n const rawSlug =\n type.slugStrategy === \"localized\"\n ? (output.parsed.slug ?? prepared.existingSlug ?? item.enSlug)\n : item.enSlug;\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n const { slug, stripped, matchedCode } = stripLocaleSuffixFromSlug(rawSlug, localeCodes);\n const slugAdjusted =\n stripped && matchedCode ? { from: rawSlug, to: slug, matchedCode } : undefined;\n\n const validated = validateTranslatedFrontmatter(enDoc, output.parsed.frontmatter, type.schema);\n if (!validated.ok) {\n throw new Error(`Translation validation failed: ${validated.error}`);\n }\n\n const { body: translatedBody, adjusted: mdxAdjusted } = assertValidTranslatedMdxBody(\n output.parsed.body,\n );\n\n const writeDb = openStore(config, \"readwrite\");\n const snapshotId =\n options.snapshotId ??\n recordEnSnapshot(\n config,\n {\n contentType: type.id,\n enSlug: item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: payload.frontmatter,\n body: payload.body,\n },\n writeDb,\n );\n upsertTranslation(writeDb, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n slug,\n frontmatter: validated.frontmatter,\n body: translatedBody,\n enHash: prepared.currentEnHash,\n translatedAt: new Date().toISOString(),\n model: output.model,\n snapshotId,\n });\n writeDb.close();\n\n const estimatedCostUsd = estimateTranslationCostUsd(\n normalizeGeminiDisplayName(output.model),\n output.usage.inputTokens,\n output.usage.outputTokens,\n options.costMode,\n );\n\n return {\n ...base,\n skipped: false,\n model: output.model,\n usage: output.usage,\n estimatedCostUsd,\n durationMs: Date.now() - options.startedAt,\n slugAdjusted,\n mdxAdjusted: mdxAdjusted || undefined,\n };\n } catch (error) {\n return {\n ...base,\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - options.startedAt,\n };\n }\n}\n\nexport function displayModelFor(prepared: PreparedTranslation): string {\n return normalizeGeminiDisplayName(\n prepared.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_GEMINI_MODEL,\n );\n}\n","const CONTEXT_TIER_TOKENS = 200_000;\n\nexport interface TieredModelPricing {\n input: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n output: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n}\n\n/** display_name -> { input: (le_200k, gt_200k), output: (le_200k, gt_200k) } in USD per 1M tokens */\nexport const GEMINI_PRICING_USD: Record<string, TieredModelPricing> = {\n \"gemini-3.1-pro\": { input: [2.0, 4.0], output: [12.0, 18.0] },\n};\n\nfunction normalizeModelId(model: string): string {\n return model.replace(/^models\\//, \"\").toLowerCase();\n}\n\nfunction tierRate(tokens: number, tiers: readonly [number, number]): number {\n return tokens <= CONTEXT_TIER_TOKENS ? tiers[0] : tiers[1];\n}\n\nexport function resolveModelPricing(model: string): TieredModelPricing | undefined {\n const id = normalizeModelId(model);\n if (GEMINI_PRICING_USD[id]) return GEMINI_PRICING_USD[id];\n\n const match = Object.entries(GEMINI_PRICING_USD).find(([key]) => id.includes(key));\n return match?.[1];\n}\n\nexport type TranslationCostMode = \"interactive\" | \"batch\";\n\n/** Batch API tokens are billed at 50% of interactive rates. */\nconst BATCH_DISCOUNT = 0.5;\n\nexport function estimateTranslationCostUsd(\n model: string,\n inputTokens: number,\n outputTokens: number,\n mode: TranslationCostMode = \"interactive\",\n): number | undefined {\n const pricing = resolveModelPricing(model);\n if (!pricing) return undefined;\n\n const inputRate = tierRate(inputTokens, pricing.input);\n const outputRate = tierRate(outputTokens, pricing.output);\n const multiplier = mode === \"batch\" ? BATCH_DISCOUNT : 1;\n\n return (\n ((inputTokens / 1_000_000) * inputRate +\n (outputTokens / 1_000_000) * outputRate) *\n multiplier\n );\n}\n\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1_000_000) return `${(tokens / 1_000_000).toFixed(2)}M`;\n if (tokens >= 1_000) return `${(tokens / 1_000).toFixed(1)}k`;\n return String(tokens);\n}\n\nexport function formatUsd(amount: number | undefined): string {\n if (amount === undefined) return \"n/a\";\n if (amount >= 1) return `$${amount.toFixed(2)}`;\n if (amount >= 0.01) return `$${amount.toFixed(3)}`;\n return `$${amount.toFixed(4)}`;\n}\n","import type { ResolvedTranslateConfig } from \"../resolve-translate-config.js\";\nimport type { SlugStrategy } from \"../../core/types.js\";\n\nexport const LOCALE_NAMES: Record<string, string> = {\n fr: \"French\",\n es: \"Spanish\",\n de: \"German\",\n nl: \"Dutch\",\n uk: \"Ukrainian\",\n tr: \"Turkish\",\n da: \"Danish\",\n he: \"Hebrew\",\n \"zh-CN\": \"Simplified Chinese\",\n \"zh-TW\": \"Traditional Chinese\",\n pt: \"Portuguese\",\n \"pt-BR\": \"Brazilian Portuguese\",\n ja: \"Japanese\",\n ru: \"Russian\",\n it: \"Italian\",\n ar: \"Arabic\",\n};\n\nexport function defaultLocalizationPrompt(localeName: string, locale: string): string {\n return [\n `Localize the content above into natural ${localeName} (${locale}).`,\n \"Do not translate word-for-word.\",\n \"Preserve the source tone and brand voice.\",\n \"Write as if a native speaker authored it for the target market.\",\n ].join(\" \");\n}\n\n/** Type/project `translate.prompt` extras are appended before the locale directive. */\nexport function buildLocalizationPrompt(\n promptOverride: string | undefined,\n localeName: string,\n locale: string,\n): string {\n const localeDirective = defaultLocalizationPrompt(localeName, locale);\n if (!promptOverride) return localeDirective;\n return `${promptOverride}\\n\\n${localeDirective}`;\n}\n\n/**\n * Static, locale-independent framing. Kept first so the whole prompt PREFIX\n * (framing + context + rules + EN payload) is byte-identical across every locale\n * of a given page, enabling Gemini implicit prefix caching. The locale-specific\n * localization directive lives in the SUFFIX, after the EN body.\n */\nconst TASK_FRAMING =\n \"You are localizing the content below into a target language specified at the end of this prompt.\";\n\n/**\n * Describe the expected JSON keys. Mirrors buildGeminiResponseSchema: types\n * without translatable frontmatter get a body-only response (their structural\n * frontmatter is carried over from EN, not translated).\n */\nfunction buildOutputFormatLine(hasFrontmatter: boolean, slugStrategy: SlugStrategy): string {\n if (!hasFrontmatter) {\n return slugStrategy === \"localized\"\n ? \"`body` (string, full MDX body), `slug` (string).\"\n : \"`body` (string, full MDX body).\";\n }\n return slugStrategy === \"localized\"\n ? \"`frontmatter` (object with translated frontmatter fields), `body` (string, full MDX body), `slug` (string).\"\n : \"`frontmatter` (object), `body` (string).\";\n}\n\n/**\n * Build a page translation prompt whose prefix (everything up to and including\n * the EN body) does not vary with locale, and whose suffix carries all\n * locale-specific instructions. This lets Gemini reuse the cached prefix when the\n * same page is translated into multiple locales.\n */\n/**\n * Compose the retry-context section appended (locale-specific suffix only, never\n * the cached prefix) when a previous attempt was rejected by validation. The\n * validation errors are included verbatim so the model can fix the exact issues.\n */\nfunction buildRetryContextSection(previousError: string): string[] {\n return [\n \"\",\n \"## Previous attempt\",\n `A previous attempt at this translation was rejected with the following validation errors: ${previousError}. Produce a corrected translation that fixes these issues while re-checking every schema constraint (required fields, array minimums, maximum lengths).`,\n ];\n}\n\nexport function buildPageTranslationPrompt(input: {\n resolved: ResolvedTranslateConfig;\n targetLocale: string;\n contextLabel?: string;\n translatableFrontmatter: Record<string, unknown>;\n enBody: string;\n slugStrategy: SlugStrategy;\n /** Verbatim validation errors from a prior rejected attempt (retry round). */\n previousError?: string;\n}): string {\n const localeName = LOCALE_NAMES[input.targetLocale] ?? input.targetLocale;\n const localizationPrompt = buildLocalizationPrompt(\n input.resolved.promptOverride,\n localeName,\n input.targetLocale,\n );\n\n // PREFIX — locale-independent. Identical for every locale of a given page.\n const prefix = [\n TASK_FRAMING,\n \"\",\n ...(input.resolved.context ? [\"## Context\", input.resolved.context, \"\"] : []),\n ...(input.contextLabel ? [`Document: ${input.contextLabel}`, \"\"] : []),\n \"## Rules\",\n ...input.resolved.rules.map((rule) => `- ${rule}`),\n \"\",\n \"## EN translatable frontmatter (JSON)\",\n JSON.stringify(input.translatableFrontmatter, null, 2),\n \"\",\n \"## EN body (MDX)\",\n input.enBody,\n ];\n\n // SUFFIX — locale-specific. Everything that depends on the target locale must\n // come after the EN body so it never changes the cacheable prefix.\n const suffix = [\n \"\",\n \"## Target language\",\n localizationPrompt,\n ...(input.slugStrategy === \"localized\"\n ? [\n `The slug MUST be written in ${localeName}, derived from the ${localeName} title and its meaning — never the English slug.`,\n ]\n : []),\n \"\",\n \"## Output format\",\n \"Return ONLY valid JSON with keys:\",\n buildOutputFormatLine(\n Object.keys(input.translatableFrontmatter).length > 0,\n input.slugStrategy,\n ),\n // Retry context is locale-specific suffix material: it MUST stay after the\n // EN body so the cacheable prefix is byte-identical with and without it.\n ...(input.previousError ? buildRetryContextSection(input.previousError) : []),\n ];\n\n return [...prefix, ...suffix].join(\"\\n\");\n}\n","import { z } from \"zod\";\nimport { getFieldKind, peelOptionalWrappers } from \"../core/field.js\";\nimport type { SlugStrategy } from \"../core/types.js\";\n\nfunction getObjectShape(schema: z.ZodTypeAny): z.ZodRawShape | null {\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n return (base as z.ZodObject<z.ZodRawShape>).shape;\n }\n return null;\n}\n\nfunction getArraySchema(schema: z.ZodTypeAny): z.ZodArray | null {\n const base = peelOptionalWrappers(schema);\n if (\n base instanceof Object &&\n \"element\" in base &&\n (base as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return base as z.ZodArray;\n }\n return null;\n}\n\nfunction extractTranslatableFromStructural(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n const arraySchema = getArraySchema(schema);\n if (arraySchema) {\n const inner = buildTranslatableSubschema(arraySchema.element as z.ZodTypeAny);\n if (inner) return z.array(inner);\n return null;\n }\n if (getObjectShape(schema)) {\n return buildTranslatableSubschema(schema);\n }\n return null;\n}\n\n/** Build a Zod object schema containing only translatable fields (including nested in structural arrays). */\nexport function buildTranslatableSubschema(schema: z.ZodTypeAny): z.ZodObject | null {\n const shape = getObjectShape(schema);\n if (!shape) return null;\n\n const out: Record<string, z.ZodTypeAny> = {};\n for (const [key, child] of Object.entries(shape)) {\n const childSchema = child as z.ZodTypeAny;\n const kind = getFieldKind(childSchema);\n if (kind === \"translatable\") {\n out[key] = peelOptionalWrappers(childSchema);\n } else if (kind === \"structural\") {\n const nested = extractTranslatableFromStructural(childSchema);\n if (nested) out[key] = nested;\n }\n }\n\n if (Object.keys(out).length === 0) return null;\n return z.object(out);\n}\n\n/**\n * JSON Schema for Gemini structured output: `{ frontmatter, body, slug? }`.\n * Types without translatable frontmatter get a body-only schema (Gemini\n * rejects OBJECT schemas with empty `properties`); parsing then defaults the\n * missing frontmatter to `{}`. Skipping the schema entirely instead would\n * leave the model free-handing JSON, which fails often on MDX bodies\n * (unescaped newlines, trailing prose after the JSON).\n */\nexport function buildGeminiResponseSchema(\n schema: z.ZodTypeAny,\n slugStrategy: SlugStrategy,\n): Record<string, unknown> | null {\n try {\n const translatable = buildTranslatableSubschema(schema);\n\n const responseShape: Record<string, z.ZodTypeAny> = {\n ...(translatable ? { frontmatter: translatable } : {}),\n body: z.string(),\n };\n if (slugStrategy === \"localized\") {\n responseShape.slug = z.string();\n }\n\n const jsonSchema = z.toJSONSchema(z.object(responseShape), {\n target: \"draft-2020-12\",\n unrepresentable: \"any\",\n io: \"output\",\n }) as Record<string, unknown>;\n delete jsonSchema.$schema;\n return jsonSchema;\n } catch {\n return null;\n }\n}\n","import type {\n ContentTypeConfig,\n ScribeConfig,\n ScribeTranslateDefaults,\n SlugStrategy,\n TranslateConfig,\n} from \"../core/types.js\";\n\nexport interface ResolvedTranslateConfig {\n promptOverride?: string;\n context?: string;\n rules: string[];\n model?: string;\n}\n\nconst BUILTIN_TRANSLATE_RULES = [\n \"Do not translate brand or product names unless the brand has a well-known localized name in the target market (rare). Keep the original spelling and capitalization.\",\n \"Return the MDX body with real line breaks; do not use JSON escape sequences like \\\\n or \\\\t in the body string.\",\n 'In JSX attributes (e.g. FaqItem question=\"...\"), use single quotes when the value contains double-quote characters (e.g. Hebrew דוא\"ל), or escape them as \\\\\".',\n];\n\nfunction slugStrategyRules(slugStrategy: SlugStrategy): string[] {\n if (slugStrategy === \"localized\") {\n return [\n \"Provide a URL slug in JSON field `slug` that is Localized into the target language.\",\n \"Base the slug on the meaning of the translated title — do NOT reuse the English slug words.\",\n \"Slug MUST be ASCII only: a-z, 0-9, hyphens. No uppercase, accents, underscores, or spaces.\",\n \"For non-Latin languages, write the words in the target language and transliterate them into Latin script (e.g. Russian -> romanized Russian, not English).\",\n \"Do NOT append locale codes to the slug (e.g. -fr, -he, -zh-cn). Locale routing is handled by the URL prefix, not the slug.\",\n \"Preserve 4-digit years and proper nouns in slugs.\",\n ];\n }\n return [\"Do NOT output a slug — slugStrategy is fixed.\"];\n}\n\nfunction mergeContext(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n): string | undefined {\n const parts = [project?.context, type?.context].filter(Boolean);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : undefined;\n}\n\nfunction mergeTranslateConfig(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n slugStrategy: SlugStrategy,\n): ResolvedTranslateConfig {\n return {\n promptOverride: type?.prompt ?? project?.prompt,\n context: mergeContext(project, type),\n rules: [\n ...BUILTIN_TRANSLATE_RULES,\n ...(project?.rules ?? []),\n ...(type?.rules ?? []),\n ...slugStrategyRules(slugStrategy),\n ],\n model: type?.model ?? project?.defaultModel,\n };\n}\n\n/** Merge project and content-type translation settings. */\nexport function resolveTranslateConfig(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ResolvedTranslateConfig {\n return mergeTranslateConfig(config.translate, type.translate, type.slugStrategy);\n}\n","import type { z } from \"zod\";\nimport type { ScribeDocument } from \"../core/types.js\";\nimport { mergeStructuralOntoLocale, pickTranslatable } from \"../core/introspect-schema.js\";\n\nexport function formatZodIssues(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n}\n\n/** Strip non-translatable keys from Gemini frontmatter output. */\nexport function sanitizeTranslatedFrontmatter(\n rawFrontmatter: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n return pickTranslatable(rawFrontmatter, schema);\n}\n\n/** Validate locale frontmatter against the full content schema (merged with EN structural fields). */\nexport function validateTranslatedFrontmatter(\n enDoc: ScribeDocument,\n localeFrontmatter: Record<string, unknown>,\n typeSchema: z.ZodTypeAny,\n): { ok: true; frontmatter: Record<string, unknown> } | { ok: false; error: string } {\n const frontmatter = sanitizeTranslatedFrontmatter(localeFrontmatter, typeSchema);\n const merged = mergeStructuralOntoLocale(\n frontmatter,\n enDoc.frontmatter as Record<string, unknown>,\n typeSchema,\n );\n const parsed = typeSchema.safeParse(merged);\n if (!parsed.success) {\n return { ok: false, error: formatZodIssues(parsed.error) };\n }\n return { ok: true, frontmatter };\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { isRoutableType, pathPrefix, createUrlBuilder } from \"../i18n/build-url.js\";\nimport { serializeMdx } from \"../loader/parse-mdx.js\";\n\nexport interface StaticRawExport {\n /** Path relative to the output root (e.g. `blog/foo.mdx`, `fr/glossary/bar.mdx`). */\n relativePath: string;\n /** Public URL pathname (e.g. `/blog/foo.mdx`, `/fr/glossary/bar.mdx`). */\n urlPath: string;\n locale: string;\n typeId: string;\n enSlug: string;\n /** Full MDX source (YAML frontmatter + body). */\n source: string;\n}\n\nexport interface BuildStaticRawExportsOptions {\n /** File extension including the dot. Default `.mdx`. */\n extension?: `.${string}`;\n /** Content type ids to export. Default: all routable types. */\n types?: string[];\n /** Locales to export. Default: `config.locales`. */\n locales?: readonly string[];\n /** Skip documents where `resolve()` sets `shouldRedirectTo`. Default `true`. */\n excludeRedirected?: boolean;\n /** Skip documents with `noindex: true`. Default `false`. */\n excludeNoindex?: boolean;\n}\n\nfunction normalizeExtension(ext: string): `.${string}` {\n return (ext.startsWith(\".\") ? ext : `.${ext}`) as `.${string}`;\n}\n\n/** Segment name for export directories, e.g. `blog` from `/blog/{slug}`. */\nexport function exportDirSegment(pathTemplate: string): string {\n const prefix = pathPrefix(pathTemplate);\n return prefix.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Relative directory roots to clean before writing static exports.\n * EN: `{segment}/` (e.g. `blog/`). Prefixed locales: `{locale}/{segment}/`.\n */\nexport function getStaticExportRoots(\n project: ScribeProject,\n options: { types?: string[]; locales?: readonly string[] } = {},\n): string[] {\n const { config } = project;\n const locales = options.locales ?? config.locales;\n const typeFilter = options.types ? new Set(options.types) : null;\n const roots = new Set<string>();\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n const segment = exportDirSegment(type.config.path!);\n roots.add(`${segment}/`);\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n roots.add(`${locale}/${segment}/`);\n }\n }\n\n return [...roots].sort();\n}\n\n/** Build static raw MDX exports for all routable content types. */\nexport function buildStaticRawExports(\n project: ScribeProject,\n options: BuildStaticRawExportsOptions = {},\n): StaticRawExport[] {\n const { config } = project;\n const extension = normalizeExtension(options.extension ?? \".mdx\");\n const locales = options.locales ?? config.locales;\n const excludeRedirected = options.excludeRedirected ?? true;\n const excludeNoindex = options.excludeNoindex ?? false;\n const typeFilter = options.types ? new Set(options.types) : null;\n\n const out: StaticRawExport[] = [];\n const urlBuilder = createUrlBuilder(config);\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n\n const pathTemplate = type.config.path!;\n const all = type.load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) continue;\n\n for (const locale of locales) {\n for (const enDoc of enIdx.bySlug.values()) {\n const resolved = type.resolve(enDoc.slug, locale);\n if (!resolved.document) continue;\n if (excludeRedirected && resolved.shouldRedirectTo) continue;\n if (excludeNoindex && resolved.document.noindex) continue;\n\n const doc = resolved.document;\n const slugWithExt = `${doc.slug}${extension}`;\n const urlPath = urlBuilder.resolvePath(pathTemplate, slugWithExt, locale);\n\n out.push({\n relativePath: urlPath.slice(1),\n urlPath,\n locale,\n typeId: type.id,\n enSlug: doc.enSlug,\n source: serializeMdx(doc.frontmatter, doc.content),\n });\n }\n }\n }\n\n return out;\n}\n","import matter from \"gray-matter\";\n\nexport interface ParsedMdx {\n frontmatter: Record<string, unknown>;\n content: string;\n}\n\nexport function parseMdx(raw: string): ParsedMdx {\n const parsed = matter(raw);\n return {\n frontmatter: parsed.data as Record<string, unknown>,\n content: parsed.content,\n };\n}\n\nexport function serializeMdx(frontmatter: Record<string, unknown>, content: string): string {\n return matter.stringify(content, frontmatter);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport {\n buildStaticRawExports,\n getStaticExportRoots,\n type BuildStaticRawExportsOptions,\n} from \"./build-static-raw-exports.js\";\n\nexport interface WriteStaticRawExportsOptions extends BuildStaticRawExportsOptions {\n /** Output directory (typically `public`). Default `public`. */\n outDir?: string;\n}\n\nfunction rmDirIfExists(dir: string): void {\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/** Remove managed export roots, write fresh static raw MDX files, return exports written. */\nexport function writeStaticRawExports(\n project: ScribeProject,\n options: WriteStaticRawExportsOptions = {},\n): { exports: ReturnType<typeof buildStaticRawExports>; written: number } {\n const outDir = path.resolve(options.outDir ?? \"public\");\n const typeFilter = options.types;\n\n for (const root of getStaticExportRoots(project, {\n types: typeFilter,\n locales: options.locales,\n })) {\n rmDirIfExists(path.join(outDir, root));\n }\n\n const exports = buildStaticRawExports(project, options);\n const counts = new Map<string, number>();\n\n for (const item of exports) {\n const filePath = path.join(outDir, item.relativePath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, item.source, \"utf8\");\n const key = `${item.typeId}/${item.locale}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n for (const [key, count] of [...counts.entries()].sort()) {\n console.log(` ${key}: ${count}`);\n }\n\n return { exports, written: exports.length };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport dotenv from \"dotenv\";\n\nconst ENV_FILES = [\".env\", \".env.local\"] as const;\n\n/** Load `.env` then `.env.local` from cwd; existing process env wins. */\nexport function loadEnvFromCwd(cwd: string): void {\n for (const file of ENV_FILES) {\n const envPath = path.join(/* turbopackIgnore: true */ cwd, file);\n if (!fs.existsSync(envPath)) continue;\n dotenv.config({ path: envPath, override: false });\n }\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 getEnSnapshot,\n getTranslation,\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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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 </style>\n</head>\n<body>\n <div class=\"app\">\n <nav class=\"actbar\">\n <a href=\"/\" title=\"Overview\">⌂</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(\"/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","import { CancelPromptError } from \"@inquirer/core\";\nimport { checkbox, select } from \"@inquirer/prompts\";\nimport type { ScribeConfig } from \"../src/core/types.js\";\n\nimport type { TranslateMode } from \"../src/translate/page-translator.js\";\nimport type { TranslationWorklistStrategy } from \"../src/translate/worklist.js\";\n\nexport interface TranslateSelection {\n contentType?: string;\n preset?: string;\n locale?: string[];\n strategy?: TranslationWorklistStrategy;\n mode?: TranslateMode;\n}\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nfunction nonDefaultLocales(config: ScribeConfig): string[] {\n return config.locales.filter((locale) => locale !== config.defaultLocale);\n}\n\nasync function runPrompt<T>(prompt: Promise<T>): Promise<T> {\n try {\n return await prompt;\n } catch (error) {\n if (error instanceof CancelPromptError) process.exit(0);\n throw error;\n }\n}\n\nasync function promptContentType(config: ScribeConfig): Promise<string | undefined> {\n return runPrompt(\n select<string | undefined>({\n message: \"Content type to translate\",\n choices: [\n { name: \"All content types\", value: undefined },\n ...config.types.map((type) => ({ name: type.id, value: type.id })),\n ],\n }),\n );\n}\n\n/** Sentinel select values that are not preset names. */\nconst ALL_LOCALES = Symbol(\"all-locales\");\nconst PICK_LOCALES = Symbol(\"pick-locales\");\n\nasync function promptManualLocales(config: ScribeConfig): Promise<Pick<TranslateSelection, \"locale\">> {\n const locales = nonDefaultLocales(config);\n if (locales.length <= 1) return {};\n\n const picked = await runPrompt(\n checkbox({\n message: \"Locales to translate\",\n choices: locales.map((locale) => ({ name: locale, value: locale, checked: true })),\n validate: (values) => values.length > 0 || \"Pick at least one locale\",\n }),\n );\n return picked.length === locales.length ? {} : { locale: picked };\n}\n\nasync function promptLocalePreset(config: ScribeConfig): Promise<Pick<TranslateSelection, \"preset\" | \"locale\">> {\n const presets = Object.entries(config.localePresets ?? {}).filter(\n (entry): entry is [string, string[]] => Array.isArray(entry[1]),\n );\n\n if (presets.length === 0) {\n return promptManualLocales(config);\n }\n\n const choice = await runPrompt(\n select<string | typeof ALL_LOCALES | typeof PICK_LOCALES>({\n message: \"Locale preset\",\n choices: [\n { name: \"All locales\", value: ALL_LOCALES },\n ...presets.map(([name, locales]) => ({\n name: `${name} (${locales.join(\", \")})`,\n value: name,\n })),\n { name: \"Choose locales manually…\", value: PICK_LOCALES },\n ],\n }),\n );\n\n if (choice === PICK_LOCALES) return promptManualLocales(config);\n if (choice === ALL_LOCALES) return {};\n return { preset: choice };\n}\n\nasync function promptStrategy(): Promise<TranslationWorklistStrategy> {\n return runPrompt(\n select<TranslationWorklistStrategy>({\n message: \"Translation strategy\",\n choices: [\n { name: \"Stale and missing\", value: \"all\" },\n { name: \"Missing only (skip stale)\", value: \"missing-only\" },\n ],\n default: \"all\",\n }),\n );\n}\n\nasync function promptMode(): Promise<TranslateMode> {\n return runPrompt(\n select<TranslateMode>({\n message: \"Translation mode\",\n choices: [\n { name: \"Batch — 50% cheaper, async, resumable (recommended)\", value: \"batch\" },\n { name: \"Direct — immediate results, full price\", value: \"direct\" },\n ],\n default: \"batch\",\n }),\n );\n}\n\n/** Prompt for content type and locale preset when flags are omitted in a TTY. */\nexport async function promptTranslateSelection(\n config: ScribeConfig,\n flags: {\n type?: string;\n preset?: string;\n locale?: string[];\n strategy?: TranslationWorklistStrategy;\n mode?: TranslateMode;\n },\n): Promise<TranslateSelection> {\n const selection: TranslateSelection = {\n contentType: flags.type,\n preset: flags.preset,\n locale: flags.locale,\n strategy: flags.strategy,\n mode: flags.mode,\n };\n\n if (!isInteractive()) return selection;\n\n if (!selection.contentType) {\n selection.contentType = await promptContentType(config);\n }\n\n if (!selection.preset && !selection.locale?.length) {\n Object.assign(selection, await promptLocalePreset(config));\n }\n\n if (!selection.strategy) {\n selection.strategy = await promptStrategy();\n }\n\n if (!selection.mode) {\n selection.mode = await promptMode();\n }\n\n return selection;\n}\n","import type {\n TranslatePageResult,\n TranslateProgressEvent,\n TranslateWorklistTotals,\n} from \"../src/translate/page-translator.js\";\nimport { formatTokenCount, formatUsd } from \"../src/translate/gemini-pricing.js\";\n\nconst dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\nconst green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\nconst yellow = (text: string) => `\\x1b[33m${text}\\x1b[0m`;\nconst red = (text: string) => `\\x1b[31m${text}\\x1b[0m`;\nconst cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nfunction progressBar(ratio: number, width = 28): string {\n const clamped = Math.max(0, Math.min(1, ratio));\n const filled = Math.round(clamped * width);\n return `${\"█\".repeat(filled)}${\"░\".repeat(width - filled)}`;\n}\n\nfunction labelForResult(result: TranslatePageResult): string {\n return `${result.contentType}/${result.enSlug}@${result.locale}`;\n}\n\n/** Last path segment of a Gemini job name: \"batches/abc123\" -> \"abc123\". */\nfunction shortJobId(name: string): string {\n const segments = name.split(\"/\");\n return segments[segments.length - 1] || name;\n}\n\nfunction formatElapsed(elapsedMs: number): string {\n return `${Math.round(elapsedMs / 1000)}s`;\n}\n\n/**\n * Build the per-job completion summary shown once a batch job is ingested:\n * short id, model, request count, translated/failed counts, tokens, cost.\n */\nfunction batchDoneParts(event: Extract<TranslateProgressEvent, { type: \"batch-done\" }>): string {\n if (event.alreadyIngested) {\n return [\n `job ${shortJobId(event.name)}`,\n event.model ?? \"?\",\n \"already ingested by another scribe run (results saved there)\",\n formatElapsed(event.elapsedMs),\n ].join(\" · \");\n }\n const parts = [\n `job ${shortJobId(event.name)}`,\n event.model ?? \"?\",\n `${event.count} request${event.count === 1 ? \"\" : \"s\"}`,\n `${event.translated} translated`,\n ];\n if (event.failed > 0) parts.push(`${event.failed} failed`);\n parts.push(`${formatTokenCount(event.inputTokens)} in / ${formatTokenCount(event.outputTokens)} out`);\n parts.push(`${formatUsd(event.estimatedCostUsd)} est.`);\n parts.push(formatElapsed(event.elapsedMs));\n return parts.join(\" · \");\n}\n\nfunction statusForResult(result: TranslatePageResult, dryRun: boolean): string {\n if (result.failed) return red(\"failed\");\n if (result.skipped) return dim(\"skipped\");\n if (dryRun) return yellow(\"would translate\");\n return green(\"translated\");\n}\n\nfunction slugAdjustedMessage(result: TranslatePageResult): string | undefined {\n if (!result.slugAdjusted) return undefined;\n const { from, to, matchedCode } = result.slugAdjusted;\n return yellow(\n `slug adjusted: \"${from}\" → \"${to}\" (stripped -${matchedCode})`,\n );\n}\n\nfunction detailForResult(result: TranslatePageResult): string {\n const parts: string[] = [];\n const slugMsg = slugAdjustedMessage(result);\n if (slugMsg) parts.push(slugMsg);\n if (result.durationMs !== undefined) parts.push(`${(result.durationMs / 1000).toFixed(1)}s`);\n if (result.usage) {\n parts.push(`${formatTokenCount(result.usage.inputTokens)} in`);\n parts.push(`${formatTokenCount(result.usage.outputTokens)} out`);\n }\n if (result.estimatedCostUsd !== undefined) parts.push(formatUsd(result.estimatedCostUsd));\n if (result.error) parts.push(red(result.error));\n return parts.length > 0 ? dim(parts.join(\" · \")) : \"\";\n}\n\nfunction formatSummaryLine(\n totals: TranslateWorklistTotals,\n dryRun: boolean,\n retriedTranslated = 0,\n): string {\n const action = dryRun ? \"Would translate\" : \"Translated\";\n const base = totals.translated - retriedTranslated;\n const parts = [\n retriedTranslated > 0\n ? `${action} ${base} +${retriedTranslated} on retry`\n : `${action} ${totals.translated}`,\n `skipped ${totals.skipped}`,\n ];\n if (totals.failed > 0) parts.push(red(`failed ${totals.failed}`));\n parts.push(`${formatTokenCount(totals.inputTokens)} in / ${formatTokenCount(totals.outputTokens)} out`);\n parts.push(`${formatUsd(totals.estimatedCostUsd)} est.`);\n parts.push(`${(totals.durationMs / 1000).toFixed(1)}s`);\n return parts.join(\" · \");\n}\n\nexport interface TranslateProgressReporter {\n onEvent: (event: TranslateProgressEvent) => void;\n finish: () => void;\n}\n\nexport function createTranslateProgressReporter(options: {\n enabled?: boolean;\n dryRun?: boolean;\n recentLimit?: number;\n} = {}): TranslateProgressReporter {\n const enabled = options.enabled ?? isInteractive();\n const dryRun = Boolean(options.dryRun);\n const recentLimit = options.recentLimit ?? 6;\n\n if (!enabled) {\n return {\n onEvent(event) {\n if (event.type === \"batch-submitted\") {\n const verb = event.resumed ? \"Resuming\" : \"Submitted\";\n console.log(\n `${verb} batch job ${event.jobIndex + 1}/${event.jobCount} with ${event.count} request${event.count === 1 ? \"\" : \"s\"}${event.model ? ` (${event.model})` : \"\"}: ${event.name}`,\n );\n return;\n }\n if (event.type === \"batch-polling\") {\n console.log(\n `batch ${event.jobIndex + 1}/${event.jobCount} ${shortJobId(event.name)}: ${event.state.replace(/^JOB_STATE_/, \"\")} (${formatElapsed(event.elapsedMs)} elapsed)`,\n );\n return;\n }\n if (event.type === \"batch-done\") {\n const line = `batch ${event.jobIndex + 1}/${event.jobCount} ${event.state} · ${batchDoneParts(event)}`;\n if (event.failed > 0 && event.translated === 0) console.error(line);\n else console.log(line);\n return;\n }\n if (event.type === \"item-done\") {\n const label = labelForResult(event.result);\n const status = statusForResult(event.result, dryRun);\n const detail = detailForResult(event.result);\n console.log(`${label}: ${status}${detail ? ` (${detail.replace(/\\x1b\\[[0-9;]*m/g, \"\")})` : \"\"}`);\n const slugMsg = slugAdjustedMessage(event.result);\n if (slugMsg) {\n console.log(`[warning] ${labelForResult(event.result)} ${slugMsg.replace(/\\x1b\\[[0-9;]*m/g, \"\")}`);\n }\n if (event.result.failed && event.result.error) {\n console.error(event.result.error);\n }\n return;\n }\n if (event.type === \"retry-start\") {\n for (const result of event.failed) {\n console.log(`${labelForResult(result)}: ${result.error ?? \"failed\"}`);\n }\n console.log(`Retrying ${event.failed.length} failed items with validation context...`);\n return;\n }\n if (event.type === \"done\") {\n console.log(formatSummaryLine(event.totals, dryRun, event.retriedTranslated));\n for (const result of event.results.filter((entry) => entry.failed)) {\n console.error(`${labelForResult(result)}: ${result.error ?? \"failed\"}`);\n }\n }\n },\n finish() {},\n };\n }\n\n let total = 0;\n let concurrency = 1;\n let model: string | undefined;\n let done = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n let estimatedCostUsd = 0;\n let active: string[] = [];\n let mode: \"batch\" | \"direct\" | undefined;\n const batchJobs = new Map<\n string,\n { state: string; count: number; model?: string; createdAtMs?: number; elapsedMs: number }\n >();\n let batchElapsedMs = 0;\n const recent: TranslatePageResult[] = [];\n let renderedLines = 0;\n let cursorHidden = false;\n\n function hideCursor(): void {\n if (!cursorHidden) {\n process.stdout.write(\"\\x1b[?25l\");\n cursorHidden = true;\n }\n }\n\n function showCursor(): void {\n if (cursorHidden) {\n process.stdout.write(\"\\x1b[?25h\");\n cursorHidden = false;\n }\n }\n\n /**\n * Print permanent line(s) above the live status area: rewind over the current\n * render, clear it, write the lines with newlines (they scroll up and stay),\n * then let the next render() redraw the live area beneath them.\n */\n function printPersistent(lines: string[]): void {\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n for (const line of lines) {\n process.stdout.write(\"\\x1b[2K\" + line + \"\\n\");\n }\n renderedLines = 0;\n }\n\n function render(): void {\n hideCursor();\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n\n const lines: string[] = [];\n const title = dryRun ? \"Dry run\" : \"Translating\";\n const isBatch = mode === \"batch\" || batchJobs.size > 0;\n lines.push(\n cyan(`${title} ${done}/${total}`) +\n dim(isBatch ? \" · batch\" : ` · ${concurrency} parallel`) +\n (model ? dim(` · ${model}`) : \"\"),\n );\n lines.push(progressBar(total === 0 ? 0 : done / total) + dim(` ${Math.round(total === 0 ? 0 : (done / total) * 100)}%`));\n lines.push(\n dim(\"Tokens \") +\n `${formatTokenCount(inputTokens)} in · ${formatTokenCount(outputTokens)} out` +\n dim(\" · Cost \") +\n formatUsd(estimatedCostUsd) +\n dim(\" est.\"),\n );\n\n if (batchJobs.size > 0 && done < total) {\n const terminal = /^(SUCCEEDED|FAILED|CANCELLED|EXPIRED|PARTIALLY_SUCCEEDED)$/;\n let running = 0;\n let finished = 0;\n let requests = 0;\n for (const job of batchJobs.values()) {\n if (terminal.test(job.state)) finished += 1;\n else running += 1;\n requests += job.count;\n }\n lines.push(\n dim(\"Batches \") +\n `${running} running · ${finished} done` +\n dim(` · ${requests} request${requests === 1 ? \"\" : \"s\"} · ${Math.round(batchElapsedMs / 1000)}s elapsed`),\n );\n // One detail line per still-pending job: short id, model, requests, state,\n // elapsed since its own submission (anchored to created_at upstream).\n for (const [name, job] of batchJobs) {\n if (terminal.test(job.state)) continue;\n lines.push(\n dim(\" \") +\n shortJobId(name) +\n dim(` · ${job.model ?? \"?\"} · ${job.count} req · `) +\n job.state +\n dim(` · ${formatElapsed(job.elapsedMs)}`),\n );\n }\n } else if (active.length > 0) {\n lines.push(dim(\"Active \") + active.slice(0, 3).join(\", \") + (active.length > 3 ? dim(` +${active.length - 3}`) : \"\"));\n } else if (done < total) {\n lines.push(dim(\"Active \") + \"starting…\");\n } else {\n lines.push(\"\");\n }\n\n lines.push(\"\");\n if (recent.length === 0) {\n lines.push(dim(\"Waiting for first page…\"));\n } else {\n for (const result of recent) {\n const detail = detailForResult(result);\n lines.push(`${statusForResult(result, dryRun)} ${labelForResult(result)}${detail ? ` ${detail}` : \"\"}`);\n }\n }\n\n for (const line of lines) {\n process.stdout.write(\"\\x1b[2K\" + line + \"\\n\");\n }\n renderedLines = lines.length;\n }\n\n return {\n onEvent(event) {\n switch (event.type) {\n case \"start\":\n total = event.total;\n concurrency = event.concurrency;\n model = event.model;\n mode = event.mode;\n render();\n break;\n case \"item-start\":\n active = event.active;\n render();\n break;\n case \"batch-submitted\": {\n const createdAtMs = event.createdAt ? Date.parse(event.createdAt) : undefined;\n const elapsedMs =\n createdAtMs && !Number.isNaN(createdAtMs) ? Date.now() - createdAtMs : 0;\n batchJobs.set(event.name, {\n state: event.resumed ? \"RESUMED\" : \"SUBMITTED\",\n count: event.count,\n model: event.model,\n createdAtMs: Number.isNaN(createdAtMs) ? undefined : createdAtMs,\n elapsedMs,\n });\n // Persist a line per job so it stays visible after the live area is\n // redrawn — otherwise a run that adopts jobs from a previous run\n // gives no clue where its jobs came from.\n const requests = `${event.count} ${event.resumed ? \"pending \" : \"\"}request${event.count === 1 ? \"\" : \"s\"}`;\n const origin = event.resumed\n ? `resumed job (submitted ${formatElapsed(elapsedMs)} ago)`\n : \"submitted job\";\n printPersistent([\n dim(`${event.resumed ? \"↻\" : \"→\"} ${origin} ${shortJobId(event.name)} · ${event.model ?? \"?\"} · ${requests}`),\n ]);\n render();\n break;\n }\n case \"batch-polling\": {\n const job = batchJobs.get(event.name);\n batchJobs.set(event.name, {\n state: event.state.replace(/^JOB_STATE_/, \"\"),\n count: job?.count ?? 0,\n model: job?.model,\n createdAtMs: job?.createdAtMs,\n elapsedMs: event.elapsedMs,\n });\n batchElapsedMs = Math.max(batchElapsedMs, event.elapsedMs);\n render();\n break;\n }\n case \"batch-done\": {\n const job = batchJobs.get(event.name);\n batchJobs.set(event.name, {\n state: event.state.replace(/^JOB_STATE_/, \"\"),\n count: job?.count ?? event.count,\n model: job?.model ?? event.model,\n createdAtMs: job?.createdAtMs,\n elapsedMs: event.elapsedMs,\n });\n const marker = event.failed > 0 && event.translated === 0 ? red(\"✗\") : green(\"✓\");\n printPersistent([`${marker} ${dim(batchDoneParts(event))}`]);\n render();\n break;\n }\n case \"item-done\": {\n done += 1;\n active = active.filter((label) => label !== labelForResult(event.result));\n inputTokens += event.result.usage?.inputTokens ?? 0;\n outputTokens += event.result.usage?.outputTokens ?? 0;\n estimatedCostUsd += event.result.estimatedCostUsd ?? 0;\n recent.unshift(event.result);\n recent.splice(recentLimit);\n render();\n break;\n }\n case \"retry-start\": {\n // Retry items produce a second round of item-done events; extend the\n // total so the progress bar does not overshoot 100%.\n total += event.failed.length;\n // Print the failure recap as persistent lines above the live area,\n // then the \"Retrying…\" banner. done resets below to track retry items.\n printPersistent([\n ...event.failed.map((result) =>\n red(`${labelForResult(result)}: ${result.error ?? \"failed\"}`),\n ),\n cyan(`Retrying ${event.failed.length} failed items with validation context...`),\n ]);\n render();\n break;\n }\n case \"done\":\n showCursor();\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n process.stdout.write(\n \"\\x1b[2K\" +\n green(\"Done\") +\n \" · \" +\n formatSummaryLine(event.totals, dryRun, event.retriedTranslated) +\n \"\\n\",\n );\n renderedLines = 0;\n for (const result of event.results.filter((entry) => entry.failed)) {\n process.stdout.write(\"\\x1b[2K\" + red(`${labelForResult(result)}: ${result.error ?? \"failed\"}`) + \"\\n\");\n }\n for (const result of event.results.filter((entry) => entry.slugAdjusted)) {\n const slugMsg = slugAdjustedMessage(result);\n if (slugMsg) {\n process.stdout.write(\n \"\\x1b[2K\" + yellow(`[warning] ${labelForResult(result)} ${slugMsg.replace(/\\x1b\\[[0-9;]*m/g, \"\")}`) + \"\\n\",\n );\n }\n }\n break;\n }\n },\n finish() {\n showCursor();\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** Package version from the nearest `scribe-cms` package.json (works from source or dist). */\nexport function readScribeVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (;;) {\n const candidate = path.join(dir, \"package.json\");\n if (fs.existsSync(candidate)) {\n const pkg = JSON.parse(fs.readFileSync(candidate, \"utf8\")) as {\n name?: string;\n version?: string;\n };\n if (pkg.name === \"scribe-cms\" && pkg.version) return pkg.version;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return \"unknown\";\n}\n\nexport const SCRIBE_VERSION = readScribeVersion();\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../node_modules/tsup/assets/cjs_shims.js","../../src/storage/sqlite.ts","../../cli/index.ts","../../src/index.ts","../../src/core/field.ts","../../src/core/managed-roots.ts","../../src/core/introspect-schema.ts","../../src/core/types.ts","../../src/create-scribe.ts","../../src/config/resolve-config.ts","../../src/i18n/build-url.ts","../../src/create-project.ts","../../src/loader/create-loader.ts","../../src/core/builtin-fields.ts","../../src/storage/translations.ts","../../src/translate/validate-mdx-body.ts","../../src/translate/normalize-mdx-body.ts","../../src/translate/sanitize-mdx-jsx.ts","../../src/inline/resolve-tokens.ts","../../src/loader/resolve-assets.ts","../../src/inline/tokens.ts","../../src/loader/normalize-en.ts","../../src/i18n/resolve-document.ts","../../src/sitemap/generate-sitemap.ts","../../src/redirects/build-redirects.ts","../../src/core/alias-helpers.ts","../../src/i18n/translation-index.ts","../../src/redirects/build-json-redirects.ts","../../src/redirects/load-type-redirects.ts","../../src/redirects/redirect-schema.ts","../../src/sitemap/join-base-url.ts","../../src/config/load-config.ts","../../src/validate/validate-project.ts","../../src/validate/validate-redirects.ts","../../src/validate/validate-relations.ts","../../src/validate/validate-assets.ts","../../src/validate/validate-slug-suffix.ts","../../src/core/localized-slug.ts","../../src/validate/validate-inline-tokens.ts","../../src/translate/worklist.ts","../../src/hash/page-hash.ts","../../src/translate/page-translator.ts","../../src/storage/batch-jobs.ts","../../src/translate/batch-worklist.ts","../../src/history/record-snapshot.ts","../../src/translate/gemini-batch.ts","../../src/translate/retry.ts","../../src/translate/gemini-client.ts","../../src/translate/gemini-models.ts","../../src/translate/translate-core.ts","../../src/translate/gemini-pricing.ts","../../src/translate/prompts/translation-prompt.ts","../../src/translate/response-schema.ts","../../src/translate/resolve-translate-config.ts","../../src/translate/validate-translation.ts","../../src/export/build-static-raw-exports.ts","../../src/loader/parse-mdx.ts","../../src/export/write-static-raw-exports.ts","../../src/delete/plan.ts","../../src/delete/execute.ts","../../src/delete/render-text.ts","../../src/config/load-env.ts","../../studio/server.ts","../../studio/shared.ts","../../studio/introspect-fields.ts","../../studio/content-views.ts","../../studio/asset-serve.ts","../../studio/mdx-preview.ts","../../studio/preview-tokens.ts","../../studio/asset-views.ts","../../studio/search.ts","../../studio/studio-cache.ts","../../cli/prompt-translate.ts","../../cli/translate-progress.ts","../../src/version.ts"],"names":["fs","path","Database","prefix","z","field","valStart","unified","remarkParse","remarkMdx","matter","document","options","jiti","createJiti","listEnSlugs","isStringRecord","createHash","ApiError","sleep","GoogleGenAI","ThinkingLevel","results","totals","dotenv","buf","text","renderTable","IMAGE_EXT","escapeHtml","encodePathSegment","renderLayout","Hono","serve","CancelPromptError","select","checkbox","isInteractive","fileURLToPath","reporter","openStore"],"mappings":"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","file":"index.cjs","sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\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","#!/usr/bin/env node\nimport {\n createProject,\n loadConfigSync,\n resumeTranslationJobs,\n translateWorklist,\n validateProject,\n writeStaticRawExports,\n} from \"../src/index.js\";\nimport { listEnSnapshotsForEnSlug } from \"../src/storage/translations.js\";\nimport { buildDeletionPlan } from \"../src/delete/plan.js\";\nimport { executeDeletionPlan } from \"../src/delete/execute.js\";\nimport { renderDeletionPlanText } from \"../src/delete/render-text.js\";\nimport { loadEnvFromCwd } from \"../src/config/load-env.js\";\nimport { buildWorklist, resolveLocalesFromPreset, type TranslationWorklistStrategy } from \"../src/translate/worklist.js\";\nimport { startStudio } from \"../studio/server.js\";\nimport { promptTranslateSelection } from \"./prompt-translate.js\";\nimport { createTranslateProgressReporter } from \"./translate-progress.js\";\nimport { SCRIBE_VERSION } from \"../src/version.js\";\n\ninterface CliOptions {\n config?: string;\n cwd: string;\n locale?: string[];\n preset?: string;\n type?: string;\n slug?: string;\n model?: string;\n dryRun?: boolean;\n yes?: boolean;\n force?: boolean;\n port?: number;\n concurrency?: number;\n noProgress?: boolean;\n strategy?: TranslationWorklistStrategy;\n batch?: boolean;\n direct?: boolean;\n resume?: boolean;\n out?: string;\n extension?: string;\n}\n\nfunction parseArgs(argv: string[]): { command: string; options: CliOptions; rest: string[] } {\n const options: CliOptions = { cwd: process.cwd() };\n const positional: string[] = [];\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i]!;\n if (arg === \"--config\") {\n options.config = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--locale\") {\n const locales: string[] = [];\n while (argv[i + 1] && !argv[i + 1]!.startsWith(\"--\")) {\n locales.push(argv[++i]!);\n }\n options.locale = locales;\n i++;\n continue;\n }\n if (arg === \"--preset\") {\n options.preset = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--type\") {\n options.type = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--slug\") {\n options.slug = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--model\") {\n options.model = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--port\") {\n options.port = Number(argv[++i]);\n i++;\n continue;\n }\n if (arg === \"--dry-run\") {\n options.dryRun = true;\n i++;\n continue;\n }\n if (arg === \"--yes\" || arg === \"-y\") {\n options.yes = true;\n i++;\n continue;\n }\n if (arg === \"--force\") {\n options.force = true;\n i++;\n continue;\n }\n if (arg === \"--concurrency\") {\n options.concurrency = Number(argv[++i]);\n i++;\n continue;\n }\n if (arg === \"--no-progress\") {\n options.noProgress = true;\n i++;\n continue;\n }\n if (arg === \"--batch\") {\n options.batch = true;\n i++;\n continue;\n }\n if (arg === \"--direct\") {\n options.direct = true;\n i++;\n continue;\n }\n if (arg === \"--resume\") {\n options.resume = true;\n i++;\n continue;\n }\n if (arg === \"--strategy\") {\n const value = argv[++i];\n if (value !== \"all\" && value !== \"missing-only\") {\n throw new Error(`Unknown strategy: ${value} (expected all or missing-only)`);\n }\n options.strategy = value;\n i++;\n continue;\n }\n if (arg === \"--out\") {\n options.out = argv[++i];\n i++;\n continue;\n }\n if (arg === \"--extension\") {\n options.extension = argv[++i];\n i++;\n continue;\n }\n if (arg.startsWith(\"--\")) {\n throw new Error(`Unknown flag: ${arg}`);\n }\n positional.push(arg);\n i++;\n }\n const [command = \"help\", ...rest] = positional;\n return { command, options, rest };\n}\n\nfunction loadProject(options: CliOptions) {\n const config = loadConfigSync({\n cwd: options.cwd,\n configPath: options.config,\n });\n return createProject(config);\n}\n\nasync function main(): Promise<void> {\n const argv = process.argv.slice(2);\n const first = argv[0];\n if (first === \"--version\" || first === \"-V\" || first === \"version\") {\n console.log(SCRIBE_VERSION);\n return;\n }\n\n const { command, options, rest } = parseArgs(argv);\n loadEnvFromCwd(options.cwd);\n\n if (command === \"help\" || command === \"--help\") {\n console.log(`Usage: scribe <command>\n\nCommands:\n status Show EN docs + translation counts\n validate Validate EN files and sqlite consistency\n export-static Write raw MDX files for static hosting\n translate Translate stale/missing locale pages\n history <type> <slug> Show EN snapshot timeline\n delete <type> <slug> Delete an entry (with reference cascade)\n studio Start read-only local studio\n version Print scribe-cms version\n\nDelete flags:\n --dry-run Print the deletion plan and exit without deleting\n --yes, -y Skip the confirmation prompt\n\nExport-static flags:\n --out <dir> Output directory (default: public)\n --extension <ext> File extension (default: mdx)\n --type <id> Comma-separated content types (default: all routable)\n --locale <code>... Locales to export (default: all configured)\n\nTranslate flags:\n --type <id> Content type, or comma-separated ids (interactive picker in a TTY when omitted)\n --preset <name> Locale preset from config (interactive picker in a TTY)\n --locale <code>... Target locale(s); overrides --preset\n --slug <en-slug> Single English document\n --model <id> Gemini model override\n --batch Force Gemini Batch API mode (50% token cost; default)\n --direct Force direct interactive calls (immediate, full price)\n --resume Only poll/ingest pending batch jobs; submit nothing new\n --concurrency <n> Parallel translations in --direct mode (default: 3)\n --dry-run List work without writing\n --force Re-translate even when hashes match\n --strategy <mode> all (default) or missing-only\n --no-progress Plain line logging instead of live progress\n\nBatch mode submits jobs upfront and persists them in the store, so Ctrl+C\nduring polling is safe: the next run (or --resume) picks the jobs back up and\ningests their results. In a TTY without --batch/--direct, a prompt asks which\nmode to use.\n`);\n return;\n }\n\n if (command === \"version\") {\n console.log(SCRIBE_VERSION);\n return;\n }\n\n const project = loadProject(options);\n const config = project.config;\n\n switch (command) {\n case \"status\": {\n for (const type of project.listTypes()) {\n const enCount = type.list().length;\n console.log(`${type.id}: ${enCount} EN docs`);\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const count = type.load().get(locale)?.bySlug.size ?? 0;\n console.log(` ${locale}: ${count}`);\n }\n }\n console.log(`store: ${project.storePath}`);\n break;\n }\n case \"validate\": {\n const result = validateProject(config);\n for (const issue of result.issues) {\n console.log(\n `[${issue.level}] ${issue.contentType ?? \"\"} ${issue.enSlug ?? \"\"} ${issue.locale ?? \"\"} ${issue.message}`,\n );\n }\n if (!result.ok) process.exitCode = 1;\n break;\n }\n case \"export-static\": {\n const types = options.type?.split(\",\").map((t) => t.trim()).filter(Boolean);\n const { written } = writeStaticRawExports(project, {\n outDir: options.out,\n extension: options.extension ? (`.${options.extension.replace(/^\\./, \"\")}` as `.${string}`) : undefined,\n types,\n locales: options.locale,\n });\n console.log(`Wrote ${written} static raw exports to ${options.out ?? \"public\"}`);\n break;\n }\n case \"translate\": {\n if (options.batch && options.direct) {\n throw new Error(\"--batch and --direct are mutually exclusive\");\n }\n\n if (options.resume) {\n const reporter = createTranslateProgressReporter({\n enabled: !options.noProgress,\n dryRun: false,\n });\n const results = await resumeTranslationJobs(config, { onProgress: reporter.onEvent });\n reporter.finish();\n if (results === null) {\n console.log(\"No pending translation batch jobs.\");\n break;\n }\n if (results.some((result) => result.failed)) process.exitCode = 1;\n break;\n }\n\n const selection = await promptTranslateSelection(config, {\n type: options.type,\n preset: options.preset,\n locale: options.locale,\n strategy: options.strategy,\n mode: options.batch ? \"batch\" : options.direct ? \"direct\" : undefined,\n });\n const locales = resolveLocalesFromPreset(config, selection.preset, selection.locale);\n const worklist = buildWorklist(config, {\n contentType: selection.contentType,\n locales,\n enSlug: options.slug,\n strategy: selection.strategy ?? \"all\",\n force: options.force,\n onSkipType: (type) =>\n console.log(\n `${type.id}: not translatable (bodyless, no translatable fields) — skipped`,\n ),\n });\n if (worklist.length === 0) {\n // Still pick up pending batch jobs from an interrupted previous run.\n if (!options.dryRun) {\n const reporter = createTranslateProgressReporter({\n enabled: !options.noProgress,\n dryRun: false,\n });\n const resumed = await resumeTranslationJobs(config, { onProgress: reporter.onEvent });\n reporter.finish();\n if (resumed !== null) {\n if (resumed.some((result) => result.failed)) process.exitCode = 1;\n break;\n }\n }\n console.log(\"Nothing to translate.\");\n break;\n }\n\n const reporter = createTranslateProgressReporter({\n enabled: !options.noProgress,\n dryRun: options.dryRun,\n });\n\n const results = await translateWorklist(config, worklist, {\n model: options.model,\n dryRun: options.dryRun,\n force: options.force,\n concurrency: options.concurrency,\n mode: selection.mode,\n onProgress: reporter.onEvent,\n });\n reporter.finish();\n\n const failed = results.filter((result) => result.failed);\n if (failed.length > 0) process.exitCode = 1;\n break;\n }\n case \"history\": {\n const [typeId, enSlug, locale] = rest;\n if (!typeId || !enSlug) {\n throw new Error(\"Usage: scribe history <type> <en-slug> [locale]\");\n }\n const { openStore } = await import(\"../src/storage/sqlite.js\");\n const db = openStore(config, \"readonly\");\n const rows = listEnSnapshotsForEnSlug(db, typeId, enSlug);\n db.close();\n for (const row of rows) {\n const locales = row.locales ?? \"\";\n if (locale && !locales.split(\",\").includes(locale)) continue;\n console.log(\n `${row.created_at} snapshot=#${row.id} en_hash=${row.en_hash.slice(0, 8)} locales=${locales || \"—\"}`,\n );\n }\n break;\n }\n case \"delete\": {\n const [typeId, enSlug] = rest;\n if (!typeId || !enSlug) {\n throw new Error(\"Usage: scribe delete <type> <en-slug> [--yes] [--dry-run]\");\n }\n const plan = buildDeletionPlan(project, typeId, enSlug);\n console.log(renderDeletionPlanText(plan));\n\n if (plan.blocked.length > 0) {\n console.log(\n \"\\nDeletion is blocked. Resolve the references above (or change their onTargetDelete) and retry.\",\n );\n process.exitCode = 1;\n break;\n }\n\n if (options.dryRun) {\n console.log(\"\\nDry run: nothing was deleted.\");\n break;\n }\n\n if (!options.yes) {\n const readline = await import(\"node:readline\");\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\"\\nProceed with deletion? [y/N] \", (a) => {\n rl.close();\n resolve(a);\n });\n });\n if (answer.trim().toLowerCase() !== \"y\" && answer.trim().toLowerCase() !== \"yes\") {\n console.log(\"Aborted.\");\n break;\n }\n }\n\n const outcome = executeDeletionPlan(project, plan);\n console.log(\n `\\nDeleted ${outcome.deletedFiles.length} file(s), ${outcome.deletedAssets.length} asset(s), ` +\n `detached ${outcome.detachedFiles.length} file(s), removed ${outcome.translationsDeleted} translation row(s) ` +\n `and ${outcome.snapshotsDeleted} snapshot(s).`,\n );\n break;\n }\n case \"studio\": {\n await startStudio(project, { port: options.port ?? 3600 });\n break;\n }\n default:\n throw new Error(`Unknown command: ${command}`);\n }\n}\n\nmain().catch((error) => {\n console.error(error instanceof Error ? error.message : error);\n process.exit(1);\n});\n","export { field, getRelationTarget, getAssetMeta, getFieldKind, unwrapSchema } from \"./core/field.js\";\nexport type {\n RelationBrand,\n RelationField,\n RelationFieldOptions,\n RelationMeta,\n AssetField,\n AssetFieldOptions,\n AssetMeta,\n OnTargetDelete,\n AssetOnDelete,\n} from \"./core/field.js\";\nexport { getManagedRoots, templateManagedRoot } from \"./core/managed-roots.js\";\nexport {\n introspectSchema,\n listTranslatableFields,\n listRelationFields,\n listAssetFields,\n isTypeTranslatable,\n} from \"./core/introspect-schema.js\";\nexport type { SchemaFieldMeta } from \"./core/introspect-schema.js\";\nexport { defineConfig, defineContentType } from \"./core/types.js\";\nexport type {\n ScribeConfigInput,\n ScribeConfig,\n ScribeProject,\n ScribeDocument,\n ContentTypeInput,\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n StaticParam,\n LocaleIndex,\n AllDocuments,\n ResolvedDocument,\n CrossValidateContext,\n CrossValidateIssue,\n TranslateConfig,\n ScribeTranslateDefaults,\n LocalePresets,\n LocaleFallbacks,\n LocaleRoutingConfig,\n SlugStrategy,\n IndexFallback,\n AssetsConfigInput,\n ResolvedAssetsConfig,\n AssetUrlOptions,\n Scribe,\n InferDocMap,\n InferDocFromTypeConfig,\n RelationFieldsOf,\n RelatedMapFor,\n ScribeClient,\n ScribeDocs,\n ScribeDocOf,\n} from \"./core/types.js\";\nexport { createScribe } from \"./create-scribe.js\";\nexport { createProject } from \"./create-project.js\";\nexport { isRoutableType, createUrlBuilder } from \"./i18n/build-url.js\";\nexport type { UrlBuilder } from \"./i18n/build-url.js\";\nexport { resolveConfig, isResolvedConfig } from \"./config/resolve-config.js\";\nexport { loadConfigSync, findConfigPath } from \"./config/load-config.js\";\nexport { validateProject } from \"./validate/validate-project.js\";\nexport type { ValidateIssue, ValidateResult } from \"./validate/validate-project.js\";\nexport {\n buildAllContentRedirects,\n getRedirectSourceSlugs,\n} from \"./redirects/build-redirects.js\";\nexport type { NextRedirectRule } from \"./redirects/types.js\";\nexport type { RedirectSourceSlugs } from \"./redirects/build-redirects.js\";\nexport { buildWorklist, resolveLocalesFromPreset } from \"./translate/worklist.js\";\nexport type { TranslationWorklistStrategy, TranslationWorkItem, WorklistOptions } from \"./translate/worklist.js\";\nexport { resumeTranslationJobs, translatePage, translateWorklist } from \"./translate/page-translator.js\";\nexport type {\n TranslateMode,\n TranslatePageResult,\n TranslateProgressEvent,\n TranslateWorklistTotals,\n} from \"./translate/page-translator.js\";\nexport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nexport type {\n GenerateSitemapOptions,\n SitemapAlternateLanguages,\n SitemapChangeFrequency,\n SitemapEntry,\n SitemapTypeDefaults,\n} from \"./sitemap/types.js\";\nexport {\n buildStaticRawExports,\n exportDirSegment,\n getStaticExportRoots,\n} from \"./export/build-static-raw-exports.js\";\nexport type {\n BuildStaticRawExportsOptions,\n StaticRawExport,\n} from \"./export/build-static-raw-exports.js\";\nexport { writeStaticRawExports } from \"./export/write-static-raw-exports.js\";\nexport type { WriteStaticRawExportsOptions } from \"./export/write-static-raw-exports.js\";\nexport { serializeMdx } from \"./loader/parse-mdx.js\";\nexport { buildDeletionPlan } from \"./delete/plan.js\";\nexport type {\n DeletionPlan,\n DeletionRoot,\n DeletionCascade,\n DeletionDetach,\n DeletionBlocker,\n DeletionAsset,\n DeletionStoreCounts,\n BodyRefWarning,\n} from \"./delete/plan.js\";\nexport {\n extractInlineTokens,\n fillPlaceholders,\n unescapeInlineTokens,\n placeholderMarker,\n} from \"./inline/tokens.js\";\nexport type {\n InlineToken,\n InlineTokenKind,\n StaticInlineToken,\n RelationInlineToken,\n AssetInlineToken,\n VarInlineToken,\n MalformedInlineToken,\n ExtractInlineTokensResult,\n} from \"./inline/tokens.js\";\nexport { executeDeletionPlan } from \"./delete/execute.js\";\nexport type { ExecuteDeletionResult } from \"./delete/execute.js\";\n","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 { listAssetFields } from \"./introspect-schema.js\";\nimport type { ScribeConfig } from \"./types.js\";\n\nfunction normalizeRoot(root: string): string {\n const trimmed = `/${root.replace(/^\\/+|\\/+$/g, \"\")}`;\n return trimmed === \"/\" ? \"\" : trimmed;\n}\n\n/**\n * Managed root implied by a template's static prefix: the substring up to the\n * first `{`, with the trailing partial path segment dropped.\n * `\"/try-on/garments/{slug}/product.webp\"` → `\"/try-on/garments\"`.\n */\nexport function templateManagedRoot(template: string): string {\n const braceIndex = template.indexOf(\"{\");\n const staticPart = braceIndex >= 0 ? template.slice(0, braceIndex) : template;\n const lastSlash = staticPart.lastIndexOf(\"/\");\n const prefix = lastSlash >= 0 ? staticPart.slice(0, lastSlash) : staticPart;\n return normalizeRoot(prefix);\n}\n\n/**\n * Set of Scribe-owned source roots (web paths) for the phase-2 audit layer;\n * files outside these roots are never reported or touched. Union of\n * `assets.managedDirs` and every asset field's `dir`/`template` prefix.\n * Deduped and sorted; empty when the asset system is disabled.\n */\nexport function getManagedRoots(config: ScribeConfig): string[] {\n // Managed roots are meaningful only when the asset system is enabled.\n if (!config.assets) return [];\n\n const roots = new Set<string>();\n\n for (const dir of config.assets.managedDirs ?? []) {\n const normalized = normalizeRoot(dir);\n if (normalized) roots.add(normalized);\n }\n\n for (const type of config.types) {\n for (const f of listAssetFields(type.schema)) {\n if (f.assetDir) {\n const normalized = normalizeRoot(f.assetDir);\n if (normalized) roots.add(normalized);\n }\n if (f.assetTemplate) {\n const normalized = templateManagedRoot(f.assetTemplate);\n if (normalized) roots.add(normalized);\n }\n }\n }\n\n return [...roots].sort();\n}\n","import type { z } from \"zod\";\nimport {\n getAssetMeta,\n getFieldKind,\n getRelationTarget,\n peelOptionalWrappers,\n type AssetOnDelete,\n type OnTargetDelete,\n} from \"./field.js\";\nimport type { ContentTypeInput } from \"./types.js\";\n\nexport interface SchemaFieldMeta {\n path: string[];\n kind: \"translatable\" | \"structural\" | \"relation\" | \"asset\";\n relationTarget?: string;\n relationMultiple?: boolean;\n relationOptional?: boolean;\n /** Cascade behavior when the referenced target is deleted (relation fields). */\n relationOnTargetDelete?: OnTargetDelete;\n assetDir?: string;\n assetTemplate?: string;\n assetFormats?: string[];\n assetMaxKB?: number;\n assetOptional?: boolean;\n /** Whether the asset file is deleted with its document (asset fields). */\n assetOnDelete?: AssetOnDelete;\n}\n\nfunction getArrayElement(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n if (\n schema instanceof Object &&\n \"element\" in schema &&\n (schema as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return (schema as z.ZodArray<z.ZodTypeAny>).element as z.ZodTypeAny;\n }\n return null;\n}\n\n/**\n * List schema fields with translatable/structural/relation metadata.\n * Array-of-object fields recurse with a `*` path segment (`steps.*.title`) so\n * extraction and merging preserve the array shape. Note: `peelOptionalWrappers`\n * is used (not `unwrapSchema`) because zod v4 arrays expose `unwrap()`, which\n * would silently flatten the array level out of the paths.\n */\nexport function introspectSchema(schema: z.ZodTypeAny, prefix: string[] = []): SchemaFieldMeta[] {\n const relation = getRelationTarget(schema);\n if (relation && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"relation\",\n relationTarget: relation.typeId,\n relationMultiple: relation.multiple,\n relationOptional: relation.optional,\n relationOnTargetDelete: relation.onTargetDelete,\n },\n ];\n }\n\n const asset = getAssetMeta(schema);\n if (asset && prefix.length > 0) {\n return [\n {\n path: prefix,\n kind: \"asset\",\n assetDir: asset.dir,\n assetTemplate: asset.template,\n assetFormats: asset.formats,\n assetMaxKB: asset.maxKB,\n assetOptional: asset.optional,\n assetOnDelete: asset.onDelete,\n },\n ];\n }\n\n // An explicit translatable mark makes the whole subtree one translation unit\n // (e.g. field.translatable(z.array(z.string()))).\n if (prefix.length > 0 && getFieldKind(schema) === \"translatable\") {\n return [{ path: prefix, kind: \"translatable\" }];\n }\n\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n const shape = (base as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, key]));\n }\n return fields;\n }\n\n const element = getArrayElement(base);\n if (element) {\n const elementBase = peelOptionalWrappers(element);\n if (elementBase instanceof Object && \"shape\" in elementBase) {\n const shape = (elementBase as z.ZodObject<z.ZodRawShape>).shape;\n const fields: SchemaFieldMeta[] = [];\n for (const [key, child] of Object.entries(shape)) {\n fields.push(...introspectSchema(child as z.ZodTypeAny, [...prefix, \"*\", key]));\n }\n return fields;\n }\n }\n\n return [{ path: prefix, kind: getFieldKind(schema) }];\n}\n\ninterface PathTrie {\n leaf: boolean;\n children: Map<string, PathTrie>;\n}\n\nfunction buildPathTrie(paths: string[][]): PathTrie {\n const root: PathTrie = { leaf: false, children: new Map() };\n for (const path of paths) {\n let node = root;\n for (const segment of path) {\n let child = node.children.get(segment);\n if (!child) {\n child = { leaf: false, children: new Map() };\n node.children.set(segment, child);\n }\n node = child;\n }\n node.leaf = true;\n }\n return root;\n}\n\nfunction extractNode(data: unknown, trie: PathTrie): unknown {\n if (trie.leaf) return data;\n\n const star = trie.children.get(\"*\");\n if (star) {\n if (!Array.isArray(data)) return undefined;\n // Preserve array length so structural/translatable halves merge per index.\n return data.map((item) =>\n typeof item === \"object\" && item !== null ? (extractNode(item, star) ?? {}) : {},\n );\n }\n\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) return undefined;\n const record = data as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n let any = false;\n for (const [key, child] of trie.children) {\n const value = extractNode(record[key], child);\n if (value !== undefined) {\n out[key] = value;\n any = true;\n }\n }\n return any ? out : undefined;\n}\n\nexport function extractByPaths(\n data: Record<string, unknown>,\n paths: string[][],\n): Record<string, unknown> {\n if (paths.length === 0) return {};\n const extracted = extractNode(data, buildPathTrie(paths));\n return extracted && typeof extracted === \"object\" && !Array.isArray(extracted)\n ? (extracted as Record<string, unknown>)\n : {};\n}\n\n/** Extract frontmatter fields marked as translatable. */\nexport function pickTranslatable(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const translatablePaths = introspectSchema(schema)\n .filter((f) => f.kind === \"translatable\")\n .map((f) => f.path);\n return extractByPaths(data, translatablePaths);\n}\n\n/**\n * Drop nested translatable output when the EN document has no matching structural\n * parent (e.g. model-hallucinated blog `itemList` on posts with no ItemList SEO).\n */\nexport function pruneOrphanNestedTranslations(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const out = { ...localeData };\n const structuralParentsWithNested = new Set<string>();\n for (const meta of introspectSchema(schema)) {\n if (meta.kind !== \"translatable\" || meta.path.length < 3 || meta.path[1] !== \"*\") continue;\n structuralParentsWithNested.add(meta.path[0]!);\n }\n for (const parent of structuralParentsWithNested) {\n const enParent = enData[parent];\n if (enParent === undefined || enParent === null) {\n delete out[parent];\n }\n }\n return out;\n}\n\n/** Extract frontmatter fields marked as structural (EN-only). */\nexport function pickStructural(data: Record<string, unknown>, schema: z.ZodTypeAny): Record<string, unknown> {\n const structuralPaths = introspectSchema(schema)\n .filter((f) => f.kind === \"structural\" || f.kind === \"relation\" || f.kind === \"asset\")\n .map((f) => f.path);\n return extractByPaths(data, structuralPaths);\n}\n\n/** Merge EN structural fields onto a locale document's frontmatter at load time. */\nexport function mergeStructuralOntoLocale(\n localeData: Record<string, unknown>,\n enData: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n const structural = pickStructural(enData, schema);\n const translatable = pickTranslatable(localeData, schema);\n return deepMerge(structural, translatable);\n}\n\nfunction deepMerge(base: Record<string, unknown>, overlay: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(overlay)) {\n if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n out[key] &&\n typeof out[key] === \"object\" &&\n !Array.isArray(out[key])\n ) {\n out[key] = deepMerge(out[key] as Record<string, unknown>, value as Record<string, unknown>);\n } else if (Array.isArray(value) && Array.isArray(out[key])) {\n out[key] = mergeArrayOverlay(out[key] as unknown[], value as unknown[]);\n } else if (value !== undefined) {\n out[key] = value;\n }\n }\n return out;\n}\n\nfunction mergeArrayOverlay(base: unknown[], overlay: unknown[]): unknown[] {\n return base.map((item, index) => {\n const overlayItem = overlay[index];\n if (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n overlayItem &&\n typeof overlayItem === \"object\" &&\n !Array.isArray(overlayItem)\n ) {\n return deepMerge(item as Record<string, unknown>, overlayItem as Record<string, unknown>);\n }\n return overlayItem ?? item;\n });\n}\n\n/** Collect the schema fields marked `field.translatable()`. */\nexport function listTranslatableFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"translatable\");\n}\n\n/**\n * Whether a content type has anything to translate. A type with a body is\n * always potentially translatable; a bodyless type (`body: false`) is\n * translatable only when at least one schema field is `field.translatable()`.\n *\n * The single source of truth for every translation workflow (worklist, staleness,\n * status counts, studio dashboards, store writes): a type for which this returns\n * `false` disappears from all of them.\n */\nexport function isTypeTranslatable(type: Pick<ContentTypeInput, \"schema\" | \"body\">): boolean {\n return listTranslatableFields(type.schema).length > 0 || type.body !== false;\n}\n\n/** Collect relation field paths and targets from a content schema. */\nexport function listRelationFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"relation\");\n}\n\n/** Collect asset field paths and constraints from a content schema. */\nexport function listAssetFields(schema: z.ZodTypeAny): SchemaFieldMeta[] {\n return introspectSchema(schema).filter((f) => f.kind === \"asset\");\n}\n","import type { z } from \"zod\";\nimport type { RELATION_BRAND, RelationBrand } from \"./field.js\";\n\n/**\n * How document slugs behave across locales.\n * - `\"fixed\"` — the EN slug is used for every locale.\n * - `\"localized\"` — each locale gets its own translated slug.\n */\nexport type SlugStrategy = \"localized\" | \"fixed\";\n\n/**\n * What `resolve()` returns when a locale has no translation for a slug.\n * - `\"en\"` — fall back to the default-locale document.\n * - `\"none\"` — return no document.\n */\nexport type IndexFallback = \"en\" | \"none\";\n\n/** Sort order for `list()`. Built-in keys sort by document metadata; pass a comparator for anything else. */\nexport type OrderBy<TDoc = ScribeDocument> =\n | \"slug\"\n | \"publishedAt\"\n | \"-publishedAt\"\n | \"updatedAt\"\n | \"-updatedAt\"\n | ((a: TDoc, b: TDoc) => number);\n\nexport interface CrossValidateContext {\n locale: string;\n defaultLocale: string;\n slug: string;\n enSlug: string;\n knownLocales: readonly string[];\n englishSlugs?: ReadonlySet<string>;\n}\n\nexport interface CrossValidateIssue {\n field: string;\n message: string;\n level: \"error\" | \"warning\";\n}\n\n/** Named locale groups usable with `scribe translate --preset <name>`. */\nexport interface LocalePresets {\n active?: string[];\n ultraLight?: string[];\n [name: string]: string[] | undefined;\n}\n\n/** Derived fallback chains: locale → ordered locales tried before the default locale when the locale has no translation. */\nexport type LocaleFallbacks = Record<string, string[]>;\n\n/** How non-default locales appear in generated URLs. */\nexport type LocaleRoutingConfig =\n | { strategy: \"path-prefix\"; prefixDefaultLocale?: boolean }\n | { strategy: \"search-param\"; param: string };\n\n/** Per-content-type translation settings (merged over the project-level defaults). */\nexport interface TranslateConfig {\n /** Replace the default system prompt entirely. */\n prompt?: string;\n /** Brand/domain context prepended to every translation request. */\n context?: string;\n /** Extra rules appended to the default rules. */\n rules?: string[];\n /** Model override for this content type. */\n model?: string;\n}\n\n/** Project-level translation defaults. */\nexport interface ScribeTranslateDefaults {\n defaultModel?: string;\n prompt?: string;\n context?: string;\n rules?: string[];\n}\n\n/**\n * A content type declaration as written in `scribe.config.ts`.\n * Most fields are optional with sensible defaults — see each field's doc.\n */\nexport interface ContentTypeInput<TSchema extends z.ZodTypeAny = z.ZodTypeAny> {\n /** Unique id. Becomes the typed accessor (`scribe.<id>`) and the default `contentDir`. */\n id: string;\n /** Zod schema for the EN frontmatter. Mark fields with `field.translatable()/structural()/relation()`. */\n schema: TSchema;\n /** Directory under the project content dir holding this type's `.mdx` files. Default: the type `id`. */\n contentDir?: string;\n /** URL template for routable types, e.g. `/blog/{slug}`. Must contain exactly one `{slug}`. Omit for reference-only types. */\n path?: string;\n /** Human label (studio UI). Default: capitalized `id`. */\n label?: string;\n /** Default: `\"fixed\"`. */\n slugStrategy?: SlugStrategy;\n /** Default: `\"en\"` when the type has a `path`, otherwise `\"none\"`. */\n indexFallback?: IndexFallback;\n /** Default sort for `list()`. Default: `\"slug\"`. */\n orderBy?: OrderBy<ScribeDocument<z.infer<TSchema>>>;\n /**\n * Whether entries carry an MDX body. Default: `true`. Set `false` for\n * frontmatter-only reference types (e.g. structural `model`/`garment`\n * catalogs): the loader skips MDX body work, validation errors on any\n * non-empty body, translation payloads never include a body, and the studio\n * shows a \"frontmatter-only\" chip instead of a body section. Combined with a\n * schema that has no `field.translatable()` fields, the type is derived to be\n * non-translatable and drops out of every translation workflow. See\n * [Bodyless types](../../docs/bodyless-types.md).\n */\n body?: boolean;\n /** Custom validation across fields, run by `scribe validate`. */\n crossValidate?: (\n data: z.infer<TSchema>,\n ctx: CrossValidateContext,\n ) => CrossValidateIssue[];\n translate?: TranslateConfig;\n}\n\n/** A content type with all defaults applied (what runtimes and the CLI consume). */\nexport interface ContentTypeConfig<TSchema extends z.ZodTypeAny = z.ZodTypeAny>\n extends ContentTypeInput<TSchema> {\n contentDir: string;\n label: string;\n slugStrategy: SlugStrategy;\n indexFallback: IndexFallback;\n}\n\n/**\n * The `assets` config group. Passing `assets: {}` opts a project into the\n * asset system with defaults; without it (and without the deprecated\n * `assetsDir`), asset validation and loader resolution are skipped entirely.\n * See [Asset management](../../docs/assets.md).\n */\nexport interface AssetsConfigInput {\n /** Where source files live on disk, relative to `rootDir`. Default: `\"public\"`. */\n dir?: string;\n /**\n * URL prefix the frontend serves assets under — a path (`\"/\"`, `\"/static/\"`)\n * or an absolute origin (`\"https://cdn.example.com/\"`). Default: `\"/\"`.\n */\n publicPath?: string;\n /**\n * Extra Scribe-owned roots (web paths) not covered by any `field.asset()`\n * `dir`/`template` — e.g. directories referenced from MDX bodies. Used by the\n * future audit layer; files outside managed roots are never reported.\n */\n managedDirs?: string[];\n}\n\n/** Resolved `assets` group (absolute `assetsPath`, defaults applied). */\nexport interface ResolvedAssetsConfig {\n /** Absolute path to the static assets folder. */\n assetsPath: string;\n /** URL prefix served under (raw string; join via the loader helper). */\n publicPath: string;\n /** Extra Scribe-owned source roots (web paths) for the audit layer. */\n managedDirs: string[];\n}\n\n/** Options reserved for the future asset preprocessing pipeline. Phase 1 throws on any provided key. */\nexport interface AssetUrlOptions {}\n\n/**\n * The shape accepted by `defineConfig()` / `createScribe()`.\n * Relative paths (`contentDir`, `store`) resolve against `rootDir`.\n */\nexport interface ScribeConfigInput<\n TTypes extends readonly ContentTypeInput<any>[] = readonly ContentTypeInput[],\n> {\n /** Absolute project root (the directory holding `scribe.config.ts`). */\n rootDir: string;\n /** Directory containing the per-type content folders. Default: `\"content\"`. */\n contentDir?: string;\n /** Path to the SQLite translation store. Default: `\".scribe/store.sqlite\"`. Commit this file; do not gitignore `.scribe/`. */\n store?: string;\n /** Path to the static assets folder (e.g. Next.js `public`). Relative to project `rootDir`. When set, `scribe validate` warns on missing image files. @deprecated Use `assets.dir` instead. */\n assetsDir?: string;\n /** Asset system config (`{ dir, publicPath, managedDirs }`). Supersedes `assetsDir`. See [Asset management](../../docs/assets.md). */\n assets?: AssetsConfigInput;\n /** All locales, including the default one. */\n locales: string[];\n /** Canonical source locale. Must be in `locales`. Default: `\"en\"`. */\n defaultLocale?: string;\n /** How locale markers are applied to generated URLs. Default: path-prefix without default locale. */\n localeRouting?: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Enable automatic locale fallback chains derived from locale tags — e.g. `\"pt-BR\"` is served from `\"pt\"` (before the default locale) when it has no translation. Default: `true`. */\n localeFallbacks?: boolean;\n translate?: ScribeTranslateDefaults;\n types: TTypes;\n}\n\n/**\n * A fully resolved Scribe config (all defaults applied, paths absolute).\n * Note: `rootDir` here is the absolute **content** root, not the project root.\n */\nexport interface ScribeConfig {\n /** Absolute content root (project `rootDir` + `contentDir`). */\n rootDir: string;\n /** Absolute path to the SQLite translation store. */\n storePath: string;\n /** Absolute path to the static assets folder, when the asset system is enabled. Mirrors `assets.assetsPath` for back-compat (existing consumers read this). */\n assetsPath?: string;\n /** Resolved asset system config; `undefined` unless `assets`/`assetsDir` was set. */\n assets?: ResolvedAssetsConfig;\n locales: string[];\n defaultLocale: string;\n localeRouting: LocaleRoutingConfig;\n localePresets?: LocalePresets;\n /** Fallback chains derived from locale tags (`{}` when the feature is disabled). `resolveConfig` always populates this; optional so hand-built config literals can omit it. */\n localeFallbacks?: LocaleFallbacks;\n translate?: ScribeTranslateDefaults;\n types: ContentTypeConfig[];\n}\n\n/** A loaded document (EN file or stored translation). */\nexport interface ScribeDocument<TFrontmatter = Record<string, unknown>> {\n /** Slug in this document's locale (differs from `enSlug` for localized slugs). */\n slug: string;\n /** Slug of the EN (default-locale) parent. Equal to `slug` for EN documents. */\n enSlug: string;\n locale: string;\n publishedAt?: string;\n updatedAt?: string;\n noindex: boolean;\n /** Explicit EN frontmatter override for canonical URL path. */\n canonicalPathOverride?: string;\n frontmatter: TFrontmatter;\n content: string;\n filePath?: string;\n}\n\nexport interface LocaleIndex<TDoc = ScribeDocument> {\n bySlug: ReadonlyMap<string, TDoc>;\n byEnSlug: ReadonlyMap<string, TDoc>;\n}\n\nexport type AllDocuments<TDoc = ScribeDocument> = ReadonlyMap<string, LocaleIndex<TDoc>>;\n\n/** Result of `resolve()`: the document plus redirect/canonical routing data. */\nexport interface ResolvedDocument<TDoc = ScribeDocument> {\n document: TDoc | null;\n /** Locale actually served (differs from the requested locale on EN fallback). */\n actualLocale: string;\n /** 301 target when the slug is an alias or belongs to another locale. */\n shouldRedirectTo?: string;\n /** Locale-aware pathname when the type has `path` and a document was found. */\n canonicalPath?: string;\n}\n\n/** `{ locale, slug }` pairs for Next.js `generateStaticParams()`. */\nexport interface StaticParam {\n locale: string;\n slug: string;\n}\n\nexport interface ListOptions<TDoc = ScribeDocument> {\n /** Override the type's configured `orderBy` for this call. */\n orderBy?: OrderBy<TDoc>;\n limit?: number;\n}\n\n/** Untyped default for the `related()` field map. */\nexport type AnyRelatedMap = Record<string, ScribeDocument | ScribeDocument[] | null>;\n\n/**\n * Per-content-type runtime API.\n *\n * Reads: `list`, `get`, `resolve`. Routing: `staticParams`, `alternates`,\n * `translation`, `url`. Relations: `related`. Low-level escape hatch: `load`.\n */\nexport interface ContentTypeRuntime<\n TDoc extends ScribeDocument = ScribeDocument,\n TRelated extends Record<string, unknown> = AnyRelatedMap,\n> {\n id: string;\n config: ContentTypeConfig;\n\n /** All documents for a locale (default: the default locale), sorted by the type's `orderBy`. */\n list: (locale?: string, options?: ListOptions<TDoc>) => TDoc[];\n /** Exact slug lookup in one locale (default: the default locale). No fallback, no redirects. */\n get: (slug: string, locale?: string) => TDoc | null;\n /** Full resolution: aliases, cross-locale slug correction, EN fallback, redirects, canonical path. */\n resolve: (slug: string, locale: string) => ResolvedDocument<TDoc>;\n\n /** Every `{ locale, slug }` pair to prerender — one call in `generateStaticParams()`. */\n staticParams: (options?: { locales?: readonly string[] }) => StaticParam[];\n /** hreflang map: locale → relative path, for every locale with a translation (default locale always included). */\n alternates: (doc: TDoc) => Record<string, string>;\n /** The same document in another locale, or null when untranslated (callers typically do `?? doc`). */\n translation: (doc: TDoc, targetLocale: string) => TDoc | null;\n /** Pathname for a slug + locale from the type's `path` template. */\n url: (slug: string, locale: string) => string;\n\n /** Dereference a `field.relation()` frontmatter field into the target type's document(s). */\n related: <K extends keyof TRelated & string>(\n doc: TDoc,\n field: K,\n locale?: string,\n ) => TRelated[K];\n\n /** Low-level access to the full locale → index map. Prefer `list`/`get`/`resolve`. */\n load: () => AllDocuments<TDoc>;\n}\n\n/** Infer the document type from a content type declaration. */\nexport type InferDocFromTypeConfig<T extends ContentTypeInput<any>> = ScribeDocument<\n z.infer<T[\"schema\"]>\n>;\n\n/** Map content type id → document type from a config types tuple. */\nexport type InferDocMap<TTypes extends readonly ContentTypeInput<any>[]> = {\n [T in TTypes[number] as T[\"id\"]]: InferDocFromTypeConfig<T>;\n};\n\n/** Document map (id → ScribeDocument) from a config object type. */\nexport type ScribeDocs<C extends { types: readonly ContentTypeInput<any>[] }> = InferDocMap<\n C[\"types\"]\n>;\n\n/** Single doc type by content-type id. */\nexport type ScribeDocOf<\n C extends { types: readonly ContentTypeInput<any>[] },\n Id extends keyof ScribeDocs<C> & string,\n> = ScribeDocs<C>[Id];\n\ntype RelationBrandOf<TField> = TField extends {\n [RELATION_BRAND]: infer B extends RelationBrand<string, boolean, boolean>;\n}\n ? B\n : never;\n\n/** Top-level `field.relation()` fields of a schema, keyed by field name. */\nexport type RelationFieldsOf<TSchema extends z.ZodTypeAny> =\n TSchema extends z.ZodObject<infer Shape>\n ? {\n [K in keyof Shape as [RelationBrandOf<Shape[K]>] extends [never]\n ? never\n : K]: RelationBrandOf<Shape[K]>;\n }\n : {};\n\ntype RelatedDoc<B, TDocMap> = B extends RelationBrand<\n infer TTarget,\n infer TMultiple,\n infer TOptional\n>\n ? TTarget extends keyof TDocMap\n ? TMultiple extends true\n ? Array<TDocMap[TTarget]>\n : TOptional extends true\n ? TDocMap[TTarget] | null\n : TDocMap[TTarget]\n : never\n : never;\n\n/** `related()` return types for a content type, derived from its schema's relation fields. */\nexport type RelatedMapFor<\n T extends ContentTypeInput<any>,\n TTypes extends readonly ContentTypeInput<any>[],\n> = {\n [K in keyof RelationFieldsOf<T[\"schema\"]> & string]: RelatedDoc<\n RelationFieldsOf<T[\"schema\"]>[K],\n InferDocMap<TTypes>\n >;\n};\n\n/**\n * The typed Scribe client returned by `createScribe()`.\n * Each content type id becomes a typed accessor: `scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …\n */\nexport type Scribe<TTypes extends readonly ContentTypeInput<any>[]> = {\n readonly [T in TTypes[number] as T[\"id\"]]: ContentTypeRuntime<\n InferDocFromTypeConfig<T>,\n RelatedMapFor<T, TTypes>\n >;\n} & {\n /** Sitemap entries (with hreflang alternates) for all routable types. */\n sitemap(\n options: import(\"../sitemap/types.js\").GenerateSitemapOptions,\n ): Promise<import(\"../sitemap/types.js\").SitemapEntry[]>;\n /** Asset URL helper: applies `assets.publicPath` to a root-relative web path. Escape hatch for MDX body images. */\n assets: { url(ref: string, opts?: AssetUrlOptions): string };\n /** The resolved config (defaults applied, paths absolute). */\n config: ScribeConfig;\n project: ScribeProject;\n getType: ScribeProject[\"getType\"];\n listTypes: ScribeProject[\"listTypes\"];\n listRoutableTypes: ScribeProject[\"listRoutableTypes\"];\n};\n\n/** Typed client type from a config object type (for app-side type aliases). */\nexport type ScribeClient<C extends { types: readonly ContentTypeInput<any>[] }> = Scribe<\n C[\"types\"]\n>;\n\n/** Untyped project engine (CLI, validation, studio). Prefer `createScribe()` in apps. */\nexport interface ScribeProject {\n config: ScribeConfig;\n rootDir: string;\n storePath: string;\n getType: (id: string) => ContentTypeRuntime;\n listTypes: () => ContentTypeRuntime[];\n /** Content types with a `path` template (public URLs, hreflang, sitemap). */\n listRoutableTypes: () => ContentTypeRuntime[];\n}\n\n/** Identity helper that preserves content-type id and schema inference. */\nexport function defineConfig<const TTypes extends readonly ContentTypeInput<any>[]>(\n config: ScribeConfigInput<TTypes>,\n): ScribeConfigInput<TTypes> {\n return config;\n}\n\n/** Identity helper for a single content type entry. */\nexport function defineContentType<\n const TId extends string,\n TSchema extends z.ZodTypeAny,\n>(\n config: ContentTypeInput<TSchema> & { id: TId },\n): ContentTypeInput<TSchema> & { id: TId } {\n return config;\n}\n","import type {\n AssetUrlOptions,\n ContentTypeInput,\n ContentTypeRuntime,\n Scribe,\n ScribeConfigInput,\n} from \"./core/types.js\";\nimport { resolveConfig } from \"./config/resolve-config.js\";\nimport { createProject } from \"./create-project.js\";\nimport { joinPublicPath } from \"./loader/resolve-assets.js\";\nimport { generateSitemap } from \"./sitemap/generate-sitemap.js\";\nimport type { GenerateSitemapOptions } from \"./sitemap/types.js\";\n\n/**\n * Create the typed Scribe client. Each content type id becomes a typed\n * accessor (`scribe.blog.list()`, `scribe.blog.related(doc, \"author\")`, …),\n * plus `scribe.sitemap()`.\n *\n * Pass the object returned by `defineConfig()`; defaults and path resolution\n * are applied here.\n */\nexport function createScribe<const TTypes extends readonly ContentTypeInput<any>[]>(\n input: ScribeConfigInput<TTypes>,\n): Scribe<TTypes> {\n const config = resolveConfig(input);\n const project = createProject(config, { resolveAssets: true, resolveInlineTokens: true });\n const scribe = {\n config,\n project,\n getType: project.getType,\n listTypes: project.listTypes,\n listRoutableTypes: project.listRoutableTypes,\n sitemap(options: GenerateSitemapOptions) {\n return generateSitemap(project, options);\n },\n assets: {\n url(ref: string, opts?: AssetUrlOptions) {\n if (opts && Object.keys(opts).length > 0) {\n throw new Error(\n `scribe.assets.url: options are reserved for a future pipeline; got ${Object.keys(opts).join(\", \")}`,\n );\n }\n const assetsConfig = config.assets;\n return assetsConfig ? joinPublicPath(assetsConfig.publicPath, ref) : ref;\n },\n },\n } as unknown as Scribe<TTypes>;\n\n for (const type of config.types) {\n (scribe as unknown as Record<string, ContentTypeRuntime>)[type.id] =\n project.getType(type.id);\n }\n\n return scribe;\n}\n","import path from \"node:path\";\nimport type {\n ContentTypeConfig,\n LocaleFallbacks,\n ResolvedAssetsConfig,\n ScribeConfig,\n ScribeConfigInput,\n} from \"../core/types.js\";\nimport { assertValidPathTemplate } from \"../i18n/build-url.js\";\n\nconst RESOLVED = Symbol.for(\"@genlook/scribe/resolvedConfig\");\n\n/** Whether a config object has already been normalized by `resolveConfig()`. */\nexport function isResolvedConfig(config: unknown): config is ScribeConfig {\n return (\n typeof config === \"object\" &&\n config !== null &&\n (config as Record<symbol, unknown>)[RESOLVED] === true\n );\n}\n\n/**\n * Normalize a user config: apply defaults, make paths absolute, and validate\n * invariants. Every entry point (`createScribe`, the CLI's `loadConfigSync`)\n * must pass configs through here so runtimes never see partial configs.\n *\n * @param baseDir directory used to resolve a relative `rootDir`\n * (the config file's directory for the CLI; `process.cwd()` otherwise).\n */\nexport function resolveConfig(\n input: ScribeConfigInput<any> | ScribeConfig,\n baseDir?: string,\n): ScribeConfig {\n if (isResolvedConfig(input)) return input;\n const raw = input as ScribeConfigInput;\n\n if (!raw.rootDir) {\n throw new Error(\"scribe config: rootDir is required\");\n }\n if (!raw.locales || raw.locales.length === 0) {\n throw new Error(\"scribe config: locales must be a non-empty array\");\n }\n const defaultLocale = raw.defaultLocale ?? \"en\";\n if (!raw.locales.includes(defaultLocale)) {\n throw new Error(\n `scribe config: defaultLocale \"${defaultLocale}\" is not in locales [${raw.locales.join(\", \")}]`,\n );\n }\n\n const localeRouting = raw.localeRouting ?? {\n strategy: \"path-prefix\" as const,\n prefixDefaultLocale: false,\n };\n if (localeRouting.strategy === \"search-param\" && !localeRouting.param) {\n throw new Error('scribe config: localeRouting search-param requires a \"param\" name');\n }\n\n const localeFallbacks =\n raw.localeFallbacks === false\n ? {}\n : deriveLocaleFallbacks(raw.locales, defaultLocale);\n\n const projectRoot = path.resolve(baseDir ?? process.cwd(), raw.rootDir);\n const contentRoot = path.resolve(projectRoot, raw.contentDir ?? \"content\");\n const storePath = path.resolve(projectRoot, raw.store ?? \".scribe/store.sqlite\");\n\n // The asset system is opt-in: enabled only when `assets` or the deprecated\n // `assetsDir` is set. When enabled, `assets` wins over `assetsDir`, and dir /\n // publicPath / managedDirs default to \"public\" / \"/\" / []. Left off entirely,\n // both `assetsPath` and `assets` stay undefined so no asset validation runs.\n let assetsPath: string | undefined;\n let assets: ResolvedAssetsConfig | undefined;\n if (raw.assets !== undefined || raw.assetsDir !== undefined) {\n const dir = raw.assets?.dir ?? raw.assetsDir ?? \"public\";\n const publicPath = raw.assets?.publicPath ?? \"/\";\n const managedDirs = raw.assets?.managedDirs ?? [];\n assetsPath = path.resolve(projectRoot, dir);\n assets = { assetsPath, publicPath, managedDirs };\n }\n\n const seenIds = new Set<string>();\n const types: ContentTypeConfig[] = raw.types.map((type) => {\n if (seenIds.has(type.id)) {\n throw new Error(`scribe config: duplicate content type id \"${type.id}\"`);\n }\n seenIds.add(type.id);\n if (type.path) {\n assertValidPathTemplate(type.path, type.id);\n }\n return {\n ...type,\n contentDir: type.contentDir ?? type.id,\n label: type.label ?? type.id.charAt(0).toUpperCase() + type.id.slice(1),\n slugStrategy: type.slugStrategy ?? \"fixed\",\n indexFallback: type.indexFallback ?? (type.path ? \"en\" : \"none\"),\n // `body` defaults to true (fully backwards compatible). A resolved type\n // always carries an explicit boolean so consumers read one source of truth.\n body: type.body ?? true,\n };\n });\n\n const config: ScribeConfig = {\n rootDir: contentRoot,\n storePath,\n assetsPath,\n assets,\n locales: [...raw.locales],\n defaultLocale,\n localeRouting,\n localePresets: raw.localePresets,\n localeFallbacks,\n translate: raw.translate,\n types,\n };\n Object.defineProperty(config, RESOLVED, {\n value: true,\n enumerable: false,\n });\n return config;\n}\n\n/**\n * Derive fallback chains from locale tags: each locale falls back to its\n * successively shorter tag prefixes (longest first) that are themselves\n * configured, e.g. `\"zh-Hant-TW\"` → `[\"zh-Hant\", \"zh\"]`. Prefix matching is\n * case-insensitive (BCP-47 casing varies); chains store the configured\n * spelling. The default locale is excluded — it stays the implicit final\n * fallback so `indexFallback: \"none\"` keeps its meaning.\n */\nfunction deriveLocaleFallbacks(\n locales: readonly string[],\n defaultLocale: string,\n): LocaleFallbacks {\n const byLowercase = new Map(locales.map((l) => [l.toLowerCase(), l]));\n const fallbacks: LocaleFallbacks = {};\n for (const locale of locales) {\n const subtags = locale.split(\"-\");\n if (subtags.length < 2) continue;\n const chain: string[] = [];\n for (let end = subtags.length - 1; end >= 1; end--) {\n const prefix = byLowercase.get(subtags.slice(0, end).join(\"-\").toLowerCase());\n if (prefix && prefix !== locale && prefix !== defaultLocale) {\n chain.push(prefix);\n }\n }\n if (chain.length > 0) {\n fallbacks[locale] = chain;\n }\n }\n return fallbacks;\n}\n","import 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 type {\n ContentTypeConfig,\n ContentTypeRuntime,\n ListOptions,\n OrderBy,\n ScribeConfig,\n ScribeDocument,\n ScribeProject,\n StaticParam,\n} from \"./core/types.js\";\nimport { listRelationFields, type SchemaFieldMeta } from \"./core/introspect-schema.js\";\nimport { createContentLoader } from \"./loader/create-loader.js\";\nimport { createInlineResolver, type InlineResolver } from \"./inline/resolve-tokens.js\";\nimport { resolveLocalizedDocument } from \"./i18n/resolve-document.js\";\nimport { createUrlBuilder, isRoutableType } from \"./i18n/build-url.js\";\n\nfunction comparatorFor(orderBy: OrderBy): (a: ScribeDocument, b: ScribeDocument) => number {\n if (typeof orderBy === \"function\") return orderBy;\n switch (orderBy) {\n case \"publishedAt\":\n return (a, b) => (a.publishedAt ?? \"\").localeCompare(b.publishedAt ?? \"\");\n case \"-publishedAt\":\n return (a, b) => (b.publishedAt ?? \"\").localeCompare(a.publishedAt ?? \"\");\n case \"updatedAt\":\n return (a, b) => (a.updatedAt ?? \"\").localeCompare(b.updatedAt ?? \"\");\n case \"-updatedAt\":\n return (a, b) => (b.updatedAt ?? \"\").localeCompare(a.updatedAt ?? \"\");\n default:\n return (a, b) => a.slug.localeCompare(b.slug);\n }\n}\n\nfunction buildRuntime(\n config: ScribeConfig,\n type: ContentTypeConfig,\n getRuntime: (id: string) => ContentTypeRuntime,\n options: { resolveAssets?: boolean; inlineResolver?: InlineResolver } = {},\n): ContentTypeRuntime {\n const load = createContentLoader(config, type, {\n resolveAssets: options.resolveAssets,\n inlineResolver: options.inlineResolver,\n });\n const relationFields = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.schema)\n .filter((f) => f.path.length === 1)\n .map((f) => [f.path[0]!, f]),\n );\n\n function assertRoutable(method: string): string {\n if (!type.path) {\n throw new Error(\n `Content type \"${type.id}\" has no path template — ${method}() requires one`,\n );\n }\n return type.path;\n }\n\n const urlBuilder = createUrlBuilder(config);\n\n const runtime: ContentTypeRuntime = {\n id: type.id,\n config: type,\n load,\n\n list(locale = config.defaultLocale, options: ListOptions = {}) {\n const idx = load().get(locale);\n if (!idx) return [];\n const docs = Array.from(idx.bySlug.values());\n docs.sort(comparatorFor(options.orderBy ?? type.orderBy ?? \"slug\"));\n return options.limit !== undefined ? docs.slice(0, options.limit) : docs;\n },\n\n get(slug: string, locale = config.defaultLocale) {\n return load().get(locale)?.bySlug.get(slug) ?? null;\n },\n\n resolve(slug: string, locale: string) {\n const result = resolveLocalizedDocument(\n slug,\n locale,\n config.defaultLocale,\n load(),\n type,\n config.localeRouting,\n config.localeFallbacks?.[locale] ?? [],\n );\n if (result.document && type.path) {\n return {\n ...result,\n canonicalPath: urlBuilder.resolvePath(\n type.path,\n result.document.slug,\n result.actualLocale,\n ),\n };\n }\n return result;\n },\n\n staticParams(options = {}) {\n assertRoutable(\"staticParams\");\n const all = load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) return [];\n const params: StaticParam[] = [];\n for (const locale of options.locales ?? config.locales) {\n const localeIdx = all.get(locale);\n const fallbacks = config.localeFallbacks?.[locale] ?? [];\n for (const doc of enIdx.bySlug.values()) {\n let slug: string;\n if (locale === config.defaultLocale) {\n slug = doc.slug;\n } else {\n // Prefer the locale's own translated slug, then each fallback\n // locale's translated slug, then the EN slug — matching resolve().\n slug =\n localeIdx?.byEnSlug.get(doc.slug)?.slug ??\n fallbacks\n .map((fb) => all.get(fb)?.byEnSlug.get(doc.slug)?.slug)\n .find((s): s is string => s !== undefined) ??\n doc.slug;\n }\n params.push({ locale, slug });\n }\n }\n return params;\n },\n\n alternates(doc: ScribeDocument) {\n const pathTemplate = assertRoutable(\"alternates\");\n const out: Record<string, string> = {\n [config.defaultLocale]: urlBuilder.resolvePath(\n pathTemplate,\n doc.enSlug,\n config.defaultLocale,\n ),\n };\n const all = load();\n for (const locale of config.locales) {\n if (locale === config.defaultLocale) continue;\n const translated = all.get(locale)?.byEnSlug.get(doc.enSlug);\n if (translated) {\n out[locale] = urlBuilder.resolvePath(pathTemplate, translated.slug, locale);\n }\n }\n return out;\n },\n\n translation(doc: ScribeDocument, targetLocale: string) {\n if (targetLocale === doc.locale) return doc;\n const all = load();\n if (targetLocale === config.defaultLocale) {\n return all.get(config.defaultLocale)?.bySlug.get(doc.enSlug) ?? null;\n }\n return all.get(targetLocale)?.byEnSlug.get(doc.enSlug) ?? null;\n },\n\n url(slug: string, locale: string) {\n const pathTemplate = assertRoutable(\"url\");\n return urlBuilder.resolvePath(pathTemplate, slug, locale);\n },\n\n related(doc: ScribeDocument, fieldName: string, locale?: string) {\n const meta = relationFields.get(fieldName);\n if (!meta) {\n throw new Error(\n `Content type \"${type.id}\" has no top-level relation field \"${fieldName}\"`,\n );\n }\n const target = getRuntime(meta.relationTarget!);\n const lookupLocale = locale ?? doc.locale;\n const value = (doc.frontmatter as Record<string, unknown>)[fieldName];\n\n // Relations always hold EN slugs (structural fields are merged from EN).\n // Deref in the requested locale, falling back to the EN doc unconditionally.\n const deref = (enSlug: string): ScribeDocument | null => {\n const all = target.load();\n return (\n all.get(lookupLocale)?.byEnSlug.get(enSlug) ??\n all.get(config.defaultLocale)?.bySlug.get(enSlug) ??\n null\n );\n };\n\n if (meta.relationMultiple) {\n if (!Array.isArray(value)) return [];\n return value\n .filter((slug): slug is string => typeof slug === \"string\" && slug.length > 0)\n .map(deref)\n .filter((d): d is ScribeDocument => d !== null);\n }\n\n if (typeof value !== \"string\" || value.length === 0) {\n if (meta.relationOptional) return null;\n throw new Error(\n `${type.id} \"${doc.enSlug}\": required relation \"${fieldName}\" is missing`,\n );\n }\n const resolved = deref(value);\n if (!resolved && !meta.relationOptional) {\n throw new Error(\n `${type.id} \"${doc.enSlug}\": relation \"${fieldName}\" references missing ` +\n `${meta.relationTarget} \"${value}\" — run \\`scribe validate\\``,\n );\n }\n return resolved;\n },\n } as ContentTypeRuntime;\n\n return runtime;\n}\n\n/**\n * Create the untyped project engine (CLI, validation, studio).\n * Apps should use `createScribe()` for typed per-type accessors.\n * Expects a resolved config (`resolveConfig` / `loadConfigSync`).\n *\n * @param options.resolveAssets resolve declared asset fields to served URLs on\n * read (publicPath applied, templates materialized). Only `createScribe` sets\n * this; the CLI, validation, and static exports keep source values.\n * @param options.resolveInlineTokens substitute `${{...}}` inline tokens in\n * document bodies on read (EN tokens filled in place, translated `%%n%%`\n * markers filled from the current EN tokens). Only `createScribe` sets this;\n * the CLI, validation, and studio keep raw token syntax.\n * @internal\n */\nexport function createProject(\n config: ScribeConfig,\n options: { resolveAssets?: boolean; resolveInlineTokens?: boolean } = {},\n): ScribeProject {\n const runtimes = new Map<string, ContentTypeRuntime>();\n const getRuntime = (id: string): ContentTypeRuntime => {\n const runtime = runtimes.get(id);\n if (!runtime) {\n throw new Error(`Unknown content type \"${id}\"`);\n }\n return runtime;\n };\n\n // One resolver instance shared across every type's loader. It reads localized\n // slugs straight from the store (never through another loader), so building it\n // here cannot recurse into the runtimes it lives alongside.\n const inlineResolver = options.resolveInlineTokens\n ? createInlineResolver(config)\n : undefined;\n\n for (const type of config.types) {\n runtimes.set(\n type.id,\n buildRuntime(config, type, getRuntime, {\n resolveAssets: options.resolveAssets,\n inlineResolver,\n }),\n );\n }\n\n return {\n config,\n rootDir: config.rootDir,\n storePath: config.storePath,\n getType: getRuntime,\n listTypes() {\n return Array.from(runtimes.values());\n },\n listRoutableTypes() {\n return Array.from(runtimes.values()).filter((runtime) => isRoutableType(runtime.config));\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport 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 { 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 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","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","/** 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 fs from \"node:fs\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { createUrlBuilder, isRoutableType, type UrlBuilder } from \"../i18n/build-url.js\";\nimport { joinPublicPath } from \"../loader/resolve-assets.js\";\nimport { openStore, resolveStorePath } from \"../storage/sqlite.js\";\nimport { bulkLoadTranslations } from \"../storage/translations.js\";\nimport {\n extractInlineTokens,\n fillPlaceholders,\n unescapeInlineTokens,\n type InlineToken,\n} from \"./tokens.js\";\n\n/**\n * Read-time token resolver. Maps a single inline token to its string value given\n * the EN source document's frontmatter and a target locale.\n *\n * Relations resolve to a locale-aware URL via the existing `resolvePath`\n * machinery, using the target document's *localized* slug. Localized slugs live\n * in the translation store; the resolver reads them once per store revision\n * (keyed on the store file's mtime), never through another type's loader, so\n * there is no cross-loader recursion.\n */\nexport interface InlineResolver {\n resolve(\n token: InlineToken,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n ): string;\n}\n\nfunction slugKey(typeId: string, enSlug: string, locale: string): string {\n return `${typeId}\\u0000${enSlug}\\u0000${locale}`;\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every((v) => typeof v === \"string\");\n}\n\nexport function createInlineResolver(config: ScribeConfig): InlineResolver {\n const urlBuilder: UrlBuilder = createUrlBuilder(config);\n const typeById = new Map(config.types.map((t) => [t.id, t]));\n const storePath = resolveStorePath(config);\n\n let slugCache: { mtime: number; index: Map<string, string> } | null = null;\n\n const localizedSlugIndex = (): Map<string, string> => {\n let mtime = 0;\n try {\n mtime = fs.statSync(storePath).mtimeMs;\n } catch {\n mtime = 0;\n }\n if (slugCache && slugCache.mtime === mtime) return slugCache.index;\n\n const index = new Map<string, string>();\n try {\n const db = openStore(config, \"readonly\");\n try {\n for (const row of bulkLoadTranslations(db)) {\n index.set(slugKey(row.content_type, row.en_slug, row.locale), row.slug);\n }\n } finally {\n db.close();\n }\n } catch {\n /* store missing or unreadable: fall back to EN slugs */\n }\n slugCache = { mtime, index };\n return index;\n };\n\n const localizedSlug = (typeId: string, enSlug: string, locale: string): string => {\n if (locale === config.defaultLocale) return enSlug;\n const index = localizedSlugIndex();\n const direct = index.get(slugKey(typeId, enSlug, locale));\n if (direct) return direct;\n for (const fb of config.localeFallbacks?.[locale] ?? []) {\n const hit = index.get(slugKey(typeId, enSlug, fb));\n if (hit) return hit;\n }\n return enSlug;\n };\n\n return {\n resolve(token, enFrontmatter, locale): string {\n switch (token.kind) {\n case \"static\":\n return token.text;\n\n case \"var\": {\n const vars = enFrontmatter.vars;\n if (isStringRecord(vars) && typeof vars[token.key] === \"string\") {\n return vars[token.key]!;\n }\n return \"\";\n }\n\n case \"asset\": {\n const assets = config.assets;\n return assets ? joinPublicPath(assets.publicPath, token.webPath) : token.webPath;\n }\n\n case \"relation\": {\n const type = typeById.get(token.targetTypeId);\n if (!type) return \"\";\n if (token.mode === \"slug\") return token.enSlug;\n if (!isRoutableType(type)) return \"\";\n const slug = localizedSlug(token.targetTypeId, token.enSlug, locale);\n return urlBuilder.resolvePath(type.path!, slug, locale);\n }\n }\n },\n };\n}\n\n/**\n * Substitute inline tokens in an EN body at read time: extract tokens, resolve\n * each for the default locale, fill the placeholder markers, and unescape any\n * `$\\{{` sequences. A body with no tokens is returned unchanged (aside from\n * unescaping).\n */\nexport function substituteEnInlineBody(\n rawBody: string,\n enFrontmatter: Record<string, unknown>,\n defaultLocale: string,\n resolver: InlineResolver,\n): string {\n const { placeholderBody, tokens } = extractInlineTokens(rawBody);\n if (tokens.length === 0) return unescapeInlineTokens(placeholderBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, defaultLocale));\n return unescapeInlineTokens(fillPlaceholders(placeholderBody, values));\n}\n\n/**\n * Fill a stored translated body's `%%n%%` markers at read time. Tokens are\n * extracted from the CURRENT raw EN body and resolved for the document's locale,\n * so token VALUES (relation targets, asset paths, var values) always reflect the\n * live EN source even when the translation itself is older.\n */\nexport function fillTranslatedInlineBody(\n translatedBody: string,\n enRawBody: string,\n enFrontmatter: Record<string, unknown>,\n locale: string,\n resolver: InlineResolver,\n): string {\n const { tokens } = extractInlineTokens(enRawBody);\n if (tokens.length === 0) return unescapeInlineTokens(translatedBody);\n const values = tokens.map((t) => resolver.resolve(t, enFrontmatter, locale));\n return unescapeInlineTokens(fillPlaceholders(translatedBody, values));\n}\n","import type { SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ResolvedAssetsConfig, ScribeDocument } from \"../core/types.js\";\n\n/**\n * Join `publicPath` in front of a root-relative web path, avoiding double\n * slashes. Handles the `\"/\"` identity case, absolute origins\n * (`https://cdn.example.com/`), and path prefixes (`/static/`).\n */\nexport function joinPublicPath(publicPath: string, webPath: string): string {\n if (publicPath === \"\" || publicPath === \"/\") return webPath;\n const suffix = webPath.startsWith(\"/\") ? webPath : `/${webPath}`;\n return publicPath.replace(/\\/+$/, \"\") + suffix;\n}\n\nfunction materializeTemplate(template: string, enSlug: string): string {\n return template.split(\"{slug}\").join(enSlug);\n}\n\n/**\n * Navigate to each concrete location of an asset field path (arrays at `*`\n * segments) and replace the leaf via `transform`. A `template`-backed field\n * whose value is absent is materialized at the leaf when the immediate parent\n * container exists; a top-level absent leaf is set directly on the frontmatter.\n */\nfunction setAssetAtPath(\n container: Record<string, unknown>,\n path: string[],\n transform: (current: string | undefined) => string | undefined,\n): void {\n const [head, ...rest] = path;\n if (head === undefined) return;\n\n if (rest.length === 0) {\n const current = container[head];\n const next = transform(typeof current === \"string\" ? current : undefined);\n if (next !== undefined) container[head] = next;\n return;\n }\n\n if (rest[0] === \"*\") {\n const arr = container[head];\n if (!Array.isArray(arr)) return;\n for (const item of arr) {\n if (item && typeof item === \"object\" && !Array.isArray(item)) {\n setAssetAtPath(item as Record<string, unknown>, rest.slice(1), transform);\n }\n }\n return;\n }\n\n const child = container[head];\n if (child && typeof child === \"object\" && !Array.isArray(child)) {\n setAssetAtPath(child as Record<string, unknown>, rest, transform);\n }\n}\n\n/**\n * Resolve declared asset fields on a freshly-built document's frontmatter,\n * in place: materialize templated paths (`{slug}` → EN slug) and prefix\n * `assets.publicPath`. Runs after `mergeStructuralOntoLocale`, so locale\n * documents resolve from the merged EN source values.\n */\nexport function resolveDocumentAssets(\n doc: ScribeDocument,\n assetFields: SchemaFieldMeta[],\n assets: ResolvedAssetsConfig,\n): void {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n for (const f of assetFields) {\n setAssetAtPath(frontmatter, f.path, (current) => {\n let value = current;\n if (value === undefined) {\n if (!f.assetTemplate) return undefined;\n value = materializeTemplate(f.assetTemplate, doc.enSlug);\n }\n return joinPublicPath(assets.publicPath, value);\n });\n }\n}\n","/**\n * Inline tokens: `${{...}}` markers embedded in MDX bodies. Four kinds — static\n * literals, relation URLs/slugs, asset URLs, and per-document vars. See\n * `docs/inline-tokens.md`.\n *\n * This module is the shared, dependency-light heart of the feature: a tokenizer\n * that turns a raw body into a `placeholderBody` (tokens swapped for inert\n * `%%n%%` markers) plus the parsed token list, and the fill/mask helpers used by\n * the loader, translator, validator, and studio.\n *\n * Why `%%n%%` and not `{{n}}`: `{{...}}` is a JSX expression to remark-mdx and\n * would break MDX validation of stored translated bodies. `%%n%%` is inert text.\n */\n\n/** Opening delimiter of an inline token. */\nconst TOKEN_OPEN = \"${{\";\n/** Escape sequence: `$\\{{` renders as a literal `${{` and is never a token. */\nconst ESCAPE_SEQUENCE = \"$\\\\{{\";\nconst ESCAPE_RESULT = \"${{\";\n\nexport type InlineTokenKind = \"static\" | \"relation\" | \"asset\" | \"var\";\n\nexport interface StaticInlineToken {\n kind: \"static\";\n /** Verbatim literal (decoded from the token's JSON string). */\n text: string;\n /** The full `${{...}}` source span. */\n raw: string;\n}\n\nexport interface RelationInlineToken {\n kind: \"relation\";\n targetTypeId: string;\n enSlug: string;\n /** `\"url\"` resolves to the localized URL; `\"slug\"` resolves to the EN slug. */\n mode: \"url\" | \"slug\";\n raw: string;\n}\n\nexport interface AssetInlineToken {\n kind: \"asset\";\n /** Root-relative web path, e.g. `/web/path.webp`. */\n webPath: string;\n raw: string;\n}\n\nexport interface VarInlineToken {\n kind: \"var\";\n key: string;\n raw: string;\n}\n\nexport type InlineToken =\n | StaticInlineToken\n | RelationInlineToken\n | AssetInlineToken\n | VarInlineToken;\n\n/** A `${{...}}` span that failed to parse. Reported by validation, left as-is. */\nexport interface MalformedInlineToken {\n raw: string;\n reason: string;\n /** Byte offset of the token's `$` in the source body. */\n index: number;\n}\n\nexport interface ExtractInlineTokensResult {\n /** Body with each well-formed token replaced by `%%n%%` (1-based). */\n placeholderBody: string;\n /** Parsed well-formed tokens, in order of appearance. */\n tokens: InlineToken[];\n /** Spans that look like tokens but failed to parse. */\n malformed: MalformedInlineToken[];\n}\n\n/** The inert marker for the n-th (1-based) extracted token. */\nexport function placeholderMarker(n: number): string {\n return `%%${n}%%`;\n}\n\n/**\n * Find the index of the closing `}}` of a token whose content starts at\n * `start`. JSON-string aware so a static literal like `${{static:\"a}}b\"}}`\n * terminates at the correct `}}`. Returns the index of the first closing brace,\n * or -1 when the token is unterminated (also bails on a newline: tokens never\n * span lines).\n */\nfunction findTokenEnd(body: string, start: number): number {\n let i = start;\n let inString = false;\n while (i < body.length) {\n const ch = body[i]!;\n if (ch === \"\\n\") return -1;\n if (inString) {\n if (ch === \"\\\\\") {\n i += 2;\n continue;\n }\n if (ch === '\"') inString = false;\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inString = true;\n i += 1;\n continue;\n }\n if (ch === \"}\" && body[i + 1] === \"}\") return i;\n i += 1;\n }\n return -1;\n}\n\n/** Omit that distributes over a union (unlike the built-in `Omit`). */\ntype DistributiveOmit<T, K extends keyof T> = T extends unknown ? Omit<T, K> : never;\n\ntype ParseResult =\n | { ok: true; token: DistributiveOmit<InlineToken, \"raw\"> }\n | { ok: false; reason: string };\n\n/** Parse the inner content of a token (everything between `${{` and `}}`). */\nfunction parseTokenInner(inner: string): ParseResult {\n const colon = inner.indexOf(\":\");\n if (colon === -1) {\n return { ok: false, reason: `missing kind separator \":\"` };\n }\n const kind = inner.slice(0, colon);\n const rest = inner.slice(colon + 1);\n\n switch (kind) {\n case \"static\": {\n let text: unknown;\n try {\n text = JSON.parse(rest);\n } catch {\n return { ok: false, reason: `static value is not a valid JSON string` };\n }\n if (typeof text !== \"string\") {\n return { ok: false, reason: `static value must be a JSON string` };\n }\n return { ok: true, token: { kind: \"static\", text } };\n }\n case \"relation\": {\n // Slugs cannot contain \":\" so splitting is unambiguous.\n const parts = rest.split(\":\");\n if (parts.length < 2 || parts.length > 3) {\n return {\n ok: false,\n reason: `relation must be relation:<typeId>:<enSlug> or relation:<typeId>:<enSlug>:slug`,\n };\n }\n const [targetTypeId, enSlug, mode] = parts;\n if (!targetTypeId || !enSlug) {\n return { ok: false, reason: `relation is missing a typeId or enSlug` };\n }\n if (mode !== undefined && mode !== \"slug\") {\n return { ok: false, reason: `relation mode must be \"slug\" (got \"${mode}\")` };\n }\n return {\n ok: true,\n token: {\n kind: \"relation\",\n targetTypeId,\n enSlug,\n mode: mode === \"slug\" ? \"slug\" : \"url\",\n },\n };\n }\n case \"asset\": {\n if (!rest.startsWith(\"/\")) {\n return { ok: false, reason: `asset path must start with \"/\" (got \"${rest}\")` };\n }\n return { ok: true, token: { kind: \"asset\", webPath: rest } };\n }\n case \"var\": {\n if (!rest) return { ok: false, reason: `var is missing a key` };\n return { ok: true, token: { kind: \"var\", key: rest } };\n }\n default:\n return { ok: false, reason: `unknown token kind \"${kind}\"` };\n }\n}\n\n/**\n * Replace every well-formed token with an inert `%%n%%` marker and return the\n * parsed token list. Malformed spans are left verbatim (validation reports them)\n * and do NOT consume a marker index. Escape sequences (`$\\{{`) are not tokens\n * and pass through untouched — so a body with zero tokens yields\n * `placeholderBody === body` byte-for-byte.\n */\nexport function extractInlineTokens(body: string): ExtractInlineTokensResult {\n const tokens: InlineToken[] = [];\n const malformed: MalformedInlineToken[] = [];\n let out = \"\";\n let i = 0;\n\n while (i < body.length) {\n const open = body.indexOf(TOKEN_OPEN, i);\n if (open === -1) {\n out += body.slice(i);\n break;\n }\n out += body.slice(i, open);\n\n const contentStart = open + TOKEN_OPEN.length;\n const end = findTokenEnd(body, contentStart);\n if (end === -1) {\n // Unterminated: leave the rest verbatim; report it.\n malformed.push({\n raw: body.slice(open),\n reason: `unterminated token (missing \"}}\")`,\n index: open,\n });\n out += body.slice(open);\n break;\n }\n\n const raw = body.slice(open, end + 2);\n const inner = body.slice(contentStart, end);\n const parsed = parseTokenInner(inner);\n if (parsed.ok) {\n tokens.push({ ...parsed.token, raw } as InlineToken);\n out += placeholderMarker(tokens.length);\n } else {\n malformed.push({ raw, reason: parsed.reason, index: open });\n out += raw;\n }\n i = end + 2;\n }\n\n return { placeholderBody: out, tokens, malformed };\n}\n\n/**\n * Fill `%%n%%` markers with resolved values (1-based). A marker with no\n * corresponding value (a stale translation whose EN body lost tokens) is left\n * verbatim rather than blanked, so no meaningful text is silently dropped.\n */\nexport function fillPlaceholders(body: string, resolvedValues: string[]): string {\n return body.replace(/%%(\\d+)%%/g, (match, n: string) => {\n const idx = Number(n) - 1;\n return idx >= 0 && idx < resolvedValues.length ? resolvedValues[idx]! : match;\n });\n}\n\n/** Convert `$\\{{` escape sequences back to a literal `${{`. Render-time only. */\nexport function unescapeInlineTokens(body: string): string {\n return body.split(ESCAPE_SEQUENCE).join(ESCAPE_RESULT);\n}\n\n/**\n * Count the markers `%%1%%..%%N%%` in a body. Used by the post-receive\n * verification: each must appear exactly once in a translated body.\n */\nexport function countMarkerOccurrences(body: string, n: number): number {\n return body.split(placeholderMarker(n)).length - 1;\n}\n\n/**\n * Walk a body replacing every token span (valid OR malformed) and every escape\n * sequence via the provided callbacks. Used where the raw `${{` / `$\\{{` braces\n * must never reach a downstream MDX parser or preview renderer.\n */\nexport function replaceInlineSpans(\n body: string,\n opts: {\n token: (raw: string, inner: string) => string;\n escape: () => string;\n },\n): string {\n let out = \"\";\n let i = 0;\n while (i < body.length) {\n if (body.startsWith(ESCAPE_SEQUENCE, i)) {\n out += opts.escape();\n i += ESCAPE_SEQUENCE.length;\n continue;\n }\n if (body.startsWith(TOKEN_OPEN, i)) {\n const end = findTokenEnd(body, i + TOKEN_OPEN.length);\n if (end !== -1) {\n const raw = body.slice(i, end + 2);\n const inner = body.slice(i + TOKEN_OPEN.length, end);\n out += opts.token(raw, inner);\n i = end + 2;\n continue;\n }\n }\n out += body[i]!;\n i += 1;\n }\n return out;\n}\n\n/**\n * Neutralize inline tokens and escapes so a body can be handed to remark-mdx for\n * a structural parse check without the `${{`/`{{` braces producing false MDX\n * errors. Local to validation/preview: never used for hashing or storage.\n */\nexport function maskInlineTokensForMdx(body: string): string {\n return replaceInlineSpans(body, {\n token: () => \"inline\",\n escape: () => \"$\",\n });\n}\n","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 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 { documentLastModified, resolveCanonicalPathname } from \"../core/builtin-fields.js\";\nimport type { AllDocuments, ContentTypeConfig, ScribeConfig, ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { getRedirectSourceSlugs } from \"../redirects/build-redirects.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { joinBaseUrl } from \"./join-base-url.js\";\nimport type { GenerateSitemapOptions, SitemapEntry } from \"./types.js\";\n\nfunction shouldIncludeEnDoc(\n enDoc: ScribeDocument,\n enSlug: string,\n redirectSources: ReturnType<typeof getRedirectSourceSlugs>,\n contentTypeId: string,\n excludeNoindex: boolean,\n): boolean {\n if (redirectSources.aliasSlugs.has(enSlug)) return false;\n const outbound = redirectSources.outboundByType.get(contentTypeId);\n if (outbound?.has(enSlug)) return false;\n if (excludeNoindex && enDoc.noindex) return false;\n return true;\n}\n\ntype ResolvedSitemapOptions = GenerateSitemapOptions & {\n resolveUrl: (locale: string, pathname: string) => string | Promise<string>;\n};\n\nfunction resolveSitemapOptions(options: GenerateSitemapOptions): ResolvedSitemapOptions {\n return {\n ...options,\n resolveUrl:\n options.resolveUrl ??\n ((_locale, pathname) => joinBaseUrl(options.baseUrl, pathname)),\n };\n}\n\nasync function buildClusterEntry(\n type: ContentTypeConfig,\n enSlug: string,\n enDoc: ScribeDocument,\n allDocs: AllDocuments,\n config: ScribeConfig,\n options: ResolvedSitemapOptions,\n): Promise<SitemapEntry | null> {\n const { defaultLocale, locales } = config;\n const excludeNoindex = options.excludeNoindex !== false;\n const includeXDefault = options.includeXDefault !== false;\n const typeDefaults = options.typeDefaults?.[type.id];\n\n const pathnameFor = (doc: ScribeDocument): string =>\n options.resolvePathname?.(type, doc, defaultLocale) ??\n resolveCanonicalPathname(type, doc, defaultLocale);\n\n const alternates: Record<string, string> = {};\n\n for (const locale of locales) {\n const idx = allDocs.get(locale);\n if (!idx) continue;\n\n const doc =\n locale === defaultLocale\n ? idx.bySlug.get(enSlug)\n : idx.byEnSlug.get(enSlug);\n\n if (!doc) continue;\n if (excludeNoindex && doc.noindex) continue;\n\n const pathname = pathnameFor(doc);\n alternates[locale] = await options.resolveUrl(locale, pathname);\n }\n\n if (Object.keys(alternates).length === 0) return null;\n\n const mainUrl =\n alternates[defaultLocale] ?? alternates[Object.keys(alternates)[0]!]!;\n\n if (includeXDefault && alternates[defaultLocale]) {\n alternates[\"x-default\"] = alternates[defaultLocale];\n }\n\n const lastModified = documentLastModified(enDoc);\n\n return {\n url: mainUrl,\n ...(lastModified ? { lastModified } : {}),\n ...(typeDefaults?.changeFrequency\n ? { changeFrequency: typeDefaults.changeFrequency }\n : {}),\n ...(typeDefaults?.priority !== undefined ? { priority: typeDefaults.priority } : {}),\n alternates: { languages: alternates },\n };\n}\n\n/** Build sitemap entries with hreflang alternates for routable content types. */\nexport async function generateSitemap(\n project: ScribeProject,\n options: GenerateSitemapOptions,\n): Promise<SitemapEntry[]> {\n const resolvedOptions = resolveSitemapOptions(options);\n const { config } = project;\n const redirectSources = getRedirectSourceSlugs(project);\n const excludeNoindex = options.excludeNoindex !== false;\n\n const typeIds =\n options.contentTypes ??\n config.types.filter(isRoutableType).map((t) => t.id);\n\n const entries: SitemapEntry[] = [];\n\n for (const typeId of typeIds) {\n const runtime = project.getType(typeId);\n const type = runtime.config;\n if (!isRoutableType(type)) continue;\n\n const allDocs = runtime.load();\n const enIndex = allDocs.get(config.defaultLocale);\n if (!enIndex) continue;\n\n const processed = new Set<string>();\n\n for (const [enSlug, enDoc] of enIndex.bySlug) {\n if (processed.has(enSlug)) continue;\n processed.add(enSlug);\n\n if (\n !shouldIncludeEnDoc(enDoc, enSlug, redirectSources, typeId, excludeNoindex)\n ) {\n continue;\n }\n\n const entry = await buildClusterEntry(\n type,\n enSlug,\n enDoc,\n allDocs,\n config,\n resolvedOptions,\n );\n if (entry) entries.push(entry);\n }\n }\n\n return entries;\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { buildTranslationIndex } from \"../i18n/translation-index.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport {\n buildJsonRedirects,\n buildLegacyNoBlogPathRedirects,\n buildRedirectSourceSlugSet,\n} from \"./build-json-redirects.js\";\nimport {\n collectOutboundRedirectSourcesByType,\n collectRedirectSourceSlugs,\n loadAllTypeRedirects,\n} from \"./load-type-redirects.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nexport interface BuildRedirectsOptions {\n /** Locales that use a URL prefix (excludes default locale). Deprecated: derived from localeRouting when omitted. */\n prefixedLocales?: string[];\n}\n\nfunction buildRedirectTranslationIndex(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): Map<string, Map<string, string>> {\n const runtime = project.getType(typeId);\n const { config } = project;\n const merged = buildTranslationIndex(\n runtime.load(),\n config.locales,\n config.defaultLocale,\n );\n\n const db = openStore(project.config, \"readonly\");\n try {\n for (const alias of redirectSourceSlugs) {\n for (const row of listTranslationsForEnSlug(db, typeId, alias)) {\n const localeMap = merged.get(row.locale) ?? new Map<string, string>();\n if (!localeMap.has(alias)) {\n localeMap.set(alias, row.slug);\n }\n merged.set(row.locale, localeMap);\n }\n }\n } finally {\n db.close();\n }\n\n return merged;\n}\n\nfunction buildCrossLocaleSlugRedirects(\n project: ScribeProject,\n typeId: string,\n redirectSourceSlugs: Set<string>,\n): NextRedirectRule[] {\n const type = project.getType(typeId).config;\n if (!isRoutableType(type)) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const translationIndex = buildRedirectTranslationIndex(project, typeId, redirectSourceSlugs);\n const out: NextRedirectRule[] = [];\n const pathTemplate = type.path!;\n\n for (const [locale, localeMap] of translationIndex) {\n for (const [enSlug, translatedSlug] of localeMap) {\n if (enSlug === translatedSlug) continue;\n if (redirectSourceSlugs.has(enSlug)) continue;\n out.push({\n source: urlBuilder.resolvePath(pathTemplate, enSlug, locale),\n destination: urlBuilder.resolvePath(pathTemplate, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n\n return out;\n}\n\nfunction buildTypeRedirects(project: ScribeProject, typeId: string): NextRedirectRule[] {\n const loaded = loadAllTypeRedirects(project.config).find((file) => file.contentTypeId === typeId);\n const redirectSourceSlugs = new Set<string>();\n if (loaded) {\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n redirectSourceSlugs.add(from);\n }\n }\n }\n\n return [\n ...buildCrossLocaleSlugRedirects(project, typeId, redirectSourceSlugs),\n ];\n}\n\n/** Build Next.js redirect rules from `_redirects.json`, locale slug fixes, and legacy blog paths. */\nexport function buildAllContentRedirects(\n project: ScribeProject,\n _options: BuildRedirectsOptions = {},\n): NextRedirectRule[] {\n const redirectSourceKeys = buildRedirectSourceSlugSet(project);\n const out: NextRedirectRule[] = [\n ...buildJsonRedirects(project),\n ...buildLegacyNoBlogPathRedirects(project, redirectSourceKeys),\n ];\n\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n out.push(...buildTypeRedirects(project, type.id));\n }\n\n return out;\n}\n\nexport interface RedirectSourceSlugs {\n /** All inbound redirect source slugs — exclude from sitemap. */\n aliasSlugs: Set<string>;\n /** EN canonical slugs with outbound redirects — exclude from sitemap. */\n outboundByType: Map<string, Set<string>>;\n}\n\n/** Slugs excluded from sitemap (redirect sources). */\nexport function getRedirectSourceSlugs(project: ScribeProject): RedirectSourceSlugs {\n const loaded = loadAllTypeRedirects(project.config);\n const aliasSlugs = collectRedirectSourceSlugs(loaded);\n const outboundByType = collectOutboundRedirectSourcesByType(loaded);\n\n for (const type of project.config.types) {\n if (!outboundByType.has(type.id)) {\n outboundByType.set(type.id, new Set());\n }\n }\n\n return {\n aliasSlugs,\n outboundByType,\n };\n}\n\nexport { listEnSlugs };\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeConfig } from \"./types.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\n\nexport function enFileExists(\n config: ScribeConfig,\n type: ContentTypeConfig,\n enSlug: string,\n): boolean {\n const dir = path.join(config.rootDir, type.contentDir);\n return (\n fs.existsSync(path.join(dir, `${enSlug}.mdx`)) ||\n fs.existsSync(path.join(dir, `${enSlug}.md`))\n );\n}\n\nexport function sqliteHasTranslations(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n): boolean {\n return listTranslationsForEnSlug(db, contentTypeId, enSlug).length > 0;\n}\n\nexport function isAliasKnown(\n config: ScribeConfig,\n type: ContentTypeConfig,\n aliasEnSlug: string,\n db: Database.Database,\n): boolean {\n return enFileExists(config, type, aliasEnSlug) || sqliteHasTranslations(db, type.id, aliasEnSlug);\n}\n\nexport function listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n","import type { AllDocuments } from \"../core/types.js\";\n\n/**\n * Internal: locale → (en_slug → locale slug) map for all non-default locales.\n * Consumed by `staticParams()`, `alternates()`, and redirect expansion.\n */\nexport function buildTranslationIndex(\n allDocs: AllDocuments,\n locales: readonly string[],\n defaultLocale: string,\n): Map<string, Map<string, string>> {\n const index = new Map<string, Map<string, string>>();\n for (const locale of locales) {\n if (locale === defaultLocale) continue;\n const idx = allDocs.get(locale);\n if (!idx) continue;\n const localeMap = new Map<string, string>();\n for (const [enSlug, doc] of idx.byEnSlug) {\n localeMap.set(enSlug, doc.slug);\n }\n index.set(locale, localeMap);\n }\n return index;\n}\n","import type Database from \"better-sqlite3\";\nimport type { ContentTypeConfig, ScribeProject } from \"../core/types.js\";\nimport { listEnSlugs } from \"../core/alias-helpers.js\";\nimport { createUrlBuilder, isRoutableType } from \"../i18n/build-url.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { listTranslationsForEnSlug } from \"../storage/translations.js\";\nimport { loadTypeRedirectsFile } from \"./load-type-redirects.js\";\nimport type { ParsedRedirectEntry } from \"./redirect-schema.js\";\nimport type { NextRedirectRule } from \"./types.js\";\n\nfunction localizedSlug(\n db: Database.Database,\n contentTypeId: string,\n enSlug: string,\n locale: string,\n defaultLocale: string,\n): string {\n if (locale === defaultLocale) return enSlug;\n const row = listTranslationsForEnSlug(db, contentTypeId, enSlug).find(\n (translation) => translation.locale === locale,\n );\n return row?.slug ?? enSlug;\n}\n\nfunction resolveSlugTargetDestination(\n project: ScribeProject,\n db: Database.Database,\n targetType: ContentTypeConfig,\n toSlug: string,\n locale: string,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): string {\n const targetSlug = localizedSlug(\n db,\n targetType.id,\n toSlug,\n locale,\n project.config.defaultLocale,\n );\n return urlBuilder.resolvePath(targetType.path!, targetSlug, locale);\n}\n\nfunction buildEntryRules(\n project: ScribeProject,\n sourceType: ContentTypeConfig,\n entry: ParsedRedirectEntry,\n db: Database.Database,\n urlBuilder: ReturnType<typeof createUrlBuilder>,\n): NextRedirectRule[] {\n if (!isRoutableType(sourceType)) return [];\n\n const out: NextRedirectRule[] = [];\n const { defaultLocale } = project.config;\n\n let targetType: ContentTypeConfig = sourceType;\n if (entry.kind === \"cross-type\") {\n const resolvedTarget = project.config.types.find((type) => type.id === entry.toType);\n if (!resolvedTarget?.path) return out;\n targetType = resolvedTarget;\n }\n\n for (const fromEnSlug of entry.fromSlugs) {\n const locales = project.config.locales;\n for (const locale of locales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n const source = urlBuilder.resolvePath(sourceType.path!, fromSlug, locale);\n\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n if (source === destination) continue;\n\n out.push({\n source,\n destination,\n permanent: entry.permanent,\n });\n }\n\n if (sourceType.id === \"blog\") {\n let destinationEn: string;\n if (entry.kind === \"anywhere\") {\n destinationEn = entry.toUrl!;\n } else {\n destinationEn = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n defaultLocale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${fromEnSlug}`,\n destination: destinationEn,\n permanent: entry.permanent,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const fromSlug = localizedSlug(db, sourceType.id, fromEnSlug, locale, defaultLocale);\n let destination: string;\n if (entry.kind === \"anywhere\") {\n destination = entry.toUrl!;\n } else {\n destination = resolveSlugTargetDestination(\n project,\n db,\n entry.kind === \"cross-type\" ? targetType : sourceType,\n entry.toSlug!,\n locale,\n urlBuilder,\n );\n }\n\n out.push({\n source: `/${locale}/${fromSlug}`,\n destination,\n permanent: entry.permanent,\n });\n\n out.push({\n source: `/${locale}/${fromEnSlug}`,\n destination,\n permanent: entry.permanent,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function buildJsonRedirects(project: ScribeProject): NextRedirectRule[] {\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const type of project.config.types) {\n if (!isRoutableType(type)) continue;\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n\n for (const entry of loaded.entries) {\n out.push(...buildEntryRules(project, type, entry, db, urlBuilder));\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n\nexport function buildRedirectSourceSlugSet(project: ScribeProject): Set<string> {\n const out = new Set<string>();\n for (const type of project.config.types) {\n const loaded = loadTypeRedirectsFile(project.config, type);\n if (!loaded) continue;\n for (const entry of loaded.entries) {\n for (const from of entry.fromSlugs) {\n out.add(`${type.id}:${from}`);\n }\n }\n }\n return out;\n}\n\nexport function buildLegacyNoBlogPathRedirects(\n project: ScribeProject,\n redirectSourceKeys: Set<string>,\n): NextRedirectRule[] {\n const blogType = project.config.types.find((type) => type.id === \"blog\" && type.path);\n if (!blogType?.path) return [];\n\n const urlBuilder = createUrlBuilder(project.config);\n const db = openStore(project.config, \"readonly\");\n const out: NextRedirectRule[] = [];\n\n try {\n for (const enSlug of listEnSlugs(project.config.rootDir, blogType.contentDir)) {\n if (redirectSourceKeys.has(`blog:${enSlug}`)) continue;\n\n out.push({\n source: `/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, enSlug, project.config.defaultLocale),\n permanent: true,\n });\n\n for (const locale of urlBuilder.prefixedLocales) {\n const translatedSlug = localizedSlug(\n db,\n blogType.id,\n enSlug,\n locale,\n project.config.defaultLocale,\n );\n out.push({\n source: `/${locale}/${enSlug}`,\n destination: urlBuilder.resolvePath(blogType.path, translatedSlug, locale),\n permanent: true,\n });\n }\n }\n } finally {\n db.close();\n }\n\n return out;\n}\n","import 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 { 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","/** Join site origin and pathname without double slashes. */\nexport function joinBaseUrl(baseUrl: string, pathname: string): string {\n const origin = baseUrl.replace(/\\/$/, \"\");\n const path = pathname.startsWith(\"/\") ? pathname : `/${pathname}`;\n return `${origin}${path}`;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createJiti } from \"jiti\";\nimport type { ScribeConfig, ScribeConfigInput } from \"../core/types.js\";\nimport { resolveConfig } from \"./resolve-config.js\";\n\nexport interface LoadConfigOptions {\n configPath?: string;\n cwd?: string;\n}\n\n/** Find scribe.config.ts/mts/js in a directory. */\nexport function findConfigPath(cwd: string): string | null {\n const candidates = [\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.ts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.mts\"),\n path.join(/* turbopackIgnore: true */ cwd, \"scribe.config.js\"),\n ];\n for (const candidate of candidates) {\n if (fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate;\n }\n }\n return null;\n}\n\n/** Load and resolve scribe.config.ts synchronously (CLI). */\nexport function loadConfigSync(options: LoadConfigOptions = {}): ScribeConfig {\n const cwd = options.cwd ?? /* turbopackIgnore: true */ process.cwd();\n const configPath = options.configPath ?? findConfigPath(cwd);\n if (!configPath) {\n throw new Error(`No scribe.config.ts found in ${cwd} (pass --config)`);\n }\n\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n moduleCache: false,\n });\n\n const loaded = jiti(configPath) as ScribeConfigInput | { default: ScribeConfigInput };\n const config = \"default\" in loaded ? loaded.default : loaded;\n if (!config?.rootDir) {\n throw new Error(`Invalid scribe config at ${configPath}: missing rootDir`);\n }\n return resolveConfig(config, path.dirname(configPath));\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport 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 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","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","/** 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 fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { isRoutableType } from \"../i18n/build-url.js\";\nimport { extractInlineTokens } from \"../inline/tokens.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { isPublishableContentFile } from \"../loader/normalize-en.js\";\nimport { buildEnSlugIndex } from \"./validate-relations.js\";\nimport type { ValidateIssue } from \"./validate-project.js\";\n\nfunction listEnSlugs(rootDir: string, contentDir: string): string[] {\n const dir = path.join(rootDir, contentDir);\n if (!fs.existsSync(dir)) return [];\n return fs\n .readdirSync(dir)\n .filter(isPublishableContentFile)\n .map((f) => f.replace(/\\.(md|mdx)$/, \"\"));\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every((v) => typeof v === \"string\");\n}\n\nfunction assetFileExists(config: ScribeConfig, webPath: string): boolean {\n const assetsPath = config.assetsPath;\n if (!assetsPath) return true; // no asset system configured: cannot check\n return fs.existsSync(path.join(assetsPath, webPath.replace(/^\\//, \"\")));\n}\n\n/**\n * Validate `${{...}}` inline tokens in EN document bodies. Entry-level issues so\n * the studio badges pick them up automatically. Covers malformed syntax and each\n * token kind's referential integrity (relation target/slug, asset file, var\n * key). Static tokens are always valid.\n */\nexport function validateInlineTokens(config: ScribeConfig): ValidateIssue[] {\n const issues: ValidateIssue[] = [];\n const slugIndex = buildEnSlugIndex(config);\n const typeIds = new Set(config.types.map((t) => t.id));\n const typeById = new Map(config.types.map((t) => [t.id, t]));\n\n for (const type of config.types) {\n for (const enSlug of listEnSlugs(config.rootDir, type.contentDir)) {\n const doc = readEnDocument(config, type, enSlug);\n if (!doc) continue;\n\n const { tokens, malformed } = extractInlineTokens(doc.content);\n\n for (const bad of malformed) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Malformed inline token (${bad.reason}): ${bad.raw}`,\n });\n }\n\n let varsReported = false;\n const vars = (doc.frontmatter as Record<string, unknown>).vars;\n\n for (const token of tokens) {\n switch (token.kind) {\n case \"static\":\n break;\n\n case \"relation\": {\n if (!typeIds.has(token.targetTypeId)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token targets unknown type \"${token.targetTypeId}\"`,\n });\n break;\n }\n const targetSlugs = slugIndex.get(token.targetTypeId) ?? new Set<string>();\n if (!targetSlugs.has(token.enSlug)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token references \"${token.enSlug}\", but no ${token.targetTypeId} doc has that slug`,\n });\n break;\n }\n if (token.mode === \"url\") {\n const targetType = typeById.get(token.targetTypeId)!;\n if (!isRoutableType(targetType)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline relation token resolves a URL for \"${token.targetTypeId}\", which has no path template (not routable)`,\n });\n }\n }\n break;\n }\n\n case \"asset\": {\n if (!assetFileExists(config, token.webPath)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline asset token references ${token.webPath}, which is missing on disk`,\n });\n }\n break;\n }\n\n case \"var\": {\n if (vars !== undefined && !isStringRecord(vars)) {\n if (!varsReported) {\n varsReported = true;\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"vars\",\n message: `Frontmatter \"vars\" must be a string-to-string map`,\n });\n }\n break;\n }\n if (!isStringRecord(vars) || !(token.key in vars)) {\n issues.push({\n level: \"error\",\n contentType: type.id,\n enSlug,\n field: \"body\",\n message: `Inline var token references \"${token.key}\", absent from this document's vars map`,\n });\n }\n break;\n }\n }\n }\n }\n }\n\n return issues;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport 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 { 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 { ScribeConfig } from \"../core/types.js\";\nimport { listBatchItems, type BatchJobRow } from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n failedResultForItem,\n planBatchJobs,\n pollAndIngestBatchJobs,\n readPendingBatchWork,\n submitBatchJobPlan,\n} from \"./batch-worklist.js\";\nimport { translatePageWithGemini } from \"./gemini-client.js\";\nimport { normalizeGeminiDisplayName, resolveGeminiModelId } from \"./gemini-models.js\";\nimport {\n baseForItem,\n displayModelFor,\n finalizeTranslation,\n prepareTranslation,\n summarizeResults,\n translationItemKey,\n type PreparedTranslation,\n type PrepareOutcome,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport {\n finalizeTranslation,\n type PreparedTranslation,\n type TranslateMode,\n type TranslatePageResult,\n type TranslateProgressEvent,\n type TranslateWorklistTotals,\n};\n\nasync function runPool<T>(\n items: T[],\n concurrency: number,\n worker: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n if (items.length === 0) return;\n let nextIndex = 0;\n const runners = Array.from({ length: Math.min(concurrency, items.length) }, async () => {\n while (nextIndex < items.length) {\n const index = nextIndex++;\n await worker(items[index]!, index);\n }\n });\n await Promise.all(runners);\n}\n\nfunction labelForItem(item: TranslationWorkItem): string {\n return `${item.contentType}/${item.enSlug}@${item.locale}`;\n}\n\n/**\n * Build the retry worklist from the failed results of a completed pass. Each\n * retry item carries the original item's EN hash plus the verbatim error from\n * the failed attempt, so the retry prompt can ask the model to fix exactly those\n * validation issues. Items whose failure has no original work item (e.g. resumed\n * batch items from a prior run) are rebuilt from the result alone; `force` is set\n * so a freshly-upserted-then-rejected slot is not treated as up to date.\n */\nexport function buildRetryWorklist(\n failed: TranslatePageResult[],\n originalByKey: Map<string, TranslationWorkItem>,\n): TranslationWorkItem[] {\n return failed.map((result) => {\n const key = translationItemKey(result);\n const original = originalByKey.get(key);\n return {\n contentType: result.contentType,\n enSlug: result.enSlug,\n locale: result.locale,\n reason: original?.reason ?? \"missing\",\n currentEnHash: original?.currentEnHash ?? \"\",\n storedEnHash: original?.storedEnHash,\n previousError: result.error ?? \"Translation failed\",\n };\n });\n}\n\n/**\n * Re-translate a set of already-failed items exactly once, appending each item's\n * verbatim validation error to the prompt suffix. Batch runs submit the retry\n * items as one additional batch job (batch-priced); direct runs retry with a\n * direct pool honoring `concurrency`. Pending jobs from prior runs are NOT\n * touched here — this only covers the items that failed in the just-finished\n * pass. Returns one result per retry item (translated or newly failed); these\n * items are never retried a second time within the run.\n */\nexport async function runRetryRound(\n config: ScribeConfig,\n retryItems: TranslationWorkItem[],\n options: {\n model?: string;\n force?: boolean;\n concurrency: number;\n mode: TranslateMode;\n onResult: (result: TranslatePageResult) => void;\n onProgress?: (event: TranslateProgressEvent) => void;\n /** Injectable single-item translator (tests); defaults to translatePage. */\n translateOne?: (\n item: TranslationWorkItem,\n ) => Promise<TranslatePageResult>;\n },\n): Promise<void> {\n const startedAt = Date.now();\n // force: the failed pass may have left nothing stored, but if a stale row\n // exists we must still re-translate rather than skip as fresh.\n const translateOne =\n options.translateOne ??\n ((item: TranslationWorkItem) =>\n translatePage(config, item, { model: options.model, force: true }));\n\n if (options.mode === \"direct\") {\n const active = new Set<string>();\n await runPool(retryItems, options.concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translateOne(item);\n active.delete(label);\n options.onResult(result);\n });\n return;\n }\n\n // Batch retry: prepare, plan one job group, submit, poll+ingest — the same\n // machinery as the main batch pass but scoped to just the retry items and\n // without adopting any pending jobs.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of retryItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, { model: options.model, force: true }, itemStartedAt);\n if (outcome.status === \"done\") {\n options.onResult(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n options.onResult(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: planIndex,\n jobCount: plans.length,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n options.onResult(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll = submitted.filter((row): row is BatchJobRow => row !== undefined);\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount: jobsToPoll.length,\n onProgress: options.onProgress,\n onResult: options.onResult,\n });\n }\n}\n\n/**\n * Translate one locale page via a direct (interactive) Gemini call and upsert\n * into SQLite. Used by the studio server and other single-page callers; the\n * worklist path defaults to the Batch API instead.\n */\nexport async function translatePage(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; dryRun?: boolean; force?: boolean } = {},\n): Promise<TranslatePageResult> {\n const startedAt = Date.now();\n\n let outcome: PrepareOutcome;\n try {\n outcome = prepareTranslation(config, item, options, startedAt);\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n if (outcome.status === \"done\") return outcome.result;\n const prepared = outcome.prepared;\n\n if (options.dryRun) {\n return {\n ...baseForItem(item),\n skipped: false,\n model: prepared.model,\n durationMs: Date.now() - startedAt,\n };\n }\n\n try {\n const result = await translatePageWithGemini({\n prompt: prepared.prompt,\n model: prepared.model,\n responseSchema: prepared.responseSchema,\n });\n return finalizeTranslation(\n config,\n prepared,\n { model: result.model, parsed: result.parsed, usage: result.usage },\n { costMode: \"interactive\", startedAt },\n );\n } catch (error) {\n return failedResultForItem(item, error, startedAt);\n }\n}\n\ninterface ResultCollector {\n emit: (result: TranslatePageResult) => void;\n assemble: () => TranslatePageResult[];\n}\n\n/**\n * Route results into their input worklist slot (by item identity) so output\n * order matches input; results with no matching input item (resumed jobs from\n * a previous run) are appended after.\n */\nfunction createResultCollector(\n items: TranslationWorkItem[],\n onProgress?: (event: TranslateProgressEvent) => void,\n): ResultCollector {\n const slotByKey = new Map<string, number>();\n items.forEach((item, index) => slotByKey.set(translationItemKey(item), index));\n const slots: (TranslatePageResult | undefined)[] = new Array(items.length);\n const extras: TranslatePageResult[] = [];\n\n return {\n emit(result) {\n const slot = slotByKey.get(translationItemKey(result));\n if (slot !== undefined && slots[slot] === undefined) slots[slot] = result;\n else extras.push(result);\n onProgress?.({ type: \"item-done\", result });\n },\n assemble() {\n return [\n ...slots.filter((result): result is TranslatePageResult => result !== undefined),\n ...extras,\n ];\n },\n };\n}\n\n/**\n * Translate a batch of worklist items. By default the whole worklist goes\n * through the Gemini Batch API (50% token pricing): jobs are planned upfront\n * (grouped by model, chunked by size), submitted together, persisted for\n * resumability, then polled until every job lands. `mode: \"direct\"` restores\n * the interactive per-page pool (where `concurrency` applies). Any pending\n * jobs from a previous interrupted run are polled and ingested alongside the\n * new work, and their in-flight items are excluded from resubmission.\n */\nexport async function translateWorklist(\n config: ScribeConfig,\n items: TranslationWorkItem[],\n options: {\n model?: string;\n dryRun?: boolean;\n force?: boolean;\n concurrency?: number;\n mode?: TranslateMode;\n onProgress?: (event: TranslateProgressEvent) => void;\n } = {},\n): Promise<TranslatePageResult[]> {\n const mode: TranslateMode = options.mode ?? \"batch\";\n const concurrency = Math.max(1, options.concurrency ?? 3);\n const startedAt = Date.now();\n\n // Dry run: report per-item work without touching the API or pending jobs.\n if (options.dryRun) {\n options.onProgress?.({\n type: \"start\",\n total: items.length,\n concurrency,\n dryRun: true,\n model: options.model,\n mode,\n });\n const results = items.map((item) => {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n return outcome.status === \"done\"\n ? outcome.result\n : {\n ...baseForItem(item),\n skipped: false,\n model: outcome.prepared.model,\n durationMs: Date.now() - itemStartedAt,\n };\n } catch (error) {\n return failedResultForItem(item, error, itemStartedAt);\n }\n });\n for (const result of results) options.onProgress?.({ type: \"item-done\", result });\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n }\n\n // Pending jobs from a previous run are polled alongside the new work; their\n // in-flight items are excluded from resubmission (their results arrive when\n // the pending job is ingested).\n const pending = readPendingBatchWork(config);\n const inputKeys = new Set(items.map((item) => translationItemKey(item)));\n const resumedExtraCount = pending.pendingItems.filter(\n (item) => !inputKeys.has(translationItemKey(item)),\n ).length;\n\n options.onProgress?.({\n type: \"start\",\n total: items.length + resumedExtraCount,\n concurrency,\n dryRun: false,\n model: options.model,\n mode,\n });\n\n const collector = createResultCollector(items, options.onProgress);\n const workItems = items.filter((item) => !pending.inFlightKeys.has(translationItemKey(item)));\n\n if (mode === \"direct\") {\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, pending.jobs.length, options.onProgress);\n const active = new Set<string>();\n await Promise.all([\n runPool(workItems, concurrency, async (item) => {\n const label = labelForItem(item);\n active.add(label);\n options.onProgress?.({ type: \"item-start\", item, active: [...active] });\n const result = await translatePage(config, item, options);\n active.delete(label);\n collector.emit(result);\n }),\n pending.jobs.length > 0\n ? pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: collector.emit,\n })\n : Promise.resolve(),\n ]);\n } else {\n // Prepare every remaining item; fresh pages skip, broken items fail.\n const entries: Array<{ apiModel: string; prompt: string; prepared: PreparedTranslation }> = [];\n for (const item of workItems) {\n const itemStartedAt = Date.now();\n try {\n const outcome = prepareTranslation(config, item, options, itemStartedAt);\n if (outcome.status === \"done\") {\n collector.emit(outcome.result);\n } else {\n entries.push({\n apiModel: resolveGeminiModelId(displayModelFor(outcome.prepared)),\n prompt: outcome.prepared.prompt,\n prepared: outcome.prepared,\n });\n }\n } catch (error) {\n collector.emit(failedResultForItem(item, error, itemStartedAt));\n }\n }\n\n const plans = planBatchJobs(entries);\n const jobCount = pending.jobs.length + plans.length;\n const pendingCounts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, pendingCounts, jobCount, options.onProgress);\n\n // Submit every job upfront (concurrently), persisting each as soon as its\n // create call returns — Ctrl+C during polling loses nothing.\n const submitted = await Promise.all(\n plans.map(async (plan, planIndex) => {\n try {\n return await submitBatchJobPlan(config, {\n plan,\n displayModel: normalizeGeminiDisplayName(plan.apiModel),\n jobIndex: pending.jobs.length + planIndex,\n jobCount,\n onProgress: options.onProgress,\n });\n } catch (error) {\n for (const entry of plan.entries) {\n collector.emit(failedResultForItem(entry.prepared.item, error, startedAt));\n }\n return undefined;\n }\n }),\n );\n\n const jobsToPoll: BatchJobRow[] = [\n ...pending.jobs,\n ...submitted.filter((row): row is BatchJobRow => row !== undefined),\n ];\n if (jobsToPoll.length > 0) {\n await pollAndIngestBatchJobs(config, jobsToPoll, {\n jobCount,\n onProgress: options.onProgress,\n onResult: collector.emit,\n });\n }\n }\n\n const mainResults = collector.assemble();\n\n // One-shot retry round: re-translate every validation failure once, feeding\n // the verbatim error back into the prompt suffix. Items still failing after\n // this are not retried again in the same run.\n const failed = mainResults.filter((result) => result.failed);\n if (failed.length === 0) {\n const totals = summarizeResults(mainResults, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results: mainResults, totals });\n return mainResults;\n }\n\n options.onProgress?.({ type: \"retry-start\", failed });\n\n const originalByKey = new Map<string, TranslationWorkItem>(\n items.map((item) => [translationItemKey(item), item]),\n );\n const retryItems = buildRetryWorklist(failed, originalByKey);\n const retryByKey = new Map<string, TranslatePageResult>();\n await runRetryRound(config, retryItems, {\n model: options.model,\n force: options.force,\n concurrency,\n mode,\n onProgress: options.onProgress,\n onResult: (result) => {\n retryByKey.set(translationItemKey(result), result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n // Merge: replace each failed slot with its retry outcome (translated or newly\n // failed). Results with no retry outcome (should not happen) keep the original.\n const results = mainResults.map((result) => {\n if (!result.failed) return result;\n return retryByKey.get(translationItemKey(result)) ?? result;\n });\n const retriedTranslated = failed.filter((original) => {\n const retried = retryByKey.get(translationItemKey(original));\n return retried !== undefined && !retried.failed && !retried.skipped;\n }).length;\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals, retriedTranslated });\n return results;\n}\n\nfunction countPendingItems(config: ScribeConfig, jobs: BatchJobRow[]): Map<number, number> {\n if (jobs.length === 0) return new Map();\n const db = openStore(config, \"readonly\");\n const counts = new Map<number, number>();\n for (const job of jobs) {\n counts.set(job.id, listBatchItems(db, job.id).filter((i) => i.status === \"pending\").length);\n }\n db.close();\n return counts;\n}\n\nfunction emitResumedJobs(\n jobs: BatchJobRow[],\n counts: Map<number, number>,\n jobCount: number,\n onProgress?: (event: TranslateProgressEvent) => void,\n): void {\n jobs.forEach((job, jobIndex) => {\n onProgress?.({\n type: \"batch-submitted\",\n name: job.job_name,\n count: counts.get(job.id) ?? 0,\n model: job.display_model,\n jobIndex,\n jobCount,\n resumed: true,\n createdAt: job.created_at,\n });\n });\n}\n\n/**\n * Poll and ingest pending batch jobs from a previous run without submitting\n * anything new (`scribe translate --resume`). Returns null when there is\n * nothing to resume.\n */\nexport async function resumeTranslationJobs(\n config: ScribeConfig,\n options: { onProgress?: (event: TranslateProgressEvent) => void } = {},\n): Promise<TranslatePageResult[] | null> {\n const startedAt = Date.now();\n const pending = readPendingBatchWork(config);\n if (pending.jobs.length === 0) return null;\n\n options.onProgress?.({\n type: \"start\",\n total: pending.pendingItems.length,\n concurrency: 1,\n dryRun: false,\n mode: \"batch\",\n });\n const counts = countPendingItems(config, pending.jobs);\n emitResumedJobs(pending.jobs, counts, pending.jobs.length, options.onProgress);\n\n const results: TranslatePageResult[] = [];\n await pollAndIngestBatchJobs(config, pending.jobs, {\n onProgress: options.onProgress,\n onResult: (result) => {\n results.push(result);\n options.onProgress?.({ type: \"item-done\", result });\n },\n });\n\n const totals = summarizeResults(results, Date.now() - startedAt);\n options.onProgress?.({ type: \"done\", results, totals });\n return results;\n}\n","import type Database from \"better-sqlite3\";\n\nexport type BatchItemStatus = \"pending\" | \"done\" | \"failed\" | \"stale-skipped\";\n\nexport interface BatchJobRow {\n id: number;\n job_name: string;\n model: string;\n display_model: string;\n created_at: string;\n state: string;\n completed_at: string | null;\n}\n\nexport interface BatchItemRow {\n job_id: number;\n request_index: number;\n content_type: string;\n en_slug: string;\n locale: string;\n en_hash: string;\n snapshot_id: number;\n status: BatchItemStatus;\n error: string | null;\n}\n\nexport interface BatchJobInput {\n jobName: string;\n model: string;\n displayModel: string;\n state: string;\n createdAt: string;\n}\n\nexport interface BatchItemInput {\n requestIndex: number;\n contentType: string;\n enSlug: string;\n locale: string;\n enHash: string;\n snapshotId: number;\n}\n\nexport function insertBatchJob(db: Database.Database, input: BatchJobInput): number {\n const info = db\n .prepare(\n `INSERT INTO translation_batch_jobs (job_name, model, display_model, created_at, state)\n VALUES (?, ?, ?, ?, ?)`,\n )\n .run(input.jobName, input.model, input.displayModel, input.createdAt, input.state);\n return Number(info.lastInsertRowid);\n}\n\nexport function insertBatchItems(\n db: Database.Database,\n jobId: number,\n items: BatchItemInput[],\n): void {\n const stmt = db.prepare(\n `INSERT INTO translation_batch_items (\n job_id, request_index, content_type, en_slug, locale, en_hash, snapshot_id, status\n ) VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')`,\n );\n for (const item of items) {\n stmt.run(\n jobId,\n item.requestIndex,\n item.contentType,\n item.enSlug,\n item.locale,\n item.enHash,\n item.snapshotId,\n );\n }\n}\n\n/** Jobs not yet fully ingested (no completed_at), oldest first. */\nexport function listPendingBatchJobs(db: Database.Database): BatchJobRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_jobs WHERE completed_at IS NULL ORDER BY id`)\n .all() as BatchJobRow[];\n}\n\nexport function listBatchItems(db: Database.Database, jobId: number): BatchItemRow[] {\n return db\n .prepare(`SELECT * FROM translation_batch_items WHERE job_id = ? ORDER BY request_index`)\n .all(jobId) as BatchItemRow[];\n}\n\n/** Pending items across all non-completed jobs (i.e. requests still in flight). */\nexport function listPendingBatchItems(db: Database.Database): BatchItemRow[] {\n return db\n .prepare(\n `SELECT i.* FROM translation_batch_items i\n JOIN translation_batch_jobs j ON j.id = i.job_id\n WHERE j.completed_at IS NULL AND i.status = 'pending'\n ORDER BY i.job_id, i.request_index`,\n )\n .all() as BatchItemRow[];\n}\n\n/**\n * Atomically claim a terminal job for ingestion by stamping completed_at.\n * Returns false when another process already completed it — concurrent scribe\n * runs adopt each other's pending jobs, so two pollers can reach the same\n * terminal job; only the one whose claim succeeds may ingest its results.\n */\nexport function claimBatchJobCompletion(\n db: Database.Database,\n jobId: number,\n state: string,\n completedAt: string,\n): boolean {\n const info = db\n .prepare(\n `UPDATE translation_batch_jobs SET state = ?, completed_at = ?\n WHERE id = ? AND completed_at IS NULL`,\n )\n .run(state, completedAt, jobId);\n return info.changes > 0;\n}\n\nexport function updateBatchItemStatus(\n db: Database.Database,\n jobId: number,\n requestIndex: number,\n status: BatchItemStatus,\n error?: string,\n): void {\n db.prepare(\n `UPDATE translation_batch_items SET status = ?, error = ? WHERE job_id = ? AND request_index = ?`,\n ).run(status, error ?? null, jobId, requestIndex);\n}\n","import type { BatchJob } from \"@google/genai\";\nimport type { ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport {\n claimBatchJobCompletion,\n insertBatchItems,\n insertBatchJob,\n listBatchItems,\n listPendingBatchItems,\n listPendingBatchJobs,\n updateBatchItemStatus,\n type BatchItemRow,\n type BatchJobRow,\n} from \"../storage/batch-jobs.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getEnSnapshot, getTranslation } from \"../storage/translations.js\";\nimport {\n createGeminiBatchJob,\n getGeminiBatchJob,\n isSuccessfulBatchState,\n isTerminalBatchState,\n normalizeBatchState,\n textFromBatchResponse,\n} from \"./gemini-batch.js\";\nimport { buildGeminiRequestConfig, parseGeminiResponse, usageFromResponse } from \"./gemini-client.js\";\nimport {\n baseForItem,\n finalizeTranslation,\n formatTranslateError,\n translationItemKey,\n type PreparedTranslation,\n type TranslatePageResult,\n type TranslateProgressEvent,\n} from \"./translate-core.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\n// The Gemini Batch API caps inline (non-file) submissions at 20MB of request\n// payload per job; the SDK types expose no explicit request-count limit. Stay\n// conservative: chunk at 100 requests or ~15MB of prompt text per job,\n// whichever comes first, leaving headroom for JSON envelope + schemas.\nexport const MAX_REQUESTS_PER_JOB = 100;\nexport const MAX_PROMPT_BYTES_PER_JOB = 15 * 1024 * 1024;\n\nconst INITIAL_POLL_MS = 5_000;\nconst MAX_POLL_MS = 30_000;\nconst POLL_BACKOFF_FACTOR = 1.5;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport interface BatchPlanEntry {\n apiModel: string;\n prompt: string;\n}\n\nexport interface BatchJobPlan<T extends BatchPlanEntry> {\n apiModel: string;\n entries: T[];\n}\n\n/**\n * Group entries by API model, then chunk each group by request count and total\n * prompt bytes so every plan fits in one inline batch job.\n */\nexport function planBatchJobs<T extends BatchPlanEntry>(entries: T[]): BatchJobPlan<T>[] {\n const byModel = new Map<string, T[]>();\n for (const entry of entries) {\n const group = byModel.get(entry.apiModel);\n if (group) group.push(entry);\n else byModel.set(entry.apiModel, [entry]);\n }\n\n const plans: BatchJobPlan<T>[] = [];\n for (const [apiModel, group] of byModel) {\n let current: T[] = [];\n let currentBytes = 0;\n for (const entry of group) {\n const size = Buffer.byteLength(entry.prompt, \"utf8\");\n if (\n current.length > 0 &&\n (current.length >= MAX_REQUESTS_PER_JOB || currentBytes + size > MAX_PROMPT_BYTES_PER_JOB)\n ) {\n plans.push({ apiModel, entries: current });\n current = [];\n currentBytes = 0;\n }\n current.push(entry);\n currentBytes += size;\n }\n if (current.length > 0) plans.push({ apiModel, entries: current });\n }\n return plans;\n}\n\nexport interface PendingBatchWork {\n jobs: BatchJobRow[];\n /** translationItemKey() of every request still in flight. */\n inFlightKeys: Set<string>;\n pendingItems: BatchItemRow[];\n}\n\n/**\n * Load non-completed batch jobs and their in-flight items from the store.\n * Opens the store readwrite so migrations run before the new tables are read.\n */\nexport function readPendingBatchWork(config: ScribeConfig): PendingBatchWork {\n const db = openStore(config, \"readwrite\");\n const jobs = listPendingBatchJobs(db);\n const pendingItems = listPendingBatchItems(db);\n db.close();\n const inFlightKeys = new Set(pendingItems.map((item) => translationItemKey(item)));\n return { jobs, inFlightKeys, pendingItems };\n}\n\nexport interface SubmitPlanInput<T extends BatchPlanEntry & { prepared: PreparedTranslation }> {\n plan: BatchJobPlan<T>;\n displayModel: string;\n jobIndex: number;\n jobCount: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n}\n\n/**\n * Submit one planned job and persist it (job row + item rows + EN snapshots)\n * immediately, before any polling starts, so an interrupt loses nothing.\n */\nexport async function submitBatchJobPlan<\n T extends BatchPlanEntry & { prepared: PreparedTranslation },\n>(config: ScribeConfig, input: SubmitPlanInput<T>): Promise<BatchJobRow> {\n const { plan, displayModel, jobIndex, jobCount } = input;\n const job = await createGeminiBatchJob({\n model: plan.apiModel,\n requests: plan.entries.map(({ prepared }) => ({\n contents: prepared.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: plan.apiModel,\n responseSchema: prepared.responseSchema,\n }),\n })),\n displayName: `scribe-translate-${new Date().toISOString().replace(/[:.]/g, \"-\")}-${jobIndex + 1}`,\n });\n\n const createdAt = new Date().toISOString();\n const db = openStore(config, \"readwrite\");\n const jobId = insertBatchJob(db, {\n jobName: job.name!,\n model: plan.apiModel,\n displayModel,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n createdAt,\n });\n insertBatchItems(\n db,\n jobId,\n plan.entries.map(({ prepared }, requestIndex) => ({\n requestIndex,\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n locale: prepared.item.locale,\n enHash: prepared.currentEnHash,\n // Snapshot the EN source now so ingestion after a resume does not depend\n // on the EN files still matching (or existing) on disk.\n snapshotId: recordEnSnapshot(\n config,\n {\n contentType: prepared.item.contentType,\n enSlug: prepared.item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: prepared.payload.frontmatter,\n body: prepared.payload.body,\n },\n db,\n ),\n })),\n );\n const row: BatchJobRow = {\n id: jobId,\n job_name: job.name!,\n model: plan.apiModel,\n display_model: displayModel,\n created_at: createdAt,\n state: String(job.state ?? \"JOB_STATE_PENDING\"),\n completed_at: null,\n };\n db.close();\n\n input.onProgress?.({\n type: \"batch-submitted\",\n name: job.name!,\n count: plan.entries.length,\n model: displayModel,\n jobIndex,\n jobCount,\n createdAt,\n });\n return row;\n}\n\n/** The subset of a Gemini BatchJob that ingestion needs (test-friendly). */\nexport interface BatchJobResultLike {\n state?: string;\n error?: { message?: string };\n dest?: { inlinedResponses?: Array<{ response?: unknown; error?: { message?: string } }> };\n}\n\n/**\n * Reconstruct a finalize-ready context from a persisted batch item. Prefers the\n * EN doc on disk (for structural frontmatter merging); falls back to the stored\n * EN snapshot when the file is gone.\n */\nfunction buildIngestContext(\n config: ScribeConfig,\n db: ReturnType<typeof openStore>,\n jobRow: BatchJobRow,\n itemRow: BatchItemRow,\n): PreparedTranslation {\n const type = config.types.find((t) => t.id === itemRow.content_type);\n if (!type) throw new Error(`Unknown content type ${itemRow.content_type}`);\n\n let enDoc: ScribeDocument | null = readEnDocument(config, type, itemRow.en_slug);\n if (!enDoc) {\n const snapshot = getEnSnapshot(db, itemRow.snapshot_id);\n if (!snapshot) {\n throw new Error(\n `EN document and snapshot #${itemRow.snapshot_id} not found for ${itemRow.en_slug}`,\n );\n }\n enDoc = {\n slug: itemRow.en_slug,\n enSlug: itemRow.en_slug,\n locale: config.defaultLocale,\n noindex: false,\n frontmatter: JSON.parse(snapshot.frontmatter_json) as Record<string, unknown>,\n content: snapshot.body,\n };\n }\n\n const item: TranslationWorkItem = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n reason: \"missing\",\n currentEnHash: itemRow.en_hash,\n };\n return {\n item,\n type,\n enDoc,\n // Unused on ingest: finalizeTranslation receives the pre-recorded snapshotId.\n payload: { frontmatter: enDoc.frontmatter as Record<string, unknown>, body: enDoc.content },\n currentEnHash: itemRow.en_hash,\n existingSlug: getTranslation(db, type.id, itemRow.en_slug, itemRow.locale)?.slug,\n model: jobRow.display_model,\n prompt: \"\",\n responseSchema: undefined,\n };\n}\n\n/**\n * Ingest a terminal batch job: run every pending item through the shared\n * finalize path (or mark it failed), update item statuses, and mark the job\n * completed. Returns one result per pending item, or null when a concurrent\n * scribe process already claimed and ingested the job (runs adopt each\n * other's pending jobs, so two pollers can reach the same terminal job).\n *\n * The completion claim is stamped before items are processed so exactly one\n * process ingests. Ingestion is synchronous end-to-end; should a hard kill\n * still land mid-way, the leftover items are no longer counted in-flight and\n * the next run simply resubmits them.\n */\nexport function ingestBatchJob(\n config: ScribeConfig,\n jobRow: BatchJobRow,\n batchJob: BatchJobResultLike,\n onResult?: (result: TranslatePageResult) => void,\n): TranslatePageResult[] | null {\n const state = String(batchJob.state ?? \"UNKNOWN\");\n const db = openStore(config, \"readwrite\");\n if (!claimBatchJobCompletion(db, jobRow.id, state, new Date().toISOString())) {\n db.close();\n return null;\n }\n const pendingItems = listBatchItems(db, jobRow.id).filter((item) => item.status === \"pending\");\n const results: TranslatePageResult[] = [];\n\n const failItem = (itemRow: BatchItemRow, message: string, startedAt: number): void => {\n const result: TranslatePageResult = {\n contentType: itemRow.content_type,\n enSlug: itemRow.en_slug,\n locale: itemRow.locale,\n skipped: false,\n failed: true,\n error: formatTranslateError(new Error(message)),\n durationMs: Date.now() - startedAt,\n };\n updateBatchItemStatus(db, jobRow.id, itemRow.request_index, \"failed\", result.error);\n results.push(result);\n onResult?.(result);\n };\n\n if (isSuccessfulBatchState(state)) {\n const responses = batchJob.dest?.inlinedResponses ?? [];\n for (const itemRow of pendingItems) {\n const startedAt = Date.now();\n const inlined = responses[itemRow.request_index];\n if (!inlined || inlined.error || !inlined.response) {\n failItem(\n itemRow,\n inlined?.error?.message ??\n (inlined ? \"Batch response missing content\" : \"Batch response missing\"),\n startedAt,\n );\n continue;\n }\n let result: TranslatePageResult;\n try {\n const response = inlined.response as Parameters<typeof usageFromResponse>[0];\n const raw = textFromBatchResponse(response);\n const parsed = parseGeminiResponse(raw);\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n const prepared = buildIngestContext(config, db, jobRow, itemRow);\n result = finalizeTranslation(\n config,\n prepared,\n { model: jobRow.display_model, parsed, usage: usageFromResponse(response) },\n { costMode: \"batch\", startedAt, snapshotId: itemRow.snapshot_id },\n );\n } catch (error) {\n failItem(itemRow, error instanceof Error ? error.message : String(error), startedAt);\n continue;\n }\n updateBatchItemStatus(\n db,\n jobRow.id,\n itemRow.request_index,\n result.failed ? \"failed\" : \"done\",\n result.error,\n );\n results.push(result);\n onResult?.(result);\n }\n } else {\n // FAILED / CANCELLED / EXPIRED: every in-flight item fails with the job error.\n const message =\n batchJob.error?.message ?? `Batch job ended in state ${normalizeBatchState(state)}`;\n const startedAt = Date.now();\n for (const itemRow of pendingItems) {\n failItem(itemRow, message, startedAt);\n }\n }\n\n db.close();\n return results;\n}\n\n/**\n * Poll every tracked job together and ingest each one the moment it reaches a\n * terminal state — no job waits for another. The first status check happens\n * immediately so already-finished jobs (resume) ingest without delay.\n */\nexport async function pollAndIngestBatchJobs(\n config: ScribeConfig,\n jobs: BatchJobRow[],\n options: {\n jobCount?: number;\n onProgress?: (event: TranslateProgressEvent) => void;\n onResult?: (result: TranslatePageResult) => void;\n } = {},\n): Promise<void> {\n const jobCount = options.jobCount ?? jobs.length;\n const active = jobs.map((row, jobIndex) => ({ row, jobIndex }));\n const loopStartedAt = Date.now();\n let delay = INITIAL_POLL_MS;\n let firstRound = true;\n\n // Elapsed anchors to the job's actual submission time, so resumed jobs show\n // their true age rather than time since this CLI started.\n const elapsedFor = (row: BatchJobRow): number => {\n const createdAtMs = Date.parse(row.created_at);\n return Number.isNaN(createdAtMs) ? Date.now() - loopStartedAt : Date.now() - createdAtMs;\n };\n\n while (active.length > 0) {\n if (!firstRound) {\n await sleep(delay);\n delay = Math.min(delay * POLL_BACKOFF_FACTOR, MAX_POLL_MS);\n }\n firstRound = false;\n\n for (const tracked of [...active]) {\n const batchJob: BatchJob = await getGeminiBatchJob({ name: tracked.row.job_name });\n const state = normalizeBatchState(batchJob.state);\n options.onProgress?.({\n type: \"batch-polling\",\n name: tracked.row.job_name,\n state,\n elapsedMs: elapsedFor(tracked.row),\n jobIndex: tracked.jobIndex,\n jobCount,\n });\n if (isTerminalBatchState(batchJob.state)) {\n active.splice(active.indexOf(tracked), 1);\n const results = ingestBatchJob(\n config,\n tracked.row,\n batchJob as BatchJobResultLike,\n options.onResult,\n );\n if (results === null) {\n // A concurrent scribe process claimed the job first; its results\n // are already in the store. Report that instead of zero counts.\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: 0,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n elapsedMs: elapsedFor(tracked.row),\n alreadyIngested: true,\n });\n continue;\n }\n options.onProgress?.({\n type: \"batch-done\",\n name: tracked.row.job_name,\n state,\n model: tracked.row.display_model,\n count: results.length,\n jobIndex: tracked.jobIndex,\n jobCount,\n translated: results.filter((r) => !r.failed && !r.skipped).length,\n failed: results.filter((r) => r.failed).length,\n inputTokens: results.reduce((sum, r) => sum + (r.usage?.inputTokens ?? 0), 0),\n outputTokens: results.reduce((sum, r) => sum + (r.usage?.outputTokens ?? 0), 0),\n estimatedCostUsd: results.reduce((sum, r) => sum + (r.estimatedCostUsd ?? 0), 0),\n elapsedMs: elapsedFor(tracked.row),\n });\n }\n }\n }\n}\n\n/** Result shape helper for items that never reached submission. */\nexport function failedResultForItem(\n item: TranslationWorkItem,\n error: unknown,\n startedAt: number,\n): TranslatePageResult {\n return {\n ...baseForItem(item),\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - startedAt,\n };\n}\n","import type Database from \"better-sqlite3\";\nimport type { ScribeConfig } from \"../core/types.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getOrCreateEnSnapshot } from \"../storage/translations.js\";\n\n/** Record (or reuse) a deduplicated EN-source snapshot for a translation run. */\nexport function recordEnSnapshot(\n config: ScribeConfig,\n input: {\n contentType: string;\n enSlug: string;\n enHash: string;\n frontmatter: Record<string, unknown>;\n body: string;\n },\n db?: Database.Database,\n): number {\n const ownDb = db ?? openStore(config, \"readwrite\");\n const id = getOrCreateEnSnapshot(ownDb, {\n contentType: input.contentType,\n enSlug: input.enSlug,\n enHash: input.enHash,\n frontmatter: input.frontmatter,\n body: input.body,\n createdAt: new Date().toISOString(),\n });\n if (!db) ownDb.close();\n return id;\n}\n","import {\n type BatchJob,\n GoogleGenAI,\n type JobState,\n type GenerateContentResponse,\n type InlinedRequest,\n} from \"@google/genai\";\nimport { withRetry } from \"./retry.js\";\n\n// The SDK documents JOB_STATE_* names but the live API reports BATCH_STATE_*;\n// the SDK maps only the states it knows to JOB_STATE_* and passes the rest\n// through, so both families (and states persisted in either form) must be\n// tolerated. Compare on the bare state name.\nconst STATE_FAMILY_PREFIX = /^(JOB_STATE_|BATCH_STATE_)/;\n\nconst TERMINAL_STATES = new Set([\n \"SUCCEEDED\",\n \"FAILED\",\n \"CANCELLED\",\n \"EXPIRED\",\n \"PARTIALLY_SUCCEEDED\",\n]);\n\nconst SUCCESSFUL_STATES = new Set([\"SUCCEEDED\", \"PARTIALLY_SUCCEEDED\"]);\n\n/** Strip the JOB_STATE_/BATCH_STATE_ family prefix: \"BATCH_STATE_RUNNING\" -> \"RUNNING\". */\nexport function normalizeBatchState(state: JobState | string | undefined): string {\n return String(state ?? \"UNKNOWN\").replace(STATE_FAMILY_PREFIX, \"\");\n}\n\nexport function isTerminalBatchState(state: JobState | string | undefined): boolean {\n return TERMINAL_STATES.has(normalizeBatchState(state));\n}\n\nexport function isSuccessfulBatchState(state: JobState | string | undefined): boolean {\n return SUCCESSFUL_STATES.has(normalizeBatchState(state));\n}\n\nfunction makeClient(apiKey?: string): GoogleGenAI {\n const key = apiKey ?? process.env.GEMINI_API_KEY;\n if (!key) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n return new GoogleGenAI({ apiKey: key });\n}\n\n/**\n * Extract the text payload from a batch GenerateContentResponse. Batch inlined\n * responses are plain JSON objects (the SDK does not rebuild the class), so the\n * `.text` getter is unavailable — read candidates/parts directly and skip\n * thought parts.\n */\nexport function textFromBatchResponse(response: GenerateContentResponse): string {\n if (typeof response.text === \"string\") return response.text;\n const parts = response.candidates?.[0]?.content?.parts ?? [];\n return parts\n .filter((part) => !part.thought && typeof part.text === \"string\")\n .map((part) => part.text)\n .join(\"\");\n}\n\n/** Submit one Gemini Batch API job with inlined requests. */\nexport async function createGeminiBatchJob(input: {\n /** API model id (already resolved from the display name). */\n model: string;\n requests: InlinedRequest[];\n apiKey?: string;\n displayName?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n const job = await withRetry(() =>\n ai.batches.create({\n model: input.model,\n src: input.requests,\n config: { displayName: input.displayName ?? `scribe-translate-${Date.now()}` },\n }),\n );\n if (!job.name) throw new Error(\"Gemini batch job was created without a name\");\n return job;\n}\n\n/** Fetch the current state (and, when terminal, results) of a batch job. */\nexport async function getGeminiBatchJob(input: {\n name: string;\n apiKey?: string;\n}): Promise<BatchJob> {\n const ai = makeClient(input.apiKey);\n return withRetry(() => ai.batches.get({ name: input.name }));\n}\n","import { ApiError } from \"@google/genai\";\n\n/** HTTP status codes worth retrying: rate limiting + transient server errors. */\nconst TRANSIENT_STATUS = new Set([429, 500, 502, 503, 504]);\n\nfunction statusFromError(error: unknown): number | undefined {\n if (error instanceof ApiError && typeof error.status === \"number\") {\n return error.status;\n }\n // Some SDK paths surface a plain object/error with a numeric `status`.\n if (error && typeof error === \"object\" && \"status\" in error) {\n const status = (error as { status?: unknown }).status;\n if (typeof status === \"number\") return status;\n }\n // Fall back to matching a status code embedded in the message.\n const message = error instanceof Error ? error.message : String(error);\n const match = message.match(/\\b(429|500|502|503|504)\\b/);\n if (match) return Number(match[1]);\n return undefined;\n}\n\nfunction isNetworkError(error: unknown): boolean {\n const err = error as { code?: unknown; name?: unknown } | null;\n const code = typeof err?.code === \"string\" ? err.code : \"\";\n if (\n code === \"ECONNRESET\" ||\n code === \"ETIMEDOUT\" ||\n code === \"ECONNREFUSED\" ||\n code === \"ENOTFOUND\" ||\n code === \"EAI_AGAIN\" ||\n code === \"EPIPE\" ||\n code === \"UND_ERR_SOCKET\"\n ) {\n return true;\n }\n const message = error instanceof Error ? error.message.toLowerCase() : \"\";\n return (\n message.includes(\"network\") ||\n message.includes(\"fetch failed\") ||\n message.includes(\"socket hang up\") ||\n message.includes(\"terminated\")\n );\n}\n\n/** Classify whether an error is transient and safe to retry. */\nexport function isTransientError(error: unknown): boolean {\n const status = statusFromError(error);\n if (status !== undefined) return TRANSIENT_STATUS.has(status);\n return isNetworkError(error);\n}\n\nexport interface RetryOptions {\n attempts?: number;\n baseDelayMs?: number;\n /** Injectable sleep for tests; defaults to real setTimeout. */\n sleep?: (ms: number) => Promise<void>;\n /** Injectable jitter in [0, 1); defaults to Math.random. */\n random?: () => number;\n}\n\nconst defaultSleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\n/**\n * Run `fn` with exponential backoff + jitter, retrying only transient failures\n * (HTTP 429/5xx and network errors). Non-transient errors throw immediately.\n */\nexport async function withRetry<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> {\n const attempts = Math.max(1, options.attempts ?? 3);\n const baseDelayMs = options.baseDelayMs ?? 1000;\n const sleep = options.sleep ?? defaultSleep;\n const random = options.random ?? Math.random;\n\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n if (attempt >= attempts || !isTransientError(error)) throw error;\n // Exponential backoff with full jitter: attempt 1 -> ~1s, attempt 2 -> ~2-4s.\n const backoff = baseDelayMs * 2 ** (attempt - 1);\n const delay = backoff + random() * backoff;\n await sleep(delay);\n }\n }\n throw lastError;\n}\n","import { GoogleGenAI, type GenerateContentConfig, type GenerateContentResponse } from \"@google/genai\";\nimport {\n DEFAULT_GEMINI_MODEL,\n normalizeGeminiDisplayName,\n resolveGeminiModelId,\n resolveThinkingConfig,\n} from \"./gemini-models.js\";\nimport { withRetry } from \"./retry.js\";\n\nconst DEFAULT_MODEL = DEFAULT_GEMINI_MODEL;\n\nexport interface GeminiTokenUsage {\n inputTokens: number;\n /** Billed output tokens; INCLUDES thoughts tokens. */\n outputTokens: number;\n /** Thoughts (reasoning) tokens, billed as output. */\n thoughtsTokens: number;\n totalTokens: number;\n}\n\nexport interface GeminiTranslationResult {\n model: string;\n raw: string;\n parsed: {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n };\n usage: GeminiTokenUsage;\n}\n\nfunction extractJson(text: string): string {\n const trimmed = text.trim();\n // Only strip a fence that wraps the entire payload, so fences inside string\n // values (e.g. a translated MDX body with ```ts blocks) are left untouched.\n const fenced = trimmed.match(/^```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```$/);\n if (fenced?.[1]) return fenced[1].trim();\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n return trimmed;\n}\n\nexport function parseGeminiResponse(text: string): {\n frontmatter: Record<string, unknown>;\n body: string;\n slug?: string;\n} {\n // With responseMimeType \"application/json\" the payload is already pure JSON.\n // Parse it directly first; only fall back to extraction when the model wraps\n // or pads the JSON (extraction is fragile when the body contains code fences).\n let parsed: { frontmatter?: Record<string, unknown>; body: string; slug?: string };\n try {\n parsed = JSON.parse(text.trim());\n } catch {\n parsed = JSON.parse(extractJson(text));\n }\n // Types without translatable frontmatter use a body-only response schema;\n // default the frontmatter so downstream merge/validation sees an object.\n if (parsed !== null && typeof parsed === \"object\" && parsed.frontmatter === undefined) {\n parsed.frontmatter = {};\n }\n return parsed as { frontmatter: Record<string, unknown>; body: string; slug?: string };\n}\n\n/**\n * Build the per-request generation config shared by the direct and batch paths.\n * The same shape is passed to `generateContent` and to each inlined batch request.\n */\nexport function buildGeminiRequestConfig(input: {\n apiModelId: string;\n responseSchema?: Record<string, unknown>;\n}): GenerateContentConfig {\n const thinkingConfig = resolveThinkingConfig(input.apiModelId);\n return {\n responseMimeType: \"application/json\",\n ...(input.responseSchema ? { responseSchema: input.responseSchema } : {}),\n ...(thinkingConfig ? { thinkingConfig } : {}),\n };\n}\n\ninterface WireUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n thoughtsTokenCount?: number;\n totalTokenCount?: number;\n prompt_token_count?: number;\n candidates_token_count?: number;\n thoughts_token_count?: number;\n total_token_count?: number;\n}\n\n/**\n * Extract token usage from a Gemini response; thoughts are folded into output.\n * Batch inlined responses arrive as raw JSON rather than SDK class instances,\n * so tolerate both camelCase and snake_case field names.\n */\nexport function usageFromResponse(response: GenerateContentResponse): GeminiTokenUsage {\n const meta = (response.usageMetadata ??\n (response as unknown as { usage_metadata?: WireUsageMetadata }).usage_metadata ??\n {}) as WireUsageMetadata;\n const thoughtsTokens = meta.thoughtsTokenCount ?? meta.thoughts_token_count ?? 0;\n return {\n inputTokens: meta.promptTokenCount ?? meta.prompt_token_count ?? 0,\n // candidatesTokenCount does not include thoughts, but thoughts are billed as\n // output tokens, so fold them in here for accurate cost accounting.\n outputTokens: (meta.candidatesTokenCount ?? meta.candidates_token_count ?? 0) + thoughtsTokens,\n thoughtsTokens,\n totalTokens: meta.totalTokenCount ?? meta.total_token_count ?? 0,\n };\n}\n\nexport async function translatePageWithGemini(input: {\n prompt: string;\n model?: string;\n apiKey?: string;\n responseSchema?: Record<string, unknown>;\n}): Promise<GeminiTranslationResult> {\n const apiKey = input.apiKey ?? process.env.GEMINI_API_KEY;\n if (!apiKey) {\n throw new Error(\"GEMINI_API_KEY is required for scribe translate\");\n }\n\n const displayModel = normalizeGeminiDisplayName(\n input.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_MODEL,\n );\n const apiModel = resolveGeminiModelId(displayModel);\n const ai = new GoogleGenAI({ apiKey });\n const response = await withRetry(() =>\n ai.models.generateContent({\n model: apiModel,\n contents: input.prompt,\n config: buildGeminiRequestConfig({\n apiModelId: apiModel,\n responseSchema: input.responseSchema,\n }),\n }),\n );\n\n const raw = response.text ?? \"\";\n const parsed = parseGeminiResponse(raw);\n\n if (!parsed.frontmatter || typeof parsed.body !== \"string\") {\n throw new Error(\"Gemini response missing frontmatter/body\");\n }\n\n return { model: displayModel, raw, parsed, usage: usageFromResponse(response) };\n}\n","import { ThinkingLevel, type ThinkingConfig } from \"@google/genai\";\n\n/** Display name -> Gemini API model id. Pricing and logs use the display name. */\nexport const GEMINI_MODEL_IDS: Record<string, string> = {\n \"gemini-2.5-pro\": \"gemini-2.5-pro\",\n \"gemini-3.1-pro\": \"gemini-3.1-pro-preview\",\n};\n\nexport const DEFAULT_GEMINI_MODEL = \"gemini-3.1-pro\";\n\nfunction stripModelsPrefix(model: string): string {\n return model.replace(/^models\\//, \"\");\n}\n\n/** Map a display name (or passthrough id) to the API model id. */\nexport function resolveGeminiModelId(model: string): string {\n const name = stripModelsPrefix(model);\n return GEMINI_MODEL_IDS[name] ?? name;\n}\n\n/** Normalize any model id/alias to the display name used for pricing. */\nexport function normalizeGeminiDisplayName(model: string): string {\n const name = stripModelsPrefix(model);\n if (name in GEMINI_MODEL_IDS) return name;\n\n const alias = Object.entries(GEMINI_MODEL_IDS).find(([, apiId]) => apiId === name);\n if (alias) return alias[0];\n\n return name;\n}\n\n/**\n * Resolve the thinking config to keep translation cheap and predictable.\n * - Gemini 3.x: `thinkingLevel: LOW` (the 2.5-style `thinkingBudget` is unsupported).\n * - Gemini 2.5-pro: cannot fully disable thinking; use the minimum budget of 128.\n * - Unknown/passthrough ids: LOW for \"gemini-3*\", budget 128 for ids containing \"2.5\",\n * otherwise no thinking config (let the model default).\n */\nexport function resolveThinkingConfig(apiModelId: string): ThinkingConfig | undefined {\n const id = stripModelsPrefix(apiModelId).toLowerCase();\n if (id.startsWith(\"gemini-3\")) return { thinkingLevel: ThinkingLevel.LOW };\n if (id.includes(\"2.5\")) return { thinkingBudget: 128 };\n return undefined;\n}\n","import { stripLocaleSuffixFromSlug } from \"../core/localized-slug.js\";\nimport type { ContentTypeConfig, ScribeConfig, ScribeDocument } from \"../core/types.js\";\nimport { computeTranslationEnHash } from \"../hash/page-hash.js\";\nimport { countMarkerOccurrences, extractInlineTokens, placeholderMarker } from \"../inline/tokens.js\";\nimport { getTranslatablePayload, readEnDocument } from \"../loader/create-loader.js\";\nimport { recordEnSnapshot } from \"../history/record-snapshot.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport { getTranslation, upsertTranslation } from \"../storage/translations.js\";\nimport type { GeminiTokenUsage } from \"./gemini-client.js\";\nimport { estimateTranslationCostUsd, type TranslationCostMode } from \"./gemini-pricing.js\";\nimport { DEFAULT_GEMINI_MODEL, normalizeGeminiDisplayName } from \"./gemini-models.js\";\nimport { buildPageTranslationPrompt } from \"./prompts/translation-prompt.js\";\nimport { buildGeminiResponseSchema } from \"./response-schema.js\";\nimport { resolveTranslateConfig } from \"./resolve-translate-config.js\";\nimport { assertValidTranslatedMdxBody } from \"./validate-mdx-body.js\";\nimport { validateTranslatedFrontmatter } from \"./validate-translation.js\";\nimport type { TranslationWorkItem } from \"./worklist.js\";\n\nexport type TranslateMode = \"batch\" | \"direct\";\n\nexport interface TranslatePageResult {\n contentType: string;\n enSlug: string;\n locale: string;\n skipped: boolean;\n failed?: boolean;\n reason?: \"fresh\" | \"in-flight\";\n model?: string;\n usage?: GeminiTokenUsage;\n estimatedCostUsd?: number;\n durationMs?: number;\n error?: string;\n slugAdjusted?: { from: string; to: string; matchedCode: string };\n mdxAdjusted?: boolean;\n}\n\nexport interface TranslateWorklistTotals {\n translated: number;\n skipped: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n durationMs: number;\n}\n\nexport type TranslateProgressEvent =\n | {\n type: \"start\";\n total: number;\n concurrency: number;\n dryRun: boolean;\n model?: string;\n mode?: TranslateMode;\n }\n | { type: \"item-start\"; item: TranslationWorkItem; active: string[] }\n | { type: \"item-done\"; result: TranslatePageResult }\n | {\n type: \"batch-submitted\";\n name: string;\n count: number;\n model?: string;\n jobIndex: number;\n jobCount: number;\n resumed?: boolean;\n /** ISO timestamp of the job's actual submission (persisted created_at). */\n createdAt?: string;\n }\n | {\n type: \"batch-polling\";\n name: string;\n state: string;\n /** Elapsed since the job was submitted (not since the CLI started). */\n elapsedMs: number;\n jobIndex: number;\n jobCount: number;\n }\n | {\n type: \"batch-done\";\n name: string;\n state: string;\n model?: string;\n count: number;\n jobIndex: number;\n jobCount: number;\n translated: number;\n failed: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCostUsd: number;\n /** Elapsed since the job was submitted. */\n elapsedMs: number;\n /**\n * True when a concurrent scribe process won the ingestion claim: the\n * job's results were saved by that process, this one has nothing to add.\n */\n alreadyIngested?: boolean;\n }\n | {\n /**\n * Emitted once, after the main pass, when validation failures will be\n * retried. Carries the failed items so reporters can print the recap.\n */\n type: \"retry-start\";\n failed: TranslatePageResult[];\n }\n | {\n type: \"done\";\n results: TranslatePageResult[];\n totals: TranslateWorklistTotals;\n /** How many results in `results` succeeded only on the retry round. */\n retriedTranslated?: number;\n };\n\n/** Stable identity for a worklist item / batch item row. */\nexport function translationItemKey(item: {\n contentType?: string;\n content_type?: string;\n enSlug?: string;\n en_slug?: string;\n locale: string;\n}): string {\n const contentType = item.contentType ?? item.content_type ?? \"\";\n const enSlug = item.enSlug ?? item.en_slug ?? \"\";\n return `${contentType}\\u0000${enSlug}\\u0000${item.locale}`;\n}\n\nexport function summarizeResults(\n results: TranslatePageResult[],\n durationMs: number,\n): TranslateWorklistTotals {\n return results.reduce<TranslateWorklistTotals>(\n (totals, result) => {\n if (result.failed) totals.failed += 1;\n else if (result.skipped) totals.skipped += 1;\n else totals.translated += 1;\n\n totals.inputTokens += result.usage?.inputTokens ?? 0;\n totals.outputTokens += result.usage?.outputTokens ?? 0;\n totals.estimatedCostUsd += result.estimatedCostUsd ?? 0;\n return totals;\n },\n {\n translated: 0,\n skipped: 0,\n failed: 0,\n inputTokens: 0,\n outputTokens: 0,\n estimatedCostUsd: 0,\n durationMs,\n },\n );\n}\n\nexport function formatTranslateError(error: unknown): string {\n const message = error instanceof Error ? error.message : String(error);\n try {\n const parsed = JSON.parse(message) as { error?: { message?: string } };\n if (parsed.error?.message) return parsed.error.message;\n } catch {\n // not JSON\n }\n const embedded = message.match(/\"message\"\\s*:\\s*\"((?:\\\\.|[^\"\\\\])*)\"/);\n if (embedded?.[1]) {\n return embedded[1].replace(/\\\\\"/g, '\"').replace(/\\\\n/g, \"\\n\");\n }\n return message.length > 160 ? `${message.slice(0, 157)}…` : message;\n}\n\n/**\n * Post-receive verification: a translated body must reproduce every inline-token\n * marker `%%1%%..%%N%%` (N = tokens in the current EN body) exactly once. A model\n * that drops, duplicates, or mangles a marker fails the row so it retries.\n */\nexport function verifyInlineMarkers(enRawBody: string, translatedBody: string): void {\n const { tokens } = extractInlineTokens(enRawBody);\n if (tokens.length === 0) return;\n const missing: string[] = [];\n const duplicated: string[] = [];\n for (let i = 1; i <= tokens.length; i++) {\n const count = countMarkerOccurrences(translatedBody, i);\n if (count === 0) missing.push(placeholderMarker(i));\n else if (count > 1) duplicated.push(placeholderMarker(i));\n }\n if (missing.length === 0 && duplicated.length === 0) return;\n const parts: string[] = [];\n if (missing.length > 0) parts.push(`missing ${missing.join(\", \")}`);\n if (duplicated.length > 0) parts.push(`duplicated ${duplicated.join(\", \")}`);\n throw new Error(`Inline token markers mismatch: ${parts.join(\"; \")}`);\n}\n\nfunction resolveContextLabel(enDoc: ScribeDocument, enSlug: string): string {\n const fm = enDoc.frontmatter as Record<string, unknown>;\n for (const key of [\"title\", \"name\", \"h1\"]) {\n const value = fm[key];\n if (typeof value === \"string\" && value.trim()) return value;\n }\n return enSlug;\n}\n\nexport function baseForItem(\n item: TranslationWorkItem,\n): Pick<TranslatePageResult, \"contentType\" | \"enSlug\" | \"locale\"> {\n return {\n contentType: item.contentType,\n enSlug: item.enSlug,\n locale: item.locale,\n };\n}\n\n/** Everything needed to submit and finalize one translation request. */\nexport interface PreparedTranslation {\n item: TranslationWorkItem;\n type: ContentTypeConfig;\n enDoc: ScribeDocument;\n payload: { frontmatter: Record<string, unknown>; body: string };\n currentEnHash: string;\n existingSlug?: string;\n /** Configured model (may be undefined; env/default applies downstream). */\n model?: string;\n prompt: string;\n responseSchema?: Record<string, unknown>;\n}\n\nexport type PrepareOutcome =\n | { status: \"ready\"; prepared: PreparedTranslation }\n | { status: \"done\"; result: TranslatePageResult };\n\n/**\n * Shared pre-flight for the direct and batch paths: read the EN doc, skip when\n * the stored translation is fresh, and build the prompt + response schema.\n * Throws on unrecoverable item errors (unknown type, missing EN doc).\n */\nexport function prepareTranslation(\n config: ScribeConfig,\n item: TranslationWorkItem,\n options: { model?: string; force?: boolean },\n startedAt: number,\n): PrepareOutcome {\n const type = config.types.find((t) => t.id === item.contentType);\n if (!type) throw new Error(`Unknown content type ${item.contentType}`);\n\n const enDoc = readEnDocument(config, type, item.enSlug);\n if (!enDoc) throw new Error(`EN document not found: ${item.enSlug}`);\n\n const payload = getTranslatablePayload(enDoc, type);\n // Hash and translate the PLACEHOLDER body (tokens swapped for inert `%%n%%`\n // markers): a token's VALUE never affects the hash, so changing a relation\n // target / asset path / var value never staleness-flags a locale, while\n // adding/removing/moving tokens does. The hash goes through the shared helper\n // so it can never diverge from the worklist's staleness check.\n const { placeholderBody } = extractInlineTokens(payload.body);\n const currentEnHash = computeTranslationEnHash(payload.frontmatter, payload.body);\n\n const db = openStore(config, \"readonly\");\n const existing = getTranslation(db, type.id, item.enSlug, item.locale);\n db.close();\n\n if (!options.force && existing && existing.en_hash === currentEnHash) {\n return {\n status: \"done\",\n result: {\n ...baseForItem(item),\n skipped: true,\n reason: \"fresh\",\n durationMs: Date.now() - startedAt,\n },\n };\n }\n\n const resolvedTranslate = resolveTranslateConfig(config, type);\n const model = options.model ?? resolvedTranslate.model;\n\n const prompt = buildPageTranslationPrompt({\n resolved: resolvedTranslate,\n targetLocale: item.locale,\n contextLabel: resolveContextLabel(enDoc, item.enSlug),\n translatableFrontmatter: payload.frontmatter,\n enBody: placeholderBody,\n slugStrategy: type.slugStrategy,\n previousError: item.previousError,\n });\n\n const responseSchema = buildGeminiResponseSchema(\n type.schema,\n type.slugStrategy,\n payload.frontmatter,\n );\n\n return {\n status: \"ready\",\n prepared: {\n item,\n type,\n enDoc,\n payload,\n currentEnHash,\n existingSlug: existing?.slug,\n model,\n prompt,\n responseSchema: responseSchema ?? undefined,\n },\n };\n}\n\n/**\n * Shared post-processing for the direct and batch paths: strip locale suffixes\n * from the slug, validate frontmatter + MDX body, snapshot the EN source and\n * upsert the translation. Never throws — failures come back as a failed result.\n * Pass `snapshotId` when the EN snapshot was already recorded (batch submission\n * time) so ingestion does not depend on the current EN files.\n */\nexport function finalizeTranslation(\n config: ScribeConfig,\n prepared: PreparedTranslation,\n output: {\n model: string;\n parsed: { frontmatter: Record<string, unknown>; body: string; slug?: string };\n usage: GeminiTokenUsage;\n },\n options: { costMode: TranslationCostMode; startedAt: number; snapshotId?: number },\n): TranslatePageResult {\n const { item, type, enDoc, payload } = prepared;\n const base = baseForItem(item);\n\n try {\n const rawSlug =\n type.slugStrategy === \"localized\"\n ? (output.parsed.slug ?? prepared.existingSlug ?? item.enSlug)\n : item.enSlug;\n const localeCodes = config.locales.filter((l) => l !== config.defaultLocale);\n const { slug, stripped, matchedCode } = stripLocaleSuffixFromSlug(rawSlug, localeCodes);\n const slugAdjusted =\n stripped && matchedCode ? { from: rawSlug, to: slug, matchedCode } : undefined;\n\n const validated = validateTranslatedFrontmatter(enDoc, output.parsed.frontmatter, type.schema);\n if (!validated.ok) {\n throw new Error(`Translation validation failed: ${validated.error}`);\n }\n\n // Bodyless types (`body: false`) never persist a body: the translatable\n // payload excluded it, so any body the model echoed back is dropped and the\n // MDX validation pass is skipped.\n const { body: translatedBody, adjusted: mdxAdjusted } =\n type.body === false\n ? { body: \"\", adjusted: false }\n : assertValidTranslatedMdxBody(output.parsed.body);\n\n // Placeholder markers must survive translation intact (choke point shared by\n // the direct and batch paths). `payload.body` is the raw EN body used to\n // build this translation, so its token count matches the markers the model\n // was asked to reproduce.\n verifyInlineMarkers(payload.body, translatedBody);\n\n const writeDb = openStore(config, \"readwrite\");\n const snapshotId =\n options.snapshotId ??\n recordEnSnapshot(\n config,\n {\n contentType: type.id,\n enSlug: item.enSlug,\n enHash: prepared.currentEnHash,\n frontmatter: payload.frontmatter,\n body: payload.body,\n },\n writeDb,\n );\n upsertTranslation(writeDb, {\n contentType: type.id,\n enSlug: item.enSlug,\n locale: item.locale,\n slug,\n frontmatter: validated.frontmatter,\n body: translatedBody,\n enHash: prepared.currentEnHash,\n translatedAt: new Date().toISOString(),\n model: output.model,\n snapshotId,\n });\n writeDb.close();\n\n const estimatedCostUsd = estimateTranslationCostUsd(\n normalizeGeminiDisplayName(output.model),\n output.usage.inputTokens,\n output.usage.outputTokens,\n options.costMode,\n );\n\n return {\n ...base,\n skipped: false,\n model: output.model,\n usage: output.usage,\n estimatedCostUsd,\n durationMs: Date.now() - options.startedAt,\n slugAdjusted,\n mdxAdjusted: mdxAdjusted || undefined,\n };\n } catch (error) {\n return {\n ...base,\n skipped: false,\n failed: true,\n error: formatTranslateError(error),\n durationMs: Date.now() - options.startedAt,\n };\n }\n}\n\nexport function displayModelFor(prepared: PreparedTranslation): string {\n return normalizeGeminiDisplayName(\n prepared.model ?? process.env.PROSE_GEMINI_MODEL ?? DEFAULT_GEMINI_MODEL,\n );\n}\n","const CONTEXT_TIER_TOKENS = 200_000;\n\nexport interface TieredModelPricing {\n input: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n output: readonly [le200kUsdPerMillion: number, gt200kUsdPerMillion: number];\n}\n\n/** display_name -> { input: (le_200k, gt_200k), output: (le_200k, gt_200k) } in USD per 1M tokens */\nexport const GEMINI_PRICING_USD: Record<string, TieredModelPricing> = {\n \"gemini-3.1-pro\": { input: [2.0, 4.0], output: [12.0, 18.0] },\n};\n\nfunction normalizeModelId(model: string): string {\n return model.replace(/^models\\//, \"\").toLowerCase();\n}\n\nfunction tierRate(tokens: number, tiers: readonly [number, number]): number {\n return tokens <= CONTEXT_TIER_TOKENS ? tiers[0] : tiers[1];\n}\n\nexport function resolveModelPricing(model: string): TieredModelPricing | undefined {\n const id = normalizeModelId(model);\n if (GEMINI_PRICING_USD[id]) return GEMINI_PRICING_USD[id];\n\n const match = Object.entries(GEMINI_PRICING_USD).find(([key]) => id.includes(key));\n return match?.[1];\n}\n\nexport type TranslationCostMode = \"interactive\" | \"batch\";\n\n/** Batch API tokens are billed at 50% of interactive rates. */\nconst BATCH_DISCOUNT = 0.5;\n\nexport function estimateTranslationCostUsd(\n model: string,\n inputTokens: number,\n outputTokens: number,\n mode: TranslationCostMode = \"interactive\",\n): number | undefined {\n const pricing = resolveModelPricing(model);\n if (!pricing) return undefined;\n\n const inputRate = tierRate(inputTokens, pricing.input);\n const outputRate = tierRate(outputTokens, pricing.output);\n const multiplier = mode === \"batch\" ? BATCH_DISCOUNT : 1;\n\n return (\n ((inputTokens / 1_000_000) * inputRate +\n (outputTokens / 1_000_000) * outputRate) *\n multiplier\n );\n}\n\nexport function formatTokenCount(tokens: number): string {\n if (tokens >= 1_000_000) return `${(tokens / 1_000_000).toFixed(2)}M`;\n if (tokens >= 1_000) return `${(tokens / 1_000).toFixed(1)}k`;\n return String(tokens);\n}\n\nexport function formatUsd(amount: number | undefined): string {\n if (amount === undefined) return \"n/a\";\n if (amount >= 1) return `$${amount.toFixed(2)}`;\n if (amount >= 0.01) return `$${amount.toFixed(3)}`;\n return `$${amount.toFixed(4)}`;\n}\n","import type { ResolvedTranslateConfig } from \"../resolve-translate-config.js\";\nimport type { SlugStrategy } from \"../../core/types.js\";\n\nexport const LOCALE_NAMES: Record<string, string> = {\n fr: \"French\",\n es: \"Spanish\",\n de: \"German\",\n nl: \"Dutch\",\n uk: \"Ukrainian\",\n tr: \"Turkish\",\n da: \"Danish\",\n he: \"Hebrew\",\n \"zh-CN\": \"Simplified Chinese\",\n \"zh-TW\": \"Traditional Chinese\",\n pt: \"Portuguese\",\n \"pt-BR\": \"Brazilian Portuguese\",\n ja: \"Japanese\",\n ru: \"Russian\",\n it: \"Italian\",\n ar: \"Arabic\",\n};\n\nexport function defaultLocalizationPrompt(localeName: string, locale: string): string {\n return [\n `Localize the content above into natural ${localeName} (${locale}).`,\n \"Do not translate word-for-word.\",\n \"Preserve the source tone and brand voice.\",\n \"Write as if a native speaker authored it for the target market.\",\n ].join(\" \");\n}\n\n/** Type/project `translate.prompt` extras are appended before the locale directive. */\nexport function buildLocalizationPrompt(\n promptOverride: string | undefined,\n localeName: string,\n locale: string,\n): string {\n const localeDirective = defaultLocalizationPrompt(localeName, locale);\n if (!promptOverride) return localeDirective;\n return `${promptOverride}\\n\\n${localeDirective}`;\n}\n\n/**\n * Static, locale-independent framing. Kept first so the whole prompt PREFIX\n * (framing + context + rules + EN payload) is byte-identical across every locale\n * of a given page, enabling Gemini implicit prefix caching. The locale-specific\n * localization directive lives in the SUFFIX, after the EN body.\n */\nconst TASK_FRAMING =\n \"You are localizing the content below into a target language specified at the end of this prompt.\";\n\n/**\n * Describe the expected JSON keys. Mirrors buildGeminiResponseSchema: types\n * without translatable frontmatter get a body-only response (their structural\n * frontmatter is carried over from EN, not translated).\n */\nfunction buildOutputFormatLine(hasFrontmatter: boolean, slugStrategy: SlugStrategy): string {\n if (!hasFrontmatter) {\n return slugStrategy === \"localized\"\n ? \"`body` (string, full MDX body), `slug` (string).\"\n : \"`body` (string, full MDX body).\";\n }\n return slugStrategy === \"localized\"\n ? \"`frontmatter` (object with translated frontmatter fields), `body` (string, full MDX body), `slug` (string).\"\n : \"`frontmatter` (object), `body` (string).\";\n}\n\n/**\n * Build a page translation prompt whose prefix (everything up to and including\n * the EN body) does not vary with locale, and whose suffix carries all\n * locale-specific instructions. This lets Gemini reuse the cached prefix when the\n * same page is translated into multiple locales.\n */\n/**\n * Compose the retry-context section appended (locale-specific suffix only, never\n * the cached prefix) when a previous attempt was rejected by validation. The\n * validation errors are included verbatim so the model can fix the exact issues.\n */\nfunction buildRetryContextSection(previousError: string): string[] {\n return [\n \"\",\n \"## Previous attempt\",\n `A previous attempt at this translation was rejected with the following validation errors: ${previousError}. Produce a corrected translation that fixes these issues while re-checking every schema constraint (required fields, array minimums, maximum lengths).`,\n ];\n}\n\nexport function buildPageTranslationPrompt(input: {\n resolved: ResolvedTranslateConfig;\n targetLocale: string;\n contextLabel?: string;\n translatableFrontmatter: Record<string, unknown>;\n enBody: string;\n slugStrategy: SlugStrategy;\n /** Verbatim validation errors from a prior rejected attempt (retry round). */\n previousError?: string;\n}): string {\n const localeName = LOCALE_NAMES[input.targetLocale] ?? input.targetLocale;\n const localizationPrompt = buildLocalizationPrompt(\n input.resolved.promptOverride,\n localeName,\n input.targetLocale,\n );\n\n // PREFIX — locale-independent. Identical for every locale of a given page.\n const prefix = [\n TASK_FRAMING,\n \"\",\n ...(input.resolved.context ? [\"## Context\", input.resolved.context, \"\"] : []),\n ...(input.contextLabel ? [`Document: ${input.contextLabel}`, \"\"] : []),\n \"## Rules\",\n ...input.resolved.rules.map((rule) => `- ${rule}`),\n \"\",\n \"## EN translatable frontmatter (JSON)\",\n JSON.stringify(input.translatableFrontmatter, null, 2),\n \"\",\n \"## EN body (MDX)\",\n input.enBody,\n ];\n\n // SUFFIX — locale-specific. Everything that depends on the target locale must\n // come after the EN body so it never changes the cacheable prefix.\n const suffix = [\n \"\",\n \"## Target language\",\n localizationPrompt,\n ...(input.slugStrategy === \"localized\"\n ? [\n `The slug MUST be written in ${localeName}, derived from the ${localeName} title and its meaning — never the English slug.`,\n ]\n : []),\n \"\",\n \"## Output format\",\n \"Return ONLY valid JSON with keys:\",\n buildOutputFormatLine(\n Object.keys(input.translatableFrontmatter).length > 0,\n input.slugStrategy,\n ),\n // Retry context is locale-specific suffix material: it MUST stay after the\n // EN body so the cacheable prefix is byte-identical with and without it.\n ...(input.previousError ? buildRetryContextSection(input.previousError) : []),\n ];\n\n return [...prefix, ...suffix].join(\"\\n\");\n}\n","import { z } from \"zod\";\nimport { getFieldKind, peelOptionalWrappers } from \"../core/field.js\";\nimport type { SlugStrategy } from \"../core/types.js\";\n\nfunction getObjectShape(schema: z.ZodTypeAny): z.ZodRawShape | null {\n const base = peelOptionalWrappers(schema);\n if (base instanceof Object && \"shape\" in base) {\n return (base as z.ZodObject<z.ZodRawShape>).shape;\n }\n return null;\n}\n\nfunction getArraySchema(schema: z.ZodTypeAny): z.ZodArray | null {\n const base = peelOptionalWrappers(schema);\n if (\n base instanceof Object &&\n \"element\" in base &&\n (base as z.ZodTypeAny & { _def?: { type?: string } })._def?.type === \"array\"\n ) {\n return base as z.ZodArray;\n }\n return null;\n}\n\nfunction extractTranslatableFromStructural(schema: z.ZodTypeAny): z.ZodTypeAny | null {\n const arraySchema = getArraySchema(schema);\n if (arraySchema) {\n const inner = buildTranslatableSubschema(arraySchema.element as z.ZodTypeAny);\n if (inner) return z.array(inner);\n return null;\n }\n if (getObjectShape(schema)) {\n return buildTranslatableSubschema(schema);\n }\n return null;\n}\n\n/** Build a Zod object schema containing only translatable fields (including nested in structural arrays). */\nexport function buildTranslatableSubschema(schema: z.ZodTypeAny): z.ZodObject | null {\n const shape = getObjectShape(schema);\n if (!shape) return null;\n\n const out: Record<string, z.ZodTypeAny> = {};\n for (const [key, child] of Object.entries(shape)) {\n const childSchema = child as z.ZodTypeAny;\n const kind = getFieldKind(childSchema);\n if (kind === \"translatable\") {\n out[key] = peelOptionalWrappers(childSchema);\n } else if (kind === \"structural\") {\n const nested = extractTranslatableFromStructural(childSchema);\n if (nested) out[key] = nested;\n }\n }\n\n if (Object.keys(out).length === 0) return null;\n return z.object(out);\n}\n\n/**\n * Like `buildTranslatableSubschema`, but only includes keys present in the EN\n * translatable payload. Prevents the model from hallucinating nested structural\n * arrays (e.g. blog `itemList`) when the source document has none.\n */\nexport function buildTranslatableSubschemaForPayload(\n schema: z.ZodTypeAny,\n translatableFrontmatter: Record<string, unknown>,\n): z.ZodObject | null {\n const full = buildTranslatableSubschema(schema);\n if (!full) return null;\n\n const filtered: Record<string, z.ZodTypeAny> = {};\n for (const [key, childSchema] of Object.entries(full.shape)) {\n if (!(key in translatableFrontmatter)) continue;\n const value = translatableFrontmatter[key];\n if (value === undefined || value === null) continue;\n filtered[key] = childSchema as z.ZodTypeAny;\n }\n\n if (Object.keys(filtered).length === 0) return null;\n return z.object(filtered);\n}\n\n/**\n * JSON Schema for Gemini structured output: `{ frontmatter, body, slug? }`.\n * Types without translatable frontmatter get a body-only schema (Gemini\n * rejects OBJECT schemas with empty `properties`); parsing then defaults the\n * missing frontmatter to `{}`. Skipping the schema entirely instead would\n * leave the model free-handing JSON, which fails often on MDX bodies\n * (unescaped newlines, trailing prose after the JSON).\n */\nexport function buildGeminiResponseSchema(\n schema: z.ZodTypeAny,\n slugStrategy: SlugStrategy,\n translatableFrontmatter?: Record<string, unknown>,\n): Record<string, unknown> | null {\n try {\n const translatable =\n translatableFrontmatter !== undefined\n ? buildTranslatableSubschemaForPayload(schema, translatableFrontmatter)\n : buildTranslatableSubschema(schema);\n\n const responseShape: Record<string, z.ZodTypeAny> = {\n ...(translatable ? { frontmatter: translatable } : {}),\n body: z.string(),\n };\n if (slugStrategy === \"localized\") {\n responseShape.slug = z.string();\n }\n\n const jsonSchema = z.toJSONSchema(z.object(responseShape), {\n target: \"draft-2020-12\",\n unrepresentable: \"any\",\n io: \"output\",\n }) as Record<string, unknown>;\n delete jsonSchema.$schema;\n return jsonSchema;\n } catch {\n return null;\n }\n}\n","import type {\n ContentTypeConfig,\n ScribeConfig,\n ScribeTranslateDefaults,\n SlugStrategy,\n TranslateConfig,\n} from \"../core/types.js\";\n\nexport interface ResolvedTranslateConfig {\n promptOverride?: string;\n context?: string;\n rules: string[];\n model?: string;\n}\n\nconst BUILTIN_TRANSLATE_RULES = [\n \"Placeholders written as %%1%%, %%2%%, %%3%% (double percent signs around a number) are immutable. Reproduce each placeholder that appears in the source EXACTLY as-is, exactly once, and never translate, edit, renumber, or add spaces inside it. You may move a placeholder to a different position within its sentence when the target grammar requires it.\",\n \"Do not translate brand or product names unless the brand has a well-known localized name in the target market (rare). Keep the original spelling and capitalization.\",\n \"Return the MDX body with real line breaks; do not use JSON escape sequences like \\\\n or \\\\t in the body string.\",\n 'In JSX attributes (e.g. FaqItem question=\"...\"), use single quotes when the value contains double-quote characters (e.g. Hebrew דוא\"ל), or escape them as \\\\\".',\n \"Match the EN source format: when the EN body uses Markdown/MDX (headings, paragraphs, GFM tables, links), keep that structure in the translation. Do not convert markdown elements into raw HTML (<p>, <h2>, <table>, etc.).\",\n \"Otherwise match the format and components used in the EN source.\",\n];\n\nfunction slugStrategyRules(slugStrategy: SlugStrategy): string[] {\n if (slugStrategy === \"localized\") {\n return [\n \"Provide a URL slug in JSON field `slug` that is Localized into the target language.\",\n \"Base the slug on the meaning of the translated title — do NOT reuse the English slug words.\",\n \"Slug MUST be ASCII only: a-z, 0-9, hyphens. No uppercase, accents, underscores, or spaces.\",\n \"For non-Latin languages, write the words in the target language and transliterate them into Latin script (e.g. Russian -> romanized Russian, not English).\",\n \"Do NOT append locale codes to the slug (e.g. -fr, -he, -zh-cn). Locale routing is handled by the URL prefix, not the slug.\",\n \"Preserve 4-digit years and proper nouns in slugs.\",\n ];\n }\n return [\"Do NOT output a slug — slugStrategy is fixed.\"];\n}\n\nfunction mergeContext(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n): string | undefined {\n const parts = [project?.context, type?.context].filter(Boolean);\n return parts.length > 0 ? parts.join(\"\\n\\n\") : undefined;\n}\n\nfunction mergeTranslateConfig(\n project: ScribeTranslateDefaults | undefined,\n type: TranslateConfig | undefined,\n slugStrategy: SlugStrategy,\n): ResolvedTranslateConfig {\n return {\n promptOverride: type?.prompt ?? project?.prompt,\n context: mergeContext(project, type),\n rules: [\n ...BUILTIN_TRANSLATE_RULES,\n ...(project?.rules ?? []),\n ...(type?.rules ?? []),\n ...slugStrategyRules(slugStrategy),\n ],\n model: type?.model ?? project?.defaultModel,\n };\n}\n\n/** Merge project and content-type translation settings. */\nexport function resolveTranslateConfig(\n config: ScribeConfig,\n type: ContentTypeConfig,\n): ResolvedTranslateConfig {\n return mergeTranslateConfig(config.translate, type.translate, type.slugStrategy);\n}\n","import type { z } from \"zod\";\nimport type { ScribeDocument } from \"../core/types.js\";\nimport { mergeStructuralOntoLocale, pickTranslatable, pruneOrphanNestedTranslations } from \"../core/introspect-schema.js\";\n\nexport function formatZodIssues(error: z.ZodError): string {\n return error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n}\n\n/** Strip non-translatable keys from Gemini frontmatter output. */\nexport function sanitizeTranslatedFrontmatter(\n rawFrontmatter: Record<string, unknown>,\n schema: z.ZodTypeAny,\n): Record<string, unknown> {\n return pickTranslatable(rawFrontmatter, schema);\n}\n\n/** Validate locale frontmatter against the full content schema (merged with EN structural fields). */\nexport function validateTranslatedFrontmatter(\n enDoc: ScribeDocument,\n localeFrontmatter: Record<string, unknown>,\n typeSchema: z.ZodTypeAny,\n): { ok: true; frontmatter: Record<string, unknown> } | { ok: false; error: string } {\n const enFrontmatter = enDoc.frontmatter as Record<string, unknown>;\n const frontmatter = pruneOrphanNestedTranslations(\n sanitizeTranslatedFrontmatter(localeFrontmatter, typeSchema),\n enFrontmatter,\n typeSchema,\n );\n const merged = mergeStructuralOntoLocale(frontmatter, enFrontmatter, typeSchema);\n const parsed = typeSchema.safeParse(merged);\n if (!parsed.success) {\n return { ok: false, error: formatZodIssues(parsed.error) };\n }\n return { ok: true, frontmatter };\n}\n","import type { ScribeProject } from \"../core/types.js\";\nimport { isRoutableType, pathPrefix, createUrlBuilder } from \"../i18n/build-url.js\";\nimport { serializeMdx } from \"../loader/parse-mdx.js\";\n\nexport interface StaticRawExport {\n /** Path relative to the output root (e.g. `blog/foo.mdx`, `fr/glossary/bar.mdx`). */\n relativePath: string;\n /** Public URL pathname (e.g. `/blog/foo.mdx`, `/fr/glossary/bar.mdx`). */\n urlPath: string;\n locale: string;\n typeId: string;\n enSlug: string;\n /** Full MDX source (YAML frontmatter + body). */\n source: string;\n}\n\nexport interface BuildStaticRawExportsOptions {\n /** File extension including the dot. Default `.mdx`. */\n extension?: `.${string}`;\n /** Content type ids to export. Default: all routable types. */\n types?: string[];\n /** Locales to export. Default: `config.locales`. */\n locales?: readonly string[];\n /** Skip documents where `resolve()` sets `shouldRedirectTo`. Default `true`. */\n excludeRedirected?: boolean;\n /** Skip documents with `noindex: true`. Default `false`. */\n excludeNoindex?: boolean;\n}\n\nfunction normalizeExtension(ext: string): `.${string}` {\n return (ext.startsWith(\".\") ? ext : `.${ext}`) as `.${string}`;\n}\n\n/** Segment name for export directories, e.g. `blog` from `/blog/{slug}`. */\nexport function exportDirSegment(pathTemplate: string): string {\n const prefix = pathPrefix(pathTemplate);\n return prefix.replace(/^\\/+|\\/+$/g, \"\");\n}\n\n/**\n * Relative directory roots to clean before writing static exports.\n * EN: `{segment}/` (e.g. `blog/`). Prefixed locales: `{locale}/{segment}/`.\n */\nexport function getStaticExportRoots(\n project: ScribeProject,\n options: { types?: string[]; locales?: readonly string[] } = {},\n): string[] {\n const { config } = project;\n const locales = options.locales ?? config.locales;\n const typeFilter = options.types ? new Set(options.types) : null;\n const roots = new Set<string>();\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n const segment = exportDirSegment(type.config.path!);\n roots.add(`${segment}/`);\n for (const locale of locales) {\n if (locale === config.defaultLocale) continue;\n roots.add(`${locale}/${segment}/`);\n }\n }\n\n return [...roots].sort();\n}\n\n/** Build static raw MDX exports for all routable content types. */\nexport function buildStaticRawExports(\n project: ScribeProject,\n options: BuildStaticRawExportsOptions = {},\n): StaticRawExport[] {\n const { config } = project;\n const extension = normalizeExtension(options.extension ?? \".mdx\");\n const locales = options.locales ?? config.locales;\n const excludeRedirected = options.excludeRedirected ?? true;\n const excludeNoindex = options.excludeNoindex ?? false;\n const typeFilter = options.types ? new Set(options.types) : null;\n\n const out: StaticRawExport[] = [];\n const urlBuilder = createUrlBuilder(config);\n\n for (const type of project.listTypes()) {\n if (!isRoutableType(type.config)) continue;\n if (typeFilter && !typeFilter.has(type.id)) continue;\n\n const pathTemplate = type.config.path!;\n const all = type.load();\n const enIdx = all.get(config.defaultLocale);\n if (!enIdx) continue;\n\n for (const locale of locales) {\n for (const enDoc of enIdx.bySlug.values()) {\n const resolved = type.resolve(enDoc.slug, locale);\n if (!resolved.document) continue;\n if (excludeRedirected && resolved.shouldRedirectTo) continue;\n if (excludeNoindex && resolved.document.noindex) continue;\n\n const doc = resolved.document;\n const slugWithExt = `${doc.slug}${extension}`;\n const urlPath = urlBuilder.resolvePath(pathTemplate, slugWithExt, locale);\n\n out.push({\n relativePath: urlPath.slice(1),\n urlPath,\n locale,\n typeId: type.id,\n enSlug: doc.enSlug,\n source: serializeMdx(doc.frontmatter, doc.content),\n });\n }\n }\n }\n\n return out;\n}\n","import matter from \"gray-matter\";\n\nexport interface ParsedMdx {\n frontmatter: Record<string, unknown>;\n content: string;\n}\n\nexport function parseMdx(raw: string): ParsedMdx {\n const parsed = matter(raw);\n return {\n frontmatter: parsed.data as Record<string, unknown>,\n content: parsed.content,\n };\n}\n\nexport function serializeMdx(frontmatter: Record<string, unknown>, content: string): string {\n return matter.stringify(content, frontmatter);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport {\n buildStaticRawExports,\n getStaticExportRoots,\n type BuildStaticRawExportsOptions,\n} from \"./build-static-raw-exports.js\";\n\nexport interface WriteStaticRawExportsOptions extends BuildStaticRawExportsOptions {\n /** Output directory (typically `public`). Default `public`. */\n outDir?: string;\n}\n\nfunction rmDirIfExists(dir: string): void {\n if (fs.existsSync(dir)) {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/** Remove managed export roots, write fresh static raw MDX files, return exports written. */\nexport function writeStaticRawExports(\n project: ScribeProject,\n options: WriteStaticRawExportsOptions = {},\n): { exports: ReturnType<typeof buildStaticRawExports>; written: number } {\n const outDir = path.resolve(options.outDir ?? \"public\");\n const typeFilter = options.types;\n\n for (const root of getStaticExportRoots(project, {\n types: typeFilter,\n locales: options.locales,\n })) {\n rmDirIfExists(path.join(outDir, root));\n }\n\n const exports = buildStaticRawExports(project, options);\n const counts = new Map<string, number>();\n\n for (const item of exports) {\n const filePath = path.join(outDir, item.relativePath);\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n fs.writeFileSync(filePath, item.source, \"utf8\");\n const key = `${item.typeId}/${item.locale}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n for (const [key, count] of [...counts.entries()].sort()) {\n console.log(` ${key}: ${count}`);\n }\n\n return { exports, written: exports.length };\n}\n","import type { OnTargetDelete } from \"../core/field.js\";\nimport {\n listAssetFields,\n listRelationFields,\n type SchemaFieldMeta,\n} from \"../core/introspect-schema.js\";\nimport type { ScribeDocument, ScribeProject } from \"../core/types.js\";\nimport { extractInlineTokens } from \"../inline/tokens.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n countEnSnapshotsForEnSlug,\n countTranslationsForEnSlug,\n} from \"../storage/translations.js\";\n\n/**\n * Deletion planning for `scribe delete` (CLI + studio). One module computes the\n * full impact of deleting an entry — transitive cascades, reference detaches,\n * blockers, asset files, and store rows — so both surfaces render and execute\n * exactly the same plan. See `docs/deletion.md`.\n */\n\n/** The requested deletion (and any title for display). */\nexport interface DeletionRoot {\n typeId: string;\n enSlug: string;\n title?: string;\n}\n\n/** A document deleted transitively because it cascaded from a deleted target. */\nexport interface DeletionCascade {\n typeId: string;\n enSlug: string;\n /** Human-readable edge that pulled it in, e.g. `model=alice`. */\n via: string;\n}\n\n/** A surviving document whose reference to a deleted target is removed. */\nexport interface DeletionDetach {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n removedSlug: string;\n}\n\n/** A document that prevents the deletion (restrict, or a required single relation). */\nexport interface DeletionBlocker {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n reason: \"restrict\" | \"required-single\";\n}\n\n/** An asset file owned by a deleted document. */\nexport interface DeletionAsset {\n path: string;\n ownerTypeId: string;\n ownerEnSlug: string;\n action: \"delete\" | \"keep\";\n /** Why an asset is kept: config `onDelete: \"keep\"`, or a shared path referenced elsewhere. */\n reason?: \"config-keep\" | \"shared\";\n}\n\n/** Per-document store row counts removed by the deletion. */\nexport interface DeletionStoreCounts {\n typeId: string;\n enSlug: string;\n translations: number;\n snapshots: number;\n}\n\n/**\n * A surviving document whose MDX body references (via `${{relation:...}}`) a doc\n * in the deletion set. Body relation tokens never cascade, detach, or block —\n * they will simply dangle and become validation errors after the deletion.\n */\nexport interface BodyRefWarning {\n typeId: string;\n enSlug: string;\n targetTypeId: string;\n targetEnSlug: string;\n}\n\nexport interface DeletionPlan {\n roots: DeletionRoot[];\n cascades: DeletionCascade[];\n detaches: DeletionDetach[];\n blocked: DeletionBlocker[];\n assets: DeletionAsset[];\n store: DeletionStoreCounts[];\n /** Warn-only: surviving body references that will dangle after deletion. */\n bodyRefWarnings: BodyRefWarning[];\n}\n\n/** Whether a plan can be executed (no blockers). */\nexport function isPlanBlocked(plan: DeletionPlan): boolean {\n return plan.blocked.length > 0;\n}\n\n/** Every document the plan removes (roots first, then transitive cascades). */\nexport function deletedDocs(plan: DeletionPlan): Array<{ typeId: string; enSlug: string }> {\n return [\n ...plan.roots.map((r) => ({ typeId: r.typeId, enSlug: r.enSlug })),\n ...plan.cascades.map((c) => ({ typeId: c.typeId, enSlug: c.enSlug })),\n ];\n}\n\nfunction docKey(typeId: string, enSlug: string): string {\n return `${typeId}\\u0000${enSlug}`;\n}\n\n/** Collect the EN slugs a relation field points at (handles arrays and `*` paths). */\nfunction relationSlugsAt(frontmatter: Record<string, unknown>, path: string[]): string[] {\n const out: string[] = [];\n const walk = (container: unknown, remaining: string[]): void => {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n const value = record[head];\n if (Array.isArray(value)) {\n for (const slug of value) if (typeof slug === \"string\" && slug) out.push(slug);\n } else if (typeof value === \"string\" && value) {\n out.push(value);\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) for (const item of arr) walk(item, rest.slice(1));\n return;\n }\n walk(record[head], rest);\n };\n walk(frontmatter, path);\n return out;\n}\n\n/** Collect the source web paths a declared asset field resolves to (materializing templates). */\nfunction assetValuesAt(\n frontmatter: Record<string, unknown>,\n field: SchemaFieldMeta,\n enSlug: string,\n): string[] {\n const out: string[] = [];\n const walk = (container: unknown, remaining: string[]): void => {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n const value = record[head];\n if (typeof value === \"string\" && value) out.push(value);\n else if (value === undefined && field.assetTemplate) {\n out.push(field.assetTemplate.split(\"{slug}\").join(enSlug));\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) for (const item of arr) walk(item, rest.slice(1));\n return;\n }\n walk(record[head], rest);\n };\n walk(frontmatter, field.path);\n return out;\n}\n\ninterface Referrer {\n typeId: string;\n enSlug: string;\n fieldPath: string;\n multiple: boolean;\n optional: boolean;\n onTargetDelete: OnTargetDelete;\n}\n\ninterface DocRecord {\n typeId: string;\n enSlug: string;\n frontmatter: Record<string, unknown>;\n}\n\n/**\n * Compute the full deletion plan for one entry. Reads source (unresolved)\n * frontmatter from the project's cached document lists — no side effects. Store\n * row counts are read from the (read-only) SQLite store when it exists.\n */\nexport function buildDeletionPlan(\n project: ScribeProject,\n typeId: string,\n enSlug: string,\n): DeletionPlan {\n const rootType = (() => {\n try {\n return project.getType(typeId);\n } catch {\n return null;\n }\n })();\n if (!rootType) {\n throw new Error(`Unknown content type \"${typeId}\"`);\n }\n const rootDoc = rootType.get(enSlug);\n if (!rootDoc) {\n throw new Error(`No ${typeId} entry \"${enSlug}\"`);\n }\n\n // Snapshot every document's source frontmatter, plus per-type field metadata.\n const docByKey = new Map<string, DocRecord>();\n const relationFieldsByType = new Map<string, SchemaFieldMeta[]>();\n const assetFieldsByType = new Map<string, SchemaFieldMeta[]>();\n const referrers = new Map<string, Referrer[]>();\n const assetRefs = new Map<string, Set<string>>();\n // Every `${{relation:...}}` body reference, collected up front; filtered\n // against the deletion set once it is known.\n const bodyRelationRefs: BodyRefWarning[] = [];\n\n for (const type of project.listTypes()) {\n const relFields = listRelationFields(type.config.schema);\n const assetFields = listAssetFields(type.config.schema);\n relationFieldsByType.set(type.id, relFields);\n assetFieldsByType.set(type.id, assetFields);\n for (const doc of type.list() as ScribeDocument[]) {\n const frontmatter = doc.frontmatter as Record<string, unknown>;\n docByKey.set(docKey(type.id, doc.enSlug), {\n typeId: type.id,\n enSlug: doc.enSlug,\n frontmatter,\n });\n // Reverse relation index: (targetType, targetSlug) -> referrers.\n for (const field of relFields) {\n const target = field.relationTarget;\n if (!target) continue;\n for (const slug of relationSlugsAt(frontmatter, field.path)) {\n const list = referrers.get(docKey(target, slug)) ?? [];\n list.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n fieldPath: field.path.join(\".\"),\n multiple: Boolean(field.relationMultiple),\n optional: Boolean(field.relationOptional),\n onTargetDelete: field.relationOnTargetDelete ?? \"restrict\",\n });\n referrers.set(docKey(target, slug), list);\n }\n }\n // Asset reference graph (declared fields only), keyed by source web path.\n for (const field of assetFields) {\n for (const webPath of assetValuesAt(frontmatter, field, doc.enSlug)) {\n const set = assetRefs.get(webPath) ?? new Set<string>();\n set.add(docKey(type.id, doc.enSlug));\n assetRefs.set(webPath, set);\n }\n }\n // Body relation tokens: recorded now, filtered against the deletion set later.\n for (const token of extractInlineTokens(doc.content).tokens) {\n if (token.kind === \"relation\") {\n bodyRelationRefs.push({\n typeId: type.id,\n enSlug: doc.enSlug,\n targetTypeId: token.targetTypeId,\n targetEnSlug: token.enSlug,\n });\n }\n }\n }\n }\n\n // ---- Transitive cascade (cycle-safe: visited keyed by type + enSlug). ----\n const deleted = new Map<string, { typeId: string; enSlug: string; via?: string }>();\n deleted.set(docKey(typeId, enSlug), { typeId, enSlug });\n const queue: Array<{ typeId: string; enSlug: string }> = [{ typeId, enSlug }];\n while (queue.length > 0) {\n const current = queue.shift()!;\n for (const ref of referrers.get(docKey(current.typeId, current.enSlug)) ?? []) {\n if (ref.onTargetDelete !== \"cascade\") continue;\n const refKey = docKey(ref.typeId, ref.enSlug);\n if (deleted.has(refKey)) continue;\n deleted.set(refKey, {\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n via: `${ref.fieldPath}=${current.enSlug}`,\n });\n queue.push({ typeId: ref.typeId, enSlug: ref.enSlug });\n }\n }\n\n // ---- Detaches + blockers over surviving referrers of every deleted doc. ----\n const detaches: DeletionDetach[] = [];\n const blocked: DeletionBlocker[] = [];\n const seenDetach = new Set<string>();\n const seenBlock = new Set<string>();\n for (const del of deleted.values()) {\n for (const ref of referrers.get(docKey(del.typeId, del.enSlug)) ?? []) {\n // A referrer that is itself deleted loses the reference with its own file.\n if (deleted.has(docKey(ref.typeId, ref.enSlug))) continue;\n if (ref.onTargetDelete === \"restrict\") {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000restrict`;\n if (!seenBlock.has(k)) {\n seenBlock.add(k);\n blocked.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n reason: \"restrict\",\n });\n }\n } else if (ref.onTargetDelete === \"detach\") {\n const requiredSingle = !ref.multiple && !ref.optional;\n if (requiredSingle) {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000required-single`;\n if (!seenBlock.has(k)) {\n seenBlock.add(k);\n blocked.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n reason: \"required-single\",\n });\n }\n } else {\n const k = `${ref.typeId}\\u0000${ref.enSlug}\\u0000${ref.fieldPath}\\u0000${del.enSlug}`;\n if (!seenDetach.has(k)) {\n seenDetach.add(k);\n detaches.push({\n typeId: ref.typeId,\n enSlug: ref.enSlug,\n fieldPath: ref.fieldPath,\n removedSlug: del.enSlug,\n });\n }\n }\n }\n // cascade referrers are already in `deleted` and handled above.\n }\n }\n\n // ---- Assets owned by deleted docs. ----\n const assets: DeletionAsset[] = [];\n const seenAsset = new Set<string>();\n for (const del of deleted.values()) {\n const record = docByKey.get(docKey(del.typeId, del.enSlug));\n if (!record) continue;\n for (const field of assetFieldsByType.get(del.typeId) ?? []) {\n for (const webPath of assetValuesAt(record.frontmatter, field, del.enSlug)) {\n const dedupeKey = `${del.typeId}\\u0000${del.enSlug}\\u0000${webPath}`;\n if (seenAsset.has(dedupeKey)) continue;\n seenAsset.add(dedupeKey);\n if (field.assetOnDelete === \"keep\") {\n assets.push({\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"keep\",\n reason: \"config-keep\",\n });\n continue;\n }\n // Delete only when no surviving doc references the same path.\n const refs = assetRefs.get(webPath) ?? new Set<string>();\n let sharedOutside = false;\n for (const owner of refs) {\n if (!deleted.has(owner)) {\n sharedOutside = true;\n break;\n }\n }\n assets.push(\n sharedOutside\n ? {\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"keep\",\n reason: \"shared\",\n }\n : {\n path: webPath,\n ownerTypeId: del.typeId,\n ownerEnSlug: del.enSlug,\n action: \"delete\",\n },\n );\n }\n }\n }\n\n // ---- Store row counts (best-effort; store may not exist yet). ----\n const store: DeletionStoreCounts[] = [];\n try {\n const db = openStore(project.config, \"readonly\");\n try {\n for (const del of deleted.values()) {\n store.push({\n typeId: del.typeId,\n enSlug: del.enSlug,\n translations: countTranslationsForEnSlug(db, del.typeId, del.enSlug),\n snapshots: countEnSnapshotsForEnSlug(db, del.typeId, del.enSlug),\n });\n }\n } finally {\n db.close();\n }\n } catch {\n for (const del of deleted.values()) {\n store.push({ typeId: del.typeId, enSlug: del.enSlug, translations: 0, snapshots: 0 });\n }\n }\n\n const rootTitle = (() => {\n const title = (rootDoc.frontmatter as Record<string, unknown>).title;\n return typeof title === \"string\" && title.trim() ? title : undefined;\n })();\n\n const cascades: DeletionCascade[] = [];\n for (const del of deleted.values()) {\n if (del.typeId === typeId && del.enSlug === enSlug) continue;\n cascades.push({ typeId: del.typeId, enSlug: del.enSlug, via: del.via ?? \"\" });\n }\n\n // Body references that point INTO the deletion set from a SURVIVING document\n // will dangle. Never block or mutate execution — warn only.\n const bodyRefWarnings = bodyRelationRefs.filter(\n (ref) =>\n deleted.has(docKey(ref.targetTypeId, ref.targetEnSlug)) &&\n !deleted.has(docKey(ref.typeId, ref.enSlug)),\n );\n\n return {\n roots: [{ typeId, enSlug, title: rootTitle }],\n cascades,\n detaches,\n blocked,\n assets,\n store,\n bodyRefWarnings,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport { listRelationFields, type SchemaFieldMeta } from \"../core/introspect-schema.js\";\nimport type { ScribeProject } from \"../core/types.js\";\nimport { bumpContentVersion } from \"../loader/create-loader.js\";\nimport { openStore } from \"../storage/sqlite.js\";\nimport {\n deleteEnSnapshotsForEnSlug,\n deleteTranslationsForEnSlug,\n} from \"../storage/translations.js\";\nimport { deletedDocs, isPlanBlocked, type DeletionPlan } from \"./plan.js\";\n\nexport interface ExecuteDeletionResult {\n /** EN files removed from disk. */\n deletedFiles: string[];\n /** Asset files removed from disk. */\n deletedAssets: string[];\n /** EN files rewritten to drop a detached reference. */\n detachedFiles: string[];\n /** Translation rows removed from the store. */\n translationsDeleted: number;\n /** EN snapshot rows removed from the store. */\n snapshotsDeleted: number;\n}\n\n/** Locate the on-disk EN file for a document, trying `.mdx` then `.md`. */\nfunction enFilePath(rootDir: string, contentDir: string, enSlug: string): string | null {\n for (const ext of [\".mdx\", \".md\"]) {\n const candidate = path.join(rootDir, contentDir, `${enSlug}${ext}`);\n if (fs.existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n/**\n * Rewrite the frontmatter block of a raw MDX string, leaving the body bytes\n * exactly as they were. The YAML is re-serialized (minor reformatting is\n * acceptable); everything after the closing `---` line is preserved verbatim.\n */\nfunction rewriteFrontmatter(raw: string, data: Record<string, unknown>): string {\n const match = raw.match(/^()?---[ \\t]*\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*(\\r?\\n|$)/);\n if (!match) {\n throw new Error(\"Cannot rewrite frontmatter: no leading YAML block found\");\n }\n const bom = match[1] ?? \"\";\n const body = raw.slice(match[0].length);\n const serialized = matter.stringify(\"\", data);\n const blockMatch = serialized.match(/^---[ \\t]*\\r?\\n[\\s\\S]*?\\r?\\n---[ \\t]*\\r?\\n/);\n const block = blockMatch ? blockMatch[0] : serialized;\n return `${bom}${block}${body}`;\n}\n\n/** Remove a detached slug at a relation field path (handles arrays and `*` paths). */\nfunction removeSlugAtPath(\n container: unknown,\n remaining: string[],\n removedSlug: string,\n multiple: boolean,\n): void {\n const [head, ...rest] = remaining;\n if (head === undefined) return;\n if (typeof container !== \"object\" || container === null || Array.isArray(container)) return;\n const record = container as Record<string, unknown>;\n if (rest.length === 0) {\n if (multiple) {\n const value = record[head];\n if (Array.isArray(value)) {\n record[head] = value.filter((slug) => slug !== removedSlug);\n }\n } else if (record[head] === removedSlug) {\n // Optional single relation: clear it only when it points at the deleted target.\n delete record[head];\n }\n return;\n }\n if (rest[0] === \"*\") {\n const arr = record[head];\n if (Array.isArray(arr)) {\n for (const item of arr) removeSlugAtPath(item, rest.slice(1), removedSlug, multiple);\n }\n return;\n }\n removeSlugAtPath(record[head], rest, removedSlug, multiple);\n}\n\n/**\n * Execute a deletion plan: remove EN files, delete asset files, rewrite detach\n * references, and clean up store rows. Refuses to run while the plan is blocked.\n * Performs exactly the plan and nothing else.\n */\nexport function executeDeletionPlan(\n project: ScribeProject,\n plan: DeletionPlan,\n): ExecuteDeletionResult {\n if (isPlanBlocked(plan)) {\n throw new Error(\"Refusing to execute a blocked deletion plan\");\n }\n\n const config = project.config;\n const result: ExecuteDeletionResult = {\n deletedFiles: [],\n deletedAssets: [],\n detachedFiles: [],\n translationsDeleted: 0,\n snapshotsDeleted: 0,\n };\n\n // 1. Detach rewrites first (grouped by referring file), before the referenced\n // files vanish. Body bytes are preserved.\n const detachesByFile = new Map<string, typeof plan.detaches>();\n for (const detach of plan.detaches) {\n const key = `${detach.typeId} ${detach.enSlug}`;\n const list = detachesByFile.get(key) ?? [];\n list.push(detach);\n detachesByFile.set(key, list);\n }\n for (const [, detaches] of detachesByFile) {\n const { typeId, enSlug } = detaches[0]!;\n const type = project.getType(typeId);\n const file = enFilePath(config.rootDir, type.config.contentDir, enSlug);\n if (!file) continue;\n const fieldByPath = new Map<string, SchemaFieldMeta>(\n listRelationFields(type.config.schema).map((f) => [f.path.join(\".\"), f]),\n );\n const raw = fs.readFileSync(file, \"utf8\");\n // gray-matter caches its parse result per input string; clone before mutating\n // so we never corrupt that shared object.\n const data = structuredClone(matter(raw).data) as Record<string, unknown>;\n for (const detach of detaches) {\n const field = fieldByPath.get(detach.fieldPath);\n if (!field) continue;\n removeSlugAtPath(\n data,\n detach.fieldPath.split(\".\"),\n detach.removedSlug,\n Boolean(field.relationMultiple),\n );\n }\n fs.writeFileSync(file, rewriteFrontmatter(raw, data), \"utf8\");\n result.detachedFiles.push(file);\n }\n\n // 2. Delete asset files (only those the plan marks for deletion).\n const assetsDir = config.assets?.assetsPath ?? config.assetsPath;\n for (const asset of plan.assets) {\n if (asset.action !== \"delete\") continue;\n if (!assetsDir) continue;\n const root = path.resolve(assetsDir);\n const relative = asset.path.replace(/^\\/+/, \"\");\n const abs = path.resolve(root, relative);\n const rootWithSep = root.endsWith(path.sep) ? root : root + path.sep;\n if (abs !== root && !abs.startsWith(rootWithSep)) continue;\n if (fs.existsSync(abs)) {\n fs.rmSync(abs, { force: true });\n result.deletedAssets.push(abs);\n }\n }\n\n // 3. Delete EN files.\n for (const doc of deletedDocs(plan)) {\n const type = project.getType(doc.typeId);\n const file = enFilePath(config.rootDir, type.config.contentDir, doc.enSlug);\n if (file && fs.existsSync(file)) {\n fs.rmSync(file, { force: true });\n result.deletedFiles.push(file);\n }\n }\n\n // 4. Store cleanup: translation rows + EN snapshots for every deleted doc.\n const db = openStore(config, \"readwrite\");\n try {\n for (const doc of deletedDocs(plan)) {\n result.translationsDeleted += deleteTranslationsForEnSlug(db, doc.typeId, doc.enSlug);\n result.snapshotsDeleted += deleteEnSnapshotsForEnSlug(db, doc.typeId, doc.enSlug);\n }\n } finally {\n db.close();\n }\n\n // Force every in-process content loader to rebuild on next read so the deleted\n // (and detached) docs disappear immediately, bypassing the dev revalidation\n // window and the studio's fingerprint-keyed derived cache.\n bumpContentVersion();\n\n return result;\n}\n","import type { DeletionPlan } from \"./plan.js\";\n\n/**\n * Render a deletion plan as grouped plain text for the CLI. Sections: header,\n * cascades, detaches, assets, store counts, and blockers. No em dashes.\n */\nexport function renderDeletionPlanText(plan: DeletionPlan): string {\n const lines: string[] = [];\n const root = plan.roots[0];\n const rootLabel = root\n ? `${root.typeId}/${root.enSlug}${root.title ? ` (${root.title})` : \"\"}`\n : \"(unknown)\";\n lines.push(`Deletion plan for ${rootLabel}`);\n\n lines.push(\"\");\n lines.push(`Cascades (${plan.cascades.length}):`);\n if (plan.cascades.length === 0) {\n lines.push(\" none\");\n } else {\n for (const c of plan.cascades) {\n lines.push(` ${c.typeId}/${c.enSlug}${c.via ? ` via ${c.via}` : \"\"}`);\n }\n }\n\n lines.push(\"\");\n lines.push(`Detaches (${plan.detaches.length}):`);\n if (plan.detaches.length === 0) {\n lines.push(\" none\");\n } else {\n for (const d of plan.detaches) {\n lines.push(` ${d.typeId}/${d.enSlug} . ${d.fieldPath} drops \"${d.removedSlug}\"`);\n }\n }\n\n const toDelete = plan.assets.filter((a) => a.action === \"delete\");\n const toKeep = plan.assets.filter((a) => a.action === \"keep\");\n lines.push(\"\");\n lines.push(`Assets (${toDelete.length} to delete, ${toKeep.length} kept):`);\n if (plan.assets.length === 0) {\n lines.push(\" none\");\n } else {\n for (const a of toDelete) lines.push(` delete ${a.path}`);\n for (const a of toKeep) {\n const why = a.reason === \"shared\" ? \"shared\" : \"keep\";\n lines.push(` keep ${a.path} (${why})`);\n }\n }\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 lines.push(\"\");\n lines.push(\n `Store rows: ${totalTranslations} translation(s), ${totalSnapshots} snapshot(s) across ${plan.store.length} document(s).`,\n );\n\n if (plan.bodyRefWarnings.length > 0) {\n lines.push(\"\");\n lines.push(\n `Body references (${plan.bodyRefWarnings.length}): these will dangle and become validation errors:`,\n );\n for (const w of plan.bodyRefWarnings) {\n lines.push(` ${w.typeId}/${w.enSlug} body -> ${w.targetTypeId}/${w.targetEnSlug}`);\n }\n }\n\n if (plan.blocked.length > 0) {\n lines.push(\"\");\n lines.push(`Blockers (${plan.blocked.length}):`);\n for (const b of plan.blocked) {\n const why =\n b.reason === \"required-single\"\n ? \"required single relation cannot be detached\"\n : \"restrict\";\n lines.push(` ${b.typeId}/${b.enSlug} . ${b.fieldPath} (${why})`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport dotenv from \"dotenv\";\n\nconst ENV_FILES = [\".env\", \".env.local\"] as const;\n\n/** Load `.env` then `.env.local` from cwd; existing process env wins. */\nexport function loadEnvFromCwd(cwd: string): void {\n for (const file of ENV_FILES) {\n const envPath = path.join(/* turbopackIgnore: true */ cwd, file);\n if (!fs.existsSync(envPath)) continue;\n dotenv.config({ path: envPath, override: false });\n }\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","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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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 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\";\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 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 { 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 { CancelPromptError } from \"@inquirer/core\";\nimport { checkbox, select } from \"@inquirer/prompts\";\nimport type { ScribeConfig } from \"../src/core/types.js\";\n\nimport type { TranslateMode } from \"../src/translate/page-translator.js\";\nimport type { TranslationWorklistStrategy } from \"../src/translate/worklist.js\";\n\nexport interface TranslateSelection {\n contentType?: string;\n preset?: string;\n locale?: string[];\n strategy?: TranslationWorklistStrategy;\n mode?: TranslateMode;\n}\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nfunction nonDefaultLocales(config: ScribeConfig): string[] {\n return config.locales.filter((locale) => locale !== config.defaultLocale);\n}\n\nasync function runPrompt<T>(prompt: Promise<T>): Promise<T> {\n try {\n return await prompt;\n } catch (error) {\n if (error instanceof CancelPromptError) process.exit(0);\n throw error;\n }\n}\n\nasync function promptContentType(config: ScribeConfig): Promise<string | undefined> {\n return runPrompt(\n select<string | undefined>({\n message: \"Content type to translate\",\n choices: [\n { name: \"All content types\", value: undefined },\n ...config.types.map((type) => ({ name: type.id, value: type.id })),\n ],\n }),\n );\n}\n\n/** Sentinel select values that are not preset names. */\nconst ALL_LOCALES = Symbol(\"all-locales\");\nconst PICK_LOCALES = Symbol(\"pick-locales\");\n\nasync function promptManualLocales(config: ScribeConfig): Promise<Pick<TranslateSelection, \"locale\">> {\n const locales = nonDefaultLocales(config);\n if (locales.length <= 1) return {};\n\n const picked = await runPrompt(\n checkbox({\n message: \"Locales to translate\",\n choices: locales.map((locale) => ({ name: locale, value: locale, checked: true })),\n validate: (values) => values.length > 0 || \"Pick at least one locale\",\n }),\n );\n return picked.length === locales.length ? {} : { locale: picked };\n}\n\nasync function promptLocalePreset(config: ScribeConfig): Promise<Pick<TranslateSelection, \"preset\" | \"locale\">> {\n const presets = Object.entries(config.localePresets ?? {}).filter(\n (entry): entry is [string, string[]] => Array.isArray(entry[1]),\n );\n\n if (presets.length === 0) {\n return promptManualLocales(config);\n }\n\n const choice = await runPrompt(\n select<string | typeof ALL_LOCALES | typeof PICK_LOCALES>({\n message: \"Locale preset\",\n choices: [\n { name: \"All locales\", value: ALL_LOCALES },\n ...presets.map(([name, locales]) => ({\n name: `${name} (${locales.join(\", \")})`,\n value: name,\n })),\n { name: \"Choose locales manually…\", value: PICK_LOCALES },\n ],\n }),\n );\n\n if (choice === PICK_LOCALES) return promptManualLocales(config);\n if (choice === ALL_LOCALES) return {};\n return { preset: choice };\n}\n\nasync function promptStrategy(): Promise<TranslationWorklistStrategy> {\n return runPrompt(\n select<TranslationWorklistStrategy>({\n message: \"Translation strategy\",\n choices: [\n { name: \"Stale and missing\", value: \"all\" },\n { name: \"Missing only (skip stale)\", value: \"missing-only\" },\n ],\n default: \"all\",\n }),\n );\n}\n\nasync function promptMode(): Promise<TranslateMode> {\n return runPrompt(\n select<TranslateMode>({\n message: \"Translation mode\",\n choices: [\n { name: \"Batch — 50% cheaper, async, resumable (recommended)\", value: \"batch\" },\n { name: \"Direct — immediate results, full price\", value: \"direct\" },\n ],\n default: \"batch\",\n }),\n );\n}\n\n/** Prompt for content type and locale preset when flags are omitted in a TTY. */\nexport async function promptTranslateSelection(\n config: ScribeConfig,\n flags: {\n type?: string;\n preset?: string;\n locale?: string[];\n strategy?: TranslationWorklistStrategy;\n mode?: TranslateMode;\n },\n): Promise<TranslateSelection> {\n const selection: TranslateSelection = {\n contentType: flags.type,\n preset: flags.preset,\n locale: flags.locale,\n strategy: flags.strategy,\n mode: flags.mode,\n };\n\n if (!isInteractive()) return selection;\n\n if (!selection.contentType) {\n selection.contentType = await promptContentType(config);\n }\n\n if (!selection.preset && !selection.locale?.length) {\n Object.assign(selection, await promptLocalePreset(config));\n }\n\n if (!selection.strategy) {\n selection.strategy = await promptStrategy();\n }\n\n if (!selection.mode) {\n selection.mode = await promptMode();\n }\n\n return selection;\n}\n","import type {\n TranslatePageResult,\n TranslateProgressEvent,\n TranslateWorklistTotals,\n} from \"../src/translate/page-translator.js\";\nimport { formatTokenCount, formatUsd } from \"../src/translate/gemini-pricing.js\";\n\nconst dim = (text: string) => `\\x1b[2m${text}\\x1b[0m`;\nconst green = (text: string) => `\\x1b[32m${text}\\x1b[0m`;\nconst yellow = (text: string) => `\\x1b[33m${text}\\x1b[0m`;\nconst red = (text: string) => `\\x1b[31m${text}\\x1b[0m`;\nconst cyan = (text: string) => `\\x1b[36m${text}\\x1b[0m`;\n\nfunction isInteractive(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nfunction progressBar(ratio: number, width = 28): string {\n const clamped = Math.max(0, Math.min(1, ratio));\n const filled = Math.round(clamped * width);\n return `${\"█\".repeat(filled)}${\"░\".repeat(width - filled)}`;\n}\n\nfunction labelForResult(result: TranslatePageResult): string {\n return `${result.contentType}/${result.enSlug}@${result.locale}`;\n}\n\n/** Last path segment of a Gemini job name: \"batches/abc123\" -> \"abc123\". */\nfunction shortJobId(name: string): string {\n const segments = name.split(\"/\");\n return segments[segments.length - 1] || name;\n}\n\nfunction formatElapsed(elapsedMs: number): string {\n return `${Math.round(elapsedMs / 1000)}s`;\n}\n\n/**\n * Build the per-job completion summary shown once a batch job is ingested:\n * short id, model, request count, translated/failed counts, tokens, cost.\n */\nfunction batchDoneParts(event: Extract<TranslateProgressEvent, { type: \"batch-done\" }>): string {\n if (event.alreadyIngested) {\n return [\n `job ${shortJobId(event.name)}`,\n event.model ?? \"?\",\n \"already ingested by another scribe run (results saved there)\",\n formatElapsed(event.elapsedMs),\n ].join(\" · \");\n }\n const parts = [\n `job ${shortJobId(event.name)}`,\n event.model ?? \"?\",\n `${event.count} request${event.count === 1 ? \"\" : \"s\"}`,\n `${event.translated} translated`,\n ];\n if (event.failed > 0) parts.push(`${event.failed} failed`);\n parts.push(`${formatTokenCount(event.inputTokens)} in / ${formatTokenCount(event.outputTokens)} out`);\n parts.push(`${formatUsd(event.estimatedCostUsd)} est.`);\n parts.push(formatElapsed(event.elapsedMs));\n return parts.join(\" · \");\n}\n\nfunction statusForResult(result: TranslatePageResult, dryRun: boolean): string {\n if (result.failed) return red(\"failed\");\n if (result.skipped) return dim(\"skipped\");\n if (dryRun) return yellow(\"would translate\");\n return green(\"translated\");\n}\n\nfunction slugAdjustedMessage(result: TranslatePageResult): string | undefined {\n if (!result.slugAdjusted) return undefined;\n const { from, to, matchedCode } = result.slugAdjusted;\n return yellow(\n `slug adjusted: \"${from}\" → \"${to}\" (stripped -${matchedCode})`,\n );\n}\n\nfunction detailForResult(result: TranslatePageResult): string {\n const parts: string[] = [];\n const slugMsg = slugAdjustedMessage(result);\n if (slugMsg) parts.push(slugMsg);\n if (result.durationMs !== undefined) parts.push(`${(result.durationMs / 1000).toFixed(1)}s`);\n if (result.usage) {\n parts.push(`${formatTokenCount(result.usage.inputTokens)} in`);\n parts.push(`${formatTokenCount(result.usage.outputTokens)} out`);\n }\n if (result.estimatedCostUsd !== undefined) parts.push(formatUsd(result.estimatedCostUsd));\n if (result.error) parts.push(red(result.error));\n return parts.length > 0 ? dim(parts.join(\" · \")) : \"\";\n}\n\nfunction formatSummaryLine(\n totals: TranslateWorklistTotals,\n dryRun: boolean,\n retriedTranslated = 0,\n): string {\n const action = dryRun ? \"Would translate\" : \"Translated\";\n const base = totals.translated - retriedTranslated;\n const parts = [\n retriedTranslated > 0\n ? `${action} ${base} +${retriedTranslated} on retry`\n : `${action} ${totals.translated}`,\n `skipped ${totals.skipped}`,\n ];\n if (totals.failed > 0) parts.push(red(`failed ${totals.failed}`));\n parts.push(`${formatTokenCount(totals.inputTokens)} in / ${formatTokenCount(totals.outputTokens)} out`);\n parts.push(`${formatUsd(totals.estimatedCostUsd)} est.`);\n parts.push(`${(totals.durationMs / 1000).toFixed(1)}s`);\n return parts.join(\" · \");\n}\n\nexport interface TranslateProgressReporter {\n onEvent: (event: TranslateProgressEvent) => void;\n finish: () => void;\n}\n\nexport function createTranslateProgressReporter(options: {\n enabled?: boolean;\n dryRun?: boolean;\n recentLimit?: number;\n} = {}): TranslateProgressReporter {\n const enabled = options.enabled ?? isInteractive();\n const dryRun = Boolean(options.dryRun);\n const recentLimit = options.recentLimit ?? 6;\n\n if (!enabled) {\n return {\n onEvent(event) {\n if (event.type === \"batch-submitted\") {\n const verb = event.resumed ? \"Resuming\" : \"Submitted\";\n console.log(\n `${verb} batch job ${event.jobIndex + 1}/${event.jobCount} with ${event.count} request${event.count === 1 ? \"\" : \"s\"}${event.model ? ` (${event.model})` : \"\"}: ${event.name}`,\n );\n return;\n }\n if (event.type === \"batch-polling\") {\n console.log(\n `batch ${event.jobIndex + 1}/${event.jobCount} ${shortJobId(event.name)}: ${event.state.replace(/^JOB_STATE_/, \"\")} (${formatElapsed(event.elapsedMs)} elapsed)`,\n );\n return;\n }\n if (event.type === \"batch-done\") {\n const line = `batch ${event.jobIndex + 1}/${event.jobCount} ${event.state} · ${batchDoneParts(event)}`;\n if (event.failed > 0 && event.translated === 0) console.error(line);\n else console.log(line);\n return;\n }\n if (event.type === \"item-done\") {\n const label = labelForResult(event.result);\n const status = statusForResult(event.result, dryRun);\n const detail = detailForResult(event.result);\n console.log(`${label}: ${status}${detail ? ` (${detail.replace(/\\x1b\\[[0-9;]*m/g, \"\")})` : \"\"}`);\n const slugMsg = slugAdjustedMessage(event.result);\n if (slugMsg) {\n console.log(`[warning] ${labelForResult(event.result)} ${slugMsg.replace(/\\x1b\\[[0-9;]*m/g, \"\")}`);\n }\n if (event.result.failed && event.result.error) {\n console.error(event.result.error);\n }\n return;\n }\n if (event.type === \"retry-start\") {\n for (const result of event.failed) {\n console.log(`${labelForResult(result)}: ${result.error ?? \"failed\"}`);\n }\n console.log(`Retrying ${event.failed.length} failed items with validation context...`);\n return;\n }\n if (event.type === \"done\") {\n console.log(formatSummaryLine(event.totals, dryRun, event.retriedTranslated));\n for (const result of event.results.filter((entry) => entry.failed)) {\n console.error(`${labelForResult(result)}: ${result.error ?? \"failed\"}`);\n }\n }\n },\n finish() {},\n };\n }\n\n let total = 0;\n let concurrency = 1;\n let model: string | undefined;\n let done = 0;\n let inputTokens = 0;\n let outputTokens = 0;\n let estimatedCostUsd = 0;\n let active: string[] = [];\n let mode: \"batch\" | \"direct\" | undefined;\n const batchJobs = new Map<\n string,\n { state: string; count: number; model?: string; createdAtMs?: number; elapsedMs: number }\n >();\n let batchElapsedMs = 0;\n const recent: TranslatePageResult[] = [];\n let renderedLines = 0;\n let cursorHidden = false;\n\n function hideCursor(): void {\n if (!cursorHidden) {\n process.stdout.write(\"\\x1b[?25l\");\n cursorHidden = true;\n }\n }\n\n function showCursor(): void {\n if (cursorHidden) {\n process.stdout.write(\"\\x1b[?25h\");\n cursorHidden = false;\n }\n }\n\n /**\n * Print permanent line(s) above the live status area: rewind over the current\n * render, clear it, write the lines with newlines (they scroll up and stay),\n * then let the next render() redraw the live area beneath them.\n */\n function printPersistent(lines: string[]): void {\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n for (const line of lines) {\n process.stdout.write(\"\\x1b[2K\" + line + \"\\n\");\n }\n renderedLines = 0;\n }\n\n function render(): void {\n hideCursor();\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n\n const lines: string[] = [];\n const title = dryRun ? \"Dry run\" : \"Translating\";\n const isBatch = mode === \"batch\" || batchJobs.size > 0;\n lines.push(\n cyan(`${title} ${done}/${total}`) +\n dim(isBatch ? \" · batch\" : ` · ${concurrency} parallel`) +\n (model ? dim(` · ${model}`) : \"\"),\n );\n lines.push(progressBar(total === 0 ? 0 : done / total) + dim(` ${Math.round(total === 0 ? 0 : (done / total) * 100)}%`));\n lines.push(\n dim(\"Tokens \") +\n `${formatTokenCount(inputTokens)} in · ${formatTokenCount(outputTokens)} out` +\n dim(\" · Cost \") +\n formatUsd(estimatedCostUsd) +\n dim(\" est.\"),\n );\n\n if (batchJobs.size > 0 && done < total) {\n const terminal = /^(SUCCEEDED|FAILED|CANCELLED|EXPIRED|PARTIALLY_SUCCEEDED)$/;\n let running = 0;\n let finished = 0;\n let requests = 0;\n for (const job of batchJobs.values()) {\n if (terminal.test(job.state)) finished += 1;\n else running += 1;\n requests += job.count;\n }\n lines.push(\n dim(\"Batches \") +\n `${running} running · ${finished} done` +\n dim(` · ${requests} request${requests === 1 ? \"\" : \"s\"} · ${Math.round(batchElapsedMs / 1000)}s elapsed`),\n );\n // One detail line per still-pending job: short id, model, requests, state,\n // elapsed since its own submission (anchored to created_at upstream).\n for (const [name, job] of batchJobs) {\n if (terminal.test(job.state)) continue;\n lines.push(\n dim(\" \") +\n shortJobId(name) +\n dim(` · ${job.model ?? \"?\"} · ${job.count} req · `) +\n job.state +\n dim(` · ${formatElapsed(job.elapsedMs)}`),\n );\n }\n } else if (active.length > 0) {\n lines.push(dim(\"Active \") + active.slice(0, 3).join(\", \") + (active.length > 3 ? dim(` +${active.length - 3}`) : \"\"));\n } else if (done < total) {\n lines.push(dim(\"Active \") + \"starting…\");\n } else {\n lines.push(\"\");\n }\n\n lines.push(\"\");\n if (recent.length === 0) {\n lines.push(dim(\"Waiting for first page…\"));\n } else {\n for (const result of recent) {\n const detail = detailForResult(result);\n lines.push(`${statusForResult(result, dryRun)} ${labelForResult(result)}${detail ? ` ${detail}` : \"\"}`);\n }\n }\n\n for (const line of lines) {\n process.stdout.write(\"\\x1b[2K\" + line + \"\\n\");\n }\n renderedLines = lines.length;\n }\n\n return {\n onEvent(event) {\n switch (event.type) {\n case \"start\":\n total = event.total;\n concurrency = event.concurrency;\n model = event.model;\n mode = event.mode;\n render();\n break;\n case \"item-start\":\n active = event.active;\n render();\n break;\n case \"batch-submitted\": {\n const createdAtMs = event.createdAt ? Date.parse(event.createdAt) : undefined;\n const elapsedMs =\n createdAtMs && !Number.isNaN(createdAtMs) ? Date.now() - createdAtMs : 0;\n batchJobs.set(event.name, {\n state: event.resumed ? \"RESUMED\" : \"SUBMITTED\",\n count: event.count,\n model: event.model,\n createdAtMs: Number.isNaN(createdAtMs) ? undefined : createdAtMs,\n elapsedMs,\n });\n // Persist a line per job so it stays visible after the live area is\n // redrawn — otherwise a run that adopts jobs from a previous run\n // gives no clue where its jobs came from.\n const requests = `${event.count} ${event.resumed ? \"pending \" : \"\"}request${event.count === 1 ? \"\" : \"s\"}`;\n const origin = event.resumed\n ? `resumed job (submitted ${formatElapsed(elapsedMs)} ago)`\n : \"submitted job\";\n printPersistent([\n dim(`${event.resumed ? \"↻\" : \"→\"} ${origin} ${shortJobId(event.name)} · ${event.model ?? \"?\"} · ${requests}`),\n ]);\n render();\n break;\n }\n case \"batch-polling\": {\n const job = batchJobs.get(event.name);\n batchJobs.set(event.name, {\n state: event.state.replace(/^JOB_STATE_/, \"\"),\n count: job?.count ?? 0,\n model: job?.model,\n createdAtMs: job?.createdAtMs,\n elapsedMs: event.elapsedMs,\n });\n batchElapsedMs = Math.max(batchElapsedMs, event.elapsedMs);\n render();\n break;\n }\n case \"batch-done\": {\n const job = batchJobs.get(event.name);\n batchJobs.set(event.name, {\n state: event.state.replace(/^JOB_STATE_/, \"\"),\n count: job?.count ?? event.count,\n model: job?.model ?? event.model,\n createdAtMs: job?.createdAtMs,\n elapsedMs: event.elapsedMs,\n });\n const marker = event.failed > 0 && event.translated === 0 ? red(\"✗\") : green(\"✓\");\n printPersistent([`${marker} ${dim(batchDoneParts(event))}`]);\n render();\n break;\n }\n case \"item-done\": {\n done += 1;\n active = active.filter((label) => label !== labelForResult(event.result));\n inputTokens += event.result.usage?.inputTokens ?? 0;\n outputTokens += event.result.usage?.outputTokens ?? 0;\n estimatedCostUsd += event.result.estimatedCostUsd ?? 0;\n recent.unshift(event.result);\n recent.splice(recentLimit);\n render();\n break;\n }\n case \"retry-start\": {\n // Retry items produce a second round of item-done events; extend the\n // total so the progress bar does not overshoot 100%.\n total += event.failed.length;\n // Print the failure recap as persistent lines above the live area,\n // then the \"Retrying…\" banner. done resets below to track retry items.\n printPersistent([\n ...event.failed.map((result) =>\n red(`${labelForResult(result)}: ${result.error ?? \"failed\"}`),\n ),\n cyan(`Retrying ${event.failed.length} failed items with validation context...`),\n ]);\n render();\n break;\n }\n case \"done\":\n showCursor();\n if (renderedLines > 0) {\n process.stdout.write(`\\x1b[${renderedLines}A`);\n }\n process.stdout.write(\n \"\\x1b[2K\" +\n green(\"Done\") +\n \" · \" +\n formatSummaryLine(event.totals, dryRun, event.retriedTranslated) +\n \"\\n\",\n );\n renderedLines = 0;\n for (const result of event.results.filter((entry) => entry.failed)) {\n process.stdout.write(\"\\x1b[2K\" + red(`${labelForResult(result)}: ${result.error ?? \"failed\"}`) + \"\\n\");\n }\n for (const result of event.results.filter((entry) => entry.slugAdjusted)) {\n const slugMsg = slugAdjustedMessage(result);\n if (slugMsg) {\n process.stdout.write(\n \"\\x1b[2K\" + yellow(`[warning] ${labelForResult(result)} ${slugMsg.replace(/\\x1b\\[[0-9;]*m/g, \"\")}`) + \"\\n\",\n );\n }\n }\n break;\n }\n },\n finish() {\n showCursor();\n },\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** Package version from the nearest `scribe-cms` package.json (works from source or dist). */\nexport function readScribeVersion(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (;;) {\n const candidate = path.join(dir, \"package.json\");\n if (fs.existsSync(candidate)) {\n const pkg = JSON.parse(fs.readFileSync(candidate, \"utf8\")) as {\n name?: string;\n version?: string;\n };\n if (pkg.name === \"scribe-cms\" && pkg.version) return pkg.version;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return \"unknown\";\n}\n\nexport const SCRIBE_VERSION = readScribeVersion();\n"]}
|