gazetta 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/admin-dist/assets/index-CBeq0rRb.js +693 -0
- package/admin-dist/assets/index-Dtg1dTZQ.css +1 -0
- package/admin-dist/assets/rolldown-runtime-BYbx6iT9.js +1 -0
- package/admin-dist/assets/{vendor-primevue-C0Q_YTCb.js → vendor-primevue-CBGHkaXv.js} +183 -39
- package/admin-dist/assets/{vendor-react-BipDVGow.js → vendor-react-BdW_kNCG.js} +2 -2
- package/admin-dist/assets/vendor-rjsf-lN2SztQt.js +33 -0
- package/admin-dist/assets/vendor-tiptap-C36yDquB.js +141 -0
- package/admin-dist/assets/vendor-vue-Bt5uR1VW.js +1 -0
- package/admin-dist/assets/workbox-window.prod.es5-DGMtIXHc.js +2 -0
- package/admin-dist/index.html +8 -8
- package/admin-dist/sw.js +1 -0
- package/dist/admin-api/archived-name-conflict.d.ts +31 -0
- package/dist/admin-api/archived-name-conflict.d.ts.map +1 -0
- package/dist/admin-api/archived-name-conflict.js +226 -0
- package/dist/admin-api/archived-name-conflict.js.map +1 -0
- package/dist/admin-api/cache-stats-logger.d.ts +83 -0
- package/dist/admin-api/cache-stats-logger.d.ts.map +1 -0
- package/dist/admin-api/cache-stats-logger.js +59 -0
- package/dist/admin-api/cache-stats-logger.js.map +1 -0
- package/dist/admin-api/hook-audit-emitter.d.ts +38 -0
- package/dist/admin-api/hook-audit-emitter.d.ts.map +1 -0
- package/dist/admin-api/hook-audit-emitter.js +21 -0
- package/dist/admin-api/hook-audit-emitter.js.map +1 -0
- package/dist/admin-api/index.d.ts +84 -0
- package/dist/admin-api/index.d.ts.map +1 -1
- package/dist/admin-api/index.js +254 -9
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/middleware/audit.d.ts +25 -0
- package/dist/admin-api/middleware/audit.d.ts.map +1 -0
- package/dist/admin-api/middleware/audit.js +65 -0
- package/dist/admin-api/middleware/audit.js.map +1 -0
- package/dist/admin-api/middleware/capability.d.ts +8 -0
- package/dist/admin-api/middleware/capability.d.ts.map +1 -0
- package/dist/admin-api/middleware/capability.js +65 -0
- package/dist/admin-api/middleware/capability.js.map +1 -0
- package/dist/admin-api/middleware/principal.d.ts +18 -0
- package/dist/admin-api/middleware/principal.d.ts.map +1 -0
- package/dist/admin-api/middleware/principal.js +128 -0
- package/dist/admin-api/middleware/principal.js.map +1 -0
- package/dist/admin-api/routes/archive-review.d.ts +80 -0
- package/dist/admin-api/routes/archive-review.d.ts.map +1 -0
- package/dist/admin-api/routes/archive-review.js +70 -0
- package/dist/admin-api/routes/archive-review.js.map +1 -0
- package/dist/admin-api/routes/archive.d.ts +145 -0
- package/dist/admin-api/routes/archive.d.ts.map +1 -0
- package/dist/admin-api/routes/archive.js +540 -0
- package/dist/admin-api/routes/archive.js.map +1 -0
- package/dist/admin-api/routes/assets.d.ts +6 -1
- package/dist/admin-api/routes/assets.d.ts.map +1 -1
- package/dist/admin-api/routes/assets.js +167 -14
- package/dist/admin-api/routes/assets.js.map +1 -1
- package/dist/admin-api/routes/audit.d.ts +71 -0
- package/dist/admin-api/routes/audit.d.ts.map +1 -0
- package/dist/admin-api/routes/audit.js +178 -0
- package/dist/admin-api/routes/audit.js.map +1 -0
- package/dist/admin-api/routes/compare.d.ts.map +1 -1
- package/dist/admin-api/routes/compare.js +3 -2
- package/dist/admin-api/routes/compare.js.map +1 -1
- package/dist/admin-api/routes/fields.d.ts.map +1 -1
- package/dist/admin-api/routes/fields.js +2 -1
- package/dist/admin-api/routes/fields.js.map +1 -1
- package/dist/admin-api/routes/fragments.d.ts +13 -1
- package/dist/admin-api/routes/fragments.d.ts.map +1 -1
- package/dist/admin-api/routes/fragments.js +127 -92
- package/dist/admin-api/routes/fragments.js.map +1 -1
- package/dist/admin-api/routes/health.d.ts +60 -0
- package/dist/admin-api/routes/health.d.ts.map +1 -0
- package/dist/admin-api/routes/health.js +65 -0
- package/dist/admin-api/routes/health.js.map +1 -0
- package/dist/admin-api/routes/history.d.ts +2 -1
- package/dist/admin-api/routes/history.d.ts.map +1 -1
- package/dist/admin-api/routes/history.js +26 -4
- package/dist/admin-api/routes/history.js.map +1 -1
- package/dist/admin-api/routes/pages.d.ts +20 -1
- package/dist/admin-api/routes/pages.d.ts.map +1 -1
- package/dist/admin-api/routes/pages.js +157 -117
- package/dist/admin-api/routes/pages.js.map +1 -1
- package/dist/admin-api/routes/preview.d.ts.map +1 -1
- package/dist/admin-api/routes/preview.js +56 -17
- package/dist/admin-api/routes/preview.js.map +1 -1
- package/dist/admin-api/routes/publish.d.ts +19 -1
- package/dist/admin-api/routes/publish.d.ts.map +1 -1
- package/dist/admin-api/routes/publish.js +508 -92
- package/dist/admin-api/routes/publish.js.map +1 -1
- package/dist/admin-api/routes/rename.d.ts +62 -0
- package/dist/admin-api/routes/rename.d.ts.map +1 -0
- package/dist/admin-api/routes/rename.js +366 -0
- package/dist/admin-api/routes/rename.js.map +1 -0
- package/dist/admin-api/routes/site.d.ts.map +1 -1
- package/dist/admin-api/routes/site.js +6 -18
- package/dist/admin-api/routes/site.js.map +1 -1
- package/dist/admin-api/routes/system.d.ts +23 -0
- package/dist/admin-api/routes/system.d.ts.map +1 -0
- package/dist/admin-api/routes/system.js +115 -0
- package/dist/admin-api/routes/system.js.map +1 -0
- package/dist/admin-api/routes/templates.d.ts +11 -1
- package/dist/admin-api/routes/templates.d.ts.map +1 -1
- package/dist/admin-api/routes/templates.js +36 -3
- package/dist/admin-api/routes/templates.js.map +1 -1
- package/dist/admin-api/routes/validation.d.ts +47 -0
- package/dist/admin-api/routes/validation.d.ts.map +1 -0
- package/dist/admin-api/routes/validation.js +120 -0
- package/dist/admin-api/routes/validation.js.map +1 -0
- package/dist/admin-api/schemas/archive.d.ts +124 -0
- package/dist/admin-api/schemas/archive.d.ts.map +1 -0
- package/dist/admin-api/schemas/archive.js +93 -0
- package/dist/admin-api/schemas/archive.js.map +1 -0
- package/dist/admin-api/schemas/assets.d.ts +16 -0
- package/dist/admin-api/schemas/assets.d.ts.map +1 -1
- package/dist/admin-api/schemas/assets.js +15 -0
- package/dist/admin-api/schemas/assets.js.map +1 -1
- package/dist/admin-api/schemas/audit.d.ts +175 -0
- package/dist/admin-api/schemas/audit.d.ts.map +1 -0
- package/dist/admin-api/schemas/audit.js +91 -0
- package/dist/admin-api/schemas/audit.js.map +1 -0
- package/dist/admin-api/schemas/error.d.ts +94 -0
- package/dist/admin-api/schemas/error.d.ts.map +1 -0
- package/dist/admin-api/schemas/error.js +79 -0
- package/dist/admin-api/schemas/error.js.map +1 -0
- package/dist/admin-api/schemas/fragments.d.ts +2 -0
- package/dist/admin-api/schemas/fragments.d.ts.map +1 -1
- package/dist/admin-api/schemas/fragments.js +4 -0
- package/dist/admin-api/schemas/fragments.js.map +1 -1
- package/dist/admin-api/schemas/index.d.ts +8 -0
- package/dist/admin-api/schemas/index.d.ts.map +1 -1
- package/dist/admin-api/schemas/index.js +8 -0
- package/dist/admin-api/schemas/index.js.map +1 -1
- package/dist/admin-api/schemas/pages.d.ts +2 -0
- package/dist/admin-api/schemas/pages.d.ts.map +1 -1
- package/dist/admin-api/schemas/pages.js +11 -0
- package/dist/admin-api/schemas/pages.js.map +1 -1
- package/dist/admin-api/schemas/rename.d.ts +77 -0
- package/dist/admin-api/schemas/rename.d.ts.map +1 -0
- package/dist/admin-api/schemas/rename.js +75 -0
- package/dist/admin-api/schemas/rename.js.map +1 -0
- package/dist/admin-api/schemas/site.d.ts +3 -2
- package/dist/admin-api/schemas/site.d.ts.map +1 -1
- package/dist/admin-api/schemas/site.js +3 -2
- package/dist/admin-api/schemas/site.js.map +1 -1
- package/dist/admin-api/schemas/system.d.ts +28 -0
- package/dist/admin-api/schemas/system.d.ts.map +1 -0
- package/dist/admin-api/schemas/system.js +35 -0
- package/dist/admin-api/schemas/system.js.map +1 -0
- package/dist/admin-api/schemas/targets.d.ts +55 -0
- package/dist/admin-api/schemas/targets.d.ts.map +1 -1
- package/dist/admin-api/schemas/targets.js +46 -0
- package/dist/admin-api/schemas/targets.js.map +1 -1
- package/dist/admin-api/schemas/templates.d.ts +54 -0
- package/dist/admin-api/schemas/templates.d.ts.map +1 -1
- package/dist/admin-api/schemas/templates.js +21 -0
- package/dist/admin-api/schemas/templates.js.map +1 -1
- package/dist/admin-api/schemas/validation.d.ts +101 -0
- package/dist/admin-api/schemas/validation.d.ts.map +1 -0
- package/dist/admin-api/schemas/validation.js +57 -0
- package/dist/admin-api/schemas/validation.js.map +1 -0
- package/dist/admin-api/source-context.d.ts +66 -10
- package/dist/admin-api/source-context.d.ts.map +1 -1
- package/dist/admin-api/source-context.js +43 -5
- package/dist/admin-api/source-context.js.map +1 -1
- package/dist/ai/adapter-scaffold.d.ts +63 -0
- package/dist/ai/adapter-scaffold.d.ts.map +1 -0
- package/dist/ai/adapter-scaffold.js +89 -0
- package/dist/ai/adapter-scaffold.js.map +1 -0
- package/dist/ai/compose-prompt.d.ts +50 -0
- package/dist/ai/compose-prompt.d.ts.map +1 -0
- package/dist/ai/compose-prompt.js +49 -0
- package/dist/ai/compose-prompt.js.map +1 -0
- package/dist/ai/errors.d.ts +65 -0
- package/dist/ai/errors.d.ts.map +1 -0
- package/dist/ai/errors.js +59 -0
- package/dist/ai/errors.js.map +1 -0
- package/dist/ai/index.d.ts +17 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +16 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/provider.d.ts +76 -0
- package/dist/ai/provider.d.ts.map +1 -0
- package/dist/ai/provider.js +13 -0
- package/dist/ai/provider.js.map +1 -0
- package/dist/ai/refusal.d.ts +50 -0
- package/dist/ai/refusal.d.ts.map +1 -0
- package/dist/ai/refusal.js +100 -0
- package/dist/ai/refusal.js.map +1 -0
- package/dist/ai/vision-prep.d.ts +32 -0
- package/dist/ai/vision-prep.d.ts.map +1 -0
- package/dist/ai/vision-prep.js +113 -0
- package/dist/ai/vision-prep.js.map +1 -0
- package/dist/alt/adapter.d.ts +140 -0
- package/dist/alt/adapter.d.ts.map +1 -0
- package/dist/alt/adapter.js +7 -0
- package/dist/alt/adapter.js.map +1 -0
- package/dist/alt/anthropic.d.ts +63 -0
- package/dist/alt/anthropic.d.ts.map +1 -0
- package/dist/alt/anthropic.js +147 -0
- package/dist/alt/anthropic.js.map +1 -0
- package/dist/alt/config.d.ts +67 -0
- package/dist/alt/config.d.ts.map +1 -0
- package/dist/alt/config.js +41 -0
- package/dist/alt/config.js.map +1 -0
- package/dist/alt/factory.d.ts +19 -0
- package/dist/alt/factory.d.ts.map +1 -0
- package/dist/alt/factory.js +69 -0
- package/dist/alt/factory.js.map +1 -0
- package/dist/alt/null-adapter.d.ts +3 -0
- package/dist/alt/null-adapter.d.ts.map +1 -0
- package/dist/alt/null-adapter.js +43 -0
- package/dist/alt/null-adapter.js.map +1 -0
- package/dist/alt/ollama.d.ts +40 -0
- package/dist/alt/ollama.d.ts.map +1 -0
- package/dist/alt/ollama.js +139 -0
- package/dist/alt/ollama.js.map +1 -0
- package/dist/alt/openai.d.ts +46 -0
- package/dist/alt/openai.d.ts.map +1 -0
- package/dist/alt/openai.js +118 -0
- package/dist/alt/openai.js.map +1 -0
- package/dist/alt/prompt-policies.d.ts +79 -0
- package/dist/alt/prompt-policies.d.ts.map +1 -0
- package/dist/alt/prompt-policies.js +67 -0
- package/dist/alt/prompt-policies.js.map +1 -0
- package/dist/alt/route-handler.d.ts +56 -0
- package/dist/alt/route-handler.d.ts.map +1 -0
- package/dist/alt/route-handler.js +122 -0
- package/dist/alt/route-handler.js.map +1 -0
- package/dist/alt/suggester.d.ts +57 -0
- package/dist/alt/suggester.d.ts.map +1 -0
- package/dist/alt/suggester.js +133 -0
- package/dist/alt/suggester.js.map +1 -0
- package/dist/app.js +1 -1
- package/dist/app.js.map +1 -1
- package/dist/archive-aliases.d.ts +79 -0
- package/dist/archive-aliases.d.ts.map +1 -0
- package/dist/archive-aliases.js +60 -0
- package/dist/archive-aliases.js.map +1 -0
- package/dist/archive-helpers.d.ts +73 -0
- package/dist/archive-helpers.d.ts.map +1 -0
- package/dist/archive-helpers.js +94 -0
- package/dist/archive-helpers.js.map +1 -0
- package/dist/assets/find-refs.d.ts +1 -1
- package/dist/assets/find-refs.js +1 -1
- package/dist/assets/find-refs.js.map +1 -1
- package/dist/assets/rename.js +1 -1
- package/dist/assets/rename.js.map +1 -1
- package/dist/assets/replace.js +1 -1
- package/dist/assets/replace.js.map +1 -1
- package/dist/assets/resolve.js +4 -4
- package/dist/assets/resolve.js.map +1 -1
- package/dist/assets/serve-route.js +2 -2
- package/dist/assets/serve-route.js.map +1 -1
- package/dist/assets/validate.d.ts +1 -1
- package/dist/assets/validate.js +1 -1
- package/dist/audit/config.d.ts +75 -0
- package/dist/audit/config.d.ts.map +1 -0
- package/dist/audit/config.js +91 -0
- package/dist/audit/config.js.map +1 -0
- package/dist/audit/context.d.ts +98 -0
- package/dist/audit/context.d.ts.map +1 -0
- package/dist/audit/context.js +51 -0
- package/dist/audit/context.js.map +1 -0
- package/dist/audit/errors.d.ts +73 -0
- package/dist/audit/errors.d.ts.map +1 -0
- package/dist/audit/errors.js +78 -0
- package/dist/audit/errors.js.map +1 -0
- package/dist/audit/index.d.ts +16 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +10 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/provider.d.ts +73 -0
- package/dist/audit/provider.d.ts.map +1 -0
- package/dist/audit/provider.js +2 -0
- package/dist/audit/provider.js.map +1 -0
- package/dist/audit/providers/history.d.ts +66 -0
- package/dist/audit/providers/history.d.ts.map +1 -0
- package/dist/audit/providers/history.js +102 -0
- package/dist/audit/providers/history.js.map +1 -0
- package/dist/audit/pseudonymize.d.ts +26 -0
- package/dist/audit/pseudonymize.d.ts.map +1 -0
- package/dist/audit/pseudonymize.js +86 -0
- package/dist/audit/pseudonymize.js.map +1 -0
- package/dist/audit/recorder.d.ts +102 -0
- package/dist/audit/recorder.d.ts.map +1 -0
- package/dist/audit/recorder.js +55 -0
- package/dist/audit/recorder.js.map +1 -0
- package/dist/audit/retention.d.ts +83 -0
- package/dist/audit/retention.d.ts.map +1 -0
- package/dist/audit/retention.js +142 -0
- package/dist/audit/retention.js.map +1 -0
- package/dist/audit/source-ip.d.ts +32 -0
- package/dist/audit/source-ip.d.ts.map +1 -0
- package/dist/audit/source-ip.js +164 -0
- package/dist/audit/source-ip.js.map +1 -0
- package/dist/audit/types.d.ts +143 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +33 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/audit/user-agent.d.ts +28 -0
- package/dist/audit/user-agent.d.ts.map +1 -0
- package/dist/audit/user-agent.js +63 -0
- package/dist/audit/user-agent.js.map +1 -0
- package/dist/auth/capabilities.d.ts +28 -0
- package/dist/auth/capabilities.d.ts.map +1 -0
- package/dist/auth/capabilities.js +101 -0
- package/dist/auth/capabilities.js.map +1 -0
- package/dist/auth/config.d.ts +109 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +221 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/errors.d.ts +72 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +78 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/factory.d.ts +43 -0
- package/dist/auth/factory.d.ts.map +1 -0
- package/dist/auth/factory.js +48 -0
- package/dist/auth/factory.js.map +1 -0
- package/dist/auth/index.d.ts +21 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/ip-match.d.ts +29 -0
- package/dist/auth/ip-match.d.ts.map +1 -0
- package/dist/auth/ip-match.js +162 -0
- package/dist/auth/ip-match.js.map +1 -0
- package/dist/auth/provider.d.ts +76 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +2 -0
- package/dist/auth/provider.js.map +1 -0
- package/dist/auth/providers/aws-cognito.d.ts +55 -0
- package/dist/auth/providers/aws-cognito.d.ts.map +1 -0
- package/dist/auth/providers/aws-cognito.js +114 -0
- package/dist/auth/providers/aws-cognito.js.map +1 -0
- package/dist/auth/providers/azure-easy-auth.d.ts +7 -0
- package/dist/auth/providers/azure-easy-auth.d.ts.map +1 -0
- package/dist/auth/providers/azure-easy-auth.js +48 -0
- package/dist/auth/providers/azure-easy-auth.js.map +1 -0
- package/dist/auth/providers/cloudflare-access.d.ts +71 -0
- package/dist/auth/providers/cloudflare-access.d.ts.map +1 -0
- package/dist/auth/providers/cloudflare-access.js +120 -0
- package/dist/auth/providers/cloudflare-access.js.map +1 -0
- package/dist/auth/providers/forwarded-user.d.ts +31 -0
- package/dist/auth/providers/forwarded-user.d.ts.map +1 -0
- package/dist/auth/providers/forwarded-user.js +72 -0
- package/dist/auth/providers/forwarded-user.js.map +1 -0
- package/dist/auth/providers/none.d.ts +6 -0
- package/dist/auth/providers/none.d.ts.map +1 -0
- package/dist/auth/providers/none.js +19 -0
- package/dist/auth/providers/none.js.map +1 -0
- package/dist/auth/providers/tailscale.d.ts +7 -0
- package/dist/auth/providers/tailscale.d.ts.map +1 -0
- package/dist/auth/providers/tailscale.js +30 -0
- package/dist/auth/providers/tailscale.js.map +1 -0
- package/dist/auth/role-resolver.d.ts +38 -0
- package/dist/auth/role-resolver.d.ts.map +1 -0
- package/dist/auth/role-resolver.js +92 -0
- package/dist/auth/role-resolver.js.map +1 -0
- package/dist/auth/types.d.ts +150 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +60 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cache/errors.d.ts +41 -0
- package/dist/cache/errors.d.ts.map +1 -0
- package/dist/cache/errors.js +44 -0
- package/dist/cache/errors.js.map +1 -0
- package/dist/cache/factories.d.ts +17 -0
- package/dist/cache/factories.d.ts.map +1 -0
- package/dist/cache/factories.js +17 -0
- package/dist/cache/factories.js.map +1 -0
- package/dist/cache/keys.d.ts +63 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +145 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/memory.d.ts +51 -0
- package/dist/cache/memory.d.ts.map +1 -0
- package/dist/cache/memory.js +204 -0
- package/dist/cache/memory.js.map +1 -0
- package/dist/cache/per-site.d.ts +22 -0
- package/dist/cache/per-site.d.ts.map +1 -0
- package/dist/cache/per-site.js +114 -0
- package/dist/cache/per-site.js.map +1 -0
- package/dist/cache/types.d.ts +142 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +33 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cli/archive.d.ts +44 -0
- package/dist/cli/archive.d.ts.map +1 -0
- package/dist/cli/archive.js +310 -0
- package/dist/cli/archive.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +15 -8
- package/dist/cli/bootstrap.d.ts.map +1 -1
- package/dist/cli/bootstrap.js +59 -23
- package/dist/cli/bootstrap.js.map +1 -1
- package/dist/cli/dev-template-watcher.d.ts +29 -0
- package/dist/cli/dev-template-watcher.d.ts.map +1 -0
- package/dist/cli/dev-template-watcher.js +38 -0
- package/dist/cli/dev-template-watcher.js.map +1 -0
- package/dist/cli/history.d.ts.map +1 -1
- package/dist/cli/history.js +5 -3
- package/dist/cli/history.js.map +1 -1
- package/dist/cli/index.js +712 -395
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/validate-flags.d.ts +29 -0
- package/dist/cli/validate-flags.d.ts.map +1 -0
- package/dist/cli/validate-flags.js +49 -0
- package/dist/cli/validate-flags.js.map +1 -0
- package/dist/compare.d.ts +1 -1
- package/dist/compare.d.ts.map +1 -1
- package/dist/compare.js +25 -23
- package/dist/compare.js.map +1 -1
- package/dist/component-ids.d.ts +25 -0
- package/dist/component-ids.d.ts.map +1 -0
- package/dist/component-ids.js +83 -0
- package/dist/component-ids.js.map +1 -0
- package/dist/config/define.d.ts +61 -0
- package/dist/config/define.d.ts.map +1 -0
- package/dist/config/define.js +64 -0
- package/dist/config/define.js.map +1 -0
- package/dist/config/errors.d.ts +32 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +40 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +20 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +105 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +265 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schemas.d.ts +89 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +172 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/config/types.d.ts +32 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +15 -0
- package/dist/config/types.js.map +1 -0
- package/dist/deploy/cloudflare-workers.d.ts +46 -0
- package/dist/deploy/cloudflare-workers.d.ts.map +1 -0
- package/dist/deploy/cloudflare-workers.js +213 -0
- package/dist/deploy/cloudflare-workers.js.map +1 -0
- package/dist/deploy/errors.d.ts +66 -0
- package/dist/deploy/errors.d.ts.map +1 -0
- package/dist/deploy/errors.js +82 -0
- package/dist/deploy/errors.js.map +1 -0
- package/dist/deploy/index.d.ts +9 -0
- package/dist/deploy/index.d.ts.map +1 -0
- package/dist/deploy/index.js +3 -0
- package/dist/deploy/index.js.map +1 -0
- package/dist/deploy/types.d.ts +162 -0
- package/dist/deploy/types.d.ts.map +1 -0
- package/dist/deploy/types.js +2 -0
- package/dist/deploy/types.js.map +1 -0
- package/dist/fragments/create.d.ts +70 -0
- package/dist/fragments/create.d.ts.map +1 -0
- package/dist/fragments/create.js +93 -0
- package/dist/fragments/create.js.map +1 -0
- package/dist/fragments/publish.d.ts +37 -0
- package/dist/fragments/publish.d.ts.map +1 -0
- package/dist/fragments/publish.js +52 -0
- package/dist/fragments/publish.js.map +1 -0
- package/dist/fragments/save.d.ts +81 -0
- package/dist/fragments/save.d.ts.map +1 -0
- package/dist/fragments/save.js +105 -0
- package/dist/fragments/save.js.map +1 -0
- package/dist/history-recorder.d.ts +5 -5
- package/dist/history-recorder.d.ts.map +1 -1
- package/dist/history-recorder.js +4 -4
- package/dist/history-recorder.js.map +1 -1
- package/dist/history-restorer.js +2 -2
- package/dist/history-restorer.js.map +1 -1
- package/dist/history.d.ts +1 -1
- package/dist/hooks/audit-emitter.d.ts +73 -0
- package/dist/hooks/audit-emitter.d.ts.map +1 -0
- package/dist/hooks/audit-emitter.js +13 -0
- package/dist/hooks/audit-emitter.js.map +1 -0
- package/dist/hooks/context.d.ts +78 -0
- package/dist/hooks/context.d.ts.map +1 -0
- package/dist/hooks/context.js +56 -0
- package/dist/hooks/context.js.map +1 -0
- package/dist/hooks/contribution.d.ts +90 -0
- package/dist/hooks/contribution.d.ts.map +1 -0
- package/dist/hooks/contribution.js +2 -0
- package/dist/hooks/contribution.js.map +1 -0
- package/dist/hooks/dispatch.d.ts +30 -0
- package/dist/hooks/dispatch.d.ts.map +1 -0
- package/dist/hooks/dispatch.js +252 -0
- package/dist/hooks/dispatch.js.map +1 -0
- package/dist/hooks/errors.d.ts +100 -0
- package/dist/hooks/errors.d.ts.map +1 -0
- package/dist/hooks/errors.js +103 -0
- package/dist/hooks/errors.js.map +1 -0
- package/dist/hooks/index.d.ts +15 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/registry.d.ts +53 -0
- package/dist/hooks/registry.d.ts.map +1 -0
- package/dist/hooks/registry.js +139 -0
- package/dist/hooks/registry.js.map +1 -0
- package/dist/hooks/storage.d.ts +43 -0
- package/dist/hooks/storage.d.ts.map +1 -0
- package/dist/hooks/storage.js +2 -0
- package/dist/hooks/storage.js.map +1 -0
- package/dist/hooks/types.d.ts +324 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +26 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -5
- package/dist/index.js.map +1 -1
- package/dist/locale.d.ts +5 -1
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +6 -2
- package/dist/locale.js.map +1 -1
- package/dist/manifest-save.d.ts +255 -0
- package/dist/manifest-save.d.ts.map +1 -0
- package/dist/manifest-save.js +260 -0
- package/dist/manifest-save.js.map +1 -0
- package/dist/manifest.d.ts +1 -2
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +43 -44
- package/dist/manifest.js.map +1 -1
- package/dist/node-floor.d.ts +3 -0
- package/dist/node-floor.d.ts.map +1 -0
- package/dist/node-floor.js +3 -0
- package/dist/node-floor.js.map +1 -0
- package/dist/pages/create.d.ts +103 -0
- package/dist/pages/create.d.ts.map +1 -0
- package/dist/pages/create.js +117 -0
- package/dist/pages/create.js.map +1 -0
- package/dist/pages/publish.d.ts +59 -0
- package/dist/pages/publish.d.ts.map +1 -0
- package/dist/pages/publish.js +78 -0
- package/dist/pages/publish.js.map +1 -0
- package/dist/pages/save.d.ts +97 -0
- package/dist/pages/save.d.ts.map +1 -0
- package/dist/pages/save.js +138 -0
- package/dist/pages/save.js.map +1 -0
- package/dist/providers/factories.d.ts +65 -0
- package/dist/providers/factories.d.ts.map +1 -0
- package/dist/providers/factories.js +189 -0
- package/dist/providers/factories.js.map +1 -0
- package/dist/publish-item.d.ts +225 -0
- package/dist/publish-item.d.ts.map +1 -0
- package/dist/publish-item.js +210 -0
- package/dist/publish-item.js.map +1 -0
- package/dist/publish-rendered.d.ts.map +1 -1
- package/dist/publish-rendered.js +75 -6
- package/dist/publish-rendered.js.map +1 -1
- package/dist/publish-renderers.d.ts +132 -0
- package/dist/publish-renderers.d.ts.map +1 -0
- package/dist/publish-renderers.js +240 -0
- package/dist/publish-renderers.js.map +1 -0
- package/dist/publish-run.d.ts +223 -0
- package/dist/publish-run.d.ts.map +1 -0
- package/dist/publish-run.js +307 -0
- package/dist/publish-run.js.map +1 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +1 -10
- package/dist/publish.js.map +1 -1
- package/dist/render-for-analysis.d.ts +24 -0
- package/dist/render-for-analysis.d.ts.map +1 -0
- package/dist/render-for-analysis.js +146 -0
- package/dist/render-for-analysis.js.map +1 -0
- package/dist/resolver.d.ts.map +1 -1
- package/dist/resolver.js +47 -23
- package/dist/resolver.js.map +1 -1
- package/dist/runtime/archive-marker.d.ts +62 -0
- package/dist/runtime/archive-marker.d.ts.map +1 -0
- package/dist/runtime/archive-marker.js +88 -0
- package/dist/runtime/archive-marker.js.map +1 -0
- package/dist/runtime/capability-gap-warnings.d.ts +42 -0
- package/dist/runtime/capability-gap-warnings.d.ts.map +1 -0
- package/dist/runtime/capability-gap-warnings.js +28 -0
- package/dist/runtime/capability-gap-warnings.js.map +1 -0
- package/dist/runtime/redirects-emit.d.ts +93 -0
- package/dist/runtime/redirects-emit.d.ts.map +1 -0
- package/dist/runtime/redirects-emit.js +89 -0
- package/dist/runtime/redirects-emit.js.map +1 -0
- package/dist/runtime/runtime-capabilities.d.ts +79 -0
- package/dist/runtime/runtime-capabilities.d.ts.map +1 -0
- package/dist/runtime/runtime-capabilities.js +60 -0
- package/dist/runtime/runtime-capabilities.js.map +1 -0
- package/dist/save-etag.d.ts +69 -0
- package/dist/save-etag.d.ts.map +1 -0
- package/dist/save-etag.js +118 -0
- package/dist/save-etag.js.map +1 -0
- package/dist/site-loader.d.ts +42 -4
- package/dist/site-loader.d.ts.map +1 -1
- package/dist/site-loader.js +27 -8
- package/dist/site-loader.js.map +1 -1
- package/dist/targets.d.ts +21 -12
- package/dist/targets.d.ts.map +1 -1
- package/dist/targets.js +27 -95
- package/dist/targets.js.map +1 -1
- package/dist/testing/admin-cache-contract.d.ts +52 -0
- package/dist/testing/admin-cache-contract.d.ts.map +1 -0
- package/dist/testing/admin-cache-contract.js +203 -0
- package/dist/testing/admin-cache-contract.js.map +1 -0
- package/dist/testing/index.d.ts +11 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/transforms/factories.d.ts +16 -0
- package/dist/transforms/factories.d.ts.map +1 -0
- package/dist/transforms/factories.js +18 -0
- package/dist/transforms/factories.js.map +1 -0
- package/dist/transforms/index.d.ts +10 -17
- package/dist/transforms/index.d.ts.map +1 -1
- package/dist/transforms/index.js +4 -28
- package/dist/transforms/index.js.map +1 -1
- package/dist/transforms/sharp.d.ts +15 -1
- package/dist/transforms/sharp.d.ts.map +1 -1
- package/dist/transforms/sharp.js +34 -20
- package/dist/transforms/sharp.js.map +1 -1
- package/dist/types.d.ts +379 -52
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +20 -1
- package/dist/types.js.map +1 -1
- package/dist/validation/alt-required-walker.d.ts +27 -0
- package/dist/validation/alt-required-walker.d.ts.map +1 -0
- package/dist/validation/alt-required-walker.js +108 -0
- package/dist/validation/alt-required-walker.js.map +1 -0
- package/dist/validation/default-registry.d.ts +12 -0
- package/dist/validation/default-registry.d.ts.map +1 -0
- package/dist/validation/default-registry.js +55 -0
- package/dist/validation/default-registry.js.map +1 -0
- package/dist/validation/publish-audit.d.ts +44 -0
- package/dist/validation/publish-audit.d.ts.map +1 -0
- package/dist/validation/publish-audit.js +64 -0
- package/dist/validation/publish-audit.js.map +1 -0
- package/dist/validation/registry.d.ts +23 -0
- package/dist/validation/registry.d.ts.map +1 -0
- package/dist/validation/registry.js +15 -0
- package/dist/validation/registry.js.map +1 -0
- package/dist/validation/save-delta.d.ts +46 -0
- package/dist/validation/save-delta.d.ts.map +1 -0
- package/dist/validation/save-delta.js +57 -0
- package/dist/validation/save-delta.js.map +1 -0
- package/dist/validation/scanner.d.ts +91 -0
- package/dist/validation/scanner.d.ts.map +1 -0
- package/dist/validation/scanner.js +327 -0
- package/dist/validation/scanner.js.map +1 -0
- package/dist/validation/template-impact.d.ts +52 -0
- package/dist/validation/template-impact.d.ts.map +1 -0
- package/dist/validation/template-impact.js +53 -0
- package/dist/validation/template-impact.js.map +1 -0
- package/dist/validation/types.d.ts +123 -0
- package/dist/validation/types.d.ts.map +1 -0
- package/dist/validation/types.js +7 -0
- package/dist/validation/types.js.map +1 -0
- package/dist/validation/validators/accessibility.d.ts +3 -0
- package/dist/validation/validators/accessibility.d.ts.map +1 -0
- package/dist/validation/validators/accessibility.js +106 -0
- package/dist/validation/validators/accessibility.js.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts +40 -0
- package/dist/validation/validators/aliasof-points-to-archived.d.ts.map +1 -0
- package/dist/validation/validators/aliasof-points-to-archived.js +34 -0
- package/dist/validation/validators/aliasof-points-to-archived.js.map +1 -0
- package/dist/validation/validators/alt-required.d.ts +3 -0
- package/dist/validation/validators/alt-required.d.ts.map +1 -0
- package/dist/validation/validators/alt-required.js +118 -0
- package/dist/validation/validators/alt-required.js.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts +3 -0
- package/dist/validation/validators/archive-not-supported-on-target.d.ts.map +1 -0
- package/dist/validation/validators/archive-not-supported-on-target.js +38 -0
- package/dist/validation/validators/archive-not-supported-on-target.js.map +1 -0
- package/dist/validation/validators/broken-links.d.ts +3 -0
- package/dist/validation/validators/broken-links.d.ts.map +1 -0
- package/dist/validation/validators/broken-links.js +190 -0
- package/dist/validation/validators/broken-links.js.map +1 -0
- package/dist/validation/validators/circular-alias.d.ts +36 -0
- package/dist/validation/validators/circular-alias.d.ts.map +1 -0
- package/dist/validation/validators/circular-alias.js +63 -0
- package/dist/validation/validators/circular-alias.js.map +1 -0
- package/dist/validation/validators/circular-fragment.d.ts +15 -0
- package/dist/validation/validators/circular-fragment.d.ts.map +1 -0
- package/dist/validation/validators/circular-fragment.js +97 -0
- package/dist/validation/validators/circular-fragment.js.map +1 -0
- package/dist/validation/validators/dangling-alias.d.ts +38 -0
- package/dist/validation/validators/dangling-alias.d.ts.map +1 -0
- package/dist/validation/validators/dangling-alias.js +31 -0
- package/dist/validation/validators/dangling-alias.js.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts +3 -0
- package/dist/validation/validators/deploy-target-type-supported.d.ts.map +1 -0
- package/dist/validation/validators/deploy-target-type-supported.js +32 -0
- package/dist/validation/validators/deploy-target-type-supported.js.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts +18 -0
- package/dist/validation/validators/dynamic-route-conflict.d.ts.map +1 -0
- package/dist/validation/validators/dynamic-route-conflict.js +80 -0
- package/dist/validation/validators/dynamic-route-conflict.js.map +1 -0
- package/dist/validation/validators/html-validity.d.ts +3 -0
- package/dist/validation/validators/html-validity.d.ts.map +1 -0
- package/dist/validation/validators/html-validity.js +89 -0
- package/dist/validation/validators/html-validity.js.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts +21 -0
- package/dist/validation/validators/orphaned-locale-file.d.ts.map +1 -0
- package/dist/validation/validators/orphaned-locale-file.js +84 -0
- package/dist/validation/validators/orphaned-locale-file.js.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts +3 -0
- package/dist/validation/validators/referenced-archived-without-alias.d.ts.map +1 -0
- package/dist/validation/validators/referenced-archived-without-alias.js +65 -0
- package/dist/validation/validators/referenced-archived-without-alias.js.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts +13 -0
- package/dist/validation/validators/referenced-asset-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-asset-exists.js +80 -0
- package/dist/validation/validators/referenced-asset-exists.js.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts +9 -0
- package/dist/validation/validators/referenced-fragment-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-fragment-exists.js +52 -0
- package/dist/validation/validators/referenced-fragment-exists.js.map +1 -0
- package/dist/validation/validators/referenced-template-exists.d.ts +10 -0
- package/dist/validation/validators/referenced-template-exists.d.ts.map +1 -0
- package/dist/validation/validators/referenced-template-exists.js +74 -0
- package/dist/validation/validators/referenced-template-exists.js.map +1 -0
- package/dist/validation/validators/schema-conformance.d.ts +17 -0
- package/dist/validation/validators/schema-conformance.d.ts.map +1 -0
- package/dist/validation/validators/schema-conformance.js +94 -0
- package/dist/validation/validators/schema-conformance.js.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts +3 -0
- package/dist/validation/validators/target-deploy-coverage.d.ts.map +1 -0
- package/dist/validation/validators/target-deploy-coverage.js +37 -0
- package/dist/validation/validators/target-deploy-coverage.js.map +1 -0
- package/dist/validation/validators/unused-fragment.d.ts +16 -0
- package/dist/validation/validators/unused-fragment.d.ts.map +1 -0
- package/dist/validation/validators/unused-fragment.js +86 -0
- package/dist/validation/validators/unused-fragment.js.map +1 -0
- package/package.json +54 -31
- package/admin-dist/assets/index-BO9-CXmW.css +0 -1
- package/admin-dist/assets/index-Ufu8zZH_.js +0 -668
- package/admin-dist/assets/rolldown-runtime-COnpUsM8.js +0 -1
- package/admin-dist/assets/vendor-rjsf-HKBAjOmQ.js +0 -32
- package/admin-dist/assets/vendor-tiptap-IyO99U4R.js +0 -142
- package/admin-dist/assets/vendor-vue-D3wBSmDf.js +0 -1
- package/dist/publish-locale.d.ts +0 -44
- package/dist/publish-locale.d.ts.map +0 -1
- package/dist/publish-locale.js +0 -103
- package/dist/publish-locale.js.map +0 -1
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { GazettaManifest, SiteManifest, StorageProvider, TargetConfig } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Result of orchestration. The route handler maps these to HTTP
|
|
4
|
+
* responses uniformly:
|
|
5
|
+
*
|
|
6
|
+
* - `'unavailable'` → 503 (no adapter / unsupported MIME)
|
|
7
|
+
* - `'failed'` → 502 (adapter threw)
|
|
8
|
+
* - `'not-found'` → 404 (asset doesn't exist)
|
|
9
|
+
* - `'ok'` → 200 (with body, including possible refused: true)
|
|
10
|
+
*
|
|
11
|
+
* `provider` is exposed on `ok` so the route handler can include it
|
|
12
|
+
* in the audit event (per testing-plan.md gap #4 — refusal forensics).
|
|
13
|
+
*/
|
|
14
|
+
export type SuggestAltResult = {
|
|
15
|
+
kind: 'ok';
|
|
16
|
+
suggestion: {
|
|
17
|
+
text: string;
|
|
18
|
+
refused: boolean;
|
|
19
|
+
refusalReason: string | null;
|
|
20
|
+
};
|
|
21
|
+
provider: string;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'unavailable';
|
|
24
|
+
message: string;
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'failed';
|
|
27
|
+
message: string;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'not-found';
|
|
30
|
+
message: string;
|
|
31
|
+
};
|
|
32
|
+
export interface SuggestAltOptions {
|
|
33
|
+
/** Asset name (from `:name` URL param). */
|
|
34
|
+
name: string;
|
|
35
|
+
/** Where assets live in storage (typically `'assets'`). */
|
|
36
|
+
assetsRoot: string;
|
|
37
|
+
/** Storage provider for the resolved target. */
|
|
38
|
+
storage: StorageProvider;
|
|
39
|
+
/** Site manifest carrying `ai:` and `altText:` blocks. */
|
|
40
|
+
site: Pick<SiteManifest, 'ai' | 'altText'>;
|
|
41
|
+
/** Resolved target config (target-level overrides applied via factory). */
|
|
42
|
+
target: Pick<TargetConfig, 'altText'> | undefined;
|
|
43
|
+
/** Optional gazetta-level manifest; first rung of the three-rung chain. */
|
|
44
|
+
gazetta?: Pick<GazettaManifest, 'ai' | 'altText'>;
|
|
45
|
+
/** Locale to generate alt in. Defaults to 'en' upstream. */
|
|
46
|
+
locale: string;
|
|
47
|
+
/** Optional AbortSignal forwarded to the adapter. */
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Run an alt-text suggestion for an existing asset. Pure orchestration
|
|
52
|
+
* — no HTTP, no logging, no streaming. Returns a structured result
|
|
53
|
+
* that the route handler maps to HTTP.
|
|
54
|
+
*/
|
|
55
|
+
export declare function suggestAltForAsset(opts: SuggestAltOptions): Promise<SuggestAltResult>;
|
|
56
|
+
//# sourceMappingURL=route-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-handler.d.ts","sourceRoot":"","sources":["../../src/alt/route-handler.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK/F;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,gBAAgB,GACxB;IACE,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;IAC5E,QAAQ,EAAE,MAAM,CAAA;CACjB,GACD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1C,MAAM,WAAW,iBAAiB;IAChC,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,OAAO,EAAE,eAAe,CAAA;IACxB,0DAA0D;IAC1D,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,CAAA;IAC1C,2EAA2E;IAC3E,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,SAAS,CAAA;IACjD,2EAA2E;IAC3E,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,CAAA;IACjD,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAA;IACd,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgG3F"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Route-level orchestration for `POST /api/assets/:name/suggest-alt`.
|
|
3
|
+
*
|
|
4
|
+
* This module owns the wiring between the admin-api HTTP layer and the
|
|
5
|
+
* alt-text task: loads the asset manifest, reads bytes from storage,
|
|
6
|
+
* builds the suggester, runs it, returns the response body.
|
|
7
|
+
*
|
|
8
|
+
* Lives outside `admin-api/routes/assets.ts` so route handlers stay
|
|
9
|
+
* thin (HTTP concerns only) and the orchestration is unit-testable
|
|
10
|
+
* without spinning up Hono.
|
|
11
|
+
*
|
|
12
|
+
* # SOLID
|
|
13
|
+
*
|
|
14
|
+
* - SRP: this module owns "given a name + locale + storage + site,
|
|
15
|
+
* return a suggestion or a typed error". No HTTP concerns; no
|
|
16
|
+
* adapter construction (delegates to `buildAltAdapter`).
|
|
17
|
+
* - DIP: depends on `StorageProvider` + `SiteManifest` + factory
|
|
18
|
+
* functions, never on a specific provider. Tests substitute via
|
|
19
|
+
* the same abstractions.
|
|
20
|
+
* - OCP: adding response fields (e.g., locale fallback used) is one
|
|
21
|
+
* additional field on the returned shape; no changes to the route.
|
|
22
|
+
*/
|
|
23
|
+
import { readManifest } from '../assets/manifest.js';
|
|
24
|
+
import { assetStoragePaths } from '../assets/asset-paths.js';
|
|
25
|
+
import { AssetManifestNotFoundError } from '../assets/errors.js';
|
|
26
|
+
import { buildAltAdapter } from './factory.js';
|
|
27
|
+
import { resolveAltConfig } from './config.js';
|
|
28
|
+
import { createAltSuggester } from './suggester.js';
|
|
29
|
+
/**
|
|
30
|
+
* Run an alt-text suggestion for an existing asset. Pure orchestration
|
|
31
|
+
* — no HTTP, no logging, no streaming. Returns a structured result
|
|
32
|
+
* that the route handler maps to HTTP.
|
|
33
|
+
*/
|
|
34
|
+
export async function suggestAltForAsset(opts) {
|
|
35
|
+
// Resolve config first to validate the feature is configured for
|
|
36
|
+
// this site/target. No adapter construction yet — cheap.
|
|
37
|
+
const resolved = resolveAltConfig(opts.site, opts.target, opts.gazetta);
|
|
38
|
+
if (!resolved) {
|
|
39
|
+
return {
|
|
40
|
+
kind: 'unavailable',
|
|
41
|
+
message: 'AI alt-text is not configured for this site. Add an `altText:` block to site.config.ts.',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Load the asset manifest. Wrapped in try/catch so we surface
|
|
45
|
+
// missing-asset as a typed result rather than letting the asset
|
|
46
|
+
// domain's typed error escape into the route handler's
|
|
47
|
+
// pattern-match list.
|
|
48
|
+
let manifest;
|
|
49
|
+
try {
|
|
50
|
+
manifest = await readManifest(opts.storage, opts.assetsRoot, opts.name);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (err instanceof AssetManifestNotFoundError) {
|
|
54
|
+
return { kind: 'not-found', message: `Asset '${opts.name}' not found` };
|
|
55
|
+
}
|
|
56
|
+
// Other asset-domain errors bubble — they indicate misconfiguration
|
|
57
|
+
// (e.g., corrupt manifest), which the route handler maps via
|
|
58
|
+
// `respondWithAssetError`.
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
// Build the adapter via the factory. Returns nullAltAdapter when no
|
|
62
|
+
// provider is configured — the suggester's `available()` check
|
|
63
|
+
// surfaces this as `false` and we map to 503.
|
|
64
|
+
const adapter = buildAltAdapter(opts.site, opts.target, opts.gazetta);
|
|
65
|
+
const suggester = createAltSuggester({ adapter });
|
|
66
|
+
if (!suggester.available(manifest.mime)) {
|
|
67
|
+
return {
|
|
68
|
+
kind: 'unavailable',
|
|
69
|
+
message: `AI alt-text adapter unavailable. Check that '${resolved.provider.name}' credentials are valid and that the asset MIME (${manifest.mime}) is supported.`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Resolve the bytes path for the default-locale variant. v1.5
|
|
73
|
+
// suggests against the asset's default bytes regardless of the
|
|
74
|
+
// requested locale — locale only affects the prompt language. Future
|
|
75
|
+
// locale-specific bytes (e.g., a French-text-overlay version) could
|
|
76
|
+
// route through the override slices; deferred until a real consumer
|
|
77
|
+
// requests it.
|
|
78
|
+
const paths = assetStoragePaths(opts.assetsRoot, manifest);
|
|
79
|
+
let bytes;
|
|
80
|
+
try {
|
|
81
|
+
bytes = await opts.storage.readBytes(paths.defaultBytes);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
return {
|
|
85
|
+
kind: 'failed',
|
|
86
|
+
message: `Could not read asset bytes for '${opts.name}': ${err instanceof Error ? err.message : 'unknown error'}`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// Optional poster bytes for animated images — the analyzer extracts
|
|
90
|
+
// them at upload time and writes a manifest path; we forward to the
|
|
91
|
+
// suggester so vision-prep skips re-rasterization.
|
|
92
|
+
let posterBytes;
|
|
93
|
+
if (manifest.poster) {
|
|
94
|
+
try {
|
|
95
|
+
posterBytes = await opts.storage.readBytes(`${opts.assetsRoot}/${manifest.poster}`);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Poster missing or unreadable — fall through to source bytes.
|
|
99
|
+
// Vision-prep handles the rasterize-source path.
|
|
100
|
+
posterBytes = undefined;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const suggestion = await suggester.suggest({
|
|
104
|
+
bytes,
|
|
105
|
+
mime: manifest.mime,
|
|
106
|
+
hash: manifest.hash,
|
|
107
|
+
locale: opts.locale,
|
|
108
|
+
maxImageEdge: resolved.maxImageEdge,
|
|
109
|
+
posterBytes,
|
|
110
|
+
}, opts.signal);
|
|
111
|
+
if (suggestion === null) {
|
|
112
|
+
// The suggester returns null on capability miss, abort, or any
|
|
113
|
+
// typed AI error. We've already verified availability above, so
|
|
114
|
+
// here the cause is most likely a transport failure.
|
|
115
|
+
return {
|
|
116
|
+
kind: 'failed',
|
|
117
|
+
message: `Alt-text generation failed. Check ${resolved.provider} status and retry.`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
return { kind: 'ok', suggestion, provider: resolved.provider.name };
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=route-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-handler.js","sourceRoot":"","sources":["../../src/alt/route-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAA;AAEhE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AA2CnD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAuB;IAC9D,iEAAiE;IACjE,yDAAyD;IACzD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACvE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,yFAAyF;SACnG,CAAA;IACH,CAAC;IAED,8DAA8D;IAC9D,gEAAgE;IAChE,uDAAuD;IACvD,sBAAsB;IACtB,IAAI,QAAkD,CAAA;IACtD,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;IACzE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,0BAA0B,EAAE,CAAC;YAC9C,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,IAAI,CAAC,IAAI,aAAa,EAAE,CAAA;QACzE,CAAC;QACD,oEAAoE;QACpE,6DAA6D;QAC7D,2BAA2B;QAC3B,MAAM,GAAG,CAAA;IACX,CAAC;IAED,oEAAoE;IACpE,+DAA+D;IAC/D,8CAA8C;IAC9C,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACrE,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAEjD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,gDAAgD,QAAQ,CAAC,QAAQ,CAAC,IAAI,oDAAoD,QAAQ,CAAC,IAAI,iBAAiB;SAClK,CAAA;IACH,CAAC;IAED,8DAA8D;IAC9D,+DAA+D;IAC/D,qEAAqE;IACrE,oEAAoE;IACpE,oEAAoE;IACpE,eAAe;IACf,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IAE1D,IAAI,KAAiB,CAAA;IACrB,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IAC1D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,mCAAmC,IAAI,CAAC,IAAI,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE;SAClH,CAAA;IACH,CAAC;IAED,oEAAoE;IACpE,oEAAoE;IACpE,mDAAmD;IACnD,IAAI,WAAmC,CAAA;IACvC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;YAC/D,iDAAiD;YACjD,WAAW,GAAG,SAAS,CAAA;QACzB,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CACxC;QACE,KAAK;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,WAAW;KACZ,EACD,IAAI,CAAC,MAAM,CACZ,CAAA;IAED,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,+DAA+D;QAC/D,gEAAgE;QAChE,qDAAqD;QACrD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,qCAAqC,QAAQ,CAAC,QAAQ,oBAAoB;SACpF,CAAA;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;AACrE,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { AIAdapterFailedError, AIAdapterUnavailableError, AIInvalidResponseError } from '../ai/errors.js';
|
|
2
|
+
import { type AltSuggestion, type AltTextAdapter } from './adapter.js';
|
|
3
|
+
export interface SuggestInput {
|
|
4
|
+
/** Source asset bytes. */
|
|
5
|
+
bytes: Uint8Array;
|
|
6
|
+
/** Source MIME from manifest. */
|
|
7
|
+
mime: string;
|
|
8
|
+
/** For diagnostics (logging); not used for memoization in v1.5. */
|
|
9
|
+
hash: string;
|
|
10
|
+
/** Target locale for the description. Default 'en'. */
|
|
11
|
+
locale?: string;
|
|
12
|
+
/**
|
|
13
|
+
* For animated images: the analyzer-extracted first-frame poster
|
|
14
|
+
* bytes. The suggester forwards to `prepareForVision` which uses
|
|
15
|
+
* them directly (no re-rasterization).
|
|
16
|
+
*/
|
|
17
|
+
posterBytes?: Uint8Array;
|
|
18
|
+
/**
|
|
19
|
+
* Per-call max-edge override for vision-prep. Defaults to the
|
|
20
|
+
* `prepareForVision` default (768).
|
|
21
|
+
*/
|
|
22
|
+
maxImageEdge?: number;
|
|
23
|
+
/** Soft length cap; default 125. */
|
|
24
|
+
maxChars?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The orchestration interface. UI components and route handlers
|
|
28
|
+
* depend on this; the concrete `createAltSuggester` builds an
|
|
29
|
+
* implementation backed by an adapter.
|
|
30
|
+
*/
|
|
31
|
+
export interface AltSuggester {
|
|
32
|
+
/**
|
|
33
|
+
* True when the wrapped adapter is configured AND supports the
|
|
34
|
+
* given MIME. UI uses this to decide whether to render AI affordances.
|
|
35
|
+
*/
|
|
36
|
+
available(mime: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Run the alt-text suggestion. Returns the structured result from
|
|
39
|
+
* the adapter (which may have `refused: true`), or null when the
|
|
40
|
+
* call couldn't complete (unavailable, transport error, abort).
|
|
41
|
+
*/
|
|
42
|
+
suggest(input: SuggestInput, signal?: AbortSignal): Promise<AltSuggestion | null>;
|
|
43
|
+
}
|
|
44
|
+
export interface CreateAltSuggesterOptions {
|
|
45
|
+
adapter: AltTextAdapter;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Build a suggester wrapping the given adapter. Pure factory — no I/O,
|
|
49
|
+
* no env-var reads. Caller (the route handler or test setup) supplies
|
|
50
|
+
* a fully-constructed adapter.
|
|
51
|
+
*
|
|
52
|
+
* Tests substitute by passing `nullAltAdapter`, a recording mock, or
|
|
53
|
+
* a real adapter with an msw-mocked transport.
|
|
54
|
+
*/
|
|
55
|
+
export declare function createAltSuggester(opts: CreateAltSuggesterOptions): AltSuggester;
|
|
56
|
+
export { AIAdapterFailedError, AIAdapterUnavailableError, AIInvalidResponseError };
|
|
57
|
+
//# sourceMappingURL=suggester.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggester.d.ts","sourceRoot":"","sources":["../../src/alt/suggester.ts"],"names":[],"mappings":"AAiDA,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAW,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAElH,OAAO,EAGL,KAAK,aAAa,EAClB,KAAK,cAAc,EAEpB,MAAM,cAAc,CAAA;AAGrB,MAAM,WAAW,YAAY;IAC3B,0BAA0B;IAC1B,KAAK,EAAE,UAAU,CAAA;IACjB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,WAAW,CAAC,EAAE,UAAU,CAAA;IACxB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAA;CAClF;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,cAAc,CAAA;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB,GAAG,YAAY,CAoEhF;AAOD,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AltSuggester` — orchestration between callers and adapters.
|
|
3
|
+
*
|
|
4
|
+
* The suggester is **stateless**. No memoization, no per-replica cache.
|
|
5
|
+
* Multi-replica admin correctness > per-replica optimization. If
|
|
6
|
+
* caching ever earns its keep operationally, it lands as a decorator
|
|
7
|
+
* (`CachedAltSuggester`) wrapping this base — additive, multi-replica
|
|
8
|
+
* correct via shared storage.
|
|
9
|
+
*
|
|
10
|
+
* # What the suggester owns
|
|
11
|
+
*
|
|
12
|
+
* - Build typed `AltRequest` from caller input + defaults
|
|
13
|
+
* - Compose the prompt via `composePrompt(request, policies)`
|
|
14
|
+
* - Call `prepareForVision` to resize bytes before adapter call
|
|
15
|
+
* - Forward `AbortSignal` to adapter
|
|
16
|
+
* - Return `AltSuggestion | null` — null = call failed (adapter
|
|
17
|
+
* unavailable, error, etc.)
|
|
18
|
+
*
|
|
19
|
+
* # What it doesn't own
|
|
20
|
+
*
|
|
21
|
+
* - HTTP / SDK transport (adapter)
|
|
22
|
+
* - Provider-specific request shape (adapter)
|
|
23
|
+
* - Refusal detection (adapter calls `detectRefusal` and constructs
|
|
24
|
+
* the structured `AltSuggestion`; suggester forwards the result)
|
|
25
|
+
* - Cache (none; future decorator)
|
|
26
|
+
* - UI concerns (consumer)
|
|
27
|
+
*
|
|
28
|
+
* # Returning null vs. throwing
|
|
29
|
+
*
|
|
30
|
+
* The suggester's contract: returns `AltSuggestion | null`. Null
|
|
31
|
+
* means "call couldn't complete" — the adapter doesn't support the
|
|
32
|
+
* MIME, or threw a transport error, or was canceled. Consumers treat
|
|
33
|
+
* null uniformly (don't auto-fill).
|
|
34
|
+
*
|
|
35
|
+
* Refusals (model said no but we got a response) come back as
|
|
36
|
+
* `AltSuggestion` with `refused: true`. Different from null — the
|
|
37
|
+
* suggester DID complete, the model just declined. Consumers can
|
|
38
|
+
* surface `refusalReason` to the author.
|
|
39
|
+
*
|
|
40
|
+
* # SOLID
|
|
41
|
+
*
|
|
42
|
+
* - SRP: this module owns one concern (orchestration of the
|
|
43
|
+
* adapter call from caller input to result/null)
|
|
44
|
+
* - OCP: caching, retry, throttling all land as decorators wrapping
|
|
45
|
+
* `AltSuggester` — none requires changing this module
|
|
46
|
+
* - DIP: depends on `AltTextAdapter` (abstract), uses `prepareForVision`
|
|
47
|
+
* and `composePrompt` (utilities); no knowledge of any provider
|
|
48
|
+
*/
|
|
49
|
+
import { composePrompt } from '../ai/compose-prompt.js';
|
|
50
|
+
import { AIAdapterFailedError, AIAdapterUnavailableError, AIError, AIInvalidResponseError } from '../ai/errors.js';
|
|
51
|
+
import { prepareForVision } from '../ai/vision-prep.js';
|
|
52
|
+
import { DEFAULT_ALT_REQUEST, } from './adapter.js';
|
|
53
|
+
import { DEFAULT_ALT_PROMPT_POLICIES } from './prompt-policies.js';
|
|
54
|
+
/**
|
|
55
|
+
* Build a suggester wrapping the given adapter. Pure factory — no I/O,
|
|
56
|
+
* no env-var reads. Caller (the route handler or test setup) supplies
|
|
57
|
+
* a fully-constructed adapter.
|
|
58
|
+
*
|
|
59
|
+
* Tests substitute by passing `nullAltAdapter`, a recording mock, or
|
|
60
|
+
* a real adapter with an msw-mocked transport.
|
|
61
|
+
*/
|
|
62
|
+
export function createAltSuggester(opts) {
|
|
63
|
+
const { adapter } = opts;
|
|
64
|
+
return {
|
|
65
|
+
available(mime) {
|
|
66
|
+
return adapter.supports(mime);
|
|
67
|
+
},
|
|
68
|
+
async suggest(input, signal) {
|
|
69
|
+
// Capability check first — adapter may be null-adapter or may
|
|
70
|
+
// not support this MIME. Either way: nothing to attempt.
|
|
71
|
+
if (!adapter.supports(input.mime))
|
|
72
|
+
return null;
|
|
73
|
+
// Bail on already-aborted signals before doing any work.
|
|
74
|
+
if (signal?.aborted)
|
|
75
|
+
return null;
|
|
76
|
+
// Build the typed request from input + defaults.
|
|
77
|
+
const request = {
|
|
78
|
+
...DEFAULT_ALT_REQUEST,
|
|
79
|
+
locale: input.locale ?? DEFAULT_ALT_REQUEST.locale,
|
|
80
|
+
maxChars: input.maxChars ?? DEFAULT_ALT_REQUEST.maxChars,
|
|
81
|
+
};
|
|
82
|
+
// Compose prompt and prepare bytes — both pure, both idempotent.
|
|
83
|
+
const prompt = composePrompt(request, DEFAULT_ALT_PROMPT_POLICIES);
|
|
84
|
+
let prepared;
|
|
85
|
+
try {
|
|
86
|
+
prepared = await prepareForVision({
|
|
87
|
+
bytes: input.bytes,
|
|
88
|
+
mime: input.mime,
|
|
89
|
+
posterBytes: input.posterBytes,
|
|
90
|
+
maxEdge: input.maxImageEdge,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Vision-prep failure (sharp couldn't decode): treat as
|
|
95
|
+
// unavailable. The asset's bytes are presumably corrupt or
|
|
96
|
+
// an unexpected format — not worth calling the model on
|
|
97
|
+
// garbage.
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
const generateInput = {
|
|
101
|
+
bytes: prepared.bytes,
|
|
102
|
+
mime: prepared.mime,
|
|
103
|
+
request,
|
|
104
|
+
prompt,
|
|
105
|
+
};
|
|
106
|
+
try {
|
|
107
|
+
return await adapter.generate(generateInput, signal);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
// AbortSignal-induced rejection: surface as null (call canceled).
|
|
111
|
+
if (signal?.aborted)
|
|
112
|
+
return null;
|
|
113
|
+
// AI errors are expected failure modes — caller maps null →
|
|
114
|
+
// user-facing toast. Re-throwing would force every caller to
|
|
115
|
+
// try/catch around `suggest`, which is exactly what the
|
|
116
|
+
// suggester contract abstracts away.
|
|
117
|
+
if (err instanceof AIError)
|
|
118
|
+
return null;
|
|
119
|
+
// Non-AI errors (programmer bugs, unexpected exceptions)
|
|
120
|
+
// bubble — the suggester doesn't swallow these, since they
|
|
121
|
+
// indicate a real problem worth surfacing.
|
|
122
|
+
throw err;
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
// Re-export AI error types so callers/tests can pattern-match without
|
|
128
|
+
// importing from `ai/`. Useful during the brief window where adapter
|
|
129
|
+
// implementations distinguish unavailable vs. failed vs. invalid-
|
|
130
|
+
// response; in practice route handlers only need the suggester's
|
|
131
|
+
// null/non-null result.
|
|
132
|
+
export { AIAdapterFailedError, AIAdapterUnavailableError, AIInvalidResponseError };
|
|
133
|
+
//# sourceMappingURL=suggester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggester.js","sourceRoot":"","sources":["../../src/alt/suggester.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AACvD,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAClH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAKL,mBAAmB,GACpB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAA;AAiDlE;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA+B;IAChE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAExB,OAAO;QACL,SAAS,CAAC,IAAY;YACpB,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC/B,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,KAAmB,EAAE,MAAoB;YACrD,8DAA8D;YAC9D,yDAAyD;YACzD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAA;YAE9C,yDAAyD;YACzD,IAAI,MAAM,EAAE,OAAO;gBAAE,OAAO,IAAI,CAAA;YAEhC,iDAAiD;YACjD,MAAM,OAAO,GAAe;gBAC1B,GAAG,mBAAmB;gBACtB,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAAC,MAAM;gBAClD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,mBAAmB,CAAC,QAAQ;aACzD,CAAA;YAED,iEAAiE;YACjE,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAA;YAElE,IAAI,QAA6C,CAAA;YACjD,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,gBAAgB,CAAC;oBAChC,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,OAAO,EAAE,KAAK,CAAC,YAAY;iBAC5B,CAAC,CAAA;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,wDAAwD;gBACxD,2DAA2D;gBAC3D,wDAAwD;gBACxD,WAAW;gBACX,OAAO,IAAI,CAAA;YACb,CAAC;YAED,MAAM,aAAa,GAAqB;gBACtC,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,OAAO;gBACP,MAAM;aACP,CAAA;YAED,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;YACtD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,kEAAkE;gBAClE,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO,IAAI,CAAA;gBAEhC,4DAA4D;gBAC5D,6DAA6D;gBAC7D,wDAAwD;gBACxD,qCAAqC;gBACrC,IAAI,GAAG,YAAY,OAAO;oBAAE,OAAO,IAAI,CAAA;gBAEvC,yDAAyD;gBACzD,2DAA2D;gBAC3D,2CAA2C;gBAC3C,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC;AAED,sEAAsE;AACtE,qEAAqE;AACrE,kEAAkE;AAClE,iEAAiE;AACjE,wBAAwB;AACxB,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,CAAA"}
|
package/dist/app.js
CHANGED
|
@@ -4,7 +4,7 @@ import { resolvePage } from './resolver.js';
|
|
|
4
4
|
import { renderPage } from './renderer.js';
|
|
5
5
|
export async function createApp(siteDir, storage) {
|
|
6
6
|
const app = new Hono();
|
|
7
|
-
const site = await loadSite({ siteDir, storage });
|
|
7
|
+
const site = await loadSite({ siteDir, storage, manifest: { name: '(app)' } });
|
|
8
8
|
for (const [pageName, page] of site.pages) {
|
|
9
9
|
app.get(page.route, async (c) => {
|
|
10
10
|
const resolved = await resolvePage(pageName, site);
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,OAAwB;IACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAE3B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAE1C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe,EAAE,OAAwB;IACvE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;IAE9E,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;YAC5B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YAClD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAA;YACtD,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive-alias-targets sidecar binding for the generic dep-sidecars
|
|
3
|
+
* module.
|
|
4
|
+
*
|
|
5
|
+
* Answers "which archived items have `aliasOf === X`?" via the same
|
|
6
|
+
* per-edge sidecar shape as `asset-refs` and `fragment-deps`:
|
|
7
|
+
*
|
|
8
|
+
* `{root}/.gazetta/alias-targets/{X}/{encoded-source-item}`
|
|
9
|
+
*
|
|
10
|
+
* Without this index, the purge handler (Cut 5) would have to walk
|
|
11
|
+
* every page + fragment manifest on every purge attempt to find
|
|
12
|
+
* aliases pointing at the target. At the 5K-page envelope per
|
|
13
|
+
* `design-scale.md`, that's a ~30s walk on real cloud storage —
|
|
14
|
+
* unacceptable for an interactive admin operation. The sidecar
|
|
15
|
+
* makes it a single `readDir` (~5ms).
|
|
16
|
+
*
|
|
17
|
+
* Per `team-preferences.md` rule 24: "Validate every primitive
|
|
18
|
+
* against the 5K-page envelope" — the sidecar IS the perf design.
|
|
19
|
+
*
|
|
20
|
+
* # Lifecycle
|
|
21
|
+
*
|
|
22
|
+
* - Save handler: when an item is archived with `aliasOf` set,
|
|
23
|
+
* `rebuildArchiveAliases` writes the sidecar at
|
|
24
|
+
* `.gazetta/alias-targets/{aliasTarget}/{item}`.
|
|
25
|
+
* - Save handler: when the same item is unarchived OR has its
|
|
26
|
+
* `aliasOf` field changed, the diff drops the old target's
|
|
27
|
+
* sidecar and adds the new target's sidecar.
|
|
28
|
+
* - Delete/purge handler: pass `newManifest = null` to tear down
|
|
29
|
+
* the sidecar for the item being purged.
|
|
30
|
+
* - Cross-target: source-and-target consistent (same shape on
|
|
31
|
+
* both); the publish flow propagates the `.gazetta/` namespace.
|
|
32
|
+
*
|
|
33
|
+
* Per Q3's flatten-on-rename lock: aliases never form chains.
|
|
34
|
+
* `aliasOf` always points at a live item (or at a missing item,
|
|
35
|
+
* which the `dangling-alias` validator surfaces). The sidecar
|
|
36
|
+
* stores ONE target per archive — the relation's `extract`
|
|
37
|
+
* returns either `{aliasOf}` or `∅`.
|
|
38
|
+
*/
|
|
39
|
+
import type { ContentRoot } from './content-root.js';
|
|
40
|
+
import { type DepRelation, type ItemRef, type ManifestLike } from './dep-sidecars.js';
|
|
41
|
+
/**
|
|
42
|
+
* The archive-aliases relation.
|
|
43
|
+
*
|
|
44
|
+
* Extracts the alias target from a manifest. The set is at most
|
|
45
|
+
* one element — Q3 flatten guarantees one-hop aliases. A live
|
|
46
|
+
* manifest (or an archived-without-alias manifest) yields the
|
|
47
|
+
* empty set, which means no sidecars are written for it.
|
|
48
|
+
*/
|
|
49
|
+
export declare const ARCHIVE_ALIASES: DepRelation;
|
|
50
|
+
/**
|
|
51
|
+
* Read every archived item that aliases this target. Returns
|
|
52
|
+
* `ItemRef[]`; the caller maps to `(kind, name)` for error bodies
|
|
53
|
+
* (e.g. the purge-blocked 409 response from `design-soft-delete.md`
|
|
54
|
+
* Q4).
|
|
55
|
+
*/
|
|
56
|
+
export declare function readArchivesAliasing(contentRoot: ContentRoot, targetName: string): Promise<ItemRef[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Apply the alias-targets diff for one item's manifest change.
|
|
59
|
+
*
|
|
60
|
+
* Pass the pre-save manifest as `oldManifest` and the post-save
|
|
61
|
+
* manifest as `newManifest`. The diff drops sidecars for any
|
|
62
|
+
* removed alias targets and writes sidecars for any added targets.
|
|
63
|
+
*
|
|
64
|
+
* Cases:
|
|
65
|
+
* - Live → archive(aliasOf=X) : write `.gazetta/alias-targets/X/{item}`
|
|
66
|
+
* - Live → archive(no aliasOf) : no I/O
|
|
67
|
+
* - Archive(X) → archive(Y) : remove X's sidecar, write Y's
|
|
68
|
+
* - Archive(X) → archive(no aliasOf) : remove X's sidecar
|
|
69
|
+
* - Archive(X) → live : remove X's sidecar
|
|
70
|
+
* - Archive(X) → null (purge) : remove X's sidecar
|
|
71
|
+
* - Live → null (purge) : no I/O
|
|
72
|
+
*/
|
|
73
|
+
export declare function rebuildArchiveAliases(contentRoot: ContentRoot, item: ItemRef, oldManifest: ManifestLike | null, newManifest: ManifestLike | null): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Apply a pre-computed diff (used in tests + cases where the
|
|
76
|
+
* caller has the alias names already).
|
|
77
|
+
*/
|
|
78
|
+
export declare function applyArchiveAliasesDiff(contentRoot: ContentRoot, item: ItemRef, oldTargets: ReadonlySet<string>, newTargets: ReadonlySet<string>): Promise<void>;
|
|
79
|
+
//# sourceMappingURL=archive-aliases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-aliases.d.ts","sourceRoot":"","sources":["../src/archive-aliases.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,YAAY,EAIlB,MAAM,mBAAmB,CAAA;AAE1B;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,EAAE,WAY7B,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAErG;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,YAAY,GAAG,IAAI,EAChC,WAAW,EAAE,YAAY,GAAG,IAAI,GAC/B,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,EAC/B,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,GAC9B,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { applyDepDiff, rebuildItemDeps, readDepsFor, } from './dep-sidecars.js';
|
|
2
|
+
/**
|
|
3
|
+
* The archive-aliases relation.
|
|
4
|
+
*
|
|
5
|
+
* Extracts the alias target from a manifest. The set is at most
|
|
6
|
+
* one element — Q3 flatten guarantees one-hop aliases. A live
|
|
7
|
+
* manifest (or an archived-without-alias manifest) yields the
|
|
8
|
+
* empty set, which means no sidecars are written for it.
|
|
9
|
+
*/
|
|
10
|
+
export const ARCHIVE_ALIASES = {
|
|
11
|
+
rootName: 'alias-targets',
|
|
12
|
+
extract: (manifest) => {
|
|
13
|
+
// Cast: ComponentManifest is the full shape; ManifestLike is
|
|
14
|
+
// the dep-sidecars module's loose type. The `archived` and
|
|
15
|
+
// `aliasOf` fields aren't part of `ManifestLike`'s declaration,
|
|
16
|
+
// so the cast names what we're looking at.
|
|
17
|
+
const m = manifest;
|
|
18
|
+
if (m.archived !== true)
|
|
19
|
+
return new Set();
|
|
20
|
+
if (typeof m.aliasOf !== 'string' || m.aliasOf.length === 0)
|
|
21
|
+
return new Set();
|
|
22
|
+
return new Set([m.aliasOf]);
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Read every archived item that aliases this target. Returns
|
|
27
|
+
* `ItemRef[]`; the caller maps to `(kind, name)` for error bodies
|
|
28
|
+
* (e.g. the purge-blocked 409 response from `design-soft-delete.md`
|
|
29
|
+
* Q4).
|
|
30
|
+
*/
|
|
31
|
+
export function readArchivesAliasing(contentRoot, targetName) {
|
|
32
|
+
return readDepsFor(ARCHIVE_ALIASES, contentRoot, targetName);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Apply the alias-targets diff for one item's manifest change.
|
|
36
|
+
*
|
|
37
|
+
* Pass the pre-save manifest as `oldManifest` and the post-save
|
|
38
|
+
* manifest as `newManifest`. The diff drops sidecars for any
|
|
39
|
+
* removed alias targets and writes sidecars for any added targets.
|
|
40
|
+
*
|
|
41
|
+
* Cases:
|
|
42
|
+
* - Live → archive(aliasOf=X) : write `.gazetta/alias-targets/X/{item}`
|
|
43
|
+
* - Live → archive(no aliasOf) : no I/O
|
|
44
|
+
* - Archive(X) → archive(Y) : remove X's sidecar, write Y's
|
|
45
|
+
* - Archive(X) → archive(no aliasOf) : remove X's sidecar
|
|
46
|
+
* - Archive(X) → live : remove X's sidecar
|
|
47
|
+
* - Archive(X) → null (purge) : remove X's sidecar
|
|
48
|
+
* - Live → null (purge) : no I/O
|
|
49
|
+
*/
|
|
50
|
+
export function rebuildArchiveAliases(contentRoot, item, oldManifest, newManifest) {
|
|
51
|
+
return rebuildItemDeps(ARCHIVE_ALIASES, contentRoot, item, oldManifest, newManifest);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Apply a pre-computed diff (used in tests + cases where the
|
|
55
|
+
* caller has the alias names already).
|
|
56
|
+
*/
|
|
57
|
+
export function applyArchiveAliasesDiff(contentRoot, item, oldTargets, newTargets) {
|
|
58
|
+
return applyDepDiff(ARCHIVE_ALIASES, contentRoot, item, oldTargets, newTargets);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=archive-aliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-aliases.js","sourceRoot":"","sources":["../src/archive-aliases.ts"],"names":[],"mappings":"AAwCA,OAAO,EAIL,YAAY,EACZ,eAAe,EACf,WAAW,GACZ,MAAM,mBAAmB,CAAA;AAE1B;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAgB;IAC1C,QAAQ,EAAE,eAAe;IACzB,OAAO,EAAE,CAAC,QAAsB,EAAE,EAAE;QAClC,6DAA6D;QAC7D,2DAA2D;QAC3D,gEAAgE;QAChE,2CAA2C;QAC3C,MAAM,CAAC,GAAG,QAAsC,CAAA;QAChD,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,GAAG,EAAU,CAAA;QACjD,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,GAAG,EAAU,CAAA;QACrF,OAAO,IAAI,GAAG,CAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACrC,CAAC;CACF,CAAA;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAwB,EAAE,UAAkB;IAC/E,OAAO,WAAW,CAAC,eAAe,EAAE,WAAW,EAAE,UAAU,CAAC,CAAA;AAC9D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,qBAAqB,CACnC,WAAwB,EACxB,IAAa,EACb,WAAgC,EAChC,WAAgC;IAEhC,OAAO,eAAe,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;AACtF,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,WAAwB,EACxB,IAAa,EACb,UAA+B,EAC/B,UAA+B;IAE/B,OAAO,YAAY,CAAC,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;AACjF,CAAC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archive predicates + alias resolution helpers per design-soft-delete.md.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions over manifest data. No I/O. The render pipeline + admin
|
|
5
|
+
* routes consume these instead of inlining `manifest.archived === true`
|
|
6
|
+
* checks (SRP — archive semantics in one place).
|
|
7
|
+
*
|
|
8
|
+
* Archive state lives on the manifest itself (Q1 lock — manifest field,
|
|
9
|
+
* not sidecar). Aliasing is a runtime concern — the resolver follows
|
|
10
|
+
* `aliasOf` for archived items with the field set; throws ARCHIVED_NO_ALIAS
|
|
11
|
+
* for archived items without (Q2 F1 split).
|
|
12
|
+
*
|
|
13
|
+
* Q3 flatten-on-rename guarantees aliases never point at other archives —
|
|
14
|
+
* one-hop only. The recursion limit + cycle detection in
|
|
15
|
+
* `resolveFragmentArchiveAlias` are defensive: if external manifest
|
|
16
|
+
* mutation produces a chain (git pull, hand edit), we still terminate.
|
|
17
|
+
*/
|
|
18
|
+
import type { ComponentManifest } from './types.js';
|
|
19
|
+
/** True when the manifest is archived (and not a non-archived archived: false). */
|
|
20
|
+
export declare function isArchived(manifest: {
|
|
21
|
+
archived?: boolean;
|
|
22
|
+
}): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Returns the alias target name when the manifest is archived AND has
|
|
25
|
+
* `aliasOf` set; null in any other case (live manifest, or archived
|
|
26
|
+
* without alias).
|
|
27
|
+
*
|
|
28
|
+
* The caller distinguishes "live" from "archived without alias" via
|
|
29
|
+
* `isArchived(manifest)` — both states return null here, but the runtime
|
|
30
|
+
* behavior differs (live = render normally; archived-no-alias = throw).
|
|
31
|
+
*/
|
|
32
|
+
export declare function aliasTarget(manifest: {
|
|
33
|
+
archived?: boolean;
|
|
34
|
+
aliasOf?: string;
|
|
35
|
+
}): string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Error thrown by `resolveFragmentArchiveAlias` when an archived fragment
|
|
38
|
+
* has no `aliasOf` field. Caller (renderer / worker) decides UX:
|
|
39
|
+
*
|
|
40
|
+
* - Renderer: surface as render-time error (per Q2 F1 split)
|
|
41
|
+
* - Validator (P1): warn at save / background / pre-publish
|
|
42
|
+
* - Worker: emit 410 Gone on the page that referenced this fragment
|
|
43
|
+
*
|
|
44
|
+
* Distinct error class so callers can `instanceof`-check without
|
|
45
|
+
* pattern-matching messages.
|
|
46
|
+
*/
|
|
47
|
+
export declare class ArchivedNoAliasError extends Error {
|
|
48
|
+
readonly fragmentName: string;
|
|
49
|
+
constructor(fragmentName: string, contextPath?: string);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Resolve a fragment ref through the alias chain. Returns the live
|
|
53
|
+
* fragment name to use for the actual lookup.
|
|
54
|
+
*
|
|
55
|
+
* - Live fragment → returns the original name unchanged
|
|
56
|
+
* - Archived fragment with `aliasOf: X` → recurses to resolve X
|
|
57
|
+
* - Archived fragment without `aliasOf` → throws ArchivedNoAliasError
|
|
58
|
+
* - Alias chain longer than MAX_ALIAS_HOPS → throws (data-corruption guard)
|
|
59
|
+
* - Cycle (A → B → A) → throws (data-corruption guard)
|
|
60
|
+
*
|
|
61
|
+
* The `lookupFragment` callback decouples this helper from the
|
|
62
|
+
* `Site.fragments` / `Site.fragmentLocales` map shape — the resolver
|
|
63
|
+
* passes whichever lookup strategy applies for the active locale.
|
|
64
|
+
*
|
|
65
|
+
* Returns null when the resolved name doesn't exist as a fragment
|
|
66
|
+
* (the caller's lookup returned null at some point in the chain) —
|
|
67
|
+
* caller surfaces "fragment not found" with their own context.
|
|
68
|
+
*/
|
|
69
|
+
export declare function resolveFragmentArchiveAlias(fragmentName: string, lookupFragment: (name: string) => ComponentManifest | null, contextPath?: string): {
|
|
70
|
+
resolvedName: string;
|
|
71
|
+
manifest: ComponentManifest;
|
|
72
|
+
} | null;
|
|
73
|
+
//# sourceMappingURL=archive-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-helpers.d.ts","sourceRoot":"","sources":["../src/archive-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,QAAQ,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAEpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAG7F;AAED;;;;;;;;;;GAUG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;gBAEjB,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM;CASvD;AASD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,iBAAiB,GAAG,IAAI,EAC1D,WAAW,CAAC,EAAE,MAAM,GACnB;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,iBAAiB,CAAA;CAAE,GAAG,IAAI,CAkC9D"}
|