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,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Image preprocessing for vision-using AI tasks.
|
|
3
|
+
*
|
|
4
|
+
* # Single responsibility
|
|
5
|
+
*
|
|
6
|
+
* Take raw asset bytes; return bytes suitable for sending to a vision
|
|
7
|
+
* provider. Concretely:
|
|
8
|
+
*
|
|
9
|
+
* - Resize to `MAX_EDGE` long-edge (default 768) preserving aspect ratio
|
|
10
|
+
* - Re-encode to JPEG (or PNG if alpha) post-resize
|
|
11
|
+
* - Rasterize SVG to PNG at MAX_EDGE
|
|
12
|
+
* - Pass through if already small (no needless re-encode)
|
|
13
|
+
* - Use the analyzer-extracted poster bytes for animated images
|
|
14
|
+
*
|
|
15
|
+
* No knowledge of providers, prompts, refusal, or task-specific config.
|
|
16
|
+
*
|
|
17
|
+
* # Why 768
|
|
18
|
+
*
|
|
19
|
+
* Smallest size that fits all v1.5 providers natively without quality
|
|
20
|
+
* loss:
|
|
21
|
+
*
|
|
22
|
+
* - Ollama llama3.2-vision native input is 1120×1120
|
|
23
|
+
* - Anthropic Claude (non-Opus) recommended max long edge is 1568
|
|
24
|
+
* - OpenAI gpt-4o "high detail" mode targets 768 as the short-edge
|
|
25
|
+
* value when tiling 512×512 — chosen by OpenAI as the size where
|
|
26
|
+
* in-image text remains legible
|
|
27
|
+
*
|
|
28
|
+
* 768 sits below all three ceilings, makes OpenAI tile to exactly
|
|
29
|
+
* 4 tiles + base = 765 tokens, and produces predictable cost on
|
|
30
|
+
* Anthropic (~786 tokens for a 768×768 image, well under the 1568
|
|
31
|
+
* token ceiling).
|
|
32
|
+
*
|
|
33
|
+
* Going lower (e.g., 512) hits OpenAI's "low detail" tier which the
|
|
34
|
+
* provider's own docs mark as worse for in-image text. Going higher
|
|
35
|
+
* exceeds Ollama's native input so the model downsamples internally
|
|
36
|
+
* — we'd be paying upload bandwidth for bytes that get discarded.
|
|
37
|
+
*
|
|
38
|
+
* # Per-task override
|
|
39
|
+
*
|
|
40
|
+
* Vision tasks that need different sizing (e.g., a future tag-suggestion
|
|
41
|
+
* task on detailed product shots wanting 1024) pass `maxEdge` per call.
|
|
42
|
+
* `MAX_EDGE` is the default; `prepareForVision` accepts an override.
|
|
43
|
+
*
|
|
44
|
+
* # Animated images
|
|
45
|
+
*
|
|
46
|
+
* The animated-image analyzer (shipped in media v1) extracts a
|
|
47
|
+
* first-frame PNG poster as a supplementary file. Suggester callers
|
|
48
|
+
* pass those bytes via `posterBytes` — `prepareForVision` skips its
|
|
49
|
+
* own rasterization and uses the poster directly. Cross-feature reuse
|
|
50
|
+
* over duplication.
|
|
51
|
+
*
|
|
52
|
+
* # SOLID lenses
|
|
53
|
+
*
|
|
54
|
+
* - SRP: this module owns "raw asset bytes → vision-call bytes"
|
|
55
|
+
* - OCP: a future `pdf-prep.ts` peer handles document tasks the same way
|
|
56
|
+
* - DIP: callers depend on `prepareForVision`, not on sharp directly
|
|
57
|
+
*/
|
|
58
|
+
import sharp from 'sharp';
|
|
59
|
+
/** Default long-edge cap. Per-call override available via `maxEdge`. */
|
|
60
|
+
export const MAX_EDGE = 768;
|
|
61
|
+
/**
|
|
62
|
+
* SVG rasterization density. 144 dpi is a sensible doubled-72-dpi
|
|
63
|
+
* default that produces ~2x the nominal SVG dimensions. Combined with
|
|
64
|
+
* the resize step, the final output is bounded by `maxEdge` regardless
|
|
65
|
+
* of the SVG's intrinsic size — density only affects rendering quality
|
|
66
|
+
* before the cap kicks in.
|
|
67
|
+
*/
|
|
68
|
+
const SVG_DENSITY = 144;
|
|
69
|
+
/**
|
|
70
|
+
* Prepare image bytes for a vision-call. Single async call that picks
|
|
71
|
+
* the right code path based on input.
|
|
72
|
+
*
|
|
73
|
+
* Throws on hard failures (corrupt source bytes that sharp can't
|
|
74
|
+
* decode, even past metadata). Callers wrap in their adapter's error
|
|
75
|
+
* taxonomy.
|
|
76
|
+
*/
|
|
77
|
+
export async function prepareForVision(input) {
|
|
78
|
+
const maxEdge = input.maxEdge ?? MAX_EDGE;
|
|
79
|
+
// Animated source: use the pre-extracted poster bytes (always PNG).
|
|
80
|
+
// Posters are extracted at upload time and already represent the
|
|
81
|
+
// first frame; for vision-call purposes that's what we want.
|
|
82
|
+
if (input.posterBytes) {
|
|
83
|
+
return { bytes: input.posterBytes, mime: 'image/png' };
|
|
84
|
+
}
|
|
85
|
+
// SVG: rasterize to PNG at the cap. Vector input has no intrinsic
|
|
86
|
+
// pixel size; we pick density × resize to bound the output.
|
|
87
|
+
if (input.mime === 'image/svg+xml') {
|
|
88
|
+
const buf = await sharp(input.bytes, { density: SVG_DENSITY })
|
|
89
|
+
.resize({ width: maxEdge, height: maxEdge, fit: 'inside' })
|
|
90
|
+
.png()
|
|
91
|
+
.toBuffer();
|
|
92
|
+
return { bytes: new Uint8Array(buf), mime: 'image/png' };
|
|
93
|
+
}
|
|
94
|
+
// Raster: resize if larger than maxEdge on long edge; otherwise pass
|
|
95
|
+
// through. Avoids a no-op JPEG-of-JPEG re-encode that would lose
|
|
96
|
+
// quality without saving bandwidth.
|
|
97
|
+
const meta = await sharp(input.bytes).metadata();
|
|
98
|
+
const longEdge = Math.max(meta.width ?? 0, meta.height ?? 0);
|
|
99
|
+
if (longEdge > 0 && longEdge <= maxEdge) {
|
|
100
|
+
return { bytes: input.bytes, mime: input.mime };
|
|
101
|
+
}
|
|
102
|
+
// Preserve PNG when source has alpha (logos with transparency lose
|
|
103
|
+
// semantically when flattened to JPEG). Otherwise JPEG quality 85 —
|
|
104
|
+
// sharp's default for `.jpeg()`, well-balanced for AI input.
|
|
105
|
+
const hasAlpha = meta.hasAlpha === true;
|
|
106
|
+
const pipeline = sharp(input.bytes).resize({ width: maxEdge, height: maxEdge, fit: 'inside' });
|
|
107
|
+
const buf = hasAlpha ? await pipeline.png().toBuffer() : await pipeline.jpeg({ quality: 85 }).toBuffer();
|
|
108
|
+
return {
|
|
109
|
+
bytes: new Uint8Array(buf),
|
|
110
|
+
mime: hasAlpha ? 'image/png' : 'image/jpeg',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=vision-prep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vision-prep.js","sourceRoot":"","sources":["../../src/ai/vision-prep.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AACH,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,wEAAwE;AACxE,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAA;AAwB3B;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,GAAG,CAAA;AAEvB;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAmB;IACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAA;IAEzC,oEAAoE;IACpE,iEAAiE;IACjE,6DAA6D;IAC7D,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IACxD,CAAC;IAED,kEAAkE;IAClE,4DAA4D;IAC5D,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;aAC3D,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;aAC1D,GAAG,EAAE;aACL,QAAQ,EAAE,CAAA;QACb,OAAO,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAA;IAC1D,CAAC;IAED,qEAAqE;IACrE,iEAAiE;IACjE,oCAAoC;IACpC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAA;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAA;IAC5D,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAA;IACjD,CAAC;IAED,mEAAmE;IACnE,oEAAoE;IACpE,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAA;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9F,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAA;IACxG,OAAO;QACL,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC;QAC1B,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY;KAC5C,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `AltTextAdapter` — provider-substitutable interface for generating
|
|
3
|
+
* alt text from image bytes.
|
|
4
|
+
*
|
|
5
|
+
* Three concrete implementations ship in v1.5: `anthropicAltAdapter`,
|
|
6
|
+
* `openAIAltAdapter`, `ollamaAltAdapter` (commits 3-5). One safe
|
|
7
|
+
* default also ships: `nullAltAdapter` (this commit), used when no
|
|
8
|
+
* adapter is configured for the target.
|
|
9
|
+
*
|
|
10
|
+
* # SOLID lenses
|
|
11
|
+
*
|
|
12
|
+
* - SRP: this module owns the alt-text task contracts (request,
|
|
13
|
+
* suggestion, adapter interface). Nothing else lives here.
|
|
14
|
+
* - OCP: new providers implement the interface and slot into the
|
|
15
|
+
* factory (commit 6). No existing module changes.
|
|
16
|
+
* - LSP: every adapter — including `nullAltAdapter` — honors the
|
|
17
|
+
* same contract. Substitutable in tests.
|
|
18
|
+
* - ISP: adapter exposes only `name`, `supports`, `generate` — no
|
|
19
|
+
* UI concerns, no config concerns.
|
|
20
|
+
* - DIP: callers depend on this interface, not on Anthropic SDK,
|
|
21
|
+
* OpenAI SDK, or Ollama HTTP details.
|
|
22
|
+
*
|
|
23
|
+
* # Why `AltSuggestion` carries refused state
|
|
24
|
+
*
|
|
25
|
+
* Vision providers can return a 200 OK with refusal text in the
|
|
26
|
+
* content field (e.g., "I can't describe this image"). The structural
|
|
27
|
+
* cut: refusal is a *successful API call with a domain-level no*.
|
|
28
|
+
* Treating refusal as a structured field — not as inspecting `text`
|
|
29
|
+
* for substrings in every consumer — keeps DIP. UI consumers branch
|
|
30
|
+
* on `refused`, not on text patterns.
|
|
31
|
+
*
|
|
32
|
+
* Considered and rejected: a `confidence: number | null` field.
|
|
33
|
+
* Vision providers don't expose calibrated confidence for free-form
|
|
34
|
+
* description tasks; a hardcoded null would be a stub-on-the-interface
|
|
35
|
+
* (LSP violation, per [team-preferences rule 18]). If a future
|
|
36
|
+
* provider exposes real calibrated confidence, it lands as a separate
|
|
37
|
+
* field — not as a retrofit of a placeholder.
|
|
38
|
+
*/
|
|
39
|
+
import type { PromptPolicy } from '../ai/compose-prompt.js';
|
|
40
|
+
/**
|
|
41
|
+
* What the caller wants. Provider-agnostic. Each field has a documented
|
|
42
|
+
* default applied by the factory when callers don't specify.
|
|
43
|
+
*/
|
|
44
|
+
export interface AltRequest {
|
|
45
|
+
/**
|
|
46
|
+
* Target language for the description (BCP 47 locale code; 'en',
|
|
47
|
+
* 'fr', 'pt-BR'). The model writes alt directly in this language —
|
|
48
|
+
* no separate translation pass. Default 'en'.
|
|
49
|
+
*/
|
|
50
|
+
locale: string;
|
|
51
|
+
/**
|
|
52
|
+
* Soft length suggestion in characters. Used in prompt guidance
|
|
53
|
+
* ("Maximum N characters") and as native `max_tokens` derivation
|
|
54
|
+
* for adapters that have it. Default 125 (WAI-ARIA convention).
|
|
55
|
+
*
|
|
56
|
+
* NOT enforced by the suggester or adapter — if the model returns
|
|
57
|
+
* longer text, the consumer sees the full string and can edit. Hard
|
|
58
|
+
* truncation would lose meaning.
|
|
59
|
+
*/
|
|
60
|
+
maxChars: number;
|
|
61
|
+
/**
|
|
62
|
+
* Output style. Closed enum; extended additively (future:
|
|
63
|
+
* `'marketing' | 'technical'`).
|
|
64
|
+
*/
|
|
65
|
+
style: AltStyle;
|
|
66
|
+
}
|
|
67
|
+
/** Closed enum; extends additively. */
|
|
68
|
+
export type AltStyle = 'descriptive';
|
|
69
|
+
/** Default `AltRequest` values, applied by the suggester when callers omit fields. */
|
|
70
|
+
export declare const DEFAULT_ALT_REQUEST: AltRequest;
|
|
71
|
+
/**
|
|
72
|
+
* What the suggester delivers. `text` is the model's output (which may
|
|
73
|
+
* be a refusal). `refused` is the structured signal: when true, don't
|
|
74
|
+
* auto-fill, surface `refusalReason` to the author instead.
|
|
75
|
+
*/
|
|
76
|
+
export interface AltSuggestion {
|
|
77
|
+
text: string;
|
|
78
|
+
/** True when the model declined or couldn't describe the image. */
|
|
79
|
+
refused: boolean;
|
|
80
|
+
/** Truncated reason text when refused; null otherwise. */
|
|
81
|
+
refusalReason: string | null;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Input to an adapter's `generate` call. The suggester does prep:
|
|
85
|
+
*
|
|
86
|
+
* - Resolves `AltRequest` from caller-provided fields + defaults
|
|
87
|
+
* - Composes the prompt via `composePrompt(request, policies)`
|
|
88
|
+
* - Calls `prepareForVision` on the bytes
|
|
89
|
+
*
|
|
90
|
+
* The adapter receives both the structured request (for native params
|
|
91
|
+
* like Anthropic's `max_tokens`) and the composed prompt string (for
|
|
92
|
+
* adapters that just inject text). Pre-computed once per call.
|
|
93
|
+
*/
|
|
94
|
+
export interface AltGenerateInput {
|
|
95
|
+
/** Bytes ready to send to the provider (post-prep, ≤ maxImageEdge). */
|
|
96
|
+
bytes: Uint8Array;
|
|
97
|
+
/** MIME of the prepared bytes — `image/jpeg` or `image/png`. */
|
|
98
|
+
mime: string;
|
|
99
|
+
/** Structured request — adapters with native parameters use this. */
|
|
100
|
+
request: AltRequest;
|
|
101
|
+
/** Composed prompt string — adapters that just need a prompt use this. */
|
|
102
|
+
prompt: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Per-task adapter contract. Every implementation honors this exactly;
|
|
106
|
+
* substitutable across tests and production via the factory.
|
|
107
|
+
*
|
|
108
|
+
* Throws on transport / provider errors (`AIAdapterFailedError` from
|
|
109
|
+
* `ai/errors.ts`). Refusals are NOT thrown — they're returned in the
|
|
110
|
+
* structured `AltSuggestion`. The distinction: throws are runtime
|
|
111
|
+
* failures (retryable; gateway-level concern); refusals are domain
|
|
112
|
+
* outcomes (not retryable; user-level concern).
|
|
113
|
+
*/
|
|
114
|
+
export interface AltTextAdapter {
|
|
115
|
+
/** Stable identifier for diagnostics ('anthropic', 'openai', 'ollama', 'null'). */
|
|
116
|
+
readonly name: string;
|
|
117
|
+
/**
|
|
118
|
+
* True when this adapter can describe the given MIME. v1.5 adapters
|
|
119
|
+
* support image MIMEs only. The null adapter returns false for
|
|
120
|
+
* everything.
|
|
121
|
+
*/
|
|
122
|
+
supports(mime: string): boolean;
|
|
123
|
+
/**
|
|
124
|
+
* Generate alt text. Forwards `signal` to the underlying provider
|
|
125
|
+
* call so consumers can cancel in-flight requests (e.g., when the
|
|
126
|
+
* author starts typing into the alt field).
|
|
127
|
+
*
|
|
128
|
+
* Throws `AIAdapterFailedError` / `AIInvalidResponseError` on
|
|
129
|
+
* transport or response-shape failures. Returns refusals as
|
|
130
|
+
* `AltSuggestion` with `refused: true`.
|
|
131
|
+
*/
|
|
132
|
+
generate(input: AltGenerateInput, signal?: AbortSignal): Promise<AltSuggestion>;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Type alias for prompt policies operating on alt-text requests.
|
|
136
|
+
* Per-task policy modules implement these and pass arrays to the
|
|
137
|
+
* generic `composePrompt<AltRequest>(req, policies)`.
|
|
138
|
+
*/
|
|
139
|
+
export type AltPromptPolicy = PromptPolicy<AltRequest>;
|
|
140
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/alt/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE3D;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAA;IACd;;;;;;;;OAQG;IACH,QAAQ,EAAE,MAAM,CAAA;IAChB;;;OAGG;IACH,KAAK,EAAE,QAAQ,CAAA;CAChB;AAED,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAA;AAEpC,sFAAsF;AACtF,eAAO,MAAM,mBAAmB,EAAE,UAIjC,CAAA;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,mEAAmE;IACnE,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAgB;IAC/B,uEAAuE;IACvE,KAAK,EAAE,UAAU,CAAA;IACjB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAA;IACZ,qEAAqE;IACrE,OAAO,EAAE,UAAU,CAAA;IACnB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IAErB;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;IAE/B;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAChF;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/alt/adapter.ts"],"names":[],"mappings":"AAuEA,sFAAsF;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAe;IAC7C,MAAM,EAAE,IAAI;IACZ,QAAQ,EAAE,GAAG;IACb,KAAK,EAAE,aAAa;CACrB,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { AIProvider } from '../ai/provider.js';
|
|
2
|
+
import type { AltTextAdapter } from './adapter.js';
|
|
3
|
+
/**
|
|
4
|
+
* Default model for the Anthropic adapter. Haiku is the cost-optimized
|
|
5
|
+
* choice for the alt-text task (~$0.003/image at 768x768 input). Sites
|
|
6
|
+
* needing higher quality set `altText.model` in `site.config.ts` to a
|
|
7
|
+
* Sonnet or Opus model.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ANTHROPIC_DEFAULT_MODEL = "claude-haiku-4-5";
|
|
10
|
+
/**
|
|
11
|
+
* Anthropic transport-only options. Per Path X (single-axis with
|
|
12
|
+
* transport-vs-task split for AI), these fields bind to "which Anthropic
|
|
13
|
+
* account at which endpoint" — not to per-task tuning. Per-task config
|
|
14
|
+
* (model, systemPrompt, maxTokens) lives on the resolver-supplied
|
|
15
|
+
* `AltTextTaskConfig`, not here.
|
|
16
|
+
*/
|
|
17
|
+
export interface AnthropicTransportOptions {
|
|
18
|
+
apiKey: string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional override of the SDK base URL — handy for tests pointing
|
|
21
|
+
* at msw, or future operators routing through a private proxy.
|
|
22
|
+
*/
|
|
23
|
+
baseURL?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Override the SDK's retry count (default 2). Tests pass 0 to keep
|
|
26
|
+
* runs deterministic and fast; production sticks with the default
|
|
27
|
+
* so transient 429/5xx are auto-retried with backoff.
|
|
28
|
+
*/
|
|
29
|
+
maxRetries?: number;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Internal type for `createAnthropicAltAdapter` callers (tests).
|
|
33
|
+
* Combines transport with per-task config so existing tests don't have
|
|
34
|
+
* to thread two arguments. New code goes through the operator-facing
|
|
35
|
+
* `anthropicProvider(transport).altText(taskConfig)` chain.
|
|
36
|
+
*/
|
|
37
|
+
export interface AnthropicAltAdapterOptions extends AnthropicTransportOptions {
|
|
38
|
+
/** Model ID; defaults to {@link ANTHROPIC_DEFAULT_MODEL} when absent. */
|
|
39
|
+
model?: string;
|
|
40
|
+
/** Operator-supplied system prompt; prepended to system-composed prompt. */
|
|
41
|
+
systemPrompt?: string;
|
|
42
|
+
/** Generation token cap; provider derives from maxChars when absent. */
|
|
43
|
+
maxTokens?: number;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Construct the Anthropic alt-text adapter. Internal factory — kept
|
|
47
|
+
* public for tests + advanced wiring. Operator-facing config goes
|
|
48
|
+
* through `anthropicProvider(transport).altText(taskConfig)` (Path X).
|
|
49
|
+
*/
|
|
50
|
+
export declare function createAnthropicAltAdapter(opts: AnthropicAltAdapterOptions): AltTextAdapter;
|
|
51
|
+
/**
|
|
52
|
+
* Operator-facing Anthropic provider. Constructs the transport-only
|
|
53
|
+
* `AIProvider` used in `site.config.ts`:
|
|
54
|
+
*
|
|
55
|
+
* const anthropic = anthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })
|
|
56
|
+
* ai: { provider: anthropic, model: 'claude-haiku-4-5' }
|
|
57
|
+
*
|
|
58
|
+
* The provider exposes per-task builders (`.altText({...})`); the
|
|
59
|
+
* resolver supplies the merged `AltTextTaskConfig` from the three-rung
|
|
60
|
+
* inheritance chain at boot.
|
|
61
|
+
*/
|
|
62
|
+
export declare function anthropicProvider(transport: AnthropicTransportOptions): AIProvider;
|
|
63
|
+
//# sourceMappingURL=anthropic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/alt/anthropic.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AASlD;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,qBAAqB,CAAA;AAUzD;;;;;;GAMG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA2B,SAAQ,yBAAyB;IAC3E,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,0BAA0B,GAAG,cAAc,CAoD1F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,yBAAyB,GAAG,UAAU,CAelF"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Claude adapter — alt-text via the `messages.create` vision API.
|
|
3
|
+
*
|
|
4
|
+
* # Defaults
|
|
5
|
+
*
|
|
6
|
+
* - Model: `claude-haiku-4-5` (cost-effective vision; ~$0.003/image).
|
|
7
|
+
* Sites needing higher quality override via `altText.model` in `site.config.ts`.
|
|
8
|
+
*
|
|
9
|
+
* # API contract details (verified against @anthropic-ai/sdk v0.92.0)
|
|
10
|
+
*
|
|
11
|
+
* - Image content: `{ type: 'image', source: { type: 'base64',
|
|
12
|
+
* media_type, data: <base64-string> } }`. SDK requires base64-encoded
|
|
13
|
+
* string, not raw bytes/Uint8Array.
|
|
14
|
+
* - Accepted MIME types: `image/jpeg`, `image/png`, `image/gif`,
|
|
15
|
+
* `image/webp`. After `prepareForVision`, our bytes are always JPEG
|
|
16
|
+
* or PNG, both supported.
|
|
17
|
+
* - `max_tokens` is required by the API. Scaffold derives it from
|
|
18
|
+
* `request.maxChars` unless operator overrides via `maxTokens`.
|
|
19
|
+
* - `system` parameter at the top level (not a message role). The
|
|
20
|
+
* scaffold-prepared `systemPrompt` (operator override + composed)
|
|
21
|
+
* becomes the system prompt; the user message holds the image.
|
|
22
|
+
*
|
|
23
|
+
* # AbortSignal
|
|
24
|
+
*
|
|
25
|
+
* - Passed via `messages.create(body, { signal })`. SDK throws
|
|
26
|
+
* `APIUserAbortError` on abort; scaffold's `isAbortError` recognizes
|
|
27
|
+
* it so the suggester can return null on cancellation.
|
|
28
|
+
*
|
|
29
|
+
* # SOLID
|
|
30
|
+
*
|
|
31
|
+
* - SRP: this module owns the Anthropic-specific request shape and
|
|
32
|
+
* response parsing only. Orchestration (prompt-prepend, max-tokens
|
|
33
|
+
* derivation, error translation, refusal detection) lives in
|
|
34
|
+
* `ai/adapter-scaffold.ts`.
|
|
35
|
+
* - LSP: implements `AltTextAdapter` exactly via the scaffold —
|
|
36
|
+
* substitutable.
|
|
37
|
+
* - DIP: callers depend on `AltTextAdapter`; never on `Anthropic` SDK
|
|
38
|
+
* type directly.
|
|
39
|
+
*/
|
|
40
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
41
|
+
import { AIInvalidResponseError } from '../ai/errors.js';
|
|
42
|
+
import { buildAltAdapterFromScaffold } from '../ai/adapter-scaffold.js';
|
|
43
|
+
/**
|
|
44
|
+
* Anthropic-specific refusal phrases observed in production responses
|
|
45
|
+
* but not yet in `ai/refusal.ts`'s shared list. Maintained here so
|
|
46
|
+
* provider-specific markers evolve independently of the shared list.
|
|
47
|
+
*/
|
|
48
|
+
const ANTHROPIC_REFUSAL_MARKERS = ['i cannot create captions', 'i cannot generate descriptions'];
|
|
49
|
+
/**
|
|
50
|
+
* Default model for the Anthropic adapter. Haiku is the cost-optimized
|
|
51
|
+
* choice for the alt-text task (~$0.003/image at 768x768 input). Sites
|
|
52
|
+
* needing higher quality set `altText.model` in `site.config.ts` to a
|
|
53
|
+
* Sonnet or Opus model.
|
|
54
|
+
*/
|
|
55
|
+
export const ANTHROPIC_DEFAULT_MODEL = 'claude-haiku-4-5';
|
|
56
|
+
/**
|
|
57
|
+
* Anthropic only accepts a subset of image MIME types. After
|
|
58
|
+
* `prepareForVision` our bytes are JPEG or PNG, but defending here
|
|
59
|
+
* means a future caller invoking the adapter directly with WebP or
|
|
60
|
+
* GIF still gets the right answer.
|
|
61
|
+
*/
|
|
62
|
+
const ANTHROPIC_SUPPORTED_MIMES = new Set(['image/jpeg', 'image/png', 'image/gif', 'image/webp']);
|
|
63
|
+
/** Encode a Uint8Array as a base64 string for the API call. */
|
|
64
|
+
function toBase64(bytes) {
|
|
65
|
+
return Buffer.from(bytes).toString('base64');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Construct the Anthropic alt-text adapter. Internal factory — kept
|
|
69
|
+
* public for tests + advanced wiring. Operator-facing config goes
|
|
70
|
+
* through `anthropicProvider(transport).altText(taskConfig)` (Path X).
|
|
71
|
+
*/
|
|
72
|
+
export function createAnthropicAltAdapter(opts) {
|
|
73
|
+
const client = new Anthropic({
|
|
74
|
+
apiKey: opts.apiKey,
|
|
75
|
+
baseURL: opts.baseURL,
|
|
76
|
+
maxRetries: opts.maxRetries,
|
|
77
|
+
});
|
|
78
|
+
const model = opts.model ?? ANTHROPIC_DEFAULT_MODEL;
|
|
79
|
+
return buildAltAdapterFromScaffold({
|
|
80
|
+
name: 'anthropic',
|
|
81
|
+
supportedMimes: ANTHROPIC_SUPPORTED_MIMES,
|
|
82
|
+
operatorSystemPrompt: opts.systemPrompt,
|
|
83
|
+
operatorMaxTokens: opts.maxTokens,
|
|
84
|
+
refusalMarkers: ANTHROPIC_REFUSAL_MARKERS,
|
|
85
|
+
isAbortError: err => err instanceof Anthropic.APIUserAbortError,
|
|
86
|
+
async callProvider({ bytes, mime, systemPrompt, maxTokens, signal }) {
|
|
87
|
+
const response = await client.messages.create({
|
|
88
|
+
model,
|
|
89
|
+
max_tokens: maxTokens,
|
|
90
|
+
system: systemPrompt,
|
|
91
|
+
messages: [
|
|
92
|
+
{
|
|
93
|
+
role: 'user',
|
|
94
|
+
content: [
|
|
95
|
+
{
|
|
96
|
+
type: 'image',
|
|
97
|
+
source: {
|
|
98
|
+
type: 'base64',
|
|
99
|
+
// SDK accepts the four MIMEs above; cast is safe
|
|
100
|
+
// because supports() guards entry.
|
|
101
|
+
media_type: mime,
|
|
102
|
+
data: toBase64(bytes),
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
}, { signal });
|
|
109
|
+
// Response shape: `content` is an array of blocks; alt-text comes
|
|
110
|
+
// back as a single text block. Defensive against tool-use blocks
|
|
111
|
+
// or unexpected shapes by finding the first text block.
|
|
112
|
+
const textBlock = response.content.find(block => block.type === 'text');
|
|
113
|
+
if (!textBlock || textBlock.type !== 'text') {
|
|
114
|
+
throw new AIInvalidResponseError('Anthropic response contained no text content block');
|
|
115
|
+
}
|
|
116
|
+
return textBlock.text;
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Operator-facing Anthropic provider. Constructs the transport-only
|
|
122
|
+
* `AIProvider` used in `site.config.ts`:
|
|
123
|
+
*
|
|
124
|
+
* const anthropic = anthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })
|
|
125
|
+
* ai: { provider: anthropic, model: 'claude-haiku-4-5' }
|
|
126
|
+
*
|
|
127
|
+
* The provider exposes per-task builders (`.altText({...})`); the
|
|
128
|
+
* resolver supplies the merged `AltTextTaskConfig` from the three-rung
|
|
129
|
+
* inheritance chain at boot.
|
|
130
|
+
*/
|
|
131
|
+
export function anthropicProvider(transport) {
|
|
132
|
+
if (!transport.apiKey) {
|
|
133
|
+
throw new Error('anthropicProvider: "apiKey" is required (typically `process.env.ANTHROPIC_API_KEY!`)');
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
name: 'anthropic',
|
|
137
|
+
altText(taskConfig) {
|
|
138
|
+
return createAnthropicAltAdapter({
|
|
139
|
+
...transport,
|
|
140
|
+
model: taskConfig.model,
|
|
141
|
+
systemPrompt: taskConfig.systemPrompt,
|
|
142
|
+
maxTokens: taskConfig.maxTokens,
|
|
143
|
+
});
|
|
144
|
+
},
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=anthropic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/alt/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,OAAO,SAAS,MAAM,mBAAmB,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAA;AAGvE;;;;GAIG;AACH,MAAM,yBAAyB,GAAsB,CAAC,0BAA0B,EAAE,gCAAgC,CAAC,CAAA;AAEnH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAAkB,CAAA;AAEzD;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAA;AAuCjG,+DAA+D;AAC/D,SAAS,QAAQ,CAAC,KAAiB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAgC;IACxE,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAA;IACF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,uBAAuB,CAAA;IAEnD,OAAO,2BAA2B,CAAC;QACjC,IAAI,EAAE,WAAW;QACjB,cAAc,EAAE,yBAAyB;QACzC,oBAAoB,EAAE,IAAI,CAAC,YAAY;QACvC,iBAAiB,EAAE,IAAI,CAAC,SAAS;QACjC,cAAc,EAAE,yBAAyB;QACzC,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,SAAS,CAAC,iBAAiB;QAC/D,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE;YACjE,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAC3C;gBACE,KAAK;gBACL,UAAU,EAAE,SAAS;gBACrB,MAAM,EAAE,YAAY;gBACpB,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,OAAO;gCACb,MAAM,EAAE;oCACN,IAAI,EAAE,QAAQ;oCACd,iDAAiD;oCACjD,mCAAmC;oCACnC,UAAU,EAAE,IAA+D;oCAC3E,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC;iCACtB;6BACF;yBACF;qBACF;iBACF;aACF,EACD,EAAE,MAAM,EAAE,CACX,CAAA;YAED,kEAAkE;YAClE,iEAAiE;YACjE,wDAAwD;YACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;YACvE,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC5C,MAAM,IAAI,sBAAsB,CAAC,oDAAoD,CAAC,CAAA;YACxF,CAAC;YACD,OAAO,SAAS,CAAC,IAAI,CAAA;QACvB,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAoC;IACpE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAA;IACzG,CAAC;IACD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,CAAC,UAA6B;YACnC,OAAO,yBAAyB,CAAC;gBAC/B,GAAG,SAAS;gBACZ,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,SAAS,EAAE,UAAU,CAAC,SAAS;aAChC,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alt-text config resolver — composes gazetta-level + site-level + per-target
|
|
3
|
+
* config into a single `ResolvedAltConfig` per [`design-ai.md`](../../../.claude/rules/design-ai.md)
|
|
4
|
+
* "Three-rung inheritance" + Path X Exception A.
|
|
5
|
+
*
|
|
6
|
+
* Three-rung chain (target → site → gazetta), per field:
|
|
7
|
+
*
|
|
8
|
+
* - `provider` (transport): target.altText.ai.provider ?? site.ai.provider ?? gazetta.ai.provider
|
|
9
|
+
* - `model`: target.altText.ai.model ?? site.ai.model ?? gazetta.ai.model
|
|
10
|
+
* ?? PROVIDER_DEFAULT_MODELS[provider.name]
|
|
11
|
+
* - `systemPrompt`: target.altText.ai.systemPrompt ?? site.altText.systemPrompt
|
|
12
|
+
* ?? gazetta.altText.systemPrompt ?? null
|
|
13
|
+
* - `maxTokens`: target.altText.ai.maxTokens ?? site.altText.maxTokens
|
|
14
|
+
* ?? gazetta.altText.maxTokens ?? undefined
|
|
15
|
+
* - `auto` (behavior): target.altText.auto ?? site.altText.auto ?? gazetta.altText.auto
|
|
16
|
+
* ?? DEFAULT_AUTO
|
|
17
|
+
* - `maxImageEdge` (behavior): target.altText.maxImageEdge ?? site.altText.maxImageEdge
|
|
18
|
+
* ?? gazetta.altText.maxImageEdge ?? MAX_EDGE
|
|
19
|
+
*
|
|
20
|
+
* Behavior fields (`auto`, `maxImageEdge`) live at the root of `altText:`
|
|
21
|
+
* (Exception B); AI fields (provider, model, systemPrompt, maxTokens)
|
|
22
|
+
* live under `altText.ai` at target level (Exception A's third rung).
|
|
23
|
+
*
|
|
24
|
+
* Pure function — no I/O, no env reads, no SDK construction. The factory
|
|
25
|
+
* in `alt/factory.ts` consumes the resolved config + calls
|
|
26
|
+
* `provider.altText({...})` to build the adapter.
|
|
27
|
+
*
|
|
28
|
+
* # SOLID
|
|
29
|
+
*
|
|
30
|
+
* - SRP: this module owns "merge config layers into one resolved value."
|
|
31
|
+
* Doesn't read env, doesn't construct adapters.
|
|
32
|
+
* - DIP: factory depends on this resolved shape, never on raw
|
|
33
|
+
* `SiteManifest`/`TargetConfig`.
|
|
34
|
+
* - LSP: resolver is total — every input shape produces either a
|
|
35
|
+
* `ResolvedAltConfig` or `null`.
|
|
36
|
+
*/
|
|
37
|
+
import type { AIProvider } from '../ai/provider.js';
|
|
38
|
+
import type { GazettaManifest, SiteManifest, TargetConfig } from '../types.js';
|
|
39
|
+
/**
|
|
40
|
+
* Fully-resolved alt-text config — what the factory needs to construct
|
|
41
|
+
* an adapter and what the suggester needs to invoke it. No optional
|
|
42
|
+
* fields after this point; defaults applied (except `systemPrompt` and
|
|
43
|
+
* `maxTokens` which are legitimately absent when no operator override
|
|
44
|
+
* is configured anywhere in the chain).
|
|
45
|
+
*/
|
|
46
|
+
export interface ResolvedAltConfig {
|
|
47
|
+
provider: AIProvider;
|
|
48
|
+
/** Concrete model ID. Either explicitly configured or per-provider default. */
|
|
49
|
+
model: string;
|
|
50
|
+
/** Operator-supplied system prompt; null = use system default only. */
|
|
51
|
+
systemPrompt: string | null;
|
|
52
|
+
/** Generation token cap; undefined = provider default. */
|
|
53
|
+
maxTokens: number | undefined;
|
|
54
|
+
/** Whether upload flows auto-fire suggest after upload. */
|
|
55
|
+
auto: boolean;
|
|
56
|
+
/** Long-edge cap for vision-call image bytes. */
|
|
57
|
+
maxImageEdge: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Resolve alt-text config from gazetta + site + target. Returns null
|
|
61
|
+
* when no provider is configured at any layer.
|
|
62
|
+
*
|
|
63
|
+
* `gazetta` is optional — sites without a project-level `gazetta.config.ts`
|
|
64
|
+
* pass `undefined` (or omit the argument).
|
|
65
|
+
*/
|
|
66
|
+
export declare function resolveAltConfig(site: Pick<SiteManifest, 'ai' | 'altText'>, target: Pick<TargetConfig, 'altText'> | undefined, gazetta?: Pick<GazettaManifest, 'ai' | 'altText'>): ResolvedAltConfig | null;
|
|
67
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/alt/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAGnD,OAAO,KAAK,EAA0C,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAKtH;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,UAAU,CAAA;IACpB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAA;IACb,uEAAuE;IACvE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,0DAA0D;IAC1D,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,2DAA2D;IAC3D,IAAI,EAAE,OAAO,CAAA;IACb,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,EAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,GAChD,iBAAiB,GAAG,IAAI,CAkC1B"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { PROVIDER_DEFAULT_MODELS } from '../ai/provider.js';
|
|
2
|
+
import { MAX_EDGE } from '../ai/vision-prep.js';
|
|
3
|
+
/** Hardcoded default for the `auto` flag. */
|
|
4
|
+
const DEFAULT_AUTO = true;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve alt-text config from gazetta + site + target. Returns null
|
|
7
|
+
* when no provider is configured at any layer.
|
|
8
|
+
*
|
|
9
|
+
* `gazetta` is optional — sites without a project-level `gazetta.config.ts`
|
|
10
|
+
* pass `undefined` (or omit the argument).
|
|
11
|
+
*/
|
|
12
|
+
export function resolveAltConfig(site, target, gazetta) {
|
|
13
|
+
const siteAi = site.ai;
|
|
14
|
+
const siteAlt = site.altText;
|
|
15
|
+
const targetAlt = target?.altText;
|
|
16
|
+
const gazettaAi = gazetta?.ai;
|
|
17
|
+
const gazettaAlt = gazetta?.altText;
|
|
18
|
+
// Provider: target → site → gazetta. If nothing configured anywhere,
|
|
19
|
+
// the feature is off.
|
|
20
|
+
const provider = targetAlt?.ai?.provider ?? siteAi?.provider ?? gazettaAi?.provider;
|
|
21
|
+
if (!provider)
|
|
22
|
+
return null;
|
|
23
|
+
// Model: target → site → gazetta → per-provider default.
|
|
24
|
+
const model = targetAlt?.ai?.model ?? siteAi?.model ?? gazettaAi?.model ?? PROVIDER_DEFAULT_MODELS[provider.name] ?? null;
|
|
25
|
+
if (model === null) {
|
|
26
|
+
// Plugin-supplied provider with no default-model registration AND
|
|
27
|
+
// no operator-supplied model anywhere in the chain. Surface as
|
|
28
|
+
// "feature off" rather than constructing an adapter that will fail
|
|
29
|
+
// at first SDK call.
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// systemPrompt: target → site → gazetta → null (use system default).
|
|
33
|
+
const systemPrompt = targetAlt?.ai?.systemPrompt ?? siteAlt?.systemPrompt ?? gazettaAlt?.systemPrompt ?? null;
|
|
34
|
+
// maxTokens: target → site → gazetta → undefined (provider derives from maxChars).
|
|
35
|
+
const maxTokens = targetAlt?.ai?.maxTokens ?? siteAlt?.maxTokens ?? gazettaAlt?.maxTokens;
|
|
36
|
+
// Behavior fields (auto, maxImageEdge): target → site → gazetta → hardcoded defaults.
|
|
37
|
+
const auto = targetAlt?.auto ?? siteAlt?.auto ?? gazettaAlt?.auto ?? DEFAULT_AUTO;
|
|
38
|
+
const maxImageEdge = targetAlt?.maxImageEdge ?? siteAlt?.maxImageEdge ?? gazettaAlt?.maxImageEdge ?? MAX_EDGE;
|
|
39
|
+
return { provider, model, systemPrompt, maxTokens, auto, maxImageEdge };
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/alt/config.ts"],"names":[],"mappings":"AAqCA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAG/C,6CAA6C;AAC7C,MAAM,YAAY,GAAG,IAAI,CAAA;AAuBzB;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAA0C,EAC1C,MAAiD,EACjD,OAAiD;IAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAA;IACtB,MAAM,OAAO,GAAkC,IAAI,CAAC,OAAO,CAAA;IAC3D,MAAM,SAAS,GAAoC,MAAM,EAAE,OAAO,CAAA;IAClE,MAAM,SAAS,GAAG,OAAO,EAAE,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,OAAO,EAAE,OAAO,CAAA;IAEnC,qEAAqE;IACrE,sBAAsB;IACtB,MAAM,QAAQ,GAAG,SAAS,EAAE,EAAE,EAAE,QAAQ,IAAI,MAAM,EAAE,QAAQ,IAAI,SAAS,EAAE,QAAQ,CAAA;IACnF,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAE1B,yDAAyD;IACzD,MAAM,KAAK,GACT,SAAS,EAAE,EAAE,EAAE,KAAK,IAAI,MAAM,EAAE,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;IAC7G,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,kEAAkE;QAClE,+DAA+D;QAC/D,mEAAmE;QACnE,qBAAqB;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,qEAAqE;IACrE,MAAM,YAAY,GAAG,SAAS,EAAE,EAAE,EAAE,YAAY,IAAI,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,YAAY,IAAI,IAAI,CAAA;IAE7G,mFAAmF;IACnF,MAAM,SAAS,GAAG,SAAS,EAAE,EAAE,EAAE,SAAS,IAAI,OAAO,EAAE,SAAS,IAAI,UAAU,EAAE,SAAS,CAAA;IAEzF,sFAAsF;IACtF,MAAM,IAAI,GAAG,SAAS,EAAE,IAAI,IAAI,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,IAAI,IAAI,YAAY,CAAA;IACjF,MAAM,YAAY,GAAG,SAAS,EAAE,YAAY,IAAI,OAAO,EAAE,YAAY,IAAI,UAAU,EAAE,YAAY,IAAI,QAAQ,CAAA;IAE7G,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;AACzE,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AltTextAdapter } from './adapter.js';
|
|
2
|
+
import type { GazettaManifest, SiteManifest, TargetConfig } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* True when the resolved alt-text config has all required pieces.
|
|
5
|
+
* Pure: returns the structural state — does NOT verify the credential
|
|
6
|
+
* works (no network call). Verification surfaces at first use of the route.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isAltAdapterConfigured(site: Pick<SiteManifest, 'ai' | 'altText'>, target: Pick<TargetConfig, 'altText'> | undefined, gazetta?: Pick<GazettaManifest, 'ai' | 'altText'>): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Construct the alt-text adapter for the resolved config. Returns the
|
|
11
|
+
* null adapter when no provider is configured at any layer.
|
|
12
|
+
*
|
|
13
|
+
* Always returns an `AltTextAdapter` — consumers never null-check the
|
|
14
|
+
* factory's return value. The null adapter throws if `generate()` is
|
|
15
|
+
* called, but that only happens if a consumer skips the
|
|
16
|
+
* `supports()` / `available()` capability check.
|
|
17
|
+
*/
|
|
18
|
+
export declare function buildAltAdapter(site: Pick<SiteManifest, 'ai' | 'altText'>, target: Pick<TargetConfig, 'altText'> | undefined, gazetta?: Pick<GazettaManifest, 'ai' | 'altText'>): AltTextAdapter;
|
|
19
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/alt/factory.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE9E;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,EAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,GAChD,OAAO,CAET;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,EAC1C,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,SAAS,EACjD,OAAO,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,GAAG,SAAS,CAAC,GAChD,cAAc,CAahB"}
|