@aglyn/aglyn 1.0.0-beta.143
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 +201 -0
- package/README.md +11 -0
- package/package.json +66 -0
- package/src/index.d.ts +25 -0
- package/src/index.js +26 -0
- package/src/index.js.map +1 -0
- package/src/lib/aglyn.d.ts +31 -0
- package/src/lib/aglyn.js +114 -0
- package/src/lib/aglyn.js.map +1 -0
- package/src/lib/app-utils/abuse-report.d.ts +193 -0
- package/src/lib/app-utils/abuse-report.js +321 -0
- package/src/lib/app-utils/abuse-report.js.map +1 -0
- package/src/lib/app-utils/accept-negotiation.d.ts +129 -0
- package/src/lib/app-utils/accept-negotiation.js +266 -0
- package/src/lib/app-utils/accept-negotiation.js.map +1 -0
- package/src/lib/app-utils/account-emails.d.ts +263 -0
- package/src/lib/app-utils/account-emails.js +264 -0
- package/src/lib/app-utils/account-emails.js.map +1 -0
- package/src/lib/app-utils/actions.d.ts +717 -0
- package/src/lib/app-utils/actions.js +1031 -0
- package/src/lib/app-utils/actions.js.map +1 -0
- package/src/lib/app-utils/activity-presenter.d.ts +152 -0
- package/src/lib/app-utils/activity-presenter.js +326 -0
- package/src/lib/app-utils/activity-presenter.js.map +1 -0
- package/src/lib/app-utils/advertising-tag-mounts.d.ts +133 -0
- package/src/lib/app-utils/advertising-tag-mounts.js +118 -0
- package/src/lib/app-utils/advertising-tag-mounts.js.map +1 -0
- package/src/lib/app-utils/advertising-tags.d.ts +307 -0
- package/src/lib/app-utils/advertising-tags.js +525 -0
- package/src/lib/app-utils/advertising-tags.js.map +1 -0
- package/src/lib/app-utils/agent-api-catalog.d.ts +94 -0
- package/src/lib/app-utils/agent-api-catalog.js +106 -0
- package/src/lib/app-utils/agent-api-catalog.js.map +1 -0
- package/src/lib/app-utils/agent-openapi.d.ts +103 -0
- package/src/lib/app-utils/agent-openapi.js +1128 -0
- package/src/lib/app-utils/agent-openapi.js.map +1 -0
- package/src/lib/app-utils/analytics-beacon.d.ts +154 -0
- package/src/lib/app-utils/analytics-beacon.js +152 -0
- package/src/lib/app-utils/analytics-beacon.js.map +1 -0
- package/src/lib/app-utils/analytics-environment.d.ts +133 -0
- package/src/lib/app-utils/analytics-environment.js +152 -0
- package/src/lib/app-utils/analytics-environment.js.map +1 -0
- package/src/lib/app-utils/analytics-events.d.ts +744 -0
- package/src/lib/app-utils/analytics-events.js +650 -0
- package/src/lib/app-utils/analytics-events.js.map +1 -0
- package/src/lib/app-utils/analytics-link-clicks.d.ts +102 -0
- package/src/lib/app-utils/analytics-link-clicks.js +267 -0
- package/src/lib/app-utils/analytics-link-clicks.js.map +1 -0
- package/src/lib/app-utils/analytics-path-key.d.ts +46 -0
- package/src/lib/app-utils/analytics-path-key.js +46 -0
- package/src/lib/app-utils/analytics-path-key.js.map +1 -0
- package/src/lib/app-utils/api-adapter.d.ts +47 -0
- package/src/lib/app-utils/api-adapter.js +367 -0
- package/src/lib/app-utils/api-adapter.js.map +1 -0
- package/src/lib/app-utils/api-idempotency.d.ts +169 -0
- package/src/lib/app-utils/api-idempotency.js +213 -0
- package/src/lib/app-utils/api-idempotency.js.map +1 -0
- package/src/lib/app-utils/api-plugins.d.ts +210 -0
- package/src/lib/app-utils/api-plugins.js +221 -0
- package/src/lib/app-utils/api-plugins.js.map +1 -0
- package/src/lib/app-utils/assist-credits.d.ts +482 -0
- package/src/lib/app-utils/assist-credits.js +509 -0
- package/src/lib/app-utils/assist-credits.js.map +1 -0
- package/src/lib/app-utils/attribution-attribute.d.ts +34 -0
- package/src/lib/app-utils/attribution-attribute.js +34 -0
- package/src/lib/app-utils/attribution-attribute.js.map +1 -0
- package/src/lib/app-utils/attribution-guard.d.ts +130 -0
- package/src/lib/app-utils/attribution-guard.js +410 -0
- package/src/lib/app-utils/attribution-guard.js.map +1 -0
- package/src/lib/app-utils/author-css.d.ts +123 -0
- package/src/lib/app-utils/author-css.js +275 -0
- package/src/lib/app-utils/author-css.js.map +1 -0
- package/src/lib/app-utils/author-html-markdown.d.ts +31 -0
- package/src/lib/app-utils/author-html-markdown.js +497 -0
- package/src/lib/app-utils/author-html-markdown.js.map +1 -0
- package/src/lib/app-utils/author-html.d.ts +135 -0
- package/src/lib/app-utils/author-html.js +1037 -0
- package/src/lib/app-utils/author-html.js.map +1 -0
- package/src/lib/app-utils/automation-placeholders.d.ts +72 -0
- package/src/lib/app-utils/automation-placeholders.js +207 -0
- package/src/lib/app-utils/automation-placeholders.js.map +1 -0
- package/src/lib/app-utils/bandwidth-cap.d.ts +183 -0
- package/src/lib/app-utils/bandwidth-cap.js +193 -0
- package/src/lib/app-utils/bandwidth-cap.js.map +1 -0
- package/src/lib/app-utils/binding-token-catalog.d.ts +82 -0
- package/src/lib/app-utils/binding-token-catalog.js +293 -0
- package/src/lib/app-utils/binding-token-catalog.js.map +1 -0
- package/src/lib/app-utils/binding-tokens.d.ts +157 -0
- package/src/lib/app-utils/binding-tokens.js +251 -0
- package/src/lib/app-utils/binding-tokens.js.map +1 -0
- package/src/lib/app-utils/breadcrumb-json-ld.d.ts +57 -0
- package/src/lib/app-utils/breadcrumb-json-ld.js +67 -0
- package/src/lib/app-utils/breadcrumb-json-ld.js.map +1 -0
- package/src/lib/app-utils/campaign-attribution.d.ts +117 -0
- package/src/lib/app-utils/campaign-attribution.js +162 -0
- package/src/lib/app-utils/campaign-attribution.js.map +1 -0
- package/src/lib/app-utils/campaign-forwarding.d.ts +220 -0
- package/src/lib/app-utils/campaign-forwarding.js +332 -0
- package/src/lib/app-utils/campaign-forwarding.js.map +1 -0
- package/src/lib/app-utils/campaign-membership.d.ts +109 -0
- package/src/lib/app-utils/campaign-membership.js +176 -0
- package/src/lib/app-utils/campaign-membership.js.map +1 -0
- package/src/lib/app-utils/campaign-touch.d.ts +206 -0
- package/src/lib/app-utils/campaign-touch.js +326 -0
- package/src/lib/app-utils/campaign-touch.js.map +1 -0
- package/src/lib/app-utils/child-contract-compose.d.ts +28 -0
- package/src/lib/app-utils/child-contract-compose.js +140 -0
- package/src/lib/app-utils/child-contract-compose.js.map +1 -0
- package/src/lib/app-utils/child-contract.d.ts +129 -0
- package/src/lib/app-utils/child-contract.js +153 -0
- package/src/lib/app-utils/child-contract.js.map +1 -0
- package/src/lib/app-utils/collection-delete.d.ts +113 -0
- package/src/lib/app-utils/collection-delete.js +120 -0
- package/src/lib/app-utils/collection-delete.js.map +1 -0
- package/src/lib/app-utils/collection-entries.d.ts +833 -0
- package/src/lib/app-utils/collection-entries.js +1285 -0
- package/src/lib/app-utils/collection-entries.js.map +1 -0
- package/src/lib/app-utils/collection-entry-date.d.ts +129 -0
- package/src/lib/app-utils/collection-entry-date.js +183 -0
- package/src/lib/app-utils/collection-entry-date.js.map +1 -0
- package/src/lib/app-utils/collection-kind.d.ts +55 -0
- package/src/lib/app-utils/collection-kind.js +69 -0
- package/src/lib/app-utils/collection-kind.js.map +1 -0
- package/src/lib/app-utils/collection-slug.d.ts +79 -0
- package/src/lib/app-utils/collection-slug.js +70 -0
- package/src/lib/app-utils/collection-slug.js.map +1 -0
- package/src/lib/app-utils/compose-layout-nodes.d.ts +147 -0
- package/src/lib/app-utils/compose-layout-nodes.js +261 -0
- package/src/lib/app-utils/compose-layout-nodes.js.map +1 -0
- package/src/lib/app-utils/compose-layout-props.d.ts +71 -0
- package/src/lib/app-utils/compose-layout-props.js +61 -0
- package/src/lib/app-utils/compose-layout-props.js.map +1 -0
- package/src/lib/app-utils/compose-reusable-components.d.ts +504 -0
- package/src/lib/app-utils/compose-reusable-components.js +1366 -0
- package/src/lib/app-utils/compose-reusable-components.js.map +1 -0
- package/src/lib/app-utils/compress.d.ts +35 -0
- package/src/lib/app-utils/compress.js +38 -0
- package/src/lib/app-utils/compress.js.map +1 -0
- package/src/lib/app-utils/consent-banner-ui.d.ts +226 -0
- package/src/lib/app-utils/consent-banner-ui.js +583 -0
- package/src/lib/app-utils/consent-banner-ui.js.map +1 -0
- package/src/lib/app-utils/consent-groups.d.ts +189 -0
- package/src/lib/app-utils/consent-groups.js +219 -0
- package/src/lib/app-utils/consent-groups.js.map +1 -0
- package/src/lib/app-utils/consent-preferences-dialog.d.ts +58 -0
- package/src/lib/app-utils/consent-preferences-dialog.js +106 -0
- package/src/lib/app-utils/consent-preferences-dialog.js.map +1 -0
- package/src/lib/app-utils/console-record-links.d.ts +163 -0
- package/src/lib/app-utils/console-record-links.js +178 -0
- package/src/lib/app-utils/console-record-links.js.map +1 -0
- package/src/lib/app-utils/console-routes.d.ts +658 -0
- package/src/lib/app-utils/console-routes.js +489 -0
- package/src/lib/app-utils/console-routes.js.map +1 -0
- package/src/lib/app-utils/console-widget-slot-context.d.ts +46 -0
- package/src/lib/app-utils/console-widget-slot-context.js +23 -0
- package/src/lib/app-utils/console-widget-slot-context.js.map +1 -0
- package/src/lib/app-utils/contact-custom-fields.d.ts +191 -0
- package/src/lib/app-utils/contact-custom-fields.js +349 -0
- package/src/lib/app-utils/contact-custom-fields.js.map +1 -0
- package/src/lib/app-utils/contact-holder.d.ts +52 -0
- package/src/lib/app-utils/contact-holder.js +98 -0
- package/src/lib/app-utils/contact-holder.js.map +1 -0
- package/src/lib/app-utils/contact-merge.d.ts +136 -0
- package/src/lib/app-utils/contact-merge.js +379 -0
- package/src/lib/app-utils/contact-merge.js.map +1 -0
- package/src/lib/app-utils/contacts.d.ts +554 -0
- package/src/lib/app-utils/contacts.js +401 -0
- package/src/lib/app-utils/contacts.js.map +1 -0
- package/src/lib/app-utils/content-author-profile.d.ts +68 -0
- package/src/lib/app-utils/content-author-profile.js +118 -0
- package/src/lib/app-utils/content-author-profile.js.map +1 -0
- package/src/lib/app-utils/content-authors.d.ts +662 -0
- package/src/lib/app-utils/content-authors.js +771 -0
- package/src/lib/app-utils/content-authors.js.map +1 -0
- package/src/lib/app-utils/content-schema-type.d.ts +81 -0
- package/src/lib/app-utils/content-schema-type.js +87 -0
- package/src/lib/app-utils/content-schema-type.js.map +1 -0
- package/src/lib/app-utils/contexts.d.ts +35 -0
- package/src/lib/app-utils/contexts.js +35 -0
- package/src/lib/app-utils/contexts.js.map +1 -0
- package/src/lib/app-utils/create-resource-uid.d.ts +18 -0
- package/src/lib/app-utils/create-resource-uid.js +23 -0
- package/src/lib/app-utils/create-resource-uid.js.map +1 -0
- package/src/lib/app-utils/crm-booking.d.ts +75 -0
- package/src/lib/app-utils/crm-booking.js +133 -0
- package/src/lib/app-utils/crm-booking.js.map +1 -0
- package/src/lib/app-utils/crm-csv.d.ts +232 -0
- package/src/lib/app-utils/crm-csv.js +432 -0
- package/src/lib/app-utils/crm-csv.js.map +1 -0
- package/src/lib/app-utils/crm-digest.d.ts +179 -0
- package/src/lib/app-utils/crm-digest.js +271 -0
- package/src/lib/app-utils/crm-digest.js.map +1 -0
- package/src/lib/app-utils/crm-email-templates.d.ts +172 -0
- package/src/lib/app-utils/crm-email-templates.js +382 -0
- package/src/lib/app-utils/crm-email-templates.js.map +1 -0
- package/src/lib/app-utils/crm-inbound.d.ts +245 -0
- package/src/lib/app-utils/crm-inbound.js +407 -0
- package/src/lib/app-utils/crm-inbound.js.map +1 -0
- package/src/lib/app-utils/crm-kinds.d.ts +73 -0
- package/src/lib/app-utils/crm-kinds.js +92 -0
- package/src/lib/app-utils/crm-kinds.js.map +1 -0
- package/src/lib/app-utils/crm-next-activity.d.ts +107 -0
- package/src/lib/app-utils/crm-next-activity.js +140 -0
- package/src/lib/app-utils/crm-next-activity.js.map +1 -0
- package/src/lib/app-utils/crm-reports.d.ts +479 -0
- package/src/lib/app-utils/crm-reports.js +680 -0
- package/src/lib/app-utils/crm-reports.js.map +1 -0
- package/src/lib/app-utils/crm-task-reminders.d.ts +129 -0
- package/src/lib/app-utils/crm-task-reminders.js +139 -0
- package/src/lib/app-utils/crm-task-reminders.js.map +1 -0
- package/src/lib/app-utils/crm.d.ts +1546 -0
- package/src/lib/app-utils/crm.js +1814 -0
- package/src/lib/app-utils/crm.js.map +1 -0
- package/src/lib/app-utils/csp-report.d.ts +84 -0
- package/src/lib/app-utils/csp-report.js +177 -0
- package/src/lib/app-utils/csp-report.js.map +1 -0
- package/src/lib/app-utils/csv-import.d.ts +192 -0
- package/src/lib/app-utils/csv-import.js +279 -0
- package/src/lib/app-utils/csv-import.js.map +1 -0
- package/src/lib/app-utils/dataset-csv.d.ts +109 -0
- package/src/lib/app-utils/dataset-csv.js +235 -0
- package/src/lib/app-utils/dataset-csv.js.map +1 -0
- package/src/lib/app-utils/dataset-models.d.ts +194 -0
- package/src/lib/app-utils/dataset-models.js +409 -0
- package/src/lib/app-utils/dataset-models.js.map +1 -0
- package/src/lib/app-utils/dataset-query.d.ts +57 -0
- package/src/lib/app-utils/dataset-query.js +126 -0
- package/src/lib/app-utils/dataset-query.js.map +1 -0
- package/src/lib/app-utils/datasets.d.ts +136 -0
- package/src/lib/app-utils/datasets.js +177 -0
- package/src/lib/app-utils/datasets.js.map +1 -0
- package/src/lib/app-utils/decompress.d.ts +36 -0
- package/src/lib/app-utils/decompress.js +32 -0
- package/src/lib/app-utils/decompress.js.map +1 -0
- package/src/lib/app-utils/dedicated-sending-domain.d.ts +47 -0
- package/src/lib/app-utils/dedicated-sending-domain.js +114 -0
- package/src/lib/app-utils/dedicated-sending-domain.js.map +1 -0
- package/src/lib/app-utils/deferred-image.d.ts +86 -0
- package/src/lib/app-utils/deferred-image.js +83 -0
- package/src/lib/app-utils/deferred-image.js.map +1 -0
- package/src/lib/app-utils/definition-canvas-tree.d.ts +61 -0
- package/src/lib/app-utils/definition-canvas-tree.js +126 -0
- package/src/lib/app-utils/definition-canvas-tree.js.map +1 -0
- package/src/lib/app-utils/deployment-shape.d.ts +167 -0
- package/src/lib/app-utils/deployment-shape.js +238 -0
- package/src/lib/app-utils/deployment-shape.js.map +1 -0
- package/src/lib/app-utils/detect-template-placeholders.d.ts +30 -0
- package/src/lib/app-utils/detect-template-placeholders.js +53 -0
- package/src/lib/app-utils/detect-template-placeholders.js.map +1 -0
- package/src/lib/app-utils/dmca-counter-notice.d.ts +185 -0
- package/src/lib/app-utils/dmca-counter-notice.js +277 -0
- package/src/lib/app-utils/dmca-counter-notice.js.map +1 -0
- package/src/lib/app-utils/docs-deflection.d.ts +156 -0
- package/src/lib/app-utils/docs-deflection.js +547 -0
- package/src/lib/app-utils/docs-deflection.js.map +1 -0
- package/src/lib/app-utils/docs-help.d.ts +57 -0
- package/src/lib/app-utils/docs-help.generated.d.ts +303 -0
- package/src/lib/app-utils/docs-help.generated.js +867 -0
- package/src/lib/app-utils/docs-help.generated.js.map +1 -0
- package/src/lib/app-utils/docs-help.js +46 -0
- package/src/lib/app-utils/docs-help.js.map +1 -0
- package/src/lib/app-utils/docs-index.generated.d.ts +29 -0
- package/src/lib/app-utils/docs-index.generated.js +8388 -0
- package/src/lib/app-utils/docs-index.generated.js.map +1 -0
- package/src/lib/app-utils/docs-retrieval.d.ts +67 -0
- package/src/lib/app-utils/docs-retrieval.js +188 -0
- package/src/lib/app-utils/docs-retrieval.js.map +1 -0
- package/src/lib/app-utils/document-landmark.d.ts +50 -0
- package/src/lib/app-utils/document-landmark.js +100 -0
- package/src/lib/app-utils/document-landmark.js.map +1 -0
- package/src/lib/app-utils/duplicate-resource.d.ts +101 -0
- package/src/lib/app-utils/duplicate-resource.js +206 -0
- package/src/lib/app-utils/duplicate-resource.js.map +1 -0
- package/src/lib/app-utils/dynamic-list-rule.d.ts +471 -0
- package/src/lib/app-utils/dynamic-list-rule.js +914 -0
- package/src/lib/app-utils/dynamic-list-rule.js.map +1 -0
- package/src/lib/app-utils/element-animation.d.ts +200 -0
- package/src/lib/app-utils/element-animation.js +233 -0
- package/src/lib/app-utils/element-animation.js.map +1 -0
- package/src/lib/app-utils/element-hidden-style.d.ts +46 -0
- package/src/lib/app-utils/element-hidden-style.js +48 -0
- package/src/lib/app-utils/element-hidden-style.js.map +1 -0
- package/src/lib/app-utils/element-ui.d.ts +243 -0
- package/src/lib/app-utils/element-ui.js +459 -0
- package/src/lib/app-utils/element-ui.js.map +1 -0
- package/src/lib/app-utils/email-starter-policy.d.ts +160 -0
- package/src/lib/app-utils/email-starter-policy.js +327 -0
- package/src/lib/app-utils/email-starter-policy.js.map +1 -0
- package/src/lib/app-utils/email-topics.d.ts +310 -0
- package/src/lib/app-utils/email-topics.js +336 -0
- package/src/lib/app-utils/email-topics.js.map +1 -0
- package/src/lib/app-utils/enabled-plugins-context.d.ts +100 -0
- package/src/lib/app-utils/enabled-plugins-context.js +113 -0
- package/src/lib/app-utils/enabled-plugins-context.js.map +1 -0
- package/src/lib/app-utils/ensure-canvas-root.d.ts +38 -0
- package/src/lib/app-utils/ensure-canvas-root.js +61 -0
- package/src/lib/app-utils/ensure-canvas-root.js.map +1 -0
- package/src/lib/app-utils/entity-picker-context.d.ts +199 -0
- package/src/lib/app-utils/entity-picker-context.js +93 -0
- package/src/lib/app-utils/entity-picker-context.js.map +1 -0
- package/src/lib/app-utils/error-beacon.d.ts +107 -0
- package/src/lib/app-utils/error-beacon.js +296 -0
- package/src/lib/app-utils/error-beacon.js.map +1 -0
- package/src/lib/app-utils/expand-repeatables.d.ts +172 -0
- package/src/lib/app-utils/expand-repeatables.js +299 -0
- package/src/lib/app-utils/expand-repeatables.js.map +1 -0
- package/src/lib/app-utils/foreign-script.d.ts +82 -0
- package/src/lib/app-utils/foreign-script.js +102 -0
- package/src/lib/app-utils/foreign-script.js.map +1 -0
- package/src/lib/app-utils/form-abuse-ceiling.d.ts +146 -0
- package/src/lib/app-utils/form-abuse-ceiling.js +158 -0
- package/src/lib/app-utils/form-abuse-ceiling.js.map +1 -0
- package/src/lib/app-utils/form-contract.d.ts +198 -0
- package/src/lib/app-utils/form-contract.js +282 -0
- package/src/lib/app-utils/form-contract.js.map +1 -0
- package/src/lib/app-utils/form-dataset-binding.d.ts +50 -0
- package/src/lib/app-utils/form-dataset-binding.js +74 -0
- package/src/lib/app-utils/form-dataset-binding.js.map +1 -0
- package/src/lib/app-utils/forms.d.ts +727 -0
- package/src/lib/app-utils/forms.js +777 -0
- package/src/lib/app-utils/forms.js.map +1 -0
- package/src/lib/app-utils/functions.d.ts +188 -0
- package/src/lib/app-utils/functions.js +529 -0
- package/src/lib/app-utils/functions.js.map +1 -0
- package/src/lib/app-utils/guarded-version-save.d.ts +91 -0
- package/src/lib/app-utils/guarded-version-save.js +131 -0
- package/src/lib/app-utils/guarded-version-save.js.map +1 -0
- package/src/lib/app-utils/health-report.d.ts +1766 -0
- package/src/lib/app-utils/health-report.js +2072 -0
- package/src/lib/app-utils/health-report.js.map +1 -0
- package/src/lib/app-utils/host-naming.d.ts +135 -0
- package/src/lib/app-utils/host-naming.js +188 -0
- package/src/lib/app-utils/host-naming.js.map +1 -0
- package/src/lib/app-utils/host-permissions.d.ts +76 -0
- package/src/lib/app-utils/host-permissions.js +119 -0
- package/src/lib/app-utils/host-permissions.js.map +1 -0
- package/src/lib/app-utils/host-tokens.d.ts +228 -0
- package/src/lib/app-utils/host-tokens.js +304 -0
- package/src/lib/app-utils/host-tokens.js.map +1 -0
- package/src/lib/app-utils/idp-profile.d.ts +83 -0
- package/src/lib/app-utils/idp-profile.js +268 -0
- package/src/lib/app-utils/idp-profile.js.map +1 -0
- package/src/lib/app-utils/image-upload-types.d.ts +49 -0
- package/src/lib/app-utils/image-upload-types.js +86 -0
- package/src/lib/app-utils/image-upload-types.js.map +1 -0
- package/src/lib/app-utils/index.d.ts +18 -0
- package/src/lib/app-utils/index.js +23 -0
- package/src/lib/app-utils/index.js.map +1 -0
- package/src/lib/app-utils/internal-traffic.d.ts +197 -0
- package/src/lib/app-utils/internal-traffic.js +288 -0
- package/src/lib/app-utils/internal-traffic.js.map +1 -0
- package/src/lib/app-utils/lineal-order.d.ts +62 -0
- package/src/lib/app-utils/lineal-order.js +65 -0
- package/src/lib/app-utils/lineal-order.js.map +1 -0
- package/src/lib/app-utils/link-references.d.ts +36 -0
- package/src/lib/app-utils/link-references.js +89 -0
- package/src/lib/app-utils/link-references.js.map +1 -0
- package/src/lib/app-utils/link-target-search-context.d.ts +123 -0
- package/src/lib/app-utils/link-target-search-context.js +221 -0
- package/src/lib/app-utils/link-target-search-context.js.map +1 -0
- package/src/lib/app-utils/list-assignment-policy.d.ts +169 -0
- package/src/lib/app-utils/list-assignment-policy.js +170 -0
- package/src/lib/app-utils/list-assignment-policy.js.map +1 -0
- package/src/lib/app-utils/list-import.d.ts +158 -0
- package/src/lib/app-utils/list-import.js +332 -0
- package/src/lib/app-utils/list-import.js.map +1 -0
- package/src/lib/app-utils/llms-txt.d.ts +104 -0
- package/src/lib/app-utils/llms-txt.js +144 -0
- package/src/lib/app-utils/llms-txt.js.map +1 -0
- package/src/lib/app-utils/local-storage-budget.d.ts +75 -0
- package/src/lib/app-utils/local-storage-budget.js +153 -0
- package/src/lib/app-utils/local-storage-budget.js.map +1 -0
- package/src/lib/app-utils/lockdown.d.ts +698 -0
- package/src/lib/app-utils/lockdown.js +929 -0
- package/src/lib/app-utils/lockdown.js.map +1 -0
- package/src/lib/app-utils/margin-utilization.d.ts +267 -0
- package/src/lib/app-utils/margin-utilization.js +351 -0
- package/src/lib/app-utils/margin-utilization.js.map +1 -0
- package/src/lib/app-utils/markdown-lite.d.ts +297 -0
- package/src/lib/app-utils/markdown-lite.js +705 -0
- package/src/lib/app-utils/markdown-lite.js.map +1 -0
- package/src/lib/app-utils/marketing-consent.d.ts +704 -0
- package/src/lib/app-utils/marketing-consent.js +783 -0
- package/src/lib/app-utils/marketing-consent.js.map +1 -0
- package/src/lib/app-utils/marketplace-listing-visibility.d.ts +120 -0
- package/src/lib/app-utils/marketplace-listing-visibility.js +139 -0
- package/src/lib/app-utils/marketplace-listing-visibility.js.map +1 -0
- package/src/lib/app-utils/marketplace-overrides.d.ts +271 -0
- package/src/lib/app-utils/marketplace-overrides.js +462 -0
- package/src/lib/app-utils/marketplace-overrides.js.map +1 -0
- package/src/lib/app-utils/marketplace-provenance.d.ts +150 -0
- package/src/lib/app-utils/marketplace-provenance.js +136 -0
- package/src/lib/app-utils/marketplace-provenance.js.map +1 -0
- package/src/lib/app-utils/marketplace-theme.d.ts +237 -0
- package/src/lib/app-utils/marketplace-theme.js +525 -0
- package/src/lib/app-utils/marketplace-theme.js.map +1 -0
- package/src/lib/app-utils/marketplace-update-state.d.ts +119 -0
- package/src/lib/app-utils/marketplace-update-state.js +132 -0
- package/src/lib/app-utils/marketplace-update-state.js.map +1 -0
- package/src/lib/app-utils/marketplace-verification.d.ts +95 -0
- package/src/lib/app-utils/marketplace-verification.js +81 -0
- package/src/lib/app-utils/marketplace-verification.js.map +1 -0
- package/src/lib/app-utils/measure-node-map.d.ts +76 -0
- package/src/lib/app-utils/measure-node-map.js +111 -0
- package/src/lib/app-utils/measure-node-map.js.map +1 -0
- package/src/lib/app-utils/media-alt.d.ts +55 -0
- package/src/lib/app-utils/media-alt.js +58 -0
- package/src/lib/app-utils/media-alt.js.map +1 -0
- package/src/lib/app-utils/media-asset-facts.d.ts +125 -0
- package/src/lib/app-utils/media-asset-facts.js +467 -0
- package/src/lib/app-utils/media-asset-facts.js.map +1 -0
- package/src/lib/app-utils/media-cdn-scope.d.ts +65 -0
- package/src/lib/app-utils/media-cdn-scope.js +75 -0
- package/src/lib/app-utils/media-cdn-scope.js.map +1 -0
- package/src/lib/app-utils/media-folders.d.ts +161 -0
- package/src/lib/app-utils/media-folders.js +230 -0
- package/src/lib/app-utils/media-folders.js.map +1 -0
- package/src/lib/app-utils/media-metadata.d.ts +277 -0
- package/src/lib/app-utils/media-metadata.js +388 -0
- package/src/lib/app-utils/media-metadata.js.map +1 -0
- package/src/lib/app-utils/media-picker-context.d.ts +93 -0
- package/src/lib/app-utils/media-picker-context.js +26 -0
- package/src/lib/app-utils/media-picker-context.js.map +1 -0
- package/src/lib/app-utils/media-quarantine.d.ts +247 -0
- package/src/lib/app-utils/media-quarantine.js +323 -0
- package/src/lib/app-utils/media-quarantine.js.map +1 -0
- package/src/lib/app-utils/media-ref.d.ts +661 -0
- package/src/lib/app-utils/media-ref.js +1055 -0
- package/src/lib/app-utils/media-ref.js.map +1 -0
- package/src/lib/app-utils/media-takedown-reach.d.ts +126 -0
- package/src/lib/app-utils/media-takedown-reach.js +143 -0
- package/src/lib/app-utils/media-takedown-reach.js.map +1 -0
- package/src/lib/app-utils/member-email-aliases.d.ts +180 -0
- package/src/lib/app-utils/member-email-aliases.js +217 -0
- package/src/lib/app-utils/member-email-aliases.js.map +1 -0
- package/src/lib/app-utils/merge-node-sx.d.ts +47 -0
- package/src/lib/app-utils/merge-node-sx.js +123 -0
- package/src/lib/app-utils/merge-node-sx.js.map +1 -0
- package/src/lib/app-utils/name-match.d.ts +155 -0
- package/src/lib/app-utils/name-match.js +175 -0
- package/src/lib/app-utils/name-match.js.map +1 -0
- package/src/lib/app-utils/name-search.d.ts +117 -0
- package/src/lib/app-utils/name-search.js +145 -0
- package/src/lib/app-utils/name-search.js.map +1 -0
- package/src/lib/app-utils/node-capabilities.d.ts +85 -0
- package/src/lib/app-utils/node-capabilities.js +88 -0
- package/src/lib/app-utils/node-capabilities.js.map +1 -0
- package/src/lib/app-utils/node-definition-sanitizer.d.ts +164 -0
- package/src/lib/app-utils/node-definition-sanitizer.js +402 -0
- package/src/lib/app-utils/node-definition-sanitizer.js.map +1 -0
- package/src/lib/app-utils/node-identity.d.ts +47 -0
- package/src/lib/app-utils/node-identity.js +50 -0
- package/src/lib/app-utils/node-identity.js.map +1 -0
- package/src/lib/app-utils/node-interactions.d.ts +102 -0
- package/src/lib/app-utils/node-interactions.js +192 -0
- package/src/lib/app-utils/node-interactions.js.map +1 -0
- package/src/lib/app-utils/node-url-policy.d.ts +54 -0
- package/src/lib/app-utils/node-url-policy.js +72 -0
- package/src/lib/app-utils/node-url-policy.js.map +1 -0
- package/src/lib/app-utils/notifications.d.ts +71 -0
- package/src/lib/app-utils/notifications.js +101 -0
- package/src/lib/app-utils/notifications.js.map +1 -0
- package/src/lib/app-utils/onboarding-deep-link.d.ts +120 -0
- package/src/lib/app-utils/onboarding-deep-link.js +142 -0
- package/src/lib/app-utils/onboarding-deep-link.js.map +1 -0
- package/src/lib/app-utils/operator-identity.d.ts +207 -0
- package/src/lib/app-utils/operator-identity.js +186 -0
- package/src/lib/app-utils/operator-identity.js.map +1 -0
- package/src/lib/app-utils/org-billing-doc.d.ts +231 -0
- package/src/lib/app-utils/org-billing-doc.js +238 -0
- package/src/lib/app-utils/org-billing-doc.js.map +1 -0
- package/src/lib/app-utils/org-override-reason.d.ts +100 -0
- package/src/lib/app-utils/org-override-reason.js +116 -0
- package/src/lib/app-utils/org-override-reason.js.map +1 -0
- package/src/lib/app-utils/org-permissions.d.ts +194 -0
- package/src/lib/app-utils/org-permissions.js +357 -0
- package/src/lib/app-utils/org-permissions.js.map +1 -0
- package/src/lib/app-utils/org-roles.d.ts +72 -0
- package/src/lib/app-utils/org-roles.js +131 -0
- package/src/lib/app-utils/org-roles.js.map +1 -0
- package/src/lib/app-utils/organizations.d.ts +407 -0
- package/src/lib/app-utils/organizations.js +511 -0
- package/src/lib/app-utils/organizations.js.map +1 -0
- package/src/lib/app-utils/page-header-actions-context.d.ts +83 -0
- package/src/lib/app-utils/page-header-actions-context.js +58 -0
- package/src/lib/app-utils/page-header-actions-context.js.map +1 -0
- package/src/lib/app-utils/page-header-record-context.d.ts +80 -0
- package/src/lib/app-utils/page-header-record-context.js +64 -0
- package/src/lib/app-utils/page-header-record-context.js.map +1 -0
- package/src/lib/app-utils/page-markdown.d.ts +103 -0
- package/src/lib/app-utils/page-markdown.js +385 -0
- package/src/lib/app-utils/page-markdown.js.map +1 -0
- package/src/lib/app-utils/paid-media-source.d.ts +90 -0
- package/src/lib/app-utils/paid-media-source.js +184 -0
- package/src/lib/app-utils/paid-media-source.js.map +1 -0
- package/src/lib/app-utils/palette-sx.d.ts +34 -0
- package/src/lib/app-utils/palette-sx.js +150 -0
- package/src/lib/app-utils/palette-sx.js.map +1 -0
- package/src/lib/app-utils/password-policy.d.ts +47 -0
- package/src/lib/app-utils/password-policy.js +46 -0
- package/src/lib/app-utils/password-policy.js.map +1 -0
- package/src/lib/app-utils/payments-configured.d.ts +84 -0
- package/src/lib/app-utils/payments-configured.js +88 -0
- package/src/lib/app-utils/payments-configured.js.map +1 -0
- package/src/lib/app-utils/person-erasure.d.ts +126 -0
- package/src/lib/app-utils/person-erasure.js +121 -0
- package/src/lib/app-utils/person-erasure.js.map +1 -0
- package/src/lib/app-utils/person-key.d.ts +32 -0
- package/src/lib/app-utils/person-key.js +62 -0
- package/src/lib/app-utils/person-key.js.map +1 -0
- package/src/lib/app-utils/plan-entitlements.d.ts +2756 -0
- package/src/lib/app-utils/plan-entitlements.js +4085 -0
- package/src/lib/app-utils/plan-entitlements.js.map +1 -0
- package/src/lib/app-utils/platform-ad-conversions.d.ts +122 -0
- package/src/lib/app-utils/platform-ad-conversions.js +174 -0
- package/src/lib/app-utils/platform-ad-conversions.js.map +1 -0
- package/src/lib/app-utils/platform-advertising-tags.d.ts +139 -0
- package/src/lib/app-utils/platform-advertising-tags.js +203 -0
- package/src/lib/app-utils/platform-advertising-tags.js.map +1 -0
- package/src/lib/app-utils/platform-brand.d.ts +151 -0
- package/src/lib/app-utils/platform-brand.js +175 -0
- package/src/lib/app-utils/platform-brand.js.map +1 -0
- package/src/lib/app-utils/platform-consent-default.d.ts +142 -0
- package/src/lib/app-utils/platform-consent-default.js +295 -0
- package/src/lib/app-utils/platform-consent-default.js.map +1 -0
- package/src/lib/app-utils/platform-marketing-consent.d.ts +151 -0
- package/src/lib/app-utils/platform-marketing-consent.js +182 -0
- package/src/lib/app-utils/platform-marketing-consent.js.map +1 -0
- package/src/lib/app-utils/platform-marketing-host.d.ts +33 -0
- package/src/lib/app-utils/platform-marketing-host.js +97 -0
- package/src/lib/app-utils/platform-marketing-host.js.map +1 -0
- package/src/lib/app-utils/platform-visitor-consent.d.ts +252 -0
- package/src/lib/app-utils/platform-visitor-consent.js +533 -0
- package/src/lib/app-utils/platform-visitor-consent.js.map +1 -0
- package/src/lib/app-utils/plugin-api-cross-origin.d.ts +61 -0
- package/src/lib/app-utils/plugin-api-cross-origin.js +202 -0
- package/src/lib/app-utils/plugin-api-cross-origin.js.map +1 -0
- package/src/lib/app-utils/plugin-api-rate-limit.d.ts +192 -0
- package/src/lib/app-utils/plugin-api-rate-limit.js +270 -0
- package/src/lib/app-utils/plugin-api-rate-limit.js.map +1 -0
- package/src/lib/app-utils/plugin-artifact-path.d.ts +32 -0
- package/src/lib/app-utils/plugin-artifact-path.js +33 -0
- package/src/lib/app-utils/plugin-artifact-path.js.map +1 -0
- package/src/lib/app-utils/plugin-bundle-checks.d.ts +148 -0
- package/src/lib/app-utils/plugin-bundle-checks.js +989 -0
- package/src/lib/app-utils/plugin-bundle-checks.js.map +1 -0
- package/src/lib/app-utils/plugin-manifest.d.ts +516 -0
- package/src/lib/app-utils/plugin-manifest.js +687 -0
- package/src/lib/app-utils/plugin-manifest.js.map +1 -0
- package/src/lib/app-utils/published-legal-pages.d.ts +71 -0
- package/src/lib/app-utils/published-legal-pages.js +90 -0
- package/src/lib/app-utils/published-legal-pages.js.map +1 -0
- package/src/lib/app-utils/publisher-agreement.d.ts +254 -0
- package/src/lib/app-utils/publisher-agreement.js +274 -0
- package/src/lib/app-utils/publisher-agreement.js.map +1 -0
- package/src/lib/app-utils/publisher-attestation.d.ts +99 -0
- package/src/lib/app-utils/publisher-attestation.js +158 -0
- package/src/lib/app-utils/publisher-attestation.js.map +1 -0
- package/src/lib/app-utils/recipient-email-render.d.ts +216 -0
- package/src/lib/app-utils/recipient-email-render.js +221 -0
- package/src/lib/app-utils/recipient-email-render.js.map +1 -0
- package/src/lib/app-utils/redispatch-caught-error.d.ts +38 -0
- package/src/lib/app-utils/redispatch-caught-error.js +46 -0
- package/src/lib/app-utils/redispatch-caught-error.js.map +1 -0
- package/src/lib/app-utils/registering-plugin.d.ts +19 -0
- package/src/lib/app-utils/registering-plugin.js +38 -0
- package/src/lib/app-utils/registering-plugin.js.map +1 -0
- package/src/lib/app-utils/release-flags.d.ts +283 -0
- package/src/lib/app-utils/release-flags.js +518 -0
- package/src/lib/app-utils/release-flags.js.map +1 -0
- package/src/lib/app-utils/repair-canvas-nodes.d.ts +130 -0
- package/src/lib/app-utils/repair-canvas-nodes.js +298 -0
- package/src/lib/app-utils/repair-canvas-nodes.js.map +1 -0
- package/src/lib/app-utils/repeat-infringer.d.ts +166 -0
- package/src/lib/app-utils/repeat-infringer.js +188 -0
- package/src/lib/app-utils/repeat-infringer.js.map +1 -0
- package/src/lib/app-utils/repeat-sources.d.ts +115 -0
- package/src/lib/app-utils/repeat-sources.js +86 -0
- package/src/lib/app-utils/repeat-sources.js.map +1 -0
- package/src/lib/app-utils/request-geo.d.ts +114 -0
- package/src/lib/app-utils/request-geo.js +247 -0
- package/src/lib/app-utils/request-geo.js.map +1 -0
- package/src/lib/app-utils/request-ip.d.ts +213 -0
- package/src/lib/app-utils/request-ip.js +344 -0
- package/src/lib/app-utils/request-ip.js.map +1 -0
- package/src/lib/app-utils/resolve-named-tokens.d.ts +26 -0
- package/src/lib/app-utils/resolve-named-tokens.js +59 -0
- package/src/lib/app-utils/resolve-named-tokens.js.map +1 -0
- package/src/lib/app-utils/responsive-typography-sx.d.ts +77 -0
- package/src/lib/app-utils/responsive-typography-sx.js +122 -0
- package/src/lib/app-utils/responsive-typography-sx.js.map +1 -0
- package/src/lib/app-utils/reusable-component-keys.d.ts +135 -0
- package/src/lib/app-utils/reusable-component-keys.js +140 -0
- package/src/lib/app-utils/reusable-component-keys.js.map +1 -0
- package/src/lib/app-utils/reusable-prop-values.d.ts +199 -0
- package/src/lib/app-utils/reusable-prop-values.js +494 -0
- package/src/lib/app-utils/reusable-prop-values.js.map +1 -0
- package/src/lib/app-utils/safe-json-ld.d.ts +29 -0
- package/src/lib/app-utils/safe-json-ld.js +37 -0
- package/src/lib/app-utils/safe-json-ld.js.map +1 -0
- package/src/lib/app-utils/sanitize-svg.d.ts +55 -0
- package/src/lib/app-utils/sanitize-svg.js +460 -0
- package/src/lib/app-utils/sanitize-svg.js.map +1 -0
- package/src/lib/app-utils/scheme-sx.d.ts +84 -0
- package/src/lib/app-utils/scheme-sx.js +148 -0
- package/src/lib/app-utils/scheme-sx.js.map +1 -0
- package/src/lib/app-utils/scope-tokens.d.ts +249 -0
- package/src/lib/app-utils/scope-tokens.js +331 -0
- package/src/lib/app-utils/scope-tokens.js.map +1 -0
- package/src/lib/app-utils/screen-link-context-value.d.ts +57 -0
- package/src/lib/app-utils/screen-link-context-value.js +43 -0
- package/src/lib/app-utils/screen-link-context-value.js.map +1 -0
- package/src/lib/app-utils/screen-link-context.d.ts +185 -0
- package/src/lib/app-utils/screen-link-context.js +304 -0
- package/src/lib/app-utils/screen-link-context.js.map +1 -0
- package/src/lib/app-utils/screen-link-value.d.ts +269 -0
- package/src/lib/app-utils/screen-link-value.js +384 -0
- package/src/lib/app-utils/screen-link-value.js.map +1 -0
- package/src/lib/app-utils/screen-route.d.ts +669 -0
- package/src/lib/app-utils/screen-route.js +751 -0
- package/src/lib/app-utils/screen-route.js.map +1 -0
- package/src/lib/app-utils/screen-seo-fields.d.ts +37 -0
- package/src/lib/app-utils/screen-seo-fields.js +42 -0
- package/src/lib/app-utils/screen-seo-fields.js.map +1 -0
- package/src/lib/app-utils/search-indexing.d.ts +162 -0
- package/src/lib/app-utils/search-indexing.js +207 -0
- package/src/lib/app-utils/search-indexing.js.map +1 -0
- package/src/lib/app-utils/seo-listing-fields.d.ts +70 -0
- package/src/lib/app-utils/seo-listing-fields.js +75 -0
- package/src/lib/app-utils/seo-listing-fields.js.map +1 -0
- package/src/lib/app-utils/seo-locale.d.ts +119 -0
- package/src/lib/app-utils/seo-locale.js +133 -0
- package/src/lib/app-utils/seo-locale.js.map +1 -0
- package/src/lib/app-utils/seo-title-variables.d.ts +149 -0
- package/src/lib/app-utils/seo-title-variables.js +190 -0
- package/src/lib/app-utils/seo-title-variables.js.map +1 -0
- package/src/lib/app-utils/seo-title.d.ts +70 -0
- package/src/lib/app-utils/seo-title.js +117 -0
- package/src/lib/app-utils/seo-title.js.map +1 -0
- package/src/lib/app-utils/server.d.ts +174 -0
- package/src/lib/app-utils/server.js +314 -0
- package/src/lib/app-utils/server.js.map +1 -0
- package/src/lib/app-utils/site-context.d.ts +106 -0
- package/src/lib/app-utils/site-context.js +100 -0
- package/src/lib/app-utils/site-context.js.map +1 -0
- package/src/lib/app-utils/sitemap.d.ts +117 -0
- package/src/lib/app-utils/sitemap.js +183 -0
- package/src/lib/app-utils/sitemap.js.map +1 -0
- package/src/lib/app-utils/social-image.d.ts +112 -0
- package/src/lib/app-utils/social-image.js +191 -0
- package/src/lib/app-utils/social-image.js.map +1 -0
- package/src/lib/app-utils/starter-templates.d.ts +99 -0
- package/src/lib/app-utils/starter-templates.js +579 -0
- package/src/lib/app-utils/starter-templates.js.map +1 -0
- package/src/lib/app-utils/stored-nodes.d.ts +120 -0
- package/src/lib/app-utils/stored-nodes.js +174 -0
- package/src/lib/app-utils/stored-nodes.js.map +1 -0
- package/src/lib/app-utils/strip-undefined.d.ts +59 -0
- package/src/lib/app-utils/strip-undefined.js +95 -0
- package/src/lib/app-utils/strip-undefined.js.map +1 -0
- package/src/lib/app-utils/stripe-deployment-mode.d.ts +47 -0
- package/src/lib/app-utils/stripe-deployment-mode.js +70 -0
- package/src/lib/app-utils/stripe-deployment-mode.js.map +1 -0
- package/src/lib/app-utils/support-tiers.d.ts +108 -0
- package/src/lib/app-utils/support-tiers.js +201 -0
- package/src/lib/app-utils/support-tiers.js.map +1 -0
- package/src/lib/app-utils/timezone-geo-hint.d.ts +36 -0
- package/src/lib/app-utils/timezone-geo-hint.js +180 -0
- package/src/lib/app-utils/timezone-geo-hint.js.map +1 -0
- package/src/lib/app-utils/upload-cors.d.ts +155 -0
- package/src/lib/app-utils/upload-cors.js +254 -0
- package/src/lib/app-utils/upload-cors.js.map +1 -0
- package/src/lib/app-utils/upload-inspection.d.ts +159 -0
- package/src/lib/app-utils/upload-inspection.js +539 -0
- package/src/lib/app-utils/upload-inspection.js.map +1 -0
- package/src/lib/app-utils/url-slug.d.ts +40 -0
- package/src/lib/app-utils/url-slug.js +42 -0
- package/src/lib/app-utils/url-slug.js.map +1 -0
- package/src/lib/app-utils/usage-budget.d.ts +429 -0
- package/src/lib/app-utils/usage-budget.js +421 -0
- package/src/lib/app-utils/usage-budget.js.map +1 -0
- package/src/lib/app-utils/variables.d.ts +96 -0
- package/src/lib/app-utils/variables.js +233 -0
- package/src/lib/app-utils/variables.js.map +1 -0
- package/src/lib/app-utils/video-asset-facts.d.ts +61 -0
- package/src/lib/app-utils/video-asset-facts.js +70 -0
- package/src/lib/app-utils/video-asset-facts.js.map +1 -0
- package/src/lib/app-utils/video-object.d.ts +89 -0
- package/src/lib/app-utils/video-object.js +245 -0
- package/src/lib/app-utils/video-object.js.map +1 -0
- package/src/lib/app-utils/visitor-consent.d.ts +757 -0
- package/src/lib/app-utils/visitor-consent.js +981 -0
- package/src/lib/app-utils/visitor-consent.js.map +1 -0
- package/src/lib/app-utils/visitor-record-ceiling.d.ts +223 -0
- package/src/lib/app-utils/visitor-record-ceiling.js +215 -0
- package/src/lib/app-utils/visitor-record-ceiling.js.map +1 -0
- package/src/lib/app-utils/web-vitals-rum.d.ts +53 -0
- package/src/lib/app-utils/web-vitals-rum.js +278 -0
- package/src/lib/app-utils/web-vitals-rum.js.map +1 -0
- package/src/lib/app-utils/webhook-delivery.d.ts +324 -0
- package/src/lib/app-utils/webhook-delivery.js +413 -0
- package/src/lib/app-utils/webhook-delivery.js.map +1 -0
- package/src/lib/app-utils/where-used.d.ts +57 -0
- package/src/lib/app-utils/where-used.js +59 -0
- package/src/lib/app-utils/where-used.js.map +1 -0
- package/src/lib/app-utils/wistia-embed.d.ts +86 -0
- package/src/lib/app-utils/wistia-embed.js +119 -0
- package/src/lib/app-utils/wistia-embed.js.map +1 -0
- package/src/lib/app-utils/workflows.d.ts +136 -0
- package/src/lib/app-utils/workflows.js +346 -0
- package/src/lib/app-utils/workflows.js.map +1 -0
- package/src/lib/canvas-manager/canvas-manager-tree.d.ts +109 -0
- package/src/lib/canvas-manager/canvas-manager-tree.js +139 -0
- package/src/lib/canvas-manager/canvas-manager-tree.js.map +1 -0
- package/src/lib/canvas-manager/canvas-manager.d.ts +549 -0
- package/src/lib/canvas-manager/canvas-manager.js +1311 -0
- package/src/lib/canvas-manager/canvas-manager.js.map +1 -0
- package/src/lib/canvas-manager/index.d.ts +20 -0
- package/src/lib/canvas-manager/index.js +21 -0
- package/src/lib/canvas-manager/index.js.map +1 -0
- package/src/lib/canvas-manager/stores/index.d.ts +17 -0
- package/src/lib/canvas-manager/stores/index.js +18 -0
- package/src/lib/canvas-manager/stores/index.js.map +1 -0
- package/src/lib/canvas-manager/stores/node.store.d.ts +30 -0
- package/src/lib/canvas-manager/stores/node.store.js +45 -0
- package/src/lib/canvas-manager/stores/node.store.js.map +1 -0
- package/src/lib/components-manager/components-manager.d.ts +56 -0
- package/src/lib/components-manager/components-manager.js +191 -0
- package/src/lib/components-manager/components-manager.js.map +1 -0
- package/src/lib/components-manager/index.d.ts +18 -0
- package/src/lib/components-manager/index.js +19 -0
- package/src/lib/components-manager/index.js.map +1 -0
- package/src/lib/emit-manager/emit-manager.d.ts +56 -0
- package/src/lib/emit-manager/emit-manager.js +60 -0
- package/src/lib/emit-manager/emit-manager.js.map +1 -0
- package/src/lib/emit-manager/index.d.ts +18 -0
- package/src/lib/emit-manager/index.js +19 -0
- package/src/lib/emit-manager/index.js.map +1 -0
- package/src/lib/foundation/constants/_internal.d.ts +18 -0
- package/src/lib/foundation/constants/_internal.js +62 -0
- package/src/lib/foundation/constants/_internal.js.map +1 -0
- package/src/lib/foundation/constants/app.d.ts +23 -0
- package/src/lib/foundation/constants/app.js +25 -0
- package/src/lib/foundation/constants/app.js.map +1 -0
- package/src/lib/foundation/constants/canvas.d.ts +18 -0
- package/src/lib/foundation/constants/canvas.js +18 -0
- package/src/lib/foundation/constants/canvas.js.map +1 -0
- package/src/lib/foundation/constants/components.d.ts +54 -0
- package/src/lib/foundation/constants/components.js +61 -0
- package/src/lib/foundation/constants/components.js.map +1 -0
- package/src/lib/foundation/constants/shared.d.ts +50 -0
- package/src/lib/foundation/constants/shared.js +49 -0
- package/src/lib/foundation/constants/shared.js.map +1 -0
- package/src/lib/foundation/constants/symbol.d.ts +63 -0
- package/src/lib/foundation/constants/symbol.js +75 -0
- package/src/lib/foundation/constants/symbol.js.map +1 -0
- package/src/lib/foundation/definitions/components.types.d.ts +372 -0
- package/src/lib/foundation/definitions/components.types.js +180 -0
- package/src/lib/foundation/definitions/components.types.js.map +1 -0
- package/src/lib/foundation/definitions/contact.types.d.ts +73 -0
- package/src/lib/foundation/definitions/contact.types.js +107 -0
- package/src/lib/foundation/definitions/contact.types.js.map +1 -0
- package/src/lib/foundation/definitions/host-content-collections.d.ts +137 -0
- package/src/lib/foundation/definitions/host-content-collections.js +219 -0
- package/src/lib/foundation/definitions/host-content-collections.js.map +1 -0
- package/src/lib/foundation/definitions/org-billing.types.d.ts +1361 -0
- package/src/lib/foundation/definitions/org-billing.types.js +77 -0
- package/src/lib/foundation/definitions/org-billing.types.js.map +1 -0
- package/src/lib/foundation/definitions/organization.types.d.ts +307 -0
- package/src/lib/foundation/definitions/organization.types.js +42 -0
- package/src/lib/foundation/definitions/organization.types.js.map +1 -0
- package/src/lib/foundation/definitions/platform.types.d.ts +1326 -0
- package/src/lib/foundation/definitions/platform.types.js +124 -0
- package/src/lib/foundation/definitions/platform.types.js.map +1 -0
- package/src/lib/foundation/definitions/property-kinds.d.ts +189 -0
- package/src/lib/foundation/definitions/property-kinds.js +565 -0
- package/src/lib/foundation/definitions/property-kinds.js.map +1 -0
- package/src/lib/foundation/definitions/shared.d.ts +23 -0
- package/src/lib/foundation/definitions/shared.js +18 -0
- package/src/lib/foundation/definitions/shared.js.map +1 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.d.ts +249 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.js +499 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.js.map +1 -0
- package/src/lib/foundation/index.d.ts +32 -0
- package/src/lib/foundation/index.js +67 -0
- package/src/lib/foundation/index.js.map +1 -0
- package/src/lib/lifecycle.d.ts +24 -0
- package/src/lib/lifecycle.js +39 -0
- package/src/lib/lifecycle.js.map +1 -0
- package/src/lib/mst/common.d.ts +17 -0
- package/src/lib/mst/common.js +23 -0
- package/src/lib/mst/common.js.map +1 -0
- package/src/lib/mst/index.d.ts +19 -0
- package/src/lib/mst/index.js +20 -0
- package/src/lib/mst/index.js.map +1 -0
- package/src/lib/mst/json.d.ts +22 -0
- package/src/lib/mst/json.js +23 -0
- package/src/lib/mst/json.js.map +1 -0
- package/src/lib/mst/types.d.ts +20 -0
- package/src/lib/mst/types.js +18 -0
- package/src/lib/mst/types.js.map +1 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.d.ts +77 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.js +55 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.js.map +1 -0
- package/src/lib/plugin-manager/commerce-zone-props.d.ts +172 -0
- package/src/lib/plugin-manager/commerce-zone-props.js +31 -0
- package/src/lib/plugin-manager/commerce-zone-props.js.map +1 -0
- package/src/lib/plugin-manager/custom-fields.d.ts +60 -0
- package/src/lib/plugin-manager/custom-fields.js +39 -0
- package/src/lib/plugin-manager/custom-fields.js.map +1 -0
- package/src/lib/plugin-manager/editor-sessions.d.ts +109 -0
- package/src/lib/plugin-manager/editor-sessions.js +137 -0
- package/src/lib/plugin-manager/editor-sessions.js.map +1 -0
- package/src/lib/plugin-manager/enabled-plugins.d.ts +438 -0
- package/src/lib/plugin-manager/enabled-plugins.js +403 -0
- package/src/lib/plugin-manager/enabled-plugins.js.map +1 -0
- package/src/lib/plugin-manager/feature-plugins.d.ts +1314 -0
- package/src/lib/plugin-manager/feature-plugins.js +609 -0
- package/src/lib/plugin-manager/feature-plugins.js.map +1 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +11 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js +149 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -0
- package/src/lib/plugin-manager/index.d.ts +42 -0
- package/src/lib/plugin-manager/index.js +46 -0
- package/src/lib/plugin-manager/index.js.map +1 -0
- package/src/lib/plugin-manager/install-presets.d.ts +93 -0
- package/src/lib/plugin-manager/install-presets.js +86 -0
- package/src/lib/plugin-manager/install-presets.js.map +1 -0
- package/src/lib/plugin-manager/media-delivery-provider.d.ts +124 -0
- package/src/lib/plugin-manager/media-delivery-provider.js +53 -0
- package/src/lib/plugin-manager/media-delivery-provider.js.map +1 -0
- package/src/lib/plugin-manager/order-fulfilment.d.ts +142 -0
- package/src/lib/plugin-manager/order-fulfilment.js +104 -0
- package/src/lib/plugin-manager/order-fulfilment.js.map +1 -0
- package/src/lib/plugin-manager/plugin-activity-actions.d.ts +122 -0
- package/src/lib/plugin-manager/plugin-activity-actions.js +140 -0
- package/src/lib/plugin-manager/plugin-activity-actions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-bridge.d.ts +98 -0
- package/src/lib/plugin-manager/plugin-bridge.js +154 -0
- package/src/lib/plugin-manager/plugin-bridge.js.map +1 -0
- package/src/lib/plugin-manager/plugin-config.d.ts +148 -0
- package/src/lib/plugin-manager/plugin-config.js +228 -0
- package/src/lib/plugin-manager/plugin-config.js.map +1 -0
- package/src/lib/plugin-manager/plugin-console-crons.d.ts +139 -0
- package/src/lib/plugin-manager/plugin-console-crons.js +177 -0
- package/src/lib/plugin-manager/plugin-console-crons.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contact-capture.d.ts +220 -0
- package/src/lib/plugin-manager/plugin-contact-capture.js +89 -0
- package/src/lib/plugin-manager/plugin-contact-capture.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contributions.d.ts +244 -0
- package/src/lib/plugin-manager/plugin-contributions.js +283 -0
- package/src/lib/plugin-manager/plugin-contributions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.d.ts +169 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.js +84 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.js.map +1 -0
- package/src/lib/plugin-manager/plugin-entitlements.d.ts +181 -0
- package/src/lib/plugin-manager/plugin-entitlements.js +188 -0
- package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -0
- package/src/lib/plugin-manager/plugin-events.d.ts +145 -0
- package/src/lib/plugin-manager/plugin-events.js +79 -0
- package/src/lib/plugin-manager/plugin-events.js.map +1 -0
- package/src/lib/plugin-manager/plugin-figures.d.ts +251 -0
- package/src/lib/plugin-manager/plugin-figures.js +252 -0
- package/src/lib/plugin-manager/plugin-figures.js.map +1 -0
- package/src/lib/plugin-manager/plugin-host-collections.d.ts +146 -0
- package/src/lib/plugin-manager/plugin-host-collections.js +116 -0
- package/src/lib/plugin-manager/plugin-host-collections.js.map +1 -0
- package/src/lib/plugin-manager/plugin-jobs.d.ts +130 -0
- package/src/lib/plugin-manager/plugin-jobs.js +182 -0
- package/src/lib/plugin-manager/plugin-jobs.js.map +1 -0
- package/src/lib/plugin-manager/plugin-loader.d.ts +86 -0
- package/src/lib/plugin-manager/plugin-loader.js +223 -0
- package/src/lib/plugin-manager/plugin-loader.js.map +1 -0
- package/src/lib/plugin-manager/plugin-manager.d.ts +95 -0
- package/src/lib/plugin-manager/plugin-manager.js +343 -0
- package/src/lib/plugin-manager/plugin-manager.js.map +1 -0
- package/src/lib/plugin-manager/plugin-metered-lines.d.ts +97 -0
- package/src/lib/plugin-manager/plugin-metered-lines.js +123 -0
- package/src/lib/plugin-manager/plugin-metered-lines.js.map +1 -0
- package/src/lib/plugin-manager/plugin-org-erasure.d.ts +52 -0
- package/src/lib/plugin-manager/plugin-org-erasure.js +100 -0
- package/src/lib/plugin-manager/plugin-org-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-permissions.d.ts +69 -0
- package/src/lib/plugin-manager/plugin-permissions.js +77 -0
- package/src/lib/plugin-manager/plugin-permissions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-person-erasure.d.ts +58 -0
- package/src/lib/plugin-manager/plugin-person-erasure.js +109 -0
- package/src/lib/plugin-manager/plugin-person-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-cards.d.ts +99 -0
- package/src/lib/plugin-manager/plugin-record-cards.js +59 -0
- package/src/lib/plugin-manager/plugin-record-cards.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-facts.d.ts +111 -0
- package/src/lib/plugin-manager/plugin-record-facts.js +51 -0
- package/src/lib/plugin-manager/plugin-record-facts.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-routes.d.ts +129 -0
- package/src/lib/plugin-manager/plugin-record-routes.js +93 -0
- package/src/lib/plugin-manager/plugin-record-routes.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-timeline.d.ts +147 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js +39 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js.map +1 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.d.ts +137 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.js +51 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.js.map +1 -0
- package/src/lib/plugin-manager/plugin-services.d.ts +94 -0
- package/src/lib/plugin-manager/plugin-services.js +153 -0
- package/src/lib/plugin-manager/plugin-services.js.map +1 -0
- package/src/lib/plugin-manager/plugin-styles-ui.d.ts +71 -0
- package/src/lib/plugin-manager/plugin-styles-ui.js +80 -0
- package/src/lib/plugin-manager/plugin-styles-ui.js.map +1 -0
- package/src/lib/plugin-manager/plugin-styles.d.ts +176 -0
- package/src/lib/plugin-manager/plugin-styles.js +186 -0
- package/src/lib/plugin-manager/plugin-styles.js.map +1 -0
- package/src/lib/plugin-manager/plugin-subprocessors.d.ts +135 -0
- package/src/lib/plugin-manager/plugin-subprocessors.js +129 -0
- package/src/lib/plugin-manager/plugin-subprocessors.js.map +1 -0
- package/src/lib/plugin-manager/plugin-tax-profile.d.ts +84 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js +39 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js.map +1 -0
- package/src/lib/plugin-manager/plugin-user-erasure.d.ts +53 -0
- package/src/lib/plugin-manager/plugin-user-erasure.js +84 -0
- package/src/lib/plugin-manager/plugin-user-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-zones.d.ts +121 -0
- package/src/lib/plugin-manager/plugin-zones.js +74 -0
- package/src/lib/plugin-manager/plugin-zones.js.map +1 -0
- package/src/lib/plugin-manager/realm-plugins.d.ts +112 -0
- package/src/lib/plugin-manager/realm-plugins.js +196 -0
- package/src/lib/plugin-manager/realm-plugins.js.map +1 -0
- package/src/lib/plugin-manager/realm-server.d.ts +54 -0
- package/src/lib/plugin-manager/realm-server.js +88 -0
- package/src/lib/plugin-manager/realm-server.js.map +1 -0
- package/src/lib/plugin-manager/record-zone-props.d.ts +126 -0
- package/src/lib/plugin-manager/record-zone-props.js +31 -0
- package/src/lib/plugin-manager/record-zone-props.js.map +1 -0
- package/src/lib/plugin-manager/site-page-hooks.d.ts +102 -0
- package/src/lib/plugin-manager/site-page-hooks.js +114 -0
- package/src/lib/plugin-manager/site-page-hooks.js.map +1 -0
- package/src/lib/plugin-manager/site-runtime.d.ts +57 -0
- package/src/lib/plugin-manager/site-runtime.js +25 -0
- package/src/lib/plugin-manager/site-runtime.js.map +1 -0
- package/src/lib/plugin-manager/usage-alert-contributors.d.ts +115 -0
- package/src/lib/plugin-manager/usage-alert-contributors.js +106 -0
- package/src/lib/plugin-manager/usage-alert-contributors.js.map +1 -0
- package/src/lib/types/ast.d.ts +199 -0
- package/src/lib/types/ast.js +20 -0
- package/src/lib/types/ast.js.map +1 -0
- package/src/lib/types/index.d.ts +20 -0
- package/src/lib/types/index.js +21 -0
- package/src/lib/types/index.js.map +1 -0
- package/src/lib/types/nodes.d.ts +608 -0
- package/src/lib/types/nodes.js +28 -0
- package/src/lib/types/nodes.js.map +1 -0
- package/src/lib/types/routing.d.ts +17 -0
- package/src/lib/types/routing.js +18 -0
- package/src/lib/types/routing.js.map +1 -0
- package/src/lib/types/screen.d.ts +23 -0
- package/src/lib/types/screen.js +18 -0
- package/src/lib/types/screen.js.map +1 -0
- package/src/lib/utils.d.ts +25 -0
- package/src/lib/utils.js +42 -0
- package/src/lib/utils.js.map +1 -0
- package/src/server.d.ts +37 -0
- package/src/server.js +55 -0
- package/src/server.js.map +1 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /**
|
|
17
|
+
* ASSET QUARANTINE (AGL-1512) — the proportionate lever beside the AGL-1501
|
|
18
|
+
* panic button.
|
|
19
|
+
*
|
|
20
|
+
* When the infection is ONE uploaded file (malware in a PDF, an abusive
|
|
21
|
+
* image, a DMCA-noticed asset), locking the whole host punishes a customer
|
|
22
|
+
* for one object. Quarantine refuses that object at the CDN while the site
|
|
23
|
+
* keeps running — and, unlike deletion, it is REVERSIBLE, which is what a
|
|
24
|
+
* false-positive scan or a successful DMCA counter-notice needs.
|
|
25
|
+
*
|
|
26
|
+
* ## Three design calls, argued
|
|
27
|
+
*
|
|
28
|
+
* **Keyed by content digest, not by media document.** By hash covers every
|
|
29
|
+
* document that shares the bytes — a template duplicated into forty
|
|
30
|
+
* workspaces is forty documents and one hash — and it survives a re-upload
|
|
31
|
+
* of the same file, which a per-document key does not. The limits of that
|
|
32
|
+
* promise are stated honestly at {@link mediaQuarantineHashKey}; it is not
|
|
33
|
+
* a content-identity guarantee, and pretending otherwise would be worse
|
|
34
|
+
* than the gap.
|
|
35
|
+
*
|
|
36
|
+
* AGL-1614 added the full-width `contentSha256` beside the legacy truncated
|
|
37
|
+
* `contentHash` and made the lookup check BOTH (see
|
|
38
|
+
* {@link mediaQuarantineKeys}). The preference is the strong digest; the
|
|
39
|
+
* non-negotiable is that the legacy key is never dropped, because entries
|
|
40
|
+
* written under it are live takedowns and a takedown that lifts itself is
|
|
41
|
+
* the one failure this lever must never have.
|
|
42
|
+
*
|
|
43
|
+
* **A per-asset key exists as a FALLBACK, not an alternative.** Some
|
|
44
|
+
* documents carry no `contentHash` at all: the signed-upload route only
|
|
45
|
+
* learns one from GCS's `md5Hash` (absent on composite objects), and every
|
|
46
|
+
* asset uploaded before that route computed one has none. A takedown lever
|
|
47
|
+
* that silently cannot touch the largest files is not a takedown lever, so
|
|
48
|
+
* {@link mediaQuarantineKey} falls back to `asset--{scope}--{mediaId}` — and
|
|
49
|
+
* only there, so the hash key stays the norm.
|
|
50
|
+
*
|
|
51
|
+
* **ONE deny-list document, not one document per quarantine.** The consult
|
|
52
|
+
* sits on the hottest unauthenticated path in the product: every image, in
|
|
53
|
+
* every grid, on every published page. A document per quarantined hash would
|
|
54
|
+
* be one Firestore read per DISTINCT ASSET per TTL — a fifty-tile DAM grid
|
|
55
|
+
* would go from one lock read to fifty-one. The whole deny list is instead
|
|
56
|
+
* one document (`mediaQuarantines/index`), so the entire feature costs ONE
|
|
57
|
+
* read per process per TTL no matter how many assets are requested or how
|
|
58
|
+
* many are quarantined. This is the tombstone/deny-list pattern the issue
|
|
59
|
+
* names, and it is the same read-cost discipline as AGL-1302.
|
|
60
|
+
*
|
|
61
|
+
* ## What quarantine deliberately does NOT do
|
|
62
|
+
*
|
|
63
|
+
* It does not delete the object, does not touch the media document, and
|
|
64
|
+
* **does not change `sizeBytes` or the `counters/media` accounting**. The
|
|
65
|
+
* storage counter is a billing input: the file still exists and still
|
|
66
|
+
* belongs to the org. It is SUPPRESSED, not erased, and a lever that
|
|
67
|
+
* silently re-bills a customer while refusing their file would be a
|
|
68
|
+
* different bug than the one it fixed.
|
|
69
|
+
*
|
|
70
|
+
* The state lives in `mediaQuarantines/index`, which has **no Firestore
|
|
71
|
+
* rules block on purpose**. The collection is Admin-SDK-only — written by
|
|
72
|
+
* `/api/admin/media-quarantine`, read by `serveMediaCdn` — so the default
|
|
73
|
+
* deny is already the exactly-correct posture, and it needs no rules
|
|
74
|
+
* deploy to be safe. A staff READ block becomes necessary only if a
|
|
75
|
+
* client-side surface ever reads it directly; the staff surfaces here read
|
|
76
|
+
* through the API route instead.
|
|
77
|
+
*/ import { isLockdownActive } from "./lockdown.js";
|
|
78
|
+
import { operatorContactLine } from "./operator-identity.js";
|
|
79
|
+
const MEDIA_QUARANTINE_REASON_KEYS = {
|
|
80
|
+
malware: true,
|
|
81
|
+
abuse: true,
|
|
82
|
+
dmca: true,
|
|
83
|
+
legal: true,
|
|
84
|
+
manual: true
|
|
85
|
+
};
|
|
86
|
+
export const MEDIA_QUARANTINE_REASONS = Object.keys(MEDIA_QUARANTINE_REASON_KEYS);
|
|
87
|
+
export function isMediaQuarantineReason(value) {
|
|
88
|
+
return typeof value === 'string' && value in MEDIA_QUARANTINE_REASON_KEYS;
|
|
89
|
+
}
|
|
90
|
+
/** Staff-surface labels; the key stays the wire/API identity. */ export const MEDIA_QUARANTINE_REASON_LABELS = {
|
|
91
|
+
malware: 'Malware or malicious content',
|
|
92
|
+
abuse: 'Abuse report',
|
|
93
|
+
dmca: 'DMCA takedown notice',
|
|
94
|
+
legal: 'Other legal demand',
|
|
95
|
+
manual: 'Staff decision (other)'
|
|
96
|
+
};
|
|
97
|
+
export const MEDIA_QUARANTINES_COLLECTION = 'mediaQuarantines';
|
|
98
|
+
/**
|
|
99
|
+
* The single deny-list document. One document, one read, whole feature —
|
|
100
|
+
* see the read-cost argument in the module header.
|
|
101
|
+
*/ export const MEDIA_QUARANTINE_INDEX_DOC_ID = 'index';
|
|
102
|
+
/** The map field inside that document: quarantine key → entry. */ export const MEDIA_QUARANTINE_ENTRIES_FIELD = 'entries';
|
|
103
|
+
/**
|
|
104
|
+
* How many entries one index document may hold.
|
|
105
|
+
*
|
|
106
|
+
* A Firestore document caps at 1 MiB and an entry is a few hundred bytes,
|
|
107
|
+
* so the real ceiling is thousands — this cap is far below it on purpose.
|
|
108
|
+
* The write path REFUSES past it rather than growing a document that would
|
|
109
|
+
* one day fail to write, because the failure mode of an over-full deny list
|
|
110
|
+
* is "a takedown silently did not land", which is the exact thing this
|
|
111
|
+
* mechanism exists to prevent. Sharding is a filed follow-up, not a
|
|
112
|
+
* surprise.
|
|
113
|
+
*/ export const MEDIA_QUARANTINE_MAX_ENTRIES = 2000;
|
|
114
|
+
/** Staff-typed notice text is owner-facing; keep it bounded and plain. */ export const MEDIA_QUARANTINE_MESSAGE_MAX = 500;
|
|
115
|
+
/** Internal staff rationale — never shown to the customer. */ export const MEDIA_QUARANTINE_NOTE_MAX = 1000;
|
|
116
|
+
/**
|
|
117
|
+
* A quarantine key derived from a content digest — either the strong
|
|
118
|
+
* `contentSha256` or the legacy truncated `contentHash`. One key space on
|
|
119
|
+
* purpose: an entry set from either field is looked up by
|
|
120
|
+
* {@link mediaQuarantineKeys}, so widening the digest never stranded a
|
|
121
|
+
* takedown that was already in force.
|
|
122
|
+
*
|
|
123
|
+
* **What the LEGACY field promises, and what it does not** (AGL-1614).
|
|
124
|
+
* `contentHash` is a 16-hex character (64-bit) TRUNCATED digest, and it is
|
|
125
|
+
* produced by two different algorithms depending on which route ingested the
|
|
126
|
+
* bytes: sha256 for the server-side upload and replace routes, GCS's md5 for
|
|
127
|
+
* the signed-upload route. Two consequences, both stated rather than hidden:
|
|
128
|
+
*
|
|
129
|
+
* 1. The same bytes uploaded through DIFFERENT routes do not share a
|
|
130
|
+
* `contentHash`, so "re-uploading the same file stays quarantined"
|
|
131
|
+
* holds within an ingestion path, not across all of them. This is NOT
|
|
132
|
+
* fixed by `contentSha256` and cannot be: the signed-upload route never
|
|
133
|
+
* holds the bytes, and GCS computes only md5 and crc32c.
|
|
134
|
+
* 2. 64 truncated bits is collision-resistant by accident, not by design.
|
|
135
|
+
* An unrelated asset colliding by chance is negligible at this scale;
|
|
136
|
+
* an asset colliding by CONSTRUCTION is reachable — cheaply so on the
|
|
137
|
+
* md5-derived half, where a chosen-prefix collision produces two files
|
|
138
|
+
* with the same full digest and therefore the same truncation. The
|
|
139
|
+
* consequence is bounded: a collision can only ever cause MORE refusal,
|
|
140
|
+
* never less, so it is an availability bug and never a disclosure one.
|
|
141
|
+
*
|
|
142
|
+
* `contentSha256` has neither the truncation nor the md5 property, which is
|
|
143
|
+
* why {@link mediaQuarantineKeys} prefers it. The key is normalized to lower
|
|
144
|
+
* case so a hand-entered hash from a staff form cannot miss its own record.
|
|
145
|
+
*/ export function mediaQuarantineHashKey(contentHash) {
|
|
146
|
+
return `hash--${String(contentHash).trim().toLowerCase()}`;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The per-asset fallback key, for documents that carry no `contentHash`.
|
|
150
|
+
* Scope-qualified because a media id is only unique within its own
|
|
151
|
+
* `orgs/{id}` or `hosts/{id}` library.
|
|
152
|
+
*/ export function mediaQuarantineAssetKey(scopeSegment, mediaId) {
|
|
153
|
+
return `asset--${scopeSegment}--${mediaId}`;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* THE key for one asset: its content hash when it has one, its identity
|
|
157
|
+
* when it does not. `null` is impossible in practice (a media id always
|
|
158
|
+
* exists) and returned anyway rather than emitting a key like
|
|
159
|
+
* `asset----`, which would be a deny-list entry matching nothing and
|
|
160
|
+
* looking like it matched everything.
|
|
161
|
+
*/ export function mediaQuarantineKey(asset) {
|
|
162
|
+
var _asset_contentSha256, _asset_contentHash, _asset_scopeSegment, _asset_mediaId;
|
|
163
|
+
const strong = String((_asset_contentSha256 = asset.contentSha256) != null ? _asset_contentSha256 : '').trim();
|
|
164
|
+
if (strong) return mediaQuarantineHashKey(strong);
|
|
165
|
+
const hash = String((_asset_contentHash = asset.contentHash) != null ? _asset_contentHash : '').trim();
|
|
166
|
+
if (hash) return mediaQuarantineHashKey(hash);
|
|
167
|
+
const scopeSegment = String((_asset_scopeSegment = asset.scopeSegment) != null ? _asset_scopeSegment : '').trim();
|
|
168
|
+
const mediaId = String((_asset_mediaId = asset.mediaId) != null ? _asset_mediaId : '').trim();
|
|
169
|
+
if (!scopeSegment || !mediaId) return null;
|
|
170
|
+
return mediaQuarantineAssetKey(scopeSegment, mediaId);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* EVERY key that may refuse this asset, in preference order and without
|
|
174
|
+
* duplicates. Any one of them matching an active entry is a refusal.
|
|
175
|
+
*
|
|
176
|
+
* The list, rather than {@link mediaQuarantineKey}'s single answer, is what
|
|
177
|
+
* makes AGL-1614's stronger digest safe to introduce. A media document may
|
|
178
|
+
* now carry BOTH a `contentSha256` and the legacy truncated `contentHash`,
|
|
179
|
+
* and quarantine entries in force were keyed on whichever field existed when
|
|
180
|
+
* staff pressed the button. Checking only the preferred key would mean a
|
|
181
|
+
* live takedown, keyed on the legacy hash, silently stops biting the moment
|
|
182
|
+
* an asset gains a strong one — a takedown lifting itself is the single
|
|
183
|
+
* worst failure this lever can have, so the legacy key is never dropped.
|
|
184
|
+
*
|
|
185
|
+
* The per-asset key stays in the list for the same reason it was added in
|
|
186
|
+
* AGL-1512: an entry set while a document had no hash at all must keep
|
|
187
|
+
* biting after a replace gives it one. Checking all three costs nothing —
|
|
188
|
+
* the deny list is one already-in-memory map.
|
|
189
|
+
*/ export function mediaQuarantineKeys(asset) {
|
|
190
|
+
var _asset_contentSha256, _asset_contentHash;
|
|
191
|
+
const keys = [];
|
|
192
|
+
const push = (key)=>{
|
|
193
|
+
if (key && !keys.includes(key)) keys.push(key);
|
|
194
|
+
};
|
|
195
|
+
const strong = String((_asset_contentSha256 = asset.contentSha256) != null ? _asset_contentSha256 : '').trim();
|
|
196
|
+
if (strong) push(mediaQuarantineHashKey(strong));
|
|
197
|
+
const hash = String((_asset_contentHash = asset.contentHash) != null ? _asset_contentHash : '').trim();
|
|
198
|
+
if (hash) push(mediaQuarantineHashKey(hash));
|
|
199
|
+
push(mediaQuarantineKey({
|
|
200
|
+
scopeSegment: asset.scopeSegment,
|
|
201
|
+
mediaId: asset.mediaId
|
|
202
|
+
}));
|
|
203
|
+
return keys;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Entry → state. A malformed entry (no recognised reason) is refused
|
|
207
|
+
* WHOLE rather than defaulted, matching `normalizeLockdownDoc`: the
|
|
208
|
+
* takedown path does not guess, and a record nobody can explain is not a
|
|
209
|
+
* record anyone should enforce.
|
|
210
|
+
*
|
|
211
|
+
* `note` is deliberately not carried into the state — the staff rationale
|
|
212
|
+
* must not be able to reach a surface that renders `message`.
|
|
213
|
+
*/ export function normalizeMediaQuarantine(entry, key) {
|
|
214
|
+
if (!entry) return null;
|
|
215
|
+
if (!isMediaQuarantineReason(entry.reason)) return null;
|
|
216
|
+
return {
|
|
217
|
+
key,
|
|
218
|
+
reason: entry.reason,
|
|
219
|
+
message: typeof entry.message === 'string' && entry.message ? entry.message.slice(0, MEDIA_QUARANTINE_MESSAGE_MAX) : undefined,
|
|
220
|
+
atMs: typeof entry.atMs === 'number' ? entry.atMs : undefined,
|
|
221
|
+
untilMs: typeof entry.untilMs === 'number' && Number.isFinite(entry.untilMs) ? entry.untilMs : undefined,
|
|
222
|
+
actorUid: typeof entry.actorUid === 'string' ? entry.actorUid : undefined
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Active now? Expiry passing deactivates with no write — the same
|
|
227
|
+
* semantics as `isLockdownActive`, which this calls rather than restates
|
|
228
|
+
* so the two levers can never drift on what "expired" means.
|
|
229
|
+
*/ export function isMediaQuarantineActive(state, nowMs) {
|
|
230
|
+
return state != null && isLockdownActive(state, nowMs);
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The address on the owner-facing quarantine notice, from operator
|
|
234
|
+
* configuration (AGL-2016).
|
|
235
|
+
*
|
|
236
|
+
* Was a `'support@aglyn.com'` literal. The notice is shown to the org that
|
|
237
|
+
* owns the asset, so on a self-host install it told the operator's OWN
|
|
238
|
+
* customer to write to Aglyn about a file Aglyn never stored — and only the
|
|
239
|
+
* operator's staff can lift the quarantine they applied.
|
|
240
|
+
*/ export function mediaQuarantineSupportEmail() {
|
|
241
|
+
return operatorContactLine('support').address;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The OWNER-facing notice: "this file was disabled: {reason} — contact
|
|
245
|
+
* support". Shown in the console to the org that owns the asset, never on
|
|
246
|
+
* the CDN response (which stays a neutral 410 — see the refusal argument
|
|
247
|
+
* in `serve-media-cdn.ts`).
|
|
248
|
+
*
|
|
249
|
+
* A staff-typed `message` replaces the body; the title and the contact
|
|
250
|
+
* line stay per-reason so an operator cannot accidentally strip the "how
|
|
251
|
+
* do I get this back" affordance. Every body says the file still EXISTS —
|
|
252
|
+
* a customer whose asset is refused must not conclude their data was
|
|
253
|
+
* deleted, because for every reason here it was not.
|
|
254
|
+
*/ export function mediaQuarantineNotice(state) {
|
|
255
|
+
var _mediaQuarantineSupportEmail;
|
|
256
|
+
const custom = typeof state.message === 'string' && state.message.trim() ? state.message.trim() : undefined;
|
|
257
|
+
const contact = (_mediaQuarantineSupportEmail = mediaQuarantineSupportEmail()) != null ? _mediaQuarantineSupportEmail : undefined;
|
|
258
|
+
switch(state.reason){
|
|
259
|
+
case 'malware':
|
|
260
|
+
return {
|
|
261
|
+
title: 'This file was disabled',
|
|
262
|
+
body: custom != null ? custom : 'This file was disabled after it was flagged as malicious. It ' + 'has not been deleted and still counts toward your storage. ' + 'If you believe this is a mistake, contact support.',
|
|
263
|
+
contact
|
|
264
|
+
};
|
|
265
|
+
case 'abuse':
|
|
266
|
+
return {
|
|
267
|
+
title: 'This file was disabled',
|
|
268
|
+
body: custom != null ? custom : 'This file was disabled following an abuse report. It has not ' + 'been deleted and still counts toward your storage. Contact ' + 'support to discuss it.',
|
|
269
|
+
contact
|
|
270
|
+
};
|
|
271
|
+
case 'dmca':
|
|
272
|
+
return {
|
|
273
|
+
title: 'This file was disabled',
|
|
274
|
+
body: custom != null ? custom : 'This file was disabled in response to a copyright takedown ' + 'notice. It has not been deleted and still counts toward your ' + 'storage. Contact support if you want to file a counter-notice.',
|
|
275
|
+
contact
|
|
276
|
+
};
|
|
277
|
+
case 'legal':
|
|
278
|
+
return {
|
|
279
|
+
title: 'This file was disabled',
|
|
280
|
+
body: custom != null ? custom : 'This file was disabled in response to a legal demand. It has ' + 'not been deleted and still counts toward your storage. ' + 'Contact support for details.',
|
|
281
|
+
contact
|
|
282
|
+
};
|
|
283
|
+
case 'manual':
|
|
284
|
+
default:
|
|
285
|
+
return {
|
|
286
|
+
title: 'This file was disabled',
|
|
287
|
+
body: custom != null ? custom : // "by Aglyn staff" named the wrong company on every self-host
|
|
288
|
+
// install (AGL-2016). "the operator of this service" is true on
|
|
289
|
+
// ours too — it is who disabled it, from the owner's point of view.
|
|
290
|
+
'This file was disabled by the operator of this service. It has ' + 'not been deleted and still counts toward your storage. Contact ' + 'support to find out why.',
|
|
291
|
+
contact
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* The status an INGESTION chokepoint refuses a quarantined upload with
|
|
297
|
+
* (AGL-1613).
|
|
298
|
+
*
|
|
299
|
+
* Deliberately NOT the CDN's 410 and NOT the lockdown's 423. The CDN answers
|
|
300
|
+
* an anonymous fetcher, so its refusal is neutral by design and says nothing
|
|
301
|
+
* about why. This caller is authenticated and is the OWNER of the bytes, so
|
|
302
|
+
* the AGL-1506 discipline applies in the other direction: they are told. And
|
|
303
|
+
* it is not 423, because 423 means "your workspace is locked" — a different
|
|
304
|
+
* lever with a different remedy, and a client that cannot tell them apart
|
|
305
|
+
* would send a customer to the wrong support conversation.
|
|
306
|
+
*
|
|
307
|
+
* 403 rather than 409: the request is understood, it is refused, and
|
|
308
|
+
* repeating it verbatim will not help. Nothing about the workspace state
|
|
309
|
+
* needs to change first.
|
|
310
|
+
*/ export const MEDIA_QUARANTINE_UPLOAD_STATUS = 403;
|
|
311
|
+
export function mediaQuarantineRefusalBody(state) {
|
|
312
|
+
var _notice_contact;
|
|
313
|
+
const notice = mediaQuarantineNotice(state);
|
|
314
|
+
return {
|
|
315
|
+
error: notice.body,
|
|
316
|
+
quarantined: true,
|
|
317
|
+
title: notice.title,
|
|
318
|
+
reason: state.reason,
|
|
319
|
+
contact: (_notice_contact = notice.contact) != null ? _notice_contact : null
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
//# sourceMappingURL=media-quarantine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/media-quarantine.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * ASSET QUARANTINE (AGL-1512) — the proportionate lever beside the AGL-1501\n * panic button.\n *\n * When the infection is ONE uploaded file (malware in a PDF, an abusive\n * image, a DMCA-noticed asset), locking the whole host punishes a customer\n * for one object. Quarantine refuses that object at the CDN while the site\n * keeps running — and, unlike deletion, it is REVERSIBLE, which is what a\n * false-positive scan or a successful DMCA counter-notice needs.\n *\n * ## Three design calls, argued\n *\n * **Keyed by content digest, not by media document.** By hash covers every\n * document that shares the bytes — a template duplicated into forty\n * workspaces is forty documents and one hash — and it survives a re-upload\n * of the same file, which a per-document key does not. The limits of that\n * promise are stated honestly at {@link mediaQuarantineHashKey}; it is not\n * a content-identity guarantee, and pretending otherwise would be worse\n * than the gap.\n *\n * AGL-1614 added the full-width `contentSha256` beside the legacy truncated\n * `contentHash` and made the lookup check BOTH (see\n * {@link mediaQuarantineKeys}). The preference is the strong digest; the\n * non-negotiable is that the legacy key is never dropped, because entries\n * written under it are live takedowns and a takedown that lifts itself is\n * the one failure this lever must never have.\n *\n * **A per-asset key exists as a FALLBACK, not an alternative.** Some\n * documents carry no `contentHash` at all: the signed-upload route only\n * learns one from GCS's `md5Hash` (absent on composite objects), and every\n * asset uploaded before that route computed one has none. A takedown lever\n * that silently cannot touch the largest files is not a takedown lever, so\n * {@link mediaQuarantineKey} falls back to `asset--{scope}--{mediaId}` — and\n * only there, so the hash key stays the norm.\n *\n * **ONE deny-list document, not one document per quarantine.** The consult\n * sits on the hottest unauthenticated path in the product: every image, in\n * every grid, on every published page. A document per quarantined hash would\n * be one Firestore read per DISTINCT ASSET per TTL — a fifty-tile DAM grid\n * would go from one lock read to fifty-one. The whole deny list is instead\n * one document (`mediaQuarantines/index`), so the entire feature costs ONE\n * read per process per TTL no matter how many assets are requested or how\n * many are quarantined. This is the tombstone/deny-list pattern the issue\n * names, and it is the same read-cost discipline as AGL-1302.\n *\n * ## What quarantine deliberately does NOT do\n *\n * It does not delete the object, does not touch the media document, and\n * **does not change `sizeBytes` or the `counters/media` accounting**. The\n * storage counter is a billing input: the file still exists and still\n * belongs to the org. It is SUPPRESSED, not erased, and a lever that\n * silently re-bills a customer while refusing their file would be a\n * different bug than the one it fixed.\n *\n * The state lives in `mediaQuarantines/index`, which has **no Firestore\n * rules block on purpose**. The collection is Admin-SDK-only — written by\n * `/api/admin/media-quarantine`, read by `serveMediaCdn` — so the default\n * deny is already the exactly-correct posture, and it needs no rules\n * deploy to be safe. A staff READ block becomes necessary only if a\n * client-side surface ever reads it directly; the staff surfaces here read\n * through the API route instead.\n */\n\nimport { isLockdownActive } from './lockdown'\nimport { operatorContactLine } from './operator-identity'\n\n/**\n * Why a file was disabled. Deliberately NOT `LockdownReasonCode`: the\n * lockdown vocabulary (security / billing / maintenance / manual) cannot\n * say \"DMCA\", and a takedown recorded as \"security\" is a record that\n * cannot answer the only question anyone asks about it a year later.\n *\n * The field FAMILY around it is AGL-1501's, unchanged — `reason`,\n * `message`, `atMs`, `untilMs`, `actorUid` — so an operator reading an\n * audit row is reading the same shape either way.\n */\nexport type MediaQuarantineReason =\n | 'malware'\n | 'abuse'\n | 'dmca'\n | 'legal'\n | 'manual'\n\nconst MEDIA_QUARANTINE_REASON_KEYS: Record<MediaQuarantineReason, true> = {\n malware: true,\n abuse: true,\n dmca: true,\n legal: true,\n manual: true,\n}\n\nexport const MEDIA_QUARANTINE_REASONS = Object.keys(\n MEDIA_QUARANTINE_REASON_KEYS,\n) as MediaQuarantineReason[]\n\nexport function isMediaQuarantineReason(\n value: unknown,\n): value is MediaQuarantineReason {\n return typeof value === 'string' && value in MEDIA_QUARANTINE_REASON_KEYS\n}\n\n/** Staff-surface labels; the key stays the wire/API identity. */\nexport const MEDIA_QUARANTINE_REASON_LABELS: Record<\n MediaQuarantineReason,\n string\n> = {\n malware: 'Malware or malicious content',\n abuse: 'Abuse report',\n dmca: 'DMCA takedown notice',\n legal: 'Other legal demand',\n manual: 'Staff decision (other)',\n}\n\nexport const MEDIA_QUARANTINES_COLLECTION = 'mediaQuarantines'\n\n/**\n * The single deny-list document. One document, one read, whole feature —\n * see the read-cost argument in the module header.\n */\nexport const MEDIA_QUARANTINE_INDEX_DOC_ID = 'index'\n\n/** The map field inside that document: quarantine key → entry. */\nexport const MEDIA_QUARANTINE_ENTRIES_FIELD = 'entries'\n\n/**\n * How many entries one index document may hold.\n *\n * A Firestore document caps at 1 MiB and an entry is a few hundred bytes,\n * so the real ceiling is thousands — this cap is far below it on purpose.\n * The write path REFUSES past it rather than growing a document that would\n * one day fail to write, because the failure mode of an over-full deny list\n * is \"a takedown silently did not land\", which is the exact thing this\n * mechanism exists to prevent. Sharding is a filed follow-up, not a\n * surprise.\n */\nexport const MEDIA_QUARANTINE_MAX_ENTRIES = 2000\n\n/** Staff-typed notice text is owner-facing; keep it bounded and plain. */\nexport const MEDIA_QUARANTINE_MESSAGE_MAX = 500\n\n/** Internal staff rationale — never shown to the customer. */\nexport const MEDIA_QUARANTINE_NOTE_MAX = 1000\n\n/**\n * A quarantine key derived from a content digest — either the strong\n * `contentSha256` or the legacy truncated `contentHash`. One key space on\n * purpose: an entry set from either field is looked up by\n * {@link mediaQuarantineKeys}, so widening the digest never stranded a\n * takedown that was already in force.\n *\n * **What the LEGACY field promises, and what it does not** (AGL-1614).\n * `contentHash` is a 16-hex character (64-bit) TRUNCATED digest, and it is\n * produced by two different algorithms depending on which route ingested the\n * bytes: sha256 for the server-side upload and replace routes, GCS's md5 for\n * the signed-upload route. Two consequences, both stated rather than hidden:\n *\n * 1. The same bytes uploaded through DIFFERENT routes do not share a\n * `contentHash`, so \"re-uploading the same file stays quarantined\"\n * holds within an ingestion path, not across all of them. This is NOT\n * fixed by `contentSha256` and cannot be: the signed-upload route never\n * holds the bytes, and GCS computes only md5 and crc32c.\n * 2. 64 truncated bits is collision-resistant by accident, not by design.\n * An unrelated asset colliding by chance is negligible at this scale;\n * an asset colliding by CONSTRUCTION is reachable — cheaply so on the\n * md5-derived half, where a chosen-prefix collision produces two files\n * with the same full digest and therefore the same truncation. The\n * consequence is bounded: a collision can only ever cause MORE refusal,\n * never less, so it is an availability bug and never a disclosure one.\n *\n * `contentSha256` has neither the truncation nor the md5 property, which is\n * why {@link mediaQuarantineKeys} prefers it. The key is normalized to lower\n * case so a hand-entered hash from a staff form cannot miss its own record.\n */\nexport function mediaQuarantineHashKey(contentHash: string): string {\n return `hash--${String(contentHash).trim().toLowerCase()}`\n}\n\n/**\n * The per-asset fallback key, for documents that carry no `contentHash`.\n * Scope-qualified because a media id is only unique within its own\n * `orgs/{id}` or `hosts/{id}` library.\n */\nexport function mediaQuarantineAssetKey(\n scopeSegment: string,\n mediaId: string,\n): string {\n return `asset--${scopeSegment}--${mediaId}`\n}\n\n/**\n * THE key for one asset: its content hash when it has one, its identity\n * when it does not. `null` is impossible in practice (a media id always\n * exists) and returned anyway rather than emitting a key like\n * `asset----`, which would be a deny-list entry matching nothing and\n * looking like it matched everything.\n */\nexport function mediaQuarantineKey(asset: {\n contentSha256?: string | null\n contentHash?: string | null\n scopeSegment?: string | null\n mediaId?: string | null\n}): string | null {\n const strong = String(asset.contentSha256 ?? '').trim()\n if (strong) return mediaQuarantineHashKey(strong)\n const hash = String(asset.contentHash ?? '').trim()\n if (hash) return mediaQuarantineHashKey(hash)\n const scopeSegment = String(asset.scopeSegment ?? '').trim()\n const mediaId = String(asset.mediaId ?? '').trim()\n if (!scopeSegment || !mediaId) return null\n return mediaQuarantineAssetKey(scopeSegment, mediaId)\n}\n\n/**\n * EVERY key that may refuse this asset, in preference order and without\n * duplicates. Any one of them matching an active entry is a refusal.\n *\n * The list, rather than {@link mediaQuarantineKey}'s single answer, is what\n * makes AGL-1614's stronger digest safe to introduce. A media document may\n * now carry BOTH a `contentSha256` and the legacy truncated `contentHash`,\n * and quarantine entries in force were keyed on whichever field existed when\n * staff pressed the button. Checking only the preferred key would mean a\n * live takedown, keyed on the legacy hash, silently stops biting the moment\n * an asset gains a strong one — a takedown lifting itself is the single\n * worst failure this lever can have, so the legacy key is never dropped.\n *\n * The per-asset key stays in the list for the same reason it was added in\n * AGL-1512: an entry set while a document had no hash at all must keep\n * biting after a replace gives it one. Checking all three costs nothing —\n * the deny list is one already-in-memory map.\n */\nexport function mediaQuarantineKeys(asset: {\n contentSha256?: string | null\n contentHash?: string | null\n scopeSegment?: string | null\n mediaId?: string | null\n}): string[] {\n const keys: string[] = []\n const push = (key: string | null) => {\n if (key && !keys.includes(key)) keys.push(key)\n }\n const strong = String(asset.contentSha256 ?? '').trim()\n if (strong) push(mediaQuarantineHashKey(strong))\n const hash = String(asset.contentHash ?? '').trim()\n if (hash) push(mediaQuarantineHashKey(hash))\n push(\n mediaQuarantineKey({\n scopeSegment: asset.scopeSegment,\n mediaId: asset.mediaId,\n }),\n )\n return keys\n}\n\n/**\n * One entry as stored in the index document's `entries` map.\n *\n * Every optional field is written as an explicit `null` rather than left\n * off (the repo's standing Firestore rule — a converter or a partial write\n * must never carry `undefined`), so a reader can distinguish \"no expiry\"\n * from \"this record predates expiry\".\n */\nexport interface MediaQuarantineEntry {\n reason: MediaQuarantineReason\n /** Owner-facing notice text; `null` uses the per-reason default copy. */\n message?: string | null\n /** Staff-only rationale. NEVER rendered to the customer. */\n note?: string | null\n atMs?: number | null\n /** Optional expiry — passing it restores delivery with no write. */\n untilMs?: number | null\n actorUid?: string | null\n /**\n * Where the quarantine was set FROM, for the audit trail only. A hash\n * key can cover documents in many orgs; this records the one an operator\n * was looking at, and is never used to decide whether to refuse.\n */\n originScopeSegment?: string | null\n originMediaId?: string | null\n}\n\n/** The normalized, in-memory shape every consumer reads. */\nexport interface MediaQuarantineState {\n key: string\n reason: MediaQuarantineReason\n message?: string\n atMs?: number\n untilMs?: number\n actorUid?: string\n}\n\n/**\n * Entry → state. A malformed entry (no recognised reason) is refused\n * WHOLE rather than defaulted, matching `normalizeLockdownDoc`: the\n * takedown path does not guess, and a record nobody can explain is not a\n * record anyone should enforce.\n *\n * `note` is deliberately not carried into the state — the staff rationale\n * must not be able to reach a surface that renders `message`.\n */\nexport function normalizeMediaQuarantine(\n entry: Partial<MediaQuarantineEntry> | null | undefined,\n key: string,\n): MediaQuarantineState | null {\n if (!entry) return null\n if (!isMediaQuarantineReason(entry.reason)) return null\n return {\n key,\n reason: entry.reason,\n message:\n typeof entry.message === 'string' && entry.message\n ? entry.message.slice(0, MEDIA_QUARANTINE_MESSAGE_MAX)\n : undefined,\n atMs: typeof entry.atMs === 'number' ? entry.atMs : undefined,\n untilMs:\n typeof entry.untilMs === 'number' && Number.isFinite(entry.untilMs)\n ? entry.untilMs\n : undefined,\n actorUid: typeof entry.actorUid === 'string' ? entry.actorUid : undefined,\n }\n}\n\n/**\n * Active now? Expiry passing deactivates with no write — the same\n * semantics as `isLockdownActive`, which this calls rather than restates\n * so the two levers can never drift on what \"expired\" means.\n */\nexport function isMediaQuarantineActive(\n state: MediaQuarantineState | null | undefined,\n nowMs: number,\n): boolean {\n return state != null && isLockdownActive(state, nowMs)\n}\n\nexport interface MediaQuarantineNotice {\n title: string\n body: string\n contact?: string\n}\n\n/**\n * The address on the owner-facing quarantine notice, from operator\n * configuration (AGL-2016).\n *\n * Was a `'support@aglyn.com'` literal. The notice is shown to the org that\n * owns the asset, so on a self-host install it told the operator's OWN\n * customer to write to Aglyn about a file Aglyn never stored — and only the\n * operator's staff can lift the quarantine they applied.\n */\nexport function mediaQuarantineSupportEmail(): string | null {\n return operatorContactLine('support').address\n}\n\n/**\n * The OWNER-facing notice: \"this file was disabled: {reason} — contact\n * support\". Shown in the console to the org that owns the asset, never on\n * the CDN response (which stays a neutral 410 — see the refusal argument\n * in `serve-media-cdn.ts`).\n *\n * A staff-typed `message` replaces the body; the title and the contact\n * line stay per-reason so an operator cannot accidentally strip the \"how\n * do I get this back\" affordance. Every body says the file still EXISTS —\n * a customer whose asset is refused must not conclude their data was\n * deleted, because for every reason here it was not.\n */\nexport function mediaQuarantineNotice(\n state: Pick<MediaQuarantineState, 'reason' | 'message'>,\n): MediaQuarantineNotice {\n const custom =\n typeof state.message === 'string' && state.message.trim()\n ? state.message.trim()\n : undefined\n const contact = mediaQuarantineSupportEmail() ?? undefined\n switch (state.reason) {\n case 'malware':\n return {\n title: 'This file was disabled',\n body:\n custom ??\n 'This file was disabled after it was flagged as malicious. It ' +\n 'has not been deleted and still counts toward your storage. ' +\n 'If you believe this is a mistake, contact support.',\n contact,\n }\n case 'abuse':\n return {\n title: 'This file was disabled',\n body:\n custom ??\n 'This file was disabled following an abuse report. It has not ' +\n 'been deleted and still counts toward your storage. Contact ' +\n 'support to discuss it.',\n contact,\n }\n case 'dmca':\n return {\n title: 'This file was disabled',\n body:\n custom ??\n 'This file was disabled in response to a copyright takedown ' +\n 'notice. It has not been deleted and still counts toward your ' +\n 'storage. Contact support if you want to file a counter-notice.',\n contact,\n }\n case 'legal':\n return {\n title: 'This file was disabled',\n body:\n custom ??\n 'This file was disabled in response to a legal demand. It has ' +\n 'not been deleted and still counts toward your storage. ' +\n 'Contact support for details.',\n contact,\n }\n case 'manual':\n default:\n return {\n title: 'This file was disabled',\n body:\n custom ??\n // \"by Aglyn staff\" named the wrong company on every self-host\n // install (AGL-2016). \"the operator of this service\" is true on\n // ours too — it is who disabled it, from the owner's point of view.\n 'This file was disabled by the operator of this service. It has ' +\n 'not been deleted and still counts toward your storage. Contact ' +\n 'support to find out why.',\n contact,\n }\n }\n}\n\n/**\n * The status an INGESTION chokepoint refuses a quarantined upload with\n * (AGL-1613).\n *\n * Deliberately NOT the CDN's 410 and NOT the lockdown's 423. The CDN answers\n * an anonymous fetcher, so its refusal is neutral by design and says nothing\n * about why. This caller is authenticated and is the OWNER of the bytes, so\n * the AGL-1506 discipline applies in the other direction: they are told. And\n * it is not 423, because 423 means \"your workspace is locked\" — a different\n * lever with a different remedy, and a client that cannot tell them apart\n * would send a customer to the wrong support conversation.\n *\n * 403 rather than 409: the request is understood, it is refused, and\n * repeating it verbatim will not help. Nothing about the workspace state\n * needs to change first.\n */\nexport const MEDIA_QUARANTINE_UPLOAD_STATUS = 403\n\n/**\n * The JSON an ingestion refusal answers with.\n *\n * `error` carries the notice BODY because that is the field every console\n * upload surface already renders into its snackbar — a refusal whose\n * explanation lands in a field nothing reads is a silent failure with extra\n * steps. The structured fields ride alongside for a surface that wants to\n * render the notice properly (AGL-1612).\n *\n * Built from {@link mediaQuarantineNotice}, which takes only `reason` and\n * `message`. That is the containment for the staff `note`: it is dropped by\n * `normalizeMediaQuarantine` before a state exists, and this function never\n * sees a raw entry to reach past it into.\n */\nexport interface MediaQuarantineRefusalBody {\n error: string\n quarantined: true\n title: string\n reason: MediaQuarantineReason\n contact: string | null\n}\n\nexport function mediaQuarantineRefusalBody(\n state: Pick<MediaQuarantineState, 'reason' | 'message'>,\n): MediaQuarantineRefusalBody {\n const notice = mediaQuarantineNotice(state)\n return {\n error: notice.body,\n quarantined: true,\n title: notice.title,\n reason: state.reason,\n contact: notice.contact ?? null,\n }\n}\n"],"names":["isLockdownActive","operatorContactLine","MEDIA_QUARANTINE_REASON_KEYS","malware","abuse","dmca","legal","manual","MEDIA_QUARANTINE_REASONS","Object","keys","isMediaQuarantineReason","value","MEDIA_QUARANTINE_REASON_LABELS","MEDIA_QUARANTINES_COLLECTION","MEDIA_QUARANTINE_INDEX_DOC_ID","MEDIA_QUARANTINE_ENTRIES_FIELD","MEDIA_QUARANTINE_MAX_ENTRIES","MEDIA_QUARANTINE_MESSAGE_MAX","MEDIA_QUARANTINE_NOTE_MAX","mediaQuarantineHashKey","contentHash","String","trim","toLowerCase","mediaQuarantineAssetKey","scopeSegment","mediaId","mediaQuarantineKey","asset","strong","contentSha256","hash","mediaQuarantineKeys","push","key","includes","normalizeMediaQuarantine","entry","reason","message","slice","undefined","atMs","untilMs","Number","isFinite","actorUid","isMediaQuarantineActive","state","nowMs","mediaQuarantineSupportEmail","address","mediaQuarantineNotice","custom","contact","title","body","MEDIA_QUARANTINE_UPLOAD_STATUS","mediaQuarantineRefusalBody","notice","error","quarantined"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DC,GAED,SAASA,gBAAgB,QAAQ,gBAAY;AAC7C,SAASC,mBAAmB,QAAQ,yBAAqB;AAmBzD,MAAMC,+BAAoE;IACxEC,SAAS;IACTC,OAAO;IACPC,MAAM;IACNC,OAAO;IACPC,QAAQ;AACV;AAEA,OAAO,MAAMC,2BAA2BC,OAAOC,IAAI,CACjDR,8BAC0B;AAE5B,OAAO,SAASS,wBACdC,KAAc;IAEd,OAAO,OAAOA,UAAU,YAAYA,SAASV;AAC/C;AAEA,+DAA+D,GAC/D,OAAO,MAAMW,iCAGT;IACFV,SAAS;IACTC,OAAO;IACPC,MAAM;IACNC,OAAO;IACPC,QAAQ;AACV,EAAC;AAED,OAAO,MAAMO,+BAA+B,mBAAkB;AAE9D;;;CAGC,GACD,OAAO,MAAMC,gCAAgC,QAAO;AAEpD,gEAAgE,GAChE,OAAO,MAAMC,iCAAiC,UAAS;AAEvD;;;;;;;;;;CAUC,GACD,OAAO,MAAMC,+BAA+B,KAAI;AAEhD,wEAAwE,GACxE,OAAO,MAAMC,+BAA+B,IAAG;AAE/C,4DAA4D,GAC5D,OAAO,MAAMC,4BAA4B,KAAI;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,SAASC,uBAAuBC,WAAmB;IACxD,OAAO,CAAC,MAAM,EAAEC,OAAOD,aAAaE,IAAI,GAAGC,WAAW,IAAI;AAC5D;AAEA;;;;CAIC,GACD,OAAO,SAASC,wBACdC,YAAoB,EACpBC,OAAe;IAEf,OAAO,CAAC,OAAO,EAAED,aAAa,EAAE,EAAEC,SAAS;AAC7C;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,mBAAmBC,KAKlC;QACuBA,sBAEFA,oBAEQA,qBACLA;IALvB,MAAMC,SAASR,QAAOO,uBAAAA,MAAME,aAAa,YAAnBF,uBAAuB,IAAIN,IAAI;IACrD,IAAIO,QAAQ,OAAOV,uBAAuBU;IAC1C,MAAME,OAAOV,QAAOO,qBAAAA,MAAMR,WAAW,YAAjBQ,qBAAqB,IAAIN,IAAI;IACjD,IAAIS,MAAM,OAAOZ,uBAAuBY;IACxC,MAAMN,eAAeJ,QAAOO,sBAAAA,MAAMH,YAAY,YAAlBG,sBAAsB,IAAIN,IAAI;IAC1D,MAAMI,UAAUL,QAAOO,iBAAAA,MAAMF,OAAO,YAAbE,iBAAiB,IAAIN,IAAI;IAChD,IAAI,CAACG,gBAAgB,CAACC,SAAS,OAAO;IACtC,OAAOF,wBAAwBC,cAAcC;AAC/C;AAEA;;;;;;;;;;;;;;;;;CAiBC,GACD,OAAO,SAASM,oBAAoBJ,KAKnC;QAKuBA,sBAEFA;IANpB,MAAMnB,OAAiB,EAAE;IACzB,MAAMwB,OAAO,CAACC;QACZ,IAAIA,OAAO,CAACzB,KAAK0B,QAAQ,CAACD,MAAMzB,KAAKwB,IAAI,CAACC;IAC5C;IACA,MAAML,SAASR,QAAOO,uBAAAA,MAAME,aAAa,YAAnBF,uBAAuB,IAAIN,IAAI;IACrD,IAAIO,QAAQI,KAAKd,uBAAuBU;IACxC,MAAME,OAAOV,QAAOO,qBAAAA,MAAMR,WAAW,YAAjBQ,qBAAqB,IAAIN,IAAI;IACjD,IAAIS,MAAME,KAAKd,uBAAuBY;IACtCE,KACEN,mBAAmB;QACjBF,cAAcG,MAAMH,YAAY;QAChCC,SAASE,MAAMF,OAAO;IACxB;IAEF,OAAOjB;AACT;AAuCA;;;;;;;;CAQC,GACD,OAAO,SAAS2B,yBACdC,KAAuD,EACvDH,GAAW;IAEX,IAAI,CAACG,OAAO,OAAO;IACnB,IAAI,CAAC3B,wBAAwB2B,MAAMC,MAAM,GAAG,OAAO;IACnD,OAAO;QACLJ;QACAI,QAAQD,MAAMC,MAAM;QACpBC,SACE,OAAOF,MAAME,OAAO,KAAK,YAAYF,MAAME,OAAO,GAC9CF,MAAME,OAAO,CAACC,KAAK,CAAC,GAAGvB,gCACvBwB;QACNC,MAAM,OAAOL,MAAMK,IAAI,KAAK,WAAWL,MAAMK,IAAI,GAAGD;QACpDE,SACE,OAAON,MAAMM,OAAO,KAAK,YAAYC,OAAOC,QAAQ,CAACR,MAAMM,OAAO,IAC9DN,MAAMM,OAAO,GACbF;QACNK,UAAU,OAAOT,MAAMS,QAAQ,KAAK,WAAWT,MAAMS,QAAQ,GAAGL;IAClE;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASM,wBACdC,KAA8C,EAC9CC,KAAa;IAEb,OAAOD,SAAS,QAAQjD,iBAAiBiD,OAAOC;AAClD;AAQA;;;;;;;;CAQC,GACD,OAAO,SAASC;IACd,OAAOlD,oBAAoB,WAAWmD,OAAO;AAC/C;AAEA;;;;;;;;;;;CAWC,GACD,OAAO,SAASC,sBACdJ,KAAuD;QAMvCE;IAJhB,MAAMG,SACJ,OAAOL,MAAMT,OAAO,KAAK,YAAYS,MAAMT,OAAO,CAACjB,IAAI,KACnD0B,MAAMT,OAAO,CAACjB,IAAI,KAClBmB;IACN,MAAMa,WAAUJ,+BAAAA,yCAAAA,+BAAiCT;IACjD,OAAQO,MAAMV,MAAM;QAClB,KAAK;YACH,OAAO;gBACLiB,OAAO;gBACPC,IAAI,EACFH,iBAAAA,SACA,kEACE,gEACA;gBACJC;YACF;QACF,KAAK;YACH,OAAO;gBACLC,OAAO;gBACPC,IAAI,EACFH,iBAAAA,SACA,kEACE,gEACA;gBACJC;YACF;QACF,KAAK;YACH,OAAO;gBACLC,OAAO;gBACPC,IAAI,EACFH,iBAAAA,SACA,gEACE,kEACA;gBACJC;YACF;QACF,KAAK;YACH,OAAO;gBACLC,OAAO;gBACPC,IAAI,EACFH,iBAAAA,SACA,kEACE,4DACA;gBACJC;YACF;QACF,KAAK;QACL;YACE,OAAO;gBACLC,OAAO;gBACPC,IAAI,EACFH,iBAAAA,SACA,8DAA8D;gBAC9D,gEAAgE;gBAChE,oEAAoE;gBACpE,oEACE,oEACA;gBACJC;YACF;IACJ;AACF;AAEA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMG,iCAAiC,IAAG;AAwBjD,OAAO,SAASC,2BACdV,KAAuD;QAQ5CW;IANX,MAAMA,SAASP,sBAAsBJ;IACrC,OAAO;QACLY,OAAOD,OAAOH,IAAI;QAClBK,aAAa;QACbN,OAAOI,OAAOJ,KAAK;QACnBjB,QAAQU,MAAMV,MAAM;QACpBgB,OAAO,GAAEK,kBAAAA,OAAOL,OAAO,YAAdK,kBAAkB;IAC7B;AACF"}
|