@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,193 @@
|
|
|
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
|
+
/** Firestore collection holding intake rows. Staff-read, Admin-SDK-written. */
|
|
18
|
+
export declare const ABUSE_REPORT_COLLECTION = "abuseReports";
|
|
19
|
+
/**
|
|
20
|
+
* The contact address printed on the form — the OPERATOR's, resolved from
|
|
21
|
+
* configuration (AGL-2016).
|
|
22
|
+
*
|
|
23
|
+
* This was `export const ABUSE_REPORT_CONTACT_EMAIL = 'support@aglyn.com'`,
|
|
24
|
+
* and the docblock justifying it called itself *"the single place to change"*.
|
|
25
|
+
* It was the single place to change for **Aglyn**; for every other deployment
|
|
26
|
+
* it was the single place a third party's DMCA notice got misaddressed to us.
|
|
27
|
+
* The form it renders on is public and unauthenticated and ships with every
|
|
28
|
+
* install, so the literal made a self-hoster publish an intake pointing at a
|
|
29
|
+
* desk that cannot see, let alone remove, the content being reported.
|
|
30
|
+
*
|
|
31
|
+
* The original reasoning is preserved because it still governs **Aglyn's**
|
|
32
|
+
* configured value: `support@` and NOT `abuse@`, because AGL-1973 records
|
|
33
|
+
* that `abuse@aglyn.com` is not confirmed to deliver and AGL-1577 records
|
|
34
|
+
* that Gmail default routing accepts mail for non-existent `@aglyn.com`
|
|
35
|
+
* addresses with bounce suppression on. A published address that silently
|
|
36
|
+
* drops mail is worse than publishing none. That is now a statement about
|
|
37
|
+
* what we put in `NEXT_PUBLIC_OPERATOR_SUPPORT_EMAIL`, not about what the
|
|
38
|
+
* software hardcodes.
|
|
39
|
+
*
|
|
40
|
+
* DMCA notices prefer the legal mailbox when the operator has configured a
|
|
41
|
+
* separate one; see {@link operatorContactLine}.
|
|
42
|
+
*/
|
|
43
|
+
export declare function abuseReportContactEmail(kind?: 'support' | 'legal'): string | null;
|
|
44
|
+
/** Maximum characters of reporter prose stored. */
|
|
45
|
+
export declare const ABUSE_REPORT_MAX_DETAILS = 5000;
|
|
46
|
+
/** Maximum length of the reported URL. */
|
|
47
|
+
export declare const ABUSE_REPORT_MAX_URL = 2048;
|
|
48
|
+
/** Maximum length of a reporter's email/name. */
|
|
49
|
+
export declare const ABUSE_REPORT_MAX_CONTACT = 254;
|
|
50
|
+
export type AbuseReportSeverity = 'urgent' | 'high' | 'normal';
|
|
51
|
+
export interface AbuseReportCategoryDefinition {
|
|
52
|
+
/** Stored discriminator. */
|
|
53
|
+
id: string;
|
|
54
|
+
/** What the reporter sees. */
|
|
55
|
+
label: string;
|
|
56
|
+
/** One line of help under the label. */
|
|
57
|
+
hint: string;
|
|
58
|
+
/**
|
|
59
|
+
* How fast a human must look. `urgent` categories are the ones where the
|
|
60
|
+
* cost of a slow response is borne by someone who is not our customer.
|
|
61
|
+
*/
|
|
62
|
+
severity: AbuseReportSeverity;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The reportable categories.
|
|
66
|
+
*
|
|
67
|
+
* Ordered by how much damage an hour of delay does, because the order is what
|
|
68
|
+
* a panicking reporter actually reads. Phishing and CSAM lead: both have a
|
|
69
|
+
* victim who is not our customer, and both are the categories whose
|
|
70
|
+
* unanswered report becomes a `*.aglyn.app` domain block.
|
|
71
|
+
*
|
|
72
|
+
* `csam` is `urgent` and is deliberately NOT given a self-service lever
|
|
73
|
+
* anywhere in the product — it is a report-to-NCMEC-and-preserve obligation,
|
|
74
|
+
* not a takedown button, and the runbook says so.
|
|
75
|
+
*
|
|
76
|
+
* ## The `csam` hint says nothing about authorities (AGL-2045)
|
|
77
|
+
*
|
|
78
|
+
* It used to read *"Reported to the authorities and handled outside the normal
|
|
79
|
+
* queue."* The second clause was true — `urgent` really does jump the queue and
|
|
80
|
+
* fire a staff notification. The first was not: there is no CyberTipline
|
|
81
|
+
* submission path, no report generation, no preservation handling and no
|
|
82
|
+
* runbook step behind it, as `staff-console/abuse-reports.md` concedes in its
|
|
83
|
+
* own limits list.
|
|
84
|
+
*
|
|
85
|
+
* That is worse than simply lacking the mechanism, because the sentence is
|
|
86
|
+
* load-bearing on somebody else's decision. A person who has just found this
|
|
87
|
+
* material and reads that it has been "reported to the authorities" may
|
|
88
|
+
* reasonably stop there — so the claim can *replace* a real CyberTipline
|
|
89
|
+
* report rather than supplement one. It also ships to every self-hoster, each
|
|
90
|
+
* of whom makes the same promise on their own public form with even less
|
|
91
|
+
* behind it, and it sits opposite a live statutory duty (18 U.S.C. §2258A)
|
|
92
|
+
* that attaches to the provider on actual knowledge.
|
|
93
|
+
*
|
|
94
|
+
* So the hint now describes only the handling — which is real and is the same
|
|
95
|
+
* on every deployment — and sends the reporter to NCMEC themselves. Naming the
|
|
96
|
+
* CyberTipline is not a promise about the operator; it is the one instruction
|
|
97
|
+
* that survives being read by somebody who then closes the tab.
|
|
98
|
+
*
|
|
99
|
+
* Whether Aglyn should *build* the mechanism and make an authorities claim
|
|
100
|
+
* true is open on AGL-2045. If it is ever built, the claim must
|
|
101
|
+
* render from its own explicit configuration — never inferred — exactly as
|
|
102
|
+
* AGL-2016 gated the DMCA designation.
|
|
103
|
+
*/
|
|
104
|
+
export declare const ABUSE_REPORT_CATEGORIES: readonly AbuseReportCategoryDefinition[];
|
|
105
|
+
/** Look a category up, or `null` for an unrecognised id. */
|
|
106
|
+
export declare function abuseReportCategory(id: unknown): AbuseReportCategoryDefinition | null;
|
|
107
|
+
/** The workflow states a report moves through. */
|
|
108
|
+
export declare const ABUSE_REPORT_STATUSES: readonly ["open", "reviewing", "actioned", "dismissed"];
|
|
109
|
+
export type AbuseReportStatus = (typeof ABUSE_REPORT_STATUSES)[number];
|
|
110
|
+
export declare function isAbuseReportStatus(value: unknown): value is AbuseReportStatus;
|
|
111
|
+
/** What a reporter submitted, after validation. */
|
|
112
|
+
export interface AbuseReportInput {
|
|
113
|
+
category: string;
|
|
114
|
+
severity: AbuseReportSeverity;
|
|
115
|
+
/** The reported page, normalized to an absolute http(s) URL. */
|
|
116
|
+
url: string;
|
|
117
|
+
/** Host id resolved from `url`, when it resolves to one. */
|
|
118
|
+
reportedHostname: string;
|
|
119
|
+
details: string;
|
|
120
|
+
reporterEmail: string | null;
|
|
121
|
+
reporterName: string | null;
|
|
122
|
+
/** DMCA-only, all four required together. See {@link validateAbuseReport}. */
|
|
123
|
+
dmca: AbuseReportDmcaAffirmations | null;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* The statutory shape of a DMCA notice.
|
|
127
|
+
*
|
|
128
|
+
* 17 U.S.C. §512(c)(3) requires a takedown notice to carry, among other
|
|
129
|
+
* things, an identification of the work, a good-faith statement, a statement
|
|
130
|
+
* under penalty of perjury that the reporter is authorised, and a physical or
|
|
131
|
+
* electronic signature. Collecting them as free text next to a tick-box is
|
|
132
|
+
* the ordinary web form of that.
|
|
133
|
+
*
|
|
134
|
+
* Two consequences the form has to honour, and does:
|
|
135
|
+
*
|
|
136
|
+
* - **A DMCA notice needs a real identity.** The other categories accept an
|
|
137
|
+
* anonymous report because a phishing site is phishing whoever reports it;
|
|
138
|
+
* a copyright claim is a legal assertion by a named party, so
|
|
139
|
+
* `reporterEmail` and `signature` are REQUIRED for `dmca` and optional for
|
|
140
|
+
* everything else. That is why the anonymity rule is per-category and not
|
|
141
|
+
* global.
|
|
142
|
+
* - **We must not pretend to adjudicate.** Nothing here decides whether the
|
|
143
|
+
* claim is good. It records what was asserted, under whose name, at what
|
|
144
|
+
* time, which is exactly what the safe harbour asks a service provider to
|
|
145
|
+
* keep.
|
|
146
|
+
*/
|
|
147
|
+
export interface AbuseReportDmcaAffirmations {
|
|
148
|
+
/** Identification of the copyrighted work being infringed. */
|
|
149
|
+
work: string;
|
|
150
|
+
/** Typed name standing as the electronic signature. */
|
|
151
|
+
signature: string;
|
|
152
|
+
/** "I have a good faith belief the use is not authorised." */
|
|
153
|
+
goodFaith: boolean;
|
|
154
|
+
/** "Under penalty of perjury, I am authorised to act for the owner." */
|
|
155
|
+
underPenalty: boolean;
|
|
156
|
+
}
|
|
157
|
+
export interface AbuseReportValidationFailure {
|
|
158
|
+
ok: false;
|
|
159
|
+
/** Stable machine code, for tests and for the form to highlight a field. */
|
|
160
|
+
code: string;
|
|
161
|
+
/** Sentence shown to the reporter. Never blames them for our shape. */
|
|
162
|
+
message: string;
|
|
163
|
+
}
|
|
164
|
+
export interface AbuseReportValidationSuccess {
|
|
165
|
+
ok: true;
|
|
166
|
+
value: AbuseReportInput;
|
|
167
|
+
}
|
|
168
|
+
export type AbuseReportValidation = AbuseReportValidationSuccess | AbuseReportValidationFailure;
|
|
169
|
+
/**
|
|
170
|
+
* Normalize a reported URL.
|
|
171
|
+
*
|
|
172
|
+
* Returns `null` for anything that is not an absolute http(s) URL. The scheme
|
|
173
|
+
* allow-list is the point: a report is rendered in a staff console, and a
|
|
174
|
+
* `javascript:` or `data:` "URL" stored here would be a stored-XSS delivery
|
|
175
|
+
* mechanism aimed at the one browser session that can suspend any site on the
|
|
176
|
+
* platform. Refusing at the boundary is cheaper than trusting every renderer.
|
|
177
|
+
*/
|
|
178
|
+
export declare function normalizeReportedUrl(value: unknown): string | null;
|
|
179
|
+
/** The hostname of a normalized URL, lowercased, or `''`. */
|
|
180
|
+
export declare function reportedHostname(url: string): string;
|
|
181
|
+
/**
|
|
182
|
+
* Validate and normalize a submitted report.
|
|
183
|
+
*
|
|
184
|
+
* Accepts the shape of BOTH a JSON body and a urlencoded no-JS form post, so
|
|
185
|
+
* the caller can hand it either without a translation step.
|
|
186
|
+
*
|
|
187
|
+
* The bar for a valid report is deliberately low — a URL, a category and a
|
|
188
|
+
* sentence — because every field added is a reporter lost, and the whole
|
|
189
|
+
* point of AGL-1964 is that the report arrives at all. DMCA is the one
|
|
190
|
+
* exception, and only because the statute sets the shape rather than us.
|
|
191
|
+
*/
|
|
192
|
+
export declare function validateAbuseReport(payload: Record<string, unknown>): AbuseReportValidation;
|
|
193
|
+
export default validateAbuseReport;
|
|
@@ -0,0 +1,321 @@
|
|
|
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
|
+
* ABUSE REPORT INTAKE (AGL-1964) — the missing input to a mature response
|
|
18
|
+
* system.
|
|
19
|
+
*
|
|
20
|
+
* Aglyn's takedown tooling is good: five lockdown scopes with a staff UI, 38
|
|
21
|
+
* `lockdownRefusal()` sites, media quarantine by content digest, an audit
|
|
22
|
+
* trail, read-only mode. Every one of those is a lever an operator pulls
|
|
23
|
+
* AFTER learning there is a problem. Nothing anywhere let an outsider tell us
|
|
24
|
+
* there was one — no report route, no form, no affordance on a published
|
|
25
|
+
* site.
|
|
26
|
+
*
|
|
27
|
+
* ## Why that is the launch risk rather than a nicety
|
|
28
|
+
*
|
|
29
|
+
* From Sept 1 anyone can sign up and have arbitrary content live on
|
|
30
|
+
* `{sub}.aglyn.app` within minutes. When one of those is used for phishing,
|
|
31
|
+
* the finder is a bank's fraud team, a browser vendor, or Safe Browsing —
|
|
32
|
+
* none of whom are customers, none of whom can open a support ticket (that
|
|
33
|
+
* route is 401 + paid-plan gated), and all of whom have a next step if they
|
|
34
|
+
* cannot reach us: a **domain-level block on `*.aglyn.app`**, which takes
|
|
35
|
+
* every legitimate customer site down with it. The cheapest possible
|
|
36
|
+
* mitigation is a reachable form. This is that form's shared core.
|
|
37
|
+
*
|
|
38
|
+
* ## The intake is a QUEUE, not an email address, and that is deliberate
|
|
39
|
+
*
|
|
40
|
+
* The published Acceptable Use Policy names `abuse@aglyn.com`, and the
|
|
41
|
+
* Copyright/DMCA Policy names `dmca@aglyn.com`. AGL-1973 records that neither
|
|
42
|
+
* mailbox is confirmed to exist — the Drive open-items list has only
|
|
43
|
+
* `noreply@` and `info@` live — and AGL-1577 records that Gmail default
|
|
44
|
+
* routing **accepts mail for non-existent @aglyn.com addresses with bounce
|
|
45
|
+
* suppression on and no delivery recipient configured**. Those two facts
|
|
46
|
+
* together mean a report sent to `abuse@` may be accepted and silently
|
|
47
|
+
* discarded, with the reporter believing they told us.
|
|
48
|
+
*
|
|
49
|
+
* A published address that drops mail is worse than publishing none, because
|
|
50
|
+
* it converts a reachable problem into an invisible one. So the primary
|
|
51
|
+
* intake writes a Firestore document a staff surface reads, where delivery is
|
|
52
|
+
* a database write we control rather than a routing rule we have not read.
|
|
53
|
+
* The form is the thing to publish; the mailbox is a nice-to-have once
|
|
54
|
+
* AGL-1973 confirms it.
|
|
55
|
+
*
|
|
56
|
+
* ## Categories carry the response, not just a label
|
|
57
|
+
*
|
|
58
|
+
* {@link ABUSE_REPORT_CATEGORIES} maps onto the levers that already exist:
|
|
59
|
+
* every category's `severity` says how fast a human must look, and `dmca`
|
|
60
|
+
* alone opens the statutory fields. The reason codes deliberately reuse the
|
|
61
|
+
* media-quarantine vocabulary (`abuse`, `dmca`, `malware`) so a report can be
|
|
62
|
+
* actioned into a quarantine or a lockdown without a translation table.
|
|
63
|
+
*/ import { operatorContactLine } from "./operator-identity.js";
|
|
64
|
+
/** Firestore collection holding intake rows. Staff-read, Admin-SDK-written. */ export const ABUSE_REPORT_COLLECTION = 'abuseReports';
|
|
65
|
+
/**
|
|
66
|
+
* The contact address printed on the form — the OPERATOR's, resolved from
|
|
67
|
+
* configuration (AGL-2016).
|
|
68
|
+
*
|
|
69
|
+
* This was `export const ABUSE_REPORT_CONTACT_EMAIL = 'support@aglyn.com'`,
|
|
70
|
+
* and the docblock justifying it called itself *"the single place to change"*.
|
|
71
|
+
* It was the single place to change for **Aglyn**; for every other deployment
|
|
72
|
+
* it was the single place a third party's DMCA notice got misaddressed to us.
|
|
73
|
+
* The form it renders on is public and unauthenticated and ships with every
|
|
74
|
+
* install, so the literal made a self-hoster publish an intake pointing at a
|
|
75
|
+
* desk that cannot see, let alone remove, the content being reported.
|
|
76
|
+
*
|
|
77
|
+
* The original reasoning is preserved because it still governs **Aglyn's**
|
|
78
|
+
* configured value: `support@` and NOT `abuse@`, because AGL-1973 records
|
|
79
|
+
* that `abuse@aglyn.com` is not confirmed to deliver and AGL-1577 records
|
|
80
|
+
* that Gmail default routing accepts mail for non-existent `@aglyn.com`
|
|
81
|
+
* addresses with bounce suppression on. A published address that silently
|
|
82
|
+
* drops mail is worse than publishing none. That is now a statement about
|
|
83
|
+
* what we put in `NEXT_PUBLIC_OPERATOR_SUPPORT_EMAIL`, not about what the
|
|
84
|
+
* software hardcodes.
|
|
85
|
+
*
|
|
86
|
+
* DMCA notices prefer the legal mailbox when the operator has configured a
|
|
87
|
+
* separate one; see {@link operatorContactLine}.
|
|
88
|
+
*/ export function abuseReportContactEmail(kind = 'support') {
|
|
89
|
+
return operatorContactLine(kind).address;
|
|
90
|
+
}
|
|
91
|
+
/** Maximum characters of reporter prose stored. */ export const ABUSE_REPORT_MAX_DETAILS = 5000;
|
|
92
|
+
/** Maximum length of the reported URL. */ export const ABUSE_REPORT_MAX_URL = 2048;
|
|
93
|
+
/** Maximum length of a reporter's email/name. */ export const ABUSE_REPORT_MAX_CONTACT = 254;
|
|
94
|
+
/**
|
|
95
|
+
* The reportable categories.
|
|
96
|
+
*
|
|
97
|
+
* Ordered by how much damage an hour of delay does, because the order is what
|
|
98
|
+
* a panicking reporter actually reads. Phishing and CSAM lead: both have a
|
|
99
|
+
* victim who is not our customer, and both are the categories whose
|
|
100
|
+
* unanswered report becomes a `*.aglyn.app` domain block.
|
|
101
|
+
*
|
|
102
|
+
* `csam` is `urgent` and is deliberately NOT given a self-service lever
|
|
103
|
+
* anywhere in the product — it is a report-to-NCMEC-and-preserve obligation,
|
|
104
|
+
* not a takedown button, and the runbook says so.
|
|
105
|
+
*
|
|
106
|
+
* ## The `csam` hint says nothing about authorities (AGL-2045)
|
|
107
|
+
*
|
|
108
|
+
* It used to read *"Reported to the authorities and handled outside the normal
|
|
109
|
+
* queue."* The second clause was true — `urgent` really does jump the queue and
|
|
110
|
+
* fire a staff notification. The first was not: there is no CyberTipline
|
|
111
|
+
* submission path, no report generation, no preservation handling and no
|
|
112
|
+
* runbook step behind it, as `staff-console/abuse-reports.md` concedes in its
|
|
113
|
+
* own limits list.
|
|
114
|
+
*
|
|
115
|
+
* That is worse than simply lacking the mechanism, because the sentence is
|
|
116
|
+
* load-bearing on somebody else's decision. A person who has just found this
|
|
117
|
+
* material and reads that it has been "reported to the authorities" may
|
|
118
|
+
* reasonably stop there — so the claim can *replace* a real CyberTipline
|
|
119
|
+
* report rather than supplement one. It also ships to every self-hoster, each
|
|
120
|
+
* of whom makes the same promise on their own public form with even less
|
|
121
|
+
* behind it, and it sits opposite a live statutory duty (18 U.S.C. §2258A)
|
|
122
|
+
* that attaches to the provider on actual knowledge.
|
|
123
|
+
*
|
|
124
|
+
* So the hint now describes only the handling — which is real and is the same
|
|
125
|
+
* on every deployment — and sends the reporter to NCMEC themselves. Naming the
|
|
126
|
+
* CyberTipline is not a promise about the operator; it is the one instruction
|
|
127
|
+
* that survives being read by somebody who then closes the tab.
|
|
128
|
+
*
|
|
129
|
+
* Whether Aglyn should *build* the mechanism and make an authorities claim
|
|
130
|
+
* true is open on AGL-2045. If it is ever built, the claim must
|
|
131
|
+
* render from its own explicit configuration — never inferred — exactly as
|
|
132
|
+
* AGL-2016 gated the DMCA designation.
|
|
133
|
+
*/ export const ABUSE_REPORT_CATEGORIES = [
|
|
134
|
+
{
|
|
135
|
+
id: 'phishing',
|
|
136
|
+
label: 'Phishing or fraud',
|
|
137
|
+
hint: 'A page impersonating another business to steal logins, card numbers or personal details.',
|
|
138
|
+
severity: 'urgent'
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: 'csam',
|
|
142
|
+
label: 'Child sexual abuse material',
|
|
143
|
+
hint: 'Handled outside the normal queue and escalated to the operator immediately. Please also report it directly to NCMEC at report.cybertip.org — do not rely on this form alone.',
|
|
144
|
+
severity: 'urgent'
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
id: 'malware',
|
|
148
|
+
label: 'Malware or harmful downloads',
|
|
149
|
+
hint: 'A file or script that infects or attacks the visitor.',
|
|
150
|
+
severity: 'urgent'
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
id: 'dmca',
|
|
154
|
+
label: 'Copyright infringement (DMCA)',
|
|
155
|
+
hint: 'Your copyrighted work is published without permission. Needs the statutory statements below.',
|
|
156
|
+
severity: 'high'
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
id: 'impersonation',
|
|
160
|
+
label: 'Impersonation or trademark',
|
|
161
|
+
hint: 'The site pretends to be you, your business, or uses your mark.',
|
|
162
|
+
severity: 'high'
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: 'illegal',
|
|
166
|
+
label: 'Other illegal content',
|
|
167
|
+
hint: 'Content unlawful where it is published.',
|
|
168
|
+
severity: 'high'
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
id: 'spam',
|
|
172
|
+
label: 'Spam or deceptive content',
|
|
173
|
+
hint: 'Bulk junk, SEO doorways, or content unrelated to a real business.',
|
|
174
|
+
severity: 'normal'
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
id: 'other',
|
|
178
|
+
label: 'Something else',
|
|
179
|
+
hint: 'Anything that breaks the Acceptable Use Policy.',
|
|
180
|
+
severity: 'normal'
|
|
181
|
+
}
|
|
182
|
+
];
|
|
183
|
+
const CATEGORY_BY_ID = new Map(ABUSE_REPORT_CATEGORIES.map((entry)=>[
|
|
184
|
+
entry.id,
|
|
185
|
+
entry
|
|
186
|
+
]));
|
|
187
|
+
/** Look a category up, or `null` for an unrecognised id. */ export function abuseReportCategory(id) {
|
|
188
|
+
var _CATEGORY_BY_ID_get;
|
|
189
|
+
return typeof id === 'string' ? (_CATEGORY_BY_ID_get = CATEGORY_BY_ID.get(id)) != null ? _CATEGORY_BY_ID_get : null : null;
|
|
190
|
+
}
|
|
191
|
+
/** The workflow states a report moves through. */ export const ABUSE_REPORT_STATUSES = [
|
|
192
|
+
'open',
|
|
193
|
+
'reviewing',
|
|
194
|
+
'actioned',
|
|
195
|
+
'dismissed'
|
|
196
|
+
];
|
|
197
|
+
export function isAbuseReportStatus(value) {
|
|
198
|
+
return typeof value === 'string' && ABUSE_REPORT_STATUSES.includes(value);
|
|
199
|
+
}
|
|
200
|
+
const fail = (code, message)=>({
|
|
201
|
+
ok: false,
|
|
202
|
+
code,
|
|
203
|
+
message
|
|
204
|
+
});
|
|
205
|
+
const text = (value, max)=>typeof value === 'string' ? value.trim().slice(0, max) : '';
|
|
206
|
+
/**
|
|
207
|
+
* Is this a truthy checkbox value?
|
|
208
|
+
*
|
|
209
|
+
* A no-JavaScript HTML form sends `on` for a ticked box and sends the field
|
|
210
|
+
* NOT AT ALL when unticked; a JSON client sends `true`. Both have to mean the
|
|
211
|
+
* same thing or the statutory affirmations would depend on how the reporter's
|
|
212
|
+
* browser is configured — and the failure would be silent, refusing valid
|
|
213
|
+
* notices from the people least likely to have JS on.
|
|
214
|
+
*/ const checked = (value)=>value === true || value === 'on' || value === 'true' || value === '1' || value === 'yes';
|
|
215
|
+
/**
|
|
216
|
+
* Normalize a reported URL.
|
|
217
|
+
*
|
|
218
|
+
* Returns `null` for anything that is not an absolute http(s) URL. The scheme
|
|
219
|
+
* allow-list is the point: a report is rendered in a staff console, and a
|
|
220
|
+
* `javascript:` or `data:` "URL" stored here would be a stored-XSS delivery
|
|
221
|
+
* mechanism aimed at the one browser session that can suspend any site on the
|
|
222
|
+
* platform. Refusing at the boundary is cheaper than trusting every renderer.
|
|
223
|
+
*/ export function normalizeReportedUrl(value) {
|
|
224
|
+
const raw = text(value, ABUSE_REPORT_MAX_URL);
|
|
225
|
+
if (!raw) return null;
|
|
226
|
+
// A reporter pasting a bare hostname is the common case; assume https
|
|
227
|
+
// rather than refusing them for a missing scheme.
|
|
228
|
+
const candidate = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(raw) ? raw : `https://${raw}`;
|
|
229
|
+
let parsed;
|
|
230
|
+
try {
|
|
231
|
+
parsed = new URL(candidate);
|
|
232
|
+
} catch (unused) {
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null;
|
|
236
|
+
if (!parsed.hostname) return null;
|
|
237
|
+
return parsed.toString().slice(0, ABUSE_REPORT_MAX_URL);
|
|
238
|
+
}
|
|
239
|
+
/** The hostname of a normalized URL, lowercased, or `''`. */ export function reportedHostname(url) {
|
|
240
|
+
try {
|
|
241
|
+
return new URL(url).hostname.toLowerCase();
|
|
242
|
+
} catch (unused) {
|
|
243
|
+
return '';
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Validate and normalize a submitted report.
|
|
248
|
+
*
|
|
249
|
+
* Accepts the shape of BOTH a JSON body and a urlencoded no-JS form post, so
|
|
250
|
+
* the caller can hand it either without a translation step.
|
|
251
|
+
*
|
|
252
|
+
* The bar for a valid report is deliberately low — a URL, a category and a
|
|
253
|
+
* sentence — because every field added is a reporter lost, and the whole
|
|
254
|
+
* point of AGL-1964 is that the report arrives at all. DMCA is the one
|
|
255
|
+
* exception, and only because the statute sets the shape rather than us.
|
|
256
|
+
*/ export function validateAbuseReport(payload) {
|
|
257
|
+
const category = abuseReportCategory(payload['category']);
|
|
258
|
+
if (!category) {
|
|
259
|
+
return fail('category', 'Choose what kind of problem you are reporting.');
|
|
260
|
+
}
|
|
261
|
+
const url = normalizeReportedUrl(payload['url']);
|
|
262
|
+
if (!url) {
|
|
263
|
+
return fail('url', 'Enter the full web address of the page you are reporting, starting with https://.');
|
|
264
|
+
}
|
|
265
|
+
const details = text(payload['details'], ABUSE_REPORT_MAX_DETAILS);
|
|
266
|
+
if (details.length < 10) {
|
|
267
|
+
return fail('details', 'Tell us briefly what is wrong with the page — at least a sentence.');
|
|
268
|
+
}
|
|
269
|
+
const reporterEmail = text(payload['reporterEmail'], ABUSE_REPORT_MAX_CONTACT);
|
|
270
|
+
const reporterName = text(payload['reporterName'], ABUSE_REPORT_MAX_CONTACT);
|
|
271
|
+
// Shape only. Deliverability is not ours to assert, and a stricter pattern
|
|
272
|
+
// would reject valid addresses to buy nothing.
|
|
273
|
+
if (reporterEmail && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(reporterEmail)) {
|
|
274
|
+
return fail('reporterEmail', 'That email address does not look right.');
|
|
275
|
+
}
|
|
276
|
+
let dmca = null;
|
|
277
|
+
if (category.id === 'dmca') {
|
|
278
|
+
const work = text(payload['dmcaWork'], ABUSE_REPORT_MAX_DETAILS);
|
|
279
|
+
const signature = text(payload['dmcaSignature'], ABUSE_REPORT_MAX_CONTACT);
|
|
280
|
+
if (!work) {
|
|
281
|
+
return fail('dmcaWork', 'Identify the copyrighted work you say is being infringed.');
|
|
282
|
+
}
|
|
283
|
+
if (!signature) {
|
|
284
|
+
return fail('dmcaSignature', 'Type your full legal name — it stands as your electronic signature.');
|
|
285
|
+
}
|
|
286
|
+
if (!checked(payload['dmcaGoodFaith'])) {
|
|
287
|
+
return fail('dmcaGoodFaith', 'A copyright notice needs the good-faith statement.');
|
|
288
|
+
}
|
|
289
|
+
if (!checked(payload['dmcaUnderPenalty'])) {
|
|
290
|
+
return fail('dmcaUnderPenalty', 'A copyright notice needs the statement made under penalty of perjury.');
|
|
291
|
+
}
|
|
292
|
+
// A DMCA notice is a legal assertion by a named party, so unlike every
|
|
293
|
+
// other category it cannot be anonymous — we have to be able to forward
|
|
294
|
+
// it to the site owner and to accept a counter-notice.
|
|
295
|
+
if (!reporterEmail) {
|
|
296
|
+
return fail('reporterEmail', 'A copyright notice needs an email address we can reply to.');
|
|
297
|
+
}
|
|
298
|
+
dmca = {
|
|
299
|
+
work,
|
|
300
|
+
signature,
|
|
301
|
+
goodFaith: true,
|
|
302
|
+
underPenalty: true
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
return {
|
|
306
|
+
ok: true,
|
|
307
|
+
value: {
|
|
308
|
+
category: category.id,
|
|
309
|
+
severity: category.severity,
|
|
310
|
+
url,
|
|
311
|
+
reportedHostname: reportedHostname(url),
|
|
312
|
+
details,
|
|
313
|
+
reporterEmail: reporterEmail || null,
|
|
314
|
+
reporterName: reporterName || null,
|
|
315
|
+
dmca
|
|
316
|
+
}
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
export default validateAbuseReport;
|
|
320
|
+
|
|
321
|
+
//# sourceMappingURL=abuse-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/abuse-report.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 * ABUSE REPORT INTAKE (AGL-1964) — the missing input to a mature response\n * system.\n *\n * Aglyn's takedown tooling is good: five lockdown scopes with a staff UI, 38\n * `lockdownRefusal()` sites, media quarantine by content digest, an audit\n * trail, read-only mode. Every one of those is a lever an operator pulls\n * AFTER learning there is a problem. Nothing anywhere let an outsider tell us\n * there was one — no report route, no form, no affordance on a published\n * site.\n *\n * ## Why that is the launch risk rather than a nicety\n *\n * From Sept 1 anyone can sign up and have arbitrary content live on\n * `{sub}.aglyn.app` within minutes. When one of those is used for phishing,\n * the finder is a bank's fraud team, a browser vendor, or Safe Browsing —\n * none of whom are customers, none of whom can open a support ticket (that\n * route is 401 + paid-plan gated), and all of whom have a next step if they\n * cannot reach us: a **domain-level block on `*.aglyn.app`**, which takes\n * every legitimate customer site down with it. The cheapest possible\n * mitigation is a reachable form. This is that form's shared core.\n *\n * ## The intake is a QUEUE, not an email address, and that is deliberate\n *\n * The published Acceptable Use Policy names `abuse@aglyn.com`, and the\n * Copyright/DMCA Policy names `dmca@aglyn.com`. AGL-1973 records that neither\n * mailbox is confirmed to exist — the Drive open-items list has only\n * `noreply@` and `info@` live — and AGL-1577 records that Gmail default\n * routing **accepts mail for non-existent @aglyn.com addresses with bounce\n * suppression on and no delivery recipient configured**. Those two facts\n * together mean a report sent to `abuse@` may be accepted and silently\n * discarded, with the reporter believing they told us.\n *\n * A published address that drops mail is worse than publishing none, because\n * it converts a reachable problem into an invisible one. So the primary\n * intake writes a Firestore document a staff surface reads, where delivery is\n * a database write we control rather than a routing rule we have not read.\n * The form is the thing to publish; the mailbox is a nice-to-have once\n * AGL-1973 confirms it.\n *\n * ## Categories carry the response, not just a label\n *\n * {@link ABUSE_REPORT_CATEGORIES} maps onto the levers that already exist:\n * every category's `severity` says how fast a human must look, and `dmca`\n * alone opens the statutory fields. The reason codes deliberately reuse the\n * media-quarantine vocabulary (`abuse`, `dmca`, `malware`) so a report can be\n * actioned into a quarantine or a lockdown without a translation table.\n */\n\nimport { operatorContactLine } from './operator-identity'\n\n/** Firestore collection holding intake rows. Staff-read, Admin-SDK-written. */\nexport const ABUSE_REPORT_COLLECTION = 'abuseReports'\n\n/**\n * The contact address printed on the form — the OPERATOR's, resolved from\n * configuration (AGL-2016).\n *\n * This was `export const ABUSE_REPORT_CONTACT_EMAIL = 'support@aglyn.com'`,\n * and the docblock justifying it called itself *\"the single place to change\"*.\n * It was the single place to change for **Aglyn**; for every other deployment\n * it was the single place a third party's DMCA notice got misaddressed to us.\n * The form it renders on is public and unauthenticated and ships with every\n * install, so the literal made a self-hoster publish an intake pointing at a\n * desk that cannot see, let alone remove, the content being reported.\n *\n * The original reasoning is preserved because it still governs **Aglyn's**\n * configured value: `support@` and NOT `abuse@`, because AGL-1973 records\n * that `abuse@aglyn.com` is not confirmed to deliver and AGL-1577 records\n * that Gmail default routing accepts mail for non-existent `@aglyn.com`\n * addresses with bounce suppression on. A published address that silently\n * drops mail is worse than publishing none. That is now a statement about\n * what we put in `NEXT_PUBLIC_OPERATOR_SUPPORT_EMAIL`, not about what the\n * software hardcodes.\n *\n * DMCA notices prefer the legal mailbox when the operator has configured a\n * separate one; see {@link operatorContactLine}.\n */\nexport function abuseReportContactEmail(\n kind: 'support' | 'legal' = 'support',\n): string | null {\n return operatorContactLine(kind).address\n}\n\n/** Maximum characters of reporter prose stored. */\nexport const ABUSE_REPORT_MAX_DETAILS = 5000\n/** Maximum length of the reported URL. */\nexport const ABUSE_REPORT_MAX_URL = 2048\n/** Maximum length of a reporter's email/name. */\nexport const ABUSE_REPORT_MAX_CONTACT = 254\n\nexport type AbuseReportSeverity = 'urgent' | 'high' | 'normal'\n\nexport interface AbuseReportCategoryDefinition {\n /** Stored discriminator. */\n id: string\n /** What the reporter sees. */\n label: string\n /** One line of help under the label. */\n hint: string\n /**\n * How fast a human must look. `urgent` categories are the ones where the\n * cost of a slow response is borne by someone who is not our customer.\n */\n severity: AbuseReportSeverity\n}\n\n/**\n * The reportable categories.\n *\n * Ordered by how much damage an hour of delay does, because the order is what\n * a panicking reporter actually reads. Phishing and CSAM lead: both have a\n * victim who is not our customer, and both are the categories whose\n * unanswered report becomes a `*.aglyn.app` domain block.\n *\n * `csam` is `urgent` and is deliberately NOT given a self-service lever\n * anywhere in the product — it is a report-to-NCMEC-and-preserve obligation,\n * not a takedown button, and the runbook says so.\n *\n * ## The `csam` hint says nothing about authorities (AGL-2045)\n *\n * It used to read *\"Reported to the authorities and handled outside the normal\n * queue.\"* The second clause was true — `urgent` really does jump the queue and\n * fire a staff notification. The first was not: there is no CyberTipline\n * submission path, no report generation, no preservation handling and no\n * runbook step behind it, as `staff-console/abuse-reports.md` concedes in its\n * own limits list.\n *\n * That is worse than simply lacking the mechanism, because the sentence is\n * load-bearing on somebody else's decision. A person who has just found this\n * material and reads that it has been \"reported to the authorities\" may\n * reasonably stop there — so the claim can *replace* a real CyberTipline\n * report rather than supplement one. It also ships to every self-hoster, each\n * of whom makes the same promise on their own public form with even less\n * behind it, and it sits opposite a live statutory duty (18 U.S.C. §2258A)\n * that attaches to the provider on actual knowledge.\n *\n * So the hint now describes only the handling — which is real and is the same\n * on every deployment — and sends the reporter to NCMEC themselves. Naming the\n * CyberTipline is not a promise about the operator; it is the one instruction\n * that survives being read by somebody who then closes the tab.\n *\n * Whether Aglyn should *build* the mechanism and make an authorities claim\n * true is open on AGL-2045. If it is ever built, the claim must\n * render from its own explicit configuration — never inferred — exactly as\n * AGL-2016 gated the DMCA designation.\n */\nexport const ABUSE_REPORT_CATEGORIES: readonly AbuseReportCategoryDefinition[] =\n [\n {\n id: 'phishing',\n label: 'Phishing or fraud',\n hint: 'A page impersonating another business to steal logins, card numbers or personal details.',\n severity: 'urgent',\n },\n {\n id: 'csam',\n label: 'Child sexual abuse material',\n hint: 'Handled outside the normal queue and escalated to the operator immediately. Please also report it directly to NCMEC at report.cybertip.org — do not rely on this form alone.',\n severity: 'urgent',\n },\n {\n id: 'malware',\n label: 'Malware or harmful downloads',\n hint: 'A file or script that infects or attacks the visitor.',\n severity: 'urgent',\n },\n {\n id: 'dmca',\n label: 'Copyright infringement (DMCA)',\n hint: 'Your copyrighted work is published without permission. Needs the statutory statements below.',\n severity: 'high',\n },\n {\n id: 'impersonation',\n label: 'Impersonation or trademark',\n hint: 'The site pretends to be you, your business, or uses your mark.',\n severity: 'high',\n },\n {\n id: 'illegal',\n label: 'Other illegal content',\n hint: 'Content unlawful where it is published.',\n severity: 'high',\n },\n {\n id: 'spam',\n label: 'Spam or deceptive content',\n hint: 'Bulk junk, SEO doorways, or content unrelated to a real business.',\n severity: 'normal',\n },\n {\n id: 'other',\n label: 'Something else',\n hint: 'Anything that breaks the Acceptable Use Policy.',\n severity: 'normal',\n },\n ]\n\nconst CATEGORY_BY_ID = new Map(\n ABUSE_REPORT_CATEGORIES.map((entry) => [entry.id, entry]),\n)\n\n/** Look a category up, or `null` for an unrecognised id. */\nexport function abuseReportCategory(\n id: unknown,\n): AbuseReportCategoryDefinition | null {\n return typeof id === 'string' ? (CATEGORY_BY_ID.get(id) ?? null) : null\n}\n\n/** The workflow states a report moves through. */\nexport const ABUSE_REPORT_STATUSES = [\n 'open',\n 'reviewing',\n 'actioned',\n 'dismissed',\n] as const\nexport type AbuseReportStatus = (typeof ABUSE_REPORT_STATUSES)[number]\n\nexport function isAbuseReportStatus(value: unknown): value is AbuseReportStatus {\n return (\n typeof value === 'string' &&\n (ABUSE_REPORT_STATUSES as readonly string[]).includes(value)\n )\n}\n\n/** What a reporter submitted, after validation. */\nexport interface AbuseReportInput {\n category: string\n severity: AbuseReportSeverity\n /** The reported page, normalized to an absolute http(s) URL. */\n url: string\n /** Host id resolved from `url`, when it resolves to one. */\n reportedHostname: string\n details: string\n reporterEmail: string | null\n reporterName: string | null\n /** DMCA-only, all four required together. See {@link validateAbuseReport}. */\n dmca: AbuseReportDmcaAffirmations | null\n}\n\n/**\n * The statutory shape of a DMCA notice.\n *\n * 17 U.S.C. §512(c)(3) requires a takedown notice to carry, among other\n * things, an identification of the work, a good-faith statement, a statement\n * under penalty of perjury that the reporter is authorised, and a physical or\n * electronic signature. Collecting them as free text next to a tick-box is\n * the ordinary web form of that.\n *\n * Two consequences the form has to honour, and does:\n *\n * - **A DMCA notice needs a real identity.** The other categories accept an\n * anonymous report because a phishing site is phishing whoever reports it;\n * a copyright claim is a legal assertion by a named party, so\n * `reporterEmail` and `signature` are REQUIRED for `dmca` and optional for\n * everything else. That is why the anonymity rule is per-category and not\n * global.\n * - **We must not pretend to adjudicate.** Nothing here decides whether the\n * claim is good. It records what was asserted, under whose name, at what\n * time, which is exactly what the safe harbour asks a service provider to\n * keep.\n */\nexport interface AbuseReportDmcaAffirmations {\n /** Identification of the copyrighted work being infringed. */\n work: string\n /** Typed name standing as the electronic signature. */\n signature: string\n /** \"I have a good faith belief the use is not authorised.\" */\n goodFaith: boolean\n /** \"Under penalty of perjury, I am authorised to act for the owner.\" */\n underPenalty: boolean\n}\n\nexport interface AbuseReportValidationFailure {\n ok: false\n /** Stable machine code, for tests and for the form to highlight a field. */\n code: string\n /** Sentence shown to the reporter. Never blames them for our shape. */\n message: string\n}\n\nexport interface AbuseReportValidationSuccess {\n ok: true\n value: AbuseReportInput\n}\n\nexport type AbuseReportValidation =\n | AbuseReportValidationSuccess\n | AbuseReportValidationFailure\n\nconst fail = (code: string, message: string): AbuseReportValidationFailure => ({\n ok: false,\n code,\n message,\n})\n\nconst text = (value: unknown, max: number): string =>\n typeof value === 'string' ? value.trim().slice(0, max) : ''\n\n/**\n * Is this a truthy checkbox value?\n *\n * A no-JavaScript HTML form sends `on` for a ticked box and sends the field\n * NOT AT ALL when unticked; a JSON client sends `true`. Both have to mean the\n * same thing or the statutory affirmations would depend on how the reporter's\n * browser is configured — and the failure would be silent, refusing valid\n * notices from the people least likely to have JS on.\n */\nconst checked = (value: unknown): boolean =>\n value === true ||\n value === 'on' ||\n value === 'true' ||\n value === '1' ||\n value === 'yes'\n\n/**\n * Normalize a reported URL.\n *\n * Returns `null` for anything that is not an absolute http(s) URL. The scheme\n * allow-list is the point: a report is rendered in a staff console, and a\n * `javascript:` or `data:` \"URL\" stored here would be a stored-XSS delivery\n * mechanism aimed at the one browser session that can suspend any site on the\n * platform. Refusing at the boundary is cheaper than trusting every renderer.\n */\nexport function normalizeReportedUrl(value: unknown): string | null {\n const raw = text(value, ABUSE_REPORT_MAX_URL)\n if (!raw) return null\n // A reporter pasting a bare hostname is the common case; assume https\n // rather than refusing them for a missing scheme.\n const candidate = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(raw) ? raw : `https://${raw}`\n let parsed: URL\n try {\n parsed = new URL(candidate)\n } catch {\n return null\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') return null\n if (!parsed.hostname) return null\n return parsed.toString().slice(0, ABUSE_REPORT_MAX_URL)\n}\n\n/** The hostname of a normalized URL, lowercased, or `''`. */\nexport function reportedHostname(url: string): string {\n try {\n return new URL(url).hostname.toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * Validate and normalize a submitted report.\n *\n * Accepts the shape of BOTH a JSON body and a urlencoded no-JS form post, so\n * the caller can hand it either without a translation step.\n *\n * The bar for a valid report is deliberately low — a URL, a category and a\n * sentence — because every field added is a reporter lost, and the whole\n * point of AGL-1964 is that the report arrives at all. DMCA is the one\n * exception, and only because the statute sets the shape rather than us.\n */\nexport function validateAbuseReport(\n payload: Record<string, unknown>,\n): AbuseReportValidation {\n const category = abuseReportCategory(payload['category'])\n if (!category) {\n return fail('category', 'Choose what kind of problem you are reporting.')\n }\n\n const url = normalizeReportedUrl(payload['url'])\n if (!url) {\n return fail(\n 'url',\n 'Enter the full web address of the page you are reporting, starting with https://.',\n )\n }\n\n const details = text(payload['details'], ABUSE_REPORT_MAX_DETAILS)\n if (details.length < 10) {\n return fail(\n 'details',\n 'Tell us briefly what is wrong with the page — at least a sentence.',\n )\n }\n\n const reporterEmail = text(payload['reporterEmail'], ABUSE_REPORT_MAX_CONTACT)\n const reporterName = text(payload['reporterName'], ABUSE_REPORT_MAX_CONTACT)\n // Shape only. Deliverability is not ours to assert, and a stricter pattern\n // would reject valid addresses to buy nothing.\n if (reporterEmail && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(reporterEmail)) {\n return fail('reporterEmail', 'That email address does not look right.')\n }\n\n let dmca: AbuseReportDmcaAffirmations | null = null\n if (category.id === 'dmca') {\n const work = text(payload['dmcaWork'], ABUSE_REPORT_MAX_DETAILS)\n const signature = text(payload['dmcaSignature'], ABUSE_REPORT_MAX_CONTACT)\n if (!work) {\n return fail(\n 'dmcaWork',\n 'Identify the copyrighted work you say is being infringed.',\n )\n }\n if (!signature) {\n return fail(\n 'dmcaSignature',\n 'Type your full legal name — it stands as your electronic signature.',\n )\n }\n if (!checked(payload['dmcaGoodFaith'])) {\n return fail(\n 'dmcaGoodFaith',\n 'A copyright notice needs the good-faith statement.',\n )\n }\n if (!checked(payload['dmcaUnderPenalty'])) {\n return fail(\n 'dmcaUnderPenalty',\n 'A copyright notice needs the statement made under penalty of perjury.',\n )\n }\n // A DMCA notice is a legal assertion by a named party, so unlike every\n // other category it cannot be anonymous — we have to be able to forward\n // it to the site owner and to accept a counter-notice.\n if (!reporterEmail) {\n return fail(\n 'reporterEmail',\n 'A copyright notice needs an email address we can reply to.',\n )\n }\n dmca = {\n work,\n signature,\n goodFaith: true,\n underPenalty: true,\n }\n }\n\n return {\n ok: true,\n value: {\n category: category.id,\n severity: category.severity,\n url,\n reportedHostname: reportedHostname(url),\n details,\n reporterEmail: reporterEmail || null,\n reporterName: reporterName || null,\n dmca,\n },\n }\n}\n\nexport default validateAbuseReport\n"],"names":["operatorContactLine","ABUSE_REPORT_COLLECTION","abuseReportContactEmail","kind","address","ABUSE_REPORT_MAX_DETAILS","ABUSE_REPORT_MAX_URL","ABUSE_REPORT_MAX_CONTACT","ABUSE_REPORT_CATEGORIES","id","label","hint","severity","CATEGORY_BY_ID","Map","map","entry","abuseReportCategory","get","ABUSE_REPORT_STATUSES","isAbuseReportStatus","value","includes","fail","code","message","ok","text","max","trim","slice","checked","normalizeReportedUrl","raw","candidate","test","parsed","URL","protocol","hostname","toString","reportedHostname","url","toLowerCase","validateAbuseReport","payload","category","details","length","reporterEmail","reporterName","dmca","work","signature","goodFaith","underPenalty"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CC,GAED,SAASA,mBAAmB,QAAQ,yBAAqB;AAEzD,6EAA6E,GAC7E,OAAO,MAAMC,0BAA0B,eAAc;AAErD;;;;;;;;;;;;;;;;;;;;;;;CAuBC,GACD,OAAO,SAASC,wBACdC,OAA4B,SAAS;IAErC,OAAOH,oBAAoBG,MAAMC,OAAO;AAC1C;AAEA,iDAAiD,GACjD,OAAO,MAAMC,2BAA2B,KAAI;AAC5C,wCAAwC,GACxC,OAAO,MAAMC,uBAAuB,KAAI;AACxC,+CAA+C,GAC/C,OAAO,MAAMC,2BAA2B,IAAG;AAkB3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCC,GACD,OAAO,MAAMC,0BACX;IACE;QACEC,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;IACA;QACEH,IAAI;QACJC,OAAO;QACPC,MAAM;QACNC,UAAU;IACZ;CACD,CAAA;AAEH,MAAMC,iBAAiB,IAAIC,IACzBN,wBAAwBO,GAAG,CAAC,CAACC,QAAU;QAACA,MAAMP,EAAE;QAAEO;KAAM;AAG1D,0DAA0D,GAC1D,OAAO,SAASC,oBACdR,EAAW;QAEsBI;IAAjC,OAAO,OAAOJ,OAAO,YAAYI,sBAAAA,eAAeK,GAAG,CAACT,eAAnBI,sBAA0B,OAAQ;AACrE;AAEA,gDAAgD,GAChD,OAAO,MAAMM,wBAAwB;IACnC;IACA;IACA;IACA;CACD,CAAS;AAGV,OAAO,SAASC,oBAAoBC,KAAc;IAChD,OACE,OAAOA,UAAU,YACjB,AAACF,sBAA4CG,QAAQ,CAACD;AAE1D;AAmEA,MAAME,OAAO,CAACC,MAAcC,UAAmD,CAAA;QAC7EC,IAAI;QACJF;QACAC;IACF,CAAA;AAEA,MAAME,OAAO,CAACN,OAAgBO,MAC5B,OAAOP,UAAU,WAAWA,MAAMQ,IAAI,GAAGC,KAAK,CAAC,GAAGF,OAAO;AAE3D;;;;;;;;CAQC,GACD,MAAMG,UAAU,CAACV,QACfA,UAAU,QACVA,UAAU,QACVA,UAAU,UACVA,UAAU,OACVA,UAAU;AAEZ;;;;;;;;CAQC,GACD,OAAO,SAASW,qBAAqBX,KAAc;IACjD,MAAMY,MAAMN,KAAKN,OAAOf;IACxB,IAAI,CAAC2B,KAAK,OAAO;IACjB,sEAAsE;IACtE,kDAAkD;IAClD,MAAMC,YAAY,4BAA4BC,IAAI,CAACF,OAAOA,MAAM,CAAC,QAAQ,EAAEA,KAAK;IAChF,IAAIG;IACJ,IAAI;QACFA,SAAS,IAAIC,IAAIH;IACnB,EAAE,eAAM;QACN,OAAO;IACT;IACA,IAAIE,OAAOE,QAAQ,KAAK,WAAWF,OAAOE,QAAQ,KAAK,UAAU,OAAO;IACxE,IAAI,CAACF,OAAOG,QAAQ,EAAE,OAAO;IAC7B,OAAOH,OAAOI,QAAQ,GAAGV,KAAK,CAAC,GAAGxB;AACpC;AAEA,2DAA2D,GAC3D,OAAO,SAASmC,iBAAiBC,GAAW;IAC1C,IAAI;QACF,OAAO,IAAIL,IAAIK,KAAKH,QAAQ,CAACI,WAAW;IAC1C,EAAE,eAAM;QACN,OAAO;IACT;AACF;AAEA;;;;;;;;;;CAUC,GACD,OAAO,SAASC,oBACdC,OAAgC;IAEhC,MAAMC,WAAW7B,oBAAoB4B,OAAO,CAAC,WAAW;IACxD,IAAI,CAACC,UAAU;QACb,OAAOvB,KAAK,YAAY;IAC1B;IAEA,MAAMmB,MAAMV,qBAAqBa,OAAO,CAAC,MAAM;IAC/C,IAAI,CAACH,KAAK;QACR,OAAOnB,KACL,OACA;IAEJ;IAEA,MAAMwB,UAAUpB,KAAKkB,OAAO,CAAC,UAAU,EAAExC;IACzC,IAAI0C,QAAQC,MAAM,GAAG,IAAI;QACvB,OAAOzB,KACL,WACA;IAEJ;IAEA,MAAM0B,gBAAgBtB,KAAKkB,OAAO,CAAC,gBAAgB,EAAEtC;IACrD,MAAM2C,eAAevB,KAAKkB,OAAO,CAAC,eAAe,EAAEtC;IACnD,2EAA2E;IAC3E,+CAA+C;IAC/C,IAAI0C,iBAAiB,CAAC,6BAA6Bd,IAAI,CAACc,gBAAgB;QACtE,OAAO1B,KAAK,iBAAiB;IAC/B;IAEA,IAAI4B,OAA2C;IAC/C,IAAIL,SAASrC,EAAE,KAAK,QAAQ;QAC1B,MAAM2C,OAAOzB,KAAKkB,OAAO,CAAC,WAAW,EAAExC;QACvC,MAAMgD,YAAY1B,KAAKkB,OAAO,CAAC,gBAAgB,EAAEtC;QACjD,IAAI,CAAC6C,MAAM;YACT,OAAO7B,KACL,YACA;QAEJ;QACA,IAAI,CAAC8B,WAAW;YACd,OAAO9B,KACL,iBACA;QAEJ;QACA,IAAI,CAACQ,QAAQc,OAAO,CAAC,gBAAgB,GAAG;YACtC,OAAOtB,KACL,iBACA;QAEJ;QACA,IAAI,CAACQ,QAAQc,OAAO,CAAC,mBAAmB,GAAG;YACzC,OAAOtB,KACL,oBACA;QAEJ;QACA,uEAAuE;QACvE,wEAAwE;QACxE,uDAAuD;QACvD,IAAI,CAAC0B,eAAe;YAClB,OAAO1B,KACL,iBACA;QAEJ;QACA4B,OAAO;YACLC;YACAC;YACAC,WAAW;YACXC,cAAc;QAChB;IACF;IAEA,OAAO;QACL7B,IAAI;QACJL,OAAO;YACLyB,UAAUA,SAASrC,EAAE;YACrBG,UAAUkC,SAASlC,QAAQ;YAC3B8B;YACAD,kBAAkBA,iBAAiBC;YACnCK;YACAE,eAAeA,iBAAiB;YAChCC,cAAcA,gBAAgB;YAC9BC;QACF;IACF;AACF;AAEA,eAAeP,oBAAmB"}
|