@krantho/api 0.0.0-stage → 1.0.1
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/LICENSE +21 -0
- package/dist/active-locales.d.ts +11 -0
- package/dist/active-locales.d.ts.map +1 -0
- package/dist/active-locales.js +31 -0
- package/dist/active-locales.js.map +1 -0
- package/dist/assistant/access.d.ts +25 -0
- package/dist/assistant/access.d.ts.map +1 -0
- package/dist/assistant/access.js +35 -0
- package/dist/assistant/access.js.map +1 -0
- package/dist/assistant/agent-loop.d.ts +31 -0
- package/dist/assistant/agent-loop.d.ts.map +1 -0
- package/dist/assistant/agent-loop.js +183 -0
- package/dist/assistant/agent-loop.js.map +1 -0
- package/dist/assistant/call-handler.d.ts +15 -0
- package/dist/assistant/call-handler.d.ts.map +1 -0
- package/dist/assistant/call-handler.js +24 -0
- package/dist/assistant/call-handler.js.map +1 -0
- package/dist/assistant/chat-handler.d.ts +8 -0
- package/dist/assistant/chat-handler.d.ts.map +1 -0
- package/dist/assistant/chat-handler.js +79 -0
- package/dist/assistant/chat-handler.js.map +1 -0
- package/dist/assistant/chat-request.d.ts +16 -0
- package/dist/assistant/chat-request.d.ts.map +1 -0
- package/dist/assistant/chat-request.js +59 -0
- package/dist/assistant/chat-request.js.map +1 -0
- package/dist/assistant/confirm-handler.d.ts +3 -0
- package/dist/assistant/confirm-handler.d.ts.map +1 -0
- package/dist/assistant/confirm-handler.js +39 -0
- package/dist/assistant/confirm-handler.js.map +1 -0
- package/dist/assistant/document-change.d.ts +22 -0
- package/dist/assistant/document-change.d.ts.map +1 -0
- package/dist/assistant/document-change.js +74 -0
- package/dist/assistant/document-change.js.map +1 -0
- package/dist/assistant/document-lock.d.ts +12 -0
- package/dist/assistant/document-lock.d.ts.map +1 -0
- package/dist/assistant/document-lock.js +14 -0
- package/dist/assistant/document-lock.js.map +1 -0
- package/dist/assistant/execute-action.d.ts +19 -0
- package/dist/assistant/execute-action.d.ts.map +1 -0
- package/dist/assistant/execute-action.js +167 -0
- package/dist/assistant/execute-action.js.map +1 -0
- package/dist/assistant/pending-action.d.ts +86 -0
- package/dist/assistant/pending-action.d.ts.map +1 -0
- package/dist/assistant/pending-action.js +104 -0
- package/dist/assistant/pending-action.js.map +1 -0
- package/dist/assistant/protocol.d.ts +120 -0
- package/dist/assistant/protocol.d.ts.map +1 -0
- package/dist/assistant/protocol.js +2 -0
- package/dist/assistant/protocol.js.map +1 -0
- package/dist/assistant/routes.d.ts +4 -0
- package/dist/assistant/routes.d.ts.map +1 -0
- package/dist/assistant/routes.js +10 -0
- package/dist/assistant/routes.js.map +1 -0
- package/dist/assistant/sse-stream.d.ts +15 -0
- package/dist/assistant/sse-stream.d.ts.map +1 -0
- package/dist/assistant/sse-stream.js +61 -0
- package/dist/assistant/sse-stream.js.map +1 -0
- package/dist/assistant/status-handler.d.ts +8 -0
- package/dist/assistant/status-handler.d.ts.map +1 -0
- package/dist/assistant/status-handler.js +39 -0
- package/dist/assistant/status-handler.js.map +1 -0
- package/dist/assistant/system-prompt.d.ts +18 -0
- package/dist/assistant/system-prompt.d.ts.map +1 -0
- package/dist/assistant/system-prompt.js +48 -0
- package/dist/assistant/system-prompt.js.map +1 -0
- package/dist/assistant/tool-registry.d.ts +19 -0
- package/dist/assistant/tool-registry.d.ts.map +1 -0
- package/dist/assistant/tool-registry.js +69 -0
- package/dist/assistant/tool-registry.js.map +1 -0
- package/dist/assistant/tools/action-tools.d.ts +4 -0
- package/dist/assistant/tools/action-tools.d.ts.map +1 -0
- package/dist/assistant/tools/action-tools.js +132 -0
- package/dist/assistant/tools/action-tools.js.map +1 -0
- package/dist/assistant/tools/aeo-tools.d.ts +4 -0
- package/dist/assistant/tools/aeo-tools.d.ts.map +1 -0
- package/dist/assistant/tools/aeo-tools.js +162 -0
- package/dist/assistant/tools/aeo-tools.js.map +1 -0
- package/dist/assistant/tools/define-tool.d.ts +55 -0
- package/dist/assistant/tools/define-tool.d.ts.map +1 -0
- package/dist/assistant/tools/define-tool.js +5 -0
- package/dist/assistant/tools/define-tool.js.map +1 -0
- package/dist/assistant/tools/draft-tools.d.ts +7 -0
- package/dist/assistant/tools/draft-tools.d.ts.map +1 -0
- package/dist/assistant/tools/draft-tools.js +105 -0
- package/dist/assistant/tools/draft-tools.js.map +1 -0
- package/dist/assistant/tools/draft-write.d.ts +49 -0
- package/dist/assistant/tools/draft-write.d.ts.map +1 -0
- package/dist/assistant/tools/draft-write.js +122 -0
- package/dist/assistant/tools/draft-write.js.map +1 -0
- package/dist/assistant/tools/faq-fit.d.ts +32 -0
- package/dist/assistant/tools/faq-fit.d.ts.map +1 -0
- package/dist/assistant/tools/faq-fit.js +96 -0
- package/dist/assistant/tools/faq-fit.js.map +1 -0
- package/dist/assistant/tools/read-tools.d.ts +13 -0
- package/dist/assistant/tools/read-tools.d.ts.map +1 -0
- package/dist/assistant/tools/read-tools.js +242 -0
- package/dist/assistant/tools/read-tools.js.map +1 -0
- package/dist/assistant/tools/seo-tools.d.ts +4 -0
- package/dist/assistant/tools/seo-tools.d.ts.map +1 -0
- package/dist/assistant/tools/seo-tools.js +152 -0
- package/dist/assistant/tools/seo-tools.js.map +1 -0
- package/dist/assistant/tools/support.d.ts +35 -0
- package/dist/assistant/tools/support.d.ts.map +1 -0
- package/dist/assistant/tools/support.js +63 -0
- package/dist/assistant/tools/support.js.map +1 -0
- package/dist/assistant/untrusted.d.ts +15 -0
- package/dist/assistant/untrusted.d.ts.map +1 -0
- package/dist/assistant/untrusted.js +27 -0
- package/dist/assistant/untrusted.js.map +1 -0
- package/dist/assistant/write-policy.d.ts +20 -0
- package/dist/assistant/write-policy.d.ts.map +1 -0
- package/dist/assistant/write-policy.js +32 -0
- package/dist/assistant/write-policy.js.map +1 -0
- package/dist/auth-tokens.d.ts +31 -0
- package/dist/auth-tokens.d.ts.map +1 -0
- package/dist/auth-tokens.js +35 -0
- package/dist/auth-tokens.js.map +1 -0
- package/dist/content-change.d.ts +16 -0
- package/dist/content-change.d.ts.map +1 -0
- package/dist/content-change.js +34 -0
- package/dist/content-change.js.map +1 -0
- package/dist/content-locks.d.ts +27 -0
- package/dist/content-locks.d.ts.map +1 -0
- package/dist/content-locks.js +40 -0
- package/dist/content-locks.js.map +1 -0
- package/dist/cookies.d.ts +19 -0
- package/dist/cookies.d.ts.map +1 -0
- package/dist/cookies.js +52 -0
- package/dist/cookies.js.map +1 -0
- package/dist/create-api-handlers.d.ts +128 -0
- package/dist/create-api-handlers.d.ts.map +1 -0
- package/dist/create-api-handlers.js +384 -0
- package/dist/create-api-handlers.js.map +1 -0
- package/dist/document-actions.d.ts +25 -0
- package/dist/document-actions.d.ts.map +1 -0
- package/dist/document-actions.js +157 -0
- package/dist/document-actions.js.map +1 -0
- package/dist/document-seo.d.ts +15 -0
- package/dist/document-seo.d.ts.map +1 -0
- package/dist/document-seo.js +41 -0
- package/dist/document-seo.js.map +1 -0
- package/dist/group-by-collection.d.ts +6 -0
- package/dist/group-by-collection.d.ts.map +1 -0
- package/dist/group-by-collection.js +11 -0
- package/dist/group-by-collection.js.map +1 -0
- package/dist/handlers/apply-metadata-defaults.d.ts +4 -0
- package/dist/handlers/apply-metadata-defaults.d.ts.map +1 -0
- package/dist/handlers/apply-metadata-defaults.js +108 -0
- package/dist/handlers/apply-metadata-defaults.js.map +1 -0
- package/dist/handlers/auth-callback.d.ts +4 -0
- package/dist/handlers/auth-callback.d.ts.map +1 -0
- package/dist/handlers/auth-callback.js +217 -0
- package/dist/handlers/auth-callback.js.map +1 -0
- package/dist/handlers/auth-capabilities.d.ts +4 -0
- package/dist/handlers/auth-capabilities.d.ts.map +1 -0
- package/dist/handlers/auth-capabilities.js +19 -0
- package/dist/handlers/auth-capabilities.js.map +1 -0
- package/dist/handlers/auth-login.d.ts +4 -0
- package/dist/handlers/auth-login.d.ts.map +1 -0
- package/dist/handlers/auth-login.js +60 -0
- package/dist/handlers/auth-login.js.map +1 -0
- package/dist/handlers/auth-logout.d.ts +4 -0
- package/dist/handlers/auth-logout.d.ts.map +1 -0
- package/dist/handlers/auth-logout.js +40 -0
- package/dist/handlers/auth-logout.js.map +1 -0
- package/dist/handlers/auth-me.d.ts +4 -0
- package/dist/handlers/auth-me.d.ts.map +1 -0
- package/dist/handlers/auth-me.js +54 -0
- package/dist/handlers/auth-me.js.map +1 -0
- package/dist/handlers/auth-oidc-login.d.ts +4 -0
- package/dist/handlers/auth-oidc-login.d.ts.map +1 -0
- package/dist/handlers/auth-oidc-login.js +51 -0
- package/dist/handlers/auth-oidc-login.js.map +1 -0
- package/dist/handlers/auth-refresh.d.ts +15 -0
- package/dist/handlers/auth-refresh.d.ts.map +1 -0
- package/dist/handlers/auth-refresh.js +82 -0
- package/dist/handlers/auth-refresh.js.map +1 -0
- package/dist/handlers/bulk-delete.d.ts +8 -0
- package/dist/handlers/bulk-delete.d.ts.map +1 -0
- package/dist/handlers/bulk-delete.js +72 -0
- package/dist/handlers/bulk-delete.js.map +1 -0
- package/dist/handlers/bulk-publish.d.ts +8 -0
- package/dist/handlers/bulk-publish.d.ts.map +1 -0
- package/dist/handlers/bulk-publish.js +48 -0
- package/dist/handlers/bulk-publish.js.map +1 -0
- package/dist/handlers/capabilities.d.ts +4 -0
- package/dist/handlers/capabilities.d.ts.map +1 -0
- package/dist/handlers/capabilities.js +44 -0
- package/dist/handlers/capabilities.js.map +1 -0
- package/dist/handlers/content-changes.d.ts +28 -0
- package/dist/handlers/content-changes.d.ts.map +1 -0
- package/dist/handlers/content-changes.js +160 -0
- package/dist/handlers/content-changes.js.map +1 -0
- package/dist/handlers/content-lock.d.ts +13 -0
- package/dist/handlers/content-lock.d.ts.map +1 -0
- package/dist/handlers/content-lock.js +109 -0
- package/dist/handlers/content-lock.js.map +1 -0
- package/dist/handlers/content-tree.d.ts +11 -0
- package/dist/handlers/content-tree.d.ts.map +1 -0
- package/dist/handlers/content-tree.js +28 -0
- package/dist/handlers/content-tree.js.map +1 -0
- package/dist/handlers/create-content.d.ts +4 -0
- package/dist/handlers/create-content.d.ts.map +1 -0
- package/dist/handlers/create-content.js +49 -0
- package/dist/handlers/create-content.js.map +1 -0
- package/dist/handlers/delete-content.d.ts +4 -0
- package/dist/handlers/delete-content.d.ts.map +1 -0
- package/dist/handlers/delete-content.js +17 -0
- package/dist/handlers/delete-content.js.map +1 -0
- package/dist/handlers/delete-runtime-field.d.ts +4 -0
- package/dist/handlers/delete-runtime-field.d.ts.map +1 -0
- package/dist/handlers/delete-runtime-field.js +43 -0
- package/dist/handlers/delete-runtime-field.js.map +1 -0
- package/dist/handlers/export-bundle.d.ts +13 -0
- package/dist/handlers/export-bundle.d.ts.map +1 -0
- package/dist/handlers/export-bundle.js +99 -0
- package/dist/handlers/export-bundle.js.map +1 -0
- package/dist/handlers/export-content.d.ts +7 -0
- package/dist/handlers/export-content.d.ts.map +1 -0
- package/dist/handlers/export-content.js +69 -0
- package/dist/handlers/export-content.js.map +1 -0
- package/dist/handlers/export-schema.d.ts +4 -0
- package/dist/handlers/export-schema.d.ts.map +1 -0
- package/dist/handlers/export-schema.js +13 -0
- package/dist/handlers/export-schema.js.map +1 -0
- package/dist/handlers/get-content.d.ts +4 -0
- package/dist/handlers/get-content.d.ts.map +1 -0
- package/dist/handlers/get-content.js +65 -0
- package/dist/handlers/get-content.js.map +1 -0
- package/dist/handlers/get-runtime-schema.d.ts +4 -0
- package/dist/handlers/get-runtime-schema.d.ts.map +1 -0
- package/dist/handlers/get-runtime-schema.js +17 -0
- package/dist/handlers/get-runtime-schema.js.map +1 -0
- package/dist/handlers/get-schema.d.ts +4 -0
- package/dist/handlers/get-schema.d.ts.map +1 -0
- package/dist/handlers/get-schema.js +87 -0
- package/dist/handlers/get-schema.js.map +1 -0
- package/dist/handlers/get-version.d.ts +4 -0
- package/dist/handlers/get-version.d.ts.map +1 -0
- package/dist/handlers/get-version.js +26 -0
- package/dist/handlers/get-version.js.map +1 -0
- package/dist/handlers/import-bundle.d.ts +4 -0
- package/dist/handlers/import-bundle.d.ts.map +1 -0
- package/dist/handlers/import-bundle.js +55 -0
- package/dist/handlers/import-bundle.js.map +1 -0
- package/dist/handlers/import-content.d.ts +4 -0
- package/dist/handlers/import-content.d.ts.map +1 -0
- package/dist/handlers/import-content.js +152 -0
- package/dist/handlers/import-content.js.map +1 -0
- package/dist/handlers/index.d.ts +87 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +87 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/list-collection.d.ts +8 -0
- package/dist/handlers/list-collection.d.ts.map +1 -0
- package/dist/handlers/list-collection.js +14 -0
- package/dist/handlers/list-collection.js.map +1 -0
- package/dist/handlers/list-collections.d.ts +4 -0
- package/dist/handlers/list-collections.d.ts.map +1 -0
- package/dist/handlers/list-collections.js +17 -0
- package/dist/handlers/list-collections.js.map +1 -0
- package/dist/handlers/list-content.d.ts +8 -0
- package/dist/handlers/list-content.d.ts.map +1 -0
- package/dist/handlers/list-content.js +22 -0
- package/dist/handlers/list-content.js.map +1 -0
- package/dist/handlers/list-query.d.ts +7 -0
- package/dist/handlers/list-query.d.ts.map +1 -0
- package/dist/handlers/list-query.js +36 -0
- package/dist/handlers/list-query.js.map +1 -0
- package/dist/handlers/list-versions.d.ts +4 -0
- package/dist/handlers/list-versions.d.ts.map +1 -0
- package/dist/handlers/list-versions.js +19 -0
- package/dist/handlers/list-versions.js.map +1 -0
- package/dist/handlers/llm-credential.d.ts +46 -0
- package/dist/handlers/llm-credential.d.ts.map +1 -0
- package/dist/handlers/llm-credential.js +68 -0
- package/dist/handlers/llm-credential.js.map +1 -0
- package/dist/handlers/llm-resolve.d.ts +45 -0
- package/dist/handlers/llm-resolve.d.ts.map +1 -0
- package/dist/handlers/llm-resolve.js +126 -0
- package/dist/handlers/llm-resolve.js.map +1 -0
- package/dist/handlers/llm-settings.d.ts +19 -0
- package/dist/handlers/llm-settings.d.ts.map +1 -0
- package/dist/handlers/llm-settings.js +209 -0
- package/dist/handlers/llm-settings.js.map +1 -0
- package/dist/handlers/media-bulk-delete.d.ts +4 -0
- package/dist/handlers/media-bulk-delete.d.ts.map +1 -0
- package/dist/handlers/media-bulk-delete.js +19 -0
- package/dist/handlers/media-bulk-delete.js.map +1 -0
- package/dist/handlers/media-bulk-update.d.ts +4 -0
- package/dist/handlers/media-bulk-update.d.ts.map +1 -0
- package/dist/handlers/media-bulk-update.js +25 -0
- package/dist/handlers/media-bulk-update.js.map +1 -0
- package/dist/handlers/media-delete.d.ts +4 -0
- package/dist/handlers/media-delete.d.ts.map +1 -0
- package/dist/handlers/media-delete.js +27 -0
- package/dist/handlers/media-delete.js.map +1 -0
- package/dist/handlers/media-duplicate.d.ts +4 -0
- package/dist/handlers/media-duplicate.d.ts.map +1 -0
- package/dist/handlers/media-duplicate.js +20 -0
- package/dist/handlers/media-duplicate.js.map +1 -0
- package/dist/handlers/media-folders.d.ts +12 -0
- package/dist/handlers/media-folders.d.ts.map +1 -0
- package/dist/handlers/media-folders.js +119 -0
- package/dist/handlers/media-folders.js.map +1 -0
- package/dist/handlers/media-get.d.ts +4 -0
- package/dist/handlers/media-get.d.ts.map +1 -0
- package/dist/handlers/media-get.js +16 -0
- package/dist/handlers/media-get.js.map +1 -0
- package/dist/handlers/media-image-info.d.ts +4 -0
- package/dist/handlers/media-image-info.d.ts.map +1 -0
- package/dist/handlers/media-image-info.js +32 -0
- package/dist/handlers/media-image-info.js.map +1 -0
- package/dist/handlers/media-image.d.ts +11 -0
- package/dist/handlers/media-image.d.ts.map +1 -0
- package/dist/handlers/media-image.js +116 -0
- package/dist/handlers/media-image.js.map +1 -0
- package/dist/handlers/media-info.d.ts +4 -0
- package/dist/handlers/media-info.d.ts.map +1 -0
- package/dist/handlers/media-info.js +18 -0
- package/dist/handlers/media-info.js.map +1 -0
- package/dist/handlers/media-list.d.ts +4 -0
- package/dist/handlers/media-list.d.ts.map +1 -0
- package/dist/handlers/media-list.js +14 -0
- package/dist/handlers/media-list.js.map +1 -0
- package/dist/handlers/media-register.d.ts +4 -0
- package/dist/handlers/media-register.d.ts.map +1 -0
- package/dist/handlers/media-register.js +57 -0
- package/dist/handlers/media-register.js.map +1 -0
- package/dist/handlers/media-replace.d.ts +9 -0
- package/dist/handlers/media-replace.d.ts.map +1 -0
- package/dist/handlers/media-replace.js +53 -0
- package/dist/handlers/media-replace.js.map +1 -0
- package/dist/handlers/media-tags.d.ts +4 -0
- package/dist/handlers/media-tags.d.ts.map +1 -0
- package/dist/handlers/media-tags.js +9 -0
- package/dist/handlers/media-tags.js.map +1 -0
- package/dist/handlers/media-update.d.ts +4 -0
- package/dist/handlers/media-update.d.ts.map +1 -0
- package/dist/handlers/media-update.js +64 -0
- package/dist/handlers/media-update.js.map +1 -0
- package/dist/handlers/media-upload.d.ts +4 -0
- package/dist/handlers/media-upload.d.ts.map +1 -0
- package/dist/handlers/media-upload.js +26 -0
- package/dist/handlers/media-upload.js.map +1 -0
- package/dist/handlers/media-usage.d.ts +9 -0
- package/dist/handlers/media-usage.d.ts.map +1 -0
- package/dist/handlers/media-usage.js +36 -0
- package/dist/handlers/media-usage.js.map +1 -0
- package/dist/handlers/migration-conflicts.d.ts +13 -0
- package/dist/handlers/migration-conflicts.d.ts.map +1 -0
- package/dist/handlers/migration-conflicts.js +55 -0
- package/dist/handlers/migration-conflicts.js.map +1 -0
- package/dist/handlers/migration-status.d.ts +4 -0
- package/dist/handlers/migration-status.d.ts.map +1 -0
- package/dist/handlers/migration-status.js +34 -0
- package/dist/handlers/migration-status.js.map +1 -0
- package/dist/handlers/publish-content.d.ts +9 -0
- package/dist/handlers/publish-content.d.ts.map +1 -0
- package/dist/handlers/publish-content.js +47 -0
- package/dist/handlers/publish-content.js.map +1 -0
- package/dist/handlers/publish-impact.d.ts +11 -0
- package/dist/handlers/publish-impact.d.ts.map +1 -0
- package/dist/handlers/publish-impact.js +44 -0
- package/dist/handlers/publish-impact.js.map +1 -0
- package/dist/handlers/resolve-page.d.ts +9 -0
- package/dist/handlers/resolve-page.d.ts.map +1 -0
- package/dist/handlers/resolve-page.js +105 -0
- package/dist/handlers/resolve-page.js.map +1 -0
- package/dist/handlers/restore-version.d.ts +4 -0
- package/dist/handlers/restore-version.d.ts.map +1 -0
- package/dist/handlers/restore-version.js +69 -0
- package/dist/handlers/restore-version.js.map +1 -0
- package/dist/handlers/runtime-metadata.d.ts +6 -0
- package/dist/handlers/runtime-metadata.d.ts.map +1 -0
- package/dist/handlers/runtime-metadata.js +82 -0
- package/dist/handlers/runtime-metadata.js.map +1 -0
- package/dist/handlers/save-runtime-field.d.ts +4 -0
- package/dist/handlers/save-runtime-field.d.ts.map +1 -0
- package/dist/handlers/save-runtime-field.js +108 -0
- package/dist/handlers/save-runtime-field.js.map +1 -0
- package/dist/handlers/search-content.d.ts +9 -0
- package/dist/handlers/search-content.d.ts.map +1 -0
- package/dist/handlers/search-content.js +40 -0
- package/dist/handlers/search-content.js.map +1 -0
- package/dist/handlers/seo-config.d.ts +16 -0
- package/dist/handlers/seo-config.d.ts.map +1 -0
- package/dist/handlers/seo-config.js +250 -0
- package/dist/handlers/seo-config.js.map +1 -0
- package/dist/handlers/seo-document.d.ts +24 -0
- package/dist/handlers/seo-document.d.ts.map +1 -0
- package/dist/handlers/seo-document.js +119 -0
- package/dist/handlers/seo-document.js.map +1 -0
- package/dist/handlers/seo-enrich-archetype.d.ts +71 -0
- package/dist/handlers/seo-enrich-archetype.d.ts.map +1 -0
- package/dist/handlers/seo-enrich-archetype.js +250 -0
- package/dist/handlers/seo-enrich-archetype.js.map +1 -0
- package/dist/handlers/seo-enrich-meta.d.ts +40 -0
- package/dist/handlers/seo-enrich-meta.d.ts.map +1 -0
- package/dist/handlers/seo-enrich-meta.js +121 -0
- package/dist/handlers/seo-enrich-meta.js.map +1 -0
- package/dist/handlers/seo-enrich-runner.d.ts +65 -0
- package/dist/handlers/seo-enrich-runner.d.ts.map +1 -0
- package/dist/handlers/seo-enrich-runner.js +192 -0
- package/dist/handlers/seo-enrich-runner.js.map +1 -0
- package/dist/handlers/seo-enrich.d.ts +10 -0
- package/dist/handlers/seo-enrich.d.ts.map +1 -0
- package/dist/handlers/seo-enrich.js +166 -0
- package/dist/handlers/seo-enrich.js.map +1 -0
- package/dist/handlers/seo-generate.d.ts +4 -0
- package/dist/handlers/seo-generate.d.ts.map +1 -0
- package/dist/handlers/seo-generate.js +31 -0
- package/dist/handlers/seo-generate.js.map +1 -0
- package/dist/handlers/seo-impact.d.ts +36 -0
- package/dist/handlers/seo-impact.d.ts.map +1 -0
- package/dist/handlers/seo-impact.js +137 -0
- package/dist/handlers/seo-impact.js.map +1 -0
- package/dist/handlers/seo-indexnow.d.ts +11 -0
- package/dist/handlers/seo-indexnow.d.ts.map +1 -0
- package/dist/handlers/seo-indexnow.js +15 -0
- package/dist/handlers/seo-indexnow.js.map +1 -0
- package/dist/handlers/seo-llms-txt.d.ts +26 -0
- package/dist/handlers/seo-llms-txt.d.ts.map +1 -0
- package/dist/handlers/seo-llms-txt.js +99 -0
- package/dist/handlers/seo-llms-txt.js.map +1 -0
- package/dist/handlers/seo-preview.d.ts +8 -0
- package/dist/handlers/seo-preview.d.ts.map +1 -0
- package/dist/handlers/seo-preview.js +49 -0
- package/dist/handlers/seo-preview.js.map +1 -0
- package/dist/handlers/seo-robots.d.ts +22 -0
- package/dist/handlers/seo-robots.d.ts.map +1 -0
- package/dist/handlers/seo-robots.js +48 -0
- package/dist/handlers/seo-robots.js.map +1 -0
- package/dist/handlers/seo-sitemap.d.ts +68 -0
- package/dist/handlers/seo-sitemap.d.ts.map +1 -0
- package/dist/handlers/seo-sitemap.js +178 -0
- package/dist/handlers/seo-sitemap.js.map +1 -0
- package/dist/handlers/seo-status.d.ts +4 -0
- package/dist/handlers/seo-status.d.ts.map +1 -0
- package/dist/handlers/seo-status.js +61 -0
- package/dist/handlers/seo-status.js.map +1 -0
- package/dist/handlers/seo-structured-data.d.ts +4 -0
- package/dist/handlers/seo-structured-data.d.ts.map +1 -0
- package/dist/handlers/seo-structured-data.js +18 -0
- package/dist/handlers/seo-structured-data.js.map +1 -0
- package/dist/handlers/site-config.d.ts +8 -0
- package/dist/handlers/site-config.d.ts.map +1 -0
- package/dist/handlers/site-config.js +26 -0
- package/dist/handlers/site-config.js.map +1 -0
- package/dist/handlers/site-preview.d.ts +10 -0
- package/dist/handlers/site-preview.d.ts.map +1 -0
- package/dist/handlers/site-preview.js +54 -0
- package/dist/handlers/site-preview.js.map +1 -0
- package/dist/handlers/site-settings.d.ts +17 -0
- package/dist/handlers/site-settings.d.ts.map +1 -0
- package/dist/handlers/site-settings.js +75 -0
- package/dist/handlers/site-settings.js.map +1 -0
- package/dist/handlers/snapshot-create.d.ts +4 -0
- package/dist/handlers/snapshot-create.d.ts.map +1 -0
- package/dist/handlers/snapshot-create.js +15 -0
- package/dist/handlers/snapshot-create.js.map +1 -0
- package/dist/handlers/snapshot-delete.d.ts +4 -0
- package/dist/handlers/snapshot-delete.d.ts.map +1 -0
- package/dist/handlers/snapshot-delete.js +21 -0
- package/dist/handlers/snapshot-delete.js.map +1 -0
- package/dist/handlers/snapshot-get.d.ts +4 -0
- package/dist/handlers/snapshot-get.d.ts.map +1 -0
- package/dist/handlers/snapshot-get.js +17 -0
- package/dist/handlers/snapshot-get.js.map +1 -0
- package/dist/handlers/snapshot-list.d.ts +4 -0
- package/dist/handlers/snapshot-list.d.ts.map +1 -0
- package/dist/handlers/snapshot-list.js +9 -0
- package/dist/handlers/snapshot-list.js.map +1 -0
- package/dist/handlers/snapshot-restore.d.ts +4 -0
- package/dist/handlers/snapshot-restore.d.ts.map +1 -0
- package/dist/handlers/snapshot-restore.js +27 -0
- package/dist/handlers/snapshot-restore.js.map +1 -0
- package/dist/handlers/translation-status.d.ts +9 -0
- package/dist/handlers/translation-status.d.ts.map +1 -0
- package/dist/handlers/translation-status.js +68 -0
- package/dist/handlers/translation-status.js.map +1 -0
- package/dist/handlers/update-content.d.ts +4 -0
- package/dist/handlers/update-content.d.ts.map +1 -0
- package/dist/handlers/update-content.js +66 -0
- package/dist/handlers/update-content.js.map +1 -0
- package/dist/handlers/user-create.d.ts +4 -0
- package/dist/handlers/user-create.d.ts.map +1 -0
- package/dist/handlers/user-create.js +38 -0
- package/dist/handlers/user-create.js.map +1 -0
- package/dist/handlers/user-delete.d.ts +4 -0
- package/dist/handlers/user-delete.d.ts.map +1 -0
- package/dist/handlers/user-delete.js +25 -0
- package/dist/handlers/user-delete.js.map +1 -0
- package/dist/handlers/user-get.d.ts +4 -0
- package/dist/handlers/user-get.d.ts.map +1 -0
- package/dist/handlers/user-get.js +22 -0
- package/dist/handlers/user-get.js.map +1 -0
- package/dist/handlers/user-list.d.ts +4 -0
- package/dist/handlers/user-list.d.ts.map +1 -0
- package/dist/handlers/user-list.js +28 -0
- package/dist/handlers/user-list.js.map +1 -0
- package/dist/handlers/user-permissions.d.ts +6 -0
- package/dist/handlers/user-permissions.d.ts.map +1 -0
- package/dist/handlers/user-permissions.js +42 -0
- package/dist/handlers/user-permissions.js.map +1 -0
- package/dist/handlers/user-update.d.ts +4 -0
- package/dist/handlers/user-update.d.ts.map +1 -0
- package/dist/handlers/user-update.js +54 -0
- package/dist/handlers/user-update.js.map +1 -0
- package/dist/handlers/validate-all.d.ts +4 -0
- package/dist/handlers/validate-all.d.ts.map +1 -0
- package/dist/handlers/validate-all.js +14 -0
- package/dist/handlers/validate-all.js.map +1 -0
- package/dist/handlers/version-retention.d.ts +6 -0
- package/dist/handlers/version-retention.d.ts.map +1 -0
- package/dist/handlers/version-retention.js +40 -0
- package/dist/handlers/version-retention.js.map +1 -0
- package/dist/handlers/webhook-deliveries.d.ts +4 -0
- package/dist/handlers/webhook-deliveries.d.ts.map +1 -0
- package/dist/handlers/webhook-deliveries.js +24 -0
- package/dist/handlers/webhook-deliveries.js.map +1 -0
- package/dist/handlers/webhook-retry.d.ts +11 -0
- package/dist/handlers/webhook-retry.d.ts.map +1 -0
- package/dist/handlers/webhook-retry.js +69 -0
- package/dist/handlers/webhook-retry.js.map +1 -0
- package/dist/head.d.ts +9 -0
- package/dist/head.d.ts.map +1 -0
- package/dist/head.js +28 -0
- package/dist/head.js.map +1 -0
- package/dist/hooks.d.ts +34 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +19 -0
- package/dist/hooks.js.map +1 -0
- package/dist/image-cache.d.ts +47 -0
- package/dist/image-cache.d.ts.map +1 -0
- package/dist/image-cache.js +112 -0
- package/dist/image-cache.js.map +1 -0
- package/dist/image-dimensions.d.ts +12 -0
- package/dist/image-dimensions.d.ts.map +1 -0
- package/dist/image-dimensions.js +129 -0
- package/dist/image-dimensions.js.map +1 -0
- package/dist/image-optimizer.d.ts +86 -0
- package/dist/image-optimizer.d.ts.map +1 -0
- package/dist/image-optimizer.js +206 -0
- package/dist/image-optimizer.js.map +1 -0
- package/dist/image-presets.d.ts +17 -0
- package/dist/image-presets.d.ts.map +1 -0
- package/dist/image-presets.js +50 -0
- package/dist/image-presets.js.map +1 -0
- package/dist/image-url.d.ts +26 -0
- package/dist/image-url.d.ts.map +1 -0
- package/dist/image-url.js +47 -0
- package/dist/image-url.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt.d.ts +54 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +114 -0
- package/dist/jwt.js.map +1 -0
- package/dist/locale-fallback.d.ts +18 -0
- package/dist/locale-fallback.d.ts.map +1 -0
- package/dist/locale-fallback.js +42 -0
- package/dist/locale-fallback.js.map +1 -0
- package/dist/media-library.d.ts +46 -0
- package/dist/media-library.d.ts.map +1 -0
- package/dist/media-library.js +231 -0
- package/dist/media-library.js.map +1 -0
- package/dist/media-reference-updater.d.ts +24 -0
- package/dist/media-reference-updater.d.ts.map +1 -0
- package/dist/media-reference-updater.js +124 -0
- package/dist/media-reference-updater.js.map +1 -0
- package/dist/media-references.d.ts +14 -0
- package/dist/media-references.d.ts.map +1 -0
- package/dist/media-references.js +25 -0
- package/dist/media-references.js.map +1 -0
- package/dist/merged-schema.d.ts +10 -0
- package/dist/merged-schema.d.ts.map +1 -0
- package/dist/merged-schema.js +21 -0
- package/dist/merged-schema.js.map +1 -0
- package/dist/middleware/auth.d.ts +21 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +82 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/oidc-state.d.ts +42 -0
- package/dist/oidc-state.d.ts.map +1 -0
- package/dist/oidc-state.js +72 -0
- package/dist/oidc-state.js.map +1 -0
- package/dist/oidc.d.ts +83 -0
- package/dist/oidc.d.ts.map +1 -0
- package/dist/oidc.js +226 -0
- package/dist/oidc.js.map +1 -0
- package/dist/openapi.d.ts +13 -0
- package/dist/openapi.d.ts.map +1 -0
- package/dist/openapi.js +133 -0
- package/dist/openapi.js.map +1 -0
- package/dist/permissions.d.ts +37 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +69 -0
- package/dist/permissions.js.map +1 -0
- package/dist/plugins.d.ts +64 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +73 -0
- package/dist/plugins.js.map +1 -0
- package/dist/preview-token.d.ts +13 -0
- package/dist/preview-token.d.ts.map +1 -0
- package/dist/preview-token.js +45 -0
- package/dist/preview-token.js.map +1 -0
- package/dist/public-cache.d.ts +8 -0
- package/dist/public-cache.d.ts.map +1 -0
- package/dist/public-cache.js +8 -0
- package/dist/public-cache.js.map +1 -0
- package/dist/reference-resolver.d.ts +21 -0
- package/dist/reference-resolver.d.ts.map +1 -0
- package/dist/reference-resolver.js +128 -0
- package/dist/reference-resolver.js.map +1 -0
- package/dist/return-to.d.ts +7 -0
- package/dist/return-to.d.ts.map +1 -0
- package/dist/return-to.js +15 -0
- package/dist/return-to.js.map +1 -0
- package/dist/router.d.ts +14 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +51 -0
- package/dist/router.js.map +1 -0
- package/dist/runtime-field-checks.d.ts +11 -0
- package/dist/runtime-field-checks.d.ts.map +1 -0
- package/dist/runtime-field-checks.js +72 -0
- package/dist/runtime-field-checks.js.map +1 -0
- package/dist/save-document.d.ts +71 -0
- package/dist/save-document.d.ts.map +1 -0
- package/dist/save-document.js +213 -0
- package/dist/save-document.js.map +1 -0
- package/dist/seo-compose.d.ts +50 -0
- package/dist/seo-compose.d.ts.map +1 -0
- package/dist/seo-compose.js +104 -0
- package/dist/seo-compose.js.map +1 -0
- package/dist/seo-config-snapshot.d.ts +10 -0
- package/dist/seo-config-snapshot.d.ts.map +1 -0
- package/dist/seo-config-snapshot.js +16 -0
- package/dist/seo-config-snapshot.js.map +1 -0
- package/dist/seo-loader.d.ts +10 -0
- package/dist/seo-loader.d.ts.map +1 -0
- package/dist/seo-loader.js +14 -0
- package/dist/seo-loader.js.map +1 -0
- package/dist/seo-site-findings.d.ts +27 -0
- package/dist/seo-site-findings.d.ts.map +1 -0
- package/dist/seo-site-findings.js +87 -0
- package/dist/seo-site-findings.js.map +1 -0
- package/dist/seo-subsystem.d.ts +28 -0
- package/dist/seo-subsystem.d.ts.map +1 -0
- package/dist/seo-subsystem.js +62 -0
- package/dist/seo-subsystem.js.map +1 -0
- package/dist/seo-validation.d.ts +20 -0
- package/dist/seo-validation.d.ts.map +1 -0
- package/dist/seo-validation.js +96 -0
- package/dist/seo-validation.js.map +1 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/validators.d.ts +107 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +199 -0
- package/dist/validators.js.map +1 -0
- package/dist/webhooks.d.ts +29 -0
- package/dist/webhooks.d.ts.map +1 -0
- package/dist/webhooks.js +123 -0
- package/dist/webhooks.js.map +1 -0
- package/dist/workload-identity.d.ts +23 -0
- package/dist/workload-identity.d.ts.map +1 -0
- package/dist/workload-identity.js +145 -0
- package/dist/workload-identity.js.map +1 -0
- package/package.json +51 -3
- package/README.md +0 -3
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { requireRole } from '../permissions.js';
|
|
2
|
+
import { validateRequestBody } from '../validators.js';
|
|
3
|
+
/** GET /api/versions/stats — version count statistics */
|
|
4
|
+
export const versionStats = async (_req, ctx) => {
|
|
5
|
+
if (!ctx.retentionAdapter) {
|
|
6
|
+
return { status: 501, body: { error: 'Version retention not available' } };
|
|
7
|
+
}
|
|
8
|
+
const stats = await ctx.retentionAdapter.countVersions();
|
|
9
|
+
return { status: 200, body: stats };
|
|
10
|
+
};
|
|
11
|
+
/** POST /api/versions/purge — purge old versions */
|
|
12
|
+
export const versionPurge = async (req, ctx) => {
|
|
13
|
+
const denied = requireRole(ctx.auth, 'admin');
|
|
14
|
+
if (denied)
|
|
15
|
+
return denied;
|
|
16
|
+
if (!ctx.retentionAdapter) {
|
|
17
|
+
return { status: 501, body: { error: 'Version retention not available' } };
|
|
18
|
+
}
|
|
19
|
+
const bodyCheck = validateRequestBody(req.body);
|
|
20
|
+
if (!bodyCheck.isValid)
|
|
21
|
+
return bodyCheck.response;
|
|
22
|
+
const payload = bodyCheck.body;
|
|
23
|
+
const keepVersions = typeof payload['keepVersions'] === 'number'
|
|
24
|
+
? payload['keepVersions']
|
|
25
|
+
: ctx.config.content.versions.keep;
|
|
26
|
+
if (keepVersions < 1) {
|
|
27
|
+
return { status: 400, body: { error: 'keepVersions must be at least 1' } };
|
|
28
|
+
}
|
|
29
|
+
const results = await ctx.retentionAdapter.purgeVersions(keepVersions);
|
|
30
|
+
const totalPurged = results.reduce((sum, r) => sum + r.purged, 0);
|
|
31
|
+
return {
|
|
32
|
+
status: 200,
|
|
33
|
+
body: {
|
|
34
|
+
keepVersions,
|
|
35
|
+
totalPurged,
|
|
36
|
+
items: results,
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=version-retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-retention.js","sourceRoot":"","sources":["../../src/handlers/version-retention.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEtD,yDAAyD;AACzD,MAAM,CAAC,MAAM,YAAY,GAAe,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;IAC1D,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAAE,CAAA;IAC5E,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAA;IACxD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AACrC,CAAC,CAAA;AAED,oDAAoD;AACpD,MAAM,CAAC,MAAM,YAAY,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IACzD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1B,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAAE,CAAA;IAC5E,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/C,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC,QAAQ,CAAA;IAEjD,MAAM,OAAO,GAAG,SAAS,CAAC,IAA+B,CAAA;IACzD,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,cAAc,CAAC,KAAK,QAAQ;QACzC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;QACzB,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAA;IAEtC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,iCAAiC,EAAE,EAAE,CAAA;IAC5E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;IACtE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAEjE,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE;YACJ,YAAY;YACZ,WAAW;YACX,KAAK,EAAE,OAAO;SACf;KACF,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-deliveries.d.ts","sourceRoot":"","sources":["../../src/handlers/webhook-deliveries.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,+DAA+D;AAC/D,eAAO,MAAM,iBAAiB,EAAE,UAuB/B,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { requireRole } from '../permissions.js';
|
|
2
|
+
/** GET /api/webhooks/deliveries — list webhook delivery log */
|
|
3
|
+
export const webhookDeliveries = async (req, ctx) => {
|
|
4
|
+
const denied = requireRole(ctx.auth, 'admin');
|
|
5
|
+
if (denied)
|
|
6
|
+
return denied;
|
|
7
|
+
if (!ctx.webhookDeliveryAdapter) {
|
|
8
|
+
return { status: 200, body: { deliveries: [], total: 0 } };
|
|
9
|
+
}
|
|
10
|
+
const limit = req.query['limit'] ? Number.parseInt(req.query['limit'], 10) : 50;
|
|
11
|
+
const offset = req.query['offset'] ? Number.parseInt(req.query['offset'], 10) : 0;
|
|
12
|
+
const validStatuses = ['pending', 'delivered', 'failed'];
|
|
13
|
+
const rawStatus = req.query['status'];
|
|
14
|
+
const status = validStatuses.includes(rawStatus)
|
|
15
|
+
? rawStatus
|
|
16
|
+
: undefined;
|
|
17
|
+
const result = await ctx.webhookDeliveryAdapter.listDeliveries({
|
|
18
|
+
limit,
|
|
19
|
+
offset,
|
|
20
|
+
status,
|
|
21
|
+
});
|
|
22
|
+
return { status: 200, body: result };
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=webhook-deliveries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-deliveries.js","sourceRoot":"","sources":["../../src/handlers/webhook-deliveries.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,+DAA+D;AAC/D,MAAM,CAAC,MAAM,iBAAiB,GAAe,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IAEzB,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,CAAC;QAChC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAA;IAC5D,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjF,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,QAAQ,CAAU,CAAA;IACjE,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IACrC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,SAA2C,CAAC;QAChF,CAAC,CAAE,SAAgD;QACnD,CAAC,CAAC,SAAS,CAAA;IAEb,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,sBAAsB,CAAC,cAAc,CAAC;QAC7D,KAAK;QACL,MAAM;QACN,MAAM;KACP,CAAC,CAAA;IAEF,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;AACtC,CAAC,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ApiHandler } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* POST /api/webhooks/deliveries/:id/retry — put a failed delivery back in the
|
|
4
|
+
* queue with one attempt left, held back from the periodic sweep, and send it
|
|
5
|
+
* again at once, signed afresh, to
|
|
6
|
+
* the configured webhook with its URL. Answers 202 with the delivery as
|
|
7
|
+
* re-queued (pending); the attempt's outcome is recorded on the delivery:
|
|
8
|
+
* delivered, or failed again.
|
|
9
|
+
*/
|
|
10
|
+
export declare const webhookRetry: ApiHandler;
|
|
11
|
+
//# sourceMappingURL=webhook-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-retry.d.ts","sourceRoot":"","sources":["../../src/handlers/webhook-retry.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAc,UAAU,EAA8B,MAAM,aAAa,CAAA;AAsDrF;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,EAAE,UAgB1B,CAAA"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { MAX_WEBHOOK_ATTEMPTS, } from '@krantho/persistence';
|
|
2
|
+
import { requireRole } from '../permissions.js';
|
|
3
|
+
import { requireParam } from '../validators.js';
|
|
4
|
+
import { redeliverWebhook } from '../webhooks.js';
|
|
5
|
+
function refuse(status, error) {
|
|
6
|
+
return { status, body: { error } };
|
|
7
|
+
}
|
|
8
|
+
/** The delivery id from the path: a positive whole number */
|
|
9
|
+
function deliveryId(params) {
|
|
10
|
+
const result = requireParam(params, 'id');
|
|
11
|
+
if (!result.isValid)
|
|
12
|
+
return result.response;
|
|
13
|
+
const id = Number(result.value);
|
|
14
|
+
return Number.isInteger(id) && id > 0 ? id : refuse(400, 'Invalid delivery id');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* How long a retried delivery stays out of the periodic retry sweep: the
|
|
18
|
+
* immediate send records its outcome long before, so the sweep sends it
|
|
19
|
+
* only when that send never recorded one (the process stopped mid-send),
|
|
20
|
+
* and never a second time alongside it
|
|
21
|
+
*/
|
|
22
|
+
const RETRY_HOLD_MS = 60 * 60 * 1000;
|
|
23
|
+
function isFailed(delivery) {
|
|
24
|
+
return delivery.deliveredAt === null && delivery.attempts >= MAX_WEBHOOK_ATTEMPTS;
|
|
25
|
+
}
|
|
26
|
+
/** What a retry sends where, or why the delivery cannot be retried */
|
|
27
|
+
function retryOf(delivery, ctx) {
|
|
28
|
+
if (!delivery)
|
|
29
|
+
return refuse(404, 'No webhook delivery has this id');
|
|
30
|
+
if (!isFailed(delivery))
|
|
31
|
+
return refuse(409, 'Only a failed delivery can be retried');
|
|
32
|
+
const hook = ctx.webhooks?.find((candidate) => candidate.url === delivery.url);
|
|
33
|
+
return hook ? { delivery, hook } : refuse(409, 'No configured webhook has this URL any more');
|
|
34
|
+
}
|
|
35
|
+
/** Send it again in the background; the delivery's row records how it went */
|
|
36
|
+
function sendAgain(ctx, deliveries, { delivery, hook }) {
|
|
37
|
+
const attempt = redeliverWebhook(hook, delivery, deliveries).catch((err) => {
|
|
38
|
+
console.warn(`[webhook] Retry of delivery ${delivery.id} could not be recorded:`, err);
|
|
39
|
+
});
|
|
40
|
+
ctx.waitUntil?.(attempt);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* POST /api/webhooks/deliveries/:id/retry — put a failed delivery back in the
|
|
44
|
+
* queue with one attempt left, held back from the periodic sweep, and send it
|
|
45
|
+
* again at once, signed afresh, to
|
|
46
|
+
* the configured webhook with its URL. Answers 202 with the delivery as
|
|
47
|
+
* re-queued (pending); the attempt's outcome is recorded on the delivery:
|
|
48
|
+
* delivered, or failed again.
|
|
49
|
+
*/
|
|
50
|
+
export const webhookRetry = async (req, ctx) => {
|
|
51
|
+
const denied = requireRole(ctx.auth, 'admin');
|
|
52
|
+
if (denied)
|
|
53
|
+
return denied;
|
|
54
|
+
const id = deliveryId(req.params);
|
|
55
|
+
if (typeof id !== 'number')
|
|
56
|
+
return id;
|
|
57
|
+
const deliveries = ctx.webhookDeliveryAdapter;
|
|
58
|
+
if (!deliveries)
|
|
59
|
+
return refuse(404, 'Webhook deliveries are not logged');
|
|
60
|
+
const retry = retryOf(await deliveries.getDelivery(id), ctx);
|
|
61
|
+
if ('status' in retry)
|
|
62
|
+
return retry;
|
|
63
|
+
const delivery = await deliveries.requeueDelivery(id, new Date(Date.now() + RETRY_HOLD_MS));
|
|
64
|
+
if (!delivery)
|
|
65
|
+
return refuse(409, 'Only a failed delivery can be retried');
|
|
66
|
+
sendAgain(ctx, deliveries, retry);
|
|
67
|
+
return { status: 202, body: { delivery } };
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=webhook-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-retry.js","sourceRoot":"","sources":["../../src/handlers/webhook-retry.ts"],"names":[],"mappings":"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"}
|
package/dist/head.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ApiRequest, ApiResponse } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Answer a HEAD request the way GET answers it, without the body (RFC 9110,
|
|
4
|
+
* section 9.3.2): the GET route runs, and its status, headers and cookies are
|
|
5
|
+
* kept. The content type the body would have been served with is kept too,
|
|
6
|
+
* since the response no longer carries the body that decides it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function answerHead(req: ApiRequest, handle: (req: ApiRequest) => Promise<ApiResponse>): Promise<ApiResponse>;
|
|
9
|
+
//# sourceMappingURL=head.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"head.d.ts","sourceRoot":"","sources":["../src/head.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAWzD;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,GAChD,OAAO,CAAC,WAAW,CAAC,CAQtB"}
|
package/dist/head.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** The content type a response body is served with when the handler names none */
|
|
2
|
+
function defaultContentType(body) {
|
|
3
|
+
if (body === null || body === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
if (body instanceof ReadableStream || body instanceof Uint8Array)
|
|
6
|
+
return 'application/octet-stream';
|
|
7
|
+
if (typeof body === 'string')
|
|
8
|
+
return 'text/plain';
|
|
9
|
+
return 'application/json';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Answer a HEAD request the way GET answers it, without the body (RFC 9110,
|
|
13
|
+
* section 9.3.2): the GET route runs, and its status, headers and cookies are
|
|
14
|
+
* kept. The content type the body would have been served with is kept too,
|
|
15
|
+
* since the response no longer carries the body that decides it.
|
|
16
|
+
*/
|
|
17
|
+
export async function answerHead(req, handle) {
|
|
18
|
+
const response = await handle({ ...req, method: 'GET' });
|
|
19
|
+
const headers = { ...response.headers };
|
|
20
|
+
const named = Object.keys(headers).some((key) => key.toLowerCase() === 'content-type');
|
|
21
|
+
const contentType = named ? undefined : defaultContentType(response.body);
|
|
22
|
+
if (contentType)
|
|
23
|
+
headers['content-type'] = contentType;
|
|
24
|
+
if (response.body instanceof ReadableStream)
|
|
25
|
+
await response.body.cancel();
|
|
26
|
+
return { ...response, headers, body: null };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=head.js.map
|
package/dist/head.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"head.js","sourceRoot":"","sources":["../src/head.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,SAAS,kBAAkB,CAAC,IAAa;IACvC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzD,IAAI,IAAI,YAAY,cAAc,IAAI,IAAI,YAAY,UAAU;QAC9D,OAAO,0BAA0B,CAAA;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,YAAY,CAAA;IACjD,OAAO,kBAAkB,CAAA;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,MAAiD;IAEjD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;IACxD,MAAM,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,cAAc,CAAC,CAAA;IACtF,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACzE,IAAI,WAAW;QAAE,OAAO,CAAC,cAAc,CAAC,GAAG,WAAW,CAAA;IACtD,IAAI,QAAQ,CAAC,IAAI,YAAY,cAAc;QAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAA;IACzE,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;AAC7C,CAAC"}
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Data passed to before-save hooks */
|
|
2
|
+
export interface BeforeSaveContext {
|
|
3
|
+
collection: string;
|
|
4
|
+
slug: string;
|
|
5
|
+
fields: Record<string, unknown>;
|
|
6
|
+
metadata: Record<string, Record<string, unknown>>;
|
|
7
|
+
body: string;
|
|
8
|
+
isNew: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Data passed to after-mutation hooks */
|
|
11
|
+
export interface AfterMutationContext {
|
|
12
|
+
collection: string;
|
|
13
|
+
slug: string;
|
|
14
|
+
}
|
|
15
|
+
/** Lifecycle hooks for content operations */
|
|
16
|
+
export interface ContentHooks {
|
|
17
|
+
/** Fires before content is created or updated. Can modify fields, metadata and body. Throw to abort. */
|
|
18
|
+
beforeSave?: ((ctx: BeforeSaveContext) => Promise<BeforeSaveContext | void>) | undefined;
|
|
19
|
+
/** Fires after content is created */
|
|
20
|
+
afterCreate?: ((ctx: AfterMutationContext) => Promise<void>) | undefined;
|
|
21
|
+
/** Fires after content is updated */
|
|
22
|
+
afterUpdate?: ((ctx: AfterMutationContext) => Promise<void>) | undefined;
|
|
23
|
+
/** Fires after content status changes to published */
|
|
24
|
+
afterPublish?: ((ctx: AfterMutationContext) => Promise<void>) | undefined;
|
|
25
|
+
/** Fires before content is deleted. Throw to abort. */
|
|
26
|
+
beforeDelete?: ((ctx: AfterMutationContext) => Promise<void>) | undefined;
|
|
27
|
+
/** Fires after content is deleted */
|
|
28
|
+
afterDelete?: ((ctx: AfterMutationContext) => Promise<void>) | undefined;
|
|
29
|
+
}
|
|
30
|
+
/** Execute a before-save hook, returning possibly modified context */
|
|
31
|
+
export declare function runBeforeSave(hooks: ContentHooks | undefined, ctx: BeforeSaveContext): Promise<BeforeSaveContext>;
|
|
32
|
+
/** Execute an after-mutation hook (fire and forget on error) */
|
|
33
|
+
export declare function runAfterHook(fn: ((ctx: AfterMutationContext) => Promise<void>) | undefined, ctx: AfterMutationContext): Promise<void>;
|
|
34
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,OAAO,CAAA;CACf;AAED,0CAA0C;AAC1C,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,wGAAwG;IACxG,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;IACxF,qCAAqC;IACrC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;IACxE,qCAAqC;IACrC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;IACxE,sDAAsD;IACtD,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;IACzE,uDAAuD;IACvD,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;IACzE,qCAAqC;IACrC,WAAW,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,CAAA;CACzE;AAED,sEAAsE;AACtE,wBAAsB,aAAa,CACjC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAI5B;AAED,gEAAgE;AAChE,wBAAsB,YAAY,CAChC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,oBAAoB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,EAC9D,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,IAAI,CAAC,CAOf"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** Execute a before-save hook, returning possibly modified context */
|
|
2
|
+
export async function runBeforeSave(hooks, ctx) {
|
|
3
|
+
if (!hooks?.beforeSave)
|
|
4
|
+
return ctx;
|
|
5
|
+
const result = await hooks.beforeSave(ctx);
|
|
6
|
+
return result ?? ctx;
|
|
7
|
+
}
|
|
8
|
+
/** Execute an after-mutation hook (fire and forget on error) */
|
|
9
|
+
export async function runAfterHook(fn, ctx) {
|
|
10
|
+
if (!fn)
|
|
11
|
+
return;
|
|
12
|
+
try {
|
|
13
|
+
await fn(ctx);
|
|
14
|
+
}
|
|
15
|
+
catch (err) {
|
|
16
|
+
console.warn(`[hooks] Hook failed for ${ctx.collection}/${ctx.slug}:`, err);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAgCA,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA+B,EAC/B,GAAsB;IAEtB,IAAI,CAAC,KAAK,EAAE,UAAU;QAAE,OAAO,GAAG,CAAA;IAClC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;IAC1C,OAAO,MAAM,IAAI,GAAG,CAAA;AACtB,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,EAA8D,EAC9D,GAAyB;IAEzB,IAAI,CAAC,EAAE;QAAE,OAAM;IACf,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,GAAG,CAAC,CAAA;IACf,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { MediaSection } from '@krantho/config';
|
|
2
|
+
/** Cache limits, as the configuration tree declares them */
|
|
3
|
+
export type ImageCacheSettings = MediaSection['image']['cache'];
|
|
4
|
+
/** Cached image variant */
|
|
5
|
+
export interface CachedVariant {
|
|
6
|
+
bytes: Buffer;
|
|
7
|
+
contentType: string;
|
|
8
|
+
etag: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* In-memory LRU cache with memory-aware eviction for image variants.
|
|
12
|
+
*
|
|
13
|
+
* Eviction triggers:
|
|
14
|
+
* - Entry count exceeds maxEntries
|
|
15
|
+
* - Total memory exceeds maxMemoryBytes
|
|
16
|
+
* - Entry idle time exceeds TTI
|
|
17
|
+
*
|
|
18
|
+
* When evicting, removes the least-recently-accessed entry first.
|
|
19
|
+
*
|
|
20
|
+
* Keys follow the pattern `{mediaId}/{preset}/{format}`.
|
|
21
|
+
* Supports prefix-based invalidation for clearing all variants of a source image.
|
|
22
|
+
*/
|
|
23
|
+
export declare class ImageCache {
|
|
24
|
+
private readonly cache;
|
|
25
|
+
private readonly maxEntries;
|
|
26
|
+
private readonly maxMemoryBytes;
|
|
27
|
+
private readonly ttiMs;
|
|
28
|
+
private totalBytes;
|
|
29
|
+
private cleanupTimer;
|
|
30
|
+
constructor(settings: ImageCacheSettings);
|
|
31
|
+
/** Get a cached variant. Returns undefined on miss or expired entry. */
|
|
32
|
+
get(key: string): CachedVariant | undefined;
|
|
33
|
+
/** Store a variant in the cache. Evicts entries if at capacity (count or memory). */
|
|
34
|
+
set(key: string, value: CachedVariant): void;
|
|
35
|
+
/** Invalidate all cached variants for a media item (prefix match). */
|
|
36
|
+
invalidateSource(mediaId: string): void;
|
|
37
|
+
/** Current number of cached entries */
|
|
38
|
+
get size(): number;
|
|
39
|
+
/** Total memory used by cached image bytes */
|
|
40
|
+
get memoryBytes(): number;
|
|
41
|
+
/** Stop the cleanup timer (for tests / shutdown) */
|
|
42
|
+
dispose(): void;
|
|
43
|
+
private removeEntry;
|
|
44
|
+
private evictLeastRecentlyUsed;
|
|
45
|
+
private evictExpired;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=image-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-cache.d.ts","sourceRoot":"","sources":["../src/image-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAEnD,4DAA4D;AAC5D,MAAM,MAAM,kBAAkB,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAA;AAE/D,2BAA2B;AAC3B,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb;AAQD;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,YAAY,CAA4C;gBAEpD,QAAQ,EAAE,kBAAkB;IAUxC,wEAAwE;IACxE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAc3C,qFAAqF;IACrF,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAqB5C,sEAAsE;IACtE,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAUvC,uCAAuC;IACvC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,8CAA8C;IAC9C,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,oDAAoD;IACpD,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,sBAAsB;IAkB9B,OAAO,CAAC,YAAY;CAQrB"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory LRU cache with memory-aware eviction for image variants.
|
|
3
|
+
*
|
|
4
|
+
* Eviction triggers:
|
|
5
|
+
* - Entry count exceeds maxEntries
|
|
6
|
+
* - Total memory exceeds maxMemoryBytes
|
|
7
|
+
* - Entry idle time exceeds TTI
|
|
8
|
+
*
|
|
9
|
+
* When evicting, removes the least-recently-accessed entry first.
|
|
10
|
+
*
|
|
11
|
+
* Keys follow the pattern `{mediaId}/{preset}/{format}`.
|
|
12
|
+
* Supports prefix-based invalidation for clearing all variants of a source image.
|
|
13
|
+
*/
|
|
14
|
+
export class ImageCache {
|
|
15
|
+
cache = new Map();
|
|
16
|
+
maxEntries;
|
|
17
|
+
maxMemoryBytes;
|
|
18
|
+
ttiMs;
|
|
19
|
+
totalBytes = 0;
|
|
20
|
+
cleanupTimer;
|
|
21
|
+
constructor(settings) {
|
|
22
|
+
this.maxEntries = settings.maxEntries;
|
|
23
|
+
this.maxMemoryBytes = settings.maxMb * 1024 * 1024;
|
|
24
|
+
this.ttiMs = settings.ttiSec * 1000;
|
|
25
|
+
// Periodic cleanup every 5 minutes
|
|
26
|
+
this.cleanupTimer = setInterval(() => this.evictExpired(), 5 * 60 * 1000);
|
|
27
|
+
if (this.cleanupTimer.unref)
|
|
28
|
+
this.cleanupTimer.unref();
|
|
29
|
+
}
|
|
30
|
+
/** Get a cached variant. Returns undefined on miss or expired entry. */
|
|
31
|
+
get(key) {
|
|
32
|
+
const entry = this.cache.get(key);
|
|
33
|
+
if (!entry)
|
|
34
|
+
return undefined;
|
|
35
|
+
const now = Date.now();
|
|
36
|
+
if (now - entry.lastAccess > this.ttiMs) {
|
|
37
|
+
this.removeEntry(key, entry);
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
entry.lastAccess = now;
|
|
41
|
+
return entry.value;
|
|
42
|
+
}
|
|
43
|
+
/** Store a variant in the cache. Evicts entries if at capacity (count or memory). */
|
|
44
|
+
set(key, value) {
|
|
45
|
+
const sizeBytes = value.bytes.byteLength;
|
|
46
|
+
// Remove existing entry if updating
|
|
47
|
+
const existing = this.cache.get(key);
|
|
48
|
+
if (existing) {
|
|
49
|
+
this.totalBytes -= existing.sizeBytes;
|
|
50
|
+
}
|
|
51
|
+
// Evict until within limits
|
|
52
|
+
while (this.cache.size >= this.maxEntries ||
|
|
53
|
+
(this.totalBytes + sizeBytes > this.maxMemoryBytes && this.cache.size > 0)) {
|
|
54
|
+
this.evictLeastRecentlyUsed();
|
|
55
|
+
}
|
|
56
|
+
this.cache.set(key, { value, sizeBytes, lastAccess: Date.now() });
|
|
57
|
+
this.totalBytes += sizeBytes;
|
|
58
|
+
}
|
|
59
|
+
/** Invalidate all cached variants for a media item (prefix match). */
|
|
60
|
+
invalidateSource(mediaId) {
|
|
61
|
+
const prefix = `${mediaId}/`;
|
|
62
|
+
for (const [key, entry] of this.cache) {
|
|
63
|
+
if (key.startsWith(prefix)) {
|
|
64
|
+
this.totalBytes -= entry.sizeBytes;
|
|
65
|
+
this.cache.delete(key);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Current number of cached entries */
|
|
70
|
+
get size() {
|
|
71
|
+
return this.cache.size;
|
|
72
|
+
}
|
|
73
|
+
/** Total memory used by cached image bytes */
|
|
74
|
+
get memoryBytes() {
|
|
75
|
+
return this.totalBytes;
|
|
76
|
+
}
|
|
77
|
+
/** Stop the cleanup timer (for tests / shutdown) */
|
|
78
|
+
dispose() {
|
|
79
|
+
if (this.cleanupTimer) {
|
|
80
|
+
clearInterval(this.cleanupTimer);
|
|
81
|
+
this.cleanupTimer = undefined;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
removeEntry(key, entry) {
|
|
85
|
+
this.totalBytes -= entry.sizeBytes;
|
|
86
|
+
this.cache.delete(key);
|
|
87
|
+
}
|
|
88
|
+
evictLeastRecentlyUsed() {
|
|
89
|
+
let oldestKey;
|
|
90
|
+
let oldestEntry;
|
|
91
|
+
let oldestTime = Number.POSITIVE_INFINITY;
|
|
92
|
+
for (const [key, entry] of this.cache) {
|
|
93
|
+
if (entry.lastAccess < oldestTime) {
|
|
94
|
+
oldestTime = entry.lastAccess;
|
|
95
|
+
oldestKey = key;
|
|
96
|
+
oldestEntry = entry;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (oldestKey && oldestEntry) {
|
|
100
|
+
this.removeEntry(oldestKey, oldestEntry);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
evictExpired() {
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
for (const [key, entry] of this.cache) {
|
|
106
|
+
if (now - entry.lastAccess > this.ttiMs) {
|
|
107
|
+
this.removeEntry(key, entry);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=image-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-cache.js","sourceRoot":"","sources":["../src/image-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Detected image dimensions */
|
|
2
|
+
export interface ImageDimensions {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Detect image dimensions from a buffer by reading format-specific headers.
|
|
8
|
+
* No external dependencies — reads binary headers directly.
|
|
9
|
+
* Returns null if the format is unrecognized or the buffer is too short.
|
|
10
|
+
*/
|
|
11
|
+
export declare function detectDimensions(data: Uint8Array): ImageDimensions | null;
|
|
12
|
+
//# sourceMappingURL=image-dimensions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-dimensions.d.ts","sourceRoot":"","sources":["../src/image-dimensions.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAgBzE"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect image dimensions from a buffer by reading format-specific headers.
|
|
3
|
+
* No external dependencies — reads binary headers directly.
|
|
4
|
+
* Returns null if the format is unrecognized or the buffer is too short.
|
|
5
|
+
*/
|
|
6
|
+
export function detectDimensions(data) {
|
|
7
|
+
if (data.length < 8)
|
|
8
|
+
return null;
|
|
9
|
+
// PNG: 8-byte signature + IHDR chunk
|
|
10
|
+
if (isPng(data))
|
|
11
|
+
return parsePng(data);
|
|
12
|
+
// JPEG: scan for SOF marker
|
|
13
|
+
if (isJpeg(data))
|
|
14
|
+
return parseJpeg(data);
|
|
15
|
+
// GIF: logical screen descriptor
|
|
16
|
+
if (isGif(data))
|
|
17
|
+
return parseGif(data);
|
|
18
|
+
// WebP: RIFF container
|
|
19
|
+
if (isWebP(data))
|
|
20
|
+
return parseWebP(data);
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
function isPng(d) {
|
|
24
|
+
return d[0] === 0x89 && d[1] === 0x50 && d[2] === 0x4e && d[3] === 0x47;
|
|
25
|
+
}
|
|
26
|
+
function isJpeg(d) {
|
|
27
|
+
return d[0] === 0xff && d[1] === 0xd8;
|
|
28
|
+
}
|
|
29
|
+
function isGif(d) {
|
|
30
|
+
return d[0] === 0x47 && d[1] === 0x49 && d[2] === 0x46;
|
|
31
|
+
}
|
|
32
|
+
function isWebP(d) {
|
|
33
|
+
return (d[0] === 0x52 &&
|
|
34
|
+
d[1] === 0x49 &&
|
|
35
|
+
d[2] === 0x46 &&
|
|
36
|
+
d[3] === 0x46 &&
|
|
37
|
+
d[8] === 0x57 &&
|
|
38
|
+
d[9] === 0x45 &&
|
|
39
|
+
d[10] === 0x42 &&
|
|
40
|
+
d[11] === 0x50);
|
|
41
|
+
}
|
|
42
|
+
function parsePng(d) {
|
|
43
|
+
// IHDR starts at offset 16: 4 bytes width, 4 bytes height (big-endian)
|
|
44
|
+
if (d.length < 24)
|
|
45
|
+
return null;
|
|
46
|
+
const view = new DataView(d.buffer, d.byteOffset, d.byteLength);
|
|
47
|
+
const width = view.getUint32(16);
|
|
48
|
+
const height = view.getUint32(20);
|
|
49
|
+
return { width, height };
|
|
50
|
+
}
|
|
51
|
+
function parseJpeg(d) {
|
|
52
|
+
// Scan for SOF0 (0xFFC0) or SOF2 (0xFFC2) marker
|
|
53
|
+
let offset = 2;
|
|
54
|
+
const view = new DataView(d.buffer, d.byteOffset, d.byteLength);
|
|
55
|
+
while (offset < d.length - 8) {
|
|
56
|
+
if (d[offset] !== 0xff) {
|
|
57
|
+
offset++;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const marker = d[offset + 1];
|
|
61
|
+
if (marker === undefined)
|
|
62
|
+
break;
|
|
63
|
+
// SOF0 or SOF2 — contains dimensions
|
|
64
|
+
if (marker === 0xc0 || marker === 0xc2) {
|
|
65
|
+
// Skip marker (2) + length (2) + precision (1) = offset+5 for height
|
|
66
|
+
const height = view.getUint16(offset + 5);
|
|
67
|
+
const width = view.getUint16(offset + 7);
|
|
68
|
+
return { width, height };
|
|
69
|
+
}
|
|
70
|
+
// Skip this marker segment
|
|
71
|
+
if (marker === 0xd8 || marker === 0xd9) {
|
|
72
|
+
// SOI or EOI — no length field
|
|
73
|
+
offset += 2;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
const segmentLength = view.getUint16(offset + 2);
|
|
77
|
+
offset += 2 + segmentLength;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
function parseGif(d) {
|
|
83
|
+
// Logical screen descriptor at offset 6: width (LE 16), height (LE 16)
|
|
84
|
+
if (d.length < 10)
|
|
85
|
+
return null;
|
|
86
|
+
const view = new DataView(d.buffer, d.byteOffset, d.byteLength);
|
|
87
|
+
const width = view.getUint16(6, true);
|
|
88
|
+
const height = view.getUint16(8, true);
|
|
89
|
+
return { width, height };
|
|
90
|
+
}
|
|
91
|
+
function parseWebP(d) {
|
|
92
|
+
if (d.length < 30)
|
|
93
|
+
return null;
|
|
94
|
+
// VP8 (lossy): starts at offset 12 with 'VP8 '
|
|
95
|
+
if (d[12] === 0x56 && d[13] === 0x50 && d[14] === 0x38 && d[15] === 0x20) {
|
|
96
|
+
// Frame header at offset 26: width (LE 16), height (LE 16)
|
|
97
|
+
// Width and height are 14-bit values in the first 4 bytes of the frame
|
|
98
|
+
if (d.length < 30)
|
|
99
|
+
return null;
|
|
100
|
+
const view = new DataView(d.buffer, d.byteOffset, d.byteLength);
|
|
101
|
+
const width = view.getUint16(26, true) & 0x3fff;
|
|
102
|
+
const height = view.getUint16(28, true) & 0x3fff;
|
|
103
|
+
return { width, height };
|
|
104
|
+
}
|
|
105
|
+
// VP8L (lossless): starts at offset 12 with 'VP8L'
|
|
106
|
+
if (d[12] === 0x56 && d[13] === 0x50 && d[14] === 0x38 && d[15] === 0x4c) {
|
|
107
|
+
// Dimensions encoded in 4 bytes at offset 21
|
|
108
|
+
if (d.length < 25)
|
|
109
|
+
return null;
|
|
110
|
+
const b0 = d[21];
|
|
111
|
+
const b1 = d[22];
|
|
112
|
+
const b2 = d[23];
|
|
113
|
+
const b3 = d[24];
|
|
114
|
+
const width = 1 + (((b1 & 0x3f) << 8) | b0);
|
|
115
|
+
const height = 1 + (((b3 & 0x0f) << 10) | (b2 << 2) | ((b1 >> 6) & 0x03));
|
|
116
|
+
return { width, height };
|
|
117
|
+
}
|
|
118
|
+
// VP8X (extended): starts at offset 12 with 'VP8X'
|
|
119
|
+
if (d[12] === 0x56 && d[13] === 0x50 && d[14] === 0x38 && d[15] === 0x58) {
|
|
120
|
+
if (d.length < 30)
|
|
121
|
+
return null;
|
|
122
|
+
// Canvas width at offset 24 (3 bytes LE + 1), height at offset 27 (3 bytes LE + 1)
|
|
123
|
+
const width = 1 + (d[24] | (d[25] << 8) | (d[26] << 16));
|
|
124
|
+
const height = 1 + (d[27] | (d[28] << 8) | (d[29] << 16));
|
|
125
|
+
return { width, height };
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=image-dimensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-dimensions.js","sourceRoot":"","sources":["../src/image-dimensions.ts"],"names":[],"mappings":"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"}
|